From afe2988f8c61a42d71bb2e4c7d210891f83eb8d9 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:18:26 +0200 Subject: [PATCH 01/90] Update README.md --- README.md | 69 +------------------------------------------------------ 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/README.md b/README.md index aecdc5fc..41eb2fb4 100644 --- a/README.md +++ b/README.md @@ -1,68 +1 @@ -# Project 2 @cmda-minor-web 2022 - 2023 - -## Responsible IT Hackathon - -In een week bouwt iedere student aan de hand van een user story een eigen prototype. Technieken geleerd bij [Browser Technologies](https://github.com/cmda-minor-web/browser-technologies-2223) en [Progressive Web Apps](https://github.com/cmda-minor-web/progressive-web-apps-2223) worden toegepast bij het bouwen van de de prototypes. - -### Kickoff - -Op dinsdag heeft Yuri Westplat een kick-off gegeven over de mogelijke opdrachten waar je deze week uit kan kiezen. Het thema van deze week draait om AI toegankelijk maken voor gebruikers door middel van interfaces. - -## Opdrachtomschrijvingen - -Voor deze week zijn er twee mogelijke opdrachten: - -### Opdracht 1: Prompt-engineering (oranje) - -Voor deze opdracht is je target een 75" scherm met touch. Als je specifiek front-end maakt voor dit soort schermen gebeuren er allemaal rare dingen. Tijdens Browser Technologies heb je leren werken met obscure apparaten. Je gaat de hele week prototypen hiermee om een interface te maken waar gebruikers "prompts" kunnen invoeren. - -### Opdracht 2: AI muziekinstrument (blauw) - -Een front-end voor een muziekinstrumenten die op basis van data muziekvisualisaties genereren. Je wil de gebruiker de kans geven om het eindresultaat aan te passen. "Dingen" als DALL-E en Midjourney hebben een vrij lineare output, namelijk een input en een output. Tijdens dit project wil een gebruiker met meerdere momenten van input de output "sturen" als het ware. - -## Weekplanning - -| Dag | Tijd | Wat | -|---|---|--| -| Maandag 10/04 | Hele dag | Tweede paasdag | -| Dinsdag 11/04 | 9:30 | Kickoff w/ Yuri Westplat | -| | 11:00 - 16:00 uur | Werken aan de opdracht | -| Woensdag 12/04 | 9:30 - 16:00 uur | Standups met coaches | -| Donderdag 13/04 | 9:30 - 16:00 uur | Werken aan de opdracht| -| Vrijdag 14/04 | 12:00 uur | Presentaties | - - -### Werkwijze -Full-time week werken aan (technisch) bewijzen van een concept-idee. Vrijdag is de pitch! Student laat zien dat hij/zij de vakken [Browser Technologies](https://github.com/cmda-minor-web/browser-technologies-2223) en [Progressive Web Apps](https://github.com/cmda-minor-web/progressive-web-apps-2223) begrijpt en beheerst. - -Op maandag, woensdag en vrijdag zijn er coaches aanwezig voor coaching en feedback. Maandag is de kickoff, woensdag zijn er standups om de status door te spreken. Waar ben je mee bezig? Loop je ergens vast of heb je hulp nodig? Waar sta je? Vrijdag is de beoordeling. - -### Beoordeling -Tijdens de beoordeling krijg je feedback op het resultaat en op je functioneren. De vakdocenten kijken niet naar je code, maar beoordelen In hoeverre je in het project laten zien dat je de bijhorende vakken beheerst en goed hebt toegepast. - -Het project telt als AVV mee met de Meesterproef. - -### Feedback over functioneren -Je hebt een leergierig, gedreven en zelfredzame houding nodig om de minor te kunnen halen. Welke vaardigheden heb je laten zien? Onderzoekend vermogen? Creativiteit? Conceptueel? In hoeverre komen je houding en verworven vaardigheden overeen met wat een frontender in de praktijk nodig heeft? - -### Oplevering & criteria -- Presentatie. -- Github met je code en readme. - - - - - - - - - - - - - - - - - - +# DICHO From 9ea60b070c04ea254569fa6c9f774ef0eaff1fec Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:23:36 +0200 Subject: [PATCH 02/90] delete git stuff --- .gitattributes | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto From 178d09c84ad3e984d02a3e90deae41cecb696489 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:38:06 +0200 Subject: [PATCH 03/90] init commit --- .gitignore | 0 app.js | 0 node_modules/.bin/ejs | 1 + node_modules/.bin/he | 1 + node_modules/.bin/html-minifier | 1 + node_modules/.bin/jake | 1 + node_modules/.bin/mime | 1 + node_modules/.bin/nodemon | 1 + node_modules/.bin/nodetouch | 1 + node_modules/.bin/nopt | 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/uglifyjs | 1 + node_modules/.bin/uuid | 1 + node_modules/.package-lock.json | 1608 +++ 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/accepts/HISTORY.md | 243 + node_modules/accepts/LICENSE | 23 + node_modules/accepts/README.md | 140 + node_modules/accepts/index.js | 238 + node_modules/accepts/package.json | 47 + 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/lib/ajv.d.ts | 397 + node_modules/ajv/lib/ajv.js | 506 + node_modules/ajv/lib/cache.js | 26 + node_modules/ajv/lib/compile/async.js | 90 + node_modules/ajv/lib/compile/equal.js | 5 + node_modules/ajv/lib/compile/error_classes.js | 34 + node_modules/ajv/lib/compile/formats.js | 142 + node_modules/ajv/lib/compile/index.js | 387 + node_modules/ajv/lib/compile/resolve.js | 270 + node_modules/ajv/lib/compile/rules.js | 66 + node_modules/ajv/lib/compile/schema_obj.js | 9 + node_modules/ajv/lib/compile/ucs2length.js | 20 + node_modules/ajv/lib/compile/util.js | 239 + node_modules/ajv/lib/data.js | 49 + node_modules/ajv/lib/definition_schema.js | 37 + node_modules/ajv/lib/dot/_limit.jst | 113 + node_modules/ajv/lib/dot/_limitItems.jst | 12 + node_modules/ajv/lib/dot/_limitLength.jst | 12 + node_modules/ajv/lib/dot/_limitProperties.jst | 12 + node_modules/ajv/lib/dot/allOf.jst | 32 + node_modules/ajv/lib/dot/anyOf.jst | 46 + node_modules/ajv/lib/dot/coerce.def | 51 + node_modules/ajv/lib/dot/comment.jst | 9 + node_modules/ajv/lib/dot/const.jst | 11 + node_modules/ajv/lib/dot/contains.jst | 55 + node_modules/ajv/lib/dot/custom.jst | 191 + node_modules/ajv/lib/dot/defaults.def | 47 + node_modules/ajv/lib/dot/definitions.def | 203 + node_modules/ajv/lib/dot/dependencies.jst | 79 + node_modules/ajv/lib/dot/enum.jst | 30 + node_modules/ajv/lib/dot/errors.def | 194 + node_modules/ajv/lib/dot/format.jst | 106 + node_modules/ajv/lib/dot/if.jst | 73 + node_modules/ajv/lib/dot/items.jst | 98 + node_modules/ajv/lib/dot/missing.def | 39 + node_modules/ajv/lib/dot/multipleOf.jst | 22 + node_modules/ajv/lib/dot/not.jst | 43 + node_modules/ajv/lib/dot/oneOf.jst | 54 + node_modules/ajv/lib/dot/pattern.jst | 14 + node_modules/ajv/lib/dot/properties.jst | 245 + node_modules/ajv/lib/dot/propertyNames.jst | 52 + node_modules/ajv/lib/dot/ref.jst | 85 + node_modules/ajv/lib/dot/required.jst | 108 + node_modules/ajv/lib/dot/uniqueItems.jst | 62 + node_modules/ajv/lib/dot/validate.jst | 276 + node_modules/ajv/lib/dotjs/README.md | 3 + node_modules/ajv/lib/dotjs/_limit.js | 163 + node_modules/ajv/lib/dotjs/_limitItems.js | 80 + node_modules/ajv/lib/dotjs/_limitLength.js | 85 + .../ajv/lib/dotjs/_limitProperties.js | 80 + node_modules/ajv/lib/dotjs/allOf.js | 42 + node_modules/ajv/lib/dotjs/anyOf.js | 73 + node_modules/ajv/lib/dotjs/comment.js | 14 + node_modules/ajv/lib/dotjs/const.js | 56 + node_modules/ajv/lib/dotjs/contains.js | 81 + node_modules/ajv/lib/dotjs/custom.js | 228 + node_modules/ajv/lib/dotjs/dependencies.js | 168 + node_modules/ajv/lib/dotjs/enum.js | 66 + node_modules/ajv/lib/dotjs/format.js | 150 + node_modules/ajv/lib/dotjs/if.js | 103 + node_modules/ajv/lib/dotjs/index.js | 33 + node_modules/ajv/lib/dotjs/items.js | 140 + node_modules/ajv/lib/dotjs/multipleOf.js | 80 + node_modules/ajv/lib/dotjs/not.js | 84 + node_modules/ajv/lib/dotjs/oneOf.js | 73 + node_modules/ajv/lib/dotjs/pattern.js | 75 + node_modules/ajv/lib/dotjs/properties.js | 335 + node_modules/ajv/lib/dotjs/propertyNames.js | 81 + node_modules/ajv/lib/dotjs/ref.js | 124 + node_modules/ajv/lib/dotjs/required.js | 270 + node_modules/ajv/lib/dotjs/uniqueItems.js | 86 + node_modules/ajv/lib/dotjs/validate.js | 482 + node_modules/ajv/lib/keyword.js | 146 + node_modules/ajv/lib/refs/data.json | 17 + .../ajv/lib/refs/json-schema-draft-04.json | 149 + .../ajv/lib/refs/json-schema-draft-06.json | 154 + .../ajv/lib/refs/json-schema-draft-07.json | 168 + .../ajv/lib/refs/json-schema-secure.json | 94 + 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/ansi-styles/index.d.ts | 345 + node_modules/ansi-styles/index.js | 163 + node_modules/ansi-styles/license | 9 + node_modules/ansi-styles/package.json | 56 + node_modules/ansi-styles/readme.md | 152 + node_modules/anymatch/LICENSE | 15 + node_modules/anymatch/README.md | 87 + node_modules/anymatch/index.d.ts | 20 + node_modules/anymatch/index.js | 104 + node_modules/anymatch/package.json | 48 + node_modules/array-flatten/LICENSE | 21 + node_modules/array-flatten/README.md | 43 + node_modules/array-flatten/array-flatten.js | 64 + node_modules/array-flatten/package.json | 39 + node_modules/asn1/Jenkinsfile | 65 + node_modules/asn1/LICENSE | 19 + node_modules/asn1/README.md | 50 + node_modules/asn1/lib/ber/errors.js | 13 + node_modules/asn1/lib/ber/index.js | 27 + node_modules/asn1/lib/ber/reader.js | 262 + node_modules/asn1/lib/ber/types.js | 36 + node_modules/asn1/lib/ber/writer.js | 317 + node_modules/asn1/lib/index.js | 20 + 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/async/CHANGELOG.md | 348 + node_modules/async/LICENSE | 19 + node_modules/async/README.md | 59 + node_modules/async/all.js | 119 + node_modules/async/allLimit.js | 46 + node_modules/async/allSeries.js | 45 + node_modules/async/any.js | 122 + node_modules/async/anyLimit.js | 47 + node_modules/async/anySeries.js | 46 + node_modules/async/apply.js | 55 + node_modules/async/applyEach.js | 57 + node_modules/async/applyEachSeries.js | 37 + node_modules/async/asyncify.js | 118 + node_modules/async/auto.js | 333 + node_modules/async/autoInject.js | 182 + node_modules/async/bower.json | 17 + node_modules/async/cargo.js | 63 + node_modules/async/cargoQueue.js | 71 + node_modules/async/compose.js | 55 + node_modules/async/concat.js | 115 + node_modules/async/concatLimit.js | 60 + node_modules/async/concatSeries.js | 41 + node_modules/async/constant.js | 55 + node_modules/async/detect.js | 96 + node_modules/async/detectLimit.js | 48 + node_modules/async/detectSeries.js | 47 + node_modules/async/dir.js | 43 + node_modules/async/dist/async.js | 6059 +++++++++ node_modules/async/dist/async.min.js | 1 + node_modules/async/dist/async.mjs | 5947 +++++++++ node_modules/async/doDuring.js | 68 + node_modules/async/doUntil.js | 46 + node_modules/async/doWhilst.js | 68 + node_modules/async/during.js | 78 + node_modules/async/each.js | 129 + node_modules/async/eachLimit.js | 50 + node_modules/async/eachOf.js | 185 + node_modules/async/eachOfLimit.js | 47 + node_modules/async/eachOfSeries.js | 39 + node_modules/async/eachSeries.js | 44 + node_modules/async/ensureAsync.js | 67 + node_modules/async/every.js | 119 + node_modules/async/everyLimit.js | 46 + node_modules/async/everySeries.js | 45 + node_modules/async/filter.js | 93 + node_modules/async/filterLimit.js | 45 + node_modules/async/filterSeries.js | 43 + node_modules/async/find.js | 96 + node_modules/async/findLimit.js | 48 + node_modules/async/findSeries.js | 47 + node_modules/async/flatMap.js | 115 + node_modules/async/flatMapLimit.js | 60 + node_modules/async/flatMapSeries.js | 41 + node_modules/async/foldl.js | 153 + node_modules/async/foldr.js | 41 + node_modules/async/forEach.js | 129 + node_modules/async/forEachLimit.js | 50 + node_modules/async/forEachOf.js | 185 + node_modules/async/forEachOfLimit.js | 47 + node_modules/async/forEachOfSeries.js | 39 + node_modules/async/forEachSeries.js | 44 + node_modules/async/forever.js | 68 + node_modules/async/groupBy.js | 108 + node_modules/async/groupByLimit.js | 71 + node_modules/async/groupBySeries.js | 36 + node_modules/async/index.js | 588 + node_modules/async/inject.js | 153 + .../async/internal/DoublyLinkedList.js | 92 + node_modules/async/internal/Heap.js | 120 + node_modules/async/internal/applyEach.js | 29 + .../async/internal/asyncEachOfLimit.js | 75 + node_modules/async/internal/awaitify.js | 27 + node_modules/async/internal/breakLoop.js | 10 + node_modules/async/internal/consoleFunc.js | 31 + node_modules/async/internal/createTester.js | 40 + node_modules/async/internal/eachOfLimit.js | 90 + node_modules/async/internal/filter.js | 55 + node_modules/async/internal/getIterator.js | 11 + node_modules/async/internal/initialParams.js | 14 + node_modules/async/internal/isArrayLike.js | 10 + node_modules/async/internal/iterator.js | 57 + node_modules/async/internal/map.js | 30 + node_modules/async/internal/once.js | 17 + node_modules/async/internal/onlyOnce.js | 15 + node_modules/async/internal/parallel.js | 34 + .../async/internal/promiseCallback.js | 23 + node_modules/async/internal/queue.js | 294 + node_modules/async/internal/range.js | 14 + node_modules/async/internal/reject.js | 26 + node_modules/async/internal/setImmediate.js | 34 + node_modules/async/internal/withoutIndex.js | 10 + node_modules/async/internal/wrapAsync.js | 34 + node_modules/async/log.js | 41 + node_modules/async/map.js | 142 + node_modules/async/mapLimit.js | 45 + node_modules/async/mapSeries.js | 44 + node_modules/async/mapValues.js | 152 + node_modules/async/mapValuesLimit.js | 61 + node_modules/async/mapValuesSeries.js | 37 + node_modules/async/memoize.js | 91 + node_modules/async/nextTick.js | 52 + node_modules/async/package.json | 75 + node_modules/async/parallel.js | 180 + node_modules/async/parallelLimit.js | 41 + node_modules/async/priorityQueue.js | 86 + node_modules/async/queue.js | 167 + node_modules/async/race.js | 67 + node_modules/async/reduce.js | 153 + node_modules/async/reduceRight.js | 41 + node_modules/async/reflect.js | 78 + node_modules/async/reflectAll.js | 93 + node_modules/async/reject.js | 87 + node_modules/async/rejectLimit.js | 45 + node_modules/async/rejectSeries.js | 43 + node_modules/async/retry.js | 159 + node_modules/async/retryable.js | 77 + node_modules/async/select.js | 93 + node_modules/async/selectLimit.js | 45 + node_modules/async/selectSeries.js | 43 + node_modules/async/seq.js | 79 + node_modules/async/series.js | 186 + node_modules/async/setImmediate.js | 45 + node_modules/async/some.js | 122 + node_modules/async/someLimit.js | 47 + node_modules/async/someSeries.js | 46 + node_modules/async/sortBy.js | 190 + node_modules/async/timeout.js | 89 + node_modules/async/times.js | 50 + node_modules/async/timesLimit.js | 43 + node_modules/async/timesSeries.js | 32 + node_modules/async/transform.js | 173 + node_modules/async/tryEach.js | 78 + node_modules/async/unmemoize.js | 25 + node_modules/async/until.js | 61 + node_modules/async/waterfall.js | 105 + node_modules/async/whilst.js | 78 + node_modules/async/wrapSync.js | 118 + 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/lib/abort.js | 29 + node_modules/asynckit/lib/async.js | 34 + node_modules/asynckit/lib/defer.js | 26 + node_modules/asynckit/lib/iterate.js | 75 + .../asynckit/lib/readable_asynckit.js | 91 + .../asynckit/lib/readable_parallel.js | 25 + node_modules/asynckit/lib/readable_serial.js | 25 + .../asynckit/lib/readable_serial_ordered.js | 29 + node_modules/asynckit/lib/state.js | 37 + node_modules/asynckit/lib/streamify.js | 141 + node_modules/asynckit/lib/terminator.js | 29 + 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/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 | 213 + node_modules/aws4/aws4.js | 381 + node_modules/aws4/lru.js | 96 + node_modules/aws4/package.json | 17 + .../balanced-match/.github/FUNDING.yml | 2 + node_modules/balanced-match/LICENSE.md | 21 + node_modules/balanced-match/README.md | 97 + node_modules/balanced-match/index.js | 62 + node_modules/balanced-match/package.json | 48 + 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 | 260 + .../binary-extensions.json.d.ts | 3 + node_modules/binary-extensions/index.d.ts | 14 + node_modules/binary-extensions/index.js | 1 + node_modules/binary-extensions/license | 9 + node_modules/binary-extensions/package.json | 38 + node_modules/binary-extensions/readme.md | 41 + node_modules/body-parser/HISTORY.md | 657 + node_modules/body-parser/LICENSE | 23 + node_modules/body-parser/README.md | 464 + node_modules/body-parser/SECURITY.md | 25 + node_modules/body-parser/index.js | 156 + node_modules/body-parser/lib/read.js | 205 + node_modules/body-parser/lib/types/json.js | 236 + node_modules/body-parser/lib/types/raw.js | 101 + node_modules/body-parser/lib/types/text.js | 121 + .../body-parser/lib/types/urlencoded.js | 284 + node_modules/body-parser/package.json | 56 + 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/CHANGELOG.md | 184 + node_modules/braces/LICENSE | 21 + node_modules/braces/README.md | 593 + node_modules/braces/index.js | 170 + node_modules/braces/lib/compile.js | 57 + node_modules/braces/lib/constants.js | 57 + node_modules/braces/lib/expand.js | 113 + node_modules/braces/lib/parse.js | 333 + node_modules/braces/lib/stringify.js | 32 + node_modules/braces/lib/utils.js | 112 + node_modules/braces/package.json | 77 + node_modules/bytes/History.md | 97 + node_modules/bytes/LICENSE | 23 + node_modules/bytes/Readme.md | 152 + node_modules/bytes/index.js | 170 + node_modules/bytes/package.json | 42 + 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 | 42 + 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 | 47 + 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/camel-case/LICENSE | 21 + node_modules/camel-case/camel-case.d.ts | 3 + node_modules/camel-case/camel-case.js | 23 + node_modules/camel-case/package.json | 56 + 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.d.ts | 415 + node_modules/chalk/license | 9 + .../chalk/node_modules/has-flag/index.d.ts | 39 + .../chalk/node_modules/has-flag/index.js | 8 + .../chalk/node_modules/has-flag/license | 9 + .../chalk/node_modules/has-flag/package.json | 46 + .../chalk/node_modules/has-flag/readme.md | 89 + .../node_modules/supports-color/browser.js | 5 + .../node_modules/supports-color/index.js | 135 + .../chalk/node_modules/supports-color/license | 9 + .../node_modules/supports-color/package.json | 53 + .../node_modules/supports-color/readme.md | 76 + node_modules/chalk/package.json | 68 + node_modules/chalk/readme.md | 341 + node_modules/chalk/source/index.js | 229 + node_modules/chalk/source/templates.js | 134 + node_modules/chalk/source/util.js | 39 + node_modules/chokidar/LICENSE | 21 + node_modules/chokidar/README.md | 308 + node_modules/chokidar/index.js | 973 ++ node_modules/chokidar/lib/constants.js | 65 + node_modules/chokidar/lib/fsevents-handler.js | 524 + node_modules/chokidar/lib/nodefs-handler.js | 654 + node_modules/chokidar/package.json | 85 + node_modules/chokidar/types/index.d.ts | 188 + node_modules/clean-css/History.md | 1330 ++ node_modules/clean-css/LICENSE | 19 + node_modules/clean-css/README.md | 720 ++ node_modules/clean-css/index.js | 1 + node_modules/clean-css/lib/clean.js | 156 + node_modules/clean-css/lib/optimizer/hack.js | 8 + .../lib/optimizer/level-0/optimize.js | 6 + .../lib/optimizer/level-1/optimize.js | 673 + .../lib/optimizer/level-1/shorten-hex.js | 189 + .../lib/optimizer/level-1/shorten-hsl.js | 61 + .../lib/optimizer/level-1/shorten-rgb.js | 10 + .../lib/optimizer/level-1/sort-selectors.js | 23 + .../lib/optimizer/level-1/tidy-at-rule.js | 9 + .../lib/optimizer/level-1/tidy-block.js | 23 + .../lib/optimizer/level-1/tidy-rules.js | 213 + .../lib/optimizer/level-2/break-up.js | 596 + .../lib/optimizer/level-2/can-override.js | 274 + .../clean-css/lib/optimizer/level-2/clone.js | 33 + .../lib/optimizer/level-2/compactable.js | 987 ++ .../optimizer/level-2/extract-properties.js | 73 + .../level-2/invalid-property-error.js | 10 + .../lib/optimizer/level-2/is-mergeable.js | 259 + .../lib/optimizer/level-2/merge-adjacent.js | 50 + .../optimizer/level-2/merge-media-queries.js | 103 + .../level-2/merge-non-adjacent-by-body.js | 80 + .../level-2/merge-non-adjacent-by-selector.js | 78 + .../lib/optimizer/level-2/optimize.js | 134 + .../level-2/properties/every-values-pair.js | 28 + .../level-2/properties/find-component-in.js | 40 + .../level-2/properties/has-inherit.js | 10 + .../level-2/properties/is-component-of.js | 22 + .../properties/is-mergeable-shorthand.js | 11 + .../properties/merge-into-shorthands.js | 445 + .../optimizer/level-2/properties/optimize.js | 40 + .../level-2/properties/override-properties.js | 484 + .../overrides-non-component-shorthand.js | 9 + .../level-2/properties/populate-components.js | 42 + .../level-2/properties/understandable.js | 15 + .../level-2/properties/vendor-prefixes.js | 23 + .../optimizer/level-2/reduce-non-adjacent.js | 180 + .../level-2/remove-duplicate-font-at-rules.js | 30 + .../level-2/remove-duplicate-media-queries.js | 30 + .../optimizer/level-2/remove-duplicates.js | 43 + .../level-2/remove-unused-at-rules.js | 249 + .../lib/optimizer/level-2/reorderable.js | 93 + .../level-2/restore-with-components.js | 13 + .../lib/optimizer/level-2/restore.js | 303 + .../lib/optimizer/level-2/restructure.js | 389 + .../lib/optimizer/level-2/rules-overlap.js | 32 + .../level-2/specificities-overlap.js | 34 + .../lib/optimizer/level-2/specificity.js | 77 + .../optimizer/level-2/tidy-rule-duplicates.js | 21 + .../clean-css/lib/optimizer/remove-unused.js | 11 + .../lib/optimizer/restore-from-optimizing.js | 69 + .../clean-css/lib/optimizer/validator.js | 526 + .../lib/optimizer/wrap-for-optimizing.js | 191 + .../clean-css/lib/options/compatibility.js | 183 + node_modules/clean-css/lib/options/fetch.js | 7 + node_modules/clean-css/lib/options/format.js | 185 + .../clean-css/lib/options/inline-request.js | 22 + .../clean-css/lib/options/inline-timeout.js | 7 + node_modules/clean-css/lib/options/inline.js | 15 + .../lib/options/optimization-level.js | 221 + .../clean-css/lib/options/rebase-to.js | 7 + node_modules/clean-css/lib/options/rebase.js | 5 + .../lib/options/rounding-precision.js | 88 + .../clean-css/lib/reader/apply-source-maps.js | 245 + .../reader/extract-import-url-and-media.js | 35 + .../lib/reader/input-source-map-tracker.js | 58 + .../lib/reader/is-allowed-resource.js | 77 + .../lib/reader/load-original-sources.js | 126 + .../lib/reader/load-remote-resource.js | 74 + .../clean-css/lib/reader/match-data-uri.js | 7 + .../clean-css/lib/reader/normalize-path.js | 8 + .../clean-css/lib/reader/read-sources.js | 341 + .../clean-css/lib/reader/rebase-local-map.js | 15 + .../clean-css/lib/reader/rebase-remote-map.js | 14 + node_modules/clean-css/lib/reader/rebase.js | 101 + .../clean-css/lib/reader/restore-import.js | 5 + .../clean-css/lib/reader/rewrite-url.js | 118 + .../clean-css/lib/tokenizer/marker.js | 26 + node_modules/clean-css/lib/tokenizer/token.js | 16 + .../clean-css/lib/tokenizer/tokenize.js | 526 + .../clean-css/lib/utils/clone-array.js | 12 + .../clean-css/lib/utils/format-position.js | 11 + .../clean-css/lib/utils/has-protocol.js | 7 + .../lib/utils/is-data-uri-resource.js | 7 + .../clean-css/lib/utils/is-http-resource.js | 7 + .../clean-css/lib/utils/is-https-resource.js | 7 + node_modules/clean-css/lib/utils/is-import.js | 7 + .../clean-css/lib/utils/is-remote-resource.js | 7 + .../clean-css/lib/utils/natural-compare.js | 31 + node_modules/clean-css/lib/utils/override.js | 34 + node_modules/clean-css/lib/utils/split.js | 50 + node_modules/clean-css/lib/writer/helpers.js | 225 + node_modules/clean-css/lib/writer/one-time.js | 52 + node_modules/clean-css/lib/writer/simple.js | 52 + .../clean-css/lib/writer/source-maps.js | 102 + node_modules/clean-css/package.json | 48 + 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 | 839 ++ node_modules/color-convert/index.js | 81 + node_modules/color-convert/package.json | 48 + node_modules/color-convert/route.js | 97 + 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 | 28 + node_modules/combined-stream/License | 19 + node_modules/combined-stream/Readme.md | 138 + .../combined-stream/lib/combined_stream.js | 208 + node_modules/combined-stream/package.json | 25 + node_modules/combined-stream/yarn.lock | 17 + node_modules/commander/CHANGELOG.md | 326 + node_modules/commander/LICENSE | 22 + node_modules/commander/Readme.md | 370 + node_modules/commander/index.js | 1158 ++ node_modules/commander/package.json | 34 + node_modules/commander/typings/index.d.ts | 295 + 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/content-disposition/HISTORY.md | 60 + node_modules/content-disposition/LICENSE | 22 + node_modules/content-disposition/README.md | 142 + node_modules/content-disposition/index.js | 458 + node_modules/content-disposition/package.json | 44 + node_modules/content-type/HISTORY.md | 29 + node_modules/content-type/LICENSE | 22 + node_modules/content-type/README.md | 94 + node_modules/content-type/index.js | 225 + node_modules/content-type/package.json | 42 + node_modules/cookie-signature/.npmignore | 4 + node_modules/cookie-signature/History.md | 38 + node_modules/cookie-signature/Readme.md | 42 + node_modules/cookie-signature/index.js | 51 + node_modules/cookie-signature/package.json | 18 + node_modules/cookie/HISTORY.md | 142 + node_modules/cookie/LICENSE | 24 + node_modules/cookie/README.md | 302 + node_modules/cookie/SECURITY.md | 25 + node_modules/cookie/index.js | 270 + node_modules/cookie/package.json | 44 + 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/lib/util.js | 107 + node_modules/core-util-is/package.json | 32 + node_modules/core-util-is/test.js | 68 + 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/lib/dashdash.js | 1055 ++ node_modules/dashdash/package.json | 26 + 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/delayed-stream/.npmignore | 1 + node_modules/delayed-stream/License | 19 + node_modules/delayed-stream/Makefile | 7 + node_modules/delayed-stream/Readme.md | 141 + .../delayed-stream/lib/delayed_stream.js | 107 + node_modules/delayed-stream/package.json | 27 + node_modules/depd/History.md | 103 + node_modules/depd/LICENSE | 22 + node_modules/depd/Readme.md | 280 + node_modules/depd/index.js | 538 + node_modules/depd/lib/browser/index.js | 77 + node_modules/depd/package.json | 45 + node_modules/destroy/LICENSE | 23 + node_modules/destroy/README.md | 63 + node_modules/destroy/index.js | 209 + node_modules/destroy/package.json | 48 + node_modules/ecc-jsbn/LICENSE | 21 + node_modules/ecc-jsbn/README.md | 8 + node_modules/ecc-jsbn/index.js | 58 + node_modules/ecc-jsbn/lib/LICENSE-jsbn | 40 + node_modules/ecc-jsbn/lib/ec.js | 561 + node_modules/ecc-jsbn/lib/sec.js | 170 + node_modules/ecc-jsbn/package.json | 40 + node_modules/ecc-jsbn/test.js | 14 + node_modules/ee-first/LICENSE | 22 + node_modules/ee-first/README.md | 80 + node_modules/ee-first/index.js | 95 + node_modules/ee-first/package.json | 29 + node_modules/ejs/LICENSE | 202 + node_modules/ejs/README.md | 344 + node_modules/ejs/bin/cli.js | 211 + node_modules/ejs/ejs.js | 1736 +++ node_modules/ejs/ejs.min.js | 1 + node_modules/ejs/jakefile.js | 88 + node_modules/ejs/lib/ejs.js | 951 ++ node_modules/ejs/lib/utils.js | 241 + node_modules/ejs/package.json | 42 + node_modules/ejs/usage.txt | 24 + node_modules/encodeurl/HISTORY.md | 14 + node_modules/encodeurl/LICENSE | 22 + node_modules/encodeurl/README.md | 128 + node_modules/encodeurl/index.js | 60 + node_modules/encodeurl/package.json | 40 + node_modules/escape-html/LICENSE | 24 + node_modules/escape-html/Readme.md | 43 + node_modules/escape-html/index.js | 78 + node_modules/escape-html/package.json | 24 + node_modules/etag/HISTORY.md | 83 + node_modules/etag/LICENSE | 22 + node_modules/etag/README.md | 159 + node_modules/etag/index.js | 131 + node_modules/etag/package.json | 47 + node_modules/express-minify-html/LICENSE | 21 + node_modules/express-minify-html/README.md | 73 + node_modules/express-minify-html/minifier.js | 91 + node_modules/express-minify-html/package.json | 40 + node_modules/express/History.md | 3588 ++++++ node_modules/express/LICENSE | 24 + node_modules/express/Readme.md | 166 + node_modules/express/index.js | 11 + node_modules/express/lib/application.js | 661 + node_modules/express/lib/express.js | 116 + node_modules/express/lib/middleware/init.js | 43 + node_modules/express/lib/middleware/query.js | 47 + node_modules/express/lib/request.js | 525 + node_modules/express/lib/response.js | 1169 ++ node_modules/express/lib/router/index.js | 673 + node_modules/express/lib/router/layer.js | 181 + node_modules/express/lib/router/route.js | 225 + node_modules/express/lib/utils.js | 304 + node_modules/express/lib/view.js | 182 + node_modules/express/package.json | 99 + 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/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/lib/extsprintf.js | 183 + node_modules/extsprintf/package.json | 14 + 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/filelist/README.md | 84 + node_modules/filelist/index.d.ts | 110 + node_modules/filelist/index.js | 495 + node_modules/filelist/jakefile.js | 15 + .../brace-expansion/.github/FUNDING.yml | 2 + .../node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 135 + .../node_modules/brace-expansion/index.js | 203 + .../node_modules/brace-expansion/package.json | 46 + .../filelist/node_modules/minimatch/LICENSE | 15 + .../filelist/node_modules/minimatch/README.md | 259 + .../node_modules/minimatch/lib/path.js | 4 + .../node_modules/minimatch/minimatch.js | 944 ++ .../node_modules/minimatch/package.json | 35 + node_modules/filelist/package.json | 28 + node_modules/fill-range/LICENSE | 21 + node_modules/fill-range/README.md | 237 + node_modules/fill-range/index.js | 249 + node_modules/fill-range/package.json | 69 + node_modules/finalhandler/HISTORY.md | 195 + node_modules/finalhandler/LICENSE | 22 + node_modules/finalhandler/README.md | 147 + node_modules/finalhandler/SECURITY.md | 25 + node_modules/finalhandler/index.js | 336 + node_modules/finalhandler/package.json | 46 + 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/lib/browser.js | 2 + node_modules/form-data/lib/form_data.js | 457 + node_modules/form-data/lib/populate.js | 10 + node_modules/form-data/package.json | 65 + node_modules/form-data/yarn.lock | 2662 ++++ node_modules/forwarded/HISTORY.md | 21 + node_modules/forwarded/LICENSE | 22 + node_modules/forwarded/README.md | 57 + node_modules/forwarded/index.js | 90 + node_modules/forwarded/package.json | 45 + node_modules/fresh/HISTORY.md | 70 + node_modules/fresh/LICENSE | 23 + node_modules/fresh/README.md | 119 + node_modules/fresh/index.js | 137 + node_modules/fresh/package.json | 46 + node_modules/fsevents/LICENSE | 22 + node_modules/fsevents/README.md | 83 + node_modules/fsevents/fsevents.d.ts | 46 + node_modules/fsevents/fsevents.js | 82 + node_modules/fsevents/fsevents.node | Bin 0 -> 147128 bytes node_modules/fsevents/package.json | 62 + 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/get-intrinsic/.eslintrc | 38 + .../get-intrinsic/.github/FUNDING.yml | 12 + node_modules/get-intrinsic/.nycrc | 9 + node_modules/get-intrinsic/CHANGELOG.md | 110 + node_modules/get-intrinsic/LICENSE | 21 + node_modules/get-intrinsic/README.md | 71 + node_modules/get-intrinsic/index.js | 344 + node_modules/get-intrinsic/package.json | 92 + .../get-intrinsic/test/GetIntrinsic.js | 274 + 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/lib/index.js | 123 + node_modules/getpass/package.json | 18 + node_modules/glob-parent/CHANGELOG.md | 110 + node_modules/glob-parent/LICENSE | 15 + node_modules/glob-parent/README.md | 137 + node_modules/glob-parent/index.js | 42 + node_modules/glob-parent/package.json | 48 + node_modules/har-schema/LICENSE | 13 + node_modules/har-schema/README.md | 49 + node_modules/har-schema/lib/afterRequest.json | 30 + .../har-schema/lib/beforeRequest.json | 30 + node_modules/har-schema/lib/browser.json | 20 + node_modules/har-schema/lib/cache.json | 21 + node_modules/har-schema/lib/content.json | 29 + node_modules/har-schema/lib/cookie.json | 36 + node_modules/har-schema/lib/creator.json | 20 + node_modules/har-schema/lib/entry.json | 53 + node_modules/har-schema/lib/har.json | 13 + node_modules/har-schema/lib/header.json | 20 + node_modules/har-schema/lib/index.js | 22 + node_modules/har-schema/lib/log.json | 36 + node_modules/har-schema/lib/page.json | 32 + node_modules/har-schema/lib/pageTimings.json | 18 + node_modules/har-schema/lib/postData.json | 43 + node_modules/har-schema/lib/query.json | 20 + node_modules/har-schema/lib/request.json | 57 + node_modules/har-schema/lib/response.json | 54 + node_modules/har-schema/lib/timings.json | 42 + node_modules/har-schema/package.json | 54 + node_modules/har-validator/LICENSE | 9 + node_modules/har-validator/README.md | 43 + node_modules/har-validator/lib/async.js | 105 + node_modules/har-validator/lib/error.js | 17 + node_modules/har-validator/lib/promise.js | 102 + node_modules/har-validator/package.json | 43 + 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 + node_modules/has-symbols/.nycrc | 9 + node_modules/has-symbols/CHANGELOG.md | 75 + node_modules/has-symbols/LICENSE | 21 + node_modules/has-symbols/README.md | 46 + node_modules/has-symbols/index.js | 13 + node_modules/has-symbols/package.json | 101 + 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 | 56 + 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/he/LICENSE-MIT.txt | 20 + node_modules/he/README.md | 379 + node_modules/he/bin/he | 148 + node_modules/he/he.js | 342 + node_modules/he/man/he.1 | 78 + node_modules/he/package.json | 56 + node_modules/html-minifier/LICENSE | 22 + node_modules/html-minifier/README.md | 159 + node_modules/html-minifier/cli.js | 307 + node_modules/html-minifier/package.json | 87 + .../html-minifier/sample-cli-config-file.conf | 39 + .../html-minifier/src/htmlminifier.js | 1298 ++ node_modules/html-minifier/src/htmlparser.js | 528 + node_modules/html-minifier/src/tokenchain.js | 71 + node_modules/html-minifier/src/utils.js | 18 + node_modules/http-errors/HISTORY.md | 180 + node_modules/http-errors/LICENSE | 23 + node_modules/http-errors/README.md | 169 + node_modules/http-errors/index.js | 289 + node_modules/http-errors/package.json | 50 + 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/http-signature/lib/index.js | 29 + node_modules/http-signature/lib/parser.js | 315 + node_modules/http-signature/lib/signer.js | 401 + node_modules/http-signature/lib/utils.js | 112 + node_modules/http-signature/lib/verify.js | 88 + node_modules/http-signature/package.json | 39 + node_modules/iconv-lite/Changelog.md | 162 + node_modules/iconv-lite/LICENSE | 21 + node_modules/iconv-lite/README.md | 156 + .../iconv-lite/encodings/dbcs-codec.js | 555 + .../iconv-lite/encodings/dbcs-data.js | 176 + node_modules/iconv-lite/encodings/index.js | 22 + node_modules/iconv-lite/encodings/internal.js | 188 + .../iconv-lite/encodings/sbcs-codec.js | 72 + .../encodings/sbcs-data-generated.js | 451 + .../iconv-lite/encodings/sbcs-data.js | 174 + .../encodings/tables/big5-added.json | 122 + .../iconv-lite/encodings/tables/cp936.json | 264 + .../iconv-lite/encodings/tables/cp949.json | 273 + .../iconv-lite/encodings/tables/cp950.json | 177 + .../iconv-lite/encodings/tables/eucjp.json | 182 + .../encodings/tables/gb18030-ranges.json | 1 + .../encodings/tables/gbk-added.json | 55 + .../iconv-lite/encodings/tables/shiftjis.json | 125 + node_modules/iconv-lite/encodings/utf16.js | 177 + node_modules/iconv-lite/encodings/utf7.js | 290 + node_modules/iconv-lite/lib/bom-handling.js | 52 + node_modules/iconv-lite/lib/extend-node.js | 217 + node_modules/iconv-lite/lib/index.d.ts | 24 + node_modules/iconv-lite/lib/index.js | 153 + node_modules/iconv-lite/lib/streams.js | 121 + node_modules/iconv-lite/package.json | 46 + node_modules/ignore-by-default/LICENSE | 14 + node_modules/ignore-by-default/README.md | 26 + node_modules/ignore-by-default/index.js | 12 + node_modules/ignore-by-default/package.json | 34 + 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/ipaddr.js/LICENSE | 19 + node_modules/ipaddr.js/README.md | 233 + node_modules/ipaddr.js/ipaddr.min.js | 1 + node_modules/ipaddr.js/lib/ipaddr.js | 673 + node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 + node_modules/ipaddr.js/package.json | 35 + node_modules/is-binary-path/index.d.ts | 17 + node_modules/is-binary-path/index.js | 7 + node_modules/is-binary-path/license | 9 + node_modules/is-binary-path/package.json | 40 + node_modules/is-binary-path/readme.md | 34 + 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-glob/LICENSE | 21 + node_modules/is-glob/README.md | 206 + node_modules/is-glob/index.js | 150 + node_modules/is-glob/package.json | 81 + node_modules/is-number/LICENSE | 21 + node_modules/is-number/README.md | 187 + node_modules/is-number/index.js | 18 + node_modules/is-number/package.json | 82 + 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/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/jake/Makefile | 44 + node_modules/jake/README.md | 17 + node_modules/jake/bin/bash_completion.sh | 41 + node_modules/jake/bin/cli.js | 31 + node_modules/jake/jakefile.js | 94 + node_modules/jake/lib/api.js | 409 + node_modules/jake/lib/jake.js | 330 + node_modules/jake/lib/loader.js | 173 + node_modules/jake/lib/namespace.js | 115 + node_modules/jake/lib/package_task.js | 406 + node_modules/jake/lib/parseargs.js | 134 + node_modules/jake/lib/program.js | 282 + node_modules/jake/lib/publish_task.js | 290 + node_modules/jake/lib/rule.js | 311 + node_modules/jake/lib/task/directory_task.js | 30 + node_modules/jake/lib/task/file_task.js | 124 + node_modules/jake/lib/task/index.js | 9 + node_modules/jake/lib/task/task.js | 449 + node_modules/jake/lib/test_task.js | 270 + node_modules/jake/lib/utils/file.js | 286 + node_modules/jake/lib/utils/index.js | 297 + node_modules/jake/lib/utils/logger.js | 24 + node_modules/jake/package.json | 42 + .../jake/test/integration/concurrent.js | 45 + node_modules/jake/test/integration/file.js | 228 + .../jake/test/integration/file_task.js | 126 + node_modules/jake/test/integration/helpers.js | 80 + .../jake/test/integration/jakefile.js | 337 + .../integration/jakelib/concurrent.jake.js | 113 + .../test/integration/jakelib/publish.jake.js | 49 + .../jakelib/required_module.jake.js | 10 + .../test/integration/jakelib/rule.jake.js | 222 + .../jake/test/integration/publish_task.js | 27 + node_modules/jake/test/integration/rule.js | 217 + node_modules/jake/test/integration/selfdep.js | 42 + .../jake/test/integration/task_base.js | 167 + node_modules/jake/test/unit/jakefile.js | 36 + node_modules/jake/test/unit/namespace.js | 77 + node_modules/jake/test/unit/parseargs.js | 169 + node_modules/jake/usage.txt | 16 + 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/LICENSE | 195 + node_modules/json-schema/README.md | 3 + node_modules/json-schema/lib/links.js | 65 + node_modules/json-schema/lib/validate.js | 271 + node_modules/json-schema/package.json | 24 + 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 | 53 + node_modules/jsprim/CONTRIBUTING.md | 19 + node_modules/jsprim/LICENSE | 19 + node_modules/jsprim/README.md | 287 + node_modules/jsprim/lib/jsprim.js | 735 ++ node_modules/jsprim/package.json | 20 + node_modules/lodash.merge/LICENSE | 47 + node_modules/lodash.merge/README.md | 18 + node_modules/lodash.merge/index.js | 2207 ++++ node_modules/lodash.merge/package.json | 17 + node_modules/lower-case/LICENSE | 21 + node_modules/lower-case/README.md | 45 + node_modules/lower-case/lower-case.d.ts | 3 + node_modules/lower-case/lower-case.js | 54 + node_modules/lower-case/package.json | 52 + node_modules/media-typer/HISTORY.md | 22 + node_modules/media-typer/LICENSE | 22 + node_modules/media-typer/README.md | 81 + node_modules/media-typer/index.js | 270 + node_modules/media-typer/package.json | 26 + node_modules/merge-descriptors/HISTORY.md | 21 + node_modules/merge-descriptors/LICENSE | 23 + node_modules/merge-descriptors/README.md | 48 + node_modules/merge-descriptors/index.js | 60 + node_modules/merge-descriptors/package.json | 32 + node_modules/methods/HISTORY.md | 29 + node_modules/methods/LICENSE | 24 + node_modules/methods/README.md | 51 + node_modules/methods/index.js | 69 + node_modules/methods/package.json | 36 + node_modules/mime-db/HISTORY.md | 507 + node_modules/mime-db/LICENSE | 23 + node_modules/mime-db/README.md | 100 + node_modules/mime-db/db.json | 8519 +++++++++++++ node_modules/mime-db/index.js | 12 + node_modules/mime-db/package.json | 60 + node_modules/mime-types/HISTORY.md | 397 + node_modules/mime-types/LICENSE | 23 + node_modules/mime-types/README.md | 113 + node_modules/mime-types/index.js | 188 + node_modules/mime-types/package.json | 44 + node_modules/mime/.npmignore | 0 node_modules/mime/CHANGELOG.md | 164 + node_modules/mime/LICENSE | 21 + node_modules/mime/README.md | 90 + node_modules/mime/cli.js | 8 + node_modules/mime/mime.js | 108 + node_modules/mime/package.json | 44 + node_modules/mime/src/build.js | 53 + node_modules/mime/src/test.js | 60 + node_modules/mime/types.json | 1 + node_modules/minimatch/LICENSE | 15 + node_modules/minimatch/README.md | 230 + node_modules/minimatch/minimatch.js | 947 ++ node_modules/minimatch/package.json | 33 + 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/ncname/index.js | 9 + node_modules/ncname/package.json | 39 + node_modules/ncname/readme.md | 28 + node_modules/negotiator/HISTORY.md | 108 + node_modules/negotiator/LICENSE | 24 + node_modules/negotiator/README.md | 203 + node_modules/negotiator/index.js | 82 + node_modules/negotiator/lib/charset.js | 169 + node_modules/negotiator/lib/encoding.js | 184 + node_modules/negotiator/lib/language.js | 179 + node_modules/negotiator/lib/mediaType.js | 294 + node_modules/negotiator/package.json | 42 + node_modules/no-case/LICENSE | 21 + node_modules/no-case/README.md | 50 + node_modules/no-case/no-case.d.ts | 3 + node_modules/no-case/no-case.js | 40 + node_modules/no-case/package.json | 56 + .../no-case/vendor/camel-case-regexp.js | 1 + .../no-case/vendor/camel-case-upper-regexp.js | 1 + .../no-case/vendor/non-word-regexp.js | 1 + node_modules/nodemon/LICENSE | 21 + node_modules/nodemon/README.md | 434 + node_modules/nodemon/bin/nodemon.js | 16 + node_modules/nodemon/bin/windows-kill.exe | Bin 0 -> 80384 bytes node_modules/nodemon/doc/cli/authors.txt | 8 + node_modules/nodemon/doc/cli/config.txt | 44 + node_modules/nodemon/doc/cli/help.txt | 29 + node_modules/nodemon/doc/cli/logo.txt | 20 + node_modules/nodemon/doc/cli/options.txt | 36 + node_modules/nodemon/doc/cli/topics.txt | 8 + node_modules/nodemon/doc/cli/usage.txt | 3 + node_modules/nodemon/doc/cli/whoami.txt | 9 + node_modules/nodemon/lib/cli/index.js | 49 + node_modules/nodemon/lib/cli/parse.js | 230 + node_modules/nodemon/lib/config/command.js | 43 + node_modules/nodemon/lib/config/defaults.js | 32 + node_modules/nodemon/lib/config/exec.js | 225 + node_modules/nodemon/lib/config/index.js | 93 + node_modules/nodemon/lib/config/load.js | 256 + node_modules/nodemon/lib/help/index.js | 27 + node_modules/nodemon/lib/index.js | 1 + node_modules/nodemon/lib/monitor/index.js | 4 + node_modules/nodemon/lib/monitor/match.js | 276 + node_modules/nodemon/lib/monitor/run.js | 546 + node_modules/nodemon/lib/monitor/signals.js | 34 + node_modules/nodemon/lib/monitor/watch.js | 239 + node_modules/nodemon/lib/nodemon.js | 311 + node_modules/nodemon/lib/rules/add.js | 89 + node_modules/nodemon/lib/rules/index.js | 53 + node_modules/nodemon/lib/rules/parse.js | 43 + node_modules/nodemon/lib/spawn.js | 74 + node_modules/nodemon/lib/utils/bus.js | 44 + node_modules/nodemon/lib/utils/clone.js | 40 + node_modules/nodemon/lib/utils/colour.js | 26 + node_modules/nodemon/lib/utils/index.js | 102 + node_modules/nodemon/lib/utils/log.js | 82 + node_modules/nodemon/lib/utils/merge.js | 47 + node_modules/nodemon/lib/version.js | 100 + .../nodemon/node_modules/debug/CHANGELOG.md | 395 + .../nodemon/node_modules/debug/LICENSE | 19 + .../nodemon/node_modules/debug/README.md | 437 + .../nodemon/node_modules/debug/node.js | 1 + .../nodemon/node_modules/debug/package.json | 51 + .../nodemon/node_modules/debug/src/browser.js | 180 + .../nodemon/node_modules/debug/src/common.js | 249 + .../nodemon/node_modules/debug/src/index.js | 12 + .../nodemon/node_modules/debug/src/node.js | 177 + node_modules/nodemon/node_modules/ms/index.js | 162 + .../nodemon/node_modules/ms/license.md | 21 + .../nodemon/node_modules/ms/package.json | 38 + .../nodemon/node_modules/ms/readme.md | 59 + node_modules/nodemon/package.json | 74 + node_modules/nopt/.npmignore | 0 node_modules/nopt/LICENSE | 23 + node_modules/nopt/README.md | 208 + node_modules/nopt/bin/nopt.js | 44 + node_modules/nopt/examples/my-program.js | 30 + node_modules/nopt/lib/nopt.js | 552 + node_modules/nopt/package.json | 12 + 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/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-inspect/.eslintrc | 53 + .../object-inspect/.github/FUNDING.yml | 12 + node_modules/object-inspect/.nycrc | 13 + node_modules/object-inspect/CHANGELOG.md | 370 + node_modules/object-inspect/LICENSE | 21 + node_modules/object-inspect/example/all.js | 23 + .../object-inspect/example/circular.js | 6 + node_modules/object-inspect/example/fn.js | 5 + .../object-inspect/example/inspect.js | 10 + node_modules/object-inspect/index.js | 516 + .../object-inspect/package-support.json | 20 + node_modules/object-inspect/package.json | 97 + node_modules/object-inspect/readme.markdown | 86 + node_modules/object-inspect/test-core-js.js | 26 + node_modules/object-inspect/test/bigint.js | 58 + .../object-inspect/test/browser/dom.js | 15 + node_modules/object-inspect/test/circular.js | 16 + node_modules/object-inspect/test/deep.js | 12 + node_modules/object-inspect/test/element.js | 53 + node_modules/object-inspect/test/err.js | 48 + node_modules/object-inspect/test/fakes.js | 29 + node_modules/object-inspect/test/fn.js | 76 + node_modules/object-inspect/test/has.js | 15 + node_modules/object-inspect/test/holes.js | 15 + .../object-inspect/test/indent-option.js | 271 + node_modules/object-inspect/test/inspect.js | 139 + node_modules/object-inspect/test/lowbyte.js | 12 + node_modules/object-inspect/test/number.js | 58 + .../object-inspect/test/quoteStyle.js | 17 + .../object-inspect/test/toStringTag.js | 40 + node_modules/object-inspect/test/undef.js | 12 + node_modules/object-inspect/test/values.js | 211 + node_modules/object-inspect/util.inspect.js | 1 + node_modules/on-finished/HISTORY.md | 98 + node_modules/on-finished/LICENSE | 23 + node_modules/on-finished/README.md | 162 + node_modules/on-finished/index.js | 234 + node_modules/on-finished/package.json | 39 + node_modules/param-case/LICENSE | 21 + node_modules/param-case/README.md | 45 + node_modules/param-case/package.json | 46 + node_modules/param-case/param-case.d.ts | 3 + node_modules/param-case/param-case.js | 12 + node_modules/parseurl/HISTORY.md | 58 + node_modules/parseurl/LICENSE | 24 + node_modules/parseurl/README.md | 133 + node_modules/parseurl/index.js | 158 + node_modules/parseurl/package.json | 40 + node_modules/path-to-regexp/History.md | 36 + node_modules/path-to-regexp/LICENSE | 21 + node_modules/path-to-regexp/Readme.md | 35 + node_modules/path-to-regexp/index.js | 129 + node_modules/path-to-regexp/package.json | 30 + 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 + .../performance-now/lib/performance-now.js | 36 + .../lib/performance-now.js.map | 10 + 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/picomatch/CHANGELOG.md | 136 + node_modules/picomatch/LICENSE | 21 + node_modules/picomatch/README.md | 708 ++ node_modules/picomatch/index.js | 3 + node_modules/picomatch/lib/constants.js | 179 + node_modules/picomatch/lib/parse.js | 1091 ++ node_modules/picomatch/lib/picomatch.js | 342 + node_modules/picomatch/lib/scan.js | 391 + node_modules/picomatch/lib/utils.js | 64 + node_modules/picomatch/package.json | 81 + node_modules/proxy-addr/HISTORY.md | 161 + node_modules/proxy-addr/LICENSE | 22 + node_modules/proxy-addr/README.md | 139 + node_modules/proxy-addr/index.js | 327 + node_modules/proxy-addr/package.json | 47 + node_modules/psl/.env | 0 node_modules/psl/LICENSE | 9 + node_modules/psl/README.md | 211 + node_modules/psl/browserstack-logo.svg | 90 + node_modules/psl/data/rules.json | 9376 ++++++++++++++ node_modules/psl/dist/psl.js | 10187 ++++++++++++++++ node_modules/psl/dist/psl.min.js | 1 + node_modules/psl/index.js | 269 + node_modules/psl/package.json | 43 + node_modules/pstree.remy/.travis.yml | 8 + node_modules/pstree.remy/LICENSE | 7 + node_modules/pstree.remy/README.md | 26 + node_modules/pstree.remy/lib/index.js | 37 + node_modules/pstree.remy/lib/tree.js | 37 + node_modules/pstree.remy/lib/utils.js | 53 + node_modules/pstree.remy/package.json | 33 + .../pstree.remy/tests/fixtures/index.js | 13 + node_modules/pstree.remy/tests/fixtures/out1 | 10 + node_modules/pstree.remy/tests/fixtures/out2 | 29 + node_modules/pstree.remy/tests/index.test.js | 51 + node_modules/punycode/LICENSE-MIT.txt | 20 + node_modules/punycode/README.md | 126 + node_modules/punycode/package.json | 58 + node_modules/punycode/punycode.es6.js | 444 + node_modules/punycode/punycode.js | 443 + node_modules/qs/.editorconfig | 43 + node_modules/qs/.eslintrc | 38 + node_modules/qs/.github/FUNDING.yml | 12 + node_modules/qs/.nycrc | 13 + node_modules/qs/CHANGELOG.md | 546 + node_modules/qs/LICENSE.md | 29 + node_modules/qs/README.md | 625 + node_modules/qs/dist/qs.js | 2054 ++++ node_modules/qs/lib/formats.js | 23 + node_modules/qs/lib/index.js | 11 + node_modules/qs/lib/parse.js | 263 + node_modules/qs/lib/stringify.js | 326 + node_modules/qs/lib/utils.js | 252 + node_modules/qs/package.json | 77 + node_modules/qs/test/parse.js | 855 ++ node_modules/qs/test/stringify.js | 909 ++ node_modules/qs/test/utils.js | 136 + node_modules/range-parser/HISTORY.md | 56 + node_modules/range-parser/LICENSE | 23 + node_modules/range-parser/README.md | 84 + node_modules/range-parser/index.js | 162 + node_modules/range-parser/package.json | 44 + node_modules/raw-body/HISTORY.md | 303 + node_modules/raw-body/LICENSE | 22 + node_modules/raw-body/README.md | 223 + node_modules/raw-body/SECURITY.md | 24 + node_modules/raw-body/index.d.ts | 87 + node_modules/raw-body/index.js | 329 + node_modules/raw-body/package.json | 49 + node_modules/readdirp/LICENSE | 21 + node_modules/readdirp/README.md | 122 + node_modules/readdirp/index.d.ts | 43 + node_modules/readdirp/index.js | 287 + node_modules/readdirp/package.json | 122 + node_modules/relateurl/README.md | 159 + node_modules/relateurl/lib/constants.js | 10 + node_modules/relateurl/lib/format.js | 174 + node_modules/relateurl/lib/index.js | 94 + node_modules/relateurl/lib/options.js | 57 + node_modules/relateurl/lib/parse/host.js | 26 + node_modules/relateurl/lib/parse/hrefInfo.js | 20 + node_modules/relateurl/lib/parse/index.js | 58 + node_modules/relateurl/lib/parse/path.js | 100 + node_modules/relateurl/lib/parse/port.js | 32 + node_modules/relateurl/lib/parse/query.js | 53 + node_modules/relateurl/lib/parse/urlstring.js | 146 + .../relateurl/lib/relate/absolutize.js | 89 + .../relateurl/lib/relate/findRelation.js | 79 + node_modules/relateurl/lib/relate/index.js | 18 + .../relateurl/lib/relate/relativize.js | 67 + node_modules/relateurl/lib/util/devlog.js | 25 + node_modules/relateurl/lib/util/object.js | 64 + node_modules/relateurl/lib/util/path.js | 49 + node_modules/relateurl/license | 21 + node_modules/relateurl/package.json | 46 + 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/lib/auth.js | 167 + node_modules/request/lib/cookies.js | 38 + node_modules/request/lib/getProxyFromURI.js | 79 + node_modules/request/lib/har.js | 205 + node_modules/request/lib/hawk.js | 89 + node_modules/request/lib/helpers.js | 66 + node_modules/request/lib/multipart.js | 112 + node_modules/request/lib/oauth.js | 148 + node_modules/request/lib/querystring.js | 50 + node_modules/request/lib/redirect.js | 154 + node_modules/request/lib/tunnel.js | 175 + .../request/node_modules/qs/.editorconfig | 43 + .../request/node_modules/qs/.eslintrc | 37 + .../node_modules/qs/.github/FUNDING.yml | 12 + node_modules/request/node_modules/qs/.nycrc | 13 + .../request/node_modules/qs/CHANGELOG.md | 250 + .../request/node_modules/qs/LICENSE.md | 29 + .../request/node_modules/qs/README.md | 510 + .../request/node_modules/qs/bower.json | 21 + .../request/node_modules/qs/component.json | 15 + .../request/node_modules/qs/dist/qs.js | 648 + .../request/node_modules/qs/lib/formats.js | 18 + .../request/node_modules/qs/lib/index.js | 11 + .../request/node_modules/qs/lib/parse.js | 175 + .../request/node_modules/qs/lib/stringify.js | 217 + .../request/node_modules/qs/lib/utils.js | 215 + .../request/node_modules/qs/package.json | 54 + .../request/node_modules/qs/test/index.js | 7 + .../request/node_modules/qs/test/parse.js | 649 + .../request/node_modules/qs/test/stringify.js | 642 + .../request/node_modules/qs/test/utils.js | 65 + node_modules/request/package.json | 86 + node_modules/request/request.js | 1553 +++ 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/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/semver/CHANGELOG.md | 39 + node_modules/semver/LICENSE | 15 + node_modules/semver/README.md | 412 + node_modules/semver/bin/semver | 160 + node_modules/semver/package.json | 28 + node_modules/semver/range.bnf | 16 + node_modules/semver/semver.js | 1483 +++ node_modules/send/HISTORY.md | 521 + node_modules/send/LICENSE | 23 + node_modules/send/README.md | 327 + node_modules/send/SECURITY.md | 24 + node_modules/send/index.js | 1143 ++ node_modules/send/node_modules/ms/index.js | 162 + node_modules/send/node_modules/ms/license.md | 21 + .../send/node_modules/ms/package.json | 38 + node_modules/send/node_modules/ms/readme.md | 59 + node_modules/send/package.json | 62 + node_modules/serve-static/HISTORY.md | 471 + node_modules/serve-static/LICENSE | 25 + node_modules/serve-static/README.md | 257 + node_modules/serve-static/index.js | 210 + node_modules/serve-static/package.json | 42 + node_modules/setprototypeof/LICENSE | 13 + node_modules/setprototypeof/README.md | 31 + node_modules/setprototypeof/index.d.ts | 2 + node_modules/setprototypeof/index.js | 17 + node_modules/setprototypeof/package.json | 38 + node_modules/setprototypeof/test/index.js | 24 + node_modules/side-channel/.eslintignore | 1 + node_modules/side-channel/.eslintrc | 11 + node_modules/side-channel/.github/FUNDING.yml | 12 + node_modules/side-channel/.nycrc | 13 + node_modules/side-channel/CHANGELOG.md | 65 + node_modules/side-channel/LICENSE | 21 + node_modules/side-channel/README.md | 2 + node_modules/side-channel/index.js | 124 + node_modules/side-channel/package.json | 67 + node_modules/side-channel/test/index.js | 78 + node_modules/simple-update-notifier/LICENSE | 21 + node_modules/simple-update-notifier/README.md | 82 + .../simple-update-notifier/build/index.d.ts | 13 + .../simple-update-notifier/build/index.js | 217 + .../node_modules/.bin/semver | 1 + .../node_modules/semver/CHANGELOG.md | 74 + .../node_modules/semver/LICENSE | 15 + .../node_modules/semver/README.md | 499 + .../node_modules/semver/bin/semver.js | 173 + .../node_modules/semver/classes/comparator.js | 139 + .../node_modules/semver/classes/index.js | 5 + .../node_modules/semver/classes/range.js | 448 + .../node_modules/semver/classes/semver.js | 290 + .../node_modules/semver/functions/clean.js | 6 + .../node_modules/semver/functions/cmp.js | 48 + .../node_modules/semver/functions/coerce.js | 51 + .../semver/functions/compare-build.js | 7 + .../semver/functions/compare-loose.js | 3 + .../node_modules/semver/functions/compare.js | 5 + .../node_modules/semver/functions/diff.js | 25 + .../node_modules/semver/functions/eq.js | 3 + .../node_modules/semver/functions/gt.js | 3 + .../node_modules/semver/functions/gte.js | 3 + .../node_modules/semver/functions/inc.js | 15 + .../node_modules/semver/functions/lt.js | 3 + .../node_modules/semver/functions/lte.js | 3 + .../node_modules/semver/functions/major.js | 3 + .../node_modules/semver/functions/minor.js | 3 + .../node_modules/semver/functions/neq.js | 3 + .../node_modules/semver/functions/parse.js | 37 + .../node_modules/semver/functions/patch.js | 3 + .../semver/functions/prerelease.js | 6 + .../node_modules/semver/functions/rcompare.js | 3 + .../node_modules/semver/functions/rsort.js | 3 + .../semver/functions/satisfies.js | 10 + .../node_modules/semver/functions/sort.js | 3 + .../node_modules/semver/functions/valid.js | 6 + .../node_modules/semver/index.js | 64 + .../node_modules/semver/internal/constants.js | 17 + .../node_modules/semver/internal/debug.js | 9 + .../semver/internal/identifiers.js | 23 + .../node_modules/semver/internal/re.js | 179 + .../node_modules/semver/package.json | 34 + .../node_modules/semver/range.bnf | 16 + .../node_modules/semver/ranges/gtr.js | 4 + .../node_modules/semver/ranges/intersects.js | 7 + .../node_modules/semver/ranges/ltr.js | 4 + .../semver/ranges/max-satisfying.js | 25 + .../semver/ranges/min-satisfying.js | 24 + .../node_modules/semver/ranges/min-version.js | 57 + .../node_modules/semver/ranges/outside.js | 80 + .../semver/ranges/to-comparators.js | 8 + .../node_modules/semver/ranges/valid.js | 11 + .../simple-update-notifier/package.json | 97 + .../src/borderedText.ts | 12 + .../simple-update-notifier/src/cache.spec.ts | 17 + .../simple-update-notifier/src/cache.ts | 44 + .../src/getDistVersion.spec.ts | 35 + .../src/getDistVersion.ts | 29 + .../src/hasNewVersion.spec.ts | 82 + .../src/hasNewVersion.ts | 40 + .../simple-update-notifier/src/index.spec.ts | 27 + .../simple-update-notifier/src/index.ts | 34 + .../simple-update-notifier/src/isNpmOrYarn.ts | 12 + .../simple-update-notifier/src/types.ts | 8 + 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 +++++ node_modules/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/lib/array-set.js | 121 + node_modules/source-map/lib/base64-vlq.js | 140 + node_modules/source-map/lib/base64.js | 67 + node_modules/source-map/lib/binary-search.js | 111 + node_modules/source-map/lib/mapping-list.js | 79 + node_modules/source-map/lib/quick-sort.js | 114 + .../source-map/lib/source-map-consumer.js | 1082 ++ .../source-map/lib/source-map-generator.js | 416 + node_modules/source-map/lib/source-node.js | 413 + node_modules/source-map/lib/util.js | 417 + node_modules/source-map/package.json | 72 + node_modules/source-map/source-map.js | 8 + node_modules/sshpk/.travis.yml | 11 + node_modules/sshpk/Jenkinsfile | 86 + node_modules/sshpk/LICENSE | 18 + node_modules/sshpk/README.md | 804 ++ node_modules/sshpk/bin/sshpk-conv | 243 + node_modules/sshpk/bin/sshpk-sign | 191 + node_modules/sshpk/bin/sshpk-verify | 167 + node_modules/sshpk/lib/algs.js | 168 + node_modules/sshpk/lib/certificate.js | 410 + node_modules/sshpk/lib/dhe.js | 397 + node_modules/sshpk/lib/ed-compat.js | 92 + node_modules/sshpk/lib/errors.js | 84 + node_modules/sshpk/lib/fingerprint.js | 220 + node_modules/sshpk/lib/formats/auto.js | 124 + node_modules/sshpk/lib/formats/dnssec.js | 287 + .../sshpk/lib/formats/openssh-cert.js | 352 + node_modules/sshpk/lib/formats/pem.js | 290 + node_modules/sshpk/lib/formats/pkcs1.js | 373 + node_modules/sshpk/lib/formats/pkcs8.js | 631 + node_modules/sshpk/lib/formats/putty.js | 194 + node_modules/sshpk/lib/formats/rfc4253.js | 166 + node_modules/sshpk/lib/formats/ssh-private.js | 262 + node_modules/sshpk/lib/formats/ssh.js | 115 + node_modules/sshpk/lib/formats/x509-pem.js | 88 + node_modules/sshpk/lib/formats/x509.js | 752 ++ node_modules/sshpk/lib/identity.js | 373 + node_modules/sshpk/lib/index.js | 40 + node_modules/sshpk/lib/key.js | 294 + node_modules/sshpk/lib/private-key.js | 247 + node_modules/sshpk/lib/signature.js | 314 + node_modules/sshpk/lib/ssh-buffer.js | 149 + node_modules/sshpk/lib/utils.js | 404 + 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/statuses/HISTORY.md | 82 + node_modules/statuses/LICENSE | 23 + node_modules/statuses/README.md | 136 + node_modules/statuses/codes.json | 65 + node_modules/statuses/index.js | 146 + node_modules/statuses/package.json | 49 + 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/to-regex-range/LICENSE | 21 + node_modules/to-regex-range/README.md | 305 + node_modules/to-regex-range/index.js | 288 + node_modules/to-regex-range/package.json | 88 + node_modules/toidentifier/HISTORY.md | 9 + node_modules/toidentifier/LICENSE | 21 + node_modules/toidentifier/README.md | 61 + node_modules/toidentifier/index.js | 32 + node_modules/toidentifier/package.json | 38 + node_modules/touch/LICENSE | 15 + node_modules/touch/README.md | 52 + node_modules/touch/bin/nodetouch.js | 112 + node_modules/touch/index.js | 224 + node_modules/touch/package.json | 28 + node_modules/tough-cookie/LICENSE | 12 + node_modules/tough-cookie/README.md | 527 + node_modules/tough-cookie/lib/cookie.js | 1482 +++ node_modules/tough-cookie/lib/memstore.js | 181 + node_modules/tough-cookie/lib/pathMatch.js | 61 + .../tough-cookie/lib/permuteDomain.js | 56 + .../tough-cookie/lib/pubsuffix-psl.js | 38 + node_modules/tough-cookie/lib/store.js | 75 + node_modules/tough-cookie/lib/version.js | 2 + node_modules/tough-cookie/package.json | 78 + 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-is/HISTORY.md | 259 + node_modules/type-is/LICENSE | 23 + node_modules/type-is/README.md | 170 + node_modules/type-is/index.js | 266 + node_modules/type-is/package.json | 45 + node_modules/uglify-js/LICENSE | 29 + node_modules/uglify-js/README.md | 1100 ++ node_modules/uglify-js/bin/uglifyjs | 404 + node_modules/uglify-js/lib/ast.js | 914 ++ node_modules/uglify-js/lib/compress.js | 5002 ++++++++ node_modules/uglify-js/lib/minify.js | 228 + node_modules/uglify-js/lib/mozilla-ast.js | 615 + node_modules/uglify-js/lib/output.js | 1445 +++ node_modules/uglify-js/lib/parse.js | 1599 +++ node_modules/uglify-js/lib/propmangle.js | 241 + node_modules/uglify-js/lib/scope.js | 589 + node_modules/uglify-js/lib/sourcemap.js | 97 + node_modules/uglify-js/lib/transform.js | 217 + node_modules/uglify-js/lib/utils.js | 355 + .../node_modules/source-map/CHANGELOG.md | 301 + .../uglify-js/node_modules/source-map/LICENSE | 28 + .../node_modules/source-map/README.md | 742 ++ .../source-map/dist/source-map.debug.js | 3234 +++++ .../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/lib/array-set.js | 121 + .../node_modules/source-map/lib/base64-vlq.js | 140 + .../node_modules/source-map/lib/base64.js | 67 + .../source-map/lib/binary-search.js | 111 + .../source-map/lib/mapping-list.js | 79 + .../node_modules/source-map/lib/quick-sort.js | 114 + .../source-map/lib/source-map-consumer.js | 1145 ++ .../source-map/lib/source-map-generator.js | 425 + .../source-map/lib/source-node.js | 413 + .../node_modules/source-map/lib/util.js | 488 + .../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/uglify-js/package.json | 44 + node_modules/uglify-js/tools/domprops.json | 5601 +++++++++ node_modules/uglify-js/tools/exports.js | 5 + node_modules/uglify-js/tools/node.js | 82 + node_modules/uglify-js/tools/props.html | 61 + .../undefsafe/.github/workflows/release.yml | 25 + node_modules/undefsafe/.jscsrc | 13 + node_modules/undefsafe/.jshintrc | 16 + node_modules/undefsafe/.travis.yml | 18 + node_modules/undefsafe/LICENSE | 22 + node_modules/undefsafe/README.md | 63 + node_modules/undefsafe/example.js | 14 + node_modules/undefsafe/lib/undefsafe.js | 125 + node_modules/undefsafe/package.json | 34 + node_modules/unpipe/HISTORY.md | 4 + node_modules/unpipe/LICENSE | 22 + node_modules/unpipe/README.md | 43 + node_modules/unpipe/index.js | 69 + node_modules/unpipe/package.json | 27 + node_modules/upper-case/LICENSE | 21 + node_modules/upper-case/README.md | 45 + node_modules/upper-case/package.json | 51 + node_modules/upper-case/upper-case.d.ts | 3 + node_modules/upper-case/upper-case.js | 50 + 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/utils-merge/.npmignore | 9 + node_modules/utils-merge/LICENSE | 20 + node_modules/utils-merge/README.md | 34 + node_modules/utils-merge/index.js | 23 + node_modules/utils-merge/package.json | 40 + 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/bin/uuid | 65 + node_modules/uuid/index.js | 8 + node_modules/uuid/lib/bytesToUuid.js | 26 + node_modules/uuid/lib/md5-browser.js | 216 + node_modules/uuid/lib/md5.js | 25 + node_modules/uuid/lib/rng-browser.js | 34 + node_modules/uuid/lib/rng.js | 8 + node_modules/uuid/lib/sha1-browser.js | 89 + node_modules/uuid/lib/sha1.js | 25 + node_modules/uuid/lib/v35.js | 57 + 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/vary/HISTORY.md | 39 + node_modules/vary/LICENSE | 22 + node_modules/vary/README.md | 101 + node_modules/vary/index.js | 149 + node_modules/vary/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/verror/lib/verror.js | 451 + node_modules/verror/package.json | 22 + node_modules/xml-char-classes/index.js | 11 + node_modules/xml-char-classes/package.json | 39 + node_modules/xml-char-classes/readme.md | 45 + package-lock.json | 1622 +++ package.json | 33 + public/styles/styles.css | 0 views/index.html | 0 1736 files changed, 288747 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 120000 node_modules/.bin/ejs create mode 120000 node_modules/.bin/he create mode 120000 node_modules/.bin/html-minifier create mode 120000 node_modules/.bin/jake create mode 120000 node_modules/.bin/mime create mode 120000 node_modules/.bin/nodemon create mode 120000 node_modules/.bin/nodetouch create mode 120000 node_modules/.bin/nopt 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/uglifyjs create mode 120000 node_modules/.bin/uuid create mode 100644 node_modules/.package-lock.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/accepts/HISTORY.md create mode 100644 node_modules/accepts/LICENSE create mode 100644 node_modules/accepts/README.md create mode 100644 node_modules/accepts/index.js create mode 100644 node_modules/accepts/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/lib/ajv.d.ts create mode 100644 node_modules/ajv/lib/ajv.js create mode 100644 node_modules/ajv/lib/cache.js create mode 100644 node_modules/ajv/lib/compile/async.js create mode 100644 node_modules/ajv/lib/compile/equal.js create mode 100644 node_modules/ajv/lib/compile/error_classes.js create mode 100644 node_modules/ajv/lib/compile/formats.js create mode 100644 node_modules/ajv/lib/compile/index.js create mode 100644 node_modules/ajv/lib/compile/resolve.js create mode 100644 node_modules/ajv/lib/compile/rules.js create mode 100644 node_modules/ajv/lib/compile/schema_obj.js create mode 100644 node_modules/ajv/lib/compile/ucs2length.js create mode 100644 node_modules/ajv/lib/compile/util.js create mode 100644 node_modules/ajv/lib/data.js create mode 100644 node_modules/ajv/lib/definition_schema.js create mode 100644 node_modules/ajv/lib/dot/_limit.jst create mode 100644 node_modules/ajv/lib/dot/_limitItems.jst create mode 100644 node_modules/ajv/lib/dot/_limitLength.jst create mode 100644 node_modules/ajv/lib/dot/_limitProperties.jst create mode 100644 node_modules/ajv/lib/dot/allOf.jst create mode 100644 node_modules/ajv/lib/dot/anyOf.jst create mode 100644 node_modules/ajv/lib/dot/coerce.def create mode 100644 node_modules/ajv/lib/dot/comment.jst create mode 100644 node_modules/ajv/lib/dot/const.jst create mode 100644 node_modules/ajv/lib/dot/contains.jst create mode 100644 node_modules/ajv/lib/dot/custom.jst create mode 100644 node_modules/ajv/lib/dot/defaults.def create mode 100644 node_modules/ajv/lib/dot/definitions.def create mode 100644 node_modules/ajv/lib/dot/dependencies.jst create mode 100644 node_modules/ajv/lib/dot/enum.jst create mode 100644 node_modules/ajv/lib/dot/errors.def create mode 100644 node_modules/ajv/lib/dot/format.jst create mode 100644 node_modules/ajv/lib/dot/if.jst create mode 100644 node_modules/ajv/lib/dot/items.jst create mode 100644 node_modules/ajv/lib/dot/missing.def create mode 100644 node_modules/ajv/lib/dot/multipleOf.jst create mode 100644 node_modules/ajv/lib/dot/not.jst create mode 100644 node_modules/ajv/lib/dot/oneOf.jst create mode 100644 node_modules/ajv/lib/dot/pattern.jst create mode 100644 node_modules/ajv/lib/dot/properties.jst create mode 100644 node_modules/ajv/lib/dot/propertyNames.jst create mode 100644 node_modules/ajv/lib/dot/ref.jst create mode 100644 node_modules/ajv/lib/dot/required.jst create mode 100644 node_modules/ajv/lib/dot/uniqueItems.jst create mode 100644 node_modules/ajv/lib/dot/validate.jst create mode 100644 node_modules/ajv/lib/dotjs/README.md create mode 100644 node_modules/ajv/lib/dotjs/_limit.js create mode 100644 node_modules/ajv/lib/dotjs/_limitItems.js create mode 100644 node_modules/ajv/lib/dotjs/_limitLength.js create mode 100644 node_modules/ajv/lib/dotjs/_limitProperties.js create mode 100644 node_modules/ajv/lib/dotjs/allOf.js create mode 100644 node_modules/ajv/lib/dotjs/anyOf.js create mode 100644 node_modules/ajv/lib/dotjs/comment.js create mode 100644 node_modules/ajv/lib/dotjs/const.js create mode 100644 node_modules/ajv/lib/dotjs/contains.js create mode 100644 node_modules/ajv/lib/dotjs/custom.js create mode 100644 node_modules/ajv/lib/dotjs/dependencies.js create mode 100644 node_modules/ajv/lib/dotjs/enum.js create mode 100644 node_modules/ajv/lib/dotjs/format.js create mode 100644 node_modules/ajv/lib/dotjs/if.js create mode 100644 node_modules/ajv/lib/dotjs/index.js create mode 100644 node_modules/ajv/lib/dotjs/items.js create mode 100644 node_modules/ajv/lib/dotjs/multipleOf.js create mode 100644 node_modules/ajv/lib/dotjs/not.js create mode 100644 node_modules/ajv/lib/dotjs/oneOf.js create mode 100644 node_modules/ajv/lib/dotjs/pattern.js create mode 100644 node_modules/ajv/lib/dotjs/properties.js create mode 100644 node_modules/ajv/lib/dotjs/propertyNames.js create mode 100644 node_modules/ajv/lib/dotjs/ref.js create mode 100644 node_modules/ajv/lib/dotjs/required.js create mode 100644 node_modules/ajv/lib/dotjs/uniqueItems.js create mode 100644 node_modules/ajv/lib/dotjs/validate.js create mode 100644 node_modules/ajv/lib/keyword.js create mode 100644 node_modules/ajv/lib/refs/data.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-04.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-06.json create mode 100644 node_modules/ajv/lib/refs/json-schema-draft-07.json create mode 100644 node_modules/ajv/lib/refs/json-schema-secure.json 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/ansi-styles/index.d.ts 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/anymatch/LICENSE create mode 100644 node_modules/anymatch/README.md create mode 100644 node_modules/anymatch/index.d.ts create mode 100644 node_modules/anymatch/index.js create mode 100644 node_modules/anymatch/package.json create mode 100644 node_modules/array-flatten/LICENSE create mode 100644 node_modules/array-flatten/README.md create mode 100644 node_modules/array-flatten/array-flatten.js create mode 100644 node_modules/array-flatten/package.json create mode 100644 node_modules/asn1/Jenkinsfile create mode 100644 node_modules/asn1/LICENSE create mode 100644 node_modules/asn1/README.md create mode 100644 node_modules/asn1/lib/ber/errors.js create mode 100644 node_modules/asn1/lib/ber/index.js create mode 100644 node_modules/asn1/lib/ber/reader.js create mode 100644 node_modules/asn1/lib/ber/types.js create mode 100644 node_modules/asn1/lib/ber/writer.js create mode 100644 node_modules/asn1/lib/index.js 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/async/CHANGELOG.md create mode 100644 node_modules/async/LICENSE create mode 100644 node_modules/async/README.md create mode 100644 node_modules/async/all.js create mode 100644 node_modules/async/allLimit.js create mode 100644 node_modules/async/allSeries.js create mode 100644 node_modules/async/any.js create mode 100644 node_modules/async/anyLimit.js create mode 100644 node_modules/async/anySeries.js create mode 100644 node_modules/async/apply.js create mode 100644 node_modules/async/applyEach.js create mode 100644 node_modules/async/applyEachSeries.js create mode 100644 node_modules/async/asyncify.js create mode 100644 node_modules/async/auto.js create mode 100644 node_modules/async/autoInject.js create mode 100644 node_modules/async/bower.json create mode 100644 node_modules/async/cargo.js create mode 100644 node_modules/async/cargoQueue.js create mode 100644 node_modules/async/compose.js create mode 100644 node_modules/async/concat.js create mode 100644 node_modules/async/concatLimit.js create mode 100644 node_modules/async/concatSeries.js create mode 100644 node_modules/async/constant.js create mode 100644 node_modules/async/detect.js create mode 100644 node_modules/async/detectLimit.js create mode 100644 node_modules/async/detectSeries.js create mode 100644 node_modules/async/dir.js create mode 100644 node_modules/async/dist/async.js create mode 100644 node_modules/async/dist/async.min.js create mode 100644 node_modules/async/dist/async.mjs create mode 100644 node_modules/async/doDuring.js create mode 100644 node_modules/async/doUntil.js create mode 100644 node_modules/async/doWhilst.js create mode 100644 node_modules/async/during.js create mode 100644 node_modules/async/each.js create mode 100644 node_modules/async/eachLimit.js create mode 100644 node_modules/async/eachOf.js create mode 100644 node_modules/async/eachOfLimit.js create mode 100644 node_modules/async/eachOfSeries.js create mode 100644 node_modules/async/eachSeries.js create mode 100644 node_modules/async/ensureAsync.js create mode 100644 node_modules/async/every.js create mode 100644 node_modules/async/everyLimit.js create mode 100644 node_modules/async/everySeries.js create mode 100644 node_modules/async/filter.js create mode 100644 node_modules/async/filterLimit.js create mode 100644 node_modules/async/filterSeries.js create mode 100644 node_modules/async/find.js create mode 100644 node_modules/async/findLimit.js create mode 100644 node_modules/async/findSeries.js create mode 100644 node_modules/async/flatMap.js create mode 100644 node_modules/async/flatMapLimit.js create mode 100644 node_modules/async/flatMapSeries.js create mode 100644 node_modules/async/foldl.js create mode 100644 node_modules/async/foldr.js create mode 100644 node_modules/async/forEach.js create mode 100644 node_modules/async/forEachLimit.js create mode 100644 node_modules/async/forEachOf.js create mode 100644 node_modules/async/forEachOfLimit.js create mode 100644 node_modules/async/forEachOfSeries.js create mode 100644 node_modules/async/forEachSeries.js create mode 100644 node_modules/async/forever.js create mode 100644 node_modules/async/groupBy.js create mode 100644 node_modules/async/groupByLimit.js create mode 100644 node_modules/async/groupBySeries.js create mode 100644 node_modules/async/index.js create mode 100644 node_modules/async/inject.js create mode 100644 node_modules/async/internal/DoublyLinkedList.js create mode 100644 node_modules/async/internal/Heap.js create mode 100644 node_modules/async/internal/applyEach.js create mode 100644 node_modules/async/internal/asyncEachOfLimit.js create mode 100644 node_modules/async/internal/awaitify.js create mode 100644 node_modules/async/internal/breakLoop.js create mode 100644 node_modules/async/internal/consoleFunc.js create mode 100644 node_modules/async/internal/createTester.js create mode 100644 node_modules/async/internal/eachOfLimit.js create mode 100644 node_modules/async/internal/filter.js create mode 100644 node_modules/async/internal/getIterator.js create mode 100644 node_modules/async/internal/initialParams.js create mode 100644 node_modules/async/internal/isArrayLike.js create mode 100644 node_modules/async/internal/iterator.js create mode 100644 node_modules/async/internal/map.js create mode 100644 node_modules/async/internal/once.js create mode 100644 node_modules/async/internal/onlyOnce.js create mode 100644 node_modules/async/internal/parallel.js create mode 100644 node_modules/async/internal/promiseCallback.js create mode 100644 node_modules/async/internal/queue.js create mode 100644 node_modules/async/internal/range.js create mode 100644 node_modules/async/internal/reject.js create mode 100644 node_modules/async/internal/setImmediate.js create mode 100644 node_modules/async/internal/withoutIndex.js create mode 100644 node_modules/async/internal/wrapAsync.js create mode 100644 node_modules/async/log.js create mode 100644 node_modules/async/map.js create mode 100644 node_modules/async/mapLimit.js create mode 100644 node_modules/async/mapSeries.js create mode 100644 node_modules/async/mapValues.js create mode 100644 node_modules/async/mapValuesLimit.js create mode 100644 node_modules/async/mapValuesSeries.js create mode 100644 node_modules/async/memoize.js create mode 100644 node_modules/async/nextTick.js create mode 100644 node_modules/async/package.json create mode 100644 node_modules/async/parallel.js create mode 100644 node_modules/async/parallelLimit.js create mode 100644 node_modules/async/priorityQueue.js create mode 100644 node_modules/async/queue.js create mode 100644 node_modules/async/race.js create mode 100644 node_modules/async/reduce.js create mode 100644 node_modules/async/reduceRight.js create mode 100644 node_modules/async/reflect.js create mode 100644 node_modules/async/reflectAll.js create mode 100644 node_modules/async/reject.js create mode 100644 node_modules/async/rejectLimit.js create mode 100644 node_modules/async/rejectSeries.js create mode 100644 node_modules/async/retry.js create mode 100644 node_modules/async/retryable.js create mode 100644 node_modules/async/select.js create mode 100644 node_modules/async/selectLimit.js create mode 100644 node_modules/async/selectSeries.js create mode 100644 node_modules/async/seq.js create mode 100644 node_modules/async/series.js create mode 100644 node_modules/async/setImmediate.js create mode 100644 node_modules/async/some.js create mode 100644 node_modules/async/someLimit.js create mode 100644 node_modules/async/someSeries.js create mode 100644 node_modules/async/sortBy.js create mode 100644 node_modules/async/timeout.js create mode 100644 node_modules/async/times.js create mode 100644 node_modules/async/timesLimit.js create mode 100644 node_modules/async/timesSeries.js create mode 100644 node_modules/async/transform.js create mode 100644 node_modules/async/tryEach.js create mode 100644 node_modules/async/unmemoize.js create mode 100644 node_modules/async/until.js create mode 100644 node_modules/async/waterfall.js create mode 100644 node_modules/async/whilst.js create mode 100644 node_modules/async/wrapSync.js 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/lib/abort.js create mode 100644 node_modules/asynckit/lib/async.js create mode 100644 node_modules/asynckit/lib/defer.js create mode 100644 node_modules/asynckit/lib/iterate.js create mode 100644 node_modules/asynckit/lib/readable_asynckit.js create mode 100644 node_modules/asynckit/lib/readable_parallel.js create mode 100644 node_modules/asynckit/lib/readable_serial.js create mode 100644 node_modules/asynckit/lib/readable_serial_ordered.js create mode 100644 node_modules/asynckit/lib/state.js create mode 100644 node_modules/asynckit/lib/streamify.js create mode 100644 node_modules/asynckit/lib/terminator.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/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/balanced-match/.github/FUNDING.yml 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/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/binary-extensions.json.d.ts create mode 100644 node_modules/binary-extensions/index.d.ts create mode 100644 node_modules/binary-extensions/index.js 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/body-parser/HISTORY.md create mode 100644 node_modules/body-parser/LICENSE create mode 100644 node_modules/body-parser/README.md create mode 100644 node_modules/body-parser/SECURITY.md create mode 100644 node_modules/body-parser/index.js create mode 100644 node_modules/body-parser/lib/read.js create mode 100644 node_modules/body-parser/lib/types/json.js create mode 100644 node_modules/body-parser/lib/types/raw.js create mode 100644 node_modules/body-parser/lib/types/text.js create mode 100644 node_modules/body-parser/lib/types/urlencoded.js create mode 100644 node_modules/body-parser/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/CHANGELOG.md 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/lib/compile.js create mode 100644 node_modules/braces/lib/constants.js create mode 100644 node_modules/braces/lib/expand.js create mode 100644 node_modules/braces/lib/parse.js create mode 100644 node_modules/braces/lib/stringify.js create mode 100644 node_modules/braces/lib/utils.js create mode 100644 node_modules/braces/package.json create mode 100644 node_modules/bytes/History.md create mode 100644 node_modules/bytes/LICENSE create mode 100644 node_modules/bytes/Readme.md create mode 100644 node_modules/bytes/index.js create mode 100644 node_modules/bytes/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/camel-case/LICENSE create mode 100644 node_modules/camel-case/camel-case.d.ts create mode 100644 node_modules/camel-case/camel-case.js create mode 100644 node_modules/camel-case/package.json 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.d.ts create mode 100644 node_modules/chalk/license create mode 100644 node_modules/chalk/node_modules/has-flag/index.d.ts create mode 100644 node_modules/chalk/node_modules/has-flag/index.js create mode 100644 node_modules/chalk/node_modules/has-flag/license create mode 100644 node_modules/chalk/node_modules/has-flag/package.json create mode 100644 node_modules/chalk/node_modules/has-flag/readme.md create mode 100644 node_modules/chalk/node_modules/supports-color/browser.js create mode 100644 node_modules/chalk/node_modules/supports-color/index.js create mode 100644 node_modules/chalk/node_modules/supports-color/license create mode 100644 node_modules/chalk/node_modules/supports-color/package.json create mode 100644 node_modules/chalk/node_modules/supports-color/readme.md create mode 100644 node_modules/chalk/package.json create mode 100644 node_modules/chalk/readme.md create mode 100644 node_modules/chalk/source/index.js create mode 100644 node_modules/chalk/source/templates.js create mode 100644 node_modules/chalk/source/util.js create mode 100644 node_modules/chokidar/LICENSE create mode 100644 node_modules/chokidar/README.md create mode 100644 node_modules/chokidar/index.js create mode 100644 node_modules/chokidar/lib/constants.js create mode 100644 node_modules/chokidar/lib/fsevents-handler.js create mode 100644 node_modules/chokidar/lib/nodefs-handler.js create mode 100644 node_modules/chokidar/package.json create mode 100644 node_modules/chokidar/types/index.d.ts create mode 100644 node_modules/clean-css/History.md create mode 100644 node_modules/clean-css/LICENSE create mode 100644 node_modules/clean-css/README.md create mode 100644 node_modules/clean-css/index.js create mode 100644 node_modules/clean-css/lib/clean.js create mode 100644 node_modules/clean-css/lib/optimizer/hack.js create mode 100644 node_modules/clean-css/lib/optimizer/level-0/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-block.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/break-up.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/can-override.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/clone.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/compactable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/extract-properties.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/reorderable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/restore.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/restructure.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificity.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js create mode 100644 node_modules/clean-css/lib/optimizer/remove-unused.js create mode 100644 node_modules/clean-css/lib/optimizer/restore-from-optimizing.js create mode 100644 node_modules/clean-css/lib/optimizer/validator.js create mode 100644 node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js create mode 100644 node_modules/clean-css/lib/options/compatibility.js create mode 100644 node_modules/clean-css/lib/options/fetch.js create mode 100644 node_modules/clean-css/lib/options/format.js create mode 100644 node_modules/clean-css/lib/options/inline-request.js create mode 100644 node_modules/clean-css/lib/options/inline-timeout.js create mode 100644 node_modules/clean-css/lib/options/inline.js create mode 100644 node_modules/clean-css/lib/options/optimization-level.js create mode 100644 node_modules/clean-css/lib/options/rebase-to.js create mode 100644 node_modules/clean-css/lib/options/rebase.js create mode 100644 node_modules/clean-css/lib/options/rounding-precision.js create mode 100644 node_modules/clean-css/lib/reader/apply-source-maps.js create mode 100644 node_modules/clean-css/lib/reader/extract-import-url-and-media.js create mode 100644 node_modules/clean-css/lib/reader/input-source-map-tracker.js create mode 100644 node_modules/clean-css/lib/reader/is-allowed-resource.js create mode 100644 node_modules/clean-css/lib/reader/load-original-sources.js create mode 100644 node_modules/clean-css/lib/reader/load-remote-resource.js create mode 100644 node_modules/clean-css/lib/reader/match-data-uri.js create mode 100644 node_modules/clean-css/lib/reader/normalize-path.js create mode 100644 node_modules/clean-css/lib/reader/read-sources.js create mode 100644 node_modules/clean-css/lib/reader/rebase-local-map.js create mode 100644 node_modules/clean-css/lib/reader/rebase-remote-map.js create mode 100644 node_modules/clean-css/lib/reader/rebase.js create mode 100644 node_modules/clean-css/lib/reader/restore-import.js create mode 100644 node_modules/clean-css/lib/reader/rewrite-url.js create mode 100644 node_modules/clean-css/lib/tokenizer/marker.js create mode 100644 node_modules/clean-css/lib/tokenizer/token.js create mode 100644 node_modules/clean-css/lib/tokenizer/tokenize.js create mode 100644 node_modules/clean-css/lib/utils/clone-array.js create mode 100644 node_modules/clean-css/lib/utils/format-position.js create mode 100644 node_modules/clean-css/lib/utils/has-protocol.js create mode 100644 node_modules/clean-css/lib/utils/is-data-uri-resource.js create mode 100644 node_modules/clean-css/lib/utils/is-http-resource.js create mode 100644 node_modules/clean-css/lib/utils/is-https-resource.js create mode 100644 node_modules/clean-css/lib/utils/is-import.js create mode 100644 node_modules/clean-css/lib/utils/is-remote-resource.js create mode 100644 node_modules/clean-css/lib/utils/natural-compare.js create mode 100644 node_modules/clean-css/lib/utils/override.js create mode 100644 node_modules/clean-css/lib/utils/split.js create mode 100644 node_modules/clean-css/lib/writer/helpers.js create mode 100644 node_modules/clean-css/lib/writer/one-time.js create mode 100644 node_modules/clean-css/lib/writer/simple.js create mode 100644 node_modules/clean-css/lib/writer/source-maps.js create mode 100644 node_modules/clean-css/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/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/combined-stream/License create mode 100644 node_modules/combined-stream/Readme.md create mode 100644 node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_modules/combined-stream/package.json create mode 100644 node_modules/combined-stream/yarn.lock create mode 100644 node_modules/commander/CHANGELOG.md create mode 100644 node_modules/commander/LICENSE create mode 100644 node_modules/commander/Readme.md create mode 100644 node_modules/commander/index.js create mode 100644 node_modules/commander/package.json create mode 100644 node_modules/commander/typings/index.d.ts 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/content-disposition/HISTORY.md create mode 100644 node_modules/content-disposition/LICENSE create mode 100644 node_modules/content-disposition/README.md create mode 100644 node_modules/content-disposition/index.js create mode 100644 node_modules/content-disposition/package.json create mode 100644 node_modules/content-type/HISTORY.md create mode 100644 node_modules/content-type/LICENSE create mode 100644 node_modules/content-type/README.md create mode 100644 node_modules/content-type/index.js create mode 100644 node_modules/content-type/package.json create mode 100644 node_modules/cookie-signature/.npmignore create mode 100644 node_modules/cookie-signature/History.md create mode 100644 node_modules/cookie-signature/Readme.md create mode 100644 node_modules/cookie-signature/index.js create mode 100644 node_modules/cookie-signature/package.json create mode 100644 node_modules/cookie/HISTORY.md create mode 100644 node_modules/cookie/LICENSE create mode 100644 node_modules/cookie/README.md create mode 100644 node_modules/cookie/SECURITY.md create mode 100644 node_modules/cookie/index.js create mode 100644 node_modules/cookie/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/lib/util.js 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/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/lib/dashdash.js create mode 100644 node_modules/dashdash/package.json 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/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/lib/delayed_stream.js create mode 100644 node_modules/delayed-stream/package.json create mode 100644 node_modules/depd/History.md create mode 100644 node_modules/depd/LICENSE create mode 100644 node_modules/depd/Readme.md create mode 100644 node_modules/depd/index.js create mode 100644 node_modules/depd/lib/browser/index.js create mode 100644 node_modules/depd/package.json create mode 100644 node_modules/destroy/LICENSE create mode 100644 node_modules/destroy/README.md create mode 100644 node_modules/destroy/index.js create mode 100644 node_modules/destroy/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/lib/LICENSE-jsbn create mode 100755 node_modules/ecc-jsbn/lib/ec.js create mode 100755 node_modules/ecc-jsbn/lib/sec.js create mode 100755 node_modules/ecc-jsbn/package.json create mode 100755 node_modules/ecc-jsbn/test.js create mode 100644 node_modules/ee-first/LICENSE create mode 100644 node_modules/ee-first/README.md create mode 100644 node_modules/ee-first/index.js create mode 100644 node_modules/ee-first/package.json create mode 100644 node_modules/ejs/LICENSE create mode 100644 node_modules/ejs/README.md create mode 100755 node_modules/ejs/bin/cli.js create mode 100644 node_modules/ejs/ejs.js create mode 100644 node_modules/ejs/ejs.min.js create mode 100644 node_modules/ejs/jakefile.js create mode 100755 node_modules/ejs/lib/ejs.js create mode 100644 node_modules/ejs/lib/utils.js create mode 100644 node_modules/ejs/package.json create mode 100644 node_modules/ejs/usage.txt create mode 100644 node_modules/encodeurl/HISTORY.md create mode 100644 node_modules/encodeurl/LICENSE create mode 100644 node_modules/encodeurl/README.md create mode 100644 node_modules/encodeurl/index.js create mode 100644 node_modules/encodeurl/package.json create mode 100644 node_modules/escape-html/LICENSE create mode 100644 node_modules/escape-html/Readme.md create mode 100644 node_modules/escape-html/index.js create mode 100644 node_modules/escape-html/package.json create mode 100644 node_modules/etag/HISTORY.md create mode 100644 node_modules/etag/LICENSE create mode 100644 node_modules/etag/README.md create mode 100644 node_modules/etag/index.js create mode 100644 node_modules/etag/package.json create mode 100644 node_modules/express-minify-html/LICENSE create mode 100644 node_modules/express-minify-html/README.md create mode 100644 node_modules/express-minify-html/minifier.js create mode 100644 node_modules/express-minify-html/package.json create mode 100644 node_modules/express/History.md create mode 100644 node_modules/express/LICENSE create mode 100644 node_modules/express/Readme.md create mode 100644 node_modules/express/index.js create mode 100644 node_modules/express/lib/application.js create mode 100644 node_modules/express/lib/express.js create mode 100644 node_modules/express/lib/middleware/init.js create mode 100644 node_modules/express/lib/middleware/query.js create mode 100644 node_modules/express/lib/request.js create mode 100644 node_modules/express/lib/response.js create mode 100644 node_modules/express/lib/router/index.js create mode 100644 node_modules/express/lib/router/layer.js create mode 100644 node_modules/express/lib/router/route.js create mode 100644 node_modules/express/lib/utils.js create mode 100644 node_modules/express/lib/view.js create mode 100644 node_modules/express/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/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/lib/extsprintf.js create mode 100644 node_modules/extsprintf/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/filelist/README.md create mode 100644 node_modules/filelist/index.d.ts create mode 100644 node_modules/filelist/index.js create mode 100644 node_modules/filelist/jakefile.js create mode 100644 node_modules/filelist/node_modules/brace-expansion/.github/FUNDING.yml create mode 100644 node_modules/filelist/node_modules/brace-expansion/LICENSE create mode 100644 node_modules/filelist/node_modules/brace-expansion/README.md create mode 100644 node_modules/filelist/node_modules/brace-expansion/index.js create mode 100644 node_modules/filelist/node_modules/brace-expansion/package.json create mode 100644 node_modules/filelist/node_modules/minimatch/LICENSE create mode 100644 node_modules/filelist/node_modules/minimatch/README.md create mode 100644 node_modules/filelist/node_modules/minimatch/lib/path.js create mode 100644 node_modules/filelist/node_modules/minimatch/minimatch.js create mode 100644 node_modules/filelist/node_modules/minimatch/package.json create mode 100644 node_modules/filelist/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/finalhandler/HISTORY.md create mode 100644 node_modules/finalhandler/LICENSE create mode 100644 node_modules/finalhandler/README.md create mode 100644 node_modules/finalhandler/SECURITY.md create mode 100644 node_modules/finalhandler/index.js create mode 100644 node_modules/finalhandler/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/lib/browser.js create mode 100644 node_modules/form-data/lib/form_data.js create mode 100644 node_modules/form-data/lib/populate.js create mode 100644 node_modules/form-data/package.json create mode 100644 node_modules/form-data/yarn.lock create mode 100644 node_modules/forwarded/HISTORY.md create mode 100644 node_modules/forwarded/LICENSE create mode 100644 node_modules/forwarded/README.md create mode 100644 node_modules/forwarded/index.js create mode 100644 node_modules/forwarded/package.json create mode 100644 node_modules/fresh/HISTORY.md create mode 100644 node_modules/fresh/LICENSE create mode 100644 node_modules/fresh/README.md create mode 100644 node_modules/fresh/index.js create mode 100644 node_modules/fresh/package.json create mode 100644 node_modules/fsevents/LICENSE create mode 100644 node_modules/fsevents/README.md create mode 100644 node_modules/fsevents/fsevents.d.ts create mode 100644 node_modules/fsevents/fsevents.js create mode 100755 node_modules/fsevents/fsevents.node create mode 100644 node_modules/fsevents/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/get-intrinsic/.eslintrc create mode 100644 node_modules/get-intrinsic/.github/FUNDING.yml create mode 100644 node_modules/get-intrinsic/.nycrc 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/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/lib/index.js create mode 100644 node_modules/getpass/package.json create mode 100644 node_modules/glob-parent/CHANGELOG.md 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 100644 node_modules/har-schema/LICENSE create mode 100644 node_modules/har-schema/README.md create mode 100644 node_modules/har-schema/lib/afterRequest.json create mode 100644 node_modules/har-schema/lib/beforeRequest.json create mode 100644 node_modules/har-schema/lib/browser.json create mode 100644 node_modules/har-schema/lib/cache.json create mode 100644 node_modules/har-schema/lib/content.json create mode 100644 node_modules/har-schema/lib/cookie.json create mode 100644 node_modules/har-schema/lib/creator.json create mode 100644 node_modules/har-schema/lib/entry.json create mode 100644 node_modules/har-schema/lib/har.json create mode 100644 node_modules/har-schema/lib/header.json create mode 100644 node_modules/har-schema/lib/index.js create mode 100644 node_modules/har-schema/lib/log.json create mode 100644 node_modules/har-schema/lib/page.json create mode 100644 node_modules/har-schema/lib/pageTimings.json create mode 100644 node_modules/har-schema/lib/postData.json create mode 100644 node_modules/har-schema/lib/query.json create mode 100644 node_modules/har-schema/lib/request.json create mode 100644 node_modules/har-schema/lib/response.json create mode 100644 node_modules/har-schema/lib/timings.json 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/lib/async.js create mode 100644 node_modules/har-validator/lib/error.js create mode 100644 node_modules/har-validator/lib/promise.js create mode 100644 node_modules/har-validator/package.json 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/.nycrc 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/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/he/LICENSE-MIT.txt create mode 100644 node_modules/he/README.md create mode 100755 node_modules/he/bin/he create mode 100644 node_modules/he/he.js create mode 100644 node_modules/he/man/he.1 create mode 100644 node_modules/he/package.json create mode 100644 node_modules/html-minifier/LICENSE create mode 100644 node_modules/html-minifier/README.md create mode 100755 node_modules/html-minifier/cli.js create mode 100644 node_modules/html-minifier/package.json create mode 100644 node_modules/html-minifier/sample-cli-config-file.conf create mode 100644 node_modules/html-minifier/src/htmlminifier.js create mode 100644 node_modules/html-minifier/src/htmlparser.js create mode 100644 node_modules/html-minifier/src/tokenchain.js create mode 100644 node_modules/html-minifier/src/utils.js create mode 100644 node_modules/http-errors/HISTORY.md create mode 100644 node_modules/http-errors/LICENSE create mode 100644 node_modules/http-errors/README.md create mode 100644 node_modules/http-errors/index.js create mode 100644 node_modules/http-errors/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 100644 node_modules/http-signature/lib/index.js create mode 100644 node_modules/http-signature/lib/parser.js create mode 100644 node_modules/http-signature/lib/signer.js create mode 100644 node_modules/http-signature/lib/utils.js create mode 100644 node_modules/http-signature/lib/verify.js create mode 100644 node_modules/http-signature/package.json create mode 100644 node_modules/iconv-lite/Changelog.md create mode 100644 node_modules/iconv-lite/LICENSE create mode 100644 node_modules/iconv-lite/README.md create mode 100644 node_modules/iconv-lite/encodings/dbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/dbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/index.js create mode 100644 node_modules/iconv-lite/encodings/internal.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data-generated.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/tables/big5-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp936.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp949.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp950.json create mode 100644 node_modules/iconv-lite/encodings/tables/eucjp.json create mode 100644 node_modules/iconv-lite/encodings/tables/gb18030-ranges.json create mode 100644 node_modules/iconv-lite/encodings/tables/gbk-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/shiftjis.json create mode 100644 node_modules/iconv-lite/encodings/utf16.js create mode 100644 node_modules/iconv-lite/encodings/utf7.js create mode 100644 node_modules/iconv-lite/lib/bom-handling.js create mode 100644 node_modules/iconv-lite/lib/extend-node.js create mode 100644 node_modules/iconv-lite/lib/index.d.ts create mode 100644 node_modules/iconv-lite/lib/index.js create mode 100644 node_modules/iconv-lite/lib/streams.js create mode 100644 node_modules/iconv-lite/package.json create mode 100644 node_modules/ignore-by-default/LICENSE create mode 100644 node_modules/ignore-by-default/README.md create mode 100644 node_modules/ignore-by-default/index.js create mode 100644 node_modules/ignore-by-default/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/ipaddr.js/LICENSE create mode 100644 node_modules/ipaddr.js/README.md create mode 100644 node_modules/ipaddr.js/ipaddr.min.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js.d.ts create mode 100644 node_modules/ipaddr.js/package.json create mode 100644 node_modules/is-binary-path/index.d.ts 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-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-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-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-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/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/jake/Makefile create mode 100644 node_modules/jake/README.md create mode 100755 node_modules/jake/bin/bash_completion.sh create mode 100755 node_modules/jake/bin/cli.js create mode 100644 node_modules/jake/jakefile.js create mode 100644 node_modules/jake/lib/api.js create mode 100644 node_modules/jake/lib/jake.js create mode 100644 node_modules/jake/lib/loader.js create mode 100644 node_modules/jake/lib/namespace.js create mode 100644 node_modules/jake/lib/package_task.js create mode 100644 node_modules/jake/lib/parseargs.js create mode 100644 node_modules/jake/lib/program.js create mode 100644 node_modules/jake/lib/publish_task.js create mode 100644 node_modules/jake/lib/rule.js create mode 100644 node_modules/jake/lib/task/directory_task.js create mode 100644 node_modules/jake/lib/task/file_task.js create mode 100644 node_modules/jake/lib/task/index.js create mode 100644 node_modules/jake/lib/task/task.js create mode 100644 node_modules/jake/lib/test_task.js create mode 100644 node_modules/jake/lib/utils/file.js create mode 100644 node_modules/jake/lib/utils/index.js create mode 100644 node_modules/jake/lib/utils/logger.js create mode 100644 node_modules/jake/package.json create mode 100644 node_modules/jake/test/integration/concurrent.js create mode 100644 node_modules/jake/test/integration/file.js create mode 100644 node_modules/jake/test/integration/file_task.js create mode 100644 node_modules/jake/test/integration/helpers.js create mode 100644 node_modules/jake/test/integration/jakefile.js create mode 100644 node_modules/jake/test/integration/jakelib/concurrent.jake.js create mode 100644 node_modules/jake/test/integration/jakelib/publish.jake.js create mode 100644 node_modules/jake/test/integration/jakelib/required_module.jake.js create mode 100644 node_modules/jake/test/integration/jakelib/rule.jake.js create mode 100644 node_modules/jake/test/integration/publish_task.js create mode 100644 node_modules/jake/test/integration/rule.js create mode 100644 node_modules/jake/test/integration/selfdep.js create mode 100644 node_modules/jake/test/integration/task_base.js create mode 100644 node_modules/jake/test/unit/jakefile.js create mode 100644 node_modules/jake/test/unit/namespace.js create mode 100644 node_modules/jake/test/unit/parseargs.js create mode 100644 node_modules/jake/usage.txt 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/LICENSE create mode 100644 node_modules/json-schema/README.md create mode 100644 node_modules/json-schema/lib/links.js create mode 100644 node_modules/json-schema/lib/validate.js create mode 100644 node_modules/json-schema/package.json 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/lib/jsprim.js create mode 100644 node_modules/jsprim/package.json create mode 100644 node_modules/lodash.merge/LICENSE create mode 100644 node_modules/lodash.merge/README.md create mode 100644 node_modules/lodash.merge/index.js create mode 100644 node_modules/lodash.merge/package.json create mode 100644 node_modules/lower-case/LICENSE create mode 100644 node_modules/lower-case/README.md create mode 100644 node_modules/lower-case/lower-case.d.ts create mode 100644 node_modules/lower-case/lower-case.js create mode 100644 node_modules/lower-case/package.json create mode 100644 node_modules/media-typer/HISTORY.md create mode 100644 node_modules/media-typer/LICENSE create mode 100644 node_modules/media-typer/README.md create mode 100644 node_modules/media-typer/index.js create mode 100644 node_modules/media-typer/package.json create mode 100644 node_modules/merge-descriptors/HISTORY.md create mode 100644 node_modules/merge-descriptors/LICENSE create mode 100644 node_modules/merge-descriptors/README.md create mode 100644 node_modules/merge-descriptors/index.js create mode 100644 node_modules/merge-descriptors/package.json create mode 100644 node_modules/methods/HISTORY.md create mode 100644 node_modules/methods/LICENSE create mode 100644 node_modules/methods/README.md create mode 100644 node_modules/methods/index.js create mode 100644 node_modules/methods/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/mime/.npmignore create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/README.md create mode 100755 node_modules/mime/cli.js create mode 100644 node_modules/mime/mime.js create mode 100644 node_modules/mime/package.json create mode 100755 node_modules/mime/src/build.js create mode 100644 node_modules/mime/src/test.js create mode 100644 node_modules/mime/types.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/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/ncname/index.js create mode 100644 node_modules/ncname/package.json create mode 100644 node_modules/ncname/readme.md create mode 100644 node_modules/negotiator/HISTORY.md create mode 100644 node_modules/negotiator/LICENSE create mode 100644 node_modules/negotiator/README.md create mode 100644 node_modules/negotiator/index.js create mode 100644 node_modules/negotiator/lib/charset.js create mode 100644 node_modules/negotiator/lib/encoding.js create mode 100644 node_modules/negotiator/lib/language.js create mode 100644 node_modules/negotiator/lib/mediaType.js create mode 100644 node_modules/negotiator/package.json create mode 100644 node_modules/no-case/LICENSE create mode 100644 node_modules/no-case/README.md create mode 100644 node_modules/no-case/no-case.d.ts create mode 100644 node_modules/no-case/no-case.js create mode 100644 node_modules/no-case/package.json create mode 100644 node_modules/no-case/vendor/camel-case-regexp.js create mode 100644 node_modules/no-case/vendor/camel-case-upper-regexp.js create mode 100644 node_modules/no-case/vendor/non-word-regexp.js create mode 100644 node_modules/nodemon/LICENSE create mode 100644 node_modules/nodemon/README.md create mode 100755 node_modules/nodemon/bin/nodemon.js create mode 100644 node_modules/nodemon/bin/windows-kill.exe create mode 100644 node_modules/nodemon/doc/cli/authors.txt create mode 100644 node_modules/nodemon/doc/cli/config.txt create mode 100644 node_modules/nodemon/doc/cli/help.txt create mode 100644 node_modules/nodemon/doc/cli/logo.txt create mode 100644 node_modules/nodemon/doc/cli/options.txt create mode 100644 node_modules/nodemon/doc/cli/topics.txt create mode 100644 node_modules/nodemon/doc/cli/usage.txt create mode 100644 node_modules/nodemon/doc/cli/whoami.txt create mode 100644 node_modules/nodemon/lib/cli/index.js create mode 100644 node_modules/nodemon/lib/cli/parse.js create mode 100644 node_modules/nodemon/lib/config/command.js create mode 100644 node_modules/nodemon/lib/config/defaults.js create mode 100644 node_modules/nodemon/lib/config/exec.js create mode 100644 node_modules/nodemon/lib/config/index.js create mode 100644 node_modules/nodemon/lib/config/load.js create mode 100644 node_modules/nodemon/lib/help/index.js create mode 100644 node_modules/nodemon/lib/index.js create mode 100644 node_modules/nodemon/lib/monitor/index.js create mode 100644 node_modules/nodemon/lib/monitor/match.js create mode 100644 node_modules/nodemon/lib/monitor/run.js create mode 100644 node_modules/nodemon/lib/monitor/signals.js create mode 100644 node_modules/nodemon/lib/monitor/watch.js create mode 100644 node_modules/nodemon/lib/nodemon.js create mode 100644 node_modules/nodemon/lib/rules/add.js create mode 100644 node_modules/nodemon/lib/rules/index.js create mode 100644 node_modules/nodemon/lib/rules/parse.js create mode 100644 node_modules/nodemon/lib/spawn.js create mode 100644 node_modules/nodemon/lib/utils/bus.js create mode 100644 node_modules/nodemon/lib/utils/clone.js create mode 100644 node_modules/nodemon/lib/utils/colour.js create mode 100644 node_modules/nodemon/lib/utils/index.js create mode 100644 node_modules/nodemon/lib/utils/log.js create mode 100644 node_modules/nodemon/lib/utils/merge.js create mode 100644 node_modules/nodemon/lib/version.js create mode 100644 node_modules/nodemon/node_modules/debug/CHANGELOG.md create mode 100644 node_modules/nodemon/node_modules/debug/LICENSE create mode 100644 node_modules/nodemon/node_modules/debug/README.md create mode 100644 node_modules/nodemon/node_modules/debug/node.js create mode 100644 node_modules/nodemon/node_modules/debug/package.json create mode 100644 node_modules/nodemon/node_modules/debug/src/browser.js create mode 100644 node_modules/nodemon/node_modules/debug/src/common.js create mode 100644 node_modules/nodemon/node_modules/debug/src/index.js create mode 100644 node_modules/nodemon/node_modules/debug/src/node.js create mode 100644 node_modules/nodemon/node_modules/ms/index.js create mode 100644 node_modules/nodemon/node_modules/ms/license.md create mode 100644 node_modules/nodemon/node_modules/ms/package.json create mode 100644 node_modules/nodemon/node_modules/ms/readme.md create mode 100644 node_modules/nodemon/package.json create mode 100644 node_modules/nopt/.npmignore create mode 100644 node_modules/nopt/LICENSE create mode 100644 node_modules/nopt/README.md create mode 100755 node_modules/nopt/bin/nopt.js create mode 100755 node_modules/nopt/examples/my-program.js create mode 100644 node_modules/nopt/lib/nopt.js create mode 100644 node_modules/nopt/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/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-inspect/.eslintrc create mode 100644 node_modules/object-inspect/.github/FUNDING.yml create mode 100644 node_modules/object-inspect/.nycrc create mode 100644 node_modules/object-inspect/CHANGELOG.md create mode 100644 node_modules/object-inspect/LICENSE create mode 100644 node_modules/object-inspect/example/all.js create mode 100644 node_modules/object-inspect/example/circular.js create mode 100644 node_modules/object-inspect/example/fn.js create mode 100644 node_modules/object-inspect/example/inspect.js create mode 100644 node_modules/object-inspect/index.js create mode 100644 node_modules/object-inspect/package-support.json create mode 100644 node_modules/object-inspect/package.json create mode 100644 node_modules/object-inspect/readme.markdown create mode 100644 node_modules/object-inspect/test-core-js.js create mode 100644 node_modules/object-inspect/test/bigint.js create mode 100644 node_modules/object-inspect/test/browser/dom.js create mode 100644 node_modules/object-inspect/test/circular.js create mode 100644 node_modules/object-inspect/test/deep.js create mode 100644 node_modules/object-inspect/test/element.js create mode 100644 node_modules/object-inspect/test/err.js create mode 100644 node_modules/object-inspect/test/fakes.js create mode 100644 node_modules/object-inspect/test/fn.js create mode 100644 node_modules/object-inspect/test/has.js create mode 100644 node_modules/object-inspect/test/holes.js create mode 100644 node_modules/object-inspect/test/indent-option.js create mode 100644 node_modules/object-inspect/test/inspect.js create mode 100644 node_modules/object-inspect/test/lowbyte.js create mode 100644 node_modules/object-inspect/test/number.js create mode 100644 node_modules/object-inspect/test/quoteStyle.js create mode 100644 node_modules/object-inspect/test/toStringTag.js create mode 100644 node_modules/object-inspect/test/undef.js create mode 100644 node_modules/object-inspect/test/values.js create mode 100644 node_modules/object-inspect/util.inspect.js create mode 100644 node_modules/on-finished/HISTORY.md create mode 100644 node_modules/on-finished/LICENSE create mode 100644 node_modules/on-finished/README.md create mode 100644 node_modules/on-finished/index.js create mode 100644 node_modules/on-finished/package.json create mode 100644 node_modules/param-case/LICENSE create mode 100644 node_modules/param-case/README.md create mode 100644 node_modules/param-case/package.json create mode 100644 node_modules/param-case/param-case.d.ts create mode 100644 node_modules/param-case/param-case.js create mode 100644 node_modules/parseurl/HISTORY.md create mode 100644 node_modules/parseurl/LICENSE create mode 100644 node_modules/parseurl/README.md create mode 100644 node_modules/parseurl/index.js create mode 100644 node_modules/parseurl/package.json create mode 100644 node_modules/path-to-regexp/History.md create mode 100644 node_modules/path-to-regexp/LICENSE create mode 100644 node_modules/path-to-regexp/Readme.md create mode 100644 node_modules/path-to-regexp/index.js create mode 100644 node_modules/path-to-regexp/package.json 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/lib/performance-now.js create mode 100644 node_modules/performance-now/lib/performance-now.js.map 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/picomatch/CHANGELOG.md create mode 100644 node_modules/picomatch/LICENSE create mode 100644 node_modules/picomatch/README.md create mode 100644 node_modules/picomatch/index.js create mode 100644 node_modules/picomatch/lib/constants.js create mode 100644 node_modules/picomatch/lib/parse.js create mode 100644 node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/picomatch/lib/scan.js create mode 100644 node_modules/picomatch/lib/utils.js create mode 100644 node_modules/picomatch/package.json create mode 100644 node_modules/proxy-addr/HISTORY.md create mode 100644 node_modules/proxy-addr/LICENSE create mode 100644 node_modules/proxy-addr/README.md create mode 100644 node_modules/proxy-addr/index.js create mode 100644 node_modules/proxy-addr/package.json create mode 100644 node_modules/psl/.env 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/pstree.remy/.travis.yml create mode 100644 node_modules/pstree.remy/LICENSE create mode 100644 node_modules/pstree.remy/README.md create mode 100644 node_modules/pstree.remy/lib/index.js create mode 100644 node_modules/pstree.remy/lib/tree.js create mode 100644 node_modules/pstree.remy/lib/utils.js create mode 100644 node_modules/pstree.remy/package.json create mode 100644 node_modules/pstree.remy/tests/fixtures/index.js create mode 100644 node_modules/pstree.remy/tests/fixtures/out1 create mode 100644 node_modules/pstree.remy/tests/fixtures/out2 create mode 100644 node_modules/pstree.remy/tests/index.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/.eslintrc create mode 100644 node_modules/qs/.github/FUNDING.yml create mode 100644 node_modules/qs/.nycrc create mode 100644 node_modules/qs/CHANGELOG.md create mode 100644 node_modules/qs/LICENSE.md create mode 100644 node_modules/qs/README.md create mode 100644 node_modules/qs/dist/qs.js create mode 100644 node_modules/qs/lib/formats.js create mode 100644 node_modules/qs/lib/index.js create mode 100644 node_modules/qs/lib/parse.js create mode 100644 node_modules/qs/lib/stringify.js create mode 100644 node_modules/qs/lib/utils.js create mode 100644 node_modules/qs/package.json 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/range-parser/HISTORY.md create mode 100644 node_modules/range-parser/LICENSE create mode 100644 node_modules/range-parser/README.md create mode 100644 node_modules/range-parser/index.js create mode 100644 node_modules/range-parser/package.json create mode 100644 node_modules/raw-body/HISTORY.md create mode 100644 node_modules/raw-body/LICENSE create mode 100644 node_modules/raw-body/README.md create mode 100644 node_modules/raw-body/SECURITY.md create mode 100644 node_modules/raw-body/index.d.ts create mode 100644 node_modules/raw-body/index.js create mode 100644 node_modules/raw-body/package.json create mode 100644 node_modules/readdirp/LICENSE create mode 100644 node_modules/readdirp/README.md create mode 100644 node_modules/readdirp/index.d.ts create mode 100644 node_modules/readdirp/index.js create mode 100644 node_modules/readdirp/package.json create mode 100644 node_modules/relateurl/README.md create mode 100644 node_modules/relateurl/lib/constants.js create mode 100644 node_modules/relateurl/lib/format.js create mode 100644 node_modules/relateurl/lib/index.js create mode 100644 node_modules/relateurl/lib/options.js create mode 100644 node_modules/relateurl/lib/parse/host.js create mode 100644 node_modules/relateurl/lib/parse/hrefInfo.js create mode 100644 node_modules/relateurl/lib/parse/index.js create mode 100644 node_modules/relateurl/lib/parse/path.js create mode 100644 node_modules/relateurl/lib/parse/port.js create mode 100644 node_modules/relateurl/lib/parse/query.js create mode 100644 node_modules/relateurl/lib/parse/urlstring.js create mode 100644 node_modules/relateurl/lib/relate/absolutize.js create mode 100644 node_modules/relateurl/lib/relate/findRelation.js create mode 100644 node_modules/relateurl/lib/relate/index.js create mode 100644 node_modules/relateurl/lib/relate/relativize.js create mode 100644 node_modules/relateurl/lib/util/devlog.js create mode 100644 node_modules/relateurl/lib/util/object.js create mode 100644 node_modules/relateurl/lib/util/path.js create mode 100644 node_modules/relateurl/license create mode 100644 node_modules/relateurl/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 100644 node_modules/request/lib/auth.js create mode 100644 node_modules/request/lib/cookies.js create mode 100644 node_modules/request/lib/getProxyFromURI.js create mode 100644 node_modules/request/lib/har.js create mode 100644 node_modules/request/lib/hawk.js create mode 100644 node_modules/request/lib/helpers.js create mode 100644 node_modules/request/lib/multipart.js create mode 100644 node_modules/request/lib/oauth.js create mode 100644 node_modules/request/lib/querystring.js create mode 100644 node_modules/request/lib/redirect.js create mode 100644 node_modules/request/lib/tunnel.js create mode 100644 node_modules/request/node_modules/qs/.editorconfig create mode 100644 node_modules/request/node_modules/qs/.eslintrc create mode 100644 node_modules/request/node_modules/qs/.github/FUNDING.yml create mode 100644 node_modules/request/node_modules/qs/.nycrc create mode 100644 node_modules/request/node_modules/qs/CHANGELOG.md create mode 100644 node_modules/request/node_modules/qs/LICENSE.md create mode 100644 node_modules/request/node_modules/qs/README.md create mode 100644 node_modules/request/node_modules/qs/bower.json create mode 100644 node_modules/request/node_modules/qs/component.json create mode 100644 node_modules/request/node_modules/qs/dist/qs.js create mode 100644 node_modules/request/node_modules/qs/lib/formats.js create mode 100644 node_modules/request/node_modules/qs/lib/index.js create mode 100644 node_modules/request/node_modules/qs/lib/parse.js create mode 100644 node_modules/request/node_modules/qs/lib/stringify.js create mode 100644 node_modules/request/node_modules/qs/lib/utils.js create mode 100644 node_modules/request/node_modules/qs/package.json create mode 100644 node_modules/request/node_modules/qs/test/index.js create mode 100644 node_modules/request/node_modules/qs/test/parse.js create mode 100644 node_modules/request/node_modules/qs/test/stringify.js create mode 100644 node_modules/request/node_modules/qs/test/utils.js create mode 100644 node_modules/request/package.json create mode 100644 node_modules/request/request.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/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/semver/CHANGELOG.md create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/README.md create mode 100755 node_modules/semver/bin/semver 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/send/HISTORY.md create mode 100644 node_modules/send/LICENSE create mode 100644 node_modules/send/README.md create mode 100644 node_modules/send/SECURITY.md create mode 100644 node_modules/send/index.js create mode 100644 node_modules/send/node_modules/ms/index.js create mode 100644 node_modules/send/node_modules/ms/license.md create mode 100644 node_modules/send/node_modules/ms/package.json create mode 100644 node_modules/send/node_modules/ms/readme.md create mode 100644 node_modules/send/package.json create mode 100644 node_modules/serve-static/HISTORY.md create mode 100644 node_modules/serve-static/LICENSE create mode 100644 node_modules/serve-static/README.md create mode 100644 node_modules/serve-static/index.js create mode 100644 node_modules/serve-static/package.json create mode 100644 node_modules/setprototypeof/LICENSE create mode 100644 node_modules/setprototypeof/README.md create mode 100644 node_modules/setprototypeof/index.d.ts create mode 100644 node_modules/setprototypeof/index.js create mode 100644 node_modules/setprototypeof/package.json create mode 100644 node_modules/setprototypeof/test/index.js create mode 100644 node_modules/side-channel/.eslintignore create mode 100644 node_modules/side-channel/.eslintrc create mode 100644 node_modules/side-channel/.github/FUNDING.yml create mode 100644 node_modules/side-channel/.nycrc create mode 100644 node_modules/side-channel/CHANGELOG.md create mode 100644 node_modules/side-channel/LICENSE create mode 100644 node_modules/side-channel/README.md create mode 100644 node_modules/side-channel/index.js create mode 100644 node_modules/side-channel/package.json create mode 100644 node_modules/side-channel/test/index.js create mode 100644 node_modules/simple-update-notifier/LICENSE create mode 100644 node_modules/simple-update-notifier/README.md create mode 100644 node_modules/simple-update-notifier/build/index.d.ts create mode 100644 node_modules/simple-update-notifier/build/index.js create mode 120000 node_modules/simple-update-notifier/node_modules/.bin/semver create mode 100644 node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md create mode 100644 node_modules/simple-update-notifier/node_modules/semver/LICENSE create mode 100644 node_modules/simple-update-notifier/node_modules/semver/README.md create mode 100755 node_modules/simple-update-notifier/node_modules/semver/bin/semver.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/index.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/range.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/semver.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/clean.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/diff.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/eq.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/gt.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/gte.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/inc.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/lt.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/lte.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/major.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/minor.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/neq.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/parse.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/patch.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/sort.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/valid.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/index.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/constants.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/debug.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/re.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/package.json create mode 100644 node_modules/simple-update-notifier/node_modules/semver/range.bnf create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js create mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js create mode 100644 node_modules/simple-update-notifier/package.json create mode 100644 node_modules/simple-update-notifier/src/borderedText.ts create mode 100644 node_modules/simple-update-notifier/src/cache.spec.ts create mode 100644 node_modules/simple-update-notifier/src/cache.ts create mode 100644 node_modules/simple-update-notifier/src/getDistVersion.spec.ts create mode 100644 node_modules/simple-update-notifier/src/getDistVersion.ts create mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.spec.ts create mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.ts create mode 100644 node_modules/simple-update-notifier/src/index.spec.ts create mode 100644 node_modules/simple-update-notifier/src/index.ts create mode 100644 node_modules/simple-update-notifier/src/isNpmOrYarn.ts create mode 100644 node_modules/simple-update-notifier/src/types.ts 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/lib/array-set.js create mode 100644 node_modules/source-map/lib/base64-vlq.js create mode 100644 node_modules/source-map/lib/base64.js create mode 100644 node_modules/source-map/lib/binary-search.js create mode 100644 node_modules/source-map/lib/mapping-list.js create mode 100644 node_modules/source-map/lib/quick-sort.js create mode 100644 node_modules/source-map/lib/source-map-consumer.js create mode 100644 node_modules/source-map/lib/source-map-generator.js create mode 100644 node_modules/source-map/lib/source-node.js create mode 100644 node_modules/source-map/lib/util.js create mode 100644 node_modules/source-map/package.json create mode 100644 node_modules/source-map/source-map.js create mode 100644 node_modules/sshpk/.travis.yml create mode 100644 node_modules/sshpk/Jenkinsfile create mode 100644 node_modules/sshpk/LICENSE create mode 100644 node_modules/sshpk/README.md create mode 100755 node_modules/sshpk/bin/sshpk-conv create mode 100755 node_modules/sshpk/bin/sshpk-sign create mode 100755 node_modules/sshpk/bin/sshpk-verify create mode 100644 node_modules/sshpk/lib/algs.js create mode 100644 node_modules/sshpk/lib/certificate.js create mode 100644 node_modules/sshpk/lib/dhe.js create mode 100644 node_modules/sshpk/lib/ed-compat.js create mode 100644 node_modules/sshpk/lib/errors.js create mode 100644 node_modules/sshpk/lib/fingerprint.js create mode 100644 node_modules/sshpk/lib/formats/auto.js create mode 100644 node_modules/sshpk/lib/formats/dnssec.js create mode 100644 node_modules/sshpk/lib/formats/openssh-cert.js create mode 100644 node_modules/sshpk/lib/formats/pem.js create mode 100644 node_modules/sshpk/lib/formats/pkcs1.js create mode 100644 node_modules/sshpk/lib/formats/pkcs8.js create mode 100644 node_modules/sshpk/lib/formats/putty.js create mode 100644 node_modules/sshpk/lib/formats/rfc4253.js create mode 100644 node_modules/sshpk/lib/formats/ssh-private.js create mode 100644 node_modules/sshpk/lib/formats/ssh.js create mode 100644 node_modules/sshpk/lib/formats/x509-pem.js create mode 100644 node_modules/sshpk/lib/formats/x509.js create mode 100644 node_modules/sshpk/lib/identity.js create mode 100644 node_modules/sshpk/lib/index.js create mode 100644 node_modules/sshpk/lib/key.js create mode 100644 node_modules/sshpk/lib/private-key.js create mode 100644 node_modules/sshpk/lib/signature.js create mode 100644 node_modules/sshpk/lib/ssh-buffer.js create mode 100644 node_modules/sshpk/lib/utils.js 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/statuses/HISTORY.md create mode 100644 node_modules/statuses/LICENSE create mode 100644 node_modules/statuses/README.md create mode 100644 node_modules/statuses/codes.json create mode 100644 node_modules/statuses/index.js create mode 100644 node_modules/statuses/package.json 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/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/toidentifier/HISTORY.md create mode 100644 node_modules/toidentifier/LICENSE create mode 100644 node_modules/toidentifier/README.md create mode 100644 node_modules/toidentifier/index.js create mode 100644 node_modules/toidentifier/package.json create mode 100644 node_modules/touch/LICENSE create mode 100644 node_modules/touch/README.md create mode 100755 node_modules/touch/bin/nodetouch.js create mode 100644 node_modules/touch/index.js create mode 100644 node_modules/touch/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/lib/cookie.js create mode 100644 node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/tough-cookie/lib/pathMatch.js create mode 100644 node_modules/tough-cookie/lib/permuteDomain.js create mode 100644 node_modules/tough-cookie/lib/pubsuffix-psl.js create mode 100644 node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/tough-cookie/lib/version.js create mode 100644 node_modules/tough-cookie/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-is/HISTORY.md create mode 100644 node_modules/type-is/LICENSE create mode 100644 node_modules/type-is/README.md create mode 100644 node_modules/type-is/index.js create mode 100644 node_modules/type-is/package.json create mode 100644 node_modules/uglify-js/LICENSE create mode 100644 node_modules/uglify-js/README.md create mode 100755 node_modules/uglify-js/bin/uglifyjs create mode 100644 node_modules/uglify-js/lib/ast.js create mode 100644 node_modules/uglify-js/lib/compress.js create mode 100644 node_modules/uglify-js/lib/minify.js create mode 100644 node_modules/uglify-js/lib/mozilla-ast.js create mode 100644 node_modules/uglify-js/lib/output.js create mode 100644 node_modules/uglify-js/lib/parse.js create mode 100644 node_modules/uglify-js/lib/propmangle.js create mode 100644 node_modules/uglify-js/lib/scope.js create mode 100644 node_modules/uglify-js/lib/sourcemap.js create mode 100644 node_modules/uglify-js/lib/transform.js create mode 100644 node_modules/uglify-js/lib/utils.js create mode 100644 node_modules/uglify-js/node_modules/source-map/CHANGELOG.md create mode 100644 node_modules/uglify-js/node_modules/source-map/LICENSE create mode 100644 node_modules/uglify-js/node_modules/source-map/README.md create mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.debug.js create mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.js create mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js create mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js.map create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/array-set.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/base64.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/binary-search.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-node.js create mode 100644 node_modules/uglify-js/node_modules/source-map/lib/util.js create mode 100644 node_modules/uglify-js/node_modules/source-map/package.json create mode 100644 node_modules/uglify-js/node_modules/source-map/source-map.d.ts create mode 100644 node_modules/uglify-js/node_modules/source-map/source-map.js create mode 100644 node_modules/uglify-js/package.json create mode 100644 node_modules/uglify-js/tools/domprops.json create mode 100644 node_modules/uglify-js/tools/exports.js create mode 100644 node_modules/uglify-js/tools/node.js create mode 100644 node_modules/uglify-js/tools/props.html create mode 100644 node_modules/undefsafe/.github/workflows/release.yml create mode 100644 node_modules/undefsafe/.jscsrc create mode 100644 node_modules/undefsafe/.jshintrc create mode 100644 node_modules/undefsafe/.travis.yml create mode 100644 node_modules/undefsafe/LICENSE create mode 100644 node_modules/undefsafe/README.md create mode 100644 node_modules/undefsafe/example.js create mode 100644 node_modules/undefsafe/lib/undefsafe.js create mode 100644 node_modules/undefsafe/package.json create mode 100644 node_modules/unpipe/HISTORY.md create mode 100644 node_modules/unpipe/LICENSE create mode 100644 node_modules/unpipe/README.md create mode 100644 node_modules/unpipe/index.js create mode 100644 node_modules/unpipe/package.json create mode 100644 node_modules/upper-case/LICENSE create mode 100644 node_modules/upper-case/README.md create mode 100644 node_modules/upper-case/package.json create mode 100644 node_modules/upper-case/upper-case.d.ts create mode 100644 node_modules/upper-case/upper-case.js 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/utils-merge/.npmignore create mode 100644 node_modules/utils-merge/LICENSE create mode 100644 node_modules/utils-merge/README.md create mode 100644 node_modules/utils-merge/index.js create mode 100644 node_modules/utils-merge/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 100755 node_modules/uuid/bin/uuid create mode 100644 node_modules/uuid/index.js create mode 100644 node_modules/uuid/lib/bytesToUuid.js create mode 100644 node_modules/uuid/lib/md5-browser.js create mode 100644 node_modules/uuid/lib/md5.js create mode 100644 node_modules/uuid/lib/rng-browser.js create mode 100644 node_modules/uuid/lib/rng.js create mode 100644 node_modules/uuid/lib/sha1-browser.js create mode 100644 node_modules/uuid/lib/sha1.js create mode 100644 node_modules/uuid/lib/v35.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/vary/HISTORY.md create mode 100644 node_modules/vary/LICENSE create mode 100644 node_modules/vary/README.md create mode 100644 node_modules/vary/index.js create mode 100644 node_modules/vary/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/lib/verror.js create mode 100644 node_modules/verror/package.json create mode 100644 node_modules/xml-char-classes/index.js create mode 100644 node_modules/xml-char-classes/package.json create mode 100644 node_modules/xml-char-classes/readme.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/styles/styles.css create mode 100644 views/index.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/app.js b/app.js new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/.bin/ejs b/node_modules/.bin/ejs new file mode 120000 index 00000000..88e80d01 --- /dev/null +++ b/node_modules/.bin/ejs @@ -0,0 +1 @@ +../ejs/bin/cli.js \ No newline at end of file diff --git a/node_modules/.bin/he b/node_modules/.bin/he new file mode 120000 index 00000000..2a8eb5e0 --- /dev/null +++ b/node_modules/.bin/he @@ -0,0 +1 @@ +../he/bin/he \ No newline at end of file diff --git a/node_modules/.bin/html-minifier b/node_modules/.bin/html-minifier new file mode 120000 index 00000000..fdff5987 --- /dev/null +++ b/node_modules/.bin/html-minifier @@ -0,0 +1 @@ +../html-minifier/cli.js \ No newline at end of file diff --git a/node_modules/.bin/jake b/node_modules/.bin/jake new file mode 120000 index 00000000..36267456 --- /dev/null +++ b/node_modules/.bin/jake @@ -0,0 +1 @@ +../jake/bin/cli.js \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 120000 index 00000000..fbb7ee0e --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon new file mode 120000 index 00000000..1056ddc1 --- /dev/null +++ b/node_modules/.bin/nodemon @@ -0,0 +1 @@ +../nodemon/bin/nodemon.js \ No newline at end of file diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch new file mode 120000 index 00000000..3409fdb7 --- /dev/null +++ b/node_modules/.bin/nodetouch @@ -0,0 +1 @@ +../touch/bin/nodetouch.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt new file mode 120000 index 00000000..6b6566ea --- /dev/null +++ b/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver new file mode 120000 index 00000000..317eb293 --- /dev/null +++ b/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver \ No newline at end of file diff --git a/node_modules/.bin/sshpk-conv b/node_modules/.bin/sshpk-conv new file mode 120000 index 00000000..a2a295c8 --- /dev/null +++ b/node_modules/.bin/sshpk-conv @@ -0,0 +1 @@ +../sshpk/bin/sshpk-conv \ No newline at end of file diff --git a/node_modules/.bin/sshpk-sign b/node_modules/.bin/sshpk-sign new file mode 120000 index 00000000..766b9b3a --- /dev/null +++ b/node_modules/.bin/sshpk-sign @@ -0,0 +1 @@ +../sshpk/bin/sshpk-sign \ No newline at end of file diff --git a/node_modules/.bin/sshpk-verify b/node_modules/.bin/sshpk-verify new file mode 120000 index 00000000..bfd7e3ad --- /dev/null +++ b/node_modules/.bin/sshpk-verify @@ -0,0 +1 @@ +../sshpk/bin/sshpk-verify \ No newline at end of file diff --git a/node_modules/.bin/uglifyjs b/node_modules/.bin/uglifyjs new file mode 120000 index 00000000..fef3468b --- /dev/null +++ b/node_modules/.bin/uglifyjs @@ -0,0 +1 @@ +../uglify-js/bin/uglifyjs \ No newline at end of file diff --git a/node_modules/.bin/uuid b/node_modules/.bin/uuid new file mode 120000 index 00000000..b3e45bc5 --- /dev/null +++ b/node_modules/.bin/uuid @@ -0,0 +1 @@ +../uuid/bin/uuid \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 00000000..09de45d5 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,1608 @@ +{ + "name": "dicho-hackaton", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "dependencies": { + "source-map": "0.5.x" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-minify-html": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", + "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", + "dependencies": { + "html-minifier": "3.5.7", + "lodash.merge": "4.6.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", + "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.12.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.2.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", + "dependencies": { + "xml-char-classes": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", + "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", + "engines": { + "node": ">=0.10.0" + } + } + } +} 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/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md new file mode 100644 index 00000000..cb5990c7 --- /dev/null +++ b/node_modules/accepts/HISTORY.md @@ -0,0 +1,243 @@ +1.3.8 / 2022-02-02 +================== + + * deps: mime-types@~2.1.34 + - deps: mime-db@~1.51.0 + * deps: negotiator@0.6.3 + +1.3.7 / 2019-04-29 +================== + + * deps: negotiator@0.6.2 + - Fix sorting charset, encoding, and language with extra parameters + +1.3.6 / 2019-04-28 +================== + + * deps: mime-types@~2.1.24 + - deps: mime-db@~1.40.0 + +1.3.5 / 2018-02-28 +================== + + * deps: mime-types@~2.1.18 + - deps: mime-db@~1.33.0 + +1.3.4 / 2017-08-22 +================== + + * deps: mime-types@~2.1.16 + - deps: mime-db@~1.29.0 + +1.3.3 / 2016-05-02 +================== + + * deps: mime-types@~2.1.11 + - deps: mime-db@~1.23.0 + * deps: negotiator@0.6.1 + - perf: improve `Accept` parsing speed + - perf: improve `Accept-Charset` parsing speed + - perf: improve `Accept-Encoding` parsing speed + - perf: improve `Accept-Language` parsing speed + +1.3.2 / 2016-03-08 +================== + + * deps: mime-types@~2.1.10 + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + - deps: mime-db@~1.22.0 + +1.3.1 / 2016-01-19 +================== + + * deps: mime-types@~2.1.9 + - deps: mime-db@~1.21.0 + +1.3.0 / 2015-09-29 +================== + + * deps: mime-types@~2.1.7 + - deps: mime-db@~1.19.0 + * deps: negotiator@0.6.0 + - Fix including type extensions in parameters in `Accept` parsing + - Fix parsing `Accept` parameters with quoted equals + - Fix parsing `Accept` parameters with quoted semicolons + - Lazy-load modules from main entry point + - perf: delay type concatenation until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove closures getting spec properties + - perf: remove a closure from media type parsing + - perf: remove property delete from media type parsing + +1.2.13 / 2015-09-06 +=================== + + * deps: mime-types@~2.1.6 + - deps: mime-db@~1.18.0 + +1.2.12 / 2015-07-30 +=================== + + * deps: mime-types@~2.1.4 + - deps: mime-db@~1.16.0 + +1.2.11 / 2015-07-16 +=================== + + * deps: mime-types@~2.1.3 + - deps: mime-db@~1.15.0 + +1.2.10 / 2015-07-01 +=================== + + * deps: mime-types@~2.1.2 + - deps: mime-db@~1.14.0 + +1.2.9 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - perf: fix deopt during mapping + +1.2.8 / 2015-06-07 +================== + + * deps: mime-types@~2.1.0 + - deps: mime-db@~1.13.0 + * perf: avoid argument reassignment & argument slice + * perf: avoid negotiator recursive construction + * perf: enable strict mode + * perf: remove unnecessary bitwise operator + +1.2.7 / 2015-05-10 +================== + + * deps: negotiator@0.5.3 + - Fix media type parameter matching to be case-insensitive + +1.2.6 / 2015-05-07 +================== + + * deps: mime-types@~2.0.11 + - deps: mime-db@~1.9.1 + * deps: negotiator@0.5.2 + - Fix comparing media types with quoted values + - Fix splitting media types with quoted commas + +1.2.5 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - deps: mime-db@~1.8.0 + +1.2.4 / 2015-02-14 +================== + + * Support Node.js 0.6 + * deps: mime-types@~2.0.9 + - deps: mime-db@~1.7.0 + * deps: negotiator@0.5.1 + - Fix preference sorting to be stable for long acceptable lists + +1.2.3 / 2015-01-31 +================== + + * deps: mime-types@~2.0.8 + - deps: mime-db@~1.6.0 + +1.2.2 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - deps: mime-db@~1.5.0 + +1.2.1 / 2014-12-30 +================== + + * deps: mime-types@~2.0.5 + - deps: mime-db@~1.3.1 + +1.2.0 / 2014-12-19 +================== + + * deps: negotiator@0.5.0 + - Fix list return order when large accepted list + - Fix missing identity encoding when q=0 exists + - Remove dynamic building of Negotiator class + +1.1.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - deps: mime-db@~1.3.0 + +1.1.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - deps: mime-db@~1.2.0 + +1.1.2 / 2014-10-14 +================== + + * deps: negotiator@0.4.9 + - Fix error when media type has invalid parameter + +1.1.1 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - deps: mime-db@~1.1.0 + * deps: negotiator@0.4.8 + - Fix all negotiations to be case-insensitive + - Stable sort preferences of same quality according to client order + +1.1.0 / 2014-09-02 +================== + + * update `mime-types` + +1.0.7 / 2014-07-04 +================== + + * Fix wrong type returned from `type` when match after unknown extension + +1.0.6 / 2014-06-24 +================== + + * deps: negotiator@0.4.7 + +1.0.5 / 2014-06-20 +================== + + * fix crash when unknown extension given + +1.0.4 / 2014-06-19 +================== + + * use `mime-types` + +1.0.3 / 2014-06-11 +================== + + * deps: negotiator@0.4.6 + - Order by specificity when quality is the same + +1.0.2 / 2014-05-29 +================== + + * Fix interpretation when header not in request + * deps: pin negotiator@0.4.5 + +1.0.1 / 2014-01-18 +================== + + * Identity encoding isn't always acceptable + * deps: negotiator@~0.4.0 + +1.0.0 / 2013-12-27 +================== + + * Genesis diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE new file mode 100644 index 00000000..06166077 --- /dev/null +++ b/node_modules/accepts/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/accepts/README.md b/node_modules/accepts/README.md new file mode 100644 index 00000000..82680c53 --- /dev/null +++ b/node_modules/accepts/README.md @@ -0,0 +1,140 @@ +# accepts + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). +Extracted from [koa](https://www.npmjs.com/package/koa) for general use. + +In addition to negotiator, it allows: + +- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` + as well as `('text/html', 'application/json')`. +- Allows type shorthands such as `json`. +- Returns `false` when no types match +- Treats non-existent headers as `*` + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install accepts +``` + +## API + +```js +var accepts = require('accepts') +``` + +### accepts(req) + +Create a new `Accepts` object for the given `req`. + +#### .charset(charsets) + +Return the first accepted charset. If nothing in `charsets` is accepted, +then `false` is returned. + +#### .charsets() + +Return the charsets that the request accepts, in the order of the client's +preference (most preferred first). + +#### .encoding(encodings) + +Return the first accepted encoding. If nothing in `encodings` is accepted, +then `false` is returned. + +#### .encodings() + +Return the encodings that the request accepts, in the order of the client's +preference (most preferred first). + +#### .language(languages) + +Return the first accepted language. If nothing in `languages` is accepted, +then `false` is returned. + +#### .languages() + +Return the languages that the request accepts, in the order of the client's +preference (most preferred first). + +#### .type(types) + +Return the first accepted type (and it is returned as the same text as what +appears in the `types` array). If nothing in `types` is accepted, then `false` +is returned. + +The `types` array can contain full MIME types or file extensions. Any value +that is not a full MIME types is passed to `require('mime-types').lookup`. + +#### .types() + +Return the types that the request accepts, in the order of the client's +preference (most preferred first). + +## Examples + +### Simple type negotiation + +This simple example shows how to use `accepts` to return a different typed +respond body based on what the client wants to accept. The server lists it's +preferences in order and will get back the best match between the client and +server. + +```js +var accepts = require('accepts') +var http = require('http') + +function app (req, res) { + var accept = accepts(req) + + // the order of this list is significant; should be server preferred order + switch (accept.type(['json', 'html'])) { + case 'json': + res.setHeader('Content-Type', 'application/json') + res.write('{"hello":"world!"}') + break + case 'html': + res.setHeader('Content-Type', 'text/html') + res.write('hello, world!') + break + default: + // the fallback is text/plain, so no need to specify it above + res.setHeader('Content-Type', 'text/plain') + res.write('hello, world!') + break + } + + res.end() +} + +http.createServer(app).listen(3000) +``` + +You can test this out with the cURL program: +```sh +curl -I -H'Accept: text/html' http://localhost:3000/ +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master +[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml +[node-version-image]: https://badgen.net/npm/node/accepts +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/accepts +[npm-url]: https://npmjs.org/package/accepts +[npm-version-image]: https://badgen.net/npm/v/accepts diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js new file mode 100644 index 00000000..e9b2f63f --- /dev/null +++ b/node_modules/accepts/index.js @@ -0,0 +1,238 @@ +/*! + * accepts + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var Negotiator = require('negotiator') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = Accepts + +/** + * Create a new Accepts object for the given req. + * + * @param {object} req + * @public + */ + +function Accepts (req) { + if (!(this instanceof Accepts)) { + return new Accepts(req) + } + + this.headers = req.headers + this.negotiator = new Negotiator(req) +} + +/** + * Check if the given `type(s)` is acceptable, returning + * the best match when true, otherwise `undefined`, in which + * case you should respond with 406 "Not Acceptable". + * + * The `type` value may be a single mime type string + * such as "application/json", the extension name + * such as "json" or an array `["json", "html", "text/plain"]`. When a list + * or array is given the _best_ match, if any is returned. + * + * Examples: + * + * // Accept: text/html + * this.types('html'); + * // => "html" + * + * // Accept: text/*, application/json + * this.types('html'); + * // => "html" + * this.types('text/html'); + * // => "text/html" + * this.types('json', 'text'); + * // => "json" + * this.types('application/json'); + * // => "application/json" + * + * // Accept: text/*, application/json + * this.types('image/png'); + * this.types('png'); + * // => undefined + * + * // Accept: text/*;q=.5, application/json + * this.types(['html', 'json']); + * this.types('html', 'json'); + * // => "json" + * + * @param {String|Array} types... + * @return {String|Array|Boolean} + * @public + */ + +Accepts.prototype.type = +Accepts.prototype.types = function (types_) { + var types = types_ + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i] + } + } + + // no types, return all requested types + if (!types || types.length === 0) { + return this.negotiator.mediaTypes() + } + + // no accept header, return first given type + if (!this.headers.accept) { + return types[0] + } + + var mimes = types.map(extToMime) + var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) + var first = accepts[0] + + return first + ? types[mimes.indexOf(first)] + : false +} + +/** + * Return accepted encodings or best fit based on `encodings`. + * + * Given `Accept-Encoding: gzip, deflate` + * an array sorted by quality is returned: + * + * ['gzip', 'deflate'] + * + * @param {String|Array} encodings... + * @return {String|Array} + * @public + */ + +Accepts.prototype.encoding = +Accepts.prototype.encodings = function (encodings_) { + var encodings = encodings_ + + // support flattened arguments + if (encodings && !Array.isArray(encodings)) { + encodings = new Array(arguments.length) + for (var i = 0; i < encodings.length; i++) { + encodings[i] = arguments[i] + } + } + + // no encodings, return all requested encodings + if (!encodings || encodings.length === 0) { + return this.negotiator.encodings() + } + + return this.negotiator.encodings(encodings)[0] || false +} + +/** + * Return accepted charsets or best fit based on `charsets`. + * + * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` + * an array sorted by quality is returned: + * + * ['utf-8', 'utf-7', 'iso-8859-1'] + * + * @param {String|Array} charsets... + * @return {String|Array} + * @public + */ + +Accepts.prototype.charset = +Accepts.prototype.charsets = function (charsets_) { + var charsets = charsets_ + + // support flattened arguments + if (charsets && !Array.isArray(charsets)) { + charsets = new Array(arguments.length) + for (var i = 0; i < charsets.length; i++) { + charsets[i] = arguments[i] + } + } + + // no charsets, return all requested charsets + if (!charsets || charsets.length === 0) { + return this.negotiator.charsets() + } + + return this.negotiator.charsets(charsets)[0] || false +} + +/** + * Return accepted languages or best fit based on `langs`. + * + * Given `Accept-Language: en;q=0.8, es, pt` + * an array sorted by quality is returned: + * + * ['es', 'pt', 'en'] + * + * @param {String|Array} langs... + * @return {Array|String} + * @public + */ + +Accepts.prototype.lang = +Accepts.prototype.langs = +Accepts.prototype.language = +Accepts.prototype.languages = function (languages_) { + var languages = languages_ + + // support flattened arguments + if (languages && !Array.isArray(languages)) { + languages = new Array(arguments.length) + for (var i = 0; i < languages.length; i++) { + languages[i] = arguments[i] + } + } + + // no languages, return all requested languages + if (!languages || languages.length === 0) { + return this.negotiator.languages() + } + + return this.negotiator.languages(languages)[0] || false +} + +/** + * Convert extnames to mime. + * + * @param {String} type + * @return {String} + * @private + */ + +function extToMime (type) { + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if mime is valid. + * + * @param {String} type + * @return {String} + * @private + */ + +function validMime (type) { + return typeof type === 'string' +} diff --git a/node_modules/accepts/package.json b/node_modules/accepts/package.json new file mode 100644 index 00000000..0f2d15da --- /dev/null +++ b/node_modules/accepts/package.json @@ -0,0 +1,47 @@ +{ + "name": "accepts", + "description": "Higher-level content negotiation", + "version": "1.3.8", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "jshttp/accepts", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "keywords": [ + "content", + "negotiation", + "accept", + "accepts" + ] +} diff --git a/node_modules/ajv/.tonic_example.js b/node_modules/ajv/.tonic_example.js new file mode 100644 index 00000000..aa11812d --- /dev/null +++ b/node_modules/ajv/.tonic_example.js @@ -0,0 +1,20 @@ +var Ajv = require('ajv'); +var ajv = new Ajv({allErrors: true}); + +var schema = { + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "number", "maximum": 3 } + } +}; + +var validate = ajv.compile(schema); + +test({"foo": "abc", "bar": 2}); +test({"foo": 2, "bar": 4}); + +function test(data) { + var valid = validate(data); + if (valid) console.log('Valid!'); + else console.log('Invalid: ' + ajv.errorsText(validate.errors)); +} \ No newline at end of file diff --git a/node_modules/ajv/LICENSE b/node_modules/ajv/LICENSE new file mode 100644 index 00000000..96ee7199 --- /dev/null +++ b/node_modules/ajv/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017 Evgeny Poberezkin + +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/ajv/README.md b/node_modules/ajv/README.md new file mode 100644 index 00000000..5aa2078d --- /dev/null +++ b/node_modules/ajv/README.md @@ -0,0 +1,1497 @@ +Ajv logo + +# Ajv: Another JSON Schema Validator + +The fastest JSON Schema validator for Node.js and browser. Supports draft-04/06/07. + +[![Build Status](https://travis-ci.org/ajv-validator/ajv.svg?branch=master)](https://travis-ci.org/ajv-validator/ajv) +[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv) +[![npm (beta)](https://img.shields.io/npm/v/ajv/beta)](https://www.npmjs.com/package/ajv/v/7.0.0-beta.0) +[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv) +[![Coverage Status](https://coveralls.io/repos/github/ajv-validator/ajv/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv?branch=master) +[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv) +[![GitHub Sponsors](https://img.shields.io/badge/$-sponsors-brightgreen)](https://github.com/sponsors/epoberezkin) + + +## Ajv v7 beta is released + +[Ajv version 7.0.0-beta.0](https://github.com/ajv-validator/ajv/tree/v7-beta) is released with these changes: + +- to reduce the mistakes in JSON schemas and unexpected validation results, [strict mode](./docs/strict-mode.md) is added - it prohibits ignored or ambiguous JSON Schema elements. +- to make code injection from untrusted schemas impossible, [code generation](./docs/codegen.md) is fully re-written to be safe. +- to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas. +- schemas are compiled to ES6 code (ES5 code generation is supported with an option). +- to improve reliability and maintainability the code is migrated to TypeScript. + +**Please note**: + +- the support for JSON-Schema draft-04 is removed - if you have schemas using "id" attributes you have to replace them with "\$id" (or continue using version 6 that will be supported until 02/28/2021). +- all formats are separated to ajv-formats package - they have to be explicitely added if you use them. + +See [release notes](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) for the details. + +To install the new version: + +```bash +npm install ajv@beta +``` + +See [Getting started with v7](https://github.com/ajv-validator/ajv/tree/v7-beta#usage) for code example. + + +## Mozilla MOSS grant and OpenJS Foundation + +[](https://www.mozilla.org/en-US/moss/)     [](https://openjsf.org/blog/2020/08/14/ajv-joins-openjs-foundation-as-an-incubation-project/) + +Ajv has been awarded a grant from Mozilla’s [Open Source Support (MOSS) program](https://www.mozilla.org/en-US/moss/) in the “Foundational Technology” track! It will sponsor the development of Ajv support of [JSON Schema version 2019-09](https://tools.ietf.org/html/draft-handrews-json-schema-02) and of [JSON Type Definition](https://tools.ietf.org/html/draft-ucarion-json-type-definition-04). + +Ajv also joined [OpenJS Foundation](https://openjsf.org/) – having this support will help ensure the longevity and stability of Ajv for all its users. + +This [blog post](https://www.poberezkin.com/posts/2020-08-14-ajv-json-validator-mozilla-open-source-grant-openjs-foundation.html) has more details. + +I am looking for the long term maintainers of Ajv – working with [ReadySet](https://www.thereadyset.co/), also sponsored by Mozilla, to establish clear guidelines for the role of a "maintainer" and the contribution standards, and to encourage a wider, more inclusive, contribution from the community. + + +## Please [sponsor Ajv development](https://github.com/sponsors/epoberezkin) + +Since I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant! + +Your continuing support is very important - the funds will be used to develop and maintain Ajv once the next major version is released. + +Please sponsor Ajv via: +- [GitHub sponsors page](https://github.com/sponsors/epoberezkin) (GitHub will match it) +- [Ajv Open Collective️](https://opencollective.com/ajv) + +Thank you. + + +#### Open Collective sponsors + + + + + + + + + + + + + + + +## Using version 6 + +[JSON Schema draft-07](http://json-schema.org/latest/json-schema-validation.html) is published. + +[Ajv version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0) that supports draft-07 is released. It may require either migrating your schemas or updating your code (to continue using draft-04 and v5 schemas, draft-06 schemas will be supported without changes). + +__Please note__: To use Ajv with draft-06 schemas you need to explicitly add the meta-schema to the validator instance: + +```javascript +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); +``` + +To use Ajv with draft-04 schemas in addition to explicitly adding meta-schema you also need to use option schemaId: + +```javascript +var ajv = new Ajv({schemaId: 'id'}); +// If you want to use both draft-04 and draft-06/07 schemas: +// var ajv = new Ajv({schemaId: 'auto'}); +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')); +``` + + +## Contents + +- [Performance](#performance) +- [Features](#features) +- [Getting started](#getting-started) +- [Frequently Asked Questions](https://github.com/ajv-validator/ajv/blob/master/FAQ.md) +- [Using in browser](#using-in-browser) + - [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) +- [Command line interface](#command-line-interface) +- Validation + - [Keywords](#validation-keywords) + - [Annotation keywords](#annotation-keywords) + - [Formats](#formats) + - [Combining schemas with $ref](#ref) + - [$data reference](#data-reference) + - NEW: [$merge and $patch keywords](#merge-and-patch-keywords) + - [Defining custom keywords](#defining-custom-keywords) + - [Asynchronous schema compilation](#asynchronous-schema-compilation) + - [Asynchronous validation](#asynchronous-validation) +- [Security considerations](#security-considerations) + - [Security contact](#security-contact) + - [Untrusted schemas](#untrusted-schemas) + - [Circular references in objects](#circular-references-in-javascript-objects) + - [Trusted schemas](#security-risks-of-trusted-schemas) + - [ReDoS attack](#redos-attack) +- Modifying data during validation + - [Filtering data](#filtering-data) + - [Assigning defaults](#assigning-defaults) + - [Coercing data types](#coercing-data-types) +- API + - [Methods](#api) + - [Options](#options) + - [Validation errors](#validation-errors) +- [Plugins](#plugins) +- [Related packages](#related-packages) +- [Some packages using Ajv](#some-packages-using-ajv) +- [Tests, Contributing, Changes history](#tests) +- [Support, Code of conduct, License](#open-source-software-support) + + +## Performance + +Ajv generates code using [doT templates](https://github.com/olado/doT) to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization. + +Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks: + +- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place +- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster +- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html) +- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html) + + +Performance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark): + +[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=32,4,1&chs=600x416&chxl=-1:|djv|ajv|json-schema-validator-generator|jsen|is-my-json-valid|themis|z-schema|jsck|skeemas|json-schema-library|tv4&chd=t:100,98,72.1,66.8,50.1,15.1,6.1,3.8,1.2,0.7,0.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance) + + +## Features + +- Ajv implements full JSON Schema [draft-06/07](http://json-schema.org/) and draft-04 standards: + - all validation keywords (see [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md)) + - full support of remote refs (remote schemas have to be added with `addSchema` or compiled to be available) + - support of circular references between schemas + - correct string lengths for strings with unicode pairs (can be turned off) + - [formats](#formats) defined by JSON Schema draft-07 standard and custom formats (can be turned off) + - [validates schemas against meta-schema](#api-validateschema) +- supports [browsers](#using-in-browser) and Node.js 0.10-14.x +- [asynchronous loading](#asynchronous-schema-compilation) of referenced schemas during compilation +- "All errors" validation mode with [option allErrors](#options) +- [error messages with parameters](#validation-errors) describing error reasons to allow creating custom error messages +- i18n error messages support with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package +- [filtering data](#filtering-data) from additional properties +- [assigning defaults](#assigning-defaults) to missing properties and items +- [coercing data](#coercing-data-types) to the types specified in `type` keywords +- [custom keywords](#defining-custom-keywords) +- draft-06/07 keywords `const`, `contains`, `propertyNames` and `if/then/else` +- draft-06 boolean schemas (`true`/`false` as a schema to always pass/fail). +- keywords `switch`, `patternRequired`, `formatMaximum` / `formatMinimum` and `formatExclusiveMaximum` / `formatExclusiveMinimum` from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) with [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package +- [$data reference](#data-reference) to use values from the validated data as values for the schema keywords +- [asynchronous validation](#asynchronous-validation) of custom formats and keywords + + +## Install + +``` +npm install ajv +``` + + +## Getting started + +Try it in the Node.js REPL: https://tonicdev.com/npm/ajv + + +The fastest validation call: + +```javascript +// Node.js require: +var Ajv = require('ajv'); +// or ESM/TypeScript import +import Ajv from 'ajv'; + +var ajv = new Ajv(); // options can be passed, e.g. {allErrors: true} +var validate = ajv.compile(schema); +var valid = validate(data); +if (!valid) console.log(validate.errors); +``` + +or with less code + +```javascript +// ... +var valid = ajv.validate(schema, data); +if (!valid) console.log(ajv.errors); +// ... +``` + +or + +```javascript +// ... +var valid = ajv.addSchema(schema, 'mySchema') + .validate('mySchema', data); +if (!valid) console.log(ajv.errorsText()); +// ... +``` + +See [API](#api) and [Options](#options) for more details. + +Ajv compiles schemas to functions and caches them in all cases (using schema serialized with [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) or a custom function as a key), so that the next time the same schema is used (not necessarily the same object instance) it won't be compiled again. + +The best performance is achieved when using compiled functions returned by `compile` or `getSchema` methods (there is no additional function call). + +__Please note__: every time a validation function or `ajv.validate` are called `errors` property is overwritten. You need to copy `errors` array reference to another variable if you want to use it later (e.g., in the callback). See [Validation errors](#validation-errors) + +__Note for TypeScript users__: `ajv` provides its own TypeScript declarations +out of the box, so you don't need to install the deprecated `@types/ajv` +module. + + +## Using in browser + +You can require Ajv directly from the code you browserify - in this case Ajv will be a part of your bundle. + +If you need to use Ajv in several bundles you can create a separate UMD bundle using `npm run bundle` script (thanks to [siddo420](https://github.com/siddo420)). + +Then you need to load Ajv in the browser: +```html + +``` + +This bundle can be used with different module systems; it creates global `Ajv` if no module system is found. + +The browser bundle is available on [cdnjs](https://cdnjs.com/libraries/ajv). + +Ajv is tested with these browsers: + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/epoberezkin.svg)](https://saucelabs.com/u/epoberezkin) + +__Please note__: some frameworks, e.g. Dojo, may redefine global require in such way that is not compatible with CommonJS module format. In such case Ajv bundle has to be loaded before the framework and then you can use global Ajv (see issue [#234](https://github.com/ajv-validator/ajv/issues/234)). + + +### Ajv and Content Security Policies (CSP) + +If you're using Ajv to compile a schema (the typical use) in a browser document that is loaded with a Content Security Policy (CSP), that policy will require a `script-src` directive that includes the value `'unsafe-eval'`. +:warning: NOTE, however, that `unsafe-eval` is NOT recommended in a secure CSP[[1]](https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-eval), as it has the potential to open the document to cross-site scripting (XSS) attacks. + +In order to make use of Ajv without easing your CSP, you can [pre-compile a schema using the CLI](https://github.com/ajv-validator/ajv-cli#compile-schemas). This will transpile the schema JSON into a JavaScript file that exports a `validate` function that works simlarly to a schema compiled at runtime. + +Note that pre-compilation of schemas is performed using [ajv-pack](https://github.com/ajv-validator/ajv-pack) and there are [some limitations to the schema features it can compile](https://github.com/ajv-validator/ajv-pack#limitations). A successfully pre-compiled schema is equivalent to the same schema compiled at runtime. + + +## Command line interface + +CLI is available as a separate npm package [ajv-cli](https://github.com/ajv-validator/ajv-cli). It supports: + +- compiling JSON Schemas to test their validity +- BETA: generating standalone module exporting a validation function to be used without Ajv (using [ajv-pack](https://github.com/ajv-validator/ajv-pack)) +- migrate schemas to draft-07 (using [json-schema-migrate](https://github.com/epoberezkin/json-schema-migrate)) +- validating data file(s) against JSON Schema +- testing expected validity of data against JSON Schema +- referenced schemas +- custom meta-schemas +- files in JSON, JSON5, YAML, and JavaScript format +- all Ajv options +- reporting changes in data after validation in [JSON-patch](https://tools.ietf.org/html/rfc6902) format + + +## Validation keywords + +Ajv supports all validation keywords from draft-07 of JSON Schema standard: + +- [type](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#type) +- [for numbers](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-numbers) - maximum, minimum, exclusiveMaximum, exclusiveMinimum, multipleOf +- [for strings](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-strings) - maxLength, minLength, pattern, format +- [for arrays](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-arrays) - maxItems, minItems, uniqueItems, items, additionalItems, [contains](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#contains) +- [for objects](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-objects) - maxProperties, minProperties, required, properties, patternProperties, additionalProperties, dependencies, [propertyNames](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#propertynames) +- [for all types](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-all-types) - enum, [const](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#const) +- [compound keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#compound-keywords) - not, oneOf, anyOf, allOf, [if/then/else](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#ifthenelse) + +With [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package Ajv also supports validation keywords from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) for JSON Schema standard: + +- [patternRequired](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#patternrequired-proposed) - like `required` but with patterns that some property should match. +- [formatMaximum, formatMinimum, formatExclusiveMaximum, formatExclusiveMinimum](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#formatmaximum--formatminimum-and-exclusiveformatmaximum--exclusiveformatminimum-proposed) - setting limits for date, time, etc. + +See [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md) for more details. + + +## Annotation keywords + +JSON Schema specification defines several annotation keywords that describe schema itself but do not perform any validation. + +- `title` and `description`: information about the data represented by that schema +- `$comment` (NEW in draft-07): information for developers. With option `$comment` Ajv logs or passes the comment string to the user-supplied function. See [Options](#options). +- `default`: a default value of the data instance, see [Assigning defaults](#assigning-defaults). +- `examples` (NEW in draft-06): an array of data instances. Ajv does not check the validity of these instances against the schema. +- `readOnly` and `writeOnly` (NEW in draft-07): marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.). +- `contentEncoding`: [RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.1 ), e.g., "base64". +- `contentMediaType`: [RFC 2046](https://tools.ietf.org/html/rfc2046), e.g., "image/png". + +__Please note__: Ajv does not implement validation of the keywords `examples`, `contentEncoding` and `contentMediaType` but it reserves them. If you want to create a plugin that implements some of them, it should remove these keywords from the instance. + + +## Formats + +Ajv implements formats defined by JSON Schema specification and several other formats. It is recommended NOT to use "format" keyword implementations with untrusted data, as they use potentially unsafe regular expressions - see [ReDoS attack](#redos-attack). + +__Please note__: if you need to use "format" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios. + +The following formats are implemented for string validation with "format" keyword: + +- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6). +- _time_: time with optional time-zone. +- _date-time_: date-time from the same source (time-zone is mandatory). `date`, `time` and `date-time` validate ranges in `full` mode and only regexp in `fast` mode (see [options](#options)). +- _uri_: full URI. +- _uri-reference_: URI reference, including full and relative URIs. +- _uri-template_: URI template according to [RFC6570](https://tools.ietf.org/html/rfc6570) +- _url_ (deprecated): [URL record](https://url.spec.whatwg.org/#concept-url). +- _email_: email address. +- _hostname_: host name according to [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5). +- _ipv4_: IP address v4. +- _ipv6_: IP address v6. +- _regex_: tests whether a string is a valid regular expression by passing it to RegExp constructor. +- _uuid_: Universally Unique IDentifier according to [RFC4122](http://tools.ietf.org/html/rfc4122). +- _json-pointer_: JSON-pointer according to [RFC6901](https://tools.ietf.org/html/rfc6901). +- _relative-json-pointer_: relative JSON-pointer according to [this draft](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00). + +__Please note__: JSON Schema draft-07 also defines formats `iri`, `iri-reference`, `idn-hostname` and `idn-email` for URLs, hostnames and emails with international characters. Ajv does not implement these formats. If you create Ajv plugin that implements them please make a PR to mention this plugin here. + +There are two modes of format validation: `fast` and `full`. This mode affects formats `date`, `time`, `date-time`, `uri`, `uri-reference`, and `email`. See [Options](#options) for details. + +You can add additional formats and replace any of the formats above using [addFormat](#api-addformat) method. + +The option `unknownFormats` allows changing the default behaviour when an unknown format is encountered. In this case Ajv can either fail schema compilation (default) or ignore it (default in versions before 5.0.0). You also can allow specific format(s) that will be ignored. See [Options](#options) for details. + +You can find regular expressions used for format validation and the sources that were used in [formats.js](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js). + + +## Combining schemas with $ref + +You can structure your validation logic across multiple schema files and have schemas reference each other using `$ref` keyword. + +Example: + +```javascript +var schema = { + "$id": "http://example.com/schemas/schema.json", + "type": "object", + "properties": { + "foo": { "$ref": "defs.json#/definitions/int" }, + "bar": { "$ref": "defs.json#/definitions/str" } + } +}; + +var defsSchema = { + "$id": "http://example.com/schemas/defs.json", + "definitions": { + "int": { "type": "integer" }, + "str": { "type": "string" } + } +}; +``` + +Now to compile your schema you can either pass all schemas to Ajv instance: + +```javascript +var ajv = new Ajv({schemas: [schema, defsSchema]}); +var validate = ajv.getSchema('http://example.com/schemas/schema.json'); +``` + +or use `addSchema` method: + +```javascript +var ajv = new Ajv; +var validate = ajv.addSchema(defsSchema) + .compile(schema); +``` + +See [Options](#options) and [addSchema](#api) method. + +__Please note__: +- `$ref` is resolved as the uri-reference using schema $id as the base URI (see the example). +- References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.). +- You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs. +- The actual location of the schema file in the file system is not used. +- You can pass the identifier of the schema as the second parameter of `addSchema` method or as a property name in `schemas` option. This identifier can be used instead of (or in addition to) schema $id. +- You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown. +- You can implement dynamic resolution of the referenced schemas using `compileAsync` method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See [Asynchronous schema compilation](#asynchronous-schema-compilation). + + +## $data reference + +With `$data` option you can use values from the validated data as the values for the schema keywords. See [proposal](https://github.com/json-schema-org/json-schema-spec/issues/51) for more information about how it works. + +`$data` reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems. + +The value of "$data" should be a [JSON-pointer](https://tools.ietf.org/html/rfc6901) to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a [relative JSON-pointer](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema). + +Examples. + +This schema requires that the value in property `smaller` is less or equal than the value in the property larger: + +```javascript +var ajv = new Ajv({$data: true}); + +var schema = { + "properties": { + "smaller": { + "type": "number", + "maximum": { "$data": "1/larger" } + }, + "larger": { "type": "number" } + } +}; + +var validData = { + smaller: 5, + larger: 7 +}; + +ajv.validate(schema, validData); // true +``` + +This schema requires that the properties have the same format as their field names: + +```javascript +var schema = { + "additionalProperties": { + "type": "string", + "format": { "$data": "0#" } + } +}; + +var validData = { + 'date-time': '1963-06-19T08:30:06.283185Z', + email: 'joe.bloggs@example.com' +} +``` + +`$data` reference is resolved safely - it won't throw even if some property is undefined. If `$data` resolves to `undefined` the validation succeeds (with the exclusion of `const` keyword). If `$data` resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails. + + +## $merge and $patch keywords + +With the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) you can use the keywords `$merge` and `$patch` that allow extending JSON Schemas with patches using formats [JSON Merge Patch (RFC 7396)](https://tools.ietf.org/html/rfc7396) and [JSON Patch (RFC 6902)](https://tools.ietf.org/html/rfc6902). + +To add keywords `$merge` and `$patch` to Ajv instance use this code: + +```javascript +require('ajv-merge-patch')(ajv); +``` + +Examples. + +Using `$merge`: + +```json +{ + "$merge": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": { + "properties": { "q": { "type": "number" } } + } + } +} +``` + +Using `$patch`: + +```json +{ + "$patch": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": [ + { "op": "add", "path": "/properties/q", "value": { "type": "number" } } + ] + } +} +``` + +The schemas above are equivalent to this schema: + +```json +{ + "type": "object", + "properties": { + "p": { "type": "string" }, + "q": { "type": "number" } + }, + "additionalProperties": false +} +``` + +The properties `source` and `with` in the keywords `$merge` and `$patch` can use absolute or relative `$ref` to point to other schemas previously added to the Ajv instance or to the fragments of the current schema. + +See the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) for more information. + + +## Defining custom keywords + +The advantages of using custom keywords are: + +- allow creating validation scenarios that cannot be expressed using JSON Schema +- simplify your schemas +- help bringing a bigger part of the validation logic to your schemas +- make your schemas more expressive, less verbose and closer to your application domain +- implement custom data processors that modify your data (`modifying` option MUST be used in keyword definition) and/or create side effects while the data is being validated + +If a keyword is used only for side-effects and its validation result is pre-defined, use option `valid: true/false` in keyword definition to simplify both generated code (no error handling in case of `valid: true`) and your keyword functions (no need to return any validation result). + +The concerns you have to be aware of when extending JSON Schema standard with custom keywords are the portability and understanding of your schemas. You will have to support these custom keywords on other platforms and to properly document these keywords so that everybody can understand them in your schemas. + +You can define custom keywords with [addKeyword](#api-addkeyword) method. Keywords are defined on the `ajv` instance level - new instances will not have previously defined keywords. + +Ajv allows defining keywords with: +- validation function +- compilation function +- macro function +- inline compilation function that should return code (as string) that will be inlined in the currently compiled schema. + +Example. `range` and `exclusiveRange` keywords using compiled schema: + +```javascript +ajv.addKeyword('range', { + type: 'number', + compile: function (sch, parentSchema) { + var min = sch[0]; + var max = sch[1]; + + return parentSchema.exclusiveRange === true + ? function (data) { return data > min && data < max; } + : function (data) { return data >= min && data <= max; } + } +}); + +var schema = { "range": [2, 4], "exclusiveRange": true }; +var validate = ajv.compile(schema); +console.log(validate(2.01)); // true +console.log(validate(3.99)); // true +console.log(validate(2)); // false +console.log(validate(4)); // false +``` + +Several custom keywords (typeof, instanceof, range and propertyNames) are defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package - they can be used for your schemas and as a starting point for your own custom keywords. + +See [Defining custom keywords](https://github.com/ajv-validator/ajv/blob/master/CUSTOM.md) for more details. + + +## Asynchronous schema compilation + +During asynchronous compilation remote references are loaded using supplied function. See `compileAsync` [method](#api-compileAsync) and `loadSchema` [option](#options). + +Example: + +```javascript +var ajv = new Ajv({ loadSchema: loadSchema }); + +ajv.compileAsync(schema).then(function (validate) { + var valid = validate(data); + // ... +}); + +function loadSchema(uri) { + return request.json(uri).then(function (res) { + if (res.statusCode >= 400) + throw new Error('Loading error: ' + res.statusCode); + return res.body; + }); +} +``` + +__Please note__: [Option](#options) `missingRefs` should NOT be set to `"ignore"` or `"fail"` for asynchronous compilation to work. + + +## Asynchronous validation + +Example in Node.js REPL: https://tonicdev.com/esp/ajv-asynchronous-validation + +You can define custom formats and keywords that perform validation asynchronously by accessing database or some other service. You should add `async: true` in the keyword or format definition (see [addFormat](#api-addformat), [addKeyword](#api-addkeyword) and [Defining custom keywords](#defining-custom-keywords)). + +If your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have `"$async": true` keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without `$async` keyword Ajv will throw an exception during schema compilation. + +__Please note__: all asynchronous subschemas that are referenced from the current or other schemas should have `"$async": true` keyword as well, otherwise the schema compilation will fail. + +Validation function for an asynchronous custom format/keyword should return a promise that resolves with `true` or `false` (or rejects with `new Ajv.ValidationError(errors)` if you want to return custom errors from the keyword function). + +Ajv compiles asynchronous schemas to [es7 async functions](http://tc39.github.io/ecmascript-asyncawait/) that can optionally be transpiled with [nodent](https://github.com/MatAtBread/nodent). Async functions are supported in Node.js 7+ and all modern browsers. You can also supply any other transpiler as a function via `processCode` option. See [Options](#options). + +The compiled validation function has `$async: true` property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas. + +Validation result will be a promise that resolves with validated data or rejects with an exception `Ajv.ValidationError` that contains the array of validation errors in `errors` property. + + +Example: + +```javascript +var ajv = new Ajv; +// require('ajv-async')(ajv); + +ajv.addKeyword('idExists', { + async: true, + type: 'number', + validate: checkIdExists +}); + + +function checkIdExists(schema, data) { + return knex(schema.table) + .select('id') + .where('id', data) + .then(function (rows) { + return !!rows.length; // true if record is found + }); +} + +var schema = { + "$async": true, + "properties": { + "userId": { + "type": "integer", + "idExists": { "table": "users" } + }, + "postId": { + "type": "integer", + "idExists": { "table": "posts" } + } + } +}; + +var validate = ajv.compile(schema); + +validate({ userId: 1, postId: 19 }) +.then(function (data) { + console.log('Data is valid', data); // { userId: 1, postId: 19 } +}) +.catch(function (err) { + if (!(err instanceof Ajv.ValidationError)) throw err; + // data is invalid + console.log('Validation errors:', err.errors); +}); +``` + +### Using transpilers with asynchronous validation functions. + +[ajv-async](https://github.com/ajv-validator/ajv-async) uses [nodent](https://github.com/MatAtBread/nodent) to transpile async functions. To use another transpiler you should separately install it (or load its bundle in the browser). + + +#### Using nodent + +```javascript +var ajv = new Ajv; +require('ajv-async')(ajv); +// in the browser if you want to load ajv-async bundle separately you can: +// window.ajvAsync(ajv); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + + +#### Using other transpilers + +```javascript +var ajv = new Ajv({ processCode: transpileFunc }); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + +See [Options](#options). + + +## Security considerations + +JSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider. + + +##### Security contact + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues. + + +##### Untrusted schemas + +Ajv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application. + +If your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent: +- compiling schemas can cause stack overflow (if they are too deep) +- compiling schemas can be slow (e.g. [#557](https://github.com/ajv-validator/ajv/issues/557)) +- validating certain data can be slow + +It is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in `pattern` and `patternProperties` keywords. + +Regardless the measures you take, using untrusted schemas increases security risks. + + +##### Circular references in JavaScript objects + +Ajv does not support schemas and validated data that have circular references in objects. See [issue #802](https://github.com/ajv-validator/ajv/issues/802). + +An attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references. + + +##### Security risks of trusted schemas + +Some keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to): + +- `pattern` and `format` for large strings - in some cases using `maxLength` can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see [ReDoS attack](#redos-attack)). +- `patternProperties` for large property names - use `propertyNames` to mitigate, but some regular expressions can have exponential evaluation time as well. +- `uniqueItems` for large non-scalar arrays - use `maxItems` to mitigate + +__Please note__: The suggestions above to prevent slow validation would only work if you do NOT use `allErrors: true` in production code (using it would continue validation after validation errors). + +You can validate your JSON schemas against [this meta-schema](https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-secure.json) to check that these recommendations are followed: + +```javascript +const isSchemaSecure = ajv.compile(require('ajv/lib/refs/json-schema-secure.json')); + +const schema1 = {format: 'email'}; +isSchemaSecure(schema1); // false + +const schema2 = {format: 'email', maxLength: MAX_LENGTH}; +isSchemaSecure(schema2); // true +``` + +__Please note__: following all these recommendation is not a guarantee that validation of untrusted data is safe - it can still lead to some undesirable results. + + +##### Content Security Policies (CSP) +See [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) + + +## ReDoS attack + +Certain regular expressions can lead to the exponential evaluation time even with relatively short strings. + +Please assess the regular expressions you use in the schemas on their vulnerability to this attack - see [safe-regex](https://github.com/substack/safe-regex), for example. + +__Please note__: some formats that Ajv implements use [regular expressions](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js) that can be vulnerable to ReDoS attack, so if you use Ajv to validate data from untrusted sources __it is strongly recommended__ to consider the following: + +- making assessment of "format" implementations in Ajv. +- using `format: 'fast'` option that simplifies some of the regular expressions (although it does not guarantee that they are safe). +- replacing format implementations provided by Ajv with your own implementations of "format" keyword that either uses different regular expressions or another approach to format validation. Please see [addFormat](#api-addformat) method. +- disabling format validation by ignoring "format" keyword with option `format: false` + +Whatever mitigation you choose, please assume all formats provided by Ajv as potentially unsafe and make your own assessment of their suitability for your validation scenarios. + + +## Filtering data + +With [option `removeAdditional`](#options) (added by [andyscott](https://github.com/andyscott)) you can filter data during the validation. + +This option modifies original data. + +Example: + +```javascript +var ajv = new Ajv({ removeAdditional: true }); +var schema = { + "additionalProperties": false, + "properties": { + "foo": { "type": "number" }, + "bar": { + "additionalProperties": { "type": "number" }, + "properties": { + "baz": { "type": "string" } + } + } + } +} + +var data = { + "foo": 0, + "additional1": 1, // will be removed; `additionalProperties` == false + "bar": { + "baz": "abc", + "additional2": 2 // will NOT be removed; `additionalProperties` != false + }, +} + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 0, "bar": { "baz": "abc", "additional2": 2 } +``` + +If `removeAdditional` option in the example above were `"all"` then both `additional1` and `additional2` properties would have been removed. + +If the option were `"failing"` then property `additional1` would have been removed regardless of its value and property `additional2` would have been removed only if its value were failing the schema in the inner `additionalProperties` (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed). + +__Please note__: If you use `removeAdditional` option with `additionalProperties` keyword inside `anyOf`/`oneOf` keywords your validation can fail with this schema, for example: + +```json +{ + "type": "object", + "oneOf": [ + { + "properties": { + "foo": { "type": "string" } + }, + "required": [ "foo" ], + "additionalProperties": false + }, + { + "properties": { + "bar": { "type": "integer" } + }, + "required": [ "bar" ], + "additionalProperties": false + } + ] +} +``` + +The intention of the schema above is to allow objects with either the string property "foo" or the integer property "bar", but not with both and not with any other properties. + +With the option `removeAdditional: true` the validation will pass for the object `{ "foo": "abc"}` but will fail for the object `{"bar": 1}`. It happens because while the first subschema in `oneOf` is validated, the property `bar` is removed because it is an additional property according to the standard (because it is not included in `properties` keyword in the same schema). + +While this behaviour is unexpected (issues [#129](https://github.com/ajv-validator/ajv/issues/129), [#134](https://github.com/ajv-validator/ajv/issues/134)), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way: + +```json +{ + "type": "object", + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "integer" } + }, + "additionalProperties": false, + "oneOf": [ + { "required": [ "foo" ] }, + { "required": [ "bar" ] } + ] +} +``` + +The schema above is also more efficient - it will compile into a faster function. + + +## Assigning defaults + +With [option `useDefaults`](#options) Ajv will assign values from `default` keyword in the schemas of `properties` and `items` (when it is the array of schemas) to the missing properties and items. + +With the option value `"empty"` properties and items equal to `null` or `""` (empty string) will be considered missing and assigned defaults. + +This option modifies original data. + +__Please note__: the default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema. + + +Example 1 (`default` in `properties`): + +```javascript +var ajv = new Ajv({ useDefaults: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "string", "default": "baz" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": 1 }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": "baz" } +``` + +Example 2 (`default` in `items`): + +```javascript +var schema = { + "type": "array", + "items": [ + { "type": "number" }, + { "type": "string", "default": "foo" } + ] +} + +var data = [ 1 ]; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // [ 1, "foo" ] +``` + +`default` keywords in other cases are ignored: + +- not in `properties` or `items` subschemas +- in schemas inside `anyOf`, `oneOf` and `not` (see [#42](https://github.com/ajv-validator/ajv/issues/42)) +- in `if` subschema of `switch` keyword +- in schemas generated by custom macro keywords + +The [`strictDefaults` option](#options) customizes Ajv's behavior for the defaults that Ajv ignores (`true` raises an error, and `"log"` outputs a warning). + + +## Coercing data types + +When you are validating user inputs all your data properties are usually strings. The option `coerceTypes` allows you to have your data types coerced to the types specified in your schema `type` keywords, both to pass the validation and to use the correctly typed data afterwards. + +This option modifies original data. + +__Please note__: if you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value. + + +Example 1: + +```javascript +var ajv = new Ajv({ coerceTypes: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "boolean" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": "1", "bar": "false" }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": false } +``` + +Example 2 (array coercions): + +```javascript +var ajv = new Ajv({ coerceTypes: 'array' }); +var schema = { + "properties": { + "foo": { "type": "array", "items": { "type": "number" } }, + "bar": { "type": "boolean" } + } +}; + +var data = { "foo": "1", "bar": ["false"] }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": [1], "bar": false } +``` + +The coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of "anyOf" and other compound keywords). + +See [Coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md) for details. + + +## API + +##### new Ajv(Object options) -> Object + +Create Ajv instance. + + +##### .compile(Object schema) -> Function<Object data> + +Generate validating function and cache the compiled schema for future use. + +Validating function returns a boolean value. This function has properties `errors` and `schema`. Errors encountered during the last validation are assigned to `errors` property (it is assigned `null` if there was no errors). `schema` property contains the reference to the original schema. + +The schema passed to this method will be validated against meta-schema unless `validateSchema` option is false. If schema is invalid, an error will be thrown. See [options](#options). + + +##### .compileAsync(Object schema [, Boolean meta] [, Function callback]) -> Promise + +Asynchronous version of `compile` method that loads missing remote schemas using asynchronous function in `options.loadSchema`. This function returns a Promise that resolves to a validation function. An optional callback passed to `compileAsync` will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when: + +- missing schema can't be loaded (`loadSchema` returns a Promise that rejects). +- a schema containing a missing reference is loaded, but the reference cannot be resolved. +- schema (or some loaded/referenced schema) is invalid. + +The function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded. + +You can asynchronously compile meta-schema by passing `true` as the second parameter. + +See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### .validate(Object schema|String key|String ref, data) -> Boolean + +Validate data using passed schema (it will be compiled and cached). + +Instead of the schema you can use the key that was previously passed to `addSchema`, the schema id if it was present in the schema or any previously resolved reference. + +Validation errors will be available in the `errors` property of Ajv instance (`null` if there were no errors). + +__Please note__: every time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later. + +If the schema is asynchronous (has `$async` keyword on the top level) this method returns a Promise. See [Asynchronous validation](#asynchronous-validation). + + +##### .addSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Add schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole. + +Array of schemas can be passed (schemas should have ids), the second parameter will be ignored. + +Key can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key. + + +Once the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data. + +Although `addSchema` does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time. + +By default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by `validateSchema` option. + +__Please note__: Ajv uses the [method chaining syntax](https://en.wikipedia.org/wiki/Method_chaining) for all methods with the prefix `add*` and `remove*`. +This allows you to do nice things like the following. + +```javascript +var validate = new Ajv().addSchema(schema).addFormat(name, regex).getSchema(uri); +``` + +##### .addMetaSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Adds meta schema(s) that can be used to validate other schemas. That function should be used instead of `addSchema` because there may be instance options that would compile a meta schema incorrectly (at the moment it is `removeAdditional` option). + +There is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option `meta` is set to `false`. You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See `validateSchema`. + + +##### .validateSchema(Object schema) -> Boolean + +Validates schema. This method should be used to validate schemas rather than `validate` due to the inconsistency of `uri` format in JSON Schema standard. + +By default this method is called automatically when the schema is added, so you rarely need to use it directly. + +If schema doesn't have `$schema` property, it is validated against draft 6 meta-schema (option `meta` should not be false). + +If schema has `$schema` property, then the schema with this id (that should be previously added) is used to validate passed schema. + +Errors will be available at `ajv.errors`. + + +##### .getSchema(String key) -> Function<Object data> + +Retrieve compiled schema previously added with `addSchema` by the key passed to `addSchema` or by its full reference (id). The returned validating function has `schema` property with the reference to the original schema. + + +##### .removeSchema([Object schema|String key|String ref|RegExp pattern]) -> Ajv + +Remove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references. + +Schema can be removed using: +- key passed to `addSchema` +- it's full reference (id) +- RegExp that should match schema id or key (meta-schemas won't be removed) +- actual schema object that will be stable-stringified to remove schema from cache + +If no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared. + + +##### .addFormat(String name, String|RegExp|Function|Object format) -> Ajv + +Add custom format to validate strings or numbers. It can also be used to replace pre-defined formats for Ajv instance. + +Strings are converted to RegExp. + +Function should return validation result as `true` or `false`. + +If object is passed it should have properties `validate`, `compare` and `async`: + +- _validate_: a string, RegExp or a function as described above. +- _compare_: an optional comparison function that accepts two strings and compares them according to the format meaning. This function is used with keywords `formatMaximum`/`formatMinimum` (defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package). It should return `1` if the first value is bigger than the second value, `-1` if it is smaller and `0` if it is equal. +- _async_: an optional `true` value if `validate` is an asynchronous function; in this case it should return a promise that resolves with a value `true` or `false`. +- _type_: an optional type of data that the format applies to. It can be `"string"` (default) or `"number"` (see https://github.com/ajv-validator/ajv/issues/291#issuecomment-259923858). If the type of data is different, the validation will pass. + +Custom formats can be also added via `formats` option. + + +##### .addKeyword(String keyword, Object definition) -> Ajv + +Add custom validation keyword to Ajv instance. + +Keyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance. + +Keyword must start with a letter, `_` or `$`, and may continue with letters, numbers, `_`, `$`, or `-`. +It is recommended to use an application-specific prefix for keywords to avoid current and future name collisions. + +Example Keywords: +- `"xyz-example"`: valid, and uses prefix for the xyz project to avoid name collisions. +- `"example"`: valid, but not recommended as it could collide with future versions of JSON Schema etc. +- `"3-example"`: invalid as numbers are not allowed to be the first character in a keyword + +Keyword definition is an object with the following properties: + +- _type_: optional string or array of strings with data type(s) that the keyword applies to. If not present, the keyword will apply to all types. +- _validate_: validating function +- _compile_: compiling function +- _macro_: macro function +- _inline_: compiling function that returns code (as string) +- _schema_: an optional `false` value used with "validate" keyword to not pass schema +- _metaSchema_: an optional meta-schema for keyword schema +- _dependencies_: an optional list of properties that must be present in the parent schema - it will be checked during schema compilation +- _modifying_: `true` MUST be passed if keyword modifies data +- _statements_: `true` can be passed in case inline keyword generates statements (as opposed to expression) +- _valid_: pass `true`/`false` to pre-define validation result, the result returned from validation function will be ignored. This option cannot be used with macro keywords. +- _$data_: an optional `true` value to support [$data reference](#data-reference) as the value of custom keyword. The reference will be resolved at validation time. If the keyword has meta-schema it would be extended to allow $data and it will be used to validate the resolved value. Supporting $data reference requires that keyword has validating function (as the only option or in addition to compile, macro or inline function). +- _async_: an optional `true` value if the validation function is asynchronous (whether it is compiled or passed in _validate_ property); in this case it should return a promise that resolves with a value `true` or `false`. This option is ignored in case of "macro" and "inline" keywords. +- _errors_: an optional boolean or string `"full"` indicating whether keyword returns errors. If this property is not set Ajv will determine if the errors were set in case of failed validation. + +_compile_, _macro_ and _inline_ are mutually exclusive, only one should be used at a time. _validate_ can be used separately or in addition to them to support $data reference. + +__Please note__: If the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate `type` keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed. + +See [Defining custom keywords](#defining-custom-keywords) for more details. + + +##### .getKeyword(String keyword) -> Object|Boolean + +Returns custom keyword definition, `true` for pre-defined keywords and `false` if the keyword is unknown. + + +##### .removeKeyword(String keyword) -> Ajv + +Removes custom or pre-defined keyword so you can redefine them. + +While this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results. + +__Please note__: schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use `removeSchema` method and compile them again. + + +##### .errorsText([Array<Object> errors [, Object options]]) -> String + +Returns the text with all errors in a String. + +Options can have properties `separator` (string used to separate errors, ", " by default) and `dataVar` (the variable name that dataPaths are prefixed with, "data" by default). + + +## Options + +Defaults: + +```javascript +{ + // validation and reporting options: + $data: false, + allErrors: false, + verbose: false, + $comment: false, // NEW in Ajv version 6.0 + jsonPointers: false, + uniqueItems: true, + unicode: true, + nullable: false, + format: 'fast', + formats: {}, + unknownFormats: true, + schemas: {}, + logger: undefined, + // referenced schema options: + schemaId: '$id', + missingRefs: true, + extendRefs: 'ignore', // recommended 'fail' + loadSchema: undefined, // function(uri: string): Promise {} + // options to modify validated data: + removeAdditional: false, + useDefaults: false, + coerceTypes: false, + // strict mode options + strictDefaults: false, + strictKeywords: false, + strictNumbers: false, + // asynchronous validation options: + transpile: undefined, // requires ajv-async package + // advanced options: + meta: true, + validateSchema: true, + addUsedSchema: true, + inlineRefs: true, + passContext: false, + loopRequired: Infinity, + ownProperties: false, + multipleOfPrecision: false, + errorDataPath: 'object', // deprecated + messages: true, + sourceCode: false, + processCode: undefined, // function (str: string, schema: object): string {} + cache: new Cache, + serialize: undefined +} +``` + +##### Validation and reporting options + +- _$data_: support [$data references](#data-reference). Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See [API](#api). +- _allErrors_: check all rules collecting all errors. Default is to return after the first error. +- _verbose_: include the reference to the part of the schema (`schema` and `parentSchema`) and validated data in errors (false by default). +- _$comment_ (NEW in Ajv version 6.0): log or pass the value of `$comment` keyword to a function. Option values: + - `false` (default): ignore $comment keyword. + - `true`: log the keyword value to console. + - function: pass the keyword value, its schema path and root schema to the specified function +- _jsonPointers_: set `dataPath` property of errors using [JSON Pointers](https://tools.ietf.org/html/rfc6901) instead of JavaScript property access notation. +- _uniqueItems_: validate `uniqueItems` keyword (true by default). +- _unicode_: calculate correct length of strings with unicode pairs (true by default). Pass `false` to use `.length` of strings that is faster, but gives "incorrect" lengths of strings with unicode pairs - each unicode pair is counted as two characters. +- _nullable_: support keyword "nullable" from [Open API 3 specification](https://swagger.io/docs/specification/data-models/data-types/). +- _format_: formats validation mode. Option values: + - `"fast"` (default) - simplified and fast validation (see [Formats](#formats) for details of which formats are available and affected by this option). + - `"full"` - more restrictive and slow validation. E.g., 25:00:00 and 2015/14/33 will be invalid time and date in 'full' mode but it will be valid in 'fast' mode. + - `false` - ignore all format keywords. +- _formats_: an object with custom formats. Keys and values will be passed to `addFormat` method. +- _keywords_: an object with custom keywords. Keys and values will be passed to `addKeyword` method. +- _unknownFormats_: handling of unknown formats. Option values: + - `true` (default) - if an unknown format is encountered the exception is thrown during schema compilation. If `format` keyword value is [$data reference](#data-reference) and it is unknown the validation will fail. + - `[String]` - an array of unknown format names that will be ignored. This option can be used to allow usage of third party schemas with format(s) for which you don't have definitions, but still fail if another unknown format is used. If `format` keyword value is [$data reference](#data-reference) and it is not in this array the validation will fail. + - `"ignore"` - to log warning during schema compilation and always pass validation (the default behaviour in versions before 5.0.0). This option is not recommended, as it allows to mistype format name and it won't be validated without any error message. This behaviour is required by JSON Schema specification. +- _schemas_: an array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method `addSchema(value, key)` will be called for each schema in this object. +- _logger_: sets the logging method. Default is the global `console` object that should have methods `log`, `warn` and `error`. See [Error logging](#error-logging). Option values: + - custom logger - it should have methods `log`, `warn` and `error`. If any of these methods is missing an exception will be thrown. + - `false` - logging is disabled. + + +##### Referenced schema options + +- _schemaId_: this option defines which keywords are used as schema URI. Option value: + - `"$id"` (default) - only use `$id` keyword as schema URI (as specified in JSON Schema draft-06/07), ignore `id` keyword (if it is present a warning will be logged). + - `"id"` - only use `id` keyword as schema URI (as specified in JSON Schema draft-04), ignore `$id` keyword (if it is present a warning will be logged). + - `"auto"` - use both `$id` and `id` keywords as schema URI. If both are present (in the same schema object) and different the exception will be thrown during schema compilation. +- _missingRefs_: handling of missing referenced schemas. Option values: + - `true` (default) - if the reference cannot be resolved during compilation the exception is thrown. The thrown error has properties `missingRef` (with hash fragment) and `missingSchema` (without it). Both properties are resolved relative to the current base id (usually schema id, unless it was substituted). + - `"ignore"` - to log error during compilation and always pass validation. + - `"fail"` - to log error and successfully compile schema but fail validation if this rule is checked. +- _extendRefs_: validation of other keywords when `$ref` is present in the schema. Option values: + - `"ignore"` (default) - when `$ref` is used other keywords are ignored (as per [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3) standard). A warning will be logged during the schema compilation. + - `"fail"` (recommended) - if other validation keywords are used together with `$ref` the exception will be thrown when the schema is compiled. This option is recommended to make sure schema has no keywords that are ignored, which can be confusing. + - `true` - validate all keywords in the schemas with `$ref` (the default behaviour in versions before 5.0.0). +- _loadSchema_: asynchronous function that will be used to load remote schemas when `compileAsync` [method](#api-compileAsync) is used and some reference is missing (option `missingRefs` should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### Options to modify validated data + +- _removeAdditional_: remove additional properties - see example in [Filtering data](#filtering-data). This option is not used if schema is added with `addMetaSchema` method. Option values: + - `false` (default) - not to remove additional properties + - `"all"` - all additional properties are removed, regardless of `additionalProperties` keyword in schema (and no validation is made for them). + - `true` - only additional properties with `additionalProperties` keyword equal to `false` are removed. + - `"failing"` - additional properties that fail schema validation will be removed (where `additionalProperties` keyword is `false` or schema). +- _useDefaults_: replace missing or undefined properties and items with the values from corresponding `default` keywords. Default behaviour is to ignore `default` keywords. This option is not used if schema is added with `addMetaSchema` method. See examples in [Assigning defaults](#assigning-defaults). Option values: + - `false` (default) - do not use defaults + - `true` - insert defaults by value (object literal is used). + - `"empty"` - in addition to missing or undefined, use defaults for properties and items that are equal to `null` or `""` (an empty string). + - `"shared"` (deprecated) - insert defaults by reference. If the default is an object, it will be shared by all instances of validated data. If you modify the inserted default in the validated data, it will be modified in the schema as well. +- _coerceTypes_: change data type of data to match `type` keyword. See the example in [Coercing data types](#coercing-data-types) and [coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md). Option values: + - `false` (default) - no type coercion. + - `true` - coerce scalar data types. + - `"array"` - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema). + + +##### Strict mode options + +- _strictDefaults_: report ignored `default` keywords in schemas. Option values: + - `false` (default) - ignored defaults are not reported + - `true` - if an ignored default is present, throw an error + - `"log"` - if an ignored default is present, log warning +- _strictKeywords_: report unknown keywords in schemas. Option values: + - `false` (default) - unknown keywords are not reported + - `true` - if an unknown keyword is present, throw an error + - `"log"` - if an unknown keyword is present, log warning +- _strictNumbers_: validate numbers strictly, failing validation for NaN and Infinity. Option values: + - `false` (default) - NaN or Infinity will pass validation for numeric types + - `true` - NaN or Infinity will not pass validation for numeric types + +##### Asynchronous validation options + +- _transpile_: Requires [ajv-async](https://github.com/ajv-validator/ajv-async) package. It determines whether Ajv transpiles compiled asynchronous validation function. Option values: + - `undefined` (default) - transpile with [nodent](https://github.com/MatAtBread/nodent) if async functions are not supported. + - `true` - always transpile with nodent. + - `false` - do not transpile; if async functions are not supported an exception will be thrown. + + +##### Advanced options + +- _meta_: add [meta-schema](http://json-schema.org/documentation.html) so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no `$schema` keyword. This default meta-schema MUST have `$schema` keyword. +- _validateSchema_: validate added/compiled schemas against meta-schema (true by default). `$schema` property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with `addMetaSchema` method. Option values: + - `true` (default) - if the validation fails, throw the exception. + - `"log"` - if the validation fails, log error. + - `false` - skip schema validation. +- _addUsedSchema_: by default methods `compile` and `validate` add schemas to the instance if they have `$id` (or `id`) property that doesn't start with "#". If `$id` is present and it is not unique the exception will be thrown. Set this option to `false` to skip adding schemas to the instance and the `$id` uniqueness check when these methods are used. This option does not affect `addSchema` method. +- _inlineRefs_: Affects compilation of referenced schemas. Option values: + - `true` (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - that substantially improves performance at the cost of the bigger size of compiled schema functions. + - `false` - to not inline referenced schemas (they will be compiled as separate functions). + - integer number - to limit the maximum number of keywords of the schema that will be inlined. +- _passContext_: pass validation context to custom keyword functions. If this option is `true` and you pass some context to the compiled validation function with `validate.call(context, data)`, the `context` will be available as `this` in your custom keywords. By default `this` is Ajv instance. +- _loopRequired_: by default `required` keyword is compiled into a single expression (or a sequence of statements in `allErrors` mode). In case of a very large number of properties in this keyword it may result in a very big validation function. Pass integer to set the number of properties above which `required` keyword will be validated in a loop - smaller validation function size but also worse performance. +- _ownProperties_: by default Ajv iterates over all enumerable object properties; when this option is `true` only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst. +- _multipleOfPrecision_: by default `multipleOf` keyword is validated by comparing the result of division with parseInt() of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue [#84](https://github.com/ajv-validator/ajv/issues/84)). If you need to use fractional dividers set this option to some positive integer N to have `multipleOf` validated using this formula: `Math.abs(Math.round(division) - division) < 1e-N` (it is slower but allows for float arithmetics deviations). +- _errorDataPath_ (deprecated): set `dataPath` to point to 'object' (default) or to 'property' when validating keywords `required`, `additionalProperties` and `dependencies`. +- _messages_: Include human-readable messages in errors. `true` by default. `false` can be passed when custom messages are used (e.g. with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n)). +- _sourceCode_: add `sourceCode` property to validating function (for debugging; this code can be different from the result of toString call). +- _processCode_: an optional function to process generated code before it is passed to Function constructor. It can be used to either beautify (the validating function is generated without line-breaks) or to transpile code. Starting from version 5.0.0 this option replaced options: + - `beautify` that formatted the generated function using [js-beautify](https://github.com/beautify-web/js-beautify). If you want to beautify the generated code pass a function calling `require('js-beautify').js_beautify` as `processCode: code => js_beautify(code)`. + - `transpile` that transpiled asynchronous validation function. You can still use `transpile` option with [ajv-async](https://github.com/ajv-validator/ajv-async) package. See [Asynchronous validation](#asynchronous-validation) for more information. +- _cache_: an optional instance of cache to store compiled schemas using stable-stringified schema as a key. For example, set-associative cache [sacjs](https://github.com/epoberezkin/sacjs) can be used. If not passed then a simple hash is used which is good enough for the common use case (a limited number of statically defined schemas). Cache should have methods `put(key, value)`, `get(key)`, `del(key)` and `clear()`. +- _serialize_: an optional function to serialize schema to cache key. Pass `false` to use schema itself as a key (e.g., if WeakMap used as a cache). By default [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used. + + +## Validation errors + +In case of validation failure, Ajv assigns the array of errors to `errors` property of validation function (or to `errors` property of Ajv instance when `validate` or `validateSchema` methods were called). In case of [asynchronous validation](#asynchronous-validation), the returned promise is rejected with exception `Ajv.ValidationError` that has `errors` property. + + +### Error objects + +Each error is an object with the following properties: + +- _keyword_: validation keyword. +- _dataPath_: the path to the part of the data that was validated. By default `dataPath` uses JavaScript property access notation (e.g., `".prop[1].subProp"`). When the option `jsonPointers` is true (see [Options](#options)) `dataPath` will be set using JSON pointer standard (e.g., `"/prop/1/subProp"`). +- _schemaPath_: the path (JSON-pointer as a URI fragment) to the schema of the keyword that failed validation. +- _params_: the object with the additional information about error that can be used to create custom error messages (e.g., using [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package). See below for parameters set by all keywords. +- _message_: the standard error message (can be excluded with option `messages` set to false). +- _schema_: the schema of the keyword (added with `verbose` option). +- _parentSchema_: the schema containing the keyword (added with `verbose` option) +- _data_: the data validated by the keyword (added with `verbose` option). + +__Please note__: `propertyNames` keyword schema validation errors have an additional property `propertyName`, `dataPath` points to the object. After schema validation for each property name, if it is invalid an additional error is added with the property `keyword` equal to `"propertyNames"`. + + +### Error parameters + +Properties of `params` object in errors depend on the keyword that failed validation. + +- `maxItems`, `minItems`, `maxLength`, `minLength`, `maxProperties`, `minProperties` - property `limit` (number, the schema of the keyword). +- `additionalItems` - property `limit` (the maximum number of allowed items in case when `items` keyword is an array of schemas and `additionalItems` is false). +- `additionalProperties` - property `additionalProperty` (the property not used in `properties` and `patternProperties` keywords). +- `dependencies` - properties: + - `property` (dependent property), + - `missingProperty` (required missing dependency - only the first one is reported currently) + - `deps` (required dependencies, comma separated list as a string), + - `depsCount` (the number of required dependencies). +- `format` - property `format` (the schema of the keyword). +- `maximum`, `minimum` - properties: + - `limit` (number, the schema of the keyword), + - `exclusive` (boolean, the schema of `exclusiveMaximum` or `exclusiveMinimum`), + - `comparison` (string, comparison operation to compare the data to the limit, with the data on the left and the limit on the right; can be "<", "<=", ">", ">=") +- `multipleOf` - property `multipleOf` (the schema of the keyword) +- `pattern` - property `pattern` (the schema of the keyword) +- `required` - property `missingProperty` (required property that is missing). +- `propertyNames` - property `propertyName` (an invalid property name). +- `patternRequired` (in ajv-keywords) - property `missingPattern` (required pattern that did not match any property). +- `type` - property `type` (required type(s), a string, can be a comma-separated list) +- `uniqueItems` - properties `i` and `j` (indices of duplicate items). +- `const` - property `allowedValue` pointing to the value (the schema of the keyword). +- `enum` - property `allowedValues` pointing to the array of values (the schema of the keyword). +- `$ref` - property `ref` with the referenced schema URI. +- `oneOf` - property `passingSchemas` (array of indices of passing schemas, null if no schema passes). +- custom keywords (in case keyword definition doesn't create errors) - property `keyword` (the keyword name). + + +### Error logging + +Using the `logger` option when initiallizing Ajv will allow you to define custom logging. Here you can build upon the exisiting logging. The use of other logging packages is supported as long as the package or its associated wrapper exposes the required methods. If any of the required methods are missing an exception will be thrown. +- **Required Methods**: `log`, `warn`, `error` + +```javascript +var otherLogger = new OtherLogger(); +var ajv = new Ajv({ + logger: { + log: console.log.bind(console), + warn: function warn() { + otherLogger.logWarn.apply(otherLogger, arguments); + }, + error: function error() { + otherLogger.logError.apply(otherLogger, arguments); + console.error.apply(console, arguments); + } + } +}); +``` + + +## Plugins + +Ajv can be extended with plugins that add custom keywords, formats or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions: + +- it exports a function +- this function accepts ajv instance as the first parameter and returns the same instance to allow chaining +- this function can accept an optional configuration as the second parameter + +If you have published a useful plugin please submit a PR to add it to the next section. + + +## Related packages + +- [ajv-async](https://github.com/ajv-validator/ajv-async) - plugin to configure async validation mode +- [ajv-bsontype](https://github.com/BoLaMN/ajv-bsontype) - plugin to validate mongodb's bsonType formats +- [ajv-cli](https://github.com/jessedc/ajv-cli) - command line interface +- [ajv-errors](https://github.com/ajv-validator/ajv-errors) - plugin for custom error messages +- [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) - internationalised error messages +- [ajv-istanbul](https://github.com/ajv-validator/ajv-istanbul) - plugin to instrument generated validation code to measure test coverage of your schemas +- [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) - plugin with custom validation keywords (select, typeof, etc.) +- [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) - plugin with keywords $merge and $patch +- [ajv-pack](https://github.com/ajv-validator/ajv-pack) - produces a compact module exporting validation functions +- [ajv-formats-draft2019](https://github.com/luzlab/ajv-formats-draft2019) - format validators for draft2019 that aren't already included in ajv (ie. `idn-hostname`, `idn-email`, `iri`, `iri-reference` and `duration`). + +## Some packages using Ajv + +- [webpack](https://github.com/webpack/webpack) - a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser +- [jsonscript-js](https://github.com/JSONScript/jsonscript-js) - the interpreter for [JSONScript](http://www.jsonscript.org) - scripted processing of existing endpoints and services +- [osprey-method-handler](https://github.com/mulesoft-labs/osprey-method-handler) - Express middleware for validating requests and responses based on a RAML method object, used in [osprey](https://github.com/mulesoft/osprey) - validating API proxy generated from a RAML definition +- [har-validator](https://github.com/ahmadnassri/har-validator) - HTTP Archive (HAR) validator +- [jsoneditor](https://github.com/josdejong/jsoneditor) - a web-based tool to view, edit, format, and validate JSON http://jsoneditoronline.org +- [JSON Schema Lint](https://github.com/nickcmaynard/jsonschemalint) - a web tool to validate JSON/YAML document against a single JSON Schema http://jsonschemalint.com +- [objection](https://github.com/vincit/objection.js) - SQL-friendly ORM for Node.js +- [table](https://github.com/gajus/table) - formats data into a string table +- [ripple-lib](https://github.com/ripple/ripple-lib) - a JavaScript API for interacting with [Ripple](https://ripple.com) in Node.js and the browser +- [restbase](https://github.com/wikimedia/restbase) - distributed storage with REST API & dispatcher for backend services built to provide a low-latency & high-throughput API for Wikipedia / Wikimedia content +- [hippie-swagger](https://github.com/CacheControl/hippie-swagger) - [Hippie](https://github.com/vesln/hippie) wrapper that provides end to end API testing with swagger validation +- [react-form-controlled](https://github.com/seeden/react-form-controlled) - React controlled form components with validation +- [rabbitmq-schema](https://github.com/tjmehta/rabbitmq-schema) - a schema definition module for RabbitMQ graphs and messages +- [@query/schema](https://www.npmjs.com/package/@query/schema) - stream filtering with a URI-safe query syntax parsing to JSON Schema +- [chai-ajv-json-schema](https://github.com/peon374/chai-ajv-json-schema) - chai plugin to us JSON Schema with expect in mocha tests +- [grunt-jsonschema-ajv](https://github.com/SignpostMarv/grunt-jsonschema-ajv) - Grunt plugin for validating files against JSON Schema +- [extract-text-webpack-plugin](https://github.com/webpack-contrib/extract-text-webpack-plugin) - extract text from bundle into a file +- [electron-builder](https://github.com/electron-userland/electron-builder) - a solution to package and build a ready for distribution Electron app +- [addons-linter](https://github.com/mozilla/addons-linter) - Mozilla Add-ons Linter +- [gh-pages-generator](https://github.com/epoberezkin/gh-pages-generator) - multi-page site generator converting markdown files to GitHub pages +- [ESLint](https://github.com/eslint/eslint) - the pluggable linting utility for JavaScript and JSX + + +## Tests + +``` +npm install +git submodule update --init +npm test +``` + +## Contributing + +All validation functions are generated using doT templates in [dot](https://github.com/ajv-validator/ajv/tree/master/lib/dot) folder. Templates are precompiled so doT is not a run-time dependency. + +`npm run build` - compiles templates to [dotjs](https://github.com/ajv-validator/ajv/tree/master/lib/dotjs) folder. + +`npm run watch` - automatically compiles templates when files in dot folder change + +Please see [Contributing guidelines](https://github.com/ajv-validator/ajv/blob/master/CONTRIBUTING.md) + + +## Changes history + +See https://github.com/ajv-validator/ajv/releases + +__Please note__: [Changes in version 7.0.0-beta](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) + +[Version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0). + +## Code of conduct + +Please review and follow the [Code of conduct](https://github.com/ajv-validator/ajv/blob/master/CODE_OF_CONDUCT.md). + +Please report any unacceptable behaviour to ajv.validator@gmail.com - it will be reviewed by the project team. + + +## Open-source software support + +Ajv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers. + + +## License + +[MIT](https://github.com/ajv-validator/ajv/blob/master/LICENSE) diff --git a/node_modules/ajv/dist/ajv.bundle.js b/node_modules/ajv/dist/ajv.bundle.js new file mode 100644 index 00000000..e4d9d156 --- /dev/null +++ b/node_modules/ajv/dist/ajv.bundle.js @@ -0,0 +1,7189 @@ +(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.Ajv = 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-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: HOSTNAME, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} + +},{"./util":10}],5:[function(require,module,exports){ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, strictNumbers, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data, strictNumbers) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],14:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],15:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],16:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],17:[function(require,module,exports){ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + return out; +} + +},{}],18:[function(require,module,exports){ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],19:[function(require,module,exports){ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} + +},{}],20:[function(require,module,exports){ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],21:[function(require,module,exports){ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + +},{}],22:[function(require,module,exports){ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],24:[function(require,module,exports){ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],25:[function(require,module,exports){ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],26:[function(require,module,exports){ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],27:[function(require,module,exports){ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; + +},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],29:[function(require,module,exports){ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],30:[function(require,module,exports){ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} + +},{}],31:[function(require,module,exports){ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + +},{}],32:[function(require,module,exports){ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],33:[function(require,module,exports){ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}).filter(notProto), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties).filter(notProto), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { + return p !== '__proto__'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],34:[function(require,module,exports){ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} + +},{}],37:[function(require,module,exports){ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],38:[function(require,module,exports){ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [""]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; + } + out += ' if (' + ($coerced) + ' !== undefined) ; '; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($type == 'string') { + out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' else { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } if (' + ($coerced) + ' !== undefined) { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} + +},{}],39:[function(require,module,exports){ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i 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 }); + +}))); + + +},{}],"ajv":[function(require,module,exports){ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + if (opts.keywords) addInitialKeywords(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,z)+Q(l,N)+Q(m,q)+Q(v,T)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema: ",c+=y?"validate.schema"+p:""+d,c+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" } ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0 "+o.length+") { for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } } ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+=" ) ");var d=d||[];d.push(t+=" ) { "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+=" } "),(s=s||[]).push(i+=" if (!"+f+") { "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema: ",i+=m?"validate.schema"+u:""+c,i+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[""],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0; ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!Z(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; var "+F+" = undefined; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+") && "+f+".length == 1) { "+f+" = "+f+"[0]; "+_+" = typeof "+f+"; if ("+a.util.checkDataType(a.schema.type,f,a.opts.strictNumbers)+") "+F+" = "+f+"; } "),r+=" if ("+F+" !== undefined) ; ";var x=g;if(x)for(var R,$=-1,j=x.length-1;$= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1>1,e+=k(e/r);455k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(pk(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=z(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");pk((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(RA&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($>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 p(e){for(var r="",t=0,a=e.length;tA-Z\\x5E-\\x7E]",'[\\"\\\\]')),Y=new RegExp(K,"g"),W=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),X=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',G),"g"),ee=new RegExp(J("[^]",K,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),re=ee;function te(e){var r=p(e);return r.match(Y)?r:e}var ae={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n); + + message: string; + errors: Array; + ajv: true; + validation: true; + } + + class MissingRefError extends Error { + constructor(baseId: string, ref: string, message?: string); + static message: (baseId: string, ref: string) => string; + + message: string; + missingRef: string; + missingSchema: string; + } +} + +declare namespace ajv { + type ValidationError = AjvErrors.ValidationError; + + type MissingRefError = AjvErrors.MissingRefError; + + interface Ajv { + /** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key, [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize by default). + * @param {string|object|Boolean} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ + validate(schemaKeyRef: object | string | boolean, data: any): boolean | PromiseLike; + /** + * Create validating function for passed schema. + * @param {object|Boolean} schema schema object + * @return {Function} validating function + */ + compile(schema: object | boolean): ValidateFunction; + /** + * Creates validating function for passed schema with asynchronous loading of missing schemas. + * `loadSchema` option should be a function that accepts schema uri and node-style callback. + * @this Ajv + * @param {object|Boolean} schema schema object + * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped + * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function. + * @return {PromiseLike} validating function + */ + compileAsync(schema: object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): PromiseLike; + /** + * Adds schema to the instance. + * @param {object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {string} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @return {Ajv} this for method chaining + */ + addSchema(schema: Array | object, key?: string): Ajv; + /** + * Add schema that will be used to validate other schemas + * options in META_IGNORE_OPTIONS are alway set to false + * @param {object} schema schema object + * @param {string} key optional schema key + * @return {Ajv} this for method chaining + */ + addMetaSchema(schema: object, key?: string): Ajv; + /** + * Validate schema + * @param {object|Boolean} schema schema to validate + * @return {Boolean} true if schema is valid + */ + validateSchema(schema: object | boolean): boolean; + /** + * Get compiled schema from the instance by `key` or `ref`. + * @param {string} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). + * @return {Function} schema validating function (with property `schema`). Returns undefined if keyRef can't be resolved to an existing schema. + */ + getSchema(keyRef: string): ValidateFunction | undefined; + /** + * Remove cached schema(s). + * If no parameter is passed all schemas but meta-schemas are removed. + * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + * @param {string|object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object + * @return {Ajv} this for method chaining + */ + removeSchema(schemaKeyRef?: object | string | RegExp | boolean): Ajv; + /** + * Add custom format + * @param {string} name format name + * @param {string|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) + * @return {Ajv} this for method chaining + */ + addFormat(name: string, format: FormatValidator | FormatDefinition): Ajv; + /** + * Define custom keyword + * @this Ajv + * @param {string} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords. + * @param {object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ + addKeyword(keyword: string, definition: KeywordDefinition): Ajv; + /** + * Get keyword definition + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise. + */ + getKeyword(keyword: string): object | boolean; + /** + * Remove keyword + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {Ajv} this for method chaining + */ + removeKeyword(keyword: string): Ajv; + /** + * Validate keyword + * @this Ajv + * @param {object} definition keyword definition object + * @param {boolean} throwError true to throw exception if definition is invalid + * @return {boolean} validation result + */ + validateKeyword(definition: KeywordDefinition, throwError: boolean): boolean; + /** + * Convert array of error message objects to string + * @param {Array} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {object} options optional options with properties `separator` and `dataVar`. + * @return {string} human readable string with all errors descriptions + */ + errorsText(errors?: Array | null, options?: ErrorsTextOptions): string; + errors?: Array | null; + _opts: Options; + } + + interface CustomLogger { + log(...args: any[]): any; + warn(...args: any[]): any; + error(...args: any[]): any; + } + + interface ValidateFunction { + ( + data: any, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + schema?: object | boolean; + errors?: null | Array; + refs?: object; + refVal?: Array; + root?: ValidateFunction | object; + $async?: true; + source?: object; + } + + interface Options { + $data?: boolean; + allErrors?: boolean; + verbose?: boolean; + jsonPointers?: boolean; + uniqueItems?: boolean; + unicode?: boolean; + format?: false | string; + formats?: object; + keywords?: object; + unknownFormats?: true | string[] | 'ignore'; + schemas?: Array | object; + schemaId?: '$id' | 'id' | 'auto'; + missingRefs?: true | 'ignore' | 'fail'; + extendRefs?: true | 'ignore' | 'fail'; + loadSchema?: (uri: string, cb?: (err: Error, schema: object) => void) => PromiseLike; + removeAdditional?: boolean | 'all' | 'failing'; + useDefaults?: boolean | 'empty' | 'shared'; + coerceTypes?: boolean | 'array'; + strictDefaults?: boolean | 'log'; + strictKeywords?: boolean | 'log'; + strictNumbers?: boolean; + async?: boolean | string; + transpile?: string | ((code: string) => string); + meta?: boolean | object; + validateSchema?: boolean | 'log'; + addUsedSchema?: boolean; + inlineRefs?: boolean | number; + passContext?: boolean; + loopRequired?: number; + ownProperties?: boolean; + multipleOfPrecision?: boolean | number; + errorDataPath?: string, + messages?: boolean; + sourceCode?: boolean; + processCode?: (code: string, schema: object) => string; + cache?: object; + logger?: CustomLogger | false; + nullable?: boolean; + serialize?: ((schema: object | boolean) => any) | false; + } + + type FormatValidator = string | RegExp | ((data: string) => boolean | PromiseLike); + type NumberFormatValidator = ((data: number) => boolean | PromiseLike); + + interface NumberFormatDefinition { + type: "number", + validate: NumberFormatValidator; + compare?: (data1: number, data2: number) => number; + async?: boolean; + } + + interface StringFormatDefinition { + type?: "string", + validate: FormatValidator; + compare?: (data1: string, data2: string) => number; + async?: boolean; + } + + type FormatDefinition = NumberFormatDefinition | StringFormatDefinition; + + interface KeywordDefinition { + type?: string | Array; + async?: boolean; + $data?: boolean; + errors?: boolean | string; + metaSchema?: object; + // schema: false makes validate not to expect schema (ValidateFunction) + schema?: boolean; + statements?: boolean; + dependencies?: Array; + modifying?: boolean; + valid?: boolean; + // one and only one of the following properties should be present + validate?: SchemaValidateFunction | ValidateFunction; + compile?: (schema: any, parentSchema: object, it: CompilationContext) => ValidateFunction; + macro?: (schema: any, parentSchema: object, it: CompilationContext) => object | boolean; + inline?: (it: CompilationContext, keyword: string, schema: any, parentSchema: object) => string; + } + + interface CompilationContext { + level: number; + dataLevel: number; + dataPathArr: string[]; + schema: any; + schemaPath: string; + baseId: string; + async: boolean; + opts: Options; + formats: { + [index: string]: FormatDefinition | undefined; + }; + keywords: { + [index: string]: KeywordDefinition | undefined; + }; + compositeRule: boolean; + validate: (schema: object) => boolean; + util: { + copy(obj: any, target?: any): any; + toHash(source: string[]): { [index: string]: true | undefined }; + equal(obj: any, target: any): boolean; + getProperty(str: string): string; + schemaHasRules(schema: object, rules: any): string; + escapeQuotes(str: string): string; + toQuotedString(str: string): string; + getData(jsonPointer: string, dataLevel: number, paths: string[]): string; + escapeJsonPointer(str: string): string; + unescapeJsonPointer(str: string): string; + escapeFragment(str: string): string; + unescapeFragment(str: string): string; + }; + self: Ajv; + } + + interface SchemaValidateFunction { + ( + schema: any, + data: any, + parentSchema?: object, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + errors?: Array; + } + + interface ErrorsTextOptions { + separator?: string; + dataVar?: string; + } + + interface ErrorObject { + keyword: string; + dataPath: string; + schemaPath: string; + params: ErrorParameters; + // Added to validation errors of propertyNames keyword schema + propertyName?: string; + // Excluded if messages set to false. + message?: string; + // These are added with the `verbose` option. + schema?: any; + parentSchema?: object; + data?: any; + } + + type ErrorParameters = RefParams | LimitParams | AdditionalPropertiesParams | + DependenciesParams | FormatParams | ComparisonParams | + MultipleOfParams | PatternParams | RequiredParams | + TypeParams | UniqueItemsParams | CustomParams | + PatternRequiredParams | PropertyNamesParams | + IfParams | SwitchParams | NoParams | EnumParams; + + interface RefParams { + ref: string; + } + + interface LimitParams { + limit: number; + } + + interface AdditionalPropertiesParams { + additionalProperty: string; + } + + interface DependenciesParams { + property: string; + missingProperty: string; + depsCount: number; + deps: string; + } + + interface FormatParams { + format: string + } + + interface ComparisonParams { + comparison: string; + limit: number | string; + exclusive: boolean; + } + + interface MultipleOfParams { + multipleOf: number; + } + + interface PatternParams { + pattern: string; + } + + interface RequiredParams { + missingProperty: string; + } + + interface TypeParams { + type: string; + } + + interface UniqueItemsParams { + i: number; + j: number; + } + + interface CustomParams { + keyword: string; + } + + interface PatternRequiredParams { + missingPattern: string; + } + + interface PropertyNamesParams { + propertyName: string; + } + + interface IfParams { + failingKeyword: string; + } + + interface SwitchParams { + caseIndex: number; + } + + interface NoParams { } + + interface EnumParams { + allowedValues: Array; + } +} + +export = ajv; diff --git a/node_modules/ajv/lib/ajv.js b/node_modules/ajv/lib/ajv.js new file mode 100644 index 00000000..06a45b65 --- /dev/null +++ b/node_modules/ajv/lib/ajv.js @@ -0,0 +1,506 @@ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + if (opts.keywords) addInitialKeywords(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: HOSTNAME, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} diff --git a/node_modules/ajv/lib/compile/index.js b/node_modules/ajv/lib/compile/index.js new file mode 100644 index 00000000..97518c42 --- /dev/null +++ b/node_modules/ajv/lib/compile/index.js @@ -0,0 +1,387 @@ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; diff --git a/node_modules/ajv/lib/compile/util.js b/node_modules/ajv/lib/compile/util.js new file mode 100644 index 00000000..ef07b8c7 --- /dev/null +++ b/node_modules/ajv/lib/compile/util.js @@ -0,0 +1,239 @@ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, strictNumbers, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data, strictNumbers) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i' + , $notOp = $isMax ? '>' : '<' + , $errorKeyword = undefined; + + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined + || typeof $schemaExcl == 'number' + || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } +}} + +{{? $isDataExcl }} + {{ + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr) + , $exclusive = 'exclusive' + $lvl + , $exclType = 'exclType' + $lvl + , $exclIsNumber = 'exclIsNumber' + $lvl + , $opExpr = 'op' + $lvl + , $opStr = '\' + ' + $opExpr + ' + \''; + }} + var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}}; + {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} + + var {{=$exclusive}}; + var {{=$exclType}} = typeof {{=$schemaValueExcl}}; + if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') { + {{ var $errorKeyword = $exclusiveKeyword; }} + {{# def.error:'_exclusiveLimit' }} + } else if ({{# def.$dataNotType:'number' }} + {{=$exclType}} == 'number' + ? ( + ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}}) + ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + : ( + ({{=$exclusive}} = {{=$schemaValueExcl}} === true) + ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + || {{=$data}} !== {{=$data}}) { + var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}='; + {{ + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + }} +{{??}} + {{ + var $exclIsNumber = typeof $schemaExcl == 'number' + , $opStr = $op; /*used in error*/ + }} + + {{? $exclIsNumber && $isData }} + {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }} + if ({{# def.$dataNotType:'number' }} + ( {{=$schemaValue}} === undefined + || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}} + ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} ) + || {{=$data}} !== {{=$data}}) { + {{??}} + {{ + if ($exclIsNumber && $schema === undefined) { + {{# def.setExclusiveLimit }} + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) + $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + {{# def.setExclusiveLimit }} + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + + var $opExpr = '\'' + $opStr + '\''; /*used in error*/ + }} + + if ({{# def.$dataNotType:'number' }} + {{=$data}} {{=$notOp}} {{=$schemaValue}} + || {{=$data}} !== {{=$data}}) { + {{?}} +{{?}} + {{ $errorKeyword = $errorKeyword || $keyword; }} + {{# def.error:'_limit' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitItems.jst b/node_modules/ajv/lib/dot/_limitItems.jst new file mode 100644 index 00000000..741329e7 --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitItems.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitItems' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitLength.jst b/node_modules/ajv/lib/dot/_limitLength.jst new file mode 100644 index 00000000..285c66bd --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitLength.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitLength' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitProperties.jst b/node_modules/ajv/lib/dot/_limitProperties.jst new file mode 100644 index 00000000..c4c21551 --- /dev/null +++ b/node_modules/ajv/lib/dot/_limitProperties.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitProperties' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/allOf.jst b/node_modules/ajv/lib/dot/allOf.jst new file mode 100644 index 00000000..0e782fe9 --- /dev/null +++ b/node_modules/ajv/lib/dot/allOf.jst @@ -0,0 +1,32 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $allSchemasEmpty = true; +}} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{# def.ifResultValid }} + {{?}} +{{~}} + +{{? $breakOnError }} + {{? $allSchemasEmpty }} + if (true) { + {{??}} + {{= $closingBraces.slice(0,-1) }} + {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/anyOf.jst b/node_modules/ajv/lib/dot/anyOf.jst new file mode 100644 index 00000000..ea909ee6 --- /dev/null +++ b/node_modules/ajv/lib/dot/anyOf.jst @@ -0,0 +1,46 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $noEmptySchema = $schema.every(function($sch) { + return {{# def.nonEmptySchema:$sch }}; + }); +}} +{{? $noEmptySchema }} + {{ var $currentBaseId = $it.baseId; }} + var {{=$errs}} = errors; + var {{=$valid}} = false; + + {{# def.setCompositeRule }} + + {{~ $schema:$sch:$i }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{=$valid}} = {{=$valid}} || {{=$nextValid}}; + + if (!{{=$valid}}) { + {{ $closingBraces += '}'; }} + {{~}} + + {{# def.resetCompositeRule }} + + {{= $closingBraces }} + + if (!{{=$valid}}) { + {{# def.extraError:'anyOf' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/coerce.def b/node_modules/ajv/lib/dot/coerce.def new file mode 100644 index 00000000..c947ed6a --- /dev/null +++ b/node_modules/ajv/lib/dot/coerce.def @@ -0,0 +1,51 @@ +{{## def.coerceType: + {{ + var $dataType = 'dataType' + $lvl + , $coerced = 'coerced' + $lvl; + }} + var {{=$dataType}} = typeof {{=$data}}; + var {{=$coerced}} = undefined; + + {{? it.opts.coerceTypes == 'array' }} + if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) { + {{=$data}} = {{=$data}}[0]; + {{=$dataType}} = typeof {{=$data}}; + if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}}; + } + {{?}} + + if ({{=$coerced}} !== undefined) ; + {{~ $coerceToTypes:$type:$i }} + {{? $type == 'string' }} + else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean') + {{=$coerced}} = '' + {{=$data}}; + else if ({{=$data}} === null) {{=$coerced}} = ''; + {{?? $type == 'number' || $type == 'integer' }} + else if ({{=$dataType}} == 'boolean' || {{=$data}} === null + || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}} + {{? $type == 'integer' }} && !({{=$data}} % 1){{?}})) + {{=$coerced}} = +{{=$data}}; + {{?? $type == 'boolean' }} + else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null) + {{=$coerced}} = false; + else if ({{=$data}} === 'true' || {{=$data}} === 1) + {{=$coerced}} = true; + {{?? $type == 'null' }} + else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false) + {{=$coerced}} = null; + {{?? it.opts.coerceTypes == 'array' && $type == 'array' }} + else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null) + {{=$coerced}} = [{{=$data}}]; + {{?}} + {{~}} + else { + {{# def.error:'type' }} + } + + if ({{=$coerced}} !== undefined) { + {{# def.setParentData }} + {{=$data}} = {{=$coerced}}; + {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}} + {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}}; + } +#}} diff --git a/node_modules/ajv/lib/dot/comment.jst b/node_modules/ajv/lib/dot/comment.jst new file mode 100644 index 00000000..f9591503 --- /dev/null +++ b/node_modules/ajv/lib/dot/comment.jst @@ -0,0 +1,9 @@ +{{# def.definitions }} +{{# def.setupKeyword }} + +{{ var $comment = it.util.toQuotedString($schema); }} +{{? it.opts.$comment === true }} + console.log({{=$comment}}); +{{?? typeof it.opts.$comment == 'function' }} + self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema); +{{?}} diff --git a/node_modules/ajv/lib/dot/const.jst b/node_modules/ajv/lib/dot/const.jst new file mode 100644 index 00000000..2aa22980 --- /dev/null +++ b/node_modules/ajv/lib/dot/const.jst @@ -0,0 +1,11 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{? !$isData }} + var schema{{=$lvl}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}}); +{{# def.checkError:'const' }} +{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/contains.jst b/node_modules/ajv/lib/dot/contains.jst new file mode 100644 index 00000000..4dc99674 --- /dev/null +++ b/node_modules/ajv/lib/dot/contains.jst @@ -0,0 +1,55 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId + , $nonEmptySchema = {{# def.nonEmptySchema:$schema }}; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? $nonEmptySchema }} + {{# def.setCompositeRule }} + + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$nextValid}} = false; + + for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + if ({{=$nextValid}}) break; + } + + {{# def.resetCompositeRule }} + {{= $closingBraces }} + + if (!{{=$nextValid}}) { +{{??}} + if ({{=$data}}.length == 0) { +{{?}} + + {{# def.error:'contains' }} + } else { + {{? $nonEmptySchema }} + {{# def.resetErrors }} + {{?}} + {{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/custom.jst b/node_modules/ajv/lib/dot/custom.jst new file mode 100644 index 00000000..d30588fb --- /dev/null +++ b/node_modules/ajv/lib/dot/custom.jst @@ -0,0 +1,191 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $rule = this + , $definition = 'definition' + $lvl + , $rDef = $rule.definition + , $closingBraces = ''; + var $validate = $rDef.validate; + var $compile, $inline, $macro, $ruleValidate, $validateCode; +}} + +{{? $isData && $rDef.$data }} + {{ + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + }} + var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition; + var {{=$validateCode}} = {{=$definition}}.validate; +{{??}} + {{ + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + }} +{{?}} + +{{ + var $ruleErrs = $validateCode + '.errors' + , $i = 'i' + $lvl + , $ruleErr = 'ruleErr' + $lvl + , $asyncKeyword = $rDef.async; + + if ($asyncKeyword && !it.async) + throw new Error('async keyword in sync schema'); +}} + + +{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}} +var {{=$errs}} = errors; +var {{=$valid}}; + +{{## def.callRuleValidate: + {{=$validateCode}}.call( + {{? it.opts.passContext }}this{{??}}self{{?}} + {{? $compile || $rDef.schema === false }} + , {{=$data}} + {{??}} + , {{=$schemaValue}} + , {{=$data}} + , validate.schema{{=it.schemaPath}} + {{?}} + , {{# def.dataPath }} + {{# def.passParentData }} + , rootData + ) +#}} + +{{## def.extendErrors:_inline: + for (var {{=$i}}={{=$errs}}; {{=$i}} 0) + || _schema === false + : it.util.schemaHasRules(_schema, it.RULES.all)) +#}} + + +{{## def.strLength: + {{? it.opts.unicode === false }} + {{=$data}}.length + {{??}} + ucs2length({{=$data}}) + {{?}} +#}} + + +{{## def.willOptimize: + it.util.varOccurences($code, $nextData) < 2 +#}} + + +{{## def.generateSubschemaCode: + {{ + var $code = it.validate($it); + $it.baseId = $currentBaseId; + }} +#}} + + +{{## def.insertSubschemaCode: + {{= it.validate($it) }} + {{ $it.baseId = $currentBaseId; }} +#}} + + +{{## def._optimizeValidate: + it.util.varReplace($code, $nextData, $passData) +#}} + + +{{## def.optimizeValidate: + {{? {{# def.willOptimize}} }} + {{= {{# def._optimizeValidate }} }} + {{??}} + var {{=$nextData}} = {{=$passData}}; + {{= $code }} + {{?}} +#}} + + +{{## def.$data: + {{ + var $isData = it.opts.$data && $schema && $schema.$data + , $schemaValue; + }} + {{? $isData }} + var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }}; + {{ $schemaValue = 'schema' + $lvl; }} + {{??}} + {{ $schemaValue = $schema; }} + {{?}} +#}} + + +{{## def.$dataNotType:_type: + {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}} +#}} + + +{{## def.check$dataIsArray: + if (schema{{=$lvl}} === undefined) {{=$valid}} = true; + else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false; + else { +#}} + + +{{## def.numberKeyword: + {{? !($isData || typeof $schema == 'number') }} + {{ throw new Error($keyword + ' must be number'); }} + {{?}} +#}} + + +{{## def.beginDefOut: + {{ + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + }} +#}} + + +{{## def.storeDefOut:_variable: + {{ + var _variable = out; + out = $$outStack.pop(); + }} +#}} + + +{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}} + +{{## def.setParentData: + {{ + var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData' + , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + }} +#}} + +{{## def.passParentData: + {{# def.setParentData }} + , {{= $parentData }} + , {{= $parentDataProperty }} +#}} + + +{{## def.iterateProperties: + {{? $ownProperties }} + {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); + for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { + var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; + {{??}} + for (var {{=$key}} in {{=$data}}) { + {{?}} +#}} + + +{{## def.noPropertyInData: + {{=$useData}} === undefined + {{? $ownProperties }} + || !{{# def.isOwnProperty }} + {{?}} +#}} + + +{{## def.isOwnProperty: + Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') +#}} diff --git a/node_modules/ajv/lib/dot/dependencies.jst b/node_modules/ajv/lib/dot/dependencies.jst new file mode 100644 index 00000000..e4bdddec --- /dev/null +++ b/node_modules/ajv/lib/dot/dependencies.jst @@ -0,0 +1,79 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.missing }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.propertyInData: + {{=$data}}{{= it.util.getProperty($property) }} !== undefined + {{? $ownProperties }} + && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}') + {{?}} +#}} + + +{{ + var $schemaDeps = {} + , $propertyDeps = {} + , $ownProperties = it.opts.ownProperties; + + for ($property in $schema) { + if ($property == '__proto__') continue; + var $sch = $schema[$property]; + var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; + $deps[$property] = $sch; + } +}} + +var {{=$errs}} = errors; + +{{ var $currentErrorPath = it.errorPath; }} + +var missing{{=$lvl}}; +{{ for (var $property in $propertyDeps) { }} + {{ $deps = $propertyDeps[$property]; }} + {{? $deps.length }} + if ({{# def.propertyInData }} + {{? $breakOnError }} + && ({{# def.checkMissingProperty:$deps }})) { + {{# def.errorMissingProperty:'dependencies' }} + {{??}} + ) { + {{~ $deps:$propertyKey }} + {{# def.allErrorsMissingProperty:'dependencies' }} + {{~}} + {{?}} + } {{# def.elseIfValid }} + {{?}} +{{ } }} + +{{ + it.errorPath = $currentErrorPath; + var $currentBaseId = $it.baseId; +}} + + +{{ for (var $property in $schemaDeps) { }} + {{ var $sch = $schemaDeps[$property]; }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{# def.propertyInData }}) { + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + }} + + {{# def.insertSubschemaCode }} + } + + {{# def.ifResultValid }} + {{?}} +{{ } }} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_modules/ajv/lib/dot/enum.jst b/node_modules/ajv/lib/dot/enum.jst new file mode 100644 index 00000000..357c2e8c --- /dev/null +++ b/node_modules/ajv/lib/dot/enum.jst @@ -0,0 +1,30 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $i = 'i' + $lvl + , $vSchema = 'schema' + $lvl; +}} + +{{? !$isData }} + var {{=$vSchema}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}}; + +{{?$isData}}{{# def.check$dataIsArray }}{{?}} + +{{=$valid}} = false; + +for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++) + if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) { + {{=$valid}} = true; + break; + } + +{{? $isData }} } {{?}} + +{{# def.checkError:'enum' }} + +{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/errors.def b/node_modules/ajv/lib/dot/errors.def new file mode 100644 index 00000000..5c5752cb --- /dev/null +++ b/node_modules/ajv/lib/dot/errors.def @@ -0,0 +1,194 @@ +{{# def.definitions }} + +{{## def._error:_rule: + {{ 'istanbul ignore else'; }} + {{? it.createErrors !== false }} + { + keyword: '{{= $errorKeyword || _rule }}' + , dataPath: (dataPath || '') + {{= it.errorPath }} + , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}} + , params: {{# def._errorParams[_rule] }} + {{? it.opts.messages !== false }} + , message: {{# def._errorMessages[_rule] }} + {{?}} + {{? it.opts.verbose }} + , schema: {{# def._errorSchemas[_rule] }} + , parentSchema: validate.schema{{=it.schemaPath}} + , data: {{=$data}} + {{?}} + } + {{??}} + {} + {{?}} +#}} + + +{{## def._addError:_rule: + if (vErrors === null) vErrors = [err]; + else vErrors.push(err); + errors++; +#}} + + +{{## def.addError:_rule: + var err = {{# def._error:_rule }}; + {{# def._addError:_rule }} +#}} + + +{{## def.error:_rule: + {{# def.beginDefOut}} + {{# def._error:_rule }} + {{# def.storeDefOut:__err }} + + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError([{{=__err}}]); + {{??}} + validate.errors = [{{=__err}}]; + return false; + {{?}} + {{??}} + var err = {{=__err}}; + {{# def._addError:_rule }} + {{?}} +#}} + + +{{## def.extraError:_rule: + {{# def.addError:_rule}} + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError(vErrors); + {{??}} + validate.errors = vErrors; + return false; + {{?}} + {{?}} +#}} + + +{{## def.checkError:_rule: + if (!{{=$valid}}) { + {{# def.error:_rule }} + } +#}} + + +{{## def.resetErrors: + errors = {{=$errs}}; + if (vErrors !== null) { + if ({{=$errs}}) vErrors.length = {{=$errs}}; + else vErrors = null; + } +#}} + + +{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}} +{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}} +{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}} + +{{## def._errorMessages = { + 'false schema': "'boolean schema is false'", + $ref: "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'", + additionalItems: "'should NOT have more than {{=$schema.length}} items'", + additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'", + anyOf: "'should match some schema in anyOf'", + const: "'should be equal to constant'", + contains: "'should contain a valid item'", + dependencies: "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'", + 'enum': "'should be equal to one of the allowed values'", + format: "'should match format \"{{#def.concatSchemaEQ}}\"'", + 'if': "'should match \"' + {{=$ifClause}} + '\" schema'", + _limit: "'should be {{=$opStr}} {{#def.appendSchema}}", + _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'", + _limitItems: "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'", + _limitLength: "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'", + _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'", + multipleOf: "'should be multiple of {{#def.appendSchema}}", + not: "'should NOT be valid'", + oneOf: "'should match exactly one schema in oneOf'", + pattern: "'should match pattern \"{{#def.concatSchemaEQ}}\"'", + propertyNames: "'property name \\'{{=$invalidName}}\\' is invalid'", + required: "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'", + type: "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'", + uniqueItems: "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'", + custom: "'should pass \"{{=$rule.keyword}}\" keyword validation'", + patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''", + switch: "'should pass \"switch\" keyword validation'", + _formatLimit: "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'", + _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'" +} #}} + + +{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}} +{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorSchemas = { + 'false schema': "false", + $ref: "{{=it.util.toQuotedString($schema)}}", + additionalItems: "false", + additionalProperties: "false", + anyOf: "validate.schema{{=$schemaPath}}", + const: "validate.schema{{=$schemaPath}}", + contains: "validate.schema{{=$schemaPath}}", + dependencies: "validate.schema{{=$schemaPath}}", + 'enum': "validate.schema{{=$schemaPath}}", + format: "{{#def.schemaRefOrQS}}", + 'if': "validate.schema{{=$schemaPath}}", + _limit: "{{#def.schemaRefOrVal}}", + _exclusiveLimit: "validate.schema{{=$schemaPath}}", + _limitItems: "{{#def.schemaRefOrVal}}", + _limitLength: "{{#def.schemaRefOrVal}}", + _limitProperties:"{{#def.schemaRefOrVal}}", + multipleOf: "{{#def.schemaRefOrVal}}", + not: "validate.schema{{=$schemaPath}}", + oneOf: "validate.schema{{=$schemaPath}}", + pattern: "{{#def.schemaRefOrQS}}", + propertyNames: "validate.schema{{=$schemaPath}}", + required: "validate.schema{{=$schemaPath}}", + type: "validate.schema{{=$schemaPath}}", + uniqueItems: "{{#def.schemaRefOrVal}}", + custom: "validate.schema{{=$schemaPath}}", + patternRequired: "validate.schema{{=$schemaPath}}", + switch: "validate.schema{{=$schemaPath}}", + _formatLimit: "{{#def.schemaRefOrQS}}", + _formatExclusiveLimit: "validate.schema{{=$schemaPath}}" +} #}} + + +{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorParams = { + 'false schema': "{}", + $ref: "{ ref: '{{=it.util.escapeQuotes($schema)}}' }", + additionalItems: "{ limit: {{=$schema.length}} }", + additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }", + anyOf: "{}", + const: "{ allowedValue: schema{{=$lvl}} }", + contains: "{}", + dependencies: "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }", + 'enum': "{ allowedValues: schema{{=$lvl}} }", + format: "{ format: {{#def.schemaValueQS}} }", + 'if': "{ failingKeyword: {{=$ifClause}} }", + _limit: "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }", + _exclusiveLimit: "{}", + _limitItems: "{ limit: {{=$schemaValue}} }", + _limitLength: "{ limit: {{=$schemaValue}} }", + _limitProperties:"{ limit: {{=$schemaValue}} }", + multipleOf: "{ multipleOf: {{=$schemaValue}} }", + not: "{}", + oneOf: "{ passingSchemas: {{=$passingSchemas}} }", + pattern: "{ pattern: {{#def.schemaValueQS}} }", + propertyNames: "{ propertyName: '{{=$invalidName}}' }", + required: "{ missingProperty: '{{=$missingProperty}}' }", + type: "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }", + uniqueItems: "{ i: i, j: j }", + custom: "{ keyword: '{{=$rule.keyword}}' }", + patternRequired: "{ missingPattern: '{{=$missingPattern}}' }", + switch: "{ caseIndex: {{=$caseIndex}} }", + _formatLimit: "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }", + _formatExclusiveLimit: "{}" +} #}} diff --git a/node_modules/ajv/lib/dot/format.jst b/node_modules/ajv/lib/dot/format.jst new file mode 100644 index 00000000..37f14da8 --- /dev/null +++ b/node_modules/ajv/lib/dot/format.jst @@ -0,0 +1,106 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} + +{{## def.skipFormat: + {{? $breakOnError }} if (true) { {{?}} + {{ return out; }} +#}} + +{{? it.opts.format === false }}{{# def.skipFormat }}{{?}} + + +{{# def.$data }} + + +{{## def.$dataCheckFormat: + {{# def.$dataNotType:'string' }} + ({{? $unknownFormats != 'ignore' }} + ({{=$schemaValue}} && !{{=$format}} + {{? $allowUnknown }} + && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1 + {{?}}) || + {{?}} + ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}' + && !(typeof {{=$format}} == 'function' + ? {{? it.async}} + (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}})) + {{??}} + {{=$format}}({{=$data}}) + {{?}} + : {{=$format}}.test({{=$data}})))) +#}} + +{{## def.checkFormat: + {{ + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + }} + {{? typeof $format == 'function' }} + {{=$formatRef}}({{=$data}}) + {{??}} + {{=$formatRef}}.test({{=$data}}) + {{?}} +#}} + + +{{ + var $unknownFormats = it.opts.unknownFormats + , $allowUnknown = Array.isArray($unknownFormats); +}} + +{{? $isData }} + {{ + var $format = 'format' + $lvl + , $isObject = 'isObject' + $lvl + , $formatType = 'formatType' + $lvl; + }} + var {{=$format}} = formats[{{=$schemaValue}}]; + var {{=$isObject}} = typeof {{=$format}} == 'object' + && !({{=$format}} instanceof RegExp) + && {{=$format}}.validate; + var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string'; + if ({{=$isObject}}) { + {{? it.async}} + var async{{=$lvl}} = {{=$format}}.async; + {{?}} + {{=$format}} = {{=$format}}.validate; + } + if ({{# def.$dataCheckFormat }}) { +{{??}} + {{ var $format = it.formats[$schema]; }} + {{? !$format }} + {{? $unknownFormats == 'ignore' }} + {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }} + {{# def.skipFormat }} + {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }} + {{# def.skipFormat }} + {{??}} + {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }} + {{?}} + {{?}} + {{ + var $isObject = typeof $format == 'object' + && !($format instanceof RegExp) + && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + }} + {{? $formatType != $ruleType }} + {{# def.skipFormat }} + {{?}} + {{? $async }} + {{ + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + }} + if (!(await {{=$formatRef}}({{=$data}}))) { + {{??}} + if (!{{# def.checkFormat }}) { + {{?}} +{{?}} + {{# def.error:'format' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/if.jst b/node_modules/ajv/lib/dot/if.jst new file mode 100644 index 00000000..adb50361 --- /dev/null +++ b/node_modules/ajv/lib/dot/if.jst @@ -0,0 +1,73 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateIfClause:_clause: + {{ + $it.schema = it.schema['_clause']; + $it.schemaPath = it.schemaPath + '._clause'; + $it.errSchemaPath = it.errSchemaPath + '/_clause'; + }} + {{# def.insertSubschemaCode }} + {{=$valid}} = {{=$nextValid}}; + {{? $thenPresent && $elsePresent }} + {{ $ifClause = 'ifClause' + $lvl; }} + var {{=$ifClause}} = '_clause'; + {{??}} + {{ $ifClause = '\'_clause\''; }} + {{?}} +#}} + +{{ + var $thenSch = it.schema['then'] + , $elseSch = it.schema['else'] + , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }} + , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }} + , $currentBaseId = $it.baseId; +}} + +{{? $thenPresent || $elsePresent }} + {{ + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + var {{=$errs}} = errors; + var {{=$valid}} = true; + + {{# def.setCompositeRule }} + {{# def.insertSubschemaCode }} + {{ $it.createErrors = true; }} + {{# def.resetErrors }} + {{# def.resetCompositeRule }} + + {{? $thenPresent }} + if ({{=$nextValid}}) { + {{# def.validateIfClause:then }} + } + {{? $elsePresent }} + else { + {{?}} + {{??}} + if (!{{=$nextValid}}) { + {{?}} + + {{? $elsePresent }} + {{# def.validateIfClause:else }} + } + {{?}} + + if (!{{=$valid}}) { + {{# def.extraError:'if' }} + } + {{? $breakOnError }} else { {{?}} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} + diff --git a/node_modules/ajv/lib/dot/items.jst b/node_modules/ajv/lib/dot/items.jst new file mode 100644 index 00000000..acc932a2 --- /dev/null +++ b/node_modules/ajv/lib/dot/items.jst @@ -0,0 +1,98 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateItems:startFrom: + for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} + if (!{{=$nextValid}}) break; + {{?}} + } +#}} + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? Array.isArray($schema) }} + {{ /* 'items' is an array of schemas */}} + {{ var $additionalItems = it.schema.additionalItems; }} + {{? $additionalItems === false }} + {{=$valid}} = {{=$data}}.length <= {{= $schema.length }}; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{# def.checkError:'additionalItems' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{# def.elseIfValid}} + {{?}} + + {{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{=$i}}) { + {{ + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + } + + {{# def.ifResultValid }} + {{?}} + {{~}} + + {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }} + {{ + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{= $schema.length }}) { + {{# def.validateItems: $schema.length }} + } + + {{# def.ifResultValid }} + {{?}} + +{{?? {{# def.nonEmptySchema:$schema }} }} + {{ /* 'items' is a single schema */}} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + {{# def.validateItems: 0 }} +{{?}} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_modules/ajv/lib/dot/missing.def b/node_modules/ajv/lib/dot/missing.def new file mode 100644 index 00000000..a73b9f96 --- /dev/null +++ b/node_modules/ajv/lib/dot/missing.def @@ -0,0 +1,39 @@ +{{## def.checkMissingProperty:_properties: + {{~ _properties:$propertyKey:$i }} + {{?$i}} || {{?}} + {{ + var $prop = it.util.getProperty($propertyKey) + , $useData = $data + $prop; + }} + ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) ) + {{~}} +#}} + + +{{## def.errorMissingProperty:_error: + {{ + var $propertyPath = 'missing' + $lvl + , $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers + ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) + : $currentErrorPath + ' + ' + $propertyPath; + } + }} + {{# def.error:_error }} +#}} + + +{{## def.allErrorsMissingProperty:_error: + {{ + var $prop = it.util.getProperty($propertyKey) + , $missingProperty = it.util.escapeQuotes($propertyKey) + , $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + }} + if ({{# def.noPropertyInData }}) { + {{# def.addError:_error }} + } +#}} diff --git a/node_modules/ajv/lib/dot/multipleOf.jst b/node_modules/ajv/lib/dot/multipleOf.jst new file mode 100644 index 00000000..6d88a456 --- /dev/null +++ b/node_modules/ajv/lib/dot/multipleOf.jst @@ -0,0 +1,22 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +var division{{=$lvl}}; +if ({{?$isData}} + {{=$schemaValue}} !== undefined && ( + typeof {{=$schemaValue}} != 'number' || + {{?}} + (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}}, + {{? it.opts.multipleOfPrecision }} + Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}} + {{??}} + division{{=$lvl}} !== parseInt(division{{=$lvl}}) + {{?}} + ) + {{?$isData}} ) {{?}} ) { + {{# def.error:'multipleOf' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/not.jst b/node_modules/ajv/lib/dot/not.jst new file mode 100644 index 00000000..e03185ae --- /dev/null +++ b/node_modules/ajv/lib/dot/not.jst @@ -0,0 +1,43 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$errs}} = errors; + + {{# def.setCompositeRule }} + + {{ + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + }} + {{= it.validate($it) }} + {{ + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + }} + + {{# def.resetCompositeRule }} + + if ({{=$nextValid}}) { + {{# def.error:'not' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} +{{??}} + {{# def.addError:'not' }} + {{? $breakOnError}} + if (false) { + {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/oneOf.jst b/node_modules/ajv/lib/dot/oneOf.jst new file mode 100644 index 00000000..bcce2c6e --- /dev/null +++ b/node_modules/ajv/lib/dot/oneOf.jst @@ -0,0 +1,54 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $prevValid = 'prevValid' + $lvl + , $passingSchemas = 'passingSchemas' + $lvl; +}} + +var {{=$errs}} = errors + , {{=$prevValid}} = false + , {{=$valid}} = false + , {{=$passingSchemas}} = null; + +{{# def.setCompositeRule }} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + {{??}} + var {{=$nextValid}} = true; + {{?}} + + {{? $i }} + if ({{=$nextValid}} && {{=$prevValid}}) { + {{=$valid}} = false; + {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}]; + } else { + {{ $closingBraces += '}'; }} + {{?}} + + if ({{=$nextValid}}) { + {{=$valid}} = {{=$prevValid}} = true; + {{=$passingSchemas}} = {{=$i}}; + } +{{~}} + +{{# def.resetCompositeRule }} + +{{= $closingBraces }} + +if (!{{=$valid}}) { + {{# def.extraError:'oneOf' }} +} else { + {{# def.resetErrors }} +{{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/pattern.jst b/node_modules/ajv/lib/dot/pattern.jst new file mode 100644 index 00000000..3a37ef6c --- /dev/null +++ b/node_modules/ajv/lib/dot/pattern.jst @@ -0,0 +1,14 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $regexp = $isData + ? '(new RegExp(' + $schemaValue + '))' + : it.usePattern($schema); +}} + +if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) { + {{# def.error:'pattern' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/properties.jst b/node_modules/ajv/lib/dot/properties.jst new file mode 100644 index 00000000..5cebb9b1 --- /dev/null +++ b/node_modules/ajv/lib/dot/properties.jst @@ -0,0 +1,245 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateAdditional: + {{ /* additionalProperties is schema */ + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty + ? it.errorPath + : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} +#}} + + +{{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl; + + var $schemaKeys = Object.keys($schema || {}).filter(notProto) + , $pProperties = it.schema.patternProperties || {} + , $pPropertyKeys = Object.keys($pProperties).filter(notProto) + , $aProperties = it.schema.additionalProperties + , $someProperties = $schemaKeys.length || $pPropertyKeys.length + , $noAdditional = $aProperties === false + , $additionalIsSchema = typeof $aProperties == 'object' + && Object.keys($aProperties).length + , $removeAdditional = it.opts.removeAdditional + , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { return p !== '__proto__'; } +}} + + +var {{=$errs}} = errors; +var {{=$nextValid}} = true; +{{? $ownProperties }} + var {{=$dataProperties}} = undefined; +{{?}} + +{{? $checkAdditional }} + {{# def.iterateProperties }} + {{? $someProperties }} + var isAdditional{{=$lvl}} = !(false + {{? $schemaKeys.length }} + {{? $schemaKeys.length > 8 }} + || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}}) + {{??}} + {{~ $schemaKeys:$propertyKey }} + || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }} + {{~}} + {{?}} + {{?}} + {{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty:$i }} + || {{= it.usePattern($pProperty) }}.test({{=$key}}) + {{~}} + {{?}} + ); + + if (isAdditional{{=$lvl}}) { + {{?}} + {{? $removeAdditional == 'all' }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{ + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + }} + {{? $noAdditional }} + {{? $removeAdditional }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{=$nextValid}} = false; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + }} + {{# def.error:'additionalProperties' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{? $breakOnError }} break; {{?}} + {{?}} + {{?? $additionalIsSchema }} + {{? $removeAdditional == 'failing' }} + var {{=$errs}} = errors; + {{# def.setCompositeRule }} + + {{# def.validateAdditional }} + + if (!{{=$nextValid}}) { + errors = {{=$errs}}; + if (validate.errors !== null) { + if (errors) validate.errors.length = errors; + else validate.errors = null; + } + delete {{=$data}}[{{=$key}}]; + } + + {{# def.resetCompositeRule }} + {{??}} + {{# def.validateAdditional }} + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + {{?}} + {{?}} + {{ it.errorPath = $currentErrorPath; }} + {{?}} + {{? $someProperties }} + } + {{?}} + } + + {{# def.ifResultValid }} +{{?}} + +{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }} + +{{? $schemaKeys.length }} + {{~ $schemaKeys:$propertyKey }} + {{ var $sch = $schema[$propertyKey]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + var $prop = it.util.getProperty($propertyKey) + , $passData = $data + $prop + , $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + }} + + {{# def.generateSubschemaCode }} + + {{? {{# def.willOptimize }} }} + {{ + $code = {{# def._optimizeValidate }}; + var $useData = $passData; + }} + {{??}} + {{ var $useData = $nextData; }} + var {{=$nextData}} = {{=$passData}}; + {{?}} + + {{? $hasDefault }} + {{= $code }} + {{??}} + {{? $requiredHash && $requiredHash[$propertyKey] }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = false; + {{ + var $currentErrorPath = it.errorPath + , $currErrSchemaPath = $errSchemaPath + , $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + }} + {{# def.error:'required' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{ it.errorPath = $currentErrorPath; }} + } else { + {{??}} + {{? $breakOnError }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = true; + } else { + {{??}} + if ({{=$useData}} !== undefined + {{? $ownProperties }} + && {{# def.isOwnProperty }} + {{?}} + ) { + {{?}} + {{?}} + + {{= $code }} + } + {{?}} {{ /* $hasDefault */ }} + {{?}} {{ /* def.nonEmptySchema */ }} + + {{# def.ifResultValid }} + {{~}} +{{?}} + +{{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty }} + {{ var $sch = $pProperties[$pProperty]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + + it.util.escapeFragment($pProperty); + }} + + {{# def.iterateProperties }} + if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + } + {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} + } + + {{# def.ifResultValid }} + {{?}} {{ /* def.nonEmptySchema */ }} + {{~}} +{{?}} + + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_modules/ajv/lib/dot/propertyNames.jst b/node_modules/ajv/lib/dot/propertyNames.jst new file mode 100644 index 00000000..d456ccaf --- /dev/null +++ b/node_modules/ajv/lib/dot/propertyNames.jst @@ -0,0 +1,52 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +var {{=$errs}} = errors; + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + {{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $i = 'i' + $lvl + , $invalidName = '\' + ' + $key + ' + \'' + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + }} + + {{? $ownProperties }} + var {{=$dataProperties}} = undefined; + {{?}} + {{# def.iterateProperties }} + var startErrs{{=$lvl}} = errors; + + {{ var $passData = $key; }} + {{# def.setCompositeRule }} + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + {{# def.resetCompositeRule }} + + if (!{{=$nextValid}}) { + for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}= it.opts.loopRequired + , $ownProperties = it.opts.ownProperties; + }} + + {{? $breakOnError }} + var missing{{=$lvl}}; + {{? $loopRequired }} + {{# def.setupLoop }} + var {{=$valid}} = true; + + {{?$isData}}{{# def.check$dataIsArray }}{{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined + {{? $ownProperties }} + && {{# def.isRequiredOwnProperty }} + {{?}}; + if (!{{=$valid}}) break; + } + + {{? $isData }} } {{?}} + + {{# def.checkError:'required' }} + else { + {{??}} + if ({{# def.checkMissingProperty:$required }}) { + {{# def.errorMissingProperty:'required' }} + } else { + {{?}} + {{??}} + {{? $loopRequired }} + {{# def.setupLoop }} + {{? $isData }} + if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) { + {{# def.addError:'required' }} + } else if ({{=$vSchema}} !== undefined) { + {{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined + {{? $ownProperties }} + || !{{# def.isRequiredOwnProperty }} + {{?}}) { + {{# def.addError:'required' }} + } + } + + {{? $isData }} } {{?}} + {{??}} + {{~ $required:$propertyKey }} + {{# def.allErrorsMissingProperty:'required' }} + {{~}} + {{?}} + {{?}} + + {{ it.errorPath = $currentErrorPath; }} + +{{?? $breakOnError }} + if (true) { +{{?}} diff --git a/node_modules/ajv/lib/dot/uniqueItems.jst b/node_modules/ajv/lib/dot/uniqueItems.jst new file mode 100644 index 00000000..e69b8308 --- /dev/null +++ b/node_modules/ajv/lib/dot/uniqueItems.jst @@ -0,0 +1,62 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + + +{{? ($schema || $isData) && it.opts.uniqueItems !== false }} + {{? $isData }} + var {{=$valid}}; + if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined) + {{=$valid}} = true; + else if (typeof {{=$schemaValue}} != 'boolean') + {{=$valid}} = false; + else { + {{?}} + + var i = {{=$data}}.length + , {{=$valid}} = true + , j; + if (i > 1) { + {{ + var $itemType = it.schema.items && it.schema.items.type + , $typeIsArray = Array.isArray($itemType); + }} + {{? !$itemType || $itemType == 'object' || $itemType == 'array' || + ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }} + outer: + for (;i--;) { + for (j = i; j--;) { + if (equal({{=$data}}[i], {{=$data}}[j])) { + {{=$valid}} = false; + break outer; + } + } + } + {{??}} + var itemIndices = {}, item; + for (;i--;) { + var item = {{=$data}}[i]; + {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }} + if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue; + {{? $typeIsArray}} + if (typeof item == 'string') item = '"' + item; + {{?}} + if (typeof itemIndices[item] == 'number') { + {{=$valid}} = false; + j = itemIndices[item]; + break; + } + itemIndices[item] = i; + } + {{?}} + } + + {{? $isData }} } {{?}} + + if (!{{=$valid}}) { + {{# def.error:'uniqueItems' }} + } {{? $breakOnError }} else { {{?}} +{{??}} + {{? $breakOnError }} if (true) { {{?}} +{{?}} diff --git a/node_modules/ajv/lib/dot/validate.jst b/node_modules/ajv/lib/dot/validate.jst new file mode 100644 index 00000000..32087e71 --- /dev/null +++ b/node_modules/ajv/lib/dot/validate.jst @@ -0,0 +1,276 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.defaults }} +{{# def.coerce }} + +{{ /** + * schema compilation (render) time: + * it = { schema, RULES, _validate, opts } + * it.validate - this template function, + * it is used recursively to generate code for subschemas + * + * runtime: + * "validate" is a variable name to which this function will be assigned + * validateRef etc. are defined in the parent scope in index.js + */ }} + +{{ + var $async = it.schema.$async === true + , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') + , $id = it.self._getId(it.schema); +}} + +{{ + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } +}} + +{{? it.isTop }} + var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) { + 'use strict'; + {{? $id && (it.opts.sourceCode || it.opts.processCode) }} + {{= '/\*# sourceURL=' + $id + ' */' }} + {{?}} +{{?}} + +{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }} + {{ var $keyword = 'false schema'; }} + {{# def.setupKeyword }} + {{? it.schema === false}} + {{? it.isTop}} + {{ $breakOnError = true; }} + {{??}} + var {{=$valid}} = false; + {{?}} + {{# def.error:'false schema' }} + {{??}} + {{? it.isTop}} + {{? $async }} + return data; + {{??}} + validate.errors = null; + return true; + {{?}} + {{??}} + var {{=$valid}} = true; + {{?}} + {{?}} + + {{? it.isTop}} + }; + return validate; + {{?}} + + {{ return out; }} +{{?}} + + +{{? it.isTop }} + {{ + var $top = it.isTop + , $lvl = it.level = 0 + , $dataLvl = it.dataLevel = 0 + , $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + + it.dataPathArr = [""]; + + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + }} + + var vErrors = null; {{ /* don't edit, used in replace */ }} + var errors = 0; {{ /* don't edit, used in replace */ }} + if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }} +{{??}} + {{ + var $lvl = it.level + , $dataLvl = it.dataLevel + , $data = 'data' + ($dataLvl || ''); + + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + + if ($async && !it.async) throw new Error('async schema in sync schema'); + }} + + var errs_{{=$lvl}} = errors; +{{?}} + +{{ + var $valid = 'valid' + $lvl + , $breakOnError = !it.opts.allErrors + , $closingBraces1 = '' + , $closingBraces2 = ''; + + var $errorKeyword; + var $typeSchema = it.schema.type + , $typeIsArray = Array.isArray($typeSchema); + + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) + $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } +}} + +{{## def.checkType: + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type' + , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + }} + + if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) { +#}} + +{{? it.schema.$ref && $refKeywords }} + {{? it.opts.extendRefs == 'fail' }} + {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }} + {{?? it.opts.extendRefs !== true }} + {{ + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + }} + {{?}} +{{?}} + +{{? it.schema.$comment && it.opts.$comment }} + {{= it.RULES.all.$comment.code(it, '$comment') }} +{{?}} + +{{? $typeSchema }} + {{? it.opts.coerceTypes }} + {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} + {{?}} + + {{ var $rulesGroup = it.RULES.types[$typeSchema]; }} + {{? $coerceToTypes || $typeIsArray || $rulesGroup === true || + ($rulesGroup && !$shouldUseGroup($rulesGroup)) }} + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.checkType }} + {{? $coerceToTypes }} + {{# def.coerceType }} + {{??}} + {{# def.error:'type' }} + {{?}} + } + {{?}} +{{?}} + + +{{? it.schema.$ref && !$refKeywords }} + {{= it.RULES.all.$ref.code(it, '$ref') }} + {{? $breakOnError }} + } + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} +{{??}} + {{~ it.RULES:$rulesGroup }} + {{? $shouldUseGroup($rulesGroup) }} + {{? $rulesGroup.type }} + if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) { + {{?}} + {{? it.opts.useDefaults }} + {{? $rulesGroup.type == 'object' && it.schema.properties }} + {{# def.defaultProperties }} + {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }} + {{# def.defaultItems }} + {{?}} + {{?}} + {{~ $rulesGroup.rules:$rule }} + {{? $shouldUseRule($rule) }} + {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }} + {{? $code }} + {{= $code }} + {{? $breakOnError }} + {{ $closingBraces1 += '}'; }} + {{?}} + {{?}} + {{?}} + {{~}} + {{? $breakOnError }} + {{= $closingBraces1 }} + {{ $closingBraces1 = ''; }} + {{?}} + {{? $rulesGroup.type }} + } + {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }} + else { + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.error:'type' }} + } + {{?}} + {{?}} + + {{? $breakOnError }} + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} + {{?}} + {{~}} +{{?}} + +{{? $breakOnError }} {{= $closingBraces2 }} {{?}} + +{{? $top }} + {{? $async }} + if (errors === 0) return data; {{ /* don't edit, used in replace */ }} + else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }} + {{??}} + validate.errors = vErrors; {{ /* don't edit, used in replace */ }} + return errors === 0; {{ /* don't edit, used in replace */ }} + {{?}} + }; + + return validate; +{{??}} + var {{=$valid}} = errors === errs_{{=$lvl}}; +{{?}} + +{{ + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i=0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) + return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || + ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i=0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) + return true; + } +}} diff --git a/node_modules/ajv/lib/dotjs/README.md b/node_modules/ajv/lib/dotjs/README.md new file mode 100644 index 00000000..4d994846 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/README.md @@ -0,0 +1,3 @@ +These files are compiled dot templates from dot folder. + +Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder. diff --git a/node_modules/ajv/lib/dotjs/_limit.js b/node_modules/ajv/lib/dotjs/_limit.js new file mode 100644 index 00000000..05a1979d --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limit.js @@ -0,0 +1,163 @@ +'use strict'; +module.exports = function generate__limit(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $isMax = $keyword == 'maximum', + $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', + $schemaExcl = it.schema[$exclusiveKeyword], + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, + $op = $isMax ? '<' : '>', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitItems.js b/node_modules/ajv/lib/dotjs/_limitItems.js new file mode 100644 index 00000000..e092a559 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitItems.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitLength.js b/node_modules/ajv/lib/dotjs/_limitLength.js new file mode 100644 index 00000000..ecbd3fe1 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitLength.js @@ -0,0 +1,85 @@ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/_limitProperties.js b/node_modules/ajv/lib/dotjs/_limitProperties.js new file mode 100644 index 00000000..d232755a --- /dev/null +++ b/node_modules/ajv/lib/dotjs/_limitProperties.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/allOf.js b/node_modules/ajv/lib/dotjs/allOf.js new file mode 100644 index 00000000..fb8c2e4b --- /dev/null +++ b/node_modules/ajv/lib/dotjs/allOf.js @@ -0,0 +1,42 @@ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/anyOf.js b/node_modules/ajv/lib/dotjs/anyOf.js new file mode 100644 index 00000000..0600a9d4 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/anyOf.js @@ -0,0 +1,73 @@ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/comment.js b/node_modules/ajv/lib/dotjs/comment.js new file mode 100644 index 00000000..dd66bb8f --- /dev/null +++ b/node_modules/ajv/lib/dotjs/comment.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/const.js b/node_modules/ajv/lib/dotjs/const.js new file mode 100644 index 00000000..15b7c619 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/const.js @@ -0,0 +1,56 @@ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/contains.js b/node_modules/ajv/lib/dotjs/contains.js new file mode 100644 index 00000000..7d763009 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/contains.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/custom.js b/node_modules/ajv/lib/dotjs/custom.js new file mode 100644 index 00000000..f3e641e7 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/custom.js @@ -0,0 +1,228 @@ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/enum.js b/node_modules/ajv/lib/dotjs/enum.js new file mode 100644 index 00000000..90580b9f --- /dev/null +++ b/node_modules/ajv/lib/dotjs/enum.js @@ -0,0 +1,66 @@ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/format.js b/node_modules/ajv/lib/dotjs/format.js new file mode 100644 index 00000000..cd9a5693 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/format.js @@ -0,0 +1,150 @@ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/if.js b/node_modules/ajv/lib/dotjs/if.js new file mode 100644 index 00000000..94d27ad8 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/if.js @@ -0,0 +1,103 @@ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/index.js b/node_modules/ajv/lib/dotjs/index.js new file mode 100644 index 00000000..2fb1b00e --- /dev/null +++ b/node_modules/ajv/lib/dotjs/index.js @@ -0,0 +1,33 @@ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; diff --git a/node_modules/ajv/lib/dotjs/items.js b/node_modules/ajv/lib/dotjs/items.js new file mode 100644 index 00000000..bee5d67d --- /dev/null +++ b/node_modules/ajv/lib/dotjs/items.js @@ -0,0 +1,140 @@ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/multipleOf.js b/node_modules/ajv/lib/dotjs/multipleOf.js new file mode 100644 index 00000000..9d6401b8 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/multipleOf.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/not.js b/node_modules/ajv/lib/dotjs/not.js new file mode 100644 index 00000000..f50c9378 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/not.js @@ -0,0 +1,84 @@ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/oneOf.js b/node_modules/ajv/lib/dotjs/oneOf.js new file mode 100644 index 00000000..dfe2fd55 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/oneOf.js @@ -0,0 +1,73 @@ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/pattern.js b/node_modules/ajv/lib/dotjs/pattern.js new file mode 100644 index 00000000..1d74d6b0 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/pattern.js @@ -0,0 +1,75 @@ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/properties.js b/node_modules/ajv/lib/dotjs/properties.js new file mode 100644 index 00000000..bc5ee554 --- /dev/null +++ b/node_modules/ajv/lib/dotjs/properties.js @@ -0,0 +1,335 @@ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}).filter(notProto), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties).filter(notProto), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { + return p !== '__proto__'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/propertyNames.js b/node_modules/ajv/lib/dotjs/propertyNames.js new file mode 100644 index 00000000..2a54a08f --- /dev/null +++ b/node_modules/ajv/lib/dotjs/propertyNames.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/uniqueItems.js b/node_modules/ajv/lib/dotjs/uniqueItems.js new file mode 100644 index 00000000..0736a0ed --- /dev/null +++ b/node_modules/ajv/lib/dotjs/uniqueItems.js @@ -0,0 +1,86 @@ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_modules/ajv/lib/dotjs/validate.js b/node_modules/ajv/lib/dotjs/validate.js new file mode 100644 index 00000000..f295824b --- /dev/null +++ b/node_modules/ajv/lib/dotjs/validate.js @@ -0,0 +1,482 @@ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [""]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; + } + out += ' if (' + ($coerced) + ' !== undefined) ; '; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($type == 'string') { + out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' else { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } if (' + ($coerced) + ' !== undefined) { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} diff --git a/node_modules/ajv/lib/keyword.js b/node_modules/ajv/lib/keyword.js new file mode 100644 index 00000000..06da9a2d --- /dev/null +++ b/node_modules/ajv/lib/keyword.js @@ -0,0 +1,146 @@ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i ../ajv-dist/bower.json + cd ../ajv-dist + + if [[ `git status --porcelain` ]]; then + echo "Changes detected. Updating master branch..." + git add -A + git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin master > /dev/null 2>&1 + fi + + echo "Publishing tag..." + + git tag $TRAVIS_TAG + git push --tags > /dev/null 2>&1 + + echo "Done" +fi diff --git a/node_modules/ajv/scripts/travis-gh-pages b/node_modules/ajv/scripts/travis-gh-pages new file mode 100644 index 00000000..b3d4f3d0 --- /dev/null +++ b/node_modules/ajv/scripts/travis-gh-pages @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then + git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && { + rm -rf ../gh-pages + git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv.git ../gh-pages + mkdir -p ../gh-pages/_source + cp *.md ../gh-pages/_source + cp LICENSE ../gh-pages/_source + currentDir=$(pwd) + cd ../gh-pages + $currentDir/node_modules/.bin/gh-pages-generator + # remove logo from README + sed -i -E "s/]+ajv_logo[^>]+>//" index.md + git config user.email "$GIT_USER_EMAIL" + git config user.name "$GIT_USER_NAME" + git add . + git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin gh-pages > /dev/null 2>&1 + } +fi diff --git a/node_modules/ansi-styles/index.d.ts b/node_modules/ansi-styles/index.d.ts new file mode 100644 index 00000000..44a907e5 --- /dev/null +++ b/node_modules/ansi-styles/index.d.ts @@ -0,0 +1,345 @@ +declare type CSSColor = + | 'aliceblue' + | 'antiquewhite' + | 'aqua' + | 'aquamarine' + | 'azure' + | 'beige' + | 'bisque' + | 'black' + | 'blanchedalmond' + | 'blue' + | 'blueviolet' + | 'brown' + | 'burlywood' + | 'cadetblue' + | 'chartreuse' + | 'chocolate' + | 'coral' + | 'cornflowerblue' + | 'cornsilk' + | 'crimson' + | 'cyan' + | 'darkblue' + | 'darkcyan' + | 'darkgoldenrod' + | 'darkgray' + | 'darkgreen' + | 'darkgrey' + | 'darkkhaki' + | 'darkmagenta' + | 'darkolivegreen' + | 'darkorange' + | 'darkorchid' + | 'darkred' + | 'darksalmon' + | 'darkseagreen' + | 'darkslateblue' + | 'darkslategray' + | 'darkslategrey' + | 'darkturquoise' + | 'darkviolet' + | 'deeppink' + | 'deepskyblue' + | 'dimgray' + | 'dimgrey' + | 'dodgerblue' + | 'firebrick' + | 'floralwhite' + | 'forestgreen' + | 'fuchsia' + | 'gainsboro' + | 'ghostwhite' + | 'gold' + | 'goldenrod' + | 'gray' + | 'green' + | 'greenyellow' + | 'grey' + | 'honeydew' + | 'hotpink' + | 'indianred' + | 'indigo' + | 'ivory' + | 'khaki' + | 'lavender' + | 'lavenderblush' + | 'lawngreen' + | 'lemonchiffon' + | 'lightblue' + | 'lightcoral' + | 'lightcyan' + | 'lightgoldenrodyellow' + | 'lightgray' + | 'lightgreen' + | 'lightgrey' + | 'lightpink' + | 'lightsalmon' + | 'lightseagreen' + | 'lightskyblue' + | 'lightslategray' + | 'lightslategrey' + | 'lightsteelblue' + | 'lightyellow' + | 'lime' + | 'limegreen' + | 'linen' + | 'magenta' + | 'maroon' + | 'mediumaquamarine' + | 'mediumblue' + | 'mediumorchid' + | 'mediumpurple' + | 'mediumseagreen' + | 'mediumslateblue' + | 'mediumspringgreen' + | 'mediumturquoise' + | 'mediumvioletred' + | 'midnightblue' + | 'mintcream' + | 'mistyrose' + | 'moccasin' + | 'navajowhite' + | 'navy' + | 'oldlace' + | 'olive' + | 'olivedrab' + | 'orange' + | 'orangered' + | 'orchid' + | 'palegoldenrod' + | 'palegreen' + | 'paleturquoise' + | 'palevioletred' + | 'papayawhip' + | 'peachpuff' + | 'peru' + | 'pink' + | 'plum' + | 'powderblue' + | 'purple' + | 'rebeccapurple' + | 'red' + | 'rosybrown' + | 'royalblue' + | 'saddlebrown' + | 'salmon' + | 'sandybrown' + | 'seagreen' + | 'seashell' + | 'sienna' + | 'silver' + | 'skyblue' + | 'slateblue' + | 'slategray' + | 'slategrey' + | 'snow' + | 'springgreen' + | 'steelblue' + | 'tan' + | 'teal' + | 'thistle' + | 'tomato' + | 'turquoise' + | 'violet' + | 'wheat' + | 'white' + | 'whitesmoke' + | 'yellow' + | 'yellowgreen'; + +declare namespace ansiStyles { + interface ColorConvert { + /** + The RGB color space. + + @param red - (`0`-`255`) + @param green - (`0`-`255`) + @param blue - (`0`-`255`) + */ + rgb(red: number, green: number, blue: number): string; + + /** + The RGB HEX color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hex(hex: string): string; + + /** + @param keyword - A CSS color name. + */ + keyword(keyword: CSSColor): string; + + /** + The HSL color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param lightness - (`0`-`100`) + */ + hsl(hue: number, saturation: number, lightness: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param saturation - (`0`-`100`) + @param value - (`0`-`100`) + */ + hsv(hue: number, saturation: number, value: number): string; + + /** + The HSV color space. + + @param hue - (`0`-`360`) + @param whiteness - (`0`-`100`) + @param blackness - (`0`-`100`) + */ + hwb(hue: number, whiteness: number, blackness: number): string; + + /** + Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color. + */ + ansi(ansi: number): string; + + /** + Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256(ansi: number): string; + } + + interface CSPair { + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; + } + + interface ColorBase { + readonly ansi: ColorConvert; + readonly ansi256: ColorConvert; + readonly ansi16m: ColorConvert; + + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + } + + interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; + } + + interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; + } + + interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; + } +} + +declare const ansiStyles: { + readonly modifier: ansiStyles.Modifier; + readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; + readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; + readonly codes: ReadonlyMap; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; + +export = ansiStyles; diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js new file mode 100644 index 00000000..5d82581a --- /dev/null +++ b/node_modules/ansi-styles/index.js @@ -0,0 +1,163 @@ +'use strict'; + +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; + +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; + +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; + +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); + + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); + + return value; + }, + enumerable: true, + configurable: true + }); +}; + +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = require('color-convert'); + } + + const offset = isBackground ? 10 : 0; + const styles = {}; + + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } + + return styles; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); + + return styles; +} + +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/ansi-styles/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/ansi-styles/package.json b/node_modules/ansi-styles/package.json new file mode 100644 index 00000000..75393284 --- /dev/null +++ b/node_modules/ansi-styles/package.json @@ -0,0 +1,56 @@ +{ + "name": "ansi-styles", + "version": "4.3.0", + "description": "ANSI escape codes for styling strings in the terminal", + "license": "MIT", + "repository": "chalk/ansi-styles", + "funding": "https://github.com/chalk/ansi-styles?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd", + "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "dependencies": { + "color-convert": "^2.0.1" + }, + "devDependencies": { + "@types/color-convert": "^1.9.0", + "ava": "^2.3.0", + "svg-term-cli": "^2.1.1", + "tsd": "^0.11.0", + "xo": "^0.25.3" + } +} diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md new file mode 100644 index 00000000..24883de8 --- /dev/null +++ b/node_modules/ansi-styles/readme.md @@ -0,0 +1,152 @@ +# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) + +> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal + +You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. + + + +## Install + +``` +$ npm install ansi-styles +``` + +## Usage + +```js +const style = require('ansi-styles'); + +console.log(`${style.green.open}Hello world!${style.green.close}`); + + +// Color conversion between 16/256/truecolor +// NOTE: If conversion goes to 16 colors or 256 colors, the original color +// may be degraded to fit that color palette. This means terminals +// that do not support 16 million colors will best-match the +// original color. +console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); +console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); +console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close); +``` + +## API + +Each style has an `open` and `close` property. + +## Styles + +### Modifiers + +- `reset` +- `bold` +- `dim` +- `italic` *(Not widely supported)* +- `underline` +- `inverse` +- `hidden` +- `strikethrough` *(Not widely supported)* + +### Colors + +- `black` +- `red` +- `green` +- `yellow` +- `blue` +- `magenta` +- `cyan` +- `white` +- `blackBright` (alias: `gray`, `grey`) +- `redBright` +- `greenBright` +- `yellowBright` +- `blueBright` +- `magentaBright` +- `cyanBright` +- `whiteBright` + +### Background colors + +- `bgBlack` +- `bgRed` +- `bgGreen` +- `bgYellow` +- `bgBlue` +- `bgMagenta` +- `bgCyan` +- `bgWhite` +- `bgBlackBright` (alias: `bgGray`, `bgGrey`) +- `bgRedBright` +- `bgGreenBright` +- `bgYellowBright` +- `bgBlueBright` +- `bgMagentaBright` +- `bgCyanBright` +- `bgWhiteBright` + +## Advanced usage + +By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. + +- `style.modifier` +- `style.color` +- `style.bgColor` + +###### Example + +```js +console.log(style.color.green.open); +``` + +Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. + +###### Example + +```js +console.log(style.codes.get(36)); +//=> 39 +``` + +## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) + +`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. + +The following color spaces from `color-convert` are supported: + +- `rgb` +- `hex` +- `keyword` +- `hsl` +- `hsv` +- `hwb` +- `ansi` +- `ansi256` + +To use these, call the associated conversion function with the intended output, for example: + +```js +style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code +style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code + +style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code +style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code + +style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code +style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code +``` + +## Related + +- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + +## For enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of `ansi-styles` 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-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE new file mode 100644 index 00000000..491766ca --- /dev/null +++ b/node_modules/anymatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.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/anymatch/README.md b/node_modules/anymatch/README.md new file mode 100644 index 00000000..1dd67f53 --- /dev/null +++ b/node_modules/anymatch/README.md @@ -0,0 +1,87 @@ +anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) +====== +Javascript module to match a string against a regular expression, glob, string, +or function that takes the string as an argument and returns a truthy or falsy +value. The matcher can also be an array of any or all of these. Useful for +allowing a very flexible user-defined config to define things like file paths. + +__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ + + +Usage +----- +```sh +npm install anymatch +``` + +#### anymatch(matchers, testString, [returnIndex], [options]) +* __matchers__: (_Array|String|RegExp|Function_) +String to be directly matched, string with glob patterns, regular expression +test, function that takes the testString as an argument and returns a truthy +value if it should be matched, or an array of any number and mix of these types. +* __testString__: (_String|Array_) The string to test against the matchers. If +passed as an array, the first element of the array will be used as the +`testString` for non-function matchers, while the entire array will be applied +as the arguments for function matchers. +* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. + * __returnIndex__: (_Boolean [optional]_) If true, return the array index of +the first matcher that that testString matched, or -1 if no match, instead of a +boolean result. + +```js +const anymatch = require('anymatch'); + +const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; + +anymatch(matchers, 'path/to/file.js'); // true +anymatch(matchers, 'path/anyjs/baz.js'); // true +anymatch(matchers, 'path/to/foo.js'); // true +anymatch(matchers, 'path/to/bar.js'); // true +anymatch(matchers, 'bar.js'); // false + +// returnIndex = true +anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 +anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 + +// any picomatc + +// using globs to match directories and their children +anymatch('node_modules', 'node_modules'); // true +anymatch('node_modules', 'node_modules/somelib/index.js'); // false +anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true +anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false +anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true + +const matcher = anymatch(matchers); +['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] +anymatch master* ❯ + +``` + +#### anymatch(matchers) +You can also pass in only your matcher(s) to get a curried function that has +already been bound to the provided matching criteria. This can be used as an +`Array#filter` callback. + +```js +var matcher = anymatch(matchers); + +matcher('path/to/file.js'); // true +matcher('path/anyjs/baz.js', true); // 1 + +['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] +``` + +Changelog +---------- +[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) + +- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. +- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). +- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) +for glob pattern matching. Issues with glob pattern matching should be +reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). + +License +------- +[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts new file mode 100644 index 00000000..3ef7eaad --- /dev/null +++ b/node_modules/anymatch/index.d.ts @@ -0,0 +1,20 @@ +type AnymatchFn = (testString: string) => boolean; +type AnymatchPattern = string|RegExp|AnymatchFn; +type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] +type AnymatchTester = { + (testString: string|any[], returnIndex: true): number; + (testString: string|any[]): boolean; +} + +type PicomatchOptions = {dot: boolean}; + +declare const anymatch: { + (matchers: AnymatchMatcher): AnymatchTester; + (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester; + (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; + (matchers: AnymatchMatcher, testString: string|any[]): boolean; +} + +export {AnymatchMatcher as Matcher} +export {AnymatchTester as Tester} +export default anymatch diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js new file mode 100644 index 00000000..8eb73e9c --- /dev/null +++ b/node_modules/anymatch/index.js @@ -0,0 +1,104 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { value: true }); + +const picomatch = require('picomatch'); +const normalizePath = require('normalize-path'); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const DEFAULT_OPTIONS = {returnIndex: false}; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @param {object} options + * @returns {AnymatchFn} + */ +const createPattern = (matcher, options) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negPatterns + * @param {String|Array} args + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(_path)) + } + const path = normalizePath(_path, false); + + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {object} options + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + const opts = typeof options === 'boolean' ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, opts)); + const patterns = mtchers + .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG)) + .map(matcher => createPattern(matcher, opts)); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +anymatch.default = anymatch; +module.exports = anymatch; diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json new file mode 100644 index 00000000..2cb2307e --- /dev/null +++ b/node_modules/anymatch/package.json @@ -0,0 +1,48 @@ +{ + "name": "anymatch", + "version": "3.1.3", + "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", + "files": [ + "index.js", + "index.d.ts" + ], + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "author": { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + "license": "ISC", + "homepage": "https://github.com/micromatch/anymatch", + "repository": { + "type": "git", + "url": "https://github.com/micromatch/anymatch" + }, + "keywords": [ + "match", + "any", + "string", + "file", + "fs", + "list", + "glob", + "regex", + "regexp", + "regular", + "expression", + "function" + ], + "scripts": { + "test": "nyc mocha", + "mocha": "mocha" + }, + "devDependencies": { + "mocha": "^6.1.3", + "nyc": "^14.0.0" + }, + "engines": { + "node": ">= 8" + } +} diff --git a/node_modules/array-flatten/LICENSE b/node_modules/array-flatten/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/array-flatten/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/array-flatten/README.md b/node_modules/array-flatten/README.md new file mode 100644 index 00000000..91fa5b63 --- /dev/null +++ b/node_modules/array-flatten/README.md @@ -0,0 +1,43 @@ +# Array Flatten + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. + +## Installation + +``` +npm install array-flatten --save +``` + +## Usage + +```javascript +var flatten = require('array-flatten') + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) +//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] + +flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) +//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] + +(function () { + flatten(arguments) //=> [1, 2, 3] +})(1, [2, 3]) +``` + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat +[npm-url]: https://npmjs.org/package/array-flatten +[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat +[downloads-url]: https://npmjs.org/package/array-flatten +[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat +[travis-url]: https://travis-ci.org/blakeembrey/array-flatten +[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat +[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/node_modules/array-flatten/array-flatten.js b/node_modules/array-flatten/array-flatten.js new file mode 100644 index 00000000..089117b3 --- /dev/null +++ b/node_modules/array-flatten/array-flatten.js @@ -0,0 +1,64 @@ +'use strict' + +/** + * Expose `arrayFlatten`. + */ +module.exports = arrayFlatten + +/** + * Recursive flatten function with depth. + * + * @param {Array} array + * @param {Array} result + * @param {Number} depth + * @return {Array} + */ +function flattenWithDepth (array, result, depth) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (depth > 0 && Array.isArray(value)) { + flattenWithDepth(value, result, depth - 1) + } else { + result.push(value) + } + } + + return result +} + +/** + * Recursive flatten function. Omitting depth is slightly faster. + * + * @param {Array} array + * @param {Array} result + * @return {Array} + */ +function flattenForever (array, result) { + for (var i = 0; i < array.length; i++) { + var value = array[i] + + if (Array.isArray(value)) { + flattenForever(value, result) + } else { + result.push(value) + } + } + + return result +} + +/** + * Flatten an array, with the ability to define a depth. + * + * @param {Array} array + * @param {Number} depth + * @return {Array} + */ +function arrayFlatten (array, depth) { + if (depth == null) { + return flattenForever(array, []) + } + + return flattenWithDepth(array, [], depth) +} diff --git a/node_modules/array-flatten/package.json b/node_modules/array-flatten/package.json new file mode 100644 index 00000000..1a24e2a1 --- /dev/null +++ b/node_modules/array-flatten/package.json @@ -0,0 +1,39 @@ +{ + "name": "array-flatten", + "version": "1.1.1", + "description": "Flatten an array of nested arrays into a single flat array", + "main": "array-flatten.js", + "files": [ + "array-flatten.js", + "LICENSE" + ], + "scripts": { + "test": "istanbul cover _mocha -- -R spec" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/array-flatten.git" + }, + "keywords": [ + "array", + "flatten", + "arguments", + "depth" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/array-flatten/issues" + }, + "homepage": "https://github.com/blakeembrey/array-flatten", + "devDependencies": { + "istanbul": "^0.3.13", + "mocha": "^2.2.4", + "pre-commit": "^1.0.7", + "standard": "^3.7.3" + } +} diff --git a/node_modules/asn1/Jenkinsfile b/node_modules/asn1/Jenkinsfile new file mode 100644 index 00000000..d1b45937 --- /dev/null +++ b/node_modules/asn1/Jenkinsfile @@ -0,0 +1,65 @@ +@Library('jenkins-joylib@v1.0.8') _ + +pipeline { + + agent none + + options { + buildDiscarder(logRotator(numToKeepStr: '45')) + timestamps() + } + + stages { + stage('top') { + parallel { + stage('v4-zone') { + agent { + label joyCommonLabels(image_ver: '15.4.1') + } + tools { + nodejs 'sdcnode-v4-zone' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + + stage('v6-zone64') { + agent { + label joyCommonLabels(image_ver: '18.4.0') + } + tools { + nodejs 'sdcnode-v6-zone64' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + } + } + } + + post { + always { + joySlackNotifications() + } + } +} diff --git a/node_modules/asn1/LICENSE b/node_modules/asn1/LICENSE new file mode 100644 index 00000000..9b5dcdb7 --- /dev/null +++ b/node_modules/asn1/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Mark Cavage, 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/asn1/README.md b/node_modules/asn1/README.md new file mode 100644 index 00000000..2208210a --- /dev/null +++ b/node_modules/asn1/README.md @@ -0,0 +1,50 @@ +node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS. +Currently BER encoding is supported; at some point I'll likely have to do DER. + +## Usage + +Mostly, if you're *actually* needing to read and write ASN.1, you probably don't +need this readme to explain what and why. If you have no idea what ASN.1 is, +see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +The source is pretty much self-explanatory, and has read/write methods for the +common types out there. + +### Decoding + +The following reads an ASN.1 sequence with a boolean. + + var Ber = require('asn1').Ber; + + var reader = new Ber.Reader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff])); + + reader.readSequence(); + console.log('Sequence len: ' + reader.length); + if (reader.peek() === Ber.Boolean) + console.log(reader.readBoolean()); + +### Encoding + +The following generates the same payload as above. + + var Ber = require('asn1').Ber; + + var writer = new Ber.Writer(); + + writer.startSequence(); + writer.writeBoolean(true); + writer.endSequence(); + + console.log(writer.buffer); + +## Installation + + npm install asn1 + +## License + +MIT. + +## Bugs + +See . diff --git a/node_modules/asn1/lib/ber/errors.js b/node_modules/asn1/lib/ber/errors.js new file mode 100644 index 00000000..4557b8ae --- /dev/null +++ b/node_modules/asn1/lib/ber/errors.js @@ -0,0 +1,13 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + + newInvalidAsn1Error: function (msg) { + var e = new Error(); + e.name = 'InvalidAsn1Error'; + e.message = msg || ''; + return e; + } + +}; diff --git a/node_modules/asn1/lib/ber/index.js b/node_modules/asn1/lib/ber/index.js new file mode 100644 index 00000000..387d1326 --- /dev/null +++ b/node_modules/asn1/lib/ber/index.js @@ -0,0 +1,27 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var errors = require('./errors'); +var types = require('./types'); + +var Reader = require('./reader'); +var Writer = require('./writer'); + + +// --- Exports + +module.exports = { + + Reader: Reader, + + Writer: Writer + +}; + +for (var t in types) { + if (types.hasOwnProperty(t)) + module.exports[t] = types[t]; +} +for (var e in errors) { + if (errors.hasOwnProperty(e)) + module.exports[e] = errors[e]; +} diff --git a/node_modules/asn1/lib/ber/reader.js b/node_modules/asn1/lib/ber/reader.js new file mode 100644 index 00000000..8a7e4ca0 --- /dev/null +++ b/node_modules/asn1/lib/ber/reader.js @@ -0,0 +1,262 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; + +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + + + +// --- API + +function Reader(data) { + if (!data || !Buffer.isBuffer(data)) + throw new TypeError('data must be a node Buffer'); + + this._buf = data; + this._size = data.length; + + // These hold the "current" state + this._len = 0; + this._offset = 0; +} + +Object.defineProperty(Reader.prototype, 'length', { + enumerable: true, + get: function () { return (this._len); } +}); + +Object.defineProperty(Reader.prototype, 'offset', { + enumerable: true, + get: function () { return (this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'remain', { + get: function () { return (this._size - this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'buffer', { + get: function () { return (this._buf.slice(this._offset)); } +}); + + +/** + * Reads a single byte and advances offset; you can pass in `true` to make this + * a "peek" operation (i.e., get the byte, but don't advance the offset). + * + * @param {Boolean} peek true means don't move offset. + * @return {Number} the next byte, null if not enough data. + */ +Reader.prototype.readByte = function (peek) { + if (this._size - this._offset < 1) + return null; + + var b = this._buf[this._offset] & 0xff; + + if (!peek) + this._offset += 1; + + return b; +}; + + +Reader.prototype.peek = function () { + return this.readByte(true); +}; + + +/** + * Reads a (potentially) variable length off the BER buffer. This call is + * not really meant to be called directly, as callers have to manipulate + * the internal buffer afterwards. + * + * As a result of this call, you can call `Reader.length`, until the + * next thing called that does a readLength. + * + * @return {Number} the amount of offset to advance the buffer. + * @throws {InvalidAsn1Error} on bad ASN.1 + */ +Reader.prototype.readLength = function (offset) { + if (offset === undefined) + offset = this._offset; + + if (offset >= this._size) + return null; + + var lenB = this._buf[offset++] & 0xff; + if (lenB === null) + return null; + + if ((lenB & 0x80) === 0x80) { + lenB &= 0x7f; + + if (lenB === 0) + throw newInvalidAsn1Error('Indefinite length not supported'); + + if (lenB > 4) + throw newInvalidAsn1Error('encoding too long'); + + if (this._size - offset < lenB) + return null; + + this._len = 0; + for (var i = 0; i < lenB; i++) + this._len = (this._len << 8) + (this._buf[offset++] & 0xff); + + } else { + // Wasn't a variable length + this._len = lenB; + } + + return offset; +}; + + +/** + * Parses the next sequence in this BER buffer. + * + * To get the length of the sequence, call `Reader.length`. + * + * @return {Number} the sequence's tag. + */ +Reader.prototype.readSequence = function (tag) { + var seq = this.peek(); + if (seq === null) + return null; + if (tag !== undefined && tag !== seq) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + seq.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + this._offset = o; + return seq; +}; + + +Reader.prototype.readInt = function () { + return this._readTag(ASN1.Integer); +}; + + +Reader.prototype.readBoolean = function () { + return (this._readTag(ASN1.Boolean) === 0 ? false : true); +}; + + +Reader.prototype.readEnumeration = function () { + return this._readTag(ASN1.Enumeration); +}; + + +Reader.prototype.readString = function (tag, retbuf) { + if (!tag) + tag = ASN1.OctetString; + + var b = this.peek(); + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + + if (o === null) + return null; + + if (this.length > this._size - o) + return null; + + this._offset = o; + + if (this.length === 0) + return retbuf ? Buffer.alloc(0) : ''; + + var str = this._buf.slice(this._offset, this._offset + this.length); + this._offset += this.length; + + return retbuf ? str : str.toString('utf8'); +}; + +Reader.prototype.readOID = function (tag) { + if (!tag) + tag = ASN1.OID; + + var b = this.readString(tag, true); + if (b === null) + return null; + + var values = []; + var value = 0; + + for (var i = 0; i < b.length; i++) { + var byte = b[i] & 0xff; + + value <<= 7; + value += byte & 0x7f; + if ((byte & 0x80) === 0) { + values.push(value); + value = 0; + } + } + + value = values.shift(); + values.unshift(value % 40); + values.unshift((value / 40) >> 0); + + return values.join('.'); +}; + + +Reader.prototype._readTag = function (tag) { + assert.ok(tag !== undefined); + + var b = this.peek(); + + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + if (this.length > 4) + throw newInvalidAsn1Error('Integer too long: ' + this.length); + + if (this.length > this._size - o) + return null; + this._offset = o; + + var fb = this._buf[this._offset]; + var value = 0; + + for (var i = 0; i < this.length; i++) { + value <<= 8; + value |= (this._buf[this._offset++] & 0xff); + } + + if ((fb & 0x80) === 0x80 && i !== 4) + value -= (1 << (i * 8)); + + return value >> 0; +}; + + + +// --- Exported API + +module.exports = Reader; diff --git a/node_modules/asn1/lib/ber/types.js b/node_modules/asn1/lib/ber/types.js new file mode 100644 index 00000000..8aea0001 --- /dev/null +++ b/node_modules/asn1/lib/ber/types.js @@ -0,0 +1,36 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + EOC: 0, + Boolean: 1, + Integer: 2, + BitString: 3, + OctetString: 4, + Null: 5, + OID: 6, + ObjectDescriptor: 7, + External: 8, + Real: 9, // float + Enumeration: 10, + PDV: 11, + Utf8String: 12, + RelativeOID: 13, + Sequence: 16, + Set: 17, + NumericString: 18, + PrintableString: 19, + T61String: 20, + VideotexString: 21, + IA5String: 22, + UTCTime: 23, + GeneralizedTime: 24, + GraphicString: 25, + VisibleString: 26, + GeneralString: 28, + UniversalString: 29, + CharacterString: 30, + BMPString: 31, + Constructor: 32, + Context: 128 +}; diff --git a/node_modules/asn1/lib/ber/writer.js b/node_modules/asn1/lib/ber/writer.js new file mode 100644 index 00000000..3515acf7 --- /dev/null +++ b/node_modules/asn1/lib/ber/writer.js @@ -0,0 +1,317 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + +var DEFAULT_OPTS = { + size: 1024, + growthFactor: 8 +}; + + +// --- Helpers + +function merge(from, to) { + assert.ok(from); + assert.equal(typeof (from), 'object'); + assert.ok(to); + assert.equal(typeof (to), 'object'); + + var keys = Object.getOwnPropertyNames(from); + keys.forEach(function (key) { + if (to[key]) + return; + + var value = Object.getOwnPropertyDescriptor(from, key); + Object.defineProperty(to, key, value); + }); + + return to; +} + + + +// --- API + +function Writer(options) { + options = merge(DEFAULT_OPTS, options || {}); + + this._buf = Buffer.alloc(options.size || 1024); + this._size = this._buf.length; + this._offset = 0; + this._options = options; + + // A list of offsets in the buffer where we need to insert + // sequence tag/len pairs. + this._seq = []; +} + +Object.defineProperty(Writer.prototype, 'buffer', { + get: function () { + if (this._seq.length) + throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)'); + + return (this._buf.slice(0, this._offset)); + } +}); + +Writer.prototype.writeByte = function (b) { + if (typeof (b) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(1); + this._buf[this._offset++] = b; +}; + + +Writer.prototype.writeInt = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Integer; + + var sz = 4; + + while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && + (sz > 1)) { + sz--; + i <<= 8; + } + + if (sz > 4) + throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff'); + + this._ensure(2 + sz); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = sz; + + while (sz-- > 0) { + this._buf[this._offset++] = ((i & 0xff000000) >>> 24); + i <<= 8; + } + +}; + + +Writer.prototype.writeNull = function () { + this.writeByte(ASN1.Null); + this.writeByte(0x00); +}; + + +Writer.prototype.writeEnumeration = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Enumeration; + + return this.writeInt(i, tag); +}; + + +Writer.prototype.writeBoolean = function (b, tag) { + if (typeof (b) !== 'boolean') + throw new TypeError('argument must be a Boolean'); + if (typeof (tag) !== 'number') + tag = ASN1.Boolean; + + this._ensure(3); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = 0x01; + this._buf[this._offset++] = b ? 0xff : 0x00; +}; + + +Writer.prototype.writeString = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string (was: ' + typeof (s) + ')'); + if (typeof (tag) !== 'number') + tag = ASN1.OctetString; + + var len = Buffer.byteLength(s); + this.writeByte(tag); + this.writeLength(len); + if (len) { + this._ensure(len); + this._buf.write(s, this._offset); + this._offset += len; + } +}; + + +Writer.prototype.writeBuffer = function (buf, tag) { + if (typeof (tag) !== 'number') + throw new TypeError('tag must be a number'); + if (!Buffer.isBuffer(buf)) + throw new TypeError('argument must be a buffer'); + + this.writeByte(tag); + this.writeLength(buf.length); + this._ensure(buf.length); + buf.copy(this._buf, this._offset, 0, buf.length); + this._offset += buf.length; +}; + + +Writer.prototype.writeStringArray = function (strings) { + if ((!strings instanceof Array)) + throw new TypeError('argument must be an Array[String]'); + + var self = this; + strings.forEach(function (s) { + self.writeString(s); + }); +}; + +// This is really to solve DER cases, but whatever for now +Writer.prototype.writeOID = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string'); + if (typeof (tag) !== 'number') + tag = ASN1.OID; + + if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) + throw new Error('argument is not a valid OID string'); + + function encodeOctet(bytes, octet) { + if (octet < 128) { + bytes.push(octet); + } else if (octet < 16384) { + bytes.push((octet >>> 7) | 0x80); + bytes.push(octet & 0x7F); + } else if (octet < 2097152) { + bytes.push((octet >>> 14) | 0x80); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else if (octet < 268435456) { + bytes.push((octet >>> 21) | 0x80); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else { + bytes.push(((octet >>> 28) | 0x80) & 0xFF); + bytes.push(((octet >>> 21) | 0x80) & 0xFF); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } + } + + var tmp = s.split('.'); + var bytes = []; + bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); + tmp.slice(2).forEach(function (b) { + encodeOctet(bytes, parseInt(b, 10)); + }); + + var self = this; + this._ensure(2 + bytes.length); + this.writeByte(tag); + this.writeLength(bytes.length); + bytes.forEach(function (b) { + self.writeByte(b); + }); +}; + + +Writer.prototype.writeLength = function (len) { + if (typeof (len) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(4); + + if (len <= 0x7f) { + this._buf[this._offset++] = len; + } else if (len <= 0xff) { + this._buf[this._offset++] = 0x81; + this._buf[this._offset++] = len; + } else if (len <= 0xffff) { + this._buf[this._offset++] = 0x82; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else if (len <= 0xffffff) { + this._buf[this._offset++] = 0x83; + this._buf[this._offset++] = len >> 16; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else { + throw newInvalidAsn1Error('Length too long (> 4 bytes)'); + } +}; + +Writer.prototype.startSequence = function (tag) { + if (typeof (tag) !== 'number') + tag = ASN1.Sequence | ASN1.Constructor; + + this.writeByte(tag); + this._seq.push(this._offset); + this._ensure(3); + this._offset += 3; +}; + + +Writer.prototype.endSequence = function () { + var seq = this._seq.pop(); + var start = seq + 3; + var len = this._offset - start; + + if (len <= 0x7f) { + this._shift(start, len, -2); + this._buf[seq] = len; + } else if (len <= 0xff) { + this._shift(start, len, -1); + this._buf[seq] = 0x81; + this._buf[seq + 1] = len; + } else if (len <= 0xffff) { + this._buf[seq] = 0x82; + this._buf[seq + 1] = len >> 8; + this._buf[seq + 2] = len; + } else if (len <= 0xffffff) { + this._shift(start, len, 1); + this._buf[seq] = 0x83; + this._buf[seq + 1] = len >> 16; + this._buf[seq + 2] = len >> 8; + this._buf[seq + 3] = len; + } else { + throw newInvalidAsn1Error('Sequence too long'); + } +}; + + +Writer.prototype._shift = function (start, len, shift) { + assert.ok(start !== undefined); + assert.ok(len !== undefined); + assert.ok(shift); + + this._buf.copy(this._buf, start + shift, start, start + len); + this._offset += shift; +}; + +Writer.prototype._ensure = function (len) { + assert.ok(len); + + if (this._size - this._offset < len) { + var sz = this._size * this._options.growthFactor; + if (sz - this._offset < len) + sz += len; + + var buf = Buffer.alloc(sz); + + this._buf.copy(buf, 0, 0, this._offset); + this._buf = buf; + this._size = sz; + } +}; + + + +// --- Exported API + +module.exports = Writer; diff --git a/node_modules/asn1/lib/index.js b/node_modules/asn1/lib/index.js new file mode 100644 index 00000000..ede3ab23 --- /dev/null +++ b/node_modules/asn1/lib/index.js @@ -0,0 +1,20 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +// If you have no idea what ASN.1 or BER is, see this: +// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +var Ber = require('./ber/index'); + + + +// --- Exported API + +module.exports = { + + Ber: Ber, + + BerReader: Ber.Reader, + + BerWriter: Ber.Writer + +}; diff --git a/node_modules/asn1/package.json b/node_modules/asn1/package.json new file mode 100644 index 00000000..e31cce5e --- /dev/null +++ b/node_modules/asn1/package.json @@ -0,0 +1,31 @@ +{ + "author": "Joyent (joyent.com)", + "contributors": [ + "Mark Cavage ", + "David Gwynne ", + "Yunong Xiao ", + "Alex Wilson " + ], + "name": "asn1", + "description": "Contains parsers and serializers for ASN.1 (currently BER only)", + "version": "0.2.6", + "repository": { + "type": "git", + "url": "https://github.com/joyent/node-asn1.git" + }, + "main": "lib/index.js", + "dependencies": { + "safer-buffer": "~2.1.0" + }, + "devDependencies": { + "istanbul": "^0.3.6", + "faucet": "0.0.1", + "tape": "^3.5.0", + "eslint": "2.13.1", + "eslint-plugin-joyent": "~1.3.0" + }, + "scripts": { + "test": "./node_modules/.bin/tape ./test/ber/*.test.js" + }, + "license": "MIT" +} diff --git a/node_modules/assert-plus/AUTHORS b/node_modules/assert-plus/AUTHORS new file mode 100644 index 00000000..1923524f --- /dev/null +++ b/node_modules/assert-plus/AUTHORS @@ -0,0 +1,6 @@ +Dave Eddy +Fred Kuo +Lars-Magnus Skog +Mark Cavage +Patrick Mooney +Rob Gulewich diff --git a/node_modules/assert-plus/CHANGES.md b/node_modules/assert-plus/CHANGES.md new file mode 100644 index 00000000..57d92bfd --- /dev/null +++ b/node_modules/assert-plus/CHANGES.md @@ -0,0 +1,14 @@ +# assert-plus Changelog + +## 1.0.0 + +- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input +- Add assert.finite check. Previous assert.number callers should use this if + they expect Infinity inputs to throw. + +## 0.2.0 + +- Fix `assert.object(null)` so it throws +- Fix optional/arrayOf exports for non-type-of asserts +- Add optiona/arrayOf exports for Stream/Date/Regex/uuid +- Add basic unit test coverage diff --git a/node_modules/assert-plus/README.md b/node_modules/assert-plus/README.md new file mode 100644 index 00000000..ec200d16 --- /dev/null +++ b/node_modules/assert-plus/README.md @@ -0,0 +1,162 @@ +# assert-plus + +This library is a super small wrapper over node's assert module that has two +things: (1) the ability to disable assertions with the environment variable +NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like +`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks +like this: + +```javascript + var assert = require('assert-plus'); + + function fooAccount(options, callback) { + assert.object(options, 'options'); + assert.number(options.id, 'options.id'); + assert.bool(options.isManager, 'options.isManager'); + assert.string(options.name, 'options.name'); + assert.arrayOfString(options.email, 'options.email'); + assert.func(callback, 'callback'); + + // Do stuff + callback(null, {}); + } +``` + +# API + +All methods that *aren't* part of node's core assert API are simply assumed to +take an argument, and then a string 'name' that's not a message; `AssertionError` +will be thrown if the assertion fails with a message like: + + AssertionError: foo (string) is required + at test (/home/mark/work/foo/foo.js:3:9) + at Object. (/home/mark/work/foo/foo.js:15:1) + at Module._compile (module.js:446:26) + at Object..js (module.js:464:10) + at Module.load (module.js:353:31) + at Function._load (module.js:311:12) + at Array.0 (module.js:484:10) + at EventEmitter._tickCallback (node.js:190:38) + +from: + +```javascript + function test(foo) { + assert.string(foo, 'foo'); + } +``` + +There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: + +```javascript + function test(foo) { + assert.arrayOfString(foo, 'foo'); + } +``` + +You can assert IFF an argument is not `undefined` (i.e., an optional arg): + +```javascript + assert.optionalString(foo, 'foo'); +``` + +Lastly, you can opt-out of assertion checking altogether by setting the +environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have +lots of assertions, and don't want to pay `typeof ()` taxes to v8 in +production. Be advised: The standard functions re-exported from `assert` are +also disabled in assert-plus if NDEBUG is specified. Using them directly from +the `assert` module avoids this behavior. + +The complete list of APIs is: + +* assert.array +* assert.bool +* assert.buffer +* assert.func +* assert.number +* assert.finite +* assert.object +* assert.string +* assert.stream +* assert.date +* assert.regexp +* assert.uuid +* assert.arrayOfArray +* assert.arrayOfBool +* assert.arrayOfBuffer +* assert.arrayOfFunc +* assert.arrayOfNumber +* assert.arrayOfFinite +* assert.arrayOfObject +* assert.arrayOfString +* assert.arrayOfStream +* assert.arrayOfDate +* assert.arrayOfRegexp +* assert.arrayOfUuid +* assert.optionalArray +* assert.optionalBool +* assert.optionalBuffer +* assert.optionalFunc +* assert.optionalNumber +* assert.optionalFinite +* assert.optionalObject +* assert.optionalString +* assert.optionalStream +* assert.optionalDate +* assert.optionalRegexp +* assert.optionalUuid +* assert.optionalArrayOfArray +* assert.optionalArrayOfBool +* assert.optionalArrayOfBuffer +* assert.optionalArrayOfFunc +* assert.optionalArrayOfNumber +* assert.optionalArrayOfFinite +* assert.optionalArrayOfObject +* assert.optionalArrayOfString +* assert.optionalArrayOfStream +* assert.optionalArrayOfDate +* assert.optionalArrayOfRegexp +* assert.optionalArrayOfUuid +* assert.AssertionError +* assert.fail +* assert.ok +* assert.equal +* assert.notEqual +* assert.deepEqual +* assert.notDeepEqual +* assert.strictEqual +* assert.notStrictEqual +* assert.throws +* assert.doesNotThrow +* assert.ifError + +# Installation + + npm install assert-plus + +## License + +The MIT License (MIT) +Copyright (c) 2012 Mark Cavage + +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. + +## Bugs + +See . diff --git a/node_modules/assert-plus/assert.js b/node_modules/assert-plus/assert.js new file mode 100644 index 00000000..26f944ee --- /dev/null +++ b/node_modules/assert-plus/assert.js @@ -0,0 +1,211 @@ +// Copyright (c) 2012, Mark Cavage. All rights reserved. +// Copyright 2015 Joyent, Inc. + +var assert = require('assert'); +var Stream = require('stream').Stream; +var util = require('util'); + + +///--- Globals + +/* JSSTYLED */ +var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; + + +///--- Internal + +function _capitalize(str) { + return (str.charAt(0).toUpperCase() + str.slice(1)); +} + +function _toss(name, expected, oper, arg, actual) { + throw new assert.AssertionError({ + message: util.format('%s (%s) is required', name, expected), + actual: (actual === undefined) ? typeof (arg) : actual(arg), + expected: expected, + operator: oper || '===', + stackStartFunction: _toss.caller + }); +} + +function _getClass(arg) { + return (Object.prototype.toString.call(arg).slice(8, -1)); +} + +function noop() { + // Why even bother with asserts? +} + + +///--- Exports + +var types = { + bool: { + check: function (arg) { return typeof (arg) === 'boolean'; } + }, + func: { + check: function (arg) { return typeof (arg) === 'function'; } + }, + string: { + check: function (arg) { return typeof (arg) === 'string'; } + }, + object: { + check: function (arg) { + return typeof (arg) === 'object' && arg !== null; + } + }, + number: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg); + } + }, + finite: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + } + }, + buffer: { + check: function (arg) { return Buffer.isBuffer(arg); }, + operator: 'Buffer.isBuffer' + }, + array: { + check: function (arg) { return Array.isArray(arg); }, + operator: 'Array.isArray' + }, + stream: { + check: function (arg) { return arg instanceof Stream; }, + operator: 'instanceof', + actual: _getClass + }, + date: { + check: function (arg) { return arg instanceof Date; }, + operator: 'instanceof', + actual: _getClass + }, + regexp: { + check: function (arg) { return arg instanceof RegExp; }, + operator: 'instanceof', + actual: _getClass + }, + uuid: { + check: function (arg) { + return typeof (arg) === 'string' && UUID_REGEXP.test(arg); + }, + operator: 'isUUID' + } +}; + +function _setExports(ndebug) { + var keys = Object.keys(types); + var out; + + /* re-export standard assert */ + if (process.env.NODE_NDEBUG) { + out = noop; + } else { + out = function (arg, msg) { + if (!arg) { + _toss(msg, 'true', arg); + } + }; + } + + /* standard checks */ + keys.forEach(function (k) { + if (ndebug) { + out[k] = noop; + return; + } + var type = types[k]; + out[k] = function (arg, msg) { + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* optional checks */ + keys.forEach(function (k) { + var name = 'optional' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* arrayOf checks */ + keys.forEach(function (k) { + var name = 'arrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* optionalArrayOf checks */ + keys.forEach(function (k) { + var name = 'optionalArrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* re-export built-in assertions */ + Object.keys(assert).forEach(function (k) { + if (k === 'AssertionError') { + out[k] = assert[k]; + return; + } + if (ndebug) { + out[k] = noop; + return; + } + out[k] = assert[k]; + }); + + /* export ourselves (for unit tests _only_) */ + out._setExports = _setExports; + + return out; +} + +module.exports = _setExports(process.env.NODE_NDEBUG); diff --git a/node_modules/assert-plus/package.json b/node_modules/assert-plus/package.json new file mode 100644 index 00000000..40d6a5cd --- /dev/null +++ b/node_modules/assert-plus/package.json @@ -0,0 +1,23 @@ +{ + "author": "Mark Cavage ", + "name": "assert-plus", + "description": "Extra assertions on top of node's assert module", + "version": "1.0.0", + "license": "MIT", + "main": "./assert.js", + "devDependencies": { + "tape": "4.2.2", + "faucet": "0.0.1" + }, + "optionalDependencies": {}, + "scripts": { + "test": "./node_modules/.bin/tape tests/*.js | ./node_modules/.bin/faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/mcavage/node-assert-plus.git" + }, + "engines": { + "node": ">=0.8" + } +} diff --git a/node_modules/async/CHANGELOG.md b/node_modules/async/CHANGELOG.md new file mode 100644 index 00000000..8a9a1bfd --- /dev/null +++ b/node_modules/async/CHANGELOG.md @@ -0,0 +1,348 @@ +# v3.2.4 +- Fix a bug in `priorityQueue` where it didn't wait for the result. (#1725) +- Fix a bug where `unshiftAsync` was included in `priorityQueue`. (#1790) + +# v3.2.3 +- Fix bugs in comment parsing in `autoInject`. (#1767, #1780) + +# v3.2.2 +- Fix potential prototype pollution exploit + +# v3.2.1 +- Use `queueMicrotask` if available to the environment (#1761) +- Minor perf improvement in `priorityQueue` (#1727) +- More examples in documentation (#1726) +- Various doc fixes (#1708, #1712, #1717, #1740, #1739, #1749, #1756) +- Improved test coverage (#1754) + +# v3.2.0 +- Fix a bug in Safari related to overwriting `func.name` +- Remove built-in browserify configuration (#1653) +- Varios doc fixes (#1688, #1703, #1704) + +# v3.1.1 +- Allow redefining `name` property on wrapped functions. + +# v3.1.0 + +- Added `q.pushAsync` and `q.unshiftAsync`, analagous to `q.push` and `q.unshift`, except they always do not accept a callback, and reject if processing the task errors. (#1659) +- Promises returned from `q.push` and `q.unshift` when a callback is not passed now resolve even if an error ocurred. (#1659) +- Fixed a parsing bug in `autoInject` with complicated function bodies (#1663) +- Added ES6+ configuration for Browserify bundlers (#1653) +- Various doc fixes (#1664, #1658, #1665, #1652) + +# v3.0.1 + +## Bug fixes +- Fixed a regression where arrays passed to `queue` and `cargo` would be completely flattened. (#1645) +- Clarified Async's browser support (#1643) + + +# v3.0.0 + +The `async`/`await` release! + +There are a lot of new features and subtle breaking changes in this major version, but the biggest feature is that most Async methods return a Promise if you omit the callback, meaning you can `await` them from within an `async` function. + +```js +const results = await async.mapLimit(urls, 5, async url => { + const resp = await fetch(url) + return resp.body +}) +``` + +## Breaking Changes +- Most Async methods return a Promise when the final callback is omitted, making them `await`-able! (#1572) +- We are now making heavy use of ES2015 features, this means we have dropped out-of-the-box support for Node 4 and earlier, and many old versions of browsers. (#1541, #1553) +- In `queue`, `priorityQueue`, `cargo` and `cargoQueue`, the "event"-style methods, like `q.drain` and `q.saturated` are now methods that register a callback, rather than properties you assign a callback to. They are now of the form `q.drain(callback)`. If you do not pass a callback a Promise will be returned for the next occurrence of the event, making them `await`-able, e.g. `await q.drain()`. (#1586, #1641) +- Calling `callback(false)` will cancel an async method, preventing further iteration and callback calls. This is useful for preventing memory leaks when you break out of an async flow by calling an outer callback. (#1064, #1542) +- `during` and `doDuring` have been removed, and instead `whilst`, `doWhilst`, `until` and `doUntil` now have asynchronous `test` functions. (#850, #1557) +- `limits` of less than 1 now cause an error to be thrown in queues and collection methods. (#1249, #1552) +- `memoize` no longer memoizes errors (#1465, #1466) +- `applyEach`/`applyEachSeries` have a simpler interface, to make them more easily type-able. It always returns a function that takes in a single callback argument. If that callback is omitted, a promise is returned, making it awaitable. (#1228, #1640) + +## New Features +- Async generators are now supported in all the Collection methods. (#1560) +- Added `cargoQueue`, a queue with both `concurrency` and `payload` size parameters. (#1567) +- Queue objects returned from `queue` now have a `Symbol.iterator` method, meaning they can be iterated over to inspect the current list of items in the queue. (#1459, #1556) +- A ESM-flavored `async.mjs` is included in the `async` package. This is described in the `package.json` `"module"` field, meaning it should be automatically used by Webpack and other compatible bundlers. + +## Bug fixes +- Better handle arbitrary error objects in `asyncify` (#1568, #1569) + +## Other +- Removed Lodash as a dependency (#1283, #1528) +- Miscellaneous docs fixes (#1393, #1501, #1540, #1543, #1558, #1563, #1564, #1579, #1581) +- Miscellaneous test fixes (#1538) + +------- + +# v2.6.1 +- Updated lodash to prevent `npm audit` warnings. (#1532, #1533) +- Made `async-es` more optimized for webpack users (#1517) +- Fixed a stack overflow with large collections and a synchronous iterator (#1514) +- Various small fixes/chores (#1505, #1511, #1527, #1530) + +# v2.6.0 +- Added missing aliases for many methods. Previously, you could not (e.g.) `require('async/find')` or use `async.anyLimit`. (#1483) +- Improved `queue` performance. (#1448, #1454) +- Add missing sourcemap (#1452, #1453) +- Various doc updates (#1448, #1471, #1483) + +# v2.5.0 +- Added `concatLimit`, the `Limit` equivalent of [`concat`](https://caolan.github.io/async/docs.html#concat) ([#1426](https://github.com/caolan/async/issues/1426), [#1430](https://github.com/caolan/async/pull/1430)) +- `concat` improvements: it now preserves order, handles falsy values and the `iteratee` callback takes a variable number of arguments ([#1437](https://github.com/caolan/async/issues/1437), [#1436](https://github.com/caolan/async/pull/1436)) +- Fixed an issue in `queue` where there was a size discrepancy between `workersList().length` and `running()` ([#1428](https://github.com/caolan/async/issues/1428), [#1429](https://github.com/caolan/async/pull/1429)) +- Various doc fixes ([#1422](https://github.com/caolan/async/issues/1422), [#1424](https://github.com/caolan/async/pull/1424)) + +# v2.4.1 +- Fixed a bug preventing functions wrapped with `timeout()` from being re-used. ([#1418](https://github.com/caolan/async/issues/1418), [#1419](https://github.com/caolan/async/issues/1419)) + +# v2.4.0 +- Added `tryEach`, for running async functions in parallel, where you only expect one to succeed. ([#1365](https://github.com/caolan/async/issues/1365), [#687](https://github.com/caolan/async/issues/687)) +- Improved performance, most notably in `parallel` and `waterfall` ([#1395](https://github.com/caolan/async/issues/1395)) +- Added `queue.remove()`, for removing items in a `queue` ([#1397](https://github.com/caolan/async/issues/1397), [#1391](https://github.com/caolan/async/issues/1391)) +- Fixed using `eval`, preventing Async from running in pages with Content Security Policy ([#1404](https://github.com/caolan/async/issues/1404), [#1403](https://github.com/caolan/async/issues/1403)) +- Fixed errors thrown in an `asyncify`ed function's callback being caught by the underlying Promise ([#1408](https://github.com/caolan/async/issues/1408)) +- Fixed timing of `queue.empty()` ([#1367](https://github.com/caolan/async/issues/1367)) +- Various doc fixes ([#1314](https://github.com/caolan/async/issues/1314), [#1394](https://github.com/caolan/async/issues/1394), [#1412](https://github.com/caolan/async/issues/1412)) + +# v2.3.0 +- Added support for ES2017 `async` functions. Wherever you can pass a Node-style/CPS function that uses a callback, you can also pass an `async` function. Previously, you had to wrap `async` functions with `asyncify`. The caveat is that it will only work if `async` functions are supported natively in your environment, transpiled implementations can't be detected. ([#1386](https://github.com/caolan/async/issues/1386), [#1390](https://github.com/caolan/async/issues/1390)) +- Small doc fix ([#1392](https://github.com/caolan/async/issues/1392)) + +# v2.2.0 +- Added `groupBy`, and the `Series`/`Limit` equivalents, analogous to [`_.groupBy`](http://lodash.com/docs#groupBy) ([#1364](https://github.com/caolan/async/issues/1364)) +- Fixed `transform` bug when `callback` was not passed ([#1381](https://github.com/caolan/async/issues/1381)) +- Added note about `reflect` to `parallel` docs ([#1385](https://github.com/caolan/async/issues/1385)) + +# v2.1.5 +- Fix `auto` bug when function names collided with Array.prototype ([#1358](https://github.com/caolan/async/issues/1358)) +- Improve some error messages ([#1349](https://github.com/caolan/async/issues/1349)) +- Avoid stack overflow case in queue +- Fixed an issue in `some`, `every` and `find` where processing would continue after the result was determined. +- Cleanup implementations of `some`, `every` and `find` + +# v2.1.3 +- Make bundle size smaller +- Create optimized hotpath for `filter` in array case. + +# v2.1.2 +- Fixed a stackoverflow bug with `detect`, `some`, `every` on large inputs ([#1293](https://github.com/caolan/async/issues/1293)). + +# v2.1.0 + +- `retry` and `retryable` now support an optional `errorFilter` function that determines if the `task` should retry on the error ([#1256](https://github.com/caolan/async/issues/1256), [#1261](https://github.com/caolan/async/issues/1261)) +- Optimized array iteration in `race`, `cargo`, `queue`, and `priorityQueue` ([#1253](https://github.com/caolan/async/issues/1253)) +- Added alias documentation to doc site ([#1251](https://github.com/caolan/async/issues/1251), [#1254](https://github.com/caolan/async/issues/1254)) +- Added [BootStrap scrollspy](http://getbootstrap.com/javascript/#scrollspy) to docs to highlight in the sidebar the current method being viewed ([#1289](https://github.com/caolan/async/issues/1289), [#1300](https://github.com/caolan/async/issues/1300)) +- Various minor doc fixes ([#1263](https://github.com/caolan/async/issues/1263), [#1264](https://github.com/caolan/async/issues/1264), [#1271](https://github.com/caolan/async/issues/1271), [#1278](https://github.com/caolan/async/issues/1278), [#1280](https://github.com/caolan/async/issues/1280), [#1282](https://github.com/caolan/async/issues/1282), [#1302](https://github.com/caolan/async/issues/1302)) + +# v2.0.1 + +- Significantly optimized all iteration based collection methods such as `each`, `map`, `filter`, etc ([#1245](https://github.com/caolan/async/issues/1245), [#1246](https://github.com/caolan/async/issues/1246), [#1247](https://github.com/caolan/async/issues/1247)). + +# v2.0.0 + +Lots of changes here! + +First and foremost, we have a slick new [site for docs](https://caolan.github.io/async/). Special thanks to [**@hargasinski**](https://github.com/hargasinski) for his work converting our old docs to `jsdoc` format and implementing the new website. Also huge ups to [**@ivanseidel**](https://github.com/ivanseidel) for designing our new logo. It was a long process for both of these tasks, but I think these changes turned out extraordinary well. + +The biggest feature is modularization. You can now `require("async/series")` to only require the `series` function. Every Async library function is available this way. You still can `require("async")` to require the entire library, like you could do before. + +We also provide Async as a collection of ES2015 modules. You can now `import {each} from 'async-es'` or `import waterfall from 'async-es/waterfall'`. If you are using only a few Async functions, and are using a ES bundler such as Rollup, this can significantly lower your build size. + +Major thanks to [**@Kikobeats**](github.com/Kikobeats), [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for doing the majority of the modularization work, as well as [**@jdalton**](github.com/jdalton) and [**@Rich-Harris**](github.com/Rich-Harris) for advisory work on the general modularization strategy. + +Another one of the general themes of the 2.0 release is standardization of what an "async" function is. We are now more strictly following the node-style continuation passing style. That is, an async function is a function that: + +1. Takes a variable number of arguments +2. The last argument is always a callback +3. The callback can accept any number of arguments +4. The first argument passed to the callback will be treated as an error result, if the argument is truthy +5. Any number of result arguments can be passed after the "error" argument +6. The callback is called once and exactly once, either on the same tick or later tick of the JavaScript event loop. + +There were several cases where Async accepted some functions that did not strictly have these properties, most notably `auto`, `every`, `some`, `filter`, `reject` and `detect`. + +Another theme is performance. We have eliminated internal deferrals in all cases where they make sense. For example, in `waterfall` and `auto`, there was a `setImmediate` between each task -- these deferrals have been removed. A `setImmediate` call can add up to 1ms of delay. This might not seem like a lot, but it can add up if you are using many Async functions in the course of processing a HTTP request, for example. Nearly all asynchronous functions that do I/O already have some sort of deferral built in, so the extra deferral is unnecessary. The trade-off of this change is removing our built-in stack-overflow defense. Many synchronous callback calls in series can quickly overflow the JS call stack. If you do have a function that is sometimes synchronous (calling its callback on the same tick), and are running into stack overflows, wrap it with `async.ensureAsync()`. + +Another big performance win has been re-implementing `queue`, `cargo`, and `priorityQueue` with [doubly linked lists](https://en.wikipedia.org/wiki/Doubly_linked_list) instead of arrays. This has lead to queues being an order of [magnitude faster on large sets of tasks](https://github.com/caolan/async/pull/1205). + +## New Features + +- Async is now modularized. Individual functions can be `require()`d from the main package. (`require('async/auto')`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996)) +- Async is also available as a collection of ES2015 modules in the new `async-es` package. (`import {forEachSeries} from 'async-es'`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996)) +- Added `race`, analogous to `Promise.race()`. It will run an array of async tasks in parallel and will call its callback with the result of the first task to respond. ([#568](https://github.com/caolan/async/issues/568), [#1038](https://github.com/caolan/async/issues/1038)) +- Collection methods now accept ES2015 iterators. Maps, Sets, and anything that implements the iterator spec can now be passed directly to `each`, `map`, `parallel`, etc.. ([#579](https://github.com/caolan/async/issues/579), [#839](https://github.com/caolan/async/issues/839), [#1074](https://github.com/caolan/async/issues/1074)) +- Added `mapValues`, for mapping over the properties of an object and returning an object with the same keys. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177)) +- Added `timeout`, a wrapper for an async function that will make the task time-out after the specified time. ([#1007](https://github.com/caolan/async/issues/1007), [#1027](https://github.com/caolan/async/issues/1027)) +- Added `reflect` and `reflectAll`, analagous to [`Promise.reflect()`](http://bluebirdjs.com/docs/api/reflect.html), a wrapper for async tasks that always succeeds, by gathering results and errors into an object. ([#942](https://github.com/caolan/async/issues/942), [#1012](https://github.com/caolan/async/issues/1012), [#1095](https://github.com/caolan/async/issues/1095)) +- `constant` supports dynamic arguments -- it will now always use its last argument as the callback. ([#1016](https://github.com/caolan/async/issues/1016), [#1052](https://github.com/caolan/async/issues/1052)) +- `setImmediate` and `nextTick` now support arguments to partially apply to the deferred function, like the node-native versions do. ([#940](https://github.com/caolan/async/issues/940), [#1053](https://github.com/caolan/async/issues/1053)) +- `auto` now supports resolving cyclic dependencies using [Kahn's algorithm](https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm) ([#1140](https://github.com/caolan/async/issues/1140)). +- Added `autoInject`, a relative of `auto` that automatically spreads a task's dependencies as arguments to the task function. ([#608](https://github.com/caolan/async/issues/608), [#1055](https://github.com/caolan/async/issues/1055), [#1099](https://github.com/caolan/async/issues/1099), [#1100](https://github.com/caolan/async/issues/1100)) +- You can now limit the concurrency of `auto` tasks. ([#635](https://github.com/caolan/async/issues/635), [#637](https://github.com/caolan/async/issues/637)) +- Added `retryable`, a relative of `retry` that wraps an async function, making it retry when called. ([#1058](https://github.com/caolan/async/issues/1058)) +- `retry` now supports specifying a function that determines the next time interval, useful for exponential backoff, logging and other retry strategies. ([#1161](https://github.com/caolan/async/issues/1161)) +- `retry` will now pass all of the arguments the task function was resolved with to the callback ([#1231](https://github.com/caolan/async/issues/1231)). +- Added `q.unsaturated` -- callback called when a `queue`'s number of running workers falls below a threshold. ([#868](https://github.com/caolan/async/issues/868), [#1030](https://github.com/caolan/async/issues/1030), [#1033](https://github.com/caolan/async/issues/1033), [#1034](https://github.com/caolan/async/issues/1034)) +- Added `q.error` -- a callback called whenever a `queue` task calls its callback with an error. ([#1170](https://github.com/caolan/async/issues/1170)) +- `applyEach` and `applyEachSeries` now pass results to the final callback. ([#1088](https://github.com/caolan/async/issues/1088)) + +## Breaking changes + +- Calling a callback more than once is considered an error, and an error will be thrown. This had an explicit breaking change in `waterfall`. If you were relying on this behavior, you should more accurately represent your control flow as an event emitter or stream. ([#814](https://github.com/caolan/async/issues/814), [#815](https://github.com/caolan/async/issues/815), [#1048](https://github.com/caolan/async/issues/1048), [#1050](https://github.com/caolan/async/issues/1050)) +- `auto` task functions now always take the callback as the last argument. If a task has dependencies, the `results` object will be passed as the first argument. To migrate old task functions, wrap them with [`_.flip`](https://lodash.com/docs#flip) ([#1036](https://github.com/caolan/async/issues/1036), [#1042](https://github.com/caolan/async/issues/1042)) +- Internal `setImmediate` calls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. Use `ensureAsync` to work around this. ([#696](https://github.com/caolan/async/issues/696), [#704](https://github.com/caolan/async/issues/704), [#1049](https://github.com/caolan/async/issues/1049), [#1050](https://github.com/caolan/async/issues/1050)) +- `map` used to return an object when iterating over an object. `map` now always returns an array, like in other libraries. The previous object behavior has been split out into `mapValues`. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177)) +- `filter`, `reject`, `some`, `every`, `detect` and their families like `{METHOD}Series` and `{METHOD}Limit` now expect an error as the first callback argument, rather than just a simple boolean. Pass `null` as the first argument, or use `fs.access` instead of `fs.exists`. ([#118](https://github.com/caolan/async/issues/118), [#774](https://github.com/caolan/async/issues/774), [#1028](https://github.com/caolan/async/issues/1028), [#1041](https://github.com/caolan/async/issues/1041)) +- `{METHOD}` and `{METHOD}Series` are now implemented in terms of `{METHOD}Limit`. This is a major internal simplification, and is not expected to cause many problems, but it does subtly affect how functions execute internally. ([#778](https://github.com/caolan/async/issues/778), [#847](https://github.com/caolan/async/issues/847)) +- `retry`'s callback is now optional. Previously, omitting the callback would partially apply the function, meaning it could be passed directly as a task to `series` or `auto`. The partially applied "control-flow" behavior has been separated out into `retryable`. ([#1054](https://github.com/caolan/async/issues/1054), [#1058](https://github.com/caolan/async/issues/1058)) +- The test function for `whilst`, `until`, and `during` used to be passed non-error args from the iteratee function's callback, but this led to weirdness where the first call of the test function would be passed no args. We have made it so the test function is never passed extra arguments, and only the `doWhilst`, `doUntil`, and `doDuring` functions pass iteratee callback arguments to the test function ([#1217](https://github.com/caolan/async/issues/1217), [#1224](https://github.com/caolan/async/issues/1224)) +- The `q.tasks` array has been renamed `q._tasks` and is now implemented as a doubly linked list (DLL). Any code that used to interact with this array will need to be updated to either use the provided helpers or support DLLs ([#1205](https://github.com/caolan/async/issues/1205)). +- The timing of the `q.saturated()` callback in a `queue` has been modified to better reflect when tasks pushed to the queue will start queueing. ([#724](https://github.com/caolan/async/issues/724), [#1078](https://github.com/caolan/async/issues/1078)) +- Removed `iterator` method in favour of [ES2015 iterator protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators ) which natively supports arrays ([#1237](https://github.com/caolan/async/issues/1237)) +- Dropped support for Component, Jam, SPM, and Volo ([#1175](https://github.com/caolan/async/issues/1175), #[#176](https://github.com/caolan/async/issues/176)) + +## Bug Fixes + +- Improved handling of no dependency cases in `auto` & `autoInject` ([#1147](https://github.com/caolan/async/issues/1147)). +- Fixed a bug where the callback generated by `asyncify` with `Promises` could resolve twice ([#1197](https://github.com/caolan/async/issues/1197)). +- Fixed several documented optional callbacks not actually being optional ([#1223](https://github.com/caolan/async/issues/1223)). + +## Other + +- Added `someSeries` and `everySeries` for symmetry, as well as a complete set of `any`/`anyLimit`/`anySeries` and `all`/`/allLmit`/`allSeries` aliases. +- Added `find` as an alias for `detect. (as well as `findLimit` and `findSeries`). +- Various doc fixes ([#1005](https://github.com/caolan/async/issues/1005), [#1008](https://github.com/caolan/async/issues/1008), [#1010](https://github.com/caolan/async/issues/1010), [#1015](https://github.com/caolan/async/issues/1015), [#1021](https://github.com/caolan/async/issues/1021), [#1037](https://github.com/caolan/async/issues/1037), [#1039](https://github.com/caolan/async/issues/1039), [#1051](https://github.com/caolan/async/issues/1051), [#1102](https://github.com/caolan/async/issues/1102), [#1107](https://github.com/caolan/async/issues/1107), [#1121](https://github.com/caolan/async/issues/1121), [#1123](https://github.com/caolan/async/issues/1123), [#1129](https://github.com/caolan/async/issues/1129), [#1135](https://github.com/caolan/async/issues/1135), [#1138](https://github.com/caolan/async/issues/1138), [#1141](https://github.com/caolan/async/issues/1141), [#1153](https://github.com/caolan/async/issues/1153), [#1216](https://github.com/caolan/async/issues/1216), [#1217](https://github.com/caolan/async/issues/1217), [#1232](https://github.com/caolan/async/issues/1232), [#1233](https://github.com/caolan/async/issues/1233), [#1236](https://github.com/caolan/async/issues/1236), [#1238](https://github.com/caolan/async/issues/1238)) + +Thank you [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for taking the lead on version 2 of async. + +------------------------------------------ + +# v1.5.2 +- Allow using `"constructor"` as an argument in `memoize` ([#998](https://github.com/caolan/async/issues/998)) +- Give a better error messsage when `auto` dependency checking fails ([#994](https://github.com/caolan/async/issues/994)) +- Various doc updates ([#936](https://github.com/caolan/async/issues/936), [#956](https://github.com/caolan/async/issues/956), [#979](https://github.com/caolan/async/issues/979), [#1002](https://github.com/caolan/async/issues/1002)) + +# v1.5.1 +- Fix issue with `pause` in `queue` with concurrency enabled ([#946](https://github.com/caolan/async/issues/946)) +- `while` and `until` now pass the final result to callback ([#963](https://github.com/caolan/async/issues/963)) +- `auto` will properly handle concurrency when there is no callback ([#966](https://github.com/caolan/async/issues/966)) +- `auto` will no. properly stop execution when an error occurs ([#988](https://github.com/caolan/async/issues/988), [#993](https://github.com/caolan/async/issues/993)) +- Various doc fixes ([#971](https://github.com/caolan/async/issues/971), [#980](https://github.com/caolan/async/issues/980)) + +# v1.5.0 + +- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) ([#892](https://github.com/caolan/async/issues/892)) +- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. ([#873](https://github.com/caolan/async/issues/873)) +- `auto` now accepts an optional `concurrency` argument to limit the number o. running tasks ([#637](https://github.com/caolan/async/issues/637)) +- Added `queue#workersList()`, to retrieve the lis. of currently running tasks. ([#891](https://github.com/caolan/async/issues/891)) +- Various code simplifications ([#896](https://github.com/caolan/async/issues/896), [#904](https://github.com/caolan/async/issues/904)) +- Various doc fixes :scroll: ([#890](https://github.com/caolan/async/issues/890), [#894](https://github.com/caolan/async/issues/894), [#903](https://github.com/caolan/async/issues/903), [#905](https://github.com/caolan/async/issues/905), [#912](https://github.com/caolan/async/issues/912)) + +# v1.4.2 + +- Ensure coverage files don't get published on npm ([#879](https://github.com/caolan/async/issues/879)) + +# v1.4.1 + +- Add in overlooked `detectLimit` method ([#866](https://github.com/caolan/async/issues/866)) +- Removed unnecessary files from npm releases ([#861](https://github.com/caolan/async/issues/861)) +- Removed usage of a reserved word to prevent :boom: in older environments ([#870](https://github.com/caolan/async/issues/870)) + +# v1.4.0 + +- `asyncify` now supports promises ([#840](https://github.com/caolan/async/issues/840)) +- Added `Limit` versions of `filter` and `reject` ([#836](https://github.com/caolan/async/issues/836)) +- Add `Limit` versions of `detect`, `some` and `every` ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829)) +- `some`, `every` and `detect` now short circuit early ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829)) +- Improve detection of the global object ([#804](https://github.com/caolan/async/issues/804)), enabling use in WebWorkers +- `whilst` now called with arguments from iterator ([#823](https://github.com/caolan/async/issues/823)) +- `during` now gets called with arguments from iterator ([#824](https://github.com/caolan/async/issues/824)) +- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0)) + + +# v1.3.0 + +New Features: +- Added `constant` +- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. ([#671](https://github.com/caolan/async/issues/671), [#806](https://github.com/caolan/async/issues/806)) +- Added `during` and `doDuring`, which are like `whilst` with an async truth test. ([#800](https://github.com/caolan/async/issues/800)) +- `retry` now accepts an `interval` parameter to specify a delay between retries. ([#793](https://github.com/caolan/async/issues/793)) +- `async` should work better in Web Workers due to better `root` detection ([#804](https://github.com/caolan/async/issues/804)) +- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` ([#642](https://github.com/caolan/async/issues/642)) +- Various internal updates ([#786](https://github.com/caolan/async/issues/786), [#801](https://github.com/caolan/async/issues/801), [#802](https://github.com/caolan/async/issues/802), [#803](https://github.com/caolan/async/issues/803)) +- Various doc fixes ([#790](https://github.com/caolan/async/issues/790), [#794](https://github.com/caolan/async/issues/794)) + +Bug Fixes: +- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. ([#740](https://github.com/caolan/async/issues/740), [#744](https://github.com/caolan/async/issues/744), [#783](https://github.com/caolan/async/issues/783)) + + +# v1.2.1 + +Bug Fix: + +- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782)) + + +# v1.2.0 + +New Features: + +- Added `timesLimit` ([#743](https://github.com/caolan/async/issues/743)) +- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. ([#747](https://github.com/caolan/async/issues/747), [#772](https://github.com/caolan/async/issues/772)) + +Bug Fixes: + +- Fixed a regression in `each` and family with empty arrays that have additional properties. ([#775](https://github.com/caolan/async/issues/775), [#777](https://github.com/caolan/async/issues/777)) + + +# v1.1.1 + +Bug Fix: + +- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782)) + + +# v1.1.0 + +New Features: + +- `cargo` now supports all of the same methods and event callbacks as `queue`. +- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. ([#769](https://github.com/caolan/async/issues/769)) +- Optimized `map`, `eachOf`, and `waterfall` families of functions +- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array ([#667](https://github.com/caolan/async/issues/667)). +- The callback is now optional for the composed results of `compose` and `seq`. ([#618](https://github.com/caolan/async/issues/618)) +- Reduced file size by 4kb, (minified version by 1kb) +- Added code coverage through `nyc` and `coveralls` ([#768](https://github.com/caolan/async/issues/768)) + +Bug Fixes: + +- `forever` will no longer stack overflow with a synchronous iterator ([#622](https://github.com/caolan/async/issues/622)) +- `eachLimit` and other limit functions will stop iterating once an error occurs ([#754](https://github.com/caolan/async/issues/754)) +- Always pass `null` in callbacks when there is no error ([#439](https://github.com/caolan/async/issues/439)) +- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue ([#668](https://github.com/caolan/async/issues/668)) +- `each` and family will properly handle an empty array ([#578](https://github.com/caolan/async/issues/578)) +- `eachSeries` and family will finish if the underlying array is modified during execution ([#557](https://github.com/caolan/async/issues/557)) +- `queue` will throw if a non-function is passed to `q.push()` ([#593](https://github.com/caolan/async/issues/593)) +- Doc fixes ([#629](https://github.com/caolan/async/issues/629), [#766](https://github.com/caolan/async/issues/766)) + + +# v1.0.0 + +No known breaking changes, we are simply complying with semver from here on out. + +Changes: + +- Start using a changelog! +- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) ([#168](https://github.com/caolan/async/issues/168) [#704](https://github.com/caolan/async/issues/704) [#321](https://github.com/caolan/async/issues/321)) +- Detect deadlocks in `auto` ([#663](https://github.com/caolan/async/issues/663)) +- Better support for require.js ([#527](https://github.com/caolan/async/issues/527)) +- Throw if queue created with concurrency `0` ([#714](https://github.com/caolan/async/issues/714)) +- Fix unneeded iteration in `queue.resume()` ([#758](https://github.com/caolan/async/issues/758)) +- Guard against timer mocking overriding `setImmediate` ([#609](https://github.com/caolan/async/issues/609) [#611](https://github.com/caolan/async/issues/611)) +- Miscellaneous doc fixes ([#542](https://github.com/caolan/async/issues/542) [#596](https://github.com/caolan/async/issues/596) [#615](https://github.com/caolan/async/issues/615) [#628](https://github.com/caolan/async/issues/628) [#631](https://github.com/caolan/async/issues/631) [#690](https://github.com/caolan/async/issues/690) [#729](https://github.com/caolan/async/issues/729)) +- Use single noop function internally ([#546](https://github.com/caolan/async/issues/546)) +- Optimize internal `_each`, `_map` and `_keys` functions. diff --git a/node_modules/async/LICENSE b/node_modules/async/LICENSE new file mode 100644 index 00000000..b18aed69 --- /dev/null +++ b/node_modules/async/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010-2018 Caolan McMahon + +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/async/README.md b/node_modules/async/README.md new file mode 100644 index 00000000..77f645e2 --- /dev/null +++ b/node_modules/async/README.md @@ -0,0 +1,59 @@ +![Async Logo](https://raw.githubusercontent.com/caolan/async/master/logo/async-logo_readme.jpg) + +![Github Actions CI status](https://github.com/caolan/async/actions/workflows/ci.yml/badge.svg) +[![NPM version](https://img.shields.io/npm/v/async.svg)](https://www.npmjs.com/package/async) +[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master) +[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/async/badge?style=rounded)](https://www.jsdelivr.com/package/npm/async) + + + +Async is a utility module which provides straight-forward, powerful functions for working with [asynchronous JavaScript](http://caolan.github.io/async/v3/global.html). Although originally designed for use with [Node.js](https://nodejs.org/) and installable via `npm i async`, it can also be used directly in the browser. A ESM/MJS version is included in the main `async` package that should automatically be used with compatible bundlers such as Webpack and Rollup. + +A pure ESM version of Async is available as [`async-es`](https://www.npmjs.com/package/async-es). + +For Documentation, visit + +*For Async v1.5.x documentation, go [HERE](https://github.com/caolan/async/blob/v1.5.2/README.md)* + + +```javascript +// for use with Node-style callbacks... +var async = require("async"); + +var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; +var configs = {}; + +async.forEachOf(obj, (value, key, callback) => { + fs.readFile(__dirname + value, "utf8", (err, data) => { + if (err) return callback(err); + try { + configs[key] = JSON.parse(data); + } catch (e) { + return callback(e); + } + callback(); + }); +}, err => { + if (err) console.error(err.message); + // configs is now a map of JSON data + doSomethingWith(configs); +}); +``` + +```javascript +var async = require("async"); + +// ...or ES2017 async functions +async.mapLimit(urls, 5, async function(url) { + const response = await fetch(url) + return response.body +}, (err, results) => { + if (err) throw err + // results is now an array of the response bodies + console.log(results) +}) +``` diff --git a/node_modules/async/all.js b/node_modules/async/all.js new file mode 100644 index 00000000..148db683 --- /dev/null +++ b/node_modules/async/all.js @@ -0,0 +1,119 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns `true` if every element in `coll` satisfies an async test. If any + * iteratee call returns `false`, the main `callback` is immediately called. + * + * @name every + * @static + * @memberOf module:Collections + * @method + * @alias all + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.every(fileList, fileExists, function(err, result) { + * console.log(result); + * // true + * // result is true since every file exists + * }); + * + * async.every(withMissingFileList, fileExists, function(err, result) { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }); + * + * // Using Promises + * async.every(fileList, fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.every(withMissingFileList, fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.every(fileList, fileExists); + * console.log(result); + * // true + * // result is true since every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.every(withMissingFileList, fileExists); + * console.log(result); + * // false + * // result is false since NOT every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function every(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(every, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/allLimit.js b/node_modules/async/allLimit.js new file mode 100644 index 00000000..25b2c089 --- /dev/null +++ b/node_modules/async/allLimit.js @@ -0,0 +1,46 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. + * + * @name everyLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everyLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(everyLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/allSeries.js b/node_modules/async/allSeries.js new file mode 100644 index 00000000..147c3dc5 --- /dev/null +++ b/node_modules/async/allSeries.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. + * + * @name everySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in series. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everySeries(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(everySeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/any.js b/node_modules/async/any.js new file mode 100644 index 00000000..2046cf64 --- /dev/null +++ b/node_modules/async/any.js @@ -0,0 +1,122 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns `true` if at least one element in the `coll` satisfies an async test. + * If any iteratee call returns `true`, the main `callback` is immediately + * called. + * + * @name some + * @static + * @memberOf module:Collections + * @method + * @alias any + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + *); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // false + * // result is false since none of the files exists + * } + *); + * + * // Using Promises + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since some file in the list exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since none of the files exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); + * console.log(result); + * // false + * // result is false since none of the files exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function some(coll, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(some, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/anyLimit.js b/node_modules/async/anyLimit.js new file mode 100644 index 00000000..c8a295a8 --- /dev/null +++ b/node_modules/async/anyLimit.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. + * + * @name someLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anyLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(someLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/anySeries.js b/node_modules/async/anySeries.js new file mode 100644 index 00000000..ee0654ba --- /dev/null +++ b/node_modules/async/anySeries.js @@ -0,0 +1,46 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. + * + * @name someSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anySeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in series. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someSeries(coll, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(someSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/apply.js b/node_modules/async/apply.js new file mode 100644 index 00000000..5246833a --- /dev/null +++ b/node_modules/async/apply.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (fn, ...args) { + return (...callArgs) => fn(...args, ...callArgs); +}; + +module.exports = exports["default"]; /** + * Creates a continuation function with some arguments already applied. + * + * Useful as a shorthand when combined with other control flow functions. Any + * arguments passed to the returned function are added to the arguments + * originally passed to apply. + * + * @name apply + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {Function} fn - The function you want to eventually apply all + * arguments to. Invokes with (arguments...). + * @param {...*} arguments... - Any number of arguments to automatically apply + * when the continuation is called. + * @returns {Function} the partially-applied function + * @example + * + * // using apply + * async.parallel([ + * async.apply(fs.writeFile, 'testfile1', 'test1'), + * async.apply(fs.writeFile, 'testfile2', 'test2') + * ]); + * + * + * // the same process without using apply + * async.parallel([ + * function(callback) { + * fs.writeFile('testfile1', 'test1', callback); + * }, + * function(callback) { + * fs.writeFile('testfile2', 'test2', callback); + * } + * ]); + * + * // It's possible to pass any number of additional arguments when calling the + * // continuation: + * + * node> var fn = async.apply(sys.puts, 'one'); + * node> fn('two', 'three'); + * one + * two + * three + */ \ No newline at end of file diff --git a/node_modules/async/applyEach.js b/node_modules/async/applyEach.js new file mode 100644 index 00000000..b08c6701 --- /dev/null +++ b/node_modules/async/applyEach.js @@ -0,0 +1,57 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _applyEach = require('./internal/applyEach.js'); + +var _applyEach2 = _interopRequireDefault(_applyEach); + +var _map = require('./map.js'); + +var _map2 = _interopRequireDefault(_map); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Applies the provided arguments to each function in the array, calling + * `callback` after all functions have completed. If you only provide the first + * argument, `fns`, then it will return a function which lets you pass in the + * arguments as if it were a single function call. If more arguments are + * provided, `callback` is required while `args` is still optional. The results + * for each of the applied async functions are passed to the final callback + * as an array. + * + * @name applyEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s + * to all call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - Returns a function that takes no args other than + * an optional callback, that is the result of applying the `args` to each + * of the functions. + * @example + * + * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') + * + * appliedFn((err, results) => { + * // results[0] is the results for `enableSearch` + * // results[1] is the results for `updateSchema` + * }); + * + * // partial application example: + * async.each( + * buckets, + * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), + * callback + * ); + */ +exports.default = (0, _applyEach2.default)(_map2.default); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/applyEachSeries.js b/node_modules/async/applyEachSeries.js new file mode 100644 index 00000000..6a19ca3f --- /dev/null +++ b/node_modules/async/applyEachSeries.js @@ -0,0 +1,37 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _applyEach = require('./internal/applyEach.js'); + +var _applyEach2 = _interopRequireDefault(_applyEach); + +var _mapSeries = require('./mapSeries.js'); + +var _mapSeries2 = _interopRequireDefault(_mapSeries); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. + * + * @name applyEachSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.applyEach]{@link module:ControlFlow.applyEach} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all + * call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - A function, that when called, is the result of + * appling the `args` to the list of functions. It takes no args, other than + * a callback. + */ +exports.default = (0, _applyEach2.default)(_mapSeries2.default); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/asyncify.js b/node_modules/async/asyncify.js new file mode 100644 index 00000000..3c3bf886 --- /dev/null +++ b/node_modules/async/asyncify.js @@ -0,0 +1,118 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = asyncify; + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _setImmediate = require('./internal/setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Take a sync function and make it async, passing its return value to a + * callback. This is useful for plugging sync functions into a waterfall, + * series, or other async functions. Any arguments passed to the generated + * function will be passed to the wrapped function (except for the final + * callback argument). Errors thrown will be passed to the callback. + * + * If the function passed to `asyncify` returns a Promise, that promises's + * resolved/rejected state will be used to call the callback, rather than simply + * the synchronous return value. + * + * This also means you can asyncify ES2017 `async` functions. + * + * @name asyncify + * @static + * @memberOf module:Utils + * @method + * @alias wrapSync + * @category Util + * @param {Function} func - The synchronous function, or Promise-returning + * function to convert to an {@link AsyncFunction}. + * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be + * invoked with `(args..., callback)`. + * @example + * + * // passing a regular synchronous function + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(JSON.parse), + * function (data, next) { + * // data is the result of parsing the text. + * // If there was a parsing error, it would have been caught. + * } + * ], callback); + * + * // passing a function returning a promise + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(function (contents) { + * return db.model.create(contents); + * }), + * function (model, next) { + * // `model` is the instantiated model object. + * // If there was an error, this function would be skipped. + * } + * ], callback); + * + * // es2017 example, though `asyncify` is not needed if your JS environment + * // supports async functions out of the box + * var q = async.queue(async.asyncify(async function(file) { + * var intermediateStep = await processFile(file); + * return await somePromise(intermediateStep) + * })); + * + * q.push(files); + */ +function asyncify(func) { + if ((0, _wrapAsync.isAsync)(func)) { + return function (...args /*, callback*/) { + const callback = args.pop(); + const promise = func.apply(this, args); + return handlePromise(promise, callback); + }; + } + + return (0, _initialParams2.default)(function (args, callback) { + var result; + try { + result = func.apply(this, args); + } catch (e) { + return callback(e); + } + // if result is Promise object + if (result && typeof result.then === 'function') { + return handlePromise(result, callback); + } else { + callback(null, result); + } + }); +} + +function handlePromise(promise, callback) { + return promise.then(value => { + invokeCallback(callback, null, value); + }, err => { + invokeCallback(callback, err && err.message ? err : new Error(err)); + }); +} + +function invokeCallback(callback, error, value) { + try { + callback(error, value); + } catch (err) { + (0, _setImmediate2.default)(e => { + throw e; + }, err); + } +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/auto.js b/node_modules/async/auto.js new file mode 100644 index 00000000..c4a85d43 --- /dev/null +++ b/node_modules/async/auto.js @@ -0,0 +1,333 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = auto; + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _promiseCallback = require('./internal/promiseCallback.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on + * their requirements. Each function can optionally depend on other functions + * being completed first, and each function is run as soon as its requirements + * are satisfied. + * + * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence + * will stop. Further tasks will not execute (so any other functions depending + * on it will not run), and the main `callback` is immediately called with the + * error. + * + * {@link AsyncFunction}s also receive an object containing the results of functions which + * have completed so far as the first argument, if they have dependencies. If a + * task function has no dependencies, it will only be passed a callback. + * + * @name auto + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Object} tasks - An object. Each of its properties is either a + * function or an array of requirements, with the {@link AsyncFunction} itself the last item + * in the array. The object's key of a property serves as the name of the task + * defined by that property, i.e. can be used when specifying requirements for + * other tasks. The function receives one or two arguments: + * * a `results` object, containing the results of the previously executed + * functions, only passed if the task has any dependencies, + * * a `callback(err, result)` function, which must be called when finished, + * passing an `error` (which can be `null`) and the result of the function's + * execution. + * @param {number} [concurrency=Infinity] - An optional `integer` for + * determining the maximum number of tasks that can be run in parallel. By + * default, as many as possible. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback. Results are always returned; however, if an + * error occurs, no further `tasks` will be performed, and the results object + * will only contain partial results. Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * @example + * + * //Using Callbacks + * async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }, function(err, results) { + * if (err) { + * console.log('err = ', err); + * } + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }); + * + * //Using Promises + * async.auto({ + * get_data: function(callback) { + * console.log('in get_data'); + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * console.log('in make_folder'); + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }).then(results => { + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }).catch(err => { + * console.log('err = ', err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }); + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function auto(tasks, concurrency, callback) { + if (typeof concurrency !== 'number') { + // concurrency is optional, shift the args. + callback = concurrency; + concurrency = null; + } + callback = (0, _once2.default)(callback || (0, _promiseCallback.promiseCallback)()); + var numTasks = Object.keys(tasks).length; + if (!numTasks) { + return callback(null); + } + if (!concurrency) { + concurrency = numTasks; + } + + var results = {}; + var runningTasks = 0; + var canceled = false; + var hasError = false; + + var listeners = Object.create(null); + + var readyTasks = []; + + // for cycle detection: + var readyToCheck = []; // tasks that have been identified as reachable + // without the possibility of returning to an ancestor task + var uncheckedDependencies = {}; + + Object.keys(tasks).forEach(key => { + var task = tasks[key]; + if (!Array.isArray(task)) { + // no dependencies + enqueueTask(key, [task]); + readyToCheck.push(key); + return; + } + + var dependencies = task.slice(0, task.length - 1); + var remainingDependencies = dependencies.length; + if (remainingDependencies === 0) { + enqueueTask(key, task); + readyToCheck.push(key); + return; + } + uncheckedDependencies[key] = remainingDependencies; + + dependencies.forEach(dependencyName => { + if (!tasks[dependencyName]) { + throw new Error('async.auto task `' + key + '` has a non-existent dependency `' + dependencyName + '` in ' + dependencies.join(', ')); + } + addListener(dependencyName, () => { + remainingDependencies--; + if (remainingDependencies === 0) { + enqueueTask(key, task); + } + }); + }); + }); + + checkForDeadlocks(); + processQueue(); + + function enqueueTask(key, task) { + readyTasks.push(() => runTask(key, task)); + } + + function processQueue() { + if (canceled) return; + if (readyTasks.length === 0 && runningTasks === 0) { + return callback(null, results); + } + while (readyTasks.length && runningTasks < concurrency) { + var run = readyTasks.shift(); + run(); + } + } + + function addListener(taskName, fn) { + var taskListeners = listeners[taskName]; + if (!taskListeners) { + taskListeners = listeners[taskName] = []; + } + + taskListeners.push(fn); + } + + function taskComplete(taskName) { + var taskListeners = listeners[taskName] || []; + taskListeners.forEach(fn => fn()); + processQueue(); + } + + function runTask(key, task) { + if (hasError) return; + + var taskCallback = (0, _onlyOnce2.default)((err, ...result) => { + runningTasks--; + if (err === false) { + canceled = true; + return; + } + if (result.length < 2) { + [result] = result; + } + if (err) { + var safeResults = {}; + Object.keys(results).forEach(rkey => { + safeResults[rkey] = results[rkey]; + }); + safeResults[key] = result; + hasError = true; + listeners = Object.create(null); + if (canceled) return; + callback(err, safeResults); + } else { + results[key] = result; + taskComplete(key); + } + }); + + runningTasks++; + var taskFn = (0, _wrapAsync2.default)(task[task.length - 1]); + if (task.length > 1) { + taskFn(results, taskCallback); + } else { + taskFn(taskCallback); + } + } + + function checkForDeadlocks() { + // Kahn's algorithm + // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm + // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html + var currentTask; + var counter = 0; + while (readyToCheck.length) { + currentTask = readyToCheck.pop(); + counter++; + getDependents(currentTask).forEach(dependent => { + if (--uncheckedDependencies[dependent] === 0) { + readyToCheck.push(dependent); + } + }); + } + + if (counter !== numTasks) { + throw new Error('async.auto cannot execute tasks due to a recursive dependency'); + } + } + + function getDependents(taskName) { + var result = []; + Object.keys(tasks).forEach(key => { + const task = tasks[key]; + if (Array.isArray(task) && task.indexOf(taskName) >= 0) { + result.push(key); + } + }); + return result; + } + + return callback[_promiseCallback.PROMISE_SYMBOL]; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/autoInject.js b/node_modules/async/autoInject.js new file mode 100644 index 00000000..393baad6 --- /dev/null +++ b/node_modules/async/autoInject.js @@ -0,0 +1,182 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = autoInject; + +var _auto = require('./auto.js'); + +var _auto2 = _interopRequireDefault(_auto); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; +var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /(=.+)?(\s*)$/; + +function stripComments(string) { + let stripped = ''; + let index = 0; + let endBlockComment = string.indexOf('*/'); + while (index < string.length) { + if (string[index] === '/' && string[index + 1] === '/') { + // inline comment + let endIndex = string.indexOf('\n', index); + index = endIndex === -1 ? string.length : endIndex; + } else if (endBlockComment !== -1 && string[index] === '/' && string[index + 1] === '*') { + // block comment + let endIndex = string.indexOf('*/', index); + if (endIndex !== -1) { + index = endIndex + 2; + endBlockComment = string.indexOf('*/', index); + } else { + stripped += string[index]; + index++; + } + } else { + stripped += string[index]; + index++; + } + } + return stripped; +} + +function parseParams(func) { + const src = stripComments(func.toString()); + let match = src.match(FN_ARGS); + if (!match) { + match = src.match(ARROW_FN_ARGS); + } + if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src); + let [, args] = match; + return args.replace(/\s/g, '').split(FN_ARG_SPLIT).map(arg => arg.replace(FN_ARG, '').trim()); +} + +/** + * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent + * tasks are specified as parameters to the function, after the usual callback + * parameter, with the parameter names matching the names of the tasks it + * depends on. This can provide even more readable task graphs which can be + * easier to maintain. + * + * If a final callback is specified, the task results are similarly injected, + * specified as named parameters after the initial error parameter. + * + * The autoInject function is purely syntactic sugar and its semantics are + * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. + * + * @name autoInject + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.auto]{@link module:ControlFlow.auto} + * @category Control Flow + * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of + * the form 'func([dependencies...], callback). The object's key of a property + * serves as the name of the task defined by that property, i.e. can be used + * when specifying requirements for other tasks. + * * The `callback` parameter is a `callback(err, result)` which must be called + * when finished, passing an `error` (which can be `null`) and the result of + * the function's execution. The remaining parameters name other tasks on + * which the task is dependent, and the results from those tasks are the + * arguments of those parameters. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback, and a `results` object with any completed + * task results, similar to `auto`. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // The example from `auto` can be rewritten as follows: + * async.autoInject({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: function(get_data, make_folder, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }, + * email_link: function(write_file, callback) { + * // once the file is written let's email a link to it... + * // write_file contains the filename returned by write_file. + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * } + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + * + * // If you are using a JS minifier that mangles parameter names, `autoInject` + * // will not work with plain functions, since the parameter names will be + * // collapsed to a single letter identifier. To work around this, you can + * // explicitly specify the names of the parameters your task function needs + * // in an array, similar to Angular.js dependency injection. + * + * // This still has an advantage over plain `auto`, since the results a task + * // depends on are still spread into arguments. + * async.autoInject({ + * //... + * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(write_file, callback) { + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * }] + * //... + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + */ +function autoInject(tasks, callback) { + var newTasks = {}; + + Object.keys(tasks).forEach(key => { + var taskFn = tasks[key]; + var params; + var fnIsAsync = (0, _wrapAsync.isAsync)(taskFn); + var hasNoDeps = !fnIsAsync && taskFn.length === 1 || fnIsAsync && taskFn.length === 0; + + if (Array.isArray(taskFn)) { + params = [...taskFn]; + taskFn = params.pop(); + + newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); + } else if (hasNoDeps) { + // no dependencies, use the function as-is + newTasks[key] = taskFn; + } else { + params = parseParams(taskFn); + if (taskFn.length === 0 && !fnIsAsync && params.length === 0) { + throw new Error("autoInject task functions require explicit parameters."); + } + + // remove callback param + if (!fnIsAsync) params.pop(); + + newTasks[key] = params.concat(newTask); + } + + function newTask(results, taskCb) { + var newArgs = params.map(name => results[name]); + newArgs.push(taskCb); + (0, _wrapAsync2.default)(taskFn)(...newArgs); + } + }); + + return (0, _auto2.default)(newTasks, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/bower.json b/node_modules/async/bower.json new file mode 100644 index 00000000..390c6502 --- /dev/null +++ b/node_modules/async/bower.json @@ -0,0 +1,17 @@ +{ + "name": "async", + "main": "dist/async.js", + "ignore": [ + "bower_components", + "lib", + "test", + "node_modules", + "perf", + "support", + "**/.*", + "*.config.js", + "*.json", + "index.js", + "Makefile" + ] +} diff --git a/node_modules/async/cargo.js b/node_modules/async/cargo.js new file mode 100644 index 00000000..aa385f8a --- /dev/null +++ b/node_modules/async/cargo.js @@ -0,0 +1,63 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = cargo; + +var _queue = require('./internal/queue.js'); + +var _queue2 = _interopRequireDefault(_queue); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Creates a `cargo` object with the specified payload. Tasks added to the + * cargo will be processed altogether (up to the `payload` limit). If the + * `worker` is in progress, the task is queued until it becomes available. Once + * the `worker` has completed some tasks, each callback of those tasks is + * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) + * for how `cargo` and `queue` work. + * + * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers + * at a time, cargo passes an array of tasks to a single worker, repeating + * when the worker is finished. + * + * @name cargo + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An asynchronous function for processing an array + * of queued tasks. Invoked with `(tasks, callback)`. + * @param {number} [payload=Infinity] - An optional `integer` for determining + * how many tasks should be processed per round; if omitted, the default is + * unlimited. + * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can + * attached as certain properties to listen for specific events during the + * lifecycle of the cargo and inner queue. + * @example + * + * // create a cargo object with payload 2 + * var cargo = async.cargo(function(tasks, callback) { + * for (var i=0; i { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir) + * .then(results => { + * console.log(results); + * }).catch(err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.concat(directoryList, fs.readdir); + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.concat(withMissingDirectoryList, fs.readdir); + * console.log(results); + * } catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } + * } + * + */ +function concat(coll, iteratee, callback) { + return (0, _concatLimit2.default)(coll, Infinity, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(concat, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/concatLimit.js b/node_modules/async/concatLimit.js new file mode 100644 index 00000000..3d170f17 --- /dev/null +++ b/node_modules/async/concatLimit.js @@ -0,0 +1,60 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _mapLimit = require('./mapLimit.js'); + +var _mapLimit2 = _interopRequireDefault(_mapLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. + * + * @name concatLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapLimit + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatLimit(coll, limit, iteratee, callback) { + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { + _iteratee(val, (err, ...args) => { + if (err) return iterCb(err); + return iterCb(err, args); + }); + }, (err, mapResults) => { + var result = []; + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + result = result.concat(...mapResults[i]); + } + } + + return callback(err, result); + }); +} +exports.default = (0, _awaitify2.default)(concatLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/concatSeries.js b/node_modules/async/concatSeries.js new file mode 100644 index 00000000..84add3b0 --- /dev/null +++ b/node_modules/async/concatSeries.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _concatLimit = require('./concatLimit.js'); + +var _concatLimit2 = _interopRequireDefault(_concatLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. + * + * @name concatSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapSeries + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. + * The iteratee should complete with an array an array of results. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatSeries(coll, iteratee, callback) { + return (0, _concatLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(concatSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/constant.js b/node_modules/async/constant.js new file mode 100644 index 00000000..07596538 --- /dev/null +++ b/node_modules/async/constant.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (...args) { + return function (...ignoredArgs /*, callback*/) { + var callback = ignoredArgs.pop(); + return callback(null, ...args); + }; +}; + +module.exports = exports["default"]; /** + * Returns a function that when called, calls-back with the values provided. + * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to + * [`auto`]{@link module:ControlFlow.auto}. + * + * @name constant + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {...*} arguments... - Any number of arguments to automatically invoke + * callback with. + * @returns {AsyncFunction} Returns a function that when invoked, automatically + * invokes the callback with the previous given arguments. + * @example + * + * async.waterfall([ + * async.constant(42), + * function (value, next) { + * // value === 42 + * }, + * //... + * ], callback); + * + * async.waterfall([ + * async.constant(filename, "utf8"), + * fs.readFile, + * function (fileData, next) { + * //... + * } + * //... + * ], callback); + * + * async.auto({ + * hostname: async.constant("https://server.net/"), + * port: findFreePort, + * launchServer: ["hostname", "port", function (options, cb) { + * startServer(options, cb); + * }], + * //... + * }, callback); + */ \ No newline at end of file diff --git a/node_modules/async/detect.js b/node_modules/async/detect.js new file mode 100644 index 00000000..05b2e5c6 --- /dev/null +++ b/node_modules/async/detect.js @@ -0,0 +1,96 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns the first value in `coll` that passes an async truth test. The + * `iteratee` is applied in parallel, meaning the first iteratee to return + * `true` will fire the detect `callback` with that result. That means the + * result might not be the first item in the original `coll` (in terms of order) + * that passes the test. + + * If order within the original `coll` is important, then look at + * [`detectSeries`]{@link module:Collections.detectSeries}. + * + * @name detect + * @static + * @memberOf module:Collections + * @method + * @alias find + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * } + *); + * + * // Using Promises + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) + * .then(result => { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); + * console.log(result); + * // dir1/file1.txt + * // result now equals the file in the list that exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function detect(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(detect, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/detectLimit.js b/node_modules/async/detectLimit.js new file mode 100644 index 00000000..db6961ec --- /dev/null +++ b/node_modules/async/detectLimit.js @@ -0,0 +1,48 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a + * time. + * + * @name detectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findLimit + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(detectLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/detectSeries.js b/node_modules/async/detectSeries.js new file mode 100644 index 00000000..b9131b4a --- /dev/null +++ b/node_modules/async/detectSeries.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. + * + * @name detectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findSeries + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectSeries(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(1), coll, iteratee, callback); +} + +exports.default = (0, _awaitify2.default)(detectSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/dir.js b/node_modules/async/dir.js new file mode 100644 index 00000000..950d0a22 --- /dev/null +++ b/node_modules/async/dir.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _consoleFunc = require('./internal/consoleFunc.js'); + +var _consoleFunc2 = _interopRequireDefault(_consoleFunc); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Logs the result of an [`async` function]{@link AsyncFunction} to the + * `console` using `console.dir` to display the properties of the resulting object. + * Only works in Node.js or in browsers that support `console.dir` and + * `console.error` (such as FF and Chrome). + * If multiple arguments are returned from the async function, + * `console.dir` is called on each argument in order. + * + * @name dir + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, {hello: name}); + * }, 1000); + * }; + * + * // in the node repl + * node> async.dir(hello, 'world'); + * {hello: 'world'} + */ +exports.default = (0, _consoleFunc2.default)('dir'); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/dist/async.js b/node_modules/async/dist/async.js new file mode 100644 index 00000000..8d5e7825 --- /dev/null +++ b/node_modules/async/dist/async.js @@ -0,0 +1,6059 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.async = {}))); +}(this, (function (exports) { 'use strict'; + + /** + * Creates a continuation function with some arguments already applied. + * + * Useful as a shorthand when combined with other control flow functions. Any + * arguments passed to the returned function are added to the arguments + * originally passed to apply. + * + * @name apply + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {Function} fn - The function you want to eventually apply all + * arguments to. Invokes with (arguments...). + * @param {...*} arguments... - Any number of arguments to automatically apply + * when the continuation is called. + * @returns {Function} the partially-applied function + * @example + * + * // using apply + * async.parallel([ + * async.apply(fs.writeFile, 'testfile1', 'test1'), + * async.apply(fs.writeFile, 'testfile2', 'test2') + * ]); + * + * + * // the same process without using apply + * async.parallel([ + * function(callback) { + * fs.writeFile('testfile1', 'test1', callback); + * }, + * function(callback) { + * fs.writeFile('testfile2', 'test2', callback); + * } + * ]); + * + * // It's possible to pass any number of additional arguments when calling the + * // continuation: + * + * node> var fn = async.apply(sys.puts, 'one'); + * node> fn('two', 'three'); + * one + * two + * three + */ + function apply(fn, ...args) { + return (...callArgs) => fn(...args,...callArgs); + } + + function initialParams (fn) { + return function (...args/*, callback*/) { + var callback = args.pop(); + return fn.call(this, args, callback); + }; + } + + /* istanbul ignore file */ + + var hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; + var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; + var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; + + function fallback(fn) { + setTimeout(fn, 0); + } + + function wrap(defer) { + return (fn, ...args) => defer(() => fn(...args)); + } + + var _defer; + + if (hasQueueMicrotask) { + _defer = queueMicrotask; + } else if (hasSetImmediate) { + _defer = setImmediate; + } else if (hasNextTick) { + _defer = process.nextTick; + } else { + _defer = fallback; + } + + var setImmediate$1 = wrap(_defer); + + /** + * Take a sync function and make it async, passing its return value to a + * callback. This is useful for plugging sync functions into a waterfall, + * series, or other async functions. Any arguments passed to the generated + * function will be passed to the wrapped function (except for the final + * callback argument). Errors thrown will be passed to the callback. + * + * If the function passed to `asyncify` returns a Promise, that promises's + * resolved/rejected state will be used to call the callback, rather than simply + * the synchronous return value. + * + * This also means you can asyncify ES2017 `async` functions. + * + * @name asyncify + * @static + * @memberOf module:Utils + * @method + * @alias wrapSync + * @category Util + * @param {Function} func - The synchronous function, or Promise-returning + * function to convert to an {@link AsyncFunction}. + * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be + * invoked with `(args..., callback)`. + * @example + * + * // passing a regular synchronous function + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(JSON.parse), + * function (data, next) { + * // data is the result of parsing the text. + * // If there was a parsing error, it would have been caught. + * } + * ], callback); + * + * // passing a function returning a promise + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(function (contents) { + * return db.model.create(contents); + * }), + * function (model, next) { + * // `model` is the instantiated model object. + * // If there was an error, this function would be skipped. + * } + * ], callback); + * + * // es2017 example, though `asyncify` is not needed if your JS environment + * // supports async functions out of the box + * var q = async.queue(async.asyncify(async function(file) { + * var intermediateStep = await processFile(file); + * return await somePromise(intermediateStep) + * })); + * + * q.push(files); + */ + function asyncify(func) { + if (isAsync(func)) { + return function (...args/*, callback*/) { + const callback = args.pop(); + const promise = func.apply(this, args); + return handlePromise(promise, callback) + } + } + + return initialParams(function (args, callback) { + var result; + try { + result = func.apply(this, args); + } catch (e) { + return callback(e); + } + // if result is Promise object + if (result && typeof result.then === 'function') { + return handlePromise(result, callback) + } else { + callback(null, result); + } + }); + } + + function handlePromise(promise, callback) { + return promise.then(value => { + invokeCallback(callback, null, value); + }, err => { + invokeCallback(callback, err && err.message ? err : new Error(err)); + }); + } + + function invokeCallback(callback, error, value) { + try { + callback(error, value); + } catch (err) { + setImmediate$1(e => { throw e }, err); + } + } + + function isAsync(fn) { + return fn[Symbol.toStringTag] === 'AsyncFunction'; + } + + function isAsyncGenerator(fn) { + return fn[Symbol.toStringTag] === 'AsyncGenerator'; + } + + function isAsyncIterable(obj) { + return typeof obj[Symbol.asyncIterator] === 'function'; + } + + function wrapAsync(asyncFn) { + if (typeof asyncFn !== 'function') throw new Error('expected a function') + return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; + } + + // conditionally promisify a function. + // only return a promise if a callback is omitted + function awaitify (asyncFn, arity = asyncFn.length) { + if (!arity) throw new Error('arity is undefined') + function awaitable (...args) { + if (typeof args[arity - 1] === 'function') { + return asyncFn.apply(this, args) + } + + return new Promise((resolve, reject) => { + args[arity - 1] = (err, ...cbArgs) => { + if (err) return reject(err) + resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); + }; + asyncFn.apply(this, args); + }) + } + + return awaitable + } + + function applyEach (eachfn) { + return function applyEach(fns, ...callArgs) { + const go = awaitify(function (callback) { + var that = this; + return eachfn(fns, (fn, cb) => { + wrapAsync(fn).apply(that, callArgs.concat(cb)); + }, callback); + }); + return go; + }; + } + + function _asyncMap(eachfn, arr, iteratee, callback) { + arr = arr || []; + var results = []; + var counter = 0; + var _iteratee = wrapAsync(iteratee); + + return eachfn(arr, (value, _, iterCb) => { + var index = counter++; + _iteratee(value, (err, v) => { + results[index] = v; + iterCb(err); + }); + }, err => { + callback(err, results); + }); + } + + function isArrayLike(value) { + return value && + typeof value.length === 'number' && + value.length >= 0 && + value.length % 1 === 0; + } + + // A temporary value used to identify if the loop should be broken. + // See #1064, #1293 + const breakLoop = {}; + + function once(fn) { + function wrapper (...args) { + if (fn === null) return; + var callFn = fn; + fn = null; + callFn.apply(this, args); + } + Object.assign(wrapper, fn); + return wrapper + } + + function getIterator (coll) { + return coll[Symbol.iterator] && coll[Symbol.iterator](); + } + + function createArrayIterator(coll) { + var i = -1; + var len = coll.length; + return function next() { + return ++i < len ? {value: coll[i], key: i} : null; + } + } + + function createES2015Iterator(iterator) { + var i = -1; + return function next() { + var item = iterator.next(); + if (item.done) + return null; + i++; + return {value: item.value, key: i}; + } + } + + function createObjectIterator(obj) { + var okeys = obj ? Object.keys(obj) : []; + var i = -1; + var len = okeys.length; + return function next() { + var key = okeys[++i]; + if (key === '__proto__') { + return next(); + } + return i < len ? {value: obj[key], key} : null; + }; + } + + function createIterator(coll) { + if (isArrayLike(coll)) { + return createArrayIterator(coll); + } + + var iterator = getIterator(coll); + return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); + } + + function onlyOnce(fn) { + return function (...args) { + if (fn === null) throw new Error("Callback was already called."); + var callFn = fn; + fn = null; + callFn.apply(this, args); + }; + } + + // for async generators + function asyncEachOfLimit(generator, limit, iteratee, callback) { + let done = false; + let canceled = false; + let awaiting = false; + let running = 0; + let idx = 0; + + function replenish() { + //console.log('replenish') + if (running >= limit || awaiting || done) return + //console.log('replenish awaiting') + awaiting = true; + generator.next().then(({value, done: iterDone}) => { + //console.log('got value', value) + if (canceled || done) return + awaiting = false; + if (iterDone) { + done = true; + if (running <= 0) { + //console.log('done nextCb') + callback(null); + } + return; + } + running++; + iteratee(value, idx, iterateeCallback); + idx++; + replenish(); + }).catch(handleError); + } + + function iterateeCallback(err, result) { + //console.log('iterateeCallback') + running -= 1; + if (canceled) return + if (err) return handleError(err) + + if (err === false) { + done = true; + canceled = true; + return + } + + if (result === breakLoop || (done && running <= 0)) { + done = true; + //console.log('done iterCb') + return callback(null); + } + replenish(); + } + + function handleError(err) { + if (canceled) return + awaiting = false; + done = true; + callback(err); + } + + replenish(); + } + + var eachOfLimit = (limit) => { + return (obj, iteratee, callback) => { + callback = once(callback); + if (limit <= 0) { + throw new RangeError('concurrency limit cannot be less than 1') + } + if (!obj) { + return callback(null); + } + if (isAsyncGenerator(obj)) { + return asyncEachOfLimit(obj, limit, iteratee, callback) + } + if (isAsyncIterable(obj)) { + return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback) + } + var nextElem = createIterator(obj); + var done = false; + var canceled = false; + var running = 0; + var looping = false; + + function iterateeCallback(err, value) { + if (canceled) return + running -= 1; + if (err) { + done = true; + callback(err); + } + else if (err === false) { + done = true; + canceled = true; + } + else if (value === breakLoop || (done && running <= 0)) { + done = true; + return callback(null); + } + else if (!looping) { + replenish(); + } + } + + function replenish () { + looping = true; + while (running < limit && !done) { + var elem = nextElem(); + if (elem === null) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running += 1; + iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); + } + looping = false; + } + + replenish(); + }; + }; + + /** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a + * time. + * + * @name eachOfLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. The `key` is the item's key, or index in the case of an + * array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ + function eachOfLimit$1(coll, limit, iteratee, callback) { + return eachOfLimit(limit)(coll, wrapAsync(iteratee), callback); + } + + var eachOfLimit$2 = awaitify(eachOfLimit$1, 4); + + // eachOf implementation optimized for array-likes + function eachOfArrayLike(coll, iteratee, callback) { + callback = once(callback); + var index = 0, + completed = 0, + {length} = coll, + canceled = false; + if (length === 0) { + callback(null); + } + + function iteratorCallback(err, value) { + if (err === false) { + canceled = true; + } + if (canceled === true) return + if (err) { + callback(err); + } else if ((++completed === length) || value === breakLoop) { + callback(null); + } + } + + for (; index < length; index++) { + iteratee(coll[index], index, onlyOnce(iteratorCallback)); + } + } + + // a generic version of eachOf which can handle array, object, and iterator cases. + function eachOfGeneric (coll, iteratee, callback) { + return eachOfLimit$2(coll, Infinity, iteratee, callback); + } + + /** + * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument + * to the iteratee. + * + * @name eachOf + * @static + * @memberOf module:Collections + * @method + * @alias forEachOf + * @category Collection + * @see [async.each]{@link module:Collections.each} + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each + * item in `coll`. + * The `key` is the item's key, or index in the case of an array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dev.json is a file containing a valid json object config for dev environment + * // dev.json is a file containing a valid json object config for test environment + * // prod.json is a file containing a valid json object config for prod environment + * // invalid.json is a file with a malformed json object + * + * let configs = {}; //global variable + * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; + * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; + * + * // asynchronous function that reads a json file and parses the contents as json object + * function parseFile(file, key, callback) { + * fs.readFile(file, "utf8", function(err, data) { + * if (err) return calback(err); + * try { + * configs[key] = JSON.parse(data); + * } catch (e) { + * return callback(e); + * } + * callback(); + * }); + * } + * + * // Using callbacks + * async.forEachOf(validConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * } else { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * // JSON parse error exception + * } else { + * console.log(configs); + * } + * }); + * + * // Using Promises + * async.forEachOf(validConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * }).catch( err => { + * console.error(err); + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * }).catch( err => { + * console.error(err); + * // JSON parse error exception + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.forEachOf(validConfigFileMap, parseFile); + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * catch (err) { + * console.log(err); + * } + * } + * + * //Error handing + * async () => { + * try { + * let result = await async.forEachOf(invalidConfigFileMap, parseFile); + * console.log(configs); + * } + * catch (err) { + * console.log(err); + * // JSON parse error exception + * } + * } + * + */ + function eachOf(coll, iteratee, callback) { + var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; + return eachOfImplementation(coll, wrapAsync(iteratee), callback); + } + + var eachOf$1 = awaitify(eachOf, 3); + + /** + * Produces a new collection of values by mapping each value in `coll` through + * the `iteratee` function. The `iteratee` is called with an item from `coll` + * and a callback for when it has finished processing. Each of these callbacks + * takes 2 arguments: an `error`, and the transformed item from `coll`. If + * `iteratee` passes an error to its callback, the main `callback` (for the + * `map` function) is immediately called with the error. + * + * Note, that since this function applies the `iteratee` to each item in + * parallel, there is no guarantee that the `iteratee` functions will complete + * in order. However, the results array will be in the same order as the + * original `coll`. + * + * If `map` is passed an Object, the results will be an Array. The results + * will roughly be in the order of the original Objects' keys (but this can + * vary across JavaScript engines). + * + * @name map + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an Array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.map(fileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.map(fileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.map(fileList, getFileSizeInBytes); + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.map(withMissingFileList, getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ + function map (coll, iteratee, callback) { + return _asyncMap(eachOf$1, coll, iteratee, callback) + } + var map$1 = awaitify(map, 3); + + /** + * Applies the provided arguments to each function in the array, calling + * `callback` after all functions have completed. If you only provide the first + * argument, `fns`, then it will return a function which lets you pass in the + * arguments as if it were a single function call. If more arguments are + * provided, `callback` is required while `args` is still optional. The results + * for each of the applied async functions are passed to the final callback + * as an array. + * + * @name applyEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s + * to all call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - Returns a function that takes no args other than + * an optional callback, that is the result of applying the `args` to each + * of the functions. + * @example + * + * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') + * + * appliedFn((err, results) => { + * // results[0] is the results for `enableSearch` + * // results[1] is the results for `updateSchema` + * }); + * + * // partial application example: + * async.each( + * buckets, + * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), + * callback + * ); + */ + var applyEach$1 = applyEach(map$1); + + /** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. + * + * @name eachOfSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ + function eachOfSeries(coll, iteratee, callback) { + return eachOfLimit$2(coll, 1, iteratee, callback) + } + var eachOfSeries$1 = awaitify(eachOfSeries, 3); + + /** + * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. + * + * @name mapSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ + function mapSeries (coll, iteratee, callback) { + return _asyncMap(eachOfSeries$1, coll, iteratee, callback) + } + var mapSeries$1 = awaitify(mapSeries, 3); + + /** + * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. + * + * @name applyEachSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.applyEach]{@link module:ControlFlow.applyEach} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all + * call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - A function, that when called, is the result of + * appling the `args` to the list of functions. It takes no args, other than + * a callback. + */ + var applyEachSeries = applyEach(mapSeries$1); + + const PROMISE_SYMBOL = Symbol('promiseCallback'); + + function promiseCallback () { + let resolve, reject; + function callback (err, ...args) { + if (err) return reject(err) + resolve(args.length > 1 ? args : args[0]); + } + + callback[PROMISE_SYMBOL] = new Promise((res, rej) => { + resolve = res, + reject = rej; + }); + + return callback + } + + /** + * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on + * their requirements. Each function can optionally depend on other functions + * being completed first, and each function is run as soon as its requirements + * are satisfied. + * + * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence + * will stop. Further tasks will not execute (so any other functions depending + * on it will not run), and the main `callback` is immediately called with the + * error. + * + * {@link AsyncFunction}s also receive an object containing the results of functions which + * have completed so far as the first argument, if they have dependencies. If a + * task function has no dependencies, it will only be passed a callback. + * + * @name auto + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Object} tasks - An object. Each of its properties is either a + * function or an array of requirements, with the {@link AsyncFunction} itself the last item + * in the array. The object's key of a property serves as the name of the task + * defined by that property, i.e. can be used when specifying requirements for + * other tasks. The function receives one or two arguments: + * * a `results` object, containing the results of the previously executed + * functions, only passed if the task has any dependencies, + * * a `callback(err, result)` function, which must be called when finished, + * passing an `error` (which can be `null`) and the result of the function's + * execution. + * @param {number} [concurrency=Infinity] - An optional `integer` for + * determining the maximum number of tasks that can be run in parallel. By + * default, as many as possible. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback. Results are always returned; however, if an + * error occurs, no further `tasks` will be performed, and the results object + * will only contain partial results. Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * @example + * + * //Using Callbacks + * async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }, function(err, results) { + * if (err) { + * console.log('err = ', err); + * } + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }); + * + * //Using Promises + * async.auto({ + * get_data: function(callback) { + * console.log('in get_data'); + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * console.log('in make_folder'); + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }).then(results => { + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }).catch(err => { + * console.log('err = ', err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }); + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function auto(tasks, concurrency, callback) { + if (typeof concurrency !== 'number') { + // concurrency is optional, shift the args. + callback = concurrency; + concurrency = null; + } + callback = once(callback || promiseCallback()); + var numTasks = Object.keys(tasks).length; + if (!numTasks) { + return callback(null); + } + if (!concurrency) { + concurrency = numTasks; + } + + var results = {}; + var runningTasks = 0; + var canceled = false; + var hasError = false; + + var listeners = Object.create(null); + + var readyTasks = []; + + // for cycle detection: + var readyToCheck = []; // tasks that have been identified as reachable + // without the possibility of returning to an ancestor task + var uncheckedDependencies = {}; + + Object.keys(tasks).forEach(key => { + var task = tasks[key]; + if (!Array.isArray(task)) { + // no dependencies + enqueueTask(key, [task]); + readyToCheck.push(key); + return; + } + + var dependencies = task.slice(0, task.length - 1); + var remainingDependencies = dependencies.length; + if (remainingDependencies === 0) { + enqueueTask(key, task); + readyToCheck.push(key); + return; + } + uncheckedDependencies[key] = remainingDependencies; + + dependencies.forEach(dependencyName => { + if (!tasks[dependencyName]) { + throw new Error('async.auto task `' + key + + '` has a non-existent dependency `' + + dependencyName + '` in ' + + dependencies.join(', ')); + } + addListener(dependencyName, () => { + remainingDependencies--; + if (remainingDependencies === 0) { + enqueueTask(key, task); + } + }); + }); + }); + + checkForDeadlocks(); + processQueue(); + + function enqueueTask(key, task) { + readyTasks.push(() => runTask(key, task)); + } + + function processQueue() { + if (canceled) return + if (readyTasks.length === 0 && runningTasks === 0) { + return callback(null, results); + } + while(readyTasks.length && runningTasks < concurrency) { + var run = readyTasks.shift(); + run(); + } + + } + + function addListener(taskName, fn) { + var taskListeners = listeners[taskName]; + if (!taskListeners) { + taskListeners = listeners[taskName] = []; + } + + taskListeners.push(fn); + } + + function taskComplete(taskName) { + var taskListeners = listeners[taskName] || []; + taskListeners.forEach(fn => fn()); + processQueue(); + } + + + function runTask(key, task) { + if (hasError) return; + + var taskCallback = onlyOnce((err, ...result) => { + runningTasks--; + if (err === false) { + canceled = true; + return + } + if (result.length < 2) { + [result] = result; + } + if (err) { + var safeResults = {}; + Object.keys(results).forEach(rkey => { + safeResults[rkey] = results[rkey]; + }); + safeResults[key] = result; + hasError = true; + listeners = Object.create(null); + if (canceled) return + callback(err, safeResults); + } else { + results[key] = result; + taskComplete(key); + } + }); + + runningTasks++; + var taskFn = wrapAsync(task[task.length - 1]); + if (task.length > 1) { + taskFn(results, taskCallback); + } else { + taskFn(taskCallback); + } + } + + function checkForDeadlocks() { + // Kahn's algorithm + // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm + // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html + var currentTask; + var counter = 0; + while (readyToCheck.length) { + currentTask = readyToCheck.pop(); + counter++; + getDependents(currentTask).forEach(dependent => { + if (--uncheckedDependencies[dependent] === 0) { + readyToCheck.push(dependent); + } + }); + } + + if (counter !== numTasks) { + throw new Error( + 'async.auto cannot execute tasks due to a recursive dependency' + ); + } + } + + function getDependents(taskName) { + var result = []; + Object.keys(tasks).forEach(key => { + const task = tasks[key]; + if (Array.isArray(task) && task.indexOf(taskName) >= 0) { + result.push(key); + } + }); + return result; + } + + return callback[PROMISE_SYMBOL] + } + + var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; + var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; + var FN_ARG_SPLIT = /,/; + var FN_ARG = /(=.+)?(\s*)$/; + + function stripComments(string) { + let stripped = ''; + let index = 0; + let endBlockComment = string.indexOf('*/'); + while (index < string.length) { + if (string[index] === '/' && string[index+1] === '/') { + // inline comment + let endIndex = string.indexOf('\n', index); + index = (endIndex === -1) ? string.length : endIndex; + } else if ((endBlockComment !== -1) && (string[index] === '/') && (string[index+1] === '*')) { + // block comment + let endIndex = string.indexOf('*/', index); + if (endIndex !== -1) { + index = endIndex + 2; + endBlockComment = string.indexOf('*/', index); + } else { + stripped += string[index]; + index++; + } + } else { + stripped += string[index]; + index++; + } + } + return stripped; + } + + function parseParams(func) { + const src = stripComments(func.toString()); + let match = src.match(FN_ARGS); + if (!match) { + match = src.match(ARROW_FN_ARGS); + } + if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src) + let [, args] = match; + return args + .replace(/\s/g, '') + .split(FN_ARG_SPLIT) + .map((arg) => arg.replace(FN_ARG, '').trim()); + } + + /** + * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent + * tasks are specified as parameters to the function, after the usual callback + * parameter, with the parameter names matching the names of the tasks it + * depends on. This can provide even more readable task graphs which can be + * easier to maintain. + * + * If a final callback is specified, the task results are similarly injected, + * specified as named parameters after the initial error parameter. + * + * The autoInject function is purely syntactic sugar and its semantics are + * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. + * + * @name autoInject + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.auto]{@link module:ControlFlow.auto} + * @category Control Flow + * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of + * the form 'func([dependencies...], callback). The object's key of a property + * serves as the name of the task defined by that property, i.e. can be used + * when specifying requirements for other tasks. + * * The `callback` parameter is a `callback(err, result)` which must be called + * when finished, passing an `error` (which can be `null`) and the result of + * the function's execution. The remaining parameters name other tasks on + * which the task is dependent, and the results from those tasks are the + * arguments of those parameters. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback, and a `results` object with any completed + * task results, similar to `auto`. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // The example from `auto` can be rewritten as follows: + * async.autoInject({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: function(get_data, make_folder, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }, + * email_link: function(write_file, callback) { + * // once the file is written let's email a link to it... + * // write_file contains the filename returned by write_file. + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * } + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + * + * // If you are using a JS minifier that mangles parameter names, `autoInject` + * // will not work with plain functions, since the parameter names will be + * // collapsed to a single letter identifier. To work around this, you can + * // explicitly specify the names of the parameters your task function needs + * // in an array, similar to Angular.js dependency injection. + * + * // This still has an advantage over plain `auto`, since the results a task + * // depends on are still spread into arguments. + * async.autoInject({ + * //... + * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(write_file, callback) { + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * }] + * //... + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + */ + function autoInject(tasks, callback) { + var newTasks = {}; + + Object.keys(tasks).forEach(key => { + var taskFn = tasks[key]; + var params; + var fnIsAsync = isAsync(taskFn); + var hasNoDeps = + (!fnIsAsync && taskFn.length === 1) || + (fnIsAsync && taskFn.length === 0); + + if (Array.isArray(taskFn)) { + params = [...taskFn]; + taskFn = params.pop(); + + newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); + } else if (hasNoDeps) { + // no dependencies, use the function as-is + newTasks[key] = taskFn; + } else { + params = parseParams(taskFn); + if ((taskFn.length === 0 && !fnIsAsync) && params.length === 0) { + throw new Error("autoInject task functions require explicit parameters."); + } + + // remove callback param + if (!fnIsAsync) params.pop(); + + newTasks[key] = params.concat(newTask); + } + + function newTask(results, taskCb) { + var newArgs = params.map(name => results[name]); + newArgs.push(taskCb); + wrapAsync(taskFn)(...newArgs); + } + }); + + return auto(newTasks, callback); + } + + // Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation + // used for queues. This implementation assumes that the node provided by the user can be modified + // to adjust the next and last properties. We implement only the minimal functionality + // for queue support. + class DLL { + constructor() { + this.head = this.tail = null; + this.length = 0; + } + + removeLink(node) { + if (node.prev) node.prev.next = node.next; + else this.head = node.next; + if (node.next) node.next.prev = node.prev; + else this.tail = node.prev; + + node.prev = node.next = null; + this.length -= 1; + return node; + } + + empty () { + while(this.head) this.shift(); + return this; + } + + insertAfter(node, newNode) { + newNode.prev = node; + newNode.next = node.next; + if (node.next) node.next.prev = newNode; + else this.tail = newNode; + node.next = newNode; + this.length += 1; + } + + insertBefore(node, newNode) { + newNode.prev = node.prev; + newNode.next = node; + if (node.prev) node.prev.next = newNode; + else this.head = newNode; + node.prev = newNode; + this.length += 1; + } + + unshift(node) { + if (this.head) this.insertBefore(this.head, node); + else setInitial(this, node); + } + + push(node) { + if (this.tail) this.insertAfter(this.tail, node); + else setInitial(this, node); + } + + shift() { + return this.head && this.removeLink(this.head); + } + + pop() { + return this.tail && this.removeLink(this.tail); + } + + toArray() { + return [...this] + } + + *[Symbol.iterator] () { + var cur = this.head; + while (cur) { + yield cur.data; + cur = cur.next; + } + } + + remove (testFn) { + var curr = this.head; + while(curr) { + var {next} = curr; + if (testFn(curr)) { + this.removeLink(curr); + } + curr = next; + } + return this; + } + } + + function setInitial(dll, node) { + dll.length = 1; + dll.head = dll.tail = node; + } + + function queue(worker, concurrency, payload) { + if (concurrency == null) { + concurrency = 1; + } + else if(concurrency === 0) { + throw new RangeError('Concurrency must not be zero'); + } + + var _worker = wrapAsync(worker); + var numRunning = 0; + var workersList = []; + const events = { + error: [], + drain: [], + saturated: [], + unsaturated: [], + empty: [] + }; + + function on (event, handler) { + events[event].push(handler); + } + + function once (event, handler) { + const handleAndRemove = (...args) => { + off(event, handleAndRemove); + handler(...args); + }; + events[event].push(handleAndRemove); + } + + function off (event, handler) { + if (!event) return Object.keys(events).forEach(ev => events[ev] = []) + if (!handler) return events[event] = [] + events[event] = events[event].filter(ev => ev !== handler); + } + + function trigger (event, ...args) { + events[event].forEach(handler => handler(...args)); + } + + var processingScheduled = false; + function _insert(data, insertAtFront, rejectOnError, callback) { + if (callback != null && typeof callback !== 'function') { + throw new Error('task callback must be a function'); + } + q.started = true; + + var res, rej; + function promiseCallback (err, ...args) { + // we don't care about the error, let the global error handler + // deal with it + if (err) return rejectOnError ? rej(err) : res() + if (args.length <= 1) return res(args[0]) + res(args); + } + + var item = q._createTaskItem( + data, + rejectOnError ? promiseCallback : + (callback || promiseCallback) + ); + + if (insertAtFront) { + q._tasks.unshift(item); + } else { + q._tasks.push(item); + } + + if (!processingScheduled) { + processingScheduled = true; + setImmediate$1(() => { + processingScheduled = false; + q.process(); + }); + } + + if (rejectOnError || !callback) { + return new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }) + } + } + + function _createCB(tasks) { + return function (err, ...args) { + numRunning -= 1; + + for (var i = 0, l = tasks.length; i < l; i++) { + var task = tasks[i]; + + var index = workersList.indexOf(task); + if (index === 0) { + workersList.shift(); + } else if (index > 0) { + workersList.splice(index, 1); + } + + task.callback(err, ...args); + + if (err != null) { + trigger('error', err, task.data); + } + } + + if (numRunning <= (q.concurrency - q.buffer) ) { + trigger('unsaturated'); + } + + if (q.idle()) { + trigger('drain'); + } + q.process(); + }; + } + + function _maybeDrain(data) { + if (data.length === 0 && q.idle()) { + // call drain immediately if there are no tasks + setImmediate$1(() => trigger('drain')); + return true + } + return false + } + + const eventMethod = (name) => (handler) => { + if (!handler) { + return new Promise((resolve, reject) => { + once(name, (err, data) => { + if (err) return reject(err) + resolve(data); + }); + }) + } + off(name); + on(name, handler); + + }; + + var isProcessing = false; + var q = { + _tasks: new DLL(), + _createTaskItem (data, callback) { + return { + data, + callback + }; + }, + *[Symbol.iterator] () { + yield* q._tasks[Symbol.iterator](); + }, + concurrency, + payload, + buffer: concurrency / 4, + started: false, + paused: false, + push (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, false, false, callback)) + } + return _insert(data, false, false, callback); + }, + pushAsync (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, false, true, callback)) + } + return _insert(data, false, true, callback); + }, + kill () { + off(); + q._tasks.empty(); + }, + unshift (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, true, false, callback)) + } + return _insert(data, true, false, callback); + }, + unshiftAsync (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, true, true, callback)) + } + return _insert(data, true, true, callback); + }, + remove (testFn) { + q._tasks.remove(testFn); + }, + process () { + // Avoid trying to start too many processing operations. This can occur + // when callbacks resolve synchronously (#1267). + if (isProcessing) { + return; + } + isProcessing = true; + while(!q.paused && numRunning < q.concurrency && q._tasks.length){ + var tasks = [], data = []; + var l = q._tasks.length; + if (q.payload) l = Math.min(l, q.payload); + for (var i = 0; i < l; i++) { + var node = q._tasks.shift(); + tasks.push(node); + workersList.push(node); + data.push(node.data); + } + + numRunning += 1; + + if (q._tasks.length === 0) { + trigger('empty'); + } + + if (numRunning === q.concurrency) { + trigger('saturated'); + } + + var cb = onlyOnce(_createCB(tasks)); + _worker(data, cb); + } + isProcessing = false; + }, + length () { + return q._tasks.length; + }, + running () { + return numRunning; + }, + workersList () { + return workersList; + }, + idle() { + return q._tasks.length + numRunning === 0; + }, + pause () { + q.paused = true; + }, + resume () { + if (q.paused === false) { return; } + q.paused = false; + setImmediate$1(q.process); + } + }; + // define these as fixed properties, so people get useful errors when updating + Object.defineProperties(q, { + saturated: { + writable: false, + value: eventMethod('saturated') + }, + unsaturated: { + writable: false, + value: eventMethod('unsaturated') + }, + empty: { + writable: false, + value: eventMethod('empty') + }, + drain: { + writable: false, + value: eventMethod('drain') + }, + error: { + writable: false, + value: eventMethod('error') + }, + }); + return q; + } + + /** + * Creates a `cargo` object with the specified payload. Tasks added to the + * cargo will be processed altogether (up to the `payload` limit). If the + * `worker` is in progress, the task is queued until it becomes available. Once + * the `worker` has completed some tasks, each callback of those tasks is + * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) + * for how `cargo` and `queue` work. + * + * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers + * at a time, cargo passes an array of tasks to a single worker, repeating + * when the worker is finished. + * + * @name cargo + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An asynchronous function for processing an array + * of queued tasks. Invoked with `(tasks, callback)`. + * @param {number} [payload=Infinity] - An optional `integer` for determining + * how many tasks should be processed per round; if omitted, the default is + * unlimited. + * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can + * attached as certain properties to listen for specific events during the + * lifecycle of the cargo and inner queue. + * @example + * + * // create a cargo object with payload 2 + * var cargo = async.cargo(function(tasks, callback) { + * for (var i=0; i { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.reduce(fileList, 0, getFileSizeInBytes); + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ + function reduce(coll, memo, iteratee, callback) { + callback = once(callback); + var _iteratee = wrapAsync(iteratee); + return eachOfSeries$1(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, err => callback(err, memo)); + } + var reduce$1 = awaitify(reduce, 4); + + /** + * Version of the compose function that is more natural to read. Each function + * consumes the return value of the previous function. It is the equivalent of + * [compose]{@link module:ControlFlow.compose} with the arguments reversed. + * + * Each function is executed with the `this` binding of the composed function. + * + * @name seq + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.compose]{@link module:ControlFlow.compose} + * @category Control Flow + * @param {...AsyncFunction} functions - the asynchronous functions to compose + * @returns {Function} a function that composes the `functions` in order + * @example + * + * // Requires lodash (or underscore), express3 and dresende's orm2. + * // Part of an app, that fetches cats of the logged user. + * // This example uses `seq` function to avoid overnesting and error + * // handling clutter. + * app.get('/cats', function(request, response) { + * var User = request.models.User; + * async.seq( + * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) + * function(user, fn) { + * user.getCats(fn); // 'getCats' has signature (callback(err, data)) + * } + * )(req.session.user_id, function (err, cats) { + * if (err) { + * console.error(err); + * response.json({ status: 'error', message: err.message }); + * } else { + * response.json({ status: 'ok', message: 'Cats found', data: cats }); + * } + * }); + * }); + */ + function seq(...functions) { + var _functions = functions.map(wrapAsync); + return function (...args) { + var that = this; + + var cb = args[args.length - 1]; + if (typeof cb == 'function') { + args.pop(); + } else { + cb = promiseCallback(); + } + + reduce$1(_functions, args, (newargs, fn, iterCb) => { + fn.apply(that, newargs.concat((err, ...nextargs) => { + iterCb(err, nextargs); + })); + }, + (err, results) => cb(err, ...results)); + + return cb[PROMISE_SYMBOL] + }; + } + + /** + * Creates a function which is a composition of the passed asynchronous + * functions. Each function consumes the return value of the function that + * follows. Composing functions `f()`, `g()`, and `h()` would produce the result + * of `f(g(h()))`, only this version uses callbacks to obtain the return values. + * + * If the last argument to the composed function is not a function, a promise + * is returned when you call it. + * + * Each function is executed with the `this` binding of the composed function. + * + * @name compose + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {...AsyncFunction} functions - the asynchronous functions to compose + * @returns {Function} an asynchronous function that is the composed + * asynchronous `functions` + * @example + * + * function add1(n, callback) { + * setTimeout(function () { + * callback(null, n + 1); + * }, 10); + * } + * + * function mul3(n, callback) { + * setTimeout(function () { + * callback(null, n * 3); + * }, 10); + * } + * + * var add1mul3 = async.compose(mul3, add1); + * add1mul3(4, function (err, result) { + * // result now equals 15 + * }); + */ + function compose(...args) { + return seq(...args.reverse()); + } + + /** + * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. + * + * @name mapLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ + function mapLimit (coll, limit, iteratee, callback) { + return _asyncMap(eachOfLimit(limit), coll, iteratee, callback) + } + var mapLimit$1 = awaitify(mapLimit, 4); + + /** + * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. + * + * @name concatLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapLimit + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ + function concatLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val, iterCb) => { + _iteratee(val, (err, ...args) => { + if (err) return iterCb(err); + return iterCb(err, args); + }); + }, (err, mapResults) => { + var result = []; + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + result = result.concat(...mapResults[i]); + } + } + + return callback(err, result); + }); + } + var concatLimit$1 = awaitify(concatLimit, 4); + + /** + * Applies `iteratee` to each item in `coll`, concatenating the results. Returns + * the concatenated list. The `iteratee`s are called in parallel, and the + * results are concatenated as they return. The results array will be returned in + * the original order of `coll` passed to the `iteratee` function. + * + * @name concat + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @alias flatMap + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * let directoryList = ['dir1','dir2','dir3']; + * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; + * + * // Using callbacks + * async.concat(directoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.concat(directoryList, fs.readdir) + * .then(results => { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir) + * .then(results => { + * console.log(results); + * }).catch(err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.concat(directoryList, fs.readdir); + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.concat(withMissingDirectoryList, fs.readdir); + * console.log(results); + * } catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } + * } + * + */ + function concat(coll, iteratee, callback) { + return concatLimit$1(coll, Infinity, iteratee, callback) + } + var concat$1 = awaitify(concat, 3); + + /** + * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. + * + * @name concatSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapSeries + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. + * The iteratee should complete with an array an array of results. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ + function concatSeries(coll, iteratee, callback) { + return concatLimit$1(coll, 1, iteratee, callback) + } + var concatSeries$1 = awaitify(concatSeries, 3); + + /** + * Returns a function that when called, calls-back with the values provided. + * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to + * [`auto`]{@link module:ControlFlow.auto}. + * + * @name constant + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {...*} arguments... - Any number of arguments to automatically invoke + * callback with. + * @returns {AsyncFunction} Returns a function that when invoked, automatically + * invokes the callback with the previous given arguments. + * @example + * + * async.waterfall([ + * async.constant(42), + * function (value, next) { + * // value === 42 + * }, + * //... + * ], callback); + * + * async.waterfall([ + * async.constant(filename, "utf8"), + * fs.readFile, + * function (fileData, next) { + * //... + * } + * //... + * ], callback); + * + * async.auto({ + * hostname: async.constant("https://server.net/"), + * port: findFreePort, + * launchServer: ["hostname", "port", function (options, cb) { + * startServer(options, cb); + * }], + * //... + * }, callback); + */ + function constant(...args) { + return function (...ignoredArgs/*, callback*/) { + var callback = ignoredArgs.pop(); + return callback(null, ...args); + }; + } + + function _createTester(check, getResult) { + return (eachfn, arr, _iteratee, cb) => { + var testPassed = false; + var testResult; + const iteratee = wrapAsync(_iteratee); + eachfn(arr, (value, _, callback) => { + iteratee(value, (err, result) => { + if (err || err === false) return callback(err); + + if (check(result) && !testResult) { + testPassed = true; + testResult = getResult(true, value); + return callback(null, breakLoop); + } + callback(); + }); + }, err => { + if (err) return cb(err); + cb(null, testPassed ? testResult : getResult(false)); + }); + }; + } + + /** + * Returns the first value in `coll` that passes an async truth test. The + * `iteratee` is applied in parallel, meaning the first iteratee to return + * `true` will fire the detect `callback` with that result. That means the + * result might not be the first item in the original `coll` (in terms of order) + * that passes the test. + + * If order within the original `coll` is important, then look at + * [`detectSeries`]{@link module:Collections.detectSeries}. + * + * @name detect + * @static + * @memberOf module:Collections + * @method + * @alias find + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * } + *); + * + * // Using Promises + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) + * .then(result => { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); + * console.log(result); + * // dir1/file1.txt + * // result now equals the file in the list that exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function detect(coll, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback) + } + var detect$1 = awaitify(detect, 3); + + /** + * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a + * time. + * + * @name detectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findLimit + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ + function detectLimit(coll, limit, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOfLimit(limit), coll, iteratee, callback) + } + var detectLimit$1 = awaitify(detectLimit, 4); + + /** + * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. + * + * @name detectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findSeries + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ + function detectSeries(coll, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOfLimit(1), coll, iteratee, callback) + } + + var detectSeries$1 = awaitify(detectSeries, 3); + + function consoleFunc(name) { + return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => { + /* istanbul ignore else */ + if (typeof console === 'object') { + /* istanbul ignore else */ + if (err) { + /* istanbul ignore else */ + if (console.error) { + console.error(err); + } + } else if (console[name]) { /* istanbul ignore else */ + resultArgs.forEach(x => console[name](x)); + } + } + }) + } + + /** + * Logs the result of an [`async` function]{@link AsyncFunction} to the + * `console` using `console.dir` to display the properties of the resulting object. + * Only works in Node.js or in browsers that support `console.dir` and + * `console.error` (such as FF and Chrome). + * If multiple arguments are returned from the async function, + * `console.dir` is called on each argument in order. + * + * @name dir + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, {hello: name}); + * }, 1000); + * }; + * + * // in the node repl + * node> async.dir(hello, 'world'); + * {hello: 'world'} + */ + var dir = consoleFunc('dir'); + + /** + * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in + * the order of operations, the arguments `test` and `iteratee` are switched. + * + * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. + * + * @name doWhilst + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - A function which is called each time `test` + * passes. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee`. + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. + * `callback` will be passed an error and any arguments passed to the final + * `iteratee`'s callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ + function doWhilst(iteratee, test, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results; + + function next(err, ...args) { + if (err) return callback(err); + if (err === false) return; + results = args; + _test(...args, check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return check(null, true); + } + + var doWhilst$1 = awaitify(doWhilst, 3); + + /** + * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the + * argument ordering differs from `until`. + * + * @name doUntil + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee` + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ + function doUntil(iteratee, test, callback) { + const _test = wrapAsync(test); + return doWhilst$1(iteratee, (...args) => { + const cb = args.pop(); + _test(...args, (err, truth) => cb (err, !truth)); + }, callback); + } + + function _withoutIndex(iteratee) { + return (value, index, callback) => iteratee(value, callback); + } + + /** + * Applies the function `iteratee` to each item in `coll`, in parallel. + * The `iteratee` is called with an item from the list, and a callback for when + * it has finished. If the `iteratee` passes an error to its `callback`, the + * main `callback` (for the `each` function) is immediately called with the + * error. + * + * Note, that since this function applies `iteratee` to each item in parallel, + * there is no guarantee that the iteratee functions will complete in order. + * + * @name each + * @static + * @memberOf module:Collections + * @method + * @alias forEach + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to + * each item in `coll`. Invoked with (item, callback). + * The array index is not passed to the iteratee. + * If you need the index, use `eachOf`. + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; + * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; + * + * // asynchronous function that deletes a file + * const deleteFile = function(file, callback) { + * fs.unlink(file, callback); + * }; + * + * // Using callbacks + * async.each(fileList, deleteFile, function(err) { + * if( err ) { + * console.log(err); + * } else { + * console.log('All files have been deleted successfully'); + * } + * }); + * + * // Error Handling + * async.each(withMissingFileList, deleteFile, function(err){ + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using Promises + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using async/await + * async () => { + * try { + * await async.each(files, deleteFile); + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * await async.each(withMissingFileList, deleteFile); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * } + * } + * + */ + function eachLimit(coll, iteratee, callback) { + return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); + } + + var each = awaitify(eachLimit, 3); + + /** + * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. + * + * @name eachLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfLimit`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ + function eachLimit$1(coll, limit, iteratee, callback) { + return eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); + } + var eachLimit$2 = awaitify(eachLimit$1, 4); + + /** + * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. + * + * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item + * in series and therefore the iteratee functions will complete in order. + + * @name eachSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfSeries`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ + function eachSeries(coll, iteratee, callback) { + return eachLimit$2(coll, 1, iteratee, callback) + } + var eachSeries$1 = awaitify(eachSeries, 3); + + /** + * Wrap an async function and ensure it calls its callback on a later tick of + * the event loop. If the function already calls its callback on a next tick, + * no extra deferral is added. This is useful for preventing stack overflows + * (`RangeError: Maximum call stack size exceeded`) and generally keeping + * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) + * contained. ES2017 `async` functions are returned as-is -- they are immune + * to Zalgo's corrupting influences, as they always resolve on a later tick. + * + * @name ensureAsync + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - an async function, one that expects a node-style + * callback as its last argument. + * @returns {AsyncFunction} Returns a wrapped function with the exact same call + * signature as the function passed in. + * @example + * + * function sometimesAsync(arg, callback) { + * if (cache[arg]) { + * return callback(null, cache[arg]); // this would be synchronous!! + * } else { + * doSomeIO(arg, callback); // this IO would be asynchronous + * } + * } + * + * // this has a risk of stack overflows if many results are cached in a row + * async.mapSeries(args, sometimesAsync, done); + * + * // this will defer sometimesAsync's callback if necessary, + * // preventing stack overflows + * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); + */ + function ensureAsync(fn) { + if (isAsync(fn)) return fn; + return function (...args/*, callback*/) { + var callback = args.pop(); + var sync = true; + args.push((...innerArgs) => { + if (sync) { + setImmediate$1(() => callback(...innerArgs)); + } else { + callback(...innerArgs); + } + }); + fn.apply(this, args); + sync = false; + }; + } + + /** + * Returns `true` if every element in `coll` satisfies an async test. If any + * iteratee call returns `false`, the main `callback` is immediately called. + * + * @name every + * @static + * @memberOf module:Collections + * @method + * @alias all + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.every(fileList, fileExists, function(err, result) { + * console.log(result); + * // true + * // result is true since every file exists + * }); + * + * async.every(withMissingFileList, fileExists, function(err, result) { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }); + * + * // Using Promises + * async.every(fileList, fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.every(withMissingFileList, fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.every(fileList, fileExists); + * console.log(result); + * // true + * // result is true since every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.every(withMissingFileList, fileExists); + * console.log(result); + * // false + * // result is false since NOT every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function every(coll, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOf$1, coll, iteratee, callback) + } + var every$1 = awaitify(every, 3); + + /** + * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. + * + * @name everyLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ + function everyLimit(coll, limit, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOfLimit(limit), coll, iteratee, callback) + } + var everyLimit$1 = awaitify(everyLimit, 4); + + /** + * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. + * + * @name everySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in series. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ + function everySeries(coll, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOfSeries$1, coll, iteratee, callback) + } + var everySeries$1 = awaitify(everySeries, 3); + + function filterArray(eachfn, arr, iteratee, callback) { + var truthValues = new Array(arr.length); + eachfn(arr, (x, index, iterCb) => { + iteratee(x, (err, v) => { + truthValues[index] = !!v; + iterCb(err); + }); + }, err => { + if (err) return callback(err); + var results = []; + for (var i = 0; i < arr.length; i++) { + if (truthValues[i]) results.push(arr[i]); + } + callback(null, results); + }); + } + + function filterGeneric(eachfn, coll, iteratee, callback) { + var results = []; + eachfn(coll, (x, index, iterCb) => { + iteratee(x, (err, v) => { + if (err) return iterCb(err); + if (v) { + results.push({index, value: x}); + } + iterCb(err); + }); + }, err => { + if (err) return callback(err); + callback(null, results + .sort((a, b) => a.index - b.index) + .map(v => v.value)); + }); + } + + function _filter(eachfn, coll, iteratee, callback) { + var filter = isArrayLike(coll) ? filterArray : filterGeneric; + return filter(eachfn, coll, wrapAsync(iteratee), callback); + } + + /** + * Returns a new array of all the values in `coll` which pass an async truth + * test. This operation is performed in parallel, but the results array will be + * in the same order as the original. + * + * @name filter + * @static + * @memberOf module:Collections + * @method + * @alias select + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.filter(files, fileExists, function(err, results) { + * if(err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * }); + * + * // Using Promises + * async.filter(files, fileExists) + * .then(results => { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.filter(files, fileExists); + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function filter (coll, iteratee, callback) { + return _filter(eachOf$1, coll, iteratee, callback) + } + var filter$1 = awaitify(filter, 3); + + /** + * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a + * time. + * + * @name filterLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + */ + function filterLimit (coll, limit, iteratee, callback) { + return _filter(eachOfLimit(limit), coll, iteratee, callback) + } + var filterLimit$1 = awaitify(filterLimit, 4); + + /** + * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. + * + * @name filterSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results) + * @returns {Promise} a promise, if no callback provided + */ + function filterSeries (coll, iteratee, callback) { + return _filter(eachOfSeries$1, coll, iteratee, callback) + } + var filterSeries$1 = awaitify(filterSeries, 3); + + /** + * Calls the asynchronous function `fn` with a callback parameter that allows it + * to call itself again, in series, indefinitely. + + * If an error is passed to the callback then `errback` is called with the + * error, and execution stops, otherwise it will never be called. + * + * @name forever + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} fn - an async function to call repeatedly. + * Invoked with (next). + * @param {Function} [errback] - when `fn` passes an error to it's callback, + * this function will be called, and execution stops. Invoked with (err). + * @returns {Promise} a promise that rejects if an error occurs and an errback + * is not passed + * @example + * + * async.forever( + * function(next) { + * // next is suitable for passing to things that need a callback(err [, whatever]); + * // it will result in this function being called again. + * }, + * function(err) { + * // if next is called with a value in its first parameter, it will appear + * // in here as 'err', and execution will stop. + * } + * ); + */ + function forever(fn, errback) { + var done = onlyOnce(errback); + var task = wrapAsync(ensureAsync(fn)); + + function next(err) { + if (err) return done(err); + if (err === false) return; + task(next); + } + return next(); + } + var forever$1 = awaitify(forever, 2); + + /** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. + * + * @name groupByLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ + function groupByLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val, iterCb) => { + _iteratee(val, (err, key) => { + if (err) return iterCb(err); + return iterCb(err, {key, val}); + }); + }, (err, mapResults) => { + var result = {}; + // from MDN, handle object having an `hasOwnProperty` prop + var {hasOwnProperty} = Object.prototype; + + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + var {key} = mapResults[i]; + var {val} = mapResults[i]; + + if (hasOwnProperty.call(result, key)) { + result[key].push(val); + } else { + result[key] = [val]; + } + } + } + + return callback(err, result); + }); + } + + var groupByLimit$1 = awaitify(groupByLimit, 4); + + /** + * Returns a new object, where each value corresponds to an array of items, from + * `coll`, that returned the corresponding key. That is, the keys of the object + * correspond to the values passed to the `iteratee` callback. + * + * Note: Since this function applies the `iteratee` to each item in parallel, + * there is no guarantee that the `iteratee` functions will complete in order. + * However, the values for each key in the `result` will be in the same order as + * the original `coll`. For Objects, the values will roughly be in the order of + * the original Objects' keys (but this can vary across JavaScript engines). + * + * @name groupBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const files = ['dir1/file1.txt','dir2','dir4'] + * + * // asynchronous function that detects file type as none, file, or directory + * function detectFile(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(null, 'none'); + * } + * callback(null, stat.isDirectory() ? 'directory' : 'file'); + * }); + * } + * + * //Using callbacks + * async.groupBy(files, detectFile, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * }); + * + * // Using Promises + * async.groupBy(files, detectFile) + * .then( result => { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.groupBy(files, detectFile); + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function groupBy (coll, iteratee, callback) { + return groupByLimit$1(coll, Infinity, iteratee, callback) + } + + /** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. + * + * @name groupBySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whose + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ + function groupBySeries (coll, iteratee, callback) { + return groupByLimit$1(coll, 1, iteratee, callback) + } + + /** + * Logs the result of an `async` function to the `console`. Only works in + * Node.js or in browsers that support `console.log` and `console.error` (such + * as FF and Chrome). If multiple arguments are returned from the async + * function, `console.log` is called on each argument in order. + * + * @name log + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, 'hello ' + name); + * }, 1000); + * }; + * + * // in the node repl + * node> async.log(hello, 'world'); + * 'hello world' + */ + var log = consoleFunc('log'); + + /** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a + * time. + * + * @name mapValuesLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ + function mapValuesLimit(obj, limit, iteratee, callback) { + callback = once(callback); + var newObj = {}; + var _iteratee = wrapAsync(iteratee); + return eachOfLimit(limit)(obj, (val, key, next) => { + _iteratee(val, key, (err, result) => { + if (err) return next(err); + newObj[key] = result; + next(err); + }); + }, err => callback(err, newObj)); + } + + var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); + + /** + * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. + * + * Produces a new Object by mapping each value of `obj` through the `iteratee` + * function. The `iteratee` is called each `value` and `key` from `obj` and a + * callback for when it has finished processing. Each of these callbacks takes + * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` + * passes an error to its callback, the main `callback` (for the `mapValues` + * function) is immediately called with the error. + * + * Note, the order of the keys in the result is not guaranteed. The keys will + * be roughly in the order they complete, (but this is very engine-specific) + * + * @name mapValues + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file3.txt' + * }; + * + * const withMissingFileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file4.txt' + * }; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, key, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * }); + * + * // Error handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.mapValues(fileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * }).catch (err => { + * console.log(err); + * }); + * + * // Error Handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch (err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.mapValues(fileMap, getFileSizeInBytes); + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ + function mapValues(obj, iteratee, callback) { + return mapValuesLimit$1(obj, Infinity, iteratee, callback) + } + + /** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. + * + * @name mapValuesSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ + function mapValuesSeries(obj, iteratee, callback) { + return mapValuesLimit$1(obj, 1, iteratee, callback) + } + + /** + * Caches the results of an async function. When creating a hash to store + * function results against, the callback is omitted from the hash and an + * optional hash function can be used. + * + * **Note: if the async function errs, the result will not be cached and + * subsequent calls will call the wrapped function.** + * + * If no hash function is specified, the first argument is used as a hash key, + * which may work reasonably if it is a string or a data type that converts to a + * distinct string. Note that objects and arrays will not behave reasonably. + * Neither will cases where the other arguments are significant. In such cases, + * specify your own hash function. + * + * The cache of results is exposed as the `memo` property of the function + * returned by `memoize`. + * + * @name memoize + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function to proxy and cache results from. + * @param {Function} hasher - An optional function for generating a custom hash + * for storing results. It has all the arguments applied to it apart from the + * callback, and must be synchronous. + * @returns {AsyncFunction} a memoized version of `fn` + * @example + * + * var slow_fn = function(name, callback) { + * // do something + * callback(null, result); + * }; + * var fn = async.memoize(slow_fn); + * + * // fn can now be used as if it were slow_fn + * fn('some name', function() { + * // callback + * }); + */ + function memoize(fn, hasher = v => v) { + var memo = Object.create(null); + var queues = Object.create(null); + var _fn = wrapAsync(fn); + var memoized = initialParams((args, callback) => { + var key = hasher(...args); + if (key in memo) { + setImmediate$1(() => callback(null, ...memo[key])); + } else if (key in queues) { + queues[key].push(callback); + } else { + queues[key] = [callback]; + _fn(...args, (err, ...resultArgs) => { + // #1465 don't memoize if an error occurred + if (!err) { + memo[key] = resultArgs; + } + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i](err, ...resultArgs); + } + }); + } + }); + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; + } + + /* istanbul ignore file */ + + /** + * Calls `callback` on a later loop around the event loop. In Node.js this just + * calls `process.nextTick`. In the browser it will use `setImmediate` if + * available, otherwise `setTimeout(callback, 0)`, which means other higher + * priority events may precede the execution of `callback`. + * + * This is used internally for browser-compatibility purposes. + * + * @name nextTick + * @static + * @memberOf module:Utils + * @method + * @see [async.setImmediate]{@link module:Utils.setImmediate} + * @category Util + * @param {Function} callback - The function to call on a later loop around + * the event loop. Invoked with (args...). + * @param {...*} args... - any number of additional arguments to pass to the + * callback on the next tick. + * @example + * + * var call_order = []; + * async.nextTick(function() { + * call_order.push('two'); + * // call_order now equals ['one','two'] + * }); + * call_order.push('one'); + * + * async.setImmediate(function (a, b, c) { + * // a, b, and c equal 1, 2, and 3 + * }, 1, 2, 3); + */ + var _defer$1; + + if (hasNextTick) { + _defer$1 = process.nextTick; + } else if (hasSetImmediate) { + _defer$1 = setImmediate; + } else { + _defer$1 = fallback; + } + + var nextTick = wrap(_defer$1); + + var parallel = awaitify((eachfn, tasks, callback) => { + var results = isArrayLike(tasks) ? [] : {}; + + eachfn(tasks, (task, key, taskCb) => { + wrapAsync(task)((err, ...result) => { + if (result.length < 2) { + [result] = result; + } + results[key] = result; + taskCb(err); + }); + }, err => callback(err, results)); + }, 3); + + /** + * Run the `tasks` collection of functions in parallel, without waiting until + * the previous function has completed. If any of the functions pass an error to + * its callback, the main `callback` is immediately called with the value of the + * error. Once the `tasks` have completed, the results are passed to the final + * `callback` as an array. + * + * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about + * parallel execution of code. If your tasks do not use any timers or perform + * any I/O, they will actually be executed in series. Any synchronous setup + * sections for each task will happen one after the other. JavaScript remains + * single-threaded. + * + * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the + * execution of other tasks when a task fails. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.parallel}. + * + * @name parallel + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * + * //Using Callbacks + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function parallel$1(tasks, callback) { + return parallel(eachOf$1, tasks, callback); + } + + /** + * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a + * time. + * + * @name parallelLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.parallel]{@link module:ControlFlow.parallel} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + */ + function parallelLimit(tasks, limit, callback) { + return parallel(eachOfLimit(limit), tasks, callback); + } + + /** + * A queue of tasks for the worker function to complete. + * @typedef {Iterable} QueueObject + * @memberOf module:ControlFlow + * @property {Function} length - a function returning the number of items + * waiting to be processed. Invoke with `queue.length()`. + * @property {boolean} started - a boolean indicating whether or not any + * items have been pushed and processed by the queue. + * @property {Function} running - a function returning the number of items + * currently being processed. Invoke with `queue.running()`. + * @property {Function} workersList - a function returning the array of items + * currently being processed. Invoke with `queue.workersList()`. + * @property {Function} idle - a function returning false if there are items + * waiting or being processed, or true if not. Invoke with `queue.idle()`. + * @property {number} concurrency - an integer for determining how many `worker` + * functions should be run in parallel. This property can be changed after a + * `queue` is created to alter the concurrency on-the-fly. + * @property {number} payload - an integer that specifies how many items are + * passed to the worker function at a time. only applies if this is a + * [cargo]{@link module:ControlFlow.cargo} object + * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` + * once the `worker` has finished processing the task. Instead of a single task, + * a `tasks` array can be submitted. The respective callback is used for every + * task in the list. Invoke with `queue.push(task, [callback])`, + * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. + * Invoke with `queue.unshift(task, [callback])`. + * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns + * a promise that rejects if an error occurs. + * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns + * a promise that rejects if an error occurs. + * @property {Function} remove - remove items from the queue that match a test + * function. The test function will be passed an object with a `data` property, + * and a `priority` property, if this is a + * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. + * Invoked with `queue.remove(testFn)`, where `testFn` is of the form + * `function ({data, priority}) {}` and returns a Boolean. + * @property {Function} saturated - a function that sets a callback that is + * called when the number of running workers hits the `concurrency` limit, and + * further tasks will be queued. If the callback is omitted, `q.saturated()` + * returns a promise for the next occurrence. + * @property {Function} unsaturated - a function that sets a callback that is + * called when the number of running workers is less than the `concurrency` & + * `buffer` limits, and further tasks will not be queued. If the callback is + * omitted, `q.unsaturated()` returns a promise for the next occurrence. + * @property {number} buffer - A minimum threshold buffer in order to say that + * the `queue` is `unsaturated`. + * @property {Function} empty - a function that sets a callback that is called + * when the last item from the `queue` is given to a `worker`. If the callback + * is omitted, `q.empty()` returns a promise for the next occurrence. + * @property {Function} drain - a function that sets a callback that is called + * when the last item from the `queue` has returned from the `worker`. If the + * callback is omitted, `q.drain()` returns a promise for the next occurrence. + * @property {Function} error - a function that sets a callback that is called + * when a task errors. Has the signature `function(error, task)`. If the + * callback is omitted, `error()` returns a promise that rejects on the next + * error. + * @property {boolean} paused - a boolean for determining whether the queue is + * in a paused state. + * @property {Function} pause - a function that pauses the processing of tasks + * until `resume()` is called. Invoke with `queue.pause()`. + * @property {Function} resume - a function that resumes the processing of + * queued tasks when the queue is paused. Invoke with `queue.resume()`. + * @property {Function} kill - a function that removes the `drain` callback and + * empties remaining tasks from the queue forcing it to go idle. No more tasks + * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. + * + * @example + * const q = async.queue(worker, 2) + * q.push(item1) + * q.push(item2) + * q.push(item3) + * // queues are iterable, spread into an array to inspect + * const items = [...q] // [item1, item2, item3] + * // or use for of + * for (let item of q) { + * console.log(item) + * } + * + * q.drain(() => { + * console.log('all done') + * }) + * // or + * await q.drain() + */ + + /** + * Creates a `queue` object with the specified `concurrency`. Tasks added to the + * `queue` are processed in parallel (up to the `concurrency` limit). If all + * `worker`s are in progress, the task is queued until one becomes available. + * Once a `worker` completes a `task`, that `task`'s callback is called. + * + * @name queue + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. Invoked with (task, callback). + * @param {number} [concurrency=1] - An `integer` for determining how many + * `worker` functions should be run in parallel. If omitted, the concurrency + * defaults to `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be + * attached as certain properties to listen for specific events during the + * lifecycle of the queue. + * @example + * + * // create a queue object with concurrency 2 + * var q = async.queue(function(task, callback) { + * console.log('hello ' + task.name); + * callback(); + * }, 2); + * + * // assign a callback + * q.drain(function() { + * console.log('all items have been processed'); + * }); + * // or await the end + * await q.drain() + * + * // assign an error callback + * q.error(function(err, task) { + * console.error('task experienced an error'); + * }); + * + * // add some items to the queue + * q.push({name: 'foo'}, function(err) { + * console.log('finished processing foo'); + * }); + * // callback is optional + * q.push({name: 'bar'}); + * + * // add some items to the queue (batch-wise) + * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { + * console.log('finished processing item'); + * }); + * + * // add some items to the front of the queue + * q.unshift({name: 'bar'}, function (err) { + * console.log('finished processing bar'); + * }); + */ + function queue$1 (worker, concurrency) { + var _worker = wrapAsync(worker); + return queue((items, cb) => { + _worker(items[0], cb); + }, concurrency, 1); + } + + // Binary min-heap implementation used for priority queue. + // Implementation is stable, i.e. push time is considered for equal priorities + class Heap { + constructor() { + this.heap = []; + this.pushCount = Number.MIN_SAFE_INTEGER; + } + + get length() { + return this.heap.length; + } + + empty () { + this.heap = []; + return this; + } + + percUp(index) { + let p; + + while (index > 0 && smaller(this.heap[index], this.heap[p=parent(index)])) { + let t = this.heap[index]; + this.heap[index] = this.heap[p]; + this.heap[p] = t; + + index = p; + } + } + + percDown(index) { + let l; + + while ((l=leftChi(index)) < this.heap.length) { + if (l+1 < this.heap.length && smaller(this.heap[l+1], this.heap[l])) { + l = l+1; + } + + if (smaller(this.heap[index], this.heap[l])) { + break; + } + + let t = this.heap[index]; + this.heap[index] = this.heap[l]; + this.heap[l] = t; + + index = l; + } + } + + push(node) { + node.pushCount = ++this.pushCount; + this.heap.push(node); + this.percUp(this.heap.length-1); + } + + unshift(node) { + return this.heap.push(node); + } + + shift() { + let [top] = this.heap; + + this.heap[0] = this.heap[this.heap.length-1]; + this.heap.pop(); + this.percDown(0); + + return top; + } + + toArray() { + return [...this]; + } + + *[Symbol.iterator] () { + for (let i = 0; i < this.heap.length; i++) { + yield this.heap[i].data; + } + } + + remove (testFn) { + let j = 0; + for (let i = 0; i < this.heap.length; i++) { + if (!testFn(this.heap[i])) { + this.heap[j] = this.heap[i]; + j++; + } + } + + this.heap.splice(j); + + for (let i = parent(this.heap.length-1); i >= 0; i--) { + this.percDown(i); + } + + return this; + } + } + + function leftChi(i) { + return (i<<1)+1; + } + + function parent(i) { + return ((i+1)>>1)-1; + } + + function smaller(x, y) { + if (x.priority !== y.priority) { + return x.priority < y.priority; + } + else { + return x.pushCount < y.pushCount; + } + } + + /** + * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and + * completed in ascending priority order. + * + * @name priorityQueue + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. + * Invoked with (task, callback). + * @param {number} concurrency - An `integer` for determining how many `worker` + * functions should be run in parallel. If omitted, the concurrency defaults to + * `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three + * differences between `queue` and `priorityQueue` objects: + * * `push(task, priority, [callback])` - `priority` should be a number. If an + * array of `tasks` is given, all tasks will be assigned the same priority. + * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, + * except this returns a promise that rejects if an error occurs. + * * The `unshift` and `unshiftAsync` methods were removed. + */ + function priorityQueue(worker, concurrency) { + // Start with a normal queue + var q = queue$1(worker, concurrency); + + var { + push, + pushAsync + } = q; + + q._tasks = new Heap(); + q._createTaskItem = ({data, priority}, callback) => { + return { + data, + priority, + callback + }; + }; + + function createDataItems(tasks, priority) { + if (!Array.isArray(tasks)) { + return {data: tasks, priority}; + } + return tasks.map(data => { return {data, priority}; }); + } + + // Override push to accept second parameter representing priority + q.push = function(data, priority = 0, callback) { + return push(createDataItems(data, priority), callback); + }; + + q.pushAsync = function(data, priority = 0, callback) { + return pushAsync(createDataItems(data, priority), callback); + }; + + // Remove unshift functions + delete q.unshift; + delete q.unshiftAsync; + + return q; + } + + /** + * Runs the `tasks` array of functions in parallel, without waiting until the + * previous function has completed. Once any of the `tasks` complete or pass an + * error to its callback, the main `callback` is immediately called. It's + * equivalent to `Promise.race()`. + * + * @name race + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} + * to run. Each function can complete with an optional `result` value. + * @param {Function} callback - A callback to run once any of the functions have + * completed. This function gets an error or result from the first function that + * completed. Invoked with (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.race([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], + * // main callback + * function(err, result) { + * // the result will be equal to 'two' as it finishes earlier + * }); + */ + function race(tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); + if (!tasks.length) return callback(); + for (var i = 0, l = tasks.length; i < l; i++) { + wrapAsync(tasks[i])(callback); + } + } + + var race$1 = awaitify(race, 2); + + /** + * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. + * + * @name reduceRight + * @static + * @memberOf module:Collections + * @method + * @see [async.reduce]{@link module:Collections.reduce} + * @alias foldr + * @category Collection + * @param {Array} array - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + */ + function reduceRight (array, memo, iteratee, callback) { + var reversed = [...array].reverse(); + return reduce$1(reversed, memo, iteratee, callback); + } + + /** + * Wraps the async function in another function that always completes with a + * result object, even when it errors. + * + * The result object has either the property `error` or `value`. + * + * @name reflect + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function you want to wrap + * @returns {Function} - A function that always passes null to it's callback as + * the error. The second argument to the callback will be an `object` with + * either an `error` or a `value` property. + * @example + * + * async.parallel([ + * async.reflect(function(callback) { + * // do some stuff ... + * callback(null, 'one'); + * }), + * async.reflect(function(callback) { + * // do some more stuff but error ... + * callback('bad stuff happened'); + * }), + * async.reflect(function(callback) { + * // do some more stuff ... + * callback(null, 'two'); + * }) + * ], + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = 'bad stuff happened' + * // results[2].value = 'two' + * }); + */ + function reflect(fn) { + var _fn = wrapAsync(fn); + return initialParams(function reflectOn(args, reflectCallback) { + args.push((error, ...cbArgs) => { + let retVal = {}; + if (error) { + retVal.error = error; + } + if (cbArgs.length > 0){ + var value = cbArgs; + if (cbArgs.length <= 1) { + [value] = cbArgs; + } + retVal.value = value; + } + reflectCallback(null, retVal); + }); + + return _fn.apply(this, args); + }); + } + + /** + * A helper function that wraps an array or an object of functions with `reflect`. + * + * @name reflectAll + * @static + * @memberOf module:Utils + * @method + * @see [async.reflect]{@link module:Utils.reflect} + * @category Util + * @param {Array|Object|Iterable} tasks - The collection of + * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. + * @returns {Array} Returns an array of async functions, each wrapped in + * `async.reflect` + * @example + * + * let tasks = [ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * // do some more stuff but error ... + * callback(new Error('bad stuff happened')); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = Error('bad stuff happened') + * // results[2].value = 'two' + * }); + * + * // an example using an object instead of an array + * let tasks = { + * one: function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * two: function(callback) { + * callback('two'); + * }, + * three: function(callback) { + * setTimeout(function() { + * callback(null, 'three'); + * }, 100); + * } + * }; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results.one.value = 'one' + * // results.two.error = 'two' + * // results.three.value = 'three' + * }); + */ + function reflectAll(tasks) { + var results; + if (Array.isArray(tasks)) { + results = tasks.map(reflect); + } else { + results = {}; + Object.keys(tasks).forEach(key => { + results[key] = reflect.call(this, tasks[key]); + }); + } + return results; + } + + function reject(eachfn, arr, _iteratee, callback) { + const iteratee = wrapAsync(_iteratee); + return _filter(eachfn, arr, (value, cb) => { + iteratee(value, (err, v) => { + cb(err, !v); + }); + }, callback); + } + + /** + * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. + * + * @name reject + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.reject(fileList, fileExists, function(err, results) { + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }); + * + * // Using Promises + * async.reject(fileList, fileExists) + * .then( results => { + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.reject(fileList, fileExists); + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function reject$1 (coll, iteratee, callback) { + return reject(eachOf$1, coll, iteratee, callback) + } + var reject$2 = awaitify(reject$1, 3); + + /** + * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a + * time. + * + * @name rejectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ + function rejectLimit (coll, limit, iteratee, callback) { + return reject(eachOfLimit(limit), coll, iteratee, callback) + } + var rejectLimit$1 = awaitify(rejectLimit, 4); + + /** + * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. + * + * @name rejectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ + function rejectSeries (coll, iteratee, callback) { + return reject(eachOfSeries$1, coll, iteratee, callback) + } + var rejectSeries$1 = awaitify(rejectSeries, 3); + + function constant$1(value) { + return function () { + return value; + } + } + + /** + * Attempts to get a successful response from `task` no more than `times` times + * before returning an error. If the task is successful, the `callback` will be + * passed the result of the successful task. If all attempts fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name retry + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @see [async.retryable]{@link module:ControlFlow.retryable} + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an + * object with `times` and `interval` or a number. + * * `times` - The number of attempts to make before giving up. The default + * is `5`. + * * `interval` - The time to wait between retries, in milliseconds. The + * default is `0`. The interval may also be specified as a function of the + * retry count (see example). + * * `errorFilter` - An optional synchronous function that is invoked on + * erroneous result. If it returns `true` the retry attempts will continue; + * if the function returns `false` the retry flow is aborted with the current + * attempt's error and result being returned to the final callback. + * Invoked with (err). + * * If `opts` is a number, the number specifies the number of times to retry, + * with the default interval of `0`. + * @param {AsyncFunction} task - An async function to retry. + * Invoked with (callback). + * @param {Function} [callback] - An optional callback which is called when the + * task has succeeded, or after the final failed attempt. It receives the `err` + * and `result` arguments of the last attempt at completing the `task`. Invoked + * with (err, results). + * @returns {Promise} a promise if no callback provided + * + * @example + * + * // The `retry` function can be used as a stand-alone control flow by passing + * // a callback, as shown below: + * + * // try calling apiMethod 3 times + * async.retry(3, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 3 times, waiting 200 ms between each retry + * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 10 times with exponential backoff + * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) + * async.retry({ + * times: 10, + * interval: function(retryCount) { + * return 50 * Math.pow(2, retryCount); + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod the default 5 times no delay between each retry + * async.retry(apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod only when error condition satisfies, all other + * // errors will abort the retry control flow and return to final callback + * async.retry({ + * errorFilter: function(err) { + * return err.message === 'Temporary error'; // only retry on a specific error + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // to retry individual methods that are not as reliable within other + * // control flow functions, use the `retryable` wrapper: + * async.auto({ + * users: api.getUsers.bind(api), + * payments: async.retryable(3, api.getPayments.bind(api)) + * }, function(err, results) { + * // do something with the results + * }); + * + */ + const DEFAULT_TIMES = 5; + const DEFAULT_INTERVAL = 0; + + function retry(opts, task, callback) { + var options = { + times: DEFAULT_TIMES, + intervalFunc: constant$1(DEFAULT_INTERVAL) + }; + + if (arguments.length < 3 && typeof opts === 'function') { + callback = task || promiseCallback(); + task = opts; + } else { + parseTimes(options, opts); + callback = callback || promiseCallback(); + } + + if (typeof task !== 'function') { + throw new Error("Invalid arguments for async.retry"); + } + + var _task = wrapAsync(task); + + var attempt = 1; + function retryAttempt() { + _task((err, ...args) => { + if (err === false) return + if (err && attempt++ < options.times && + (typeof options.errorFilter != 'function' || + options.errorFilter(err))) { + setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); + } else { + callback(err, ...args); + } + }); + } + + retryAttempt(); + return callback[PROMISE_SYMBOL] + } + + function parseTimes(acc, t) { + if (typeof t === 'object') { + acc.times = +t.times || DEFAULT_TIMES; + + acc.intervalFunc = typeof t.interval === 'function' ? + t.interval : + constant$1(+t.interval || DEFAULT_INTERVAL); + + acc.errorFilter = t.errorFilter; + } else if (typeof t === 'number' || typeof t === 'string') { + acc.times = +t || DEFAULT_TIMES; + } else { + throw new Error("Invalid arguments for async.retry"); + } + } + + /** + * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method + * wraps a task and makes it retryable, rather than immediately calling it + * with retries. + * + * @name retryable + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.retry]{@link module:ControlFlow.retry} + * @category Control Flow + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional + * options, exactly the same as from `retry`, except for a `opts.arity` that + * is the arity of the `task` function, defaulting to `task.length` + * @param {AsyncFunction} task - the asynchronous function to wrap. + * This function will be passed any arguments passed to the returned wrapper. + * Invoked with (...args, callback). + * @returns {AsyncFunction} The wrapped function, which when invoked, will + * retry on an error, based on the parameters specified in `opts`. + * This function will accept the same parameters as `task`. + * @example + * + * async.auto({ + * dep1: async.retryable(3, getFromFlakyService), + * process: ["dep1", async.retryable(3, function (results, cb) { + * maybeProcessData(results.dep1, cb); + * })] + * }, callback); + */ + function retryable (opts, task) { + if (!task) { + task = opts; + opts = null; + } + let arity = (opts && opts.arity) || task.length; + if (isAsync(task)) { + arity += 1; + } + var _task = wrapAsync(task); + return initialParams((args, callback) => { + if (args.length < arity - 1 || callback == null) { + args.push(callback); + callback = promiseCallback(); + } + function taskFn(cb) { + _task(...args, cb); + } + + if (opts) retry(opts, taskFn, callback); + else retry(taskFn, callback); + + return callback[PROMISE_SYMBOL] + }); + } + + /** + * Run the functions in the `tasks` collection in series, each one running once + * the previous function has completed. If any functions in the series pass an + * error to its callback, no more functions are run, and `callback` is + * immediately called with the value of the error. Otherwise, `callback` + * receives an array of results when `tasks` have completed. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function, and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.series}. + * + * **Note** that while many implementations preserve the order of object + * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) + * explicitly states that + * + * > The mechanics and order of enumerating the properties is not specified. + * + * So if you rely on the order in which your series of functions are executed, + * and want this to work on all platforms, consider using an array. + * + * @name series + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing + * [async functions]{@link AsyncFunction} to run in series. + * Each function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This function gets a results array (or object) + * containing all the result arguments passed to the `task` callbacks. Invoked + * with (err, result). + * @return {Promise} a promise, if no callback is passed + * @example + * + * //Using Callbacks + * async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] + * }); + * + * // an example using objects instead of arrays + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.series([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function series(tasks, callback) { + return parallel(eachOfSeries$1, tasks, callback); + } + + /** + * Returns `true` if at least one element in the `coll` satisfies an async test. + * If any iteratee call returns `true`, the main `callback` is immediately + * called. + * + * @name some + * @static + * @memberOf module:Collections + * @method + * @alias any + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + *); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // false + * // result is false since none of the files exists + * } + *); + * + * // Using Promises + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since some file in the list exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since none of the files exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); + * console.log(result); + * // false + * // result is false since none of the files exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function some(coll, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOf$1, coll, iteratee, callback) + } + var some$1 = awaitify(some, 3); + + /** + * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. + * + * @name someLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anyLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ + function someLimit(coll, limit, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOfLimit(limit), coll, iteratee, callback) + } + var someLimit$1 = awaitify(someLimit, 4); + + /** + * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. + * + * @name someSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anySeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in series. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ + function someSeries(coll, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOfSeries$1, coll, iteratee, callback) + } + var someSeries$1 = awaitify(someSeries, 3); + + /** + * Sorts a list by the results of running each `coll` value through an async + * `iteratee`. + * + * @name sortBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a value to use as the sort criteria as + * its `result`. + * Invoked with (item, callback). + * @param {Function} callback - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is the items + * from the original `coll` sorted by the values returned by the `iteratee` + * calls. Invoked with (err, results). + * @returns {Promise} a promise, if no callback passed + * @example + * + * // bigfile.txt is a file that is 251100 bytes in size + * // mediumfile.txt is a file that is 11000 bytes in size + * // smallfile.txt is a file that is 121 bytes in size + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // By modifying the callback parameter the + * // sorting order can be influenced: + * + * // ascending order + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) return callback(getFileSizeErr); + * callback(null, fileSize); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // descending order + * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) { + * return callback(getFileSizeErr); + * } + * callback(null, fileSize * -1); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] + * } + * } + * ); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * } + * ); + * + * // Using Promises + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * (async () => { + * try { + * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * // Error handling + * async () => { + * try { + * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ + function sortBy (coll, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return map$1(coll, (x, iterCb) => { + _iteratee(x, (err, criteria) => { + if (err) return iterCb(err); + iterCb(err, {value: x, criteria}); + }); + }, (err, results) => { + if (err) return callback(err); + callback(null, results.sort(comparator).map(v => v.value)); + }); + + function comparator(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + } + } + var sortBy$1 = awaitify(sortBy, 3); + + /** + * Sets a time limit on an asynchronous function. If the function does not call + * its callback within the specified milliseconds, it will be called with a + * timeout error. The code property for the error object will be `'ETIMEDOUT'`. + * + * @name timeout + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} asyncFn - The async function to limit in time. + * @param {number} milliseconds - The specified time limit. + * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) + * to timeout Error for more information.. + * @returns {AsyncFunction} Returns a wrapped function that can be used with any + * of the control flow functions. + * Invoke this function with the same parameters as you would `asyncFunc`. + * @example + * + * function myFunction(foo, callback) { + * doAsyncTask(foo, function(err, data) { + * // handle errors + * if (err) return callback(err); + * + * // do some stuff ... + * + * // return processed data + * return callback(null, data); + * }); + * } + * + * var wrapped = async.timeout(myFunction, 1000); + * + * // call `wrapped` as you would `myFunction` + * wrapped({ bar: 'bar' }, function(err, data) { + * // if `myFunction` takes < 1000 ms to execute, `err` + * // and `data` will have their expected values + * + * // else `err` will be an Error with the code 'ETIMEDOUT' + * }); + */ + function timeout(asyncFn, milliseconds, info) { + var fn = wrapAsync(asyncFn); + + return initialParams((args, callback) => { + var timedOut = false; + var timer; + + function timeoutCallback() { + var name = asyncFn.name || 'anonymous'; + var error = new Error('Callback function "' + name + '" timed out.'); + error.code = 'ETIMEDOUT'; + if (info) { + error.info = info; + } + timedOut = true; + callback(error); + } + + args.push((...cbArgs) => { + if (!timedOut) { + callback(...cbArgs); + clearTimeout(timer); + } + }); + + // setup timer and call original function + timer = setTimeout(timeoutCallback, milliseconds); + fn(...args); + }); + } + + function range(size) { + var result = Array(size); + while (size--) { + result[size] = size; + } + return result; + } + + /** + * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a + * time. + * + * @name timesLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} count - The number of times to run the function. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see [async.map]{@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ + function timesLimit(count, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(range(count), limit, _iteratee, callback); + } + + /** + * Calls the `iteratee` function `n` times, and accumulates results in the same + * manner you would use with [map]{@link module:Collections.map}. + * + * @name times + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.map]{@link module:Collections.map} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + * @example + * + * // Pretend this is some complicated async factory + * var createUser = function(id, callback) { + * callback(null, { + * id: 'user' + id + * }); + * }; + * + * // generate 5 users + * async.times(5, function(n, next) { + * createUser(n, function(err, user) { + * next(err, user); + * }); + * }, function(err, users) { + * // we should now have 5 users + * }); + */ + function times (n, iteratee, callback) { + return timesLimit(n, Infinity, iteratee, callback) + } + + /** + * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. + * + * @name timesSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ + function timesSeries (n, iteratee, callback) { + return timesLimit(n, 1, iteratee, callback) + } + + /** + * A relative of `reduce`. Takes an Object or Array, and iterates over each + * element in parallel, each step potentially mutating an `accumulator` value. + * The type of the accumulator defaults to the type of collection passed in. + * + * @name transform + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} [accumulator] - The initial state of the transform. If omitted, + * it will default to an empty Object or Array, depending on the type of `coll` + * @param {AsyncFunction} iteratee - A function applied to each item in the + * collection that potentially modifies the accumulator. + * Invoked with (accumulator, item, key, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the transformed accumulator. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileList, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * }); + * + * // Using Promises + * async.transform(fileList, transformFileSize) + * .then(result => { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * (async () => { + * try { + * let result = await async.transform(fileList, transformFileSize); + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileMap, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * }); + * + * // Using Promises + * async.transform(fileMap, transformFileSize) + * .then(result => { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.transform(fileMap, transformFileSize); + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ + function transform (coll, accumulator, iteratee, callback) { + if (arguments.length <= 3 && typeof accumulator === 'function') { + callback = iteratee; + iteratee = accumulator; + accumulator = Array.isArray(coll) ? [] : {}; + } + callback = once(callback || promiseCallback()); + var _iteratee = wrapAsync(iteratee); + + eachOf$1(coll, (v, k, cb) => { + _iteratee(accumulator, v, k, cb); + }, err => callback(err, accumulator)); + return callback[PROMISE_SYMBOL] + } + + /** + * It runs each task in series but stops whenever any of the functions were + * successful. If one of the tasks were successful, the `callback` will be + * passed the result of the successful task. If all tasks fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name tryEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to + * run, each function is passed a `callback(err, result)` it must call on + * completion with an error `err` (which can be `null`) and an optional `result` + * value. + * @param {Function} [callback] - An optional callback which is called when one + * of the tasks has succeeded, or all have failed. It receives the `err` and + * `result` arguments of the last attempt at completing the `task`. Invoked with + * (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * async.tryEach([ + * function getDataFromFirstWebsite(callback) { + * // Try getting the data from the first website + * callback(err, data); + * }, + * function getDataFromSecondWebsite(callback) { + * // First website failed, + * // Try getting the data from the backup website + * callback(err, data); + * } + * ], + * // optional callback + * function(err, results) { + * Now do something with the data. + * }); + * + */ + function tryEach(tasks, callback) { + var error = null; + var result; + return eachSeries$1(tasks, (task, taskCb) => { + wrapAsync(task)((err, ...args) => { + if (err === false) return taskCb(err); + + if (args.length < 2) { + [result] = args; + } else { + result = args; + } + error = err; + taskCb(err ? null : {}); + }); + }, () => callback(error, result)); + } + + var tryEach$1 = awaitify(tryEach); + + /** + * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, + * unmemoized form. Handy for testing. + * + * @name unmemoize + * @static + * @memberOf module:Utils + * @method + * @see [async.memoize]{@link module:Utils.memoize} + * @category Util + * @param {AsyncFunction} fn - the memoized function + * @returns {AsyncFunction} a function that calls the original unmemoized function + */ + function unmemoize(fn) { + return (...args) => { + return (fn.unmemoized || fn)(...args); + }; + } + + /** + * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. + * + * @name whilst + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` passes. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + * @example + * + * var count = 0; + * async.whilst( + * function test(cb) { cb(null, count < 5); }, + * function iter(callback) { + * count++; + * setTimeout(function() { + * callback(null, count); + * }, 1000); + * }, + * function (err, n) { + * // 5 seconds have passed, n = 5 + * } + * ); + */ + function whilst(test, iteratee, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results = []; + + function next(err, ...rest) { + if (err) return callback(err); + results = rest; + if (err === false) return; + _test(check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return _test(check); + } + var whilst$1 = awaitify(whilst, 3); + + /** + * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. `callback` will be passed an error and any + * arguments passed to the final `iteratee`'s callback. + * + * The inverse of [whilst]{@link module:ControlFlow.whilst}. + * + * @name until + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (callback). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * const results = [] + * let finished = false + * async.until(function test(cb) { + * cb(null, finished) + * }, function iter(next) { + * fetchPage(url, (err, body) => { + * if (err) return next(err) + * results = results.concat(body.objects) + * finished = !!body.next + * next(err) + * }) + * }, function done (err) { + * // all pages have been fetched + * }) + */ + function until(test, iteratee, callback) { + const _test = wrapAsync(test); + return whilst$1((cb) => _test((err, truth) => cb (err, !truth)), iteratee, callback); + } + + /** + * Runs the `tasks` array of functions in series, each passing their results to + * the next in the array. However, if any of the `tasks` pass an error to their + * own callback, the next function is not executed, and the main `callback` is + * immediately called with the error. + * + * @name waterfall + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} + * to run. + * Each function should complete with any number of `result` values. + * The `result` values will be passed as arguments, in order, to the next task. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This will be passed the results of the last task's + * callback. Invoked with (err, [results]). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.waterfall([ + * function(callback) { + * callback(null, 'one', 'two'); + * }, + * function(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * }, + * function(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + * ], function (err, result) { + * // result now equals 'done' + * }); + * + * // Or, with named functions: + * async.waterfall([ + * myFirstFunction, + * mySecondFunction, + * myLastFunction, + * ], function (err, result) { + * // result now equals 'done' + * }); + * function myFirstFunction(callback) { + * callback(null, 'one', 'two'); + * } + * function mySecondFunction(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * } + * function myLastFunction(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + */ + function waterfall (tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); + if (!tasks.length) return callback(); + var taskIndex = 0; + + function nextTask(args) { + var task = wrapAsync(tasks[taskIndex++]); + task(...args, onlyOnce(next)); + } + + function next(err, ...args) { + if (err === false) return + if (err || taskIndex === tasks.length) { + return callback(err, ...args); + } + nextTask(args); + } + + nextTask([]); + } + + var waterfall$1 = awaitify(waterfall); + + /** + * An "async function" in the context of Async is an asynchronous function with + * a variable number of parameters, with the final parameter being a callback. + * (`function (arg1, arg2, ..., callback) {}`) + * The final callback is of the form `callback(err, results...)`, which must be + * called once the function is completed. The callback should be called with a + * Error as its first argument to signal that an error occurred. + * Otherwise, if no error occurred, it should be called with `null` as the first + * argument, and any additional `result` arguments that may apply, to signal + * successful completion. + * The callback must be called exactly once, ideally on a later tick of the + * JavaScript event loop. + * + * This type of function is also referred to as a "Node-style async function", + * or a "continuation passing-style function" (CPS). Most of the methods of this + * library are themselves CPS/Node-style async functions, or functions that + * return CPS/Node-style async functions. + * + * Wherever we accept a Node-style async function, we also directly accept an + * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. + * In this case, the `async` function will not be passed a final callback + * argument, and any thrown error will be used as the `err` argument of the + * implicit callback, and the return value will be used as the `result` value. + * (i.e. a `rejected` of the returned Promise becomes the `err` callback + * argument, and a `resolved` value becomes the `result`.) + * + * Note, due to JavaScript limitations, we can only detect native `async` + * functions and not transpilied implementations. + * Your environment must have `async`/`await` support for this to work. + * (e.g. Node > v7.6, or a recent version of a modern browser). + * If you are using `async` functions through a transpiler (e.g. Babel), you + * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, + * because the `async function` will be compiled to an ordinary function that + * returns a promise. + * + * @typedef {Function} AsyncFunction + * @static + */ + + var index = { + apply, + applyEach: applyEach$1, + applyEachSeries, + asyncify, + auto, + autoInject, + cargo, + cargoQueue: cargo$1, + compose, + concat: concat$1, + concatLimit: concatLimit$1, + concatSeries: concatSeries$1, + constant, + detect: detect$1, + detectLimit: detectLimit$1, + detectSeries: detectSeries$1, + dir, + doUntil, + doWhilst: doWhilst$1, + each, + eachLimit: eachLimit$2, + eachOf: eachOf$1, + eachOfLimit: eachOfLimit$2, + eachOfSeries: eachOfSeries$1, + eachSeries: eachSeries$1, + ensureAsync, + every: every$1, + everyLimit: everyLimit$1, + everySeries: everySeries$1, + filter: filter$1, + filterLimit: filterLimit$1, + filterSeries: filterSeries$1, + forever: forever$1, + groupBy, + groupByLimit: groupByLimit$1, + groupBySeries, + log, + map: map$1, + mapLimit: mapLimit$1, + mapSeries: mapSeries$1, + mapValues, + mapValuesLimit: mapValuesLimit$1, + mapValuesSeries, + memoize, + nextTick, + parallel: parallel$1, + parallelLimit, + priorityQueue, + queue: queue$1, + race: race$1, + reduce: reduce$1, + reduceRight, + reflect, + reflectAll, + reject: reject$2, + rejectLimit: rejectLimit$1, + rejectSeries: rejectSeries$1, + retry, + retryable, + seq, + series, + setImmediate: setImmediate$1, + some: some$1, + someLimit: someLimit$1, + someSeries: someSeries$1, + sortBy: sortBy$1, + timeout, + times, + timesLimit, + timesSeries, + transform, + tryEach: tryEach$1, + unmemoize, + until, + waterfall: waterfall$1, + whilst: whilst$1, + + // aliases + all: every$1, + allLimit: everyLimit$1, + allSeries: everySeries$1, + any: some$1, + anyLimit: someLimit$1, + anySeries: someSeries$1, + find: detect$1, + findLimit: detectLimit$1, + findSeries: detectSeries$1, + flatMap: concat$1, + flatMapLimit: concatLimit$1, + flatMapSeries: concatSeries$1, + forEach: each, + forEachSeries: eachSeries$1, + forEachLimit: eachLimit$2, + forEachOf: eachOf$1, + forEachOfSeries: eachOfSeries$1, + forEachOfLimit: eachOfLimit$2, + inject: reduce$1, + foldl: reduce$1, + foldr: reduceRight, + select: filter$1, + selectLimit: filterLimit$1, + selectSeries: filterSeries$1, + wrapSync: asyncify, + during: whilst$1, + doDuring: doWhilst$1 + }; + + exports.default = index; + exports.apply = apply; + exports.applyEach = applyEach$1; + exports.applyEachSeries = applyEachSeries; + exports.asyncify = asyncify; + exports.auto = auto; + exports.autoInject = autoInject; + exports.cargo = cargo; + exports.cargoQueue = cargo$1; + exports.compose = compose; + exports.concat = concat$1; + exports.concatLimit = concatLimit$1; + exports.concatSeries = concatSeries$1; + exports.constant = constant; + exports.detect = detect$1; + exports.detectLimit = detectLimit$1; + exports.detectSeries = detectSeries$1; + exports.dir = dir; + exports.doUntil = doUntil; + exports.doWhilst = doWhilst$1; + exports.each = each; + exports.eachLimit = eachLimit$2; + exports.eachOf = eachOf$1; + exports.eachOfLimit = eachOfLimit$2; + exports.eachOfSeries = eachOfSeries$1; + exports.eachSeries = eachSeries$1; + exports.ensureAsync = ensureAsync; + exports.every = every$1; + exports.everyLimit = everyLimit$1; + exports.everySeries = everySeries$1; + exports.filter = filter$1; + exports.filterLimit = filterLimit$1; + exports.filterSeries = filterSeries$1; + exports.forever = forever$1; + exports.groupBy = groupBy; + exports.groupByLimit = groupByLimit$1; + exports.groupBySeries = groupBySeries; + exports.log = log; + exports.map = map$1; + exports.mapLimit = mapLimit$1; + exports.mapSeries = mapSeries$1; + exports.mapValues = mapValues; + exports.mapValuesLimit = mapValuesLimit$1; + exports.mapValuesSeries = mapValuesSeries; + exports.memoize = memoize; + exports.nextTick = nextTick; + exports.parallel = parallel$1; + exports.parallelLimit = parallelLimit; + exports.priorityQueue = priorityQueue; + exports.queue = queue$1; + exports.race = race$1; + exports.reduce = reduce$1; + exports.reduceRight = reduceRight; + exports.reflect = reflect; + exports.reflectAll = reflectAll; + exports.reject = reject$2; + exports.rejectLimit = rejectLimit$1; + exports.rejectSeries = rejectSeries$1; + exports.retry = retry; + exports.retryable = retryable; + exports.seq = seq; + exports.series = series; + exports.setImmediate = setImmediate$1; + exports.some = some$1; + exports.someLimit = someLimit$1; + exports.someSeries = someSeries$1; + exports.sortBy = sortBy$1; + exports.timeout = timeout; + exports.times = times; + exports.timesLimit = timesLimit; + exports.timesSeries = timesSeries; + exports.transform = transform; + exports.tryEach = tryEach$1; + exports.unmemoize = unmemoize; + exports.until = until; + exports.waterfall = waterfall$1; + exports.whilst = whilst$1; + exports.all = every$1; + exports.allLimit = everyLimit$1; + exports.allSeries = everySeries$1; + exports.any = some$1; + exports.anyLimit = someLimit$1; + exports.anySeries = someSeries$1; + exports.find = detect$1; + exports.findLimit = detectLimit$1; + exports.findSeries = detectSeries$1; + exports.flatMap = concat$1; + exports.flatMapLimit = concatLimit$1; + exports.flatMapSeries = concatSeries$1; + exports.forEach = each; + exports.forEachSeries = eachSeries$1; + exports.forEachLimit = eachLimit$2; + exports.forEachOf = eachOf$1; + exports.forEachOfSeries = eachOfSeries$1; + exports.forEachOfLimit = eachOfLimit$2; + exports.inject = reduce$1; + exports.foldl = reduce$1; + exports.foldr = reduceRight; + exports.select = filter$1; + exports.selectLimit = filterLimit$1; + exports.selectSeries = filterSeries$1; + exports.wrapSync = asyncify; + exports.during = whilst$1; + exports.doDuring = doWhilst$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/async/dist/async.min.js b/node_modules/async/dist/async.min.js new file mode 100644 index 00000000..a12963b6 --- /dev/null +++ b/node_modules/async/dist/async.min.js @@ -0,0 +1 @@ +(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.async={})})(this,function(e){'use strict';function t(e,...t){return(...n)=>e(...t,...n)}function n(e){return function(...t){var n=t.pop();return e.call(this,t,n)}}function a(e){setTimeout(e,0)}function i(e){return(t,...n)=>e(()=>t(...n))}function r(e){return u(e)?function(...t){const n=t.pop(),a=e.apply(this,t);return s(a,n)}:n(function(t,n){var a;try{a=e.apply(this,t)}catch(t){return n(t)}return a&&"function"==typeof a.then?s(a,n):void n(null,a)})}function s(e,t){return e.then(e=>{l(t,null,e)},e=>{l(t,e&&e.message?e:new Error(e))})}function l(e,t,n){try{e(t,n)}catch(e){_e(t=>{throw t},e)}}function u(e){return"AsyncFunction"===e[Symbol.toStringTag]}function d(e){return"AsyncGenerator"===e[Symbol.toStringTag]}function p(e){return"function"==typeof e[Symbol.asyncIterator]}function c(e){if("function"!=typeof e)throw new Error("expected a function");return u(e)?r(e):e}function o(e,t=e.length){if(!t)throw new Error("arity is undefined");return function(...n){return"function"==typeof n[t-1]?e.apply(this,n):new Promise((a,i)=>{n[t-1]=(e,...t)=>e?i(e):void a(1{c(e).apply(i,n.concat(t))},a)});return a}}function f(e,t,n,a){t=t||[];var i=[],r=0,s=c(n);return e(t,(e,t,n)=>{var a=r++;s(e,(e,t)=>{i[a]=t,n(e)})},e=>{a(e,i)})}function y(e){return e&&"number"==typeof e.length&&0<=e.length&&0==e.length%1}function m(e){function t(...t){if(null!==e){var n=e;e=null,n.apply(this,t)}}return Object.assign(t,e),t}function g(e){return e[Symbol.iterator]&&e[Symbol.iterator]()}function k(e){var t=-1,n=e.length;return function(){return++t=t||d||l||(d=!0,e.next().then(({value:e,done:t})=>{if(!(u||l))return d=!1,t?(l=!0,void(0>=p&&a(null))):void(p++,n(e,c,r),c++,i())}).catch(s))}function r(e,t){return p-=1,u?void 0:e?s(e):!1===e?(l=!0,void(u=!0)):t===be||l&&0>=p?(l=!0,a(null)):void i()}function s(e){u||(d=!1,l=!0,a(e))}let l=!1,u=!1,d=!1,p=0,c=0;i()}function O(e,t,n){function a(e,t){!1===e&&(l=!0);!0===l||(e?n(e):(++r===s||t===be)&&n(null))}n=m(n);var i=0,r=0,{length:s}=e,l=!1;for(0===s&&n(null);i{t=e,n=a}),e}function A(e,t,n){function a(e,t){g.push(()=>l(e,t))}function i(){if(!h){if(0===g.length&&0===o)return n(null,p);for(;g.length&&oe()),i()}function l(e,t){if(!f){var a=L((t,...a)=>{if(o--,!1===t)return void(h=!0);if(2>a.length&&([a]=a),t){var i={};if(Object.keys(p).forEach(e=>{i[e]=p[e]}),i[e]=a,f=!0,y=Object.create(null),h)return;n(t,i)}else p[e]=a,s(e)});o++;var i=c(t[t.length-1]);1{const i=e[a];Array.isArray(i)&&0<=i.indexOf(t)&&n.push(a)}),n}"number"!=typeof t&&(n=t,t=null),n=m(n||b());var d=Object.keys(e).length;if(!d)return n(null);t||(t=d);var p={},o=0,h=!1,f=!1,y=Object.create(null),g=[],k=[],v={};return Object.keys(e).forEach(t=>{var n=e[t];if(!Array.isArray(n))return a(t,[n]),void k.push(t);var i=n.slice(0,n.length-1),s=i.length;return 0===s?(a(t,n),void k.push(t)):void(v[t]=s,i.forEach(l=>{if(!e[l])throw new Error("async.auto task `"+t+"` has a non-existent dependency `"+l+"` in "+i.join(", "));r(l,()=>{s--,0===s&&a(t,n)})}))}),function(){for(var e,t=0;k.length;)e=k.pop(),t++,u(e).forEach(e=>{0==--v[e]&&k.push(e)});if(t!==d)throw new Error("async.auto cannot execute tasks due to a recursive dependency")}(),i(),n[Ce]}function I(e){let t="",n=0,a=e.indexOf("*/");for(;ne.replace(Ne,"").trim())}function j(e,t){var n={};return Object.keys(e).forEach(t=>{function a(e,t){var n=i.map(t=>e[t]);n.push(t),c(r)(...n)}var i,r=e[t],s=u(r),l=!s&&1===r.length||s&&0===r.length;if(Array.isArray(r))i=[...r],r=i.pop(),n[t]=i.concat(0{r(e,n),t(...a)};f[e].push(n)}function r(e,t){return e?t?void(f[e]=f[e].filter(e=>e!==t)):f[e]=[]:Object.keys(f).forEach(e=>f[e]=[])}function s(e,...t){f[e].forEach(e=>e(...t))}function l(e,t,n,a){function i(e,...t){return e?n?s(e):r():1>=t.length?r(t[0]):void r(t)}if(null!=a&&"function"!=typeof a)throw new Error("task callback must be a function");k.started=!0;var r,s,l=k._createTaskItem(e,n?i:a||i);if(t?k._tasks.unshift(l):k._tasks.push(l),y||(y=!0,_e(()=>{y=!1,k.process()})),n||!a)return new Promise((e,t)=>{r=e,s=t})}function u(e){return function(t,...n){o-=1;for(var a=0,r=e.length;as("drain")),!0)}if(null==t)t=1;else if(0===t)throw new RangeError("Concurrency must not be zero");var p=c(e),o=0,h=[];const f={error:[],drain:[],saturated:[],unsaturated:[],empty:[]};var y=!1;const m=e=>t=>t?void(r(e),a(e,t)):new Promise((t,n)=>{i(e,(e,a)=>e?n(e):void t(a))});var g=!1,k={_tasks:new Ve,_createTaskItem(e,t){return{data:e,callback:t}},*[Symbol.iterator](){yield*k._tasks[Symbol.iterator]()},concurrency:t,payload:n,buffer:t/4,started:!1,paused:!1,push(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!1,!1,t)):l(e,!1,!1,t)},pushAsync(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!1,!0,t)):l(e,!1,!0,t)},kill(){r(),k._tasks.empty()},unshift(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!0,!1,t)):l(e,!0,!1,t)},unshiftAsync(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!0,!0,t)):l(e,!0,!0,t)},remove(e){k._tasks.remove(e)},process(){var e=Math.min;if(!g){for(g=!0;!k.paused&&o{t.apply(n,e.concat((e,...t)=>{a(e,t)}))},(e,t)=>a(e,...t)),a[Ce]}}function P(...e){return C(...e.reverse())}function R(...e){return function(...t){var n=t.pop();return n(null,...e)}}function z(e,t){return(n,a,i,r)=>{var s,l=!1;const u=c(i);n(a,(n,a,i)=>{u(n,(a,r)=>a||!1===a?i(a):e(r)&&!s?(l=!0,s=t(!0,n),i(null,be)):void i())},e=>e?r(e):void r(null,l?s:t(!1)))}}function N(e){return(t,...n)=>c(t)(...n,(t,...n)=>{"object"==typeof console&&(t?console.error&&console.error(t):console[e]&&n.forEach(t=>console[e](t)))})}function V(e,t,n){const a=c(t);return Xe(e,(...e)=>{const t=e.pop();a(...e,(e,n)=>t(e,!n))},n)}function Y(e){return(t,n,a)=>e(t,a)}function q(e){return u(e)?e:function(...t){var n=t.pop(),a=!0;t.push((...e)=>{a?_e(()=>n(...e)):n(...e)}),e.apply(this,t),a=!1}}function D(e,t,n,a){var r=Array(t.length);e(t,(e,t,a)=>{n(e,(e,n)=>{r[t]=!!n,a(e)})},e=>{if(e)return a(e);for(var n=[],s=0;s{n(e,(n,r)=>n?a(n):void(r&&i.push({index:t,value:e}),a(n)))},e=>e?a(e):void a(null,i.sort((e,t)=>e.index-t.index).map(e=>e.value)))}function U(e,t,n,a){var i=y(t)?D:Q;return i(e,t,c(n),a)}function G(e,t,n){return ut(e,1/0,t,n)}function W(e,t,n){return ut(e,1,t,n)}function H(e,t,n){return pt(e,1/0,t,n)}function J(e,t,n){return pt(e,1,t,n)}function K(e,t=e=>e){var a=Object.create(null),r=Object.create(null),s=c(e),l=n((e,n)=>{var u=t(...e);u in a?_e(()=>n(null,...a[u])):u in r?r[u].push(n):(r[u]=[n],s(...e,(e,...t)=>{e||(a[u]=t);var n=r[u];delete r[u];for(var s=0,d=n.length;s{n(e[0],t)},t,1)}function ee(e){return(e<<1)+1}function te(e){return(e+1>>1)-1}function ne(e,t){return e.priority===t.priority?e.pushCount({data:e,priority:t})):{data:e,priority:t}}var a=$(e,t),{push:i,pushAsync:r}=a;return a._tasks=new ht,a._createTaskItem=({data:e,priority:t},n)=>({data:e,priority:t,callback:n}),a.push=function(e,t=0,a){return i(n(e,t),a)},a.pushAsync=function(e,t=0,a){return r(n(e,t),a)},delete a.unshift,delete a.unshiftAsync,a}function ie(e,t,n,a){var i=[...e].reverse();return qe(i,t,n,a)}function re(e){var t=c(e);return n(function(e,n){return e.push((e,...t)=>{let a={};if(e&&(a.error=e),0=t.length&&([i]=t),a.value=i}n(null,a)}),t.apply(this,e)})}function se(e){var t;return Array.isArray(e)?t=e.map(re):(t={},Object.keys(e).forEach(n=>{t[n]=re.call(this,e[n])})),t}function le(e,t,n,a){const i=c(n);return U(e,t,(e,t)=>{i(e,(e,n)=>{t(e,!n)})},a)}function ue(e){return function(){return e}}function de(e,t,n){function a(){r((e,...t)=>{!1===e||(e&&s++arguments.length&&"function"==typeof e?(n=t||b(),t=e):(pe(i,e),n=n||b()),"function"!=typeof t)throw new Error("Invalid arguments for async.retry");var r=c(t),s=1;return a(),n[Ce]}function pe(e,n){if("object"==typeof n)e.times=+n.times||kt,e.intervalFunc="function"==typeof n.interval?n.interval:ue(+n.interval||vt),e.errorFilter=n.errorFilter;else if("number"==typeof n||"string"==typeof n)e.times=+n||kt;else throw new Error("Invalid arguments for async.retry")}function ce(e,t){t||(t=e,e=null);let a=e&&e.arity||t.length;u(t)&&(a+=1);var i=c(t);return n((t,n)=>{function r(e){i(...t,e)}return(t.length{var s,l=!1;n.push((...e)=>{l||(r(...e),clearTimeout(s))}),s=setTimeout(function(){var t=e.name||"anonymous",n=new Error("Callback function \""+t+"\" timed out.");n.code="ETIMEDOUT",a&&(n.info=a),l=!0,r(n)},t),i(...n)})}function fe(e){for(var t=Array(e);e--;)t[e]=e;return t}function ye(e,t,n,a){var i=c(n);return De(fe(e),t,i,a)}function me(e,t,n){return ye(e,1/0,t,n)}function ge(e,t,n){return ye(e,1,t,n)}function ke(e,t,n,a){3>=arguments.length&&"function"==typeof t&&(a=n,n=t,t=Array.isArray(e)?[]:{}),a=m(a||b());var i=c(n);return Me(e,(e,n,a)=>{i(t,e,n,a)},e=>a(e,t)),a[Ce]}function ve(e){return(...t)=>(e.unmemoized||e)(...t)}function Se(e,t,n){const a=c(e);return _t(e=>a((t,n)=>e(t,!n)),t,n)}var xe,Le="function"==typeof queueMicrotask&&queueMicrotask,Ee="function"==typeof setImmediate&&setImmediate,Oe="object"==typeof process&&"function"==typeof process.nextTick;xe=Le?queueMicrotask:Ee?setImmediate:Oe?process.nextTick:a;var _e=i(xe);const be={};var Ae=e=>(t,n,a)=>{function i(e,t){if(!u)if(c-=1,e)l=!0,a(e);else if(!1===e)l=!0,u=!0;else{if(t===be||l&&0>=c)return l=!0,a(null);o||r()}}function r(){for(o=!0;c=c&&a(null));c+=1,n(t.value,t.key,L(i))}o=!1}if(a=m(a),0>=e)throw new RangeError("concurrency limit cannot be less than 1");if(!t)return a(null);if(d(t))return E(t,e,n,a);if(p(t))return E(t[Symbol.asyncIterator](),e,n,a);var s=x(t),l=!1,u=!1,c=0,o=!1;r()},Ie=o(function(e,t,n,a){return Ae(t)(e,c(n),a)},4),Me=o(function(e,t,n){var a=y(e)?O:_;return a(e,c(t),n)},3),je=o(function(e,t,n){return f(Me,e,t,n)},3),we=h(je),Be=o(function(e,t,n){return Ie(e,1,t,n)},3),Te=o(function(e,t,n){return f(Be,e,t,n)},3),Fe=h(Te);const Ce=Symbol("promiseCallback");var Pe=/^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/,Re=/^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/,ze=/,/,Ne=/(=.+)?(\s*)$/;class Ve{constructor(){this.head=this.tail=null,this.length=0}removeLink(e){return e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=e.next=null,this.length-=1,e}empty(){for(;this.head;)this.shift();return this}insertAfter(e,t){t.prev=e,t.next=e.next,e.next?e.next.prev=t:this.tail=t,e.next=t,this.length+=1}insertBefore(e,t){t.prev=e.prev,t.next=e,e.prev?e.prev.next=t:this.head=t,e.prev=t,this.length+=1}unshift(e){this.head?this.insertBefore(this.head,e):w(this,e)}push(e){this.tail?this.insertAfter(this.tail,e):w(this,e)}shift(){return this.head&&this.removeLink(this.head)}pop(){return this.tail&&this.removeLink(this.tail)}toArray(){return[...this]}*[Symbol.iterator](){for(var e=this.head;e;)yield e.data,e=e.next}remove(e){for(var t=this.head;t;){var{next:n}=t;e(t)&&this.removeLink(t),t=n}return this}}var Ye,qe=o(function(e,t,n,a){a=m(a);var r=c(n);return Be(e,(e,n,a)=>{r(t,e,(e,n)=>{t=n,a(e)})},e=>a(e,t))},4),De=o(function(e,t,n,a){return f(Ae(t),e,n,a)},4),Qe=o(function(e,t,n,a){var i=c(n);return De(e,t,(e,t)=>{i(e,(e,...n)=>e?t(e):t(e,n))},(e,t)=>{for(var n=[],r=0;re,(e,t)=>t)(Me,e,t,n)},3),He=o(function(e,t,n,a){return z(e=>e,(e,t)=>t)(Ae(t),e,n,a)},4),Je=o(function(e,t,n){return z(e=>e,(e,t)=>t)(Ae(1),e,t,n)},3),Ke=N("dir"),Xe=o(function(e,t,n){function a(e,...t){return e?n(e):void(!1===e||(r=t,l(...t,i)))}function i(e,t){return e?n(e):!1===e?void 0:t?void s(a):n(null,...r)}n=L(n);var r,s=c(e),l=c(t);return i(null,!0)},3),Ze=o(function(e,t,n){return Me(e,Y(c(t)),n)},3),$e=o(function(e,t,n,a){return Ae(t)(e,Y(c(n)),a)},4),et=o(function(e,t,n){return $e(e,1,t,n)},3),tt=o(function(e,t,n){return z(e=>!e,e=>!e)(Me,e,t,n)},3),nt=o(function(e,t,n,a){return z(e=>!e,e=>!e)(Ae(t),e,n,a)},4),at=o(function(e,t,n){return z(e=>!e,e=>!e)(Be,e,t,n)},3),it=o(function(e,t,n){return U(Me,e,t,n)},3),rt=o(function(e,t,n,a){return U(Ae(t),e,n,a)},4),st=o(function(e,t,n){return U(Be,e,t,n)},3),lt=o(function(e,t){function n(e){return e?a(e):void(!1===e||i(n))}var a=L(t),i=c(q(e));return n()},2),ut=o(function(e,t,n,a){var i=c(n);return De(e,t,(e,t)=>{i(e,(n,a)=>n?t(n):t(n,{key:a,val:e}))},(e,t)=>{for(var n={},{hasOwnProperty:r}=Object.prototype,s=0;s{r(e,t,(e,a)=>e?n(e):void(i[t]=a,n(e)))},e=>a(e,i))},4);Ye=Oe?process.nextTick:Ee?setImmediate:a;var ct=i(Ye),ot=o((e,t,n)=>{var a=y(t)?[]:{};e(t,(e,t,n)=>{c(e)((e,...i)=>{2>i.length&&([i]=i),a[t]=i,n(e)})},e=>n(e,a))},3);class ht{constructor(){this.heap=[],this.pushCount=Number.MIN_SAFE_INTEGER}get length(){return this.heap.length}empty(){return this.heap=[],this}percUp(e){for(let n;0e)(Me,e,t,n)},3),xt=o(function(e,t,n,a){return z(Boolean,e=>e)(Ae(t),e,n,a)},4),Lt=o(function(e,t,n){return z(Boolean,e=>e)(Be,e,t,n)},3),Et=o(function(e,t,n){function a(e,t){var n=e.criteria,a=t.criteria;return na?1:0}var i=c(t);return je(e,(e,t)=>{i(e,(n,a)=>n?t(n):void t(n,{value:e,criteria:a}))},(e,t)=>e?n(e):void n(null,t.sort(a).map(e=>e.value)))},3),Ot=o(function(e,t){var n,a=null;return et(e,(e,t)=>{c(e)((e,...i)=>!1===e?t(e):void(2>i.length?[n]=i:n=i,a=e,t(e?null:{})))},()=>t(a,n))}),_t=o(function(e,t,n){function a(e,...t){if(e)return n(e);l=t;!1===e||s(i)}function i(e,t){return e?n(e):!1===e?void 0:t?void r(a):n(null,...l)}n=L(n);var r=c(t),s=c(e),l=[];return s(i)},3),bt=o(function(e,t){function n(t){var n=c(e[i++]);n(...t,L(a))}function a(a,...r){return!1===a?void 0:a||i===e.length?t(a,...r):void n(r)}if(t=m(t),!Array.isArray(e))return t(new Error("First argument to waterfall must be an array of functions"));if(!e.length)return t();var i=0;n([])});e.default={apply:t,applyEach:we,applyEachSeries:Fe,asyncify:r,auto:A,autoInject:j,cargo:T,cargoQueue:F,compose:P,concat:Ue,concatLimit:Qe,concatSeries:Ge,constant:R,detect:We,detectLimit:He,detectSeries:Je,dir:Ke,doUntil:V,doWhilst:Xe,each:Ze,eachLimit:$e,eachOf:Me,eachOfLimit:Ie,eachOfSeries:Be,eachSeries:et,ensureAsync:q,every:tt,everyLimit:nt,everySeries:at,filter:it,filterLimit:rt,filterSeries:st,forever:lt,groupBy:G,groupByLimit:ut,groupBySeries:W,log:dt,map:je,mapLimit:De,mapSeries:Te,mapValues:H,mapValuesLimit:pt,mapValuesSeries:J,memoize:K,nextTick:ct,parallel:X,parallelLimit:Z,priorityQueue:ae,queue:$,race:ft,reduce:qe,reduceRight:ie,reflect:re,reflectAll:se,reject:yt,rejectLimit:mt,rejectSeries:gt,retry:de,retryable:ce,seq:C,series:oe,setImmediate:_e,some:St,someLimit:xt,someSeries:Lt,sortBy:Et,timeout:he,times:me,timesLimit:ye,timesSeries:ge,transform:ke,tryEach:Ot,unmemoize:ve,until:Se,waterfall:bt,whilst:_t,all:tt,allLimit:nt,allSeries:at,any:St,anyLimit:xt,anySeries:Lt,find:We,findLimit:He,findSeries:Je,flatMap:Ue,flatMapLimit:Qe,flatMapSeries:Ge,forEach:Ze,forEachSeries:et,forEachLimit:$e,forEachOf:Me,forEachOfSeries:Be,forEachOfLimit:Ie,inject:qe,foldl:qe,foldr:ie,select:it,selectLimit:rt,selectSeries:st,wrapSync:r,during:_t,doDuring:Xe},e.apply=t,e.applyEach=we,e.applyEachSeries=Fe,e.asyncify=r,e.auto=A,e.autoInject=j,e.cargo=T,e.cargoQueue=F,e.compose=P,e.concat=Ue,e.concatLimit=Qe,e.concatSeries=Ge,e.constant=R,e.detect=We,e.detectLimit=He,e.detectSeries=Je,e.dir=Ke,e.doUntil=V,e.doWhilst=Xe,e.each=Ze,e.eachLimit=$e,e.eachOf=Me,e.eachOfLimit=Ie,e.eachOfSeries=Be,e.eachSeries=et,e.ensureAsync=q,e.every=tt,e.everyLimit=nt,e.everySeries=at,e.filter=it,e.filterLimit=rt,e.filterSeries=st,e.forever=lt,e.groupBy=G,e.groupByLimit=ut,e.groupBySeries=W,e.log=dt,e.map=je,e.mapLimit=De,e.mapSeries=Te,e.mapValues=H,e.mapValuesLimit=pt,e.mapValuesSeries=J,e.memoize=K,e.nextTick=ct,e.parallel=X,e.parallelLimit=Z,e.priorityQueue=ae,e.queue=$,e.race=ft,e.reduce=qe,e.reduceRight=ie,e.reflect=re,e.reflectAll=se,e.reject=yt,e.rejectLimit=mt,e.rejectSeries=gt,e.retry=de,e.retryable=ce,e.seq=C,e.series=oe,e.setImmediate=_e,e.some=St,e.someLimit=xt,e.someSeries=Lt,e.sortBy=Et,e.timeout=he,e.times=me,e.timesLimit=ye,e.timesSeries=ge,e.transform=ke,e.tryEach=Ot,e.unmemoize=ve,e.until=Se,e.waterfall=bt,e.whilst=_t,e.all=tt,e.allLimit=nt,e.allSeries=at,e.any=St,e.anyLimit=xt,e.anySeries=Lt,e.find=We,e.findLimit=He,e.findSeries=Je,e.flatMap=Ue,e.flatMapLimit=Qe,e.flatMapSeries=Ge,e.forEach=Ze,e.forEachSeries=et,e.forEachLimit=$e,e.forEachOf=Me,e.forEachOfSeries=Be,e.forEachOfLimit=Ie,e.inject=qe,e.foldl=qe,e.foldr=ie,e.select=it,e.selectLimit=rt,e.selectSeries=st,e.wrapSync=r,e.during=_t,e.doDuring=Xe,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/node_modules/async/dist/async.mjs b/node_modules/async/dist/async.mjs new file mode 100644 index 00000000..d0cd59d9 --- /dev/null +++ b/node_modules/async/dist/async.mjs @@ -0,0 +1,5947 @@ +/** + * Creates a continuation function with some arguments already applied. + * + * Useful as a shorthand when combined with other control flow functions. Any + * arguments passed to the returned function are added to the arguments + * originally passed to apply. + * + * @name apply + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {Function} fn - The function you want to eventually apply all + * arguments to. Invokes with (arguments...). + * @param {...*} arguments... - Any number of arguments to automatically apply + * when the continuation is called. + * @returns {Function} the partially-applied function + * @example + * + * // using apply + * async.parallel([ + * async.apply(fs.writeFile, 'testfile1', 'test1'), + * async.apply(fs.writeFile, 'testfile2', 'test2') + * ]); + * + * + * // the same process without using apply + * async.parallel([ + * function(callback) { + * fs.writeFile('testfile1', 'test1', callback); + * }, + * function(callback) { + * fs.writeFile('testfile2', 'test2', callback); + * } + * ]); + * + * // It's possible to pass any number of additional arguments when calling the + * // continuation: + * + * node> var fn = async.apply(sys.puts, 'one'); + * node> fn('two', 'three'); + * one + * two + * three + */ +function apply(fn, ...args) { + return (...callArgs) => fn(...args,...callArgs); +} + +function initialParams (fn) { + return function (...args/*, callback*/) { + var callback = args.pop(); + return fn.call(this, args, callback); + }; +} + +/* istanbul ignore file */ + +var hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; +var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; +var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; + +function fallback(fn) { + setTimeout(fn, 0); +} + +function wrap(defer) { + return (fn, ...args) => defer(() => fn(...args)); +} + +var _defer; + +if (hasQueueMicrotask) { + _defer = queueMicrotask; +} else if (hasSetImmediate) { + _defer = setImmediate; +} else if (hasNextTick) { + _defer = process.nextTick; +} else { + _defer = fallback; +} + +var setImmediate$1 = wrap(_defer); + +/** + * Take a sync function and make it async, passing its return value to a + * callback. This is useful for plugging sync functions into a waterfall, + * series, or other async functions. Any arguments passed to the generated + * function will be passed to the wrapped function (except for the final + * callback argument). Errors thrown will be passed to the callback. + * + * If the function passed to `asyncify` returns a Promise, that promises's + * resolved/rejected state will be used to call the callback, rather than simply + * the synchronous return value. + * + * This also means you can asyncify ES2017 `async` functions. + * + * @name asyncify + * @static + * @memberOf module:Utils + * @method + * @alias wrapSync + * @category Util + * @param {Function} func - The synchronous function, or Promise-returning + * function to convert to an {@link AsyncFunction}. + * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be + * invoked with `(args..., callback)`. + * @example + * + * // passing a regular synchronous function + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(JSON.parse), + * function (data, next) { + * // data is the result of parsing the text. + * // If there was a parsing error, it would have been caught. + * } + * ], callback); + * + * // passing a function returning a promise + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(function (contents) { + * return db.model.create(contents); + * }), + * function (model, next) { + * // `model` is the instantiated model object. + * // If there was an error, this function would be skipped. + * } + * ], callback); + * + * // es2017 example, though `asyncify` is not needed if your JS environment + * // supports async functions out of the box + * var q = async.queue(async.asyncify(async function(file) { + * var intermediateStep = await processFile(file); + * return await somePromise(intermediateStep) + * })); + * + * q.push(files); + */ +function asyncify(func) { + if (isAsync(func)) { + return function (...args/*, callback*/) { + const callback = args.pop(); + const promise = func.apply(this, args); + return handlePromise(promise, callback) + } + } + + return initialParams(function (args, callback) { + var result; + try { + result = func.apply(this, args); + } catch (e) { + return callback(e); + } + // if result is Promise object + if (result && typeof result.then === 'function') { + return handlePromise(result, callback) + } else { + callback(null, result); + } + }); +} + +function handlePromise(promise, callback) { + return promise.then(value => { + invokeCallback(callback, null, value); + }, err => { + invokeCallback(callback, err && err.message ? err : new Error(err)); + }); +} + +function invokeCallback(callback, error, value) { + try { + callback(error, value); + } catch (err) { + setImmediate$1(e => { throw e }, err); + } +} + +function isAsync(fn) { + return fn[Symbol.toStringTag] === 'AsyncFunction'; +} + +function isAsyncGenerator(fn) { + return fn[Symbol.toStringTag] === 'AsyncGenerator'; +} + +function isAsyncIterable(obj) { + return typeof obj[Symbol.asyncIterator] === 'function'; +} + +function wrapAsync(asyncFn) { + if (typeof asyncFn !== 'function') throw new Error('expected a function') + return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; +} + +// conditionally promisify a function. +// only return a promise if a callback is omitted +function awaitify (asyncFn, arity = asyncFn.length) { + if (!arity) throw new Error('arity is undefined') + function awaitable (...args) { + if (typeof args[arity - 1] === 'function') { + return asyncFn.apply(this, args) + } + + return new Promise((resolve, reject) => { + args[arity - 1] = (err, ...cbArgs) => { + if (err) return reject(err) + resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); + }; + asyncFn.apply(this, args); + }) + } + + return awaitable +} + +function applyEach (eachfn) { + return function applyEach(fns, ...callArgs) { + const go = awaitify(function (callback) { + var that = this; + return eachfn(fns, (fn, cb) => { + wrapAsync(fn).apply(that, callArgs.concat(cb)); + }, callback); + }); + return go; + }; +} + +function _asyncMap(eachfn, arr, iteratee, callback) { + arr = arr || []; + var results = []; + var counter = 0; + var _iteratee = wrapAsync(iteratee); + + return eachfn(arr, (value, _, iterCb) => { + var index = counter++; + _iteratee(value, (err, v) => { + results[index] = v; + iterCb(err); + }); + }, err => { + callback(err, results); + }); +} + +function isArrayLike(value) { + return value && + typeof value.length === 'number' && + value.length >= 0 && + value.length % 1 === 0; +} + +// A temporary value used to identify if the loop should be broken. +// See #1064, #1293 +const breakLoop = {}; + +function once(fn) { + function wrapper (...args) { + if (fn === null) return; + var callFn = fn; + fn = null; + callFn.apply(this, args); + } + Object.assign(wrapper, fn); + return wrapper +} + +function getIterator (coll) { + return coll[Symbol.iterator] && coll[Symbol.iterator](); +} + +function createArrayIterator(coll) { + var i = -1; + var len = coll.length; + return function next() { + return ++i < len ? {value: coll[i], key: i} : null; + } +} + +function createES2015Iterator(iterator) { + var i = -1; + return function next() { + var item = iterator.next(); + if (item.done) + return null; + i++; + return {value: item.value, key: i}; + } +} + +function createObjectIterator(obj) { + var okeys = obj ? Object.keys(obj) : []; + var i = -1; + var len = okeys.length; + return function next() { + var key = okeys[++i]; + if (key === '__proto__') { + return next(); + } + return i < len ? {value: obj[key], key} : null; + }; +} + +function createIterator(coll) { + if (isArrayLike(coll)) { + return createArrayIterator(coll); + } + + var iterator = getIterator(coll); + return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); +} + +function onlyOnce(fn) { + return function (...args) { + if (fn === null) throw new Error("Callback was already called."); + var callFn = fn; + fn = null; + callFn.apply(this, args); + }; +} + +// for async generators +function asyncEachOfLimit(generator, limit, iteratee, callback) { + let done = false; + let canceled = false; + let awaiting = false; + let running = 0; + let idx = 0; + + function replenish() { + //console.log('replenish') + if (running >= limit || awaiting || done) return + //console.log('replenish awaiting') + awaiting = true; + generator.next().then(({value, done: iterDone}) => { + //console.log('got value', value) + if (canceled || done) return + awaiting = false; + if (iterDone) { + done = true; + if (running <= 0) { + //console.log('done nextCb') + callback(null); + } + return; + } + running++; + iteratee(value, idx, iterateeCallback); + idx++; + replenish(); + }).catch(handleError); + } + + function iterateeCallback(err, result) { + //console.log('iterateeCallback') + running -= 1; + if (canceled) return + if (err) return handleError(err) + + if (err === false) { + done = true; + canceled = true; + return + } + + if (result === breakLoop || (done && running <= 0)) { + done = true; + //console.log('done iterCb') + return callback(null); + } + replenish(); + } + + function handleError(err) { + if (canceled) return + awaiting = false; + done = true; + callback(err); + } + + replenish(); +} + +var eachOfLimit = (limit) => { + return (obj, iteratee, callback) => { + callback = once(callback); + if (limit <= 0) { + throw new RangeError('concurrency limit cannot be less than 1') + } + if (!obj) { + return callback(null); + } + if (isAsyncGenerator(obj)) { + return asyncEachOfLimit(obj, limit, iteratee, callback) + } + if (isAsyncIterable(obj)) { + return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback) + } + var nextElem = createIterator(obj); + var done = false; + var canceled = false; + var running = 0; + var looping = false; + + function iterateeCallback(err, value) { + if (canceled) return + running -= 1; + if (err) { + done = true; + callback(err); + } + else if (err === false) { + done = true; + canceled = true; + } + else if (value === breakLoop || (done && running <= 0)) { + done = true; + return callback(null); + } + else if (!looping) { + replenish(); + } + } + + function replenish () { + looping = true; + while (running < limit && !done) { + var elem = nextElem(); + if (elem === null) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running += 1; + iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); + } + looping = false; + } + + replenish(); + }; +}; + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a + * time. + * + * @name eachOfLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. The `key` is the item's key, or index in the case of an + * array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfLimit$1(coll, limit, iteratee, callback) { + return eachOfLimit(limit)(coll, wrapAsync(iteratee), callback); +} + +var eachOfLimit$2 = awaitify(eachOfLimit$1, 4); + +// eachOf implementation optimized for array-likes +function eachOfArrayLike(coll, iteratee, callback) { + callback = once(callback); + var index = 0, + completed = 0, + {length} = coll, + canceled = false; + if (length === 0) { + callback(null); + } + + function iteratorCallback(err, value) { + if (err === false) { + canceled = true; + } + if (canceled === true) return + if (err) { + callback(err); + } else if ((++completed === length) || value === breakLoop) { + callback(null); + } + } + + for (; index < length; index++) { + iteratee(coll[index], index, onlyOnce(iteratorCallback)); + } +} + +// a generic version of eachOf which can handle array, object, and iterator cases. +function eachOfGeneric (coll, iteratee, callback) { + return eachOfLimit$2(coll, Infinity, iteratee, callback); +} + +/** + * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument + * to the iteratee. + * + * @name eachOf + * @static + * @memberOf module:Collections + * @method + * @alias forEachOf + * @category Collection + * @see [async.each]{@link module:Collections.each} + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each + * item in `coll`. + * The `key` is the item's key, or index in the case of an array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dev.json is a file containing a valid json object config for dev environment + * // dev.json is a file containing a valid json object config for test environment + * // prod.json is a file containing a valid json object config for prod environment + * // invalid.json is a file with a malformed json object + * + * let configs = {}; //global variable + * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; + * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; + * + * // asynchronous function that reads a json file and parses the contents as json object + * function parseFile(file, key, callback) { + * fs.readFile(file, "utf8", function(err, data) { + * if (err) return calback(err); + * try { + * configs[key] = JSON.parse(data); + * } catch (e) { + * return callback(e); + * } + * callback(); + * }); + * } + * + * // Using callbacks + * async.forEachOf(validConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * } else { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * // JSON parse error exception + * } else { + * console.log(configs); + * } + * }); + * + * // Using Promises + * async.forEachOf(validConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * }).catch( err => { + * console.error(err); + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * }).catch( err => { + * console.error(err); + * // JSON parse error exception + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.forEachOf(validConfigFileMap, parseFile); + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * catch (err) { + * console.log(err); + * } + * } + * + * //Error handing + * async () => { + * try { + * let result = await async.forEachOf(invalidConfigFileMap, parseFile); + * console.log(configs); + * } + * catch (err) { + * console.log(err); + * // JSON parse error exception + * } + * } + * + */ +function eachOf(coll, iteratee, callback) { + var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; + return eachOfImplementation(coll, wrapAsync(iteratee), callback); +} + +var eachOf$1 = awaitify(eachOf, 3); + +/** + * Produces a new collection of values by mapping each value in `coll` through + * the `iteratee` function. The `iteratee` is called with an item from `coll` + * and a callback for when it has finished processing. Each of these callbacks + * takes 2 arguments: an `error`, and the transformed item from `coll`. If + * `iteratee` passes an error to its callback, the main `callback` (for the + * `map` function) is immediately called with the error. + * + * Note, that since this function applies the `iteratee` to each item in + * parallel, there is no guarantee that the `iteratee` functions will complete + * in order. However, the results array will be in the same order as the + * original `coll`. + * + * If `map` is passed an Object, the results will be an Array. The results + * will roughly be in the order of the original Objects' keys (but this can + * vary across JavaScript engines). + * + * @name map + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an Array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.map(fileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.map(fileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.map(fileList, getFileSizeInBytes); + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.map(withMissingFileList, getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function map (coll, iteratee, callback) { + return _asyncMap(eachOf$1, coll, iteratee, callback) +} +var map$1 = awaitify(map, 3); + +/** + * Applies the provided arguments to each function in the array, calling + * `callback` after all functions have completed. If you only provide the first + * argument, `fns`, then it will return a function which lets you pass in the + * arguments as if it were a single function call. If more arguments are + * provided, `callback` is required while `args` is still optional. The results + * for each of the applied async functions are passed to the final callback + * as an array. + * + * @name applyEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s + * to all call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - Returns a function that takes no args other than + * an optional callback, that is the result of applying the `args` to each + * of the functions. + * @example + * + * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') + * + * appliedFn((err, results) => { + * // results[0] is the results for `enableSearch` + * // results[1] is the results for `updateSchema` + * }); + * + * // partial application example: + * async.each( + * buckets, + * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), + * callback + * ); + */ +var applyEach$1 = applyEach(map$1); + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. + * + * @name eachOfSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfSeries(coll, iteratee, callback) { + return eachOfLimit$2(coll, 1, iteratee, callback) +} +var eachOfSeries$1 = awaitify(eachOfSeries, 3); + +/** + * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. + * + * @name mapSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function mapSeries (coll, iteratee, callback) { + return _asyncMap(eachOfSeries$1, coll, iteratee, callback) +} +var mapSeries$1 = awaitify(mapSeries, 3); + +/** + * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. + * + * @name applyEachSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.applyEach]{@link module:ControlFlow.applyEach} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all + * call with the same arguments + * @param {...*} [args] - any number of separate arguments to pass to the + * function. + * @param {Function} [callback] - the final argument should be the callback, + * called when all functions have completed processing. + * @returns {AsyncFunction} - A function, that when called, is the result of + * appling the `args` to the list of functions. It takes no args, other than + * a callback. + */ +var applyEachSeries = applyEach(mapSeries$1); + +const PROMISE_SYMBOL = Symbol('promiseCallback'); + +function promiseCallback () { + let resolve, reject; + function callback (err, ...args) { + if (err) return reject(err) + resolve(args.length > 1 ? args : args[0]); + } + + callback[PROMISE_SYMBOL] = new Promise((res, rej) => { + resolve = res, + reject = rej; + }); + + return callback +} + +/** + * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on + * their requirements. Each function can optionally depend on other functions + * being completed first, and each function is run as soon as its requirements + * are satisfied. + * + * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence + * will stop. Further tasks will not execute (so any other functions depending + * on it will not run), and the main `callback` is immediately called with the + * error. + * + * {@link AsyncFunction}s also receive an object containing the results of functions which + * have completed so far as the first argument, if they have dependencies. If a + * task function has no dependencies, it will only be passed a callback. + * + * @name auto + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Object} tasks - An object. Each of its properties is either a + * function or an array of requirements, with the {@link AsyncFunction} itself the last item + * in the array. The object's key of a property serves as the name of the task + * defined by that property, i.e. can be used when specifying requirements for + * other tasks. The function receives one or two arguments: + * * a `results` object, containing the results of the previously executed + * functions, only passed if the task has any dependencies, + * * a `callback(err, result)` function, which must be called when finished, + * passing an `error` (which can be `null`) and the result of the function's + * execution. + * @param {number} [concurrency=Infinity] - An optional `integer` for + * determining the maximum number of tasks that can be run in parallel. By + * default, as many as possible. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback. Results are always returned; however, if an + * error occurs, no further `tasks` will be performed, and the results object + * will only contain partial results. Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * @example + * + * //Using Callbacks + * async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }, function(err, results) { + * if (err) { + * console.log('err = ', err); + * } + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }); + * + * //Using Promises + * async.auto({ + * get_data: function(callback) { + * console.log('in get_data'); + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * console.log('in make_folder'); + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }).then(results => { + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * }).catch(err => { + * console.log('err = ', err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.auto({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: ['get_data', 'make_folder', function(results, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(results, callback) { + * // once the file is written let's email a link to it... + * callback(null, {'file':results.write_file, 'email':'user@example.com'}); + * }] + * }); + * console.log('results = ', results); + * // results = { + * // get_data: ['data', 'converted to array'] + * // make_folder; 'folder', + * // write_file: 'filename' + * // email_link: { file: 'filename', email: 'user@example.com' } + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function auto(tasks, concurrency, callback) { + if (typeof concurrency !== 'number') { + // concurrency is optional, shift the args. + callback = concurrency; + concurrency = null; + } + callback = once(callback || promiseCallback()); + var numTasks = Object.keys(tasks).length; + if (!numTasks) { + return callback(null); + } + if (!concurrency) { + concurrency = numTasks; + } + + var results = {}; + var runningTasks = 0; + var canceled = false; + var hasError = false; + + var listeners = Object.create(null); + + var readyTasks = []; + + // for cycle detection: + var readyToCheck = []; // tasks that have been identified as reachable + // without the possibility of returning to an ancestor task + var uncheckedDependencies = {}; + + Object.keys(tasks).forEach(key => { + var task = tasks[key]; + if (!Array.isArray(task)) { + // no dependencies + enqueueTask(key, [task]); + readyToCheck.push(key); + return; + } + + var dependencies = task.slice(0, task.length - 1); + var remainingDependencies = dependencies.length; + if (remainingDependencies === 0) { + enqueueTask(key, task); + readyToCheck.push(key); + return; + } + uncheckedDependencies[key] = remainingDependencies; + + dependencies.forEach(dependencyName => { + if (!tasks[dependencyName]) { + throw new Error('async.auto task `' + key + + '` has a non-existent dependency `' + + dependencyName + '` in ' + + dependencies.join(', ')); + } + addListener(dependencyName, () => { + remainingDependencies--; + if (remainingDependencies === 0) { + enqueueTask(key, task); + } + }); + }); + }); + + checkForDeadlocks(); + processQueue(); + + function enqueueTask(key, task) { + readyTasks.push(() => runTask(key, task)); + } + + function processQueue() { + if (canceled) return + if (readyTasks.length === 0 && runningTasks === 0) { + return callback(null, results); + } + while(readyTasks.length && runningTasks < concurrency) { + var run = readyTasks.shift(); + run(); + } + + } + + function addListener(taskName, fn) { + var taskListeners = listeners[taskName]; + if (!taskListeners) { + taskListeners = listeners[taskName] = []; + } + + taskListeners.push(fn); + } + + function taskComplete(taskName) { + var taskListeners = listeners[taskName] || []; + taskListeners.forEach(fn => fn()); + processQueue(); + } + + + function runTask(key, task) { + if (hasError) return; + + var taskCallback = onlyOnce((err, ...result) => { + runningTasks--; + if (err === false) { + canceled = true; + return + } + if (result.length < 2) { + [result] = result; + } + if (err) { + var safeResults = {}; + Object.keys(results).forEach(rkey => { + safeResults[rkey] = results[rkey]; + }); + safeResults[key] = result; + hasError = true; + listeners = Object.create(null); + if (canceled) return + callback(err, safeResults); + } else { + results[key] = result; + taskComplete(key); + } + }); + + runningTasks++; + var taskFn = wrapAsync(task[task.length - 1]); + if (task.length > 1) { + taskFn(results, taskCallback); + } else { + taskFn(taskCallback); + } + } + + function checkForDeadlocks() { + // Kahn's algorithm + // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm + // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html + var currentTask; + var counter = 0; + while (readyToCheck.length) { + currentTask = readyToCheck.pop(); + counter++; + getDependents(currentTask).forEach(dependent => { + if (--uncheckedDependencies[dependent] === 0) { + readyToCheck.push(dependent); + } + }); + } + + if (counter !== numTasks) { + throw new Error( + 'async.auto cannot execute tasks due to a recursive dependency' + ); + } + } + + function getDependents(taskName) { + var result = []; + Object.keys(tasks).forEach(key => { + const task = tasks[key]; + if (Array.isArray(task) && task.indexOf(taskName) >= 0) { + result.push(key); + } + }); + return result; + } + + return callback[PROMISE_SYMBOL] +} + +var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; +var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; +var FN_ARG_SPLIT = /,/; +var FN_ARG = /(=.+)?(\s*)$/; + +function stripComments(string) { + let stripped = ''; + let index = 0; + let endBlockComment = string.indexOf('*/'); + while (index < string.length) { + if (string[index] === '/' && string[index+1] === '/') { + // inline comment + let endIndex = string.indexOf('\n', index); + index = (endIndex === -1) ? string.length : endIndex; + } else if ((endBlockComment !== -1) && (string[index] === '/') && (string[index+1] === '*')) { + // block comment + let endIndex = string.indexOf('*/', index); + if (endIndex !== -1) { + index = endIndex + 2; + endBlockComment = string.indexOf('*/', index); + } else { + stripped += string[index]; + index++; + } + } else { + stripped += string[index]; + index++; + } + } + return stripped; +} + +function parseParams(func) { + const src = stripComments(func.toString()); + let match = src.match(FN_ARGS); + if (!match) { + match = src.match(ARROW_FN_ARGS); + } + if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src) + let [, args] = match; + return args + .replace(/\s/g, '') + .split(FN_ARG_SPLIT) + .map((arg) => arg.replace(FN_ARG, '').trim()); +} + +/** + * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent + * tasks are specified as parameters to the function, after the usual callback + * parameter, with the parameter names matching the names of the tasks it + * depends on. This can provide even more readable task graphs which can be + * easier to maintain. + * + * If a final callback is specified, the task results are similarly injected, + * specified as named parameters after the initial error parameter. + * + * The autoInject function is purely syntactic sugar and its semantics are + * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. + * + * @name autoInject + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.auto]{@link module:ControlFlow.auto} + * @category Control Flow + * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of + * the form 'func([dependencies...], callback). The object's key of a property + * serves as the name of the task defined by that property, i.e. can be used + * when specifying requirements for other tasks. + * * The `callback` parameter is a `callback(err, result)` which must be called + * when finished, passing an `error` (which can be `null`) and the result of + * the function's execution. The remaining parameters name other tasks on + * which the task is dependent, and the results from those tasks are the + * arguments of those parameters. + * @param {Function} [callback] - An optional callback which is called when all + * the tasks have been completed. It receives the `err` argument if any `tasks` + * pass an error to their callback, and a `results` object with any completed + * task results, similar to `auto`. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // The example from `auto` can be rewritten as follows: + * async.autoInject({ + * get_data: function(callback) { + * // async code to get some data + * callback(null, 'data', 'converted to array'); + * }, + * make_folder: function(callback) { + * // async code to create a directory to store a file in + * // this is run at the same time as getting the data + * callback(null, 'folder'); + * }, + * write_file: function(get_data, make_folder, callback) { + * // once there is some data and the directory exists, + * // write the data to a file in the directory + * callback(null, 'filename'); + * }, + * email_link: function(write_file, callback) { + * // once the file is written let's email a link to it... + * // write_file contains the filename returned by write_file. + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * } + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + * + * // If you are using a JS minifier that mangles parameter names, `autoInject` + * // will not work with plain functions, since the parameter names will be + * // collapsed to a single letter identifier. To work around this, you can + * // explicitly specify the names of the parameters your task function needs + * // in an array, similar to Angular.js dependency injection. + * + * // This still has an advantage over plain `auto`, since the results a task + * // depends on are still spread into arguments. + * async.autoInject({ + * //... + * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { + * callback(null, 'filename'); + * }], + * email_link: ['write_file', function(write_file, callback) { + * callback(null, {'file':write_file, 'email':'user@example.com'}); + * }] + * //... + * }, function(err, results) { + * console.log('err = ', err); + * console.log('email_link = ', results.email_link); + * }); + */ +function autoInject(tasks, callback) { + var newTasks = {}; + + Object.keys(tasks).forEach(key => { + var taskFn = tasks[key]; + var params; + var fnIsAsync = isAsync(taskFn); + var hasNoDeps = + (!fnIsAsync && taskFn.length === 1) || + (fnIsAsync && taskFn.length === 0); + + if (Array.isArray(taskFn)) { + params = [...taskFn]; + taskFn = params.pop(); + + newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); + } else if (hasNoDeps) { + // no dependencies, use the function as-is + newTasks[key] = taskFn; + } else { + params = parseParams(taskFn); + if ((taskFn.length === 0 && !fnIsAsync) && params.length === 0) { + throw new Error("autoInject task functions require explicit parameters."); + } + + // remove callback param + if (!fnIsAsync) params.pop(); + + newTasks[key] = params.concat(newTask); + } + + function newTask(results, taskCb) { + var newArgs = params.map(name => results[name]); + newArgs.push(taskCb); + wrapAsync(taskFn)(...newArgs); + } + }); + + return auto(newTasks, callback); +} + +// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation +// used for queues. This implementation assumes that the node provided by the user can be modified +// to adjust the next and last properties. We implement only the minimal functionality +// for queue support. +class DLL { + constructor() { + this.head = this.tail = null; + this.length = 0; + } + + removeLink(node) { + if (node.prev) node.prev.next = node.next; + else this.head = node.next; + if (node.next) node.next.prev = node.prev; + else this.tail = node.prev; + + node.prev = node.next = null; + this.length -= 1; + return node; + } + + empty () { + while(this.head) this.shift(); + return this; + } + + insertAfter(node, newNode) { + newNode.prev = node; + newNode.next = node.next; + if (node.next) node.next.prev = newNode; + else this.tail = newNode; + node.next = newNode; + this.length += 1; + } + + insertBefore(node, newNode) { + newNode.prev = node.prev; + newNode.next = node; + if (node.prev) node.prev.next = newNode; + else this.head = newNode; + node.prev = newNode; + this.length += 1; + } + + unshift(node) { + if (this.head) this.insertBefore(this.head, node); + else setInitial(this, node); + } + + push(node) { + if (this.tail) this.insertAfter(this.tail, node); + else setInitial(this, node); + } + + shift() { + return this.head && this.removeLink(this.head); + } + + pop() { + return this.tail && this.removeLink(this.tail); + } + + toArray() { + return [...this] + } + + *[Symbol.iterator] () { + var cur = this.head; + while (cur) { + yield cur.data; + cur = cur.next; + } + } + + remove (testFn) { + var curr = this.head; + while(curr) { + var {next} = curr; + if (testFn(curr)) { + this.removeLink(curr); + } + curr = next; + } + return this; + } +} + +function setInitial(dll, node) { + dll.length = 1; + dll.head = dll.tail = node; +} + +function queue(worker, concurrency, payload) { + if (concurrency == null) { + concurrency = 1; + } + else if(concurrency === 0) { + throw new RangeError('Concurrency must not be zero'); + } + + var _worker = wrapAsync(worker); + var numRunning = 0; + var workersList = []; + const events = { + error: [], + drain: [], + saturated: [], + unsaturated: [], + empty: [] + }; + + function on (event, handler) { + events[event].push(handler); + } + + function once (event, handler) { + const handleAndRemove = (...args) => { + off(event, handleAndRemove); + handler(...args); + }; + events[event].push(handleAndRemove); + } + + function off (event, handler) { + if (!event) return Object.keys(events).forEach(ev => events[ev] = []) + if (!handler) return events[event] = [] + events[event] = events[event].filter(ev => ev !== handler); + } + + function trigger (event, ...args) { + events[event].forEach(handler => handler(...args)); + } + + var processingScheduled = false; + function _insert(data, insertAtFront, rejectOnError, callback) { + if (callback != null && typeof callback !== 'function') { + throw new Error('task callback must be a function'); + } + q.started = true; + + var res, rej; + function promiseCallback (err, ...args) { + // we don't care about the error, let the global error handler + // deal with it + if (err) return rejectOnError ? rej(err) : res() + if (args.length <= 1) return res(args[0]) + res(args); + } + + var item = q._createTaskItem( + data, + rejectOnError ? promiseCallback : + (callback || promiseCallback) + ); + + if (insertAtFront) { + q._tasks.unshift(item); + } else { + q._tasks.push(item); + } + + if (!processingScheduled) { + processingScheduled = true; + setImmediate$1(() => { + processingScheduled = false; + q.process(); + }); + } + + if (rejectOnError || !callback) { + return new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }) + } + } + + function _createCB(tasks) { + return function (err, ...args) { + numRunning -= 1; + + for (var i = 0, l = tasks.length; i < l; i++) { + var task = tasks[i]; + + var index = workersList.indexOf(task); + if (index === 0) { + workersList.shift(); + } else if (index > 0) { + workersList.splice(index, 1); + } + + task.callback(err, ...args); + + if (err != null) { + trigger('error', err, task.data); + } + } + + if (numRunning <= (q.concurrency - q.buffer) ) { + trigger('unsaturated'); + } + + if (q.idle()) { + trigger('drain'); + } + q.process(); + }; + } + + function _maybeDrain(data) { + if (data.length === 0 && q.idle()) { + // call drain immediately if there are no tasks + setImmediate$1(() => trigger('drain')); + return true + } + return false + } + + const eventMethod = (name) => (handler) => { + if (!handler) { + return new Promise((resolve, reject) => { + once(name, (err, data) => { + if (err) return reject(err) + resolve(data); + }); + }) + } + off(name); + on(name, handler); + + }; + + var isProcessing = false; + var q = { + _tasks: new DLL(), + _createTaskItem (data, callback) { + return { + data, + callback + }; + }, + *[Symbol.iterator] () { + yield* q._tasks[Symbol.iterator](); + }, + concurrency, + payload, + buffer: concurrency / 4, + started: false, + paused: false, + push (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, false, false, callback)) + } + return _insert(data, false, false, callback); + }, + pushAsync (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, false, true, callback)) + } + return _insert(data, false, true, callback); + }, + kill () { + off(); + q._tasks.empty(); + }, + unshift (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, true, false, callback)) + } + return _insert(data, true, false, callback); + }, + unshiftAsync (data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return + return data.map(datum => _insert(datum, true, true, callback)) + } + return _insert(data, true, true, callback); + }, + remove (testFn) { + q._tasks.remove(testFn); + }, + process () { + // Avoid trying to start too many processing operations. This can occur + // when callbacks resolve synchronously (#1267). + if (isProcessing) { + return; + } + isProcessing = true; + while(!q.paused && numRunning < q.concurrency && q._tasks.length){ + var tasks = [], data = []; + var l = q._tasks.length; + if (q.payload) l = Math.min(l, q.payload); + for (var i = 0; i < l; i++) { + var node = q._tasks.shift(); + tasks.push(node); + workersList.push(node); + data.push(node.data); + } + + numRunning += 1; + + if (q._tasks.length === 0) { + trigger('empty'); + } + + if (numRunning === q.concurrency) { + trigger('saturated'); + } + + var cb = onlyOnce(_createCB(tasks)); + _worker(data, cb); + } + isProcessing = false; + }, + length () { + return q._tasks.length; + }, + running () { + return numRunning; + }, + workersList () { + return workersList; + }, + idle() { + return q._tasks.length + numRunning === 0; + }, + pause () { + q.paused = true; + }, + resume () { + if (q.paused === false) { return; } + q.paused = false; + setImmediate$1(q.process); + } + }; + // define these as fixed properties, so people get useful errors when updating + Object.defineProperties(q, { + saturated: { + writable: false, + value: eventMethod('saturated') + }, + unsaturated: { + writable: false, + value: eventMethod('unsaturated') + }, + empty: { + writable: false, + value: eventMethod('empty') + }, + drain: { + writable: false, + value: eventMethod('drain') + }, + error: { + writable: false, + value: eventMethod('error') + }, + }); + return q; +} + +/** + * Creates a `cargo` object with the specified payload. Tasks added to the + * cargo will be processed altogether (up to the `payload` limit). If the + * `worker` is in progress, the task is queued until it becomes available. Once + * the `worker` has completed some tasks, each callback of those tasks is + * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) + * for how `cargo` and `queue` work. + * + * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers + * at a time, cargo passes an array of tasks to a single worker, repeating + * when the worker is finished. + * + * @name cargo + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An asynchronous function for processing an array + * of queued tasks. Invoked with `(tasks, callback)`. + * @param {number} [payload=Infinity] - An optional `integer` for determining + * how many tasks should be processed per round; if omitted, the default is + * unlimited. + * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can + * attached as certain properties to listen for specific events during the + * lifecycle of the cargo and inner queue. + * @example + * + * // create a cargo object with payload 2 + * var cargo = async.cargo(function(tasks, callback) { + * for (var i=0; i { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.reduce(fileList, 0, getFileSizeInBytes); + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function reduce(coll, memo, iteratee, callback) { + callback = once(callback); + var _iteratee = wrapAsync(iteratee); + return eachOfSeries$1(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, err => callback(err, memo)); +} +var reduce$1 = awaitify(reduce, 4); + +/** + * Version of the compose function that is more natural to read. Each function + * consumes the return value of the previous function. It is the equivalent of + * [compose]{@link module:ControlFlow.compose} with the arguments reversed. + * + * Each function is executed with the `this` binding of the composed function. + * + * @name seq + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.compose]{@link module:ControlFlow.compose} + * @category Control Flow + * @param {...AsyncFunction} functions - the asynchronous functions to compose + * @returns {Function} a function that composes the `functions` in order + * @example + * + * // Requires lodash (or underscore), express3 and dresende's orm2. + * // Part of an app, that fetches cats of the logged user. + * // This example uses `seq` function to avoid overnesting and error + * // handling clutter. + * app.get('/cats', function(request, response) { + * var User = request.models.User; + * async.seq( + * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) + * function(user, fn) { + * user.getCats(fn); // 'getCats' has signature (callback(err, data)) + * } + * )(req.session.user_id, function (err, cats) { + * if (err) { + * console.error(err); + * response.json({ status: 'error', message: err.message }); + * } else { + * response.json({ status: 'ok', message: 'Cats found', data: cats }); + * } + * }); + * }); + */ +function seq(...functions) { + var _functions = functions.map(wrapAsync); + return function (...args) { + var that = this; + + var cb = args[args.length - 1]; + if (typeof cb == 'function') { + args.pop(); + } else { + cb = promiseCallback(); + } + + reduce$1(_functions, args, (newargs, fn, iterCb) => { + fn.apply(that, newargs.concat((err, ...nextargs) => { + iterCb(err, nextargs); + })); + }, + (err, results) => cb(err, ...results)); + + return cb[PROMISE_SYMBOL] + }; +} + +/** + * Creates a function which is a composition of the passed asynchronous + * functions. Each function consumes the return value of the function that + * follows. Composing functions `f()`, `g()`, and `h()` would produce the result + * of `f(g(h()))`, only this version uses callbacks to obtain the return values. + * + * If the last argument to the composed function is not a function, a promise + * is returned when you call it. + * + * Each function is executed with the `this` binding of the composed function. + * + * @name compose + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {...AsyncFunction} functions - the asynchronous functions to compose + * @returns {Function} an asynchronous function that is the composed + * asynchronous `functions` + * @example + * + * function add1(n, callback) { + * setTimeout(function () { + * callback(null, n + 1); + * }, 10); + * } + * + * function mul3(n, callback) { + * setTimeout(function () { + * callback(null, n * 3); + * }, 10); + * } + * + * var add1mul3 = async.compose(mul3, add1); + * add1mul3(4, function (err, result) { + * // result now equals 15 + * }); + */ +function compose(...args) { + return seq(...args.reverse()); +} + +/** + * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. + * + * @name mapLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function mapLimit (coll, limit, iteratee, callback) { + return _asyncMap(eachOfLimit(limit), coll, iteratee, callback) +} +var mapLimit$1 = awaitify(mapLimit, 4); + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. + * + * @name concatLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapLimit + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val, iterCb) => { + _iteratee(val, (err, ...args) => { + if (err) return iterCb(err); + return iterCb(err, args); + }); + }, (err, mapResults) => { + var result = []; + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + result = result.concat(...mapResults[i]); + } + } + + return callback(err, result); + }); +} +var concatLimit$1 = awaitify(concatLimit, 4); + +/** + * Applies `iteratee` to each item in `coll`, concatenating the results. Returns + * the concatenated list. The `iteratee`s are called in parallel, and the + * results are concatenated as they return. The results array will be returned in + * the original order of `coll` passed to the `iteratee` function. + * + * @name concat + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @alias flatMap + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * let directoryList = ['dir1','dir2','dir3']; + * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; + * + * // Using callbacks + * async.concat(directoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.concat(directoryList, fs.readdir) + * .then(results => { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir) + * .then(results => { + * console.log(results); + * }).catch(err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.concat(directoryList, fs.readdir); + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.concat(withMissingDirectoryList, fs.readdir); + * console.log(results); + * } catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } + * } + * + */ +function concat(coll, iteratee, callback) { + return concatLimit$1(coll, Infinity, iteratee, callback) +} +var concat$1 = awaitify(concat, 3); + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. + * + * @name concatSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapSeries + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. + * The iteratee should complete with an array an array of results. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatSeries(coll, iteratee, callback) { + return concatLimit$1(coll, 1, iteratee, callback) +} +var concatSeries$1 = awaitify(concatSeries, 3); + +/** + * Returns a function that when called, calls-back with the values provided. + * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to + * [`auto`]{@link module:ControlFlow.auto}. + * + * @name constant + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {...*} arguments... - Any number of arguments to automatically invoke + * callback with. + * @returns {AsyncFunction} Returns a function that when invoked, automatically + * invokes the callback with the previous given arguments. + * @example + * + * async.waterfall([ + * async.constant(42), + * function (value, next) { + * // value === 42 + * }, + * //... + * ], callback); + * + * async.waterfall([ + * async.constant(filename, "utf8"), + * fs.readFile, + * function (fileData, next) { + * //... + * } + * //... + * ], callback); + * + * async.auto({ + * hostname: async.constant("https://server.net/"), + * port: findFreePort, + * launchServer: ["hostname", "port", function (options, cb) { + * startServer(options, cb); + * }], + * //... + * }, callback); + */ +function constant(...args) { + return function (...ignoredArgs/*, callback*/) { + var callback = ignoredArgs.pop(); + return callback(null, ...args); + }; +} + +function _createTester(check, getResult) { + return (eachfn, arr, _iteratee, cb) => { + var testPassed = false; + var testResult; + const iteratee = wrapAsync(_iteratee); + eachfn(arr, (value, _, callback) => { + iteratee(value, (err, result) => { + if (err || err === false) return callback(err); + + if (check(result) && !testResult) { + testPassed = true; + testResult = getResult(true, value); + return callback(null, breakLoop); + } + callback(); + }); + }, err => { + if (err) return cb(err); + cb(null, testPassed ? testResult : getResult(false)); + }); + }; +} + +/** + * Returns the first value in `coll` that passes an async truth test. The + * `iteratee` is applied in parallel, meaning the first iteratee to return + * `true` will fire the detect `callback` with that result. That means the + * result might not be the first item in the original `coll` (in terms of order) + * that passes the test. + + * If order within the original `coll` is important, then look at + * [`detectSeries`]{@link module:Collections.detectSeries}. + * + * @name detect + * @static + * @memberOf module:Collections + * @method + * @alias find + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * } + *); + * + * // Using Promises + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) + * .then(result => { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); + * console.log(result); + * // dir1/file1.txt + * // result now equals the file in the list that exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function detect(coll, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback) +} +var detect$1 = awaitify(detect, 3); + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a + * time. + * + * @name detectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findLimit + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectLimit(coll, limit, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOfLimit(limit), coll, iteratee, callback) +} +var detectLimit$1 = awaitify(detectLimit, 4); + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. + * + * @name detectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findSeries + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectSeries(coll, iteratee, callback) { + return _createTester(bool => bool, (res, item) => item)(eachOfLimit(1), coll, iteratee, callback) +} + +var detectSeries$1 = awaitify(detectSeries, 3); + +function consoleFunc(name) { + return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => { + /* istanbul ignore else */ + if (typeof console === 'object') { + /* istanbul ignore else */ + if (err) { + /* istanbul ignore else */ + if (console.error) { + console.error(err); + } + } else if (console[name]) { /* istanbul ignore else */ + resultArgs.forEach(x => console[name](x)); + } + } + }) +} + +/** + * Logs the result of an [`async` function]{@link AsyncFunction} to the + * `console` using `console.dir` to display the properties of the resulting object. + * Only works in Node.js or in browsers that support `console.dir` and + * `console.error` (such as FF and Chrome). + * If multiple arguments are returned from the async function, + * `console.dir` is called on each argument in order. + * + * @name dir + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, {hello: name}); + * }, 1000); + * }; + * + * // in the node repl + * node> async.dir(hello, 'world'); + * {hello: 'world'} + */ +var dir = consoleFunc('dir'); + +/** + * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in + * the order of operations, the arguments `test` and `iteratee` are switched. + * + * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. + * + * @name doWhilst + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - A function which is called each time `test` + * passes. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee`. + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. + * `callback` will be passed an error and any arguments passed to the final + * `iteratee`'s callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ +function doWhilst(iteratee, test, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results; + + function next(err, ...args) { + if (err) return callback(err); + if (err === false) return; + results = args; + _test(...args, check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return check(null, true); +} + +var doWhilst$1 = awaitify(doWhilst, 3); + +/** + * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the + * argument ordering differs from `until`. + * + * @name doUntil + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee` + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ +function doUntil(iteratee, test, callback) { + const _test = wrapAsync(test); + return doWhilst$1(iteratee, (...args) => { + const cb = args.pop(); + _test(...args, (err, truth) => cb (err, !truth)); + }, callback); +} + +function _withoutIndex(iteratee) { + return (value, index, callback) => iteratee(value, callback); +} + +/** + * Applies the function `iteratee` to each item in `coll`, in parallel. + * The `iteratee` is called with an item from the list, and a callback for when + * it has finished. If the `iteratee` passes an error to its `callback`, the + * main `callback` (for the `each` function) is immediately called with the + * error. + * + * Note, that since this function applies `iteratee` to each item in parallel, + * there is no guarantee that the iteratee functions will complete in order. + * + * @name each + * @static + * @memberOf module:Collections + * @method + * @alias forEach + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to + * each item in `coll`. Invoked with (item, callback). + * The array index is not passed to the iteratee. + * If you need the index, use `eachOf`. + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; + * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; + * + * // asynchronous function that deletes a file + * const deleteFile = function(file, callback) { + * fs.unlink(file, callback); + * }; + * + * // Using callbacks + * async.each(fileList, deleteFile, function(err) { + * if( err ) { + * console.log(err); + * } else { + * console.log('All files have been deleted successfully'); + * } + * }); + * + * // Error Handling + * async.each(withMissingFileList, deleteFile, function(err){ + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using Promises + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using async/await + * async () => { + * try { + * await async.each(files, deleteFile); + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * await async.each(withMissingFileList, deleteFile); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * } + * } + * + */ +function eachLimit(coll, iteratee, callback) { + return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); +} + +var each = awaitify(eachLimit, 3); + +/** + * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. + * + * @name eachLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfLimit`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachLimit$1(coll, limit, iteratee, callback) { + return eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); +} +var eachLimit$2 = awaitify(eachLimit$1, 4); + +/** + * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. + * + * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item + * in series and therefore the iteratee functions will complete in order. + + * @name eachSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfSeries`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachSeries(coll, iteratee, callback) { + return eachLimit$2(coll, 1, iteratee, callback) +} +var eachSeries$1 = awaitify(eachSeries, 3); + +/** + * Wrap an async function and ensure it calls its callback on a later tick of + * the event loop. If the function already calls its callback on a next tick, + * no extra deferral is added. This is useful for preventing stack overflows + * (`RangeError: Maximum call stack size exceeded`) and generally keeping + * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) + * contained. ES2017 `async` functions are returned as-is -- they are immune + * to Zalgo's corrupting influences, as they always resolve on a later tick. + * + * @name ensureAsync + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - an async function, one that expects a node-style + * callback as its last argument. + * @returns {AsyncFunction} Returns a wrapped function with the exact same call + * signature as the function passed in. + * @example + * + * function sometimesAsync(arg, callback) { + * if (cache[arg]) { + * return callback(null, cache[arg]); // this would be synchronous!! + * } else { + * doSomeIO(arg, callback); // this IO would be asynchronous + * } + * } + * + * // this has a risk of stack overflows if many results are cached in a row + * async.mapSeries(args, sometimesAsync, done); + * + * // this will defer sometimesAsync's callback if necessary, + * // preventing stack overflows + * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); + */ +function ensureAsync(fn) { + if (isAsync(fn)) return fn; + return function (...args/*, callback*/) { + var callback = args.pop(); + var sync = true; + args.push((...innerArgs) => { + if (sync) { + setImmediate$1(() => callback(...innerArgs)); + } else { + callback(...innerArgs); + } + }); + fn.apply(this, args); + sync = false; + }; +} + +/** + * Returns `true` if every element in `coll` satisfies an async test. If any + * iteratee call returns `false`, the main `callback` is immediately called. + * + * @name every + * @static + * @memberOf module:Collections + * @method + * @alias all + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.every(fileList, fileExists, function(err, result) { + * console.log(result); + * // true + * // result is true since every file exists + * }); + * + * async.every(withMissingFileList, fileExists, function(err, result) { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }); + * + * // Using Promises + * async.every(fileList, fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.every(withMissingFileList, fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.every(fileList, fileExists); + * console.log(result); + * // true + * // result is true since every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.every(withMissingFileList, fileExists); + * console.log(result); + * // false + * // result is false since NOT every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function every(coll, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOf$1, coll, iteratee, callback) +} +var every$1 = awaitify(every, 3); + +/** + * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. + * + * @name everyLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everyLimit(coll, limit, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOfLimit(limit), coll, iteratee, callback) +} +var everyLimit$1 = awaitify(everyLimit, 4); + +/** + * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. + * + * @name everySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in series. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everySeries(coll, iteratee, callback) { + return _createTester(bool => !bool, res => !res)(eachOfSeries$1, coll, iteratee, callback) +} +var everySeries$1 = awaitify(everySeries, 3); + +function filterArray(eachfn, arr, iteratee, callback) { + var truthValues = new Array(arr.length); + eachfn(arr, (x, index, iterCb) => { + iteratee(x, (err, v) => { + truthValues[index] = !!v; + iterCb(err); + }); + }, err => { + if (err) return callback(err); + var results = []; + for (var i = 0; i < arr.length; i++) { + if (truthValues[i]) results.push(arr[i]); + } + callback(null, results); + }); +} + +function filterGeneric(eachfn, coll, iteratee, callback) { + var results = []; + eachfn(coll, (x, index, iterCb) => { + iteratee(x, (err, v) => { + if (err) return iterCb(err); + if (v) { + results.push({index, value: x}); + } + iterCb(err); + }); + }, err => { + if (err) return callback(err); + callback(null, results + .sort((a, b) => a.index - b.index) + .map(v => v.value)); + }); +} + +function _filter(eachfn, coll, iteratee, callback) { + var filter = isArrayLike(coll) ? filterArray : filterGeneric; + return filter(eachfn, coll, wrapAsync(iteratee), callback); +} + +/** + * Returns a new array of all the values in `coll` which pass an async truth + * test. This operation is performed in parallel, but the results array will be + * in the same order as the original. + * + * @name filter + * @static + * @memberOf module:Collections + * @method + * @alias select + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.filter(files, fileExists, function(err, results) { + * if(err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * }); + * + * // Using Promises + * async.filter(files, fileExists) + * .then(results => { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.filter(files, fileExists); + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function filter (coll, iteratee, callback) { + return _filter(eachOf$1, coll, iteratee, callback) +} +var filter$1 = awaitify(filter, 3); + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a + * time. + * + * @name filterLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + */ +function filterLimit (coll, limit, iteratee, callback) { + return _filter(eachOfLimit(limit), coll, iteratee, callback) +} +var filterLimit$1 = awaitify(filterLimit, 4); + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. + * + * @name filterSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results) + * @returns {Promise} a promise, if no callback provided + */ +function filterSeries (coll, iteratee, callback) { + return _filter(eachOfSeries$1, coll, iteratee, callback) +} +var filterSeries$1 = awaitify(filterSeries, 3); + +/** + * Calls the asynchronous function `fn` with a callback parameter that allows it + * to call itself again, in series, indefinitely. + + * If an error is passed to the callback then `errback` is called with the + * error, and execution stops, otherwise it will never be called. + * + * @name forever + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} fn - an async function to call repeatedly. + * Invoked with (next). + * @param {Function} [errback] - when `fn` passes an error to it's callback, + * this function will be called, and execution stops. Invoked with (err). + * @returns {Promise} a promise that rejects if an error occurs and an errback + * is not passed + * @example + * + * async.forever( + * function(next) { + * // next is suitable for passing to things that need a callback(err [, whatever]); + * // it will result in this function being called again. + * }, + * function(err) { + * // if next is called with a value in its first parameter, it will appear + * // in here as 'err', and execution will stop. + * } + * ); + */ +function forever(fn, errback) { + var done = onlyOnce(errback); + var task = wrapAsync(ensureAsync(fn)); + + function next(err) { + if (err) return done(err); + if (err === false) return; + task(next); + } + return next(); +} +var forever$1 = awaitify(forever, 2); + +/** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. + * + * @name groupByLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ +function groupByLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val, iterCb) => { + _iteratee(val, (err, key) => { + if (err) return iterCb(err); + return iterCb(err, {key, val}); + }); + }, (err, mapResults) => { + var result = {}; + // from MDN, handle object having an `hasOwnProperty` prop + var {hasOwnProperty} = Object.prototype; + + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + var {key} = mapResults[i]; + var {val} = mapResults[i]; + + if (hasOwnProperty.call(result, key)) { + result[key].push(val); + } else { + result[key] = [val]; + } + } + } + + return callback(err, result); + }); +} + +var groupByLimit$1 = awaitify(groupByLimit, 4); + +/** + * Returns a new object, where each value corresponds to an array of items, from + * `coll`, that returned the corresponding key. That is, the keys of the object + * correspond to the values passed to the `iteratee` callback. + * + * Note: Since this function applies the `iteratee` to each item in parallel, + * there is no guarantee that the `iteratee` functions will complete in order. + * However, the values for each key in the `result` will be in the same order as + * the original `coll`. For Objects, the values will roughly be in the order of + * the original Objects' keys (but this can vary across JavaScript engines). + * + * @name groupBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const files = ['dir1/file1.txt','dir2','dir4'] + * + * // asynchronous function that detects file type as none, file, or directory + * function detectFile(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(null, 'none'); + * } + * callback(null, stat.isDirectory() ? 'directory' : 'file'); + * }); + * } + * + * //Using callbacks + * async.groupBy(files, detectFile, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * }); + * + * // Using Promises + * async.groupBy(files, detectFile) + * .then( result => { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.groupBy(files, detectFile); + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function groupBy (coll, iteratee, callback) { + return groupByLimit$1(coll, Infinity, iteratee, callback) +} + +/** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. + * + * @name groupBySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whose + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ +function groupBySeries (coll, iteratee, callback) { + return groupByLimit$1(coll, 1, iteratee, callback) +} + +/** + * Logs the result of an `async` function to the `console`. Only works in + * Node.js or in browsers that support `console.log` and `console.error` (such + * as FF and Chrome). If multiple arguments are returned from the async + * function, `console.log` is called on each argument in order. + * + * @name log + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, 'hello ' + name); + * }, 1000); + * }; + * + * // in the node repl + * node> async.log(hello, 'world'); + * 'hello world' + */ +var log = consoleFunc('log'); + +/** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a + * time. + * + * @name mapValuesLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function mapValuesLimit(obj, limit, iteratee, callback) { + callback = once(callback); + var newObj = {}; + var _iteratee = wrapAsync(iteratee); + return eachOfLimit(limit)(obj, (val, key, next) => { + _iteratee(val, key, (err, result) => { + if (err) return next(err); + newObj[key] = result; + next(err); + }); + }, err => callback(err, newObj)); +} + +var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); + +/** + * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. + * + * Produces a new Object by mapping each value of `obj` through the `iteratee` + * function. The `iteratee` is called each `value` and `key` from `obj` and a + * callback for when it has finished processing. Each of these callbacks takes + * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` + * passes an error to its callback, the main `callback` (for the `mapValues` + * function) is immediately called with the error. + * + * Note, the order of the keys in the result is not guaranteed. The keys will + * be roughly in the order they complete, (but this is very engine-specific) + * + * @name mapValues + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file3.txt' + * }; + * + * const withMissingFileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file4.txt' + * }; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, key, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * }); + * + * // Error handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.mapValues(fileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * }).catch (err => { + * console.log(err); + * }); + * + * // Error Handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch (err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.mapValues(fileMap, getFileSizeInBytes); + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function mapValues(obj, iteratee, callback) { + return mapValuesLimit$1(obj, Infinity, iteratee, callback) +} + +/** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. + * + * @name mapValuesSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function mapValuesSeries(obj, iteratee, callback) { + return mapValuesLimit$1(obj, 1, iteratee, callback) +} + +/** + * Caches the results of an async function. When creating a hash to store + * function results against, the callback is omitted from the hash and an + * optional hash function can be used. + * + * **Note: if the async function errs, the result will not be cached and + * subsequent calls will call the wrapped function.** + * + * If no hash function is specified, the first argument is used as a hash key, + * which may work reasonably if it is a string or a data type that converts to a + * distinct string. Note that objects and arrays will not behave reasonably. + * Neither will cases where the other arguments are significant. In such cases, + * specify your own hash function. + * + * The cache of results is exposed as the `memo` property of the function + * returned by `memoize`. + * + * @name memoize + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function to proxy and cache results from. + * @param {Function} hasher - An optional function for generating a custom hash + * for storing results. It has all the arguments applied to it apart from the + * callback, and must be synchronous. + * @returns {AsyncFunction} a memoized version of `fn` + * @example + * + * var slow_fn = function(name, callback) { + * // do something + * callback(null, result); + * }; + * var fn = async.memoize(slow_fn); + * + * // fn can now be used as if it were slow_fn + * fn('some name', function() { + * // callback + * }); + */ +function memoize(fn, hasher = v => v) { + var memo = Object.create(null); + var queues = Object.create(null); + var _fn = wrapAsync(fn); + var memoized = initialParams((args, callback) => { + var key = hasher(...args); + if (key in memo) { + setImmediate$1(() => callback(null, ...memo[key])); + } else if (key in queues) { + queues[key].push(callback); + } else { + queues[key] = [callback]; + _fn(...args, (err, ...resultArgs) => { + // #1465 don't memoize if an error occurred + if (!err) { + memo[key] = resultArgs; + } + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i](err, ...resultArgs); + } + }); + } + }); + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; +} + +/* istanbul ignore file */ + +/** + * Calls `callback` on a later loop around the event loop. In Node.js this just + * calls `process.nextTick`. In the browser it will use `setImmediate` if + * available, otherwise `setTimeout(callback, 0)`, which means other higher + * priority events may precede the execution of `callback`. + * + * This is used internally for browser-compatibility purposes. + * + * @name nextTick + * @static + * @memberOf module:Utils + * @method + * @see [async.setImmediate]{@link module:Utils.setImmediate} + * @category Util + * @param {Function} callback - The function to call on a later loop around + * the event loop. Invoked with (args...). + * @param {...*} args... - any number of additional arguments to pass to the + * callback on the next tick. + * @example + * + * var call_order = []; + * async.nextTick(function() { + * call_order.push('two'); + * // call_order now equals ['one','two'] + * }); + * call_order.push('one'); + * + * async.setImmediate(function (a, b, c) { + * // a, b, and c equal 1, 2, and 3 + * }, 1, 2, 3); + */ +var _defer$1; + +if (hasNextTick) { + _defer$1 = process.nextTick; +} else if (hasSetImmediate) { + _defer$1 = setImmediate; +} else { + _defer$1 = fallback; +} + +var nextTick = wrap(_defer$1); + +var parallel = awaitify((eachfn, tasks, callback) => { + var results = isArrayLike(tasks) ? [] : {}; + + eachfn(tasks, (task, key, taskCb) => { + wrapAsync(task)((err, ...result) => { + if (result.length < 2) { + [result] = result; + } + results[key] = result; + taskCb(err); + }); + }, err => callback(err, results)); +}, 3); + +/** + * Run the `tasks` collection of functions in parallel, without waiting until + * the previous function has completed. If any of the functions pass an error to + * its callback, the main `callback` is immediately called with the value of the + * error. Once the `tasks` have completed, the results are passed to the final + * `callback` as an array. + * + * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about + * parallel execution of code. If your tasks do not use any timers or perform + * any I/O, they will actually be executed in series. Any synchronous setup + * sections for each task will happen one after the other. JavaScript remains + * single-threaded. + * + * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the + * execution of other tasks when a task fails. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.parallel}. + * + * @name parallel + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * + * //Using Callbacks + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function parallel$1(tasks, callback) { + return parallel(eachOf$1, tasks, callback); +} + +/** + * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a + * time. + * + * @name parallelLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.parallel]{@link module:ControlFlow.parallel} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + */ +function parallelLimit(tasks, limit, callback) { + return parallel(eachOfLimit(limit), tasks, callback); +} + +/** + * A queue of tasks for the worker function to complete. + * @typedef {Iterable} QueueObject + * @memberOf module:ControlFlow + * @property {Function} length - a function returning the number of items + * waiting to be processed. Invoke with `queue.length()`. + * @property {boolean} started - a boolean indicating whether or not any + * items have been pushed and processed by the queue. + * @property {Function} running - a function returning the number of items + * currently being processed. Invoke with `queue.running()`. + * @property {Function} workersList - a function returning the array of items + * currently being processed. Invoke with `queue.workersList()`. + * @property {Function} idle - a function returning false if there are items + * waiting or being processed, or true if not. Invoke with `queue.idle()`. + * @property {number} concurrency - an integer for determining how many `worker` + * functions should be run in parallel. This property can be changed after a + * `queue` is created to alter the concurrency on-the-fly. + * @property {number} payload - an integer that specifies how many items are + * passed to the worker function at a time. only applies if this is a + * [cargo]{@link module:ControlFlow.cargo} object + * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` + * once the `worker` has finished processing the task. Instead of a single task, + * a `tasks` array can be submitted. The respective callback is used for every + * task in the list. Invoke with `queue.push(task, [callback])`, + * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. + * Invoke with `queue.unshift(task, [callback])`. + * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns + * a promise that rejects if an error occurs. + * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns + * a promise that rejects if an error occurs. + * @property {Function} remove - remove items from the queue that match a test + * function. The test function will be passed an object with a `data` property, + * and a `priority` property, if this is a + * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. + * Invoked with `queue.remove(testFn)`, where `testFn` is of the form + * `function ({data, priority}) {}` and returns a Boolean. + * @property {Function} saturated - a function that sets a callback that is + * called when the number of running workers hits the `concurrency` limit, and + * further tasks will be queued. If the callback is omitted, `q.saturated()` + * returns a promise for the next occurrence. + * @property {Function} unsaturated - a function that sets a callback that is + * called when the number of running workers is less than the `concurrency` & + * `buffer` limits, and further tasks will not be queued. If the callback is + * omitted, `q.unsaturated()` returns a promise for the next occurrence. + * @property {number} buffer - A minimum threshold buffer in order to say that + * the `queue` is `unsaturated`. + * @property {Function} empty - a function that sets a callback that is called + * when the last item from the `queue` is given to a `worker`. If the callback + * is omitted, `q.empty()` returns a promise for the next occurrence. + * @property {Function} drain - a function that sets a callback that is called + * when the last item from the `queue` has returned from the `worker`. If the + * callback is omitted, `q.drain()` returns a promise for the next occurrence. + * @property {Function} error - a function that sets a callback that is called + * when a task errors. Has the signature `function(error, task)`. If the + * callback is omitted, `error()` returns a promise that rejects on the next + * error. + * @property {boolean} paused - a boolean for determining whether the queue is + * in a paused state. + * @property {Function} pause - a function that pauses the processing of tasks + * until `resume()` is called. Invoke with `queue.pause()`. + * @property {Function} resume - a function that resumes the processing of + * queued tasks when the queue is paused. Invoke with `queue.resume()`. + * @property {Function} kill - a function that removes the `drain` callback and + * empties remaining tasks from the queue forcing it to go idle. No more tasks + * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. + * + * @example + * const q = async.queue(worker, 2) + * q.push(item1) + * q.push(item2) + * q.push(item3) + * // queues are iterable, spread into an array to inspect + * const items = [...q] // [item1, item2, item3] + * // or use for of + * for (let item of q) { + * console.log(item) + * } + * + * q.drain(() => { + * console.log('all done') + * }) + * // or + * await q.drain() + */ + +/** + * Creates a `queue` object with the specified `concurrency`. Tasks added to the + * `queue` are processed in parallel (up to the `concurrency` limit). If all + * `worker`s are in progress, the task is queued until one becomes available. + * Once a `worker` completes a `task`, that `task`'s callback is called. + * + * @name queue + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. Invoked with (task, callback). + * @param {number} [concurrency=1] - An `integer` for determining how many + * `worker` functions should be run in parallel. If omitted, the concurrency + * defaults to `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be + * attached as certain properties to listen for specific events during the + * lifecycle of the queue. + * @example + * + * // create a queue object with concurrency 2 + * var q = async.queue(function(task, callback) { + * console.log('hello ' + task.name); + * callback(); + * }, 2); + * + * // assign a callback + * q.drain(function() { + * console.log('all items have been processed'); + * }); + * // or await the end + * await q.drain() + * + * // assign an error callback + * q.error(function(err, task) { + * console.error('task experienced an error'); + * }); + * + * // add some items to the queue + * q.push({name: 'foo'}, function(err) { + * console.log('finished processing foo'); + * }); + * // callback is optional + * q.push({name: 'bar'}); + * + * // add some items to the queue (batch-wise) + * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { + * console.log('finished processing item'); + * }); + * + * // add some items to the front of the queue + * q.unshift({name: 'bar'}, function (err) { + * console.log('finished processing bar'); + * }); + */ +function queue$1 (worker, concurrency) { + var _worker = wrapAsync(worker); + return queue((items, cb) => { + _worker(items[0], cb); + }, concurrency, 1); +} + +// Binary min-heap implementation used for priority queue. +// Implementation is stable, i.e. push time is considered for equal priorities +class Heap { + constructor() { + this.heap = []; + this.pushCount = Number.MIN_SAFE_INTEGER; + } + + get length() { + return this.heap.length; + } + + empty () { + this.heap = []; + return this; + } + + percUp(index) { + let p; + + while (index > 0 && smaller(this.heap[index], this.heap[p=parent(index)])) { + let t = this.heap[index]; + this.heap[index] = this.heap[p]; + this.heap[p] = t; + + index = p; + } + } + + percDown(index) { + let l; + + while ((l=leftChi(index)) < this.heap.length) { + if (l+1 < this.heap.length && smaller(this.heap[l+1], this.heap[l])) { + l = l+1; + } + + if (smaller(this.heap[index], this.heap[l])) { + break; + } + + let t = this.heap[index]; + this.heap[index] = this.heap[l]; + this.heap[l] = t; + + index = l; + } + } + + push(node) { + node.pushCount = ++this.pushCount; + this.heap.push(node); + this.percUp(this.heap.length-1); + } + + unshift(node) { + return this.heap.push(node); + } + + shift() { + let [top] = this.heap; + + this.heap[0] = this.heap[this.heap.length-1]; + this.heap.pop(); + this.percDown(0); + + return top; + } + + toArray() { + return [...this]; + } + + *[Symbol.iterator] () { + for (let i = 0; i < this.heap.length; i++) { + yield this.heap[i].data; + } + } + + remove (testFn) { + let j = 0; + for (let i = 0; i < this.heap.length; i++) { + if (!testFn(this.heap[i])) { + this.heap[j] = this.heap[i]; + j++; + } + } + + this.heap.splice(j); + + for (let i = parent(this.heap.length-1); i >= 0; i--) { + this.percDown(i); + } + + return this; + } +} + +function leftChi(i) { + return (i<<1)+1; +} + +function parent(i) { + return ((i+1)>>1)-1; +} + +function smaller(x, y) { + if (x.priority !== y.priority) { + return x.priority < y.priority; + } + else { + return x.pushCount < y.pushCount; + } +} + +/** + * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and + * completed in ascending priority order. + * + * @name priorityQueue + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. + * Invoked with (task, callback). + * @param {number} concurrency - An `integer` for determining how many `worker` + * functions should be run in parallel. If omitted, the concurrency defaults to + * `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three + * differences between `queue` and `priorityQueue` objects: + * * `push(task, priority, [callback])` - `priority` should be a number. If an + * array of `tasks` is given, all tasks will be assigned the same priority. + * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, + * except this returns a promise that rejects if an error occurs. + * * The `unshift` and `unshiftAsync` methods were removed. + */ +function priorityQueue(worker, concurrency) { + // Start with a normal queue + var q = queue$1(worker, concurrency); + + var { + push, + pushAsync + } = q; + + q._tasks = new Heap(); + q._createTaskItem = ({data, priority}, callback) => { + return { + data, + priority, + callback + }; + }; + + function createDataItems(tasks, priority) { + if (!Array.isArray(tasks)) { + return {data: tasks, priority}; + } + return tasks.map(data => { return {data, priority}; }); + } + + // Override push to accept second parameter representing priority + q.push = function(data, priority = 0, callback) { + return push(createDataItems(data, priority), callback); + }; + + q.pushAsync = function(data, priority = 0, callback) { + return pushAsync(createDataItems(data, priority), callback); + }; + + // Remove unshift functions + delete q.unshift; + delete q.unshiftAsync; + + return q; +} + +/** + * Runs the `tasks` array of functions in parallel, without waiting until the + * previous function has completed. Once any of the `tasks` complete or pass an + * error to its callback, the main `callback` is immediately called. It's + * equivalent to `Promise.race()`. + * + * @name race + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} + * to run. Each function can complete with an optional `result` value. + * @param {Function} callback - A callback to run once any of the functions have + * completed. This function gets an error or result from the first function that + * completed. Invoked with (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.race([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], + * // main callback + * function(err, result) { + * // the result will be equal to 'two' as it finishes earlier + * }); + */ +function race(tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); + if (!tasks.length) return callback(); + for (var i = 0, l = tasks.length; i < l; i++) { + wrapAsync(tasks[i])(callback); + } +} + +var race$1 = awaitify(race, 2); + +/** + * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. + * + * @name reduceRight + * @static + * @memberOf module:Collections + * @method + * @see [async.reduce]{@link module:Collections.reduce} + * @alias foldr + * @category Collection + * @param {Array} array - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function reduceRight (array, memo, iteratee, callback) { + var reversed = [...array].reverse(); + return reduce$1(reversed, memo, iteratee, callback); +} + +/** + * Wraps the async function in another function that always completes with a + * result object, even when it errors. + * + * The result object has either the property `error` or `value`. + * + * @name reflect + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function you want to wrap + * @returns {Function} - A function that always passes null to it's callback as + * the error. The second argument to the callback will be an `object` with + * either an `error` or a `value` property. + * @example + * + * async.parallel([ + * async.reflect(function(callback) { + * // do some stuff ... + * callback(null, 'one'); + * }), + * async.reflect(function(callback) { + * // do some more stuff but error ... + * callback('bad stuff happened'); + * }), + * async.reflect(function(callback) { + * // do some more stuff ... + * callback(null, 'two'); + * }) + * ], + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = 'bad stuff happened' + * // results[2].value = 'two' + * }); + */ +function reflect(fn) { + var _fn = wrapAsync(fn); + return initialParams(function reflectOn(args, reflectCallback) { + args.push((error, ...cbArgs) => { + let retVal = {}; + if (error) { + retVal.error = error; + } + if (cbArgs.length > 0){ + var value = cbArgs; + if (cbArgs.length <= 1) { + [value] = cbArgs; + } + retVal.value = value; + } + reflectCallback(null, retVal); + }); + + return _fn.apply(this, args); + }); +} + +/** + * A helper function that wraps an array or an object of functions with `reflect`. + * + * @name reflectAll + * @static + * @memberOf module:Utils + * @method + * @see [async.reflect]{@link module:Utils.reflect} + * @category Util + * @param {Array|Object|Iterable} tasks - The collection of + * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. + * @returns {Array} Returns an array of async functions, each wrapped in + * `async.reflect` + * @example + * + * let tasks = [ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * // do some more stuff but error ... + * callback(new Error('bad stuff happened')); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = Error('bad stuff happened') + * // results[2].value = 'two' + * }); + * + * // an example using an object instead of an array + * let tasks = { + * one: function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * two: function(callback) { + * callback('two'); + * }, + * three: function(callback) { + * setTimeout(function() { + * callback(null, 'three'); + * }, 100); + * } + * }; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results.one.value = 'one' + * // results.two.error = 'two' + * // results.three.value = 'three' + * }); + */ +function reflectAll(tasks) { + var results; + if (Array.isArray(tasks)) { + results = tasks.map(reflect); + } else { + results = {}; + Object.keys(tasks).forEach(key => { + results[key] = reflect.call(this, tasks[key]); + }); + } + return results; +} + +function reject(eachfn, arr, _iteratee, callback) { + const iteratee = wrapAsync(_iteratee); + return _filter(eachfn, arr, (value, cb) => { + iteratee(value, (err, v) => { + cb(err, !v); + }); + }, callback); +} + +/** + * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. + * + * @name reject + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.reject(fileList, fileExists, function(err, results) { + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }); + * + * // Using Promises + * async.reject(fileList, fileExists) + * .then( results => { + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.reject(fileList, fileExists); + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function reject$1 (coll, iteratee, callback) { + return reject(eachOf$1, coll, iteratee, callback) +} +var reject$2 = awaitify(reject$1, 3); + +/** + * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a + * time. + * + * @name rejectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function rejectLimit (coll, limit, iteratee, callback) { + return reject(eachOfLimit(limit), coll, iteratee, callback) +} +var rejectLimit$1 = awaitify(rejectLimit, 4); + +/** + * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. + * + * @name rejectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function rejectSeries (coll, iteratee, callback) { + return reject(eachOfSeries$1, coll, iteratee, callback) +} +var rejectSeries$1 = awaitify(rejectSeries, 3); + +function constant$1(value) { + return function () { + return value; + } +} + +/** + * Attempts to get a successful response from `task` no more than `times` times + * before returning an error. If the task is successful, the `callback` will be + * passed the result of the successful task. If all attempts fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name retry + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @see [async.retryable]{@link module:ControlFlow.retryable} + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an + * object with `times` and `interval` or a number. + * * `times` - The number of attempts to make before giving up. The default + * is `5`. + * * `interval` - The time to wait between retries, in milliseconds. The + * default is `0`. The interval may also be specified as a function of the + * retry count (see example). + * * `errorFilter` - An optional synchronous function that is invoked on + * erroneous result. If it returns `true` the retry attempts will continue; + * if the function returns `false` the retry flow is aborted with the current + * attempt's error and result being returned to the final callback. + * Invoked with (err). + * * If `opts` is a number, the number specifies the number of times to retry, + * with the default interval of `0`. + * @param {AsyncFunction} task - An async function to retry. + * Invoked with (callback). + * @param {Function} [callback] - An optional callback which is called when the + * task has succeeded, or after the final failed attempt. It receives the `err` + * and `result` arguments of the last attempt at completing the `task`. Invoked + * with (err, results). + * @returns {Promise} a promise if no callback provided + * + * @example + * + * // The `retry` function can be used as a stand-alone control flow by passing + * // a callback, as shown below: + * + * // try calling apiMethod 3 times + * async.retry(3, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 3 times, waiting 200 ms between each retry + * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 10 times with exponential backoff + * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) + * async.retry({ + * times: 10, + * interval: function(retryCount) { + * return 50 * Math.pow(2, retryCount); + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod the default 5 times no delay between each retry + * async.retry(apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod only when error condition satisfies, all other + * // errors will abort the retry control flow and return to final callback + * async.retry({ + * errorFilter: function(err) { + * return err.message === 'Temporary error'; // only retry on a specific error + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // to retry individual methods that are not as reliable within other + * // control flow functions, use the `retryable` wrapper: + * async.auto({ + * users: api.getUsers.bind(api), + * payments: async.retryable(3, api.getPayments.bind(api)) + * }, function(err, results) { + * // do something with the results + * }); + * + */ +const DEFAULT_TIMES = 5; +const DEFAULT_INTERVAL = 0; + +function retry(opts, task, callback) { + var options = { + times: DEFAULT_TIMES, + intervalFunc: constant$1(DEFAULT_INTERVAL) + }; + + if (arguments.length < 3 && typeof opts === 'function') { + callback = task || promiseCallback(); + task = opts; + } else { + parseTimes(options, opts); + callback = callback || promiseCallback(); + } + + if (typeof task !== 'function') { + throw new Error("Invalid arguments for async.retry"); + } + + var _task = wrapAsync(task); + + var attempt = 1; + function retryAttempt() { + _task((err, ...args) => { + if (err === false) return + if (err && attempt++ < options.times && + (typeof options.errorFilter != 'function' || + options.errorFilter(err))) { + setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); + } else { + callback(err, ...args); + } + }); + } + + retryAttempt(); + return callback[PROMISE_SYMBOL] +} + +function parseTimes(acc, t) { + if (typeof t === 'object') { + acc.times = +t.times || DEFAULT_TIMES; + + acc.intervalFunc = typeof t.interval === 'function' ? + t.interval : + constant$1(+t.interval || DEFAULT_INTERVAL); + + acc.errorFilter = t.errorFilter; + } else if (typeof t === 'number' || typeof t === 'string') { + acc.times = +t || DEFAULT_TIMES; + } else { + throw new Error("Invalid arguments for async.retry"); + } +} + +/** + * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method + * wraps a task and makes it retryable, rather than immediately calling it + * with retries. + * + * @name retryable + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.retry]{@link module:ControlFlow.retry} + * @category Control Flow + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional + * options, exactly the same as from `retry`, except for a `opts.arity` that + * is the arity of the `task` function, defaulting to `task.length` + * @param {AsyncFunction} task - the asynchronous function to wrap. + * This function will be passed any arguments passed to the returned wrapper. + * Invoked with (...args, callback). + * @returns {AsyncFunction} The wrapped function, which when invoked, will + * retry on an error, based on the parameters specified in `opts`. + * This function will accept the same parameters as `task`. + * @example + * + * async.auto({ + * dep1: async.retryable(3, getFromFlakyService), + * process: ["dep1", async.retryable(3, function (results, cb) { + * maybeProcessData(results.dep1, cb); + * })] + * }, callback); + */ +function retryable (opts, task) { + if (!task) { + task = opts; + opts = null; + } + let arity = (opts && opts.arity) || task.length; + if (isAsync(task)) { + arity += 1; + } + var _task = wrapAsync(task); + return initialParams((args, callback) => { + if (args.length < arity - 1 || callback == null) { + args.push(callback); + callback = promiseCallback(); + } + function taskFn(cb) { + _task(...args, cb); + } + + if (opts) retry(opts, taskFn, callback); + else retry(taskFn, callback); + + return callback[PROMISE_SYMBOL] + }); +} + +/** + * Run the functions in the `tasks` collection in series, each one running once + * the previous function has completed. If any functions in the series pass an + * error to its callback, no more functions are run, and `callback` is + * immediately called with the value of the error. Otherwise, `callback` + * receives an array of results when `tasks` have completed. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function, and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.series}. + * + * **Note** that while many implementations preserve the order of object + * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) + * explicitly states that + * + * > The mechanics and order of enumerating the properties is not specified. + * + * So if you rely on the order in which your series of functions are executed, + * and want this to work on all platforms, consider using an array. + * + * @name series + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing + * [async functions]{@link AsyncFunction} to run in series. + * Each function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This function gets a results array (or object) + * containing all the result arguments passed to the `task` callbacks. Invoked + * with (err, result). + * @return {Promise} a promise, if no callback is passed + * @example + * + * //Using Callbacks + * async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] + * }); + * + * // an example using objects instead of arrays + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.series([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function series(tasks, callback) { + return parallel(eachOfSeries$1, tasks, callback); +} + +/** + * Returns `true` if at least one element in the `coll` satisfies an async test. + * If any iteratee call returns `true`, the main `callback` is immediately + * called. + * + * @name some + * @static + * @memberOf module:Collections + * @method + * @alias any + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + *); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // false + * // result is false since none of the files exists + * } + *); + * + * // Using Promises + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since some file in the list exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since none of the files exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); + * console.log(result); + * // false + * // result is false since none of the files exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function some(coll, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOf$1, coll, iteratee, callback) +} +var some$1 = awaitify(some, 3); + +/** + * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. + * + * @name someLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anyLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someLimit(coll, limit, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOfLimit(limit), coll, iteratee, callback) +} +var someLimit$1 = awaitify(someLimit, 4); + +/** + * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. + * + * @name someSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anySeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in series. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someSeries(coll, iteratee, callback) { + return _createTester(Boolean, res => res)(eachOfSeries$1, coll, iteratee, callback) +} +var someSeries$1 = awaitify(someSeries, 3); + +/** + * Sorts a list by the results of running each `coll` value through an async + * `iteratee`. + * + * @name sortBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a value to use as the sort criteria as + * its `result`. + * Invoked with (item, callback). + * @param {Function} callback - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is the items + * from the original `coll` sorted by the values returned by the `iteratee` + * calls. Invoked with (err, results). + * @returns {Promise} a promise, if no callback passed + * @example + * + * // bigfile.txt is a file that is 251100 bytes in size + * // mediumfile.txt is a file that is 11000 bytes in size + * // smallfile.txt is a file that is 121 bytes in size + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // By modifying the callback parameter the + * // sorting order can be influenced: + * + * // ascending order + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) return callback(getFileSizeErr); + * callback(null, fileSize); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // descending order + * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) { + * return callback(getFileSizeErr); + * } + * callback(null, fileSize * -1); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] + * } + * } + * ); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * } + * ); + * + * // Using Promises + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * (async () => { + * try { + * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * // Error handling + * async () => { + * try { + * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function sortBy (coll, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return map$1(coll, (x, iterCb) => { + _iteratee(x, (err, criteria) => { + if (err) return iterCb(err); + iterCb(err, {value: x, criteria}); + }); + }, (err, results) => { + if (err) return callback(err); + callback(null, results.sort(comparator).map(v => v.value)); + }); + + function comparator(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + } +} +var sortBy$1 = awaitify(sortBy, 3); + +/** + * Sets a time limit on an asynchronous function. If the function does not call + * its callback within the specified milliseconds, it will be called with a + * timeout error. The code property for the error object will be `'ETIMEDOUT'`. + * + * @name timeout + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} asyncFn - The async function to limit in time. + * @param {number} milliseconds - The specified time limit. + * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) + * to timeout Error for more information.. + * @returns {AsyncFunction} Returns a wrapped function that can be used with any + * of the control flow functions. + * Invoke this function with the same parameters as you would `asyncFunc`. + * @example + * + * function myFunction(foo, callback) { + * doAsyncTask(foo, function(err, data) { + * // handle errors + * if (err) return callback(err); + * + * // do some stuff ... + * + * // return processed data + * return callback(null, data); + * }); + * } + * + * var wrapped = async.timeout(myFunction, 1000); + * + * // call `wrapped` as you would `myFunction` + * wrapped({ bar: 'bar' }, function(err, data) { + * // if `myFunction` takes < 1000 ms to execute, `err` + * // and `data` will have their expected values + * + * // else `err` will be an Error with the code 'ETIMEDOUT' + * }); + */ +function timeout(asyncFn, milliseconds, info) { + var fn = wrapAsync(asyncFn); + + return initialParams((args, callback) => { + var timedOut = false; + var timer; + + function timeoutCallback() { + var name = asyncFn.name || 'anonymous'; + var error = new Error('Callback function "' + name + '" timed out.'); + error.code = 'ETIMEDOUT'; + if (info) { + error.info = info; + } + timedOut = true; + callback(error); + } + + args.push((...cbArgs) => { + if (!timedOut) { + callback(...cbArgs); + clearTimeout(timer); + } + }); + + // setup timer and call original function + timer = setTimeout(timeoutCallback, milliseconds); + fn(...args); + }); +} + +function range(size) { + var result = Array(size); + while (size--) { + result[size] = size; + } + return result; +} + +/** + * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a + * time. + * + * @name timesLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} count - The number of times to run the function. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see [async.map]{@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ +function timesLimit(count, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(range(count), limit, _iteratee, callback); +} + +/** + * Calls the `iteratee` function `n` times, and accumulates results in the same + * manner you would use with [map]{@link module:Collections.map}. + * + * @name times + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.map]{@link module:Collections.map} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + * @example + * + * // Pretend this is some complicated async factory + * var createUser = function(id, callback) { + * callback(null, { + * id: 'user' + id + * }); + * }; + * + * // generate 5 users + * async.times(5, function(n, next) { + * createUser(n, function(err, user) { + * next(err, user); + * }); + * }, function(err, users) { + * // we should now have 5 users + * }); + */ +function times (n, iteratee, callback) { + return timesLimit(n, Infinity, iteratee, callback) +} + +/** + * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. + * + * @name timesSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ +function timesSeries (n, iteratee, callback) { + return timesLimit(n, 1, iteratee, callback) +} + +/** + * A relative of `reduce`. Takes an Object or Array, and iterates over each + * element in parallel, each step potentially mutating an `accumulator` value. + * The type of the accumulator defaults to the type of collection passed in. + * + * @name transform + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} [accumulator] - The initial state of the transform. If omitted, + * it will default to an empty Object or Array, depending on the type of `coll` + * @param {AsyncFunction} iteratee - A function applied to each item in the + * collection that potentially modifies the accumulator. + * Invoked with (accumulator, item, key, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the transformed accumulator. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileList, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * }); + * + * // Using Promises + * async.transform(fileList, transformFileSize) + * .then(result => { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * (async () => { + * try { + * let result = await async.transform(fileList, transformFileSize); + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileMap, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * }); + * + * // Using Promises + * async.transform(fileMap, transformFileSize) + * .then(result => { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.transform(fileMap, transformFileSize); + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function transform (coll, accumulator, iteratee, callback) { + if (arguments.length <= 3 && typeof accumulator === 'function') { + callback = iteratee; + iteratee = accumulator; + accumulator = Array.isArray(coll) ? [] : {}; + } + callback = once(callback || promiseCallback()); + var _iteratee = wrapAsync(iteratee); + + eachOf$1(coll, (v, k, cb) => { + _iteratee(accumulator, v, k, cb); + }, err => callback(err, accumulator)); + return callback[PROMISE_SYMBOL] +} + +/** + * It runs each task in series but stops whenever any of the functions were + * successful. If one of the tasks were successful, the `callback` will be + * passed the result of the successful task. If all tasks fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name tryEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to + * run, each function is passed a `callback(err, result)` it must call on + * completion with an error `err` (which can be `null`) and an optional `result` + * value. + * @param {Function} [callback] - An optional callback which is called when one + * of the tasks has succeeded, or all have failed. It receives the `err` and + * `result` arguments of the last attempt at completing the `task`. Invoked with + * (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * async.tryEach([ + * function getDataFromFirstWebsite(callback) { + * // Try getting the data from the first website + * callback(err, data); + * }, + * function getDataFromSecondWebsite(callback) { + * // First website failed, + * // Try getting the data from the backup website + * callback(err, data); + * } + * ], + * // optional callback + * function(err, results) { + * Now do something with the data. + * }); + * + */ +function tryEach(tasks, callback) { + var error = null; + var result; + return eachSeries$1(tasks, (task, taskCb) => { + wrapAsync(task)((err, ...args) => { + if (err === false) return taskCb(err); + + if (args.length < 2) { + [result] = args; + } else { + result = args; + } + error = err; + taskCb(err ? null : {}); + }); + }, () => callback(error, result)); +} + +var tryEach$1 = awaitify(tryEach); + +/** + * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, + * unmemoized form. Handy for testing. + * + * @name unmemoize + * @static + * @memberOf module:Utils + * @method + * @see [async.memoize]{@link module:Utils.memoize} + * @category Util + * @param {AsyncFunction} fn - the memoized function + * @returns {AsyncFunction} a function that calls the original unmemoized function + */ +function unmemoize(fn) { + return (...args) => { + return (fn.unmemoized || fn)(...args); + }; +} + +/** + * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. + * + * @name whilst + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` passes. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + * @example + * + * var count = 0; + * async.whilst( + * function test(cb) { cb(null, count < 5); }, + * function iter(callback) { + * count++; + * setTimeout(function() { + * callback(null, count); + * }, 1000); + * }, + * function (err, n) { + * // 5 seconds have passed, n = 5 + * } + * ); + */ +function whilst(test, iteratee, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results = []; + + function next(err, ...rest) { + if (err) return callback(err); + results = rest; + if (err === false) return; + _test(check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return _test(check); +} +var whilst$1 = awaitify(whilst, 3); + +/** + * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. `callback` will be passed an error and any + * arguments passed to the final `iteratee`'s callback. + * + * The inverse of [whilst]{@link module:ControlFlow.whilst}. + * + * @name until + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (callback). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * const results = [] + * let finished = false + * async.until(function test(cb) { + * cb(null, finished) + * }, function iter(next) { + * fetchPage(url, (err, body) => { + * if (err) return next(err) + * results = results.concat(body.objects) + * finished = !!body.next + * next(err) + * }) + * }, function done (err) { + * // all pages have been fetched + * }) + */ +function until(test, iteratee, callback) { + const _test = wrapAsync(test); + return whilst$1((cb) => _test((err, truth) => cb (err, !truth)), iteratee, callback); +} + +/** + * Runs the `tasks` array of functions in series, each passing their results to + * the next in the array. However, if any of the `tasks` pass an error to their + * own callback, the next function is not executed, and the main `callback` is + * immediately called with the error. + * + * @name waterfall + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} + * to run. + * Each function should complete with any number of `result` values. + * The `result` values will be passed as arguments, in order, to the next task. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This will be passed the results of the last task's + * callback. Invoked with (err, [results]). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.waterfall([ + * function(callback) { + * callback(null, 'one', 'two'); + * }, + * function(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * }, + * function(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + * ], function (err, result) { + * // result now equals 'done' + * }); + * + * // Or, with named functions: + * async.waterfall([ + * myFirstFunction, + * mySecondFunction, + * myLastFunction, + * ], function (err, result) { + * // result now equals 'done' + * }); + * function myFirstFunction(callback) { + * callback(null, 'one', 'two'); + * } + * function mySecondFunction(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * } + * function myLastFunction(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + */ +function waterfall (tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); + if (!tasks.length) return callback(); + var taskIndex = 0; + + function nextTask(args) { + var task = wrapAsync(tasks[taskIndex++]); + task(...args, onlyOnce(next)); + } + + function next(err, ...args) { + if (err === false) return + if (err || taskIndex === tasks.length) { + return callback(err, ...args); + } + nextTask(args); + } + + nextTask([]); +} + +var waterfall$1 = awaitify(waterfall); + +/** + * An "async function" in the context of Async is an asynchronous function with + * a variable number of parameters, with the final parameter being a callback. + * (`function (arg1, arg2, ..., callback) {}`) + * The final callback is of the form `callback(err, results...)`, which must be + * called once the function is completed. The callback should be called with a + * Error as its first argument to signal that an error occurred. + * Otherwise, if no error occurred, it should be called with `null` as the first + * argument, and any additional `result` arguments that may apply, to signal + * successful completion. + * The callback must be called exactly once, ideally on a later tick of the + * JavaScript event loop. + * + * This type of function is also referred to as a "Node-style async function", + * or a "continuation passing-style function" (CPS). Most of the methods of this + * library are themselves CPS/Node-style async functions, or functions that + * return CPS/Node-style async functions. + * + * Wherever we accept a Node-style async function, we also directly accept an + * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. + * In this case, the `async` function will not be passed a final callback + * argument, and any thrown error will be used as the `err` argument of the + * implicit callback, and the return value will be used as the `result` value. + * (i.e. a `rejected` of the returned Promise becomes the `err` callback + * argument, and a `resolved` value becomes the `result`.) + * + * Note, due to JavaScript limitations, we can only detect native `async` + * functions and not transpilied implementations. + * Your environment must have `async`/`await` support for this to work. + * (e.g. Node > v7.6, or a recent version of a modern browser). + * If you are using `async` functions through a transpiler (e.g. Babel), you + * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, + * because the `async function` will be compiled to an ordinary function that + * returns a promise. + * + * @typedef {Function} AsyncFunction + * @static + */ + +var index = { + apply, + applyEach: applyEach$1, + applyEachSeries, + asyncify, + auto, + autoInject, + cargo, + cargoQueue: cargo$1, + compose, + concat: concat$1, + concatLimit: concatLimit$1, + concatSeries: concatSeries$1, + constant, + detect: detect$1, + detectLimit: detectLimit$1, + detectSeries: detectSeries$1, + dir, + doUntil, + doWhilst: doWhilst$1, + each, + eachLimit: eachLimit$2, + eachOf: eachOf$1, + eachOfLimit: eachOfLimit$2, + eachOfSeries: eachOfSeries$1, + eachSeries: eachSeries$1, + ensureAsync, + every: every$1, + everyLimit: everyLimit$1, + everySeries: everySeries$1, + filter: filter$1, + filterLimit: filterLimit$1, + filterSeries: filterSeries$1, + forever: forever$1, + groupBy, + groupByLimit: groupByLimit$1, + groupBySeries, + log, + map: map$1, + mapLimit: mapLimit$1, + mapSeries: mapSeries$1, + mapValues, + mapValuesLimit: mapValuesLimit$1, + mapValuesSeries, + memoize, + nextTick, + parallel: parallel$1, + parallelLimit, + priorityQueue, + queue: queue$1, + race: race$1, + reduce: reduce$1, + reduceRight, + reflect, + reflectAll, + reject: reject$2, + rejectLimit: rejectLimit$1, + rejectSeries: rejectSeries$1, + retry, + retryable, + seq, + series, + setImmediate: setImmediate$1, + some: some$1, + someLimit: someLimit$1, + someSeries: someSeries$1, + sortBy: sortBy$1, + timeout, + times, + timesLimit, + timesSeries, + transform, + tryEach: tryEach$1, + unmemoize, + until, + waterfall: waterfall$1, + whilst: whilst$1, + + // aliases + all: every$1, + allLimit: everyLimit$1, + allSeries: everySeries$1, + any: some$1, + anyLimit: someLimit$1, + anySeries: someSeries$1, + find: detect$1, + findLimit: detectLimit$1, + findSeries: detectSeries$1, + flatMap: concat$1, + flatMapLimit: concatLimit$1, + flatMapSeries: concatSeries$1, + forEach: each, + forEachSeries: eachSeries$1, + forEachLimit: eachLimit$2, + forEachOf: eachOf$1, + forEachOfSeries: eachOfSeries$1, + forEachOfLimit: eachOfLimit$2, + inject: reduce$1, + foldl: reduce$1, + foldr: reduceRight, + select: filter$1, + selectLimit: filterLimit$1, + selectSeries: filterSeries$1, + wrapSync: asyncify, + during: whilst$1, + doDuring: doWhilst$1 +}; + +export default index; +export { apply, applyEach$1 as applyEach, applyEachSeries, asyncify, auto, autoInject, cargo, cargo$1 as cargoQueue, compose, concat$1 as concat, concatLimit$1 as concatLimit, concatSeries$1 as concatSeries, constant, detect$1 as detect, detectLimit$1 as detectLimit, detectSeries$1 as detectSeries, dir, doUntil, doWhilst$1 as doWhilst, each, eachLimit$2 as eachLimit, eachOf$1 as eachOf, eachOfLimit$2 as eachOfLimit, eachOfSeries$1 as eachOfSeries, eachSeries$1 as eachSeries, ensureAsync, every$1 as every, everyLimit$1 as everyLimit, everySeries$1 as everySeries, filter$1 as filter, filterLimit$1 as filterLimit, filterSeries$1 as filterSeries, forever$1 as forever, groupBy, groupByLimit$1 as groupByLimit, groupBySeries, log, map$1 as map, mapLimit$1 as mapLimit, mapSeries$1 as mapSeries, mapValues, mapValuesLimit$1 as mapValuesLimit, mapValuesSeries, memoize, nextTick, parallel$1 as parallel, parallelLimit, priorityQueue, queue$1 as queue, race$1 as race, reduce$1 as reduce, reduceRight, reflect, reflectAll, reject$2 as reject, rejectLimit$1 as rejectLimit, rejectSeries$1 as rejectSeries, retry, retryable, seq, series, setImmediate$1 as setImmediate, some$1 as some, someLimit$1 as someLimit, someSeries$1 as someSeries, sortBy$1 as sortBy, timeout, times, timesLimit, timesSeries, transform, tryEach$1 as tryEach, unmemoize, until, waterfall$1 as waterfall, whilst$1 as whilst, every$1 as all, everyLimit$1 as allLimit, everySeries$1 as allSeries, some$1 as any, someLimit$1 as anyLimit, someSeries$1 as anySeries, detect$1 as find, detectLimit$1 as findLimit, detectSeries$1 as findSeries, concat$1 as flatMap, concatLimit$1 as flatMapLimit, concatSeries$1 as flatMapSeries, each as forEach, eachSeries$1 as forEachSeries, eachLimit$2 as forEachLimit, eachOf$1 as forEachOf, eachOfSeries$1 as forEachOfSeries, eachOfLimit$2 as forEachOfLimit, reduce$1 as inject, reduce$1 as foldl, reduceRight as foldr, filter$1 as select, filterLimit$1 as selectLimit, filterSeries$1 as selectSeries, asyncify as wrapSync, whilst$1 as during, doWhilst$1 as doDuring }; diff --git a/node_modules/async/doDuring.js b/node_modules/async/doDuring.js new file mode 100644 index 00000000..4c98e9e1 --- /dev/null +++ b/node_modules/async/doDuring.js @@ -0,0 +1,68 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in + * the order of operations, the arguments `test` and `iteratee` are switched. + * + * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. + * + * @name doWhilst + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - A function which is called each time `test` + * passes. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee`. + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. + * `callback` will be passed an error and any arguments passed to the final + * `iteratee`'s callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ +function doWhilst(iteratee, test, callback) { + callback = (0, _onlyOnce2.default)(callback); + var _fn = (0, _wrapAsync2.default)(iteratee); + var _test = (0, _wrapAsync2.default)(test); + var results; + + function next(err, ...args) { + if (err) return callback(err); + if (err === false) return; + results = args; + _test(...args, check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return check(null, true); +} + +exports.default = (0, _awaitify2.default)(doWhilst, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/doUntil.js b/node_modules/async/doUntil.js new file mode 100644 index 00000000..8aa09350 --- /dev/null +++ b/node_modules/async/doUntil.js @@ -0,0 +1,46 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = doUntil; + +var _doWhilst = require('./doWhilst.js'); + +var _doWhilst2 = _interopRequireDefault(_doWhilst); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the + * argument ordering differs from `until`. + * + * @name doUntil + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee` + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ +function doUntil(iteratee, test, callback) { + const _test = (0, _wrapAsync2.default)(test); + return (0, _doWhilst2.default)(iteratee, (...args) => { + const cb = args.pop(); + _test(...args, (err, truth) => cb(err, !truth)); + }, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/doWhilst.js b/node_modules/async/doWhilst.js new file mode 100644 index 00000000..4c98e9e1 --- /dev/null +++ b/node_modules/async/doWhilst.js @@ -0,0 +1,68 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in + * the order of operations, the arguments `test` and `iteratee` are switched. + * + * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. + * + * @name doWhilst + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} iteratee - A function which is called each time `test` + * passes. Invoked with (callback). + * @param {AsyncFunction} test - asynchronous truth test to perform after each + * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `iteratee`. + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. + * `callback` will be passed an error and any arguments passed to the final + * `iteratee`'s callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + */ +function doWhilst(iteratee, test, callback) { + callback = (0, _onlyOnce2.default)(callback); + var _fn = (0, _wrapAsync2.default)(iteratee); + var _test = (0, _wrapAsync2.default)(test); + var results; + + function next(err, ...args) { + if (err) return callback(err); + if (err === false) return; + results = args; + _test(...args, check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return check(null, true); +} + +exports.default = (0, _awaitify2.default)(doWhilst, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/during.js b/node_modules/async/during.js new file mode 100644 index 00000000..32a47762 --- /dev/null +++ b/node_modules/async/during.js @@ -0,0 +1,78 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. + * + * @name whilst + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` passes. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + * @example + * + * var count = 0; + * async.whilst( + * function test(cb) { cb(null, count < 5); }, + * function iter(callback) { + * count++; + * setTimeout(function() { + * callback(null, count); + * }, 1000); + * }, + * function (err, n) { + * // 5 seconds have passed, n = 5 + * } + * ); + */ +function whilst(test, iteratee, callback) { + callback = (0, _onlyOnce2.default)(callback); + var _fn = (0, _wrapAsync2.default)(iteratee); + var _test = (0, _wrapAsync2.default)(test); + var results = []; + + function next(err, ...rest) { + if (err) return callback(err); + results = rest; + if (err === false) return; + _test(check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return _test(check); +} +exports.default = (0, _awaitify2.default)(whilst, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/each.js b/node_modules/async/each.js new file mode 100644 index 00000000..405d495c --- /dev/null +++ b/node_modules/async/each.js @@ -0,0 +1,129 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _withoutIndex = require('./internal/withoutIndex.js'); + +var _withoutIndex2 = _interopRequireDefault(_withoutIndex); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Applies the function `iteratee` to each item in `coll`, in parallel. + * The `iteratee` is called with an item from the list, and a callback for when + * it has finished. If the `iteratee` passes an error to its `callback`, the + * main `callback` (for the `each` function) is immediately called with the + * error. + * + * Note, that since this function applies `iteratee` to each item in parallel, + * there is no guarantee that the iteratee functions will complete in order. + * + * @name each + * @static + * @memberOf module:Collections + * @method + * @alias forEach + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to + * each item in `coll`. Invoked with (item, callback). + * The array index is not passed to the iteratee. + * If you need the index, use `eachOf`. + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; + * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; + * + * // asynchronous function that deletes a file + * const deleteFile = function(file, callback) { + * fs.unlink(file, callback); + * }; + * + * // Using callbacks + * async.each(fileList, deleteFile, function(err) { + * if( err ) { + * console.log(err); + * } else { + * console.log('All files have been deleted successfully'); + * } + * }); + * + * // Error Handling + * async.each(withMissingFileList, deleteFile, function(err){ + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using Promises + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using async/await + * async () => { + * try { + * await async.each(files, deleteFile); + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * await async.each(withMissingFileList, deleteFile); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * } + * } + * + */ +function eachLimit(coll, iteratee, callback) { + return (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); +} + +exports.default = (0, _awaitify2.default)(eachLimit, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachLimit.js b/node_modules/async/eachLimit.js new file mode 100644 index 00000000..5f3d0094 --- /dev/null +++ b/node_modules/async/eachLimit.js @@ -0,0 +1,50 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _withoutIndex = require('./internal/withoutIndex.js'); + +var _withoutIndex2 = _interopRequireDefault(_withoutIndex); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. + * + * @name eachLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfLimit`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachLimit(coll, limit, iteratee, callback) { + return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); +} +exports.default = (0, _awaitify2.default)(eachLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOf.js b/node_modules/async/eachOf.js new file mode 100644 index 00000000..c22614f3 --- /dev/null +++ b/node_modules/async/eachOf.js @@ -0,0 +1,185 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _isArrayLike = require('./internal/isArrayLike.js'); + +var _isArrayLike2 = _interopRequireDefault(_isArrayLike); + +var _breakLoop = require('./internal/breakLoop.js'); + +var _breakLoop2 = _interopRequireDefault(_breakLoop); + +var _eachOfLimit = require('./eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eachOf implementation optimized for array-likes +function eachOfArrayLike(coll, iteratee, callback) { + callback = (0, _once2.default)(callback); + var index = 0, + completed = 0, + { length } = coll, + canceled = false; + if (length === 0) { + callback(null); + } + + function iteratorCallback(err, value) { + if (err === false) { + canceled = true; + } + if (canceled === true) return; + if (err) { + callback(err); + } else if (++completed === length || value === _breakLoop2.default) { + callback(null); + } + } + + for (; index < length; index++) { + iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback)); + } +} + +// a generic version of eachOf which can handle array, object, and iterator cases. +function eachOfGeneric(coll, iteratee, callback) { + return (0, _eachOfLimit2.default)(coll, Infinity, iteratee, callback); +} + +/** + * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument + * to the iteratee. + * + * @name eachOf + * @static + * @memberOf module:Collections + * @method + * @alias forEachOf + * @category Collection + * @see [async.each]{@link module:Collections.each} + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each + * item in `coll`. + * The `key` is the item's key, or index in the case of an array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dev.json is a file containing a valid json object config for dev environment + * // dev.json is a file containing a valid json object config for test environment + * // prod.json is a file containing a valid json object config for prod environment + * // invalid.json is a file with a malformed json object + * + * let configs = {}; //global variable + * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; + * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; + * + * // asynchronous function that reads a json file and parses the contents as json object + * function parseFile(file, key, callback) { + * fs.readFile(file, "utf8", function(err, data) { + * if (err) return calback(err); + * try { + * configs[key] = JSON.parse(data); + * } catch (e) { + * return callback(e); + * } + * callback(); + * }); + * } + * + * // Using callbacks + * async.forEachOf(validConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * } else { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * // JSON parse error exception + * } else { + * console.log(configs); + * } + * }); + * + * // Using Promises + * async.forEachOf(validConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * }).catch( err => { + * console.error(err); + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * }).catch( err => { + * console.error(err); + * // JSON parse error exception + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.forEachOf(validConfigFileMap, parseFile); + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * catch (err) { + * console.log(err); + * } + * } + * + * //Error handing + * async () => { + * try { + * let result = await async.forEachOf(invalidConfigFileMap, parseFile); + * console.log(configs); + * } + * catch (err) { + * console.log(err); + * // JSON parse error exception + * } + * } + * + */ +function eachOf(coll, iteratee, callback) { + var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric; + return eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback); +} + +exports.default = (0, _awaitify2.default)(eachOf, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOfLimit.js b/node_modules/async/eachOfLimit.js new file mode 100644 index 00000000..e9fc4db8 --- /dev/null +++ b/node_modules/async/eachOfLimit.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit2 = require('./internal/eachOfLimit.js'); + +var _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a + * time. + * + * @name eachOfLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. The `key` is the item's key, or index in the case of an + * array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfLimit(coll, limit, iteratee, callback) { + return (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); +} + +exports.default = (0, _awaitify2.default)(eachOfLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOfSeries.js b/node_modules/async/eachOfSeries.js new file mode 100644 index 00000000..cfb0f33c --- /dev/null +++ b/node_modules/async/eachOfSeries.js @@ -0,0 +1,39 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit = require('./eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. + * + * @name eachOfSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfSeries(coll, iteratee, callback) { + return (0, _eachOfLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(eachOfSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachSeries.js b/node_modules/async/eachSeries.js new file mode 100644 index 00000000..d674d0c3 --- /dev/null +++ b/node_modules/async/eachSeries.js @@ -0,0 +1,44 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachLimit = require('./eachLimit.js'); + +var _eachLimit2 = _interopRequireDefault(_eachLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. + * + * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item + * in series and therefore the iteratee functions will complete in order. + + * @name eachSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfSeries`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachSeries(coll, iteratee, callback) { + return (0, _eachLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(eachSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/ensureAsync.js b/node_modules/async/ensureAsync.js new file mode 100644 index 00000000..ad8beb52 --- /dev/null +++ b/node_modules/async/ensureAsync.js @@ -0,0 +1,67 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = ensureAsync; + +var _setImmediate = require('./internal/setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Wrap an async function and ensure it calls its callback on a later tick of + * the event loop. If the function already calls its callback on a next tick, + * no extra deferral is added. This is useful for preventing stack overflows + * (`RangeError: Maximum call stack size exceeded`) and generally keeping + * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) + * contained. ES2017 `async` functions are returned as-is -- they are immune + * to Zalgo's corrupting influences, as they always resolve on a later tick. + * + * @name ensureAsync + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - an async function, one that expects a node-style + * callback as its last argument. + * @returns {AsyncFunction} Returns a wrapped function with the exact same call + * signature as the function passed in. + * @example + * + * function sometimesAsync(arg, callback) { + * if (cache[arg]) { + * return callback(null, cache[arg]); // this would be synchronous!! + * } else { + * doSomeIO(arg, callback); // this IO would be asynchronous + * } + * } + * + * // this has a risk of stack overflows if many results are cached in a row + * async.mapSeries(args, sometimesAsync, done); + * + * // this will defer sometimesAsync's callback if necessary, + * // preventing stack overflows + * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); + */ +function ensureAsync(fn) { + if ((0, _wrapAsync.isAsync)(fn)) return fn; + return function (...args /*, callback*/) { + var callback = args.pop(); + var sync = true; + args.push((...innerArgs) => { + if (sync) { + (0, _setImmediate2.default)(() => callback(...innerArgs)); + } else { + callback(...innerArgs); + } + }); + fn.apply(this, args); + sync = false; + }; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/every.js b/node_modules/async/every.js new file mode 100644 index 00000000..148db683 --- /dev/null +++ b/node_modules/async/every.js @@ -0,0 +1,119 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns `true` if every element in `coll` satisfies an async test. If any + * iteratee call returns `false`, the main `callback` is immediately called. + * + * @name every + * @static + * @memberOf module:Collections + * @method + * @alias all + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.every(fileList, fileExists, function(err, result) { + * console.log(result); + * // true + * // result is true since every file exists + * }); + * + * async.every(withMissingFileList, fileExists, function(err, result) { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }); + * + * // Using Promises + * async.every(fileList, fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.every(withMissingFileList, fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since NOT every file exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.every(fileList, fileExists); + * console.log(result); + * // true + * // result is true since every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.every(withMissingFileList, fileExists); + * console.log(result); + * // false + * // result is false since NOT every file exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function every(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(every, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/everyLimit.js b/node_modules/async/everyLimit.js new file mode 100644 index 00000000..25b2c089 --- /dev/null +++ b/node_modules/async/everyLimit.js @@ -0,0 +1,46 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. + * + * @name everyLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in parallel. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everyLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(everyLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/everySeries.js b/node_modules/async/everySeries.js new file mode 100644 index 00000000..147c3dc5 --- /dev/null +++ b/node_modules/async/everySeries.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. + * + * @name everySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.every]{@link module:Collections.every} + * @alias allSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collection in series. + * The iteratee must complete with a boolean result value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result will be either `true` or `false` + * depending on the values of the async tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function everySeries(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(everySeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filter.js b/node_modules/async/filter.js new file mode 100644 index 00000000..303dc1fb --- /dev/null +++ b/node_modules/async/filter.js @@ -0,0 +1,93 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns a new array of all the values in `coll` which pass an async truth + * test. This operation is performed in parallel, but the results array will be + * in the same order as the original. + * + * @name filter + * @static + * @memberOf module:Collections + * @method + * @alias select + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.filter(files, fileExists, function(err, results) { + * if(err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * }); + * + * // Using Promises + * async.filter(files, fileExists) + * .then(results => { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.filter(files, fileExists); + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function filter(coll, iteratee, callback) { + return (0, _filter3.default)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filter, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filterLimit.js b/node_modules/async/filterLimit.js new file mode 100644 index 00000000..89e55f53 --- /dev/null +++ b/node_modules/async/filterLimit.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a + * time. + * + * @name filterLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + */ +function filterLimit(coll, limit, iteratee, callback) { + return (0, _filter3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filterLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filterSeries.js b/node_modules/async/filterSeries.js new file mode 100644 index 00000000..a045e52c --- /dev/null +++ b/node_modules/async/filterSeries.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. + * + * @name filterSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results) + * @returns {Promise} a promise, if no callback provided + */ +function filterSeries(coll, iteratee, callback) { + return (0, _filter3.default)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filterSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/find.js b/node_modules/async/find.js new file mode 100644 index 00000000..05b2e5c6 --- /dev/null +++ b/node_modules/async/find.js @@ -0,0 +1,96 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns the first value in `coll` that passes an async truth test. The + * `iteratee` is applied in parallel, meaning the first iteratee to return + * `true` will fire the detect `callback` with that result. That means the + * result might not be the first item in the original `coll` (in terms of order) + * that passes the test. + + * If order within the original `coll` is important, then look at + * [`detectSeries`]{@link module:Collections.detectSeries}. + * + * @name detect + * @static + * @memberOf module:Collections + * @method + * @alias find + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * } + *); + * + * // Using Promises + * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) + * .then(result => { + * console.log(result); + * // dir1/file1.txt + * // result now equals the first file in the list that exists + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); + * console.log(result); + * // dir1/file1.txt + * // result now equals the file in the list that exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function detect(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(detect, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/findLimit.js b/node_modules/async/findLimit.js new file mode 100644 index 00000000..db6961ec --- /dev/null +++ b/node_modules/async/findLimit.js @@ -0,0 +1,48 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a + * time. + * + * @name detectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findLimit + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(detectLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/findSeries.js b/node_modules/async/findSeries.js new file mode 100644 index 00000000..b9131b4a --- /dev/null +++ b/node_modules/async/findSeries.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. + * + * @name detectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.detect]{@link module:Collections.detect} + * @alias findSeries + * @category Collections + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. + * The iteratee must complete with a boolean value as its result. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the `iteratee` functions have finished. + * Result will be the first item in the array that passes the truth test + * (iteratee) or the value `undefined` if none passed. Invoked with + * (err, result). + * @returns {Promise} a promise, if a callback is omitted + */ +function detectSeries(coll, iteratee, callback) { + return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(1), coll, iteratee, callback); +} + +exports.default = (0, _awaitify2.default)(detectSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMap.js b/node_modules/async/flatMap.js new file mode 100644 index 00000000..8eed1ac8 --- /dev/null +++ b/node_modules/async/flatMap.js @@ -0,0 +1,115 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _concatLimit = require('./concatLimit.js'); + +var _concatLimit2 = _interopRequireDefault(_concatLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Applies `iteratee` to each item in `coll`, concatenating the results. Returns + * the concatenated list. The `iteratee`s are called in parallel, and the + * results are concatenated as they return. The results array will be returned in + * the original order of `coll` passed to the `iteratee` function. + * + * @name concat + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @alias flatMap + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * let directoryList = ['dir1','dir2','dir3']; + * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; + * + * // Using callbacks + * async.concat(directoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.concat(directoryList, fs.readdir) + * .then(results => { + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Error Handling + * async.concat(withMissingDirectoryList, fs.readdir) + * .then(results => { + * console.log(results); + * }).catch(err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.concat(directoryList, fs.readdir); + * console.log(results); + * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] + * } catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.concat(withMissingDirectoryList, fs.readdir); + * console.log(results); + * } catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4 does not exist + * } + * } + * + */ +function concat(coll, iteratee, callback) { + return (0, _concatLimit2.default)(coll, Infinity, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(concat, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMapLimit.js b/node_modules/async/flatMapLimit.js new file mode 100644 index 00000000..3d170f17 --- /dev/null +++ b/node_modules/async/flatMapLimit.js @@ -0,0 +1,60 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _mapLimit = require('./mapLimit.js'); + +var _mapLimit2 = _interopRequireDefault(_mapLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. + * + * @name concatLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapLimit + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, + * which should use an array as its result. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatLimit(coll, limit, iteratee, callback) { + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { + _iteratee(val, (err, ...args) => { + if (err) return iterCb(err); + return iterCb(err, args); + }); + }, (err, mapResults) => { + var result = []; + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + result = result.concat(...mapResults[i]); + } + } + + return callback(err, result); + }); +} +exports.default = (0, _awaitify2.default)(concatLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMapSeries.js b/node_modules/async/flatMapSeries.js new file mode 100644 index 00000000..84add3b0 --- /dev/null +++ b/node_modules/async/flatMapSeries.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _concatLimit = require('./concatLimit.js'); + +var _concatLimit2 = _interopRequireDefault(_concatLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. + * + * @name concatSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.concat]{@link module:Collections.concat} + * @category Collection + * @alias flatMapSeries + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. + * The iteratee should complete with an array an array of results. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is an array + * containing the concatenated results of the `iteratee` function. Invoked with + * (err, results). + * @returns A Promise, if no callback is passed + */ +function concatSeries(coll, iteratee, callback) { + return (0, _concatLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(concatSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/foldl.js b/node_modules/async/foldl.js new file mode 100644 index 00000000..56e2db81 --- /dev/null +++ b/node_modules/async/foldl.js @@ -0,0 +1,153 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Reduces `coll` into a single value using an async `iteratee` to return each + * successive step. `memo` is the initial state of the reduction. This function + * only operates in series. + * + * For performance reasons, it may make sense to split a call to this function + * into a parallel map, and then use the normal `Array.prototype.reduce` on the + * results. This function is for situations where each step in the reduction + * needs to be async; if you can get the data before reducing it, then it's + * probably a good idea to do so. + * + * @name reduce + * @static + * @memberOf module:Collections + * @method + * @alias inject + * @alias foldl + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; + * + * // asynchronous function that computes the file size in bytes + * // file size is added to the memoized value, then returned + * function getFileSizeInBytes(memo, file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, memo + stat.size); + * }); + * } + * + * // Using callbacks + * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.reduce(fileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.reduce(fileList, 0, getFileSizeInBytes); + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function reduce(coll, memo, iteratee, callback) { + callback = (0, _once2.default)(callback); + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, err => callback(err, memo)); +} +exports.default = (0, _awaitify2.default)(reduce, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/foldr.js b/node_modules/async/foldr.js new file mode 100644 index 00000000..bee5391d --- /dev/null +++ b/node_modules/async/foldr.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reduceRight; + +var _reduce = require('./reduce.js'); + +var _reduce2 = _interopRequireDefault(_reduce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. + * + * @name reduceRight + * @static + * @memberOf module:Collections + * @method + * @see [async.reduce]{@link module:Collections.reduce} + * @alias foldr + * @category Collection + * @param {Array} array - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function reduceRight(array, memo, iteratee, callback) { + var reversed = [...array].reverse(); + return (0, _reduce2.default)(reversed, memo, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEach.js b/node_modules/async/forEach.js new file mode 100644 index 00000000..405d495c --- /dev/null +++ b/node_modules/async/forEach.js @@ -0,0 +1,129 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _withoutIndex = require('./internal/withoutIndex.js'); + +var _withoutIndex2 = _interopRequireDefault(_withoutIndex); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Applies the function `iteratee` to each item in `coll`, in parallel. + * The `iteratee` is called with an item from the list, and a callback for when + * it has finished. If the `iteratee` passes an error to its `callback`, the + * main `callback` (for the `each` function) is immediately called with the + * error. + * + * Note, that since this function applies `iteratee` to each item in parallel, + * there is no guarantee that the iteratee functions will complete in order. + * + * @name each + * @static + * @memberOf module:Collections + * @method + * @alias forEach + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to + * each item in `coll`. Invoked with (item, callback). + * The array index is not passed to the iteratee. + * If you need the index, use `eachOf`. + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; + * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; + * + * // asynchronous function that deletes a file + * const deleteFile = function(file, callback) { + * fs.unlink(file, callback); + * }; + * + * // Using callbacks + * async.each(fileList, deleteFile, function(err) { + * if( err ) { + * console.log(err); + * } else { + * console.log('All files have been deleted successfully'); + * } + * }); + * + * // Error Handling + * async.each(withMissingFileList, deleteFile, function(err){ + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using Promises + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.each(fileList, deleteFile) + * .then( () => { + * console.log('All files have been deleted successfully'); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * }); + * + * // Using async/await + * async () => { + * try { + * await async.each(files, deleteFile); + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * await async.each(withMissingFileList, deleteFile); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * // since dir4/file2.txt does not exist + * // dir1/file1.txt could have been deleted + * } + * } + * + */ +function eachLimit(coll, iteratee, callback) { + return (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); +} + +exports.default = (0, _awaitify2.default)(eachLimit, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachLimit.js b/node_modules/async/forEachLimit.js new file mode 100644 index 00000000..5f3d0094 --- /dev/null +++ b/node_modules/async/forEachLimit.js @@ -0,0 +1,50 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _withoutIndex = require('./internal/withoutIndex.js'); + +var _withoutIndex2 = _interopRequireDefault(_withoutIndex); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. + * + * @name eachLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfLimit`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachLimit(coll, limit, iteratee, callback) { + return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); +} +exports.default = (0, _awaitify2.default)(eachLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOf.js b/node_modules/async/forEachOf.js new file mode 100644 index 00000000..c22614f3 --- /dev/null +++ b/node_modules/async/forEachOf.js @@ -0,0 +1,185 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _isArrayLike = require('./internal/isArrayLike.js'); + +var _isArrayLike2 = _interopRequireDefault(_isArrayLike); + +var _breakLoop = require('./internal/breakLoop.js'); + +var _breakLoop2 = _interopRequireDefault(_breakLoop); + +var _eachOfLimit = require('./eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// eachOf implementation optimized for array-likes +function eachOfArrayLike(coll, iteratee, callback) { + callback = (0, _once2.default)(callback); + var index = 0, + completed = 0, + { length } = coll, + canceled = false; + if (length === 0) { + callback(null); + } + + function iteratorCallback(err, value) { + if (err === false) { + canceled = true; + } + if (canceled === true) return; + if (err) { + callback(err); + } else if (++completed === length || value === _breakLoop2.default) { + callback(null); + } + } + + for (; index < length; index++) { + iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback)); + } +} + +// a generic version of eachOf which can handle array, object, and iterator cases. +function eachOfGeneric(coll, iteratee, callback) { + return (0, _eachOfLimit2.default)(coll, Infinity, iteratee, callback); +} + +/** + * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument + * to the iteratee. + * + * @name eachOf + * @static + * @memberOf module:Collections + * @method + * @alias forEachOf + * @category Collection + * @see [async.each]{@link module:Collections.each} + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each + * item in `coll`. + * The `key` is the item's key, or index in the case of an array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * // dev.json is a file containing a valid json object config for dev environment + * // dev.json is a file containing a valid json object config for test environment + * // prod.json is a file containing a valid json object config for prod environment + * // invalid.json is a file with a malformed json object + * + * let configs = {}; //global variable + * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; + * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; + * + * // asynchronous function that reads a json file and parses the contents as json object + * function parseFile(file, key, callback) { + * fs.readFile(file, "utf8", function(err, data) { + * if (err) return calback(err); + * try { + * configs[key] = JSON.parse(data); + * } catch (e) { + * return callback(e); + * } + * callback(); + * }); + * } + * + * // Using callbacks + * async.forEachOf(validConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * } else { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { + * if (err) { + * console.error(err); + * // JSON parse error exception + * } else { + * console.log(configs); + * } + * }); + * + * // Using Promises + * async.forEachOf(validConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * }).catch( err => { + * console.error(err); + * }); + * + * //Error handing + * async.forEachOf(invalidConfigFileMap, parseFile) + * .then( () => { + * console.log(configs); + * }).catch( err => { + * console.error(err); + * // JSON parse error exception + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.forEachOf(validConfigFileMap, parseFile); + * console.log(configs); + * // configs is now a map of JSON data, e.g. + * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} + * } + * catch (err) { + * console.log(err); + * } + * } + * + * //Error handing + * async () => { + * try { + * let result = await async.forEachOf(invalidConfigFileMap, parseFile); + * console.log(configs); + * } + * catch (err) { + * console.log(err); + * // JSON parse error exception + * } + * } + * + */ +function eachOf(coll, iteratee, callback) { + var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric; + return eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback); +} + +exports.default = (0, _awaitify2.default)(eachOf, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOfLimit.js b/node_modules/async/forEachOfLimit.js new file mode 100644 index 00000000..e9fc4db8 --- /dev/null +++ b/node_modules/async/forEachOfLimit.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit2 = require('./internal/eachOfLimit.js'); + +var _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a + * time. + * + * @name eachOfLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. The `key` is the item's key, or index in the case of an + * array. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfLimit(coll, limit, iteratee, callback) { + return (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); +} + +exports.default = (0, _awaitify2.default)(eachOfLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOfSeries.js b/node_modules/async/forEachOfSeries.js new file mode 100644 index 00000000..cfb0f33c --- /dev/null +++ b/node_modules/async/forEachOfSeries.js @@ -0,0 +1,39 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit = require('./eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. + * + * @name eachOfSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.eachOf]{@link module:Collections.eachOf} + * @alias forEachOfSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * Invoked with (item, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachOfSeries(coll, iteratee, callback) { + return (0, _eachOfLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(eachOfSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachSeries.js b/node_modules/async/forEachSeries.js new file mode 100644 index 00000000..d674d0c3 --- /dev/null +++ b/node_modules/async/forEachSeries.js @@ -0,0 +1,44 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachLimit = require('./eachLimit.js'); + +var _eachLimit2 = _interopRequireDefault(_eachLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. + * + * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item + * in series and therefore the iteratee functions will complete in order. + + * @name eachSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.each]{@link module:Collections.each} + * @alias forEachSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each + * item in `coll`. + * The array index is not passed to the iteratee. + * If you need the index, use `eachOfSeries`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all + * `iteratee` functions have finished, or an error occurs. Invoked with (err). + * @returns {Promise} a promise, if a callback is omitted + */ +function eachSeries(coll, iteratee, callback) { + return (0, _eachLimit2.default)(coll, 1, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(eachSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forever.js b/node_modules/async/forever.js new file mode 100644 index 00000000..2c8d5b8f --- /dev/null +++ b/node_modules/async/forever.js @@ -0,0 +1,68 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _ensureAsync = require('./ensureAsync.js'); + +var _ensureAsync2 = _interopRequireDefault(_ensureAsync); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Calls the asynchronous function `fn` with a callback parameter that allows it + * to call itself again, in series, indefinitely. + + * If an error is passed to the callback then `errback` is called with the + * error, and execution stops, otherwise it will never be called. + * + * @name forever + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} fn - an async function to call repeatedly. + * Invoked with (next). + * @param {Function} [errback] - when `fn` passes an error to it's callback, + * this function will be called, and execution stops. Invoked with (err). + * @returns {Promise} a promise that rejects if an error occurs and an errback + * is not passed + * @example + * + * async.forever( + * function(next) { + * // next is suitable for passing to things that need a callback(err [, whatever]); + * // it will result in this function being called again. + * }, + * function(err) { + * // if next is called with a value in its first parameter, it will appear + * // in here as 'err', and execution will stop. + * } + * ); + */ +function forever(fn, errback) { + var done = (0, _onlyOnce2.default)(errback); + var task = (0, _wrapAsync2.default)((0, _ensureAsync2.default)(fn)); + + function next(err) { + if (err) return done(err); + if (err === false) return; + task(next); + } + return next(); +} +exports.default = (0, _awaitify2.default)(forever, 2); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupBy.js b/node_modules/async/groupBy.js new file mode 100644 index 00000000..6bb52aaa --- /dev/null +++ b/node_modules/async/groupBy.js @@ -0,0 +1,108 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = groupBy; + +var _groupByLimit = require('./groupByLimit.js'); + +var _groupByLimit2 = _interopRequireDefault(_groupByLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns a new object, where each value corresponds to an array of items, from + * `coll`, that returned the corresponding key. That is, the keys of the object + * correspond to the values passed to the `iteratee` callback. + * + * Note: Since this function applies the `iteratee` to each item in parallel, + * there is no guarantee that the `iteratee` functions will complete in order. + * However, the values for each key in the `result` will be in the same order as + * the original `coll`. For Objects, the values will roughly be in the order of + * the original Objects' keys (but this can vary across JavaScript engines). + * + * @name groupBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * const files = ['dir1/file1.txt','dir2','dir4'] + * + * // asynchronous function that detects file type as none, file, or directory + * function detectFile(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(null, 'none'); + * } + * callback(null, stat.isDirectory() ? 'directory' : 'file'); + * }); + * } + * + * //Using callbacks + * async.groupBy(files, detectFile, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * }); + * + * // Using Promises + * async.groupBy(files, detectFile) + * .then( result => { + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.groupBy(files, detectFile); + * console.log(result); + * // { + * // file: [ 'dir1/file1.txt' ], + * // none: [ 'dir4' ], + * // directory: [ 'dir2'] + * // } + * // result is object containing the files grouped by type + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function groupBy(coll, iteratee, callback) { + return (0, _groupByLimit2.default)(coll, Infinity, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupByLimit.js b/node_modules/async/groupByLimit.js new file mode 100644 index 00000000..5766d6e0 --- /dev/null +++ b/node_modules/async/groupByLimit.js @@ -0,0 +1,71 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _mapLimit = require('./mapLimit.js'); + +var _mapLimit2 = _interopRequireDefault(_mapLimit); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. + * + * @name groupByLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whoses + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ +function groupByLimit(coll, limit, iteratee, callback) { + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { + _iteratee(val, (err, key) => { + if (err) return iterCb(err); + return iterCb(err, { key, val }); + }); + }, (err, mapResults) => { + var result = {}; + // from MDN, handle object having an `hasOwnProperty` prop + var { hasOwnProperty } = Object.prototype; + + for (var i = 0; i < mapResults.length; i++) { + if (mapResults[i]) { + var { key } = mapResults[i]; + var { val } = mapResults[i]; + + if (hasOwnProperty.call(result, key)) { + result[key].push(val); + } else { + result[key] = [val]; + } + } + } + + return callback(err, result); + }); +} + +exports.default = (0, _awaitify2.default)(groupByLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupBySeries.js b/node_modules/async/groupBySeries.js new file mode 100644 index 00000000..60567435 --- /dev/null +++ b/node_modules/async/groupBySeries.js @@ -0,0 +1,36 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = groupBySeries; + +var _groupByLimit = require('./groupByLimit.js'); + +var _groupByLimit2 = _interopRequireDefault(_groupByLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. + * + * @name groupBySeries + * @static + * @memberOf module:Collections + * @method + * @see [async.groupBy]{@link module:Collections.groupBy} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a `key` to group the value under. + * Invoked with (value, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Result is an `Object` whose + * properties are arrays of values which returned the corresponding key. + * @returns {Promise} a promise, if no callback is passed + */ +function groupBySeries(coll, iteratee, callback) { + return (0, _groupByLimit2.default)(coll, 1, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/index.js b/node_modules/async/index.js new file mode 100644 index 00000000..ce647d59 --- /dev/null +++ b/node_modules/async/index.js @@ -0,0 +1,588 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.doDuring = exports.during = exports.wrapSync = undefined; +exports.selectSeries = exports.selectLimit = exports.select = exports.foldr = exports.foldl = exports.inject = exports.forEachOfLimit = exports.forEachOfSeries = exports.forEachOf = exports.forEachLimit = exports.forEachSeries = exports.forEach = exports.flatMapSeries = exports.flatMapLimit = exports.flatMap = exports.findSeries = exports.findLimit = exports.find = exports.anySeries = exports.anyLimit = exports.any = exports.allSeries = exports.allLimit = exports.all = exports.whilst = exports.waterfall = exports.until = exports.unmemoize = exports.tryEach = exports.transform = exports.timesSeries = exports.timesLimit = exports.times = exports.timeout = exports.sortBy = exports.someSeries = exports.someLimit = exports.some = exports.setImmediate = exports.series = exports.seq = exports.retryable = exports.retry = exports.rejectSeries = exports.rejectLimit = exports.reject = exports.reflectAll = exports.reflect = exports.reduceRight = exports.reduce = exports.race = exports.queue = exports.priorityQueue = exports.parallelLimit = exports.parallel = exports.nextTick = exports.memoize = exports.mapValuesSeries = exports.mapValuesLimit = exports.mapValues = exports.mapSeries = exports.mapLimit = exports.map = exports.log = exports.groupBySeries = exports.groupByLimit = exports.groupBy = exports.forever = exports.filterSeries = exports.filterLimit = exports.filter = exports.everySeries = exports.everyLimit = exports.every = exports.ensureAsync = exports.eachSeries = exports.eachOfSeries = exports.eachOfLimit = exports.eachOf = exports.eachLimit = exports.each = exports.doWhilst = exports.doUntil = exports.dir = exports.detectSeries = exports.detectLimit = exports.detect = exports.constant = exports.concatSeries = exports.concatLimit = exports.concat = exports.compose = exports.cargoQueue = exports.cargo = exports.autoInject = exports.auto = exports.asyncify = exports.applyEachSeries = exports.applyEach = exports.apply = undefined; + +var _apply = require('./apply'); + +var _apply2 = _interopRequireDefault(_apply); + +var _applyEach = require('./applyEach'); + +var _applyEach2 = _interopRequireDefault(_applyEach); + +var _applyEachSeries = require('./applyEachSeries'); + +var _applyEachSeries2 = _interopRequireDefault(_applyEachSeries); + +var _asyncify = require('./asyncify'); + +var _asyncify2 = _interopRequireDefault(_asyncify); + +var _auto = require('./auto'); + +var _auto2 = _interopRequireDefault(_auto); + +var _autoInject = require('./autoInject'); + +var _autoInject2 = _interopRequireDefault(_autoInject); + +var _cargo = require('./cargo'); + +var _cargo2 = _interopRequireDefault(_cargo); + +var _cargoQueue = require('./cargoQueue'); + +var _cargoQueue2 = _interopRequireDefault(_cargoQueue); + +var _compose = require('./compose'); + +var _compose2 = _interopRequireDefault(_compose); + +var _concat = require('./concat'); + +var _concat2 = _interopRequireDefault(_concat); + +var _concatLimit = require('./concatLimit'); + +var _concatLimit2 = _interopRequireDefault(_concatLimit); + +var _concatSeries = require('./concatSeries'); + +var _concatSeries2 = _interopRequireDefault(_concatSeries); + +var _constant = require('./constant'); + +var _constant2 = _interopRequireDefault(_constant); + +var _detect = require('./detect'); + +var _detect2 = _interopRequireDefault(_detect); + +var _detectLimit = require('./detectLimit'); + +var _detectLimit2 = _interopRequireDefault(_detectLimit); + +var _detectSeries = require('./detectSeries'); + +var _detectSeries2 = _interopRequireDefault(_detectSeries); + +var _dir = require('./dir'); + +var _dir2 = _interopRequireDefault(_dir); + +var _doUntil = require('./doUntil'); + +var _doUntil2 = _interopRequireDefault(_doUntil); + +var _doWhilst = require('./doWhilst'); + +var _doWhilst2 = _interopRequireDefault(_doWhilst); + +var _each = require('./each'); + +var _each2 = _interopRequireDefault(_each); + +var _eachLimit = require('./eachLimit'); + +var _eachLimit2 = _interopRequireDefault(_eachLimit); + +var _eachOf = require('./eachOf'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _eachOfLimit = require('./eachOfLimit'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _eachOfSeries = require('./eachOfSeries'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _eachSeries = require('./eachSeries'); + +var _eachSeries2 = _interopRequireDefault(_eachSeries); + +var _ensureAsync = require('./ensureAsync'); + +var _ensureAsync2 = _interopRequireDefault(_ensureAsync); + +var _every = require('./every'); + +var _every2 = _interopRequireDefault(_every); + +var _everyLimit = require('./everyLimit'); + +var _everyLimit2 = _interopRequireDefault(_everyLimit); + +var _everySeries = require('./everySeries'); + +var _everySeries2 = _interopRequireDefault(_everySeries); + +var _filter = require('./filter'); + +var _filter2 = _interopRequireDefault(_filter); + +var _filterLimit = require('./filterLimit'); + +var _filterLimit2 = _interopRequireDefault(_filterLimit); + +var _filterSeries = require('./filterSeries'); + +var _filterSeries2 = _interopRequireDefault(_filterSeries); + +var _forever = require('./forever'); + +var _forever2 = _interopRequireDefault(_forever); + +var _groupBy = require('./groupBy'); + +var _groupBy2 = _interopRequireDefault(_groupBy); + +var _groupByLimit = require('./groupByLimit'); + +var _groupByLimit2 = _interopRequireDefault(_groupByLimit); + +var _groupBySeries = require('./groupBySeries'); + +var _groupBySeries2 = _interopRequireDefault(_groupBySeries); + +var _log = require('./log'); + +var _log2 = _interopRequireDefault(_log); + +var _map = require('./map'); + +var _map2 = _interopRequireDefault(_map); + +var _mapLimit = require('./mapLimit'); + +var _mapLimit2 = _interopRequireDefault(_mapLimit); + +var _mapSeries = require('./mapSeries'); + +var _mapSeries2 = _interopRequireDefault(_mapSeries); + +var _mapValues = require('./mapValues'); + +var _mapValues2 = _interopRequireDefault(_mapValues); + +var _mapValuesLimit = require('./mapValuesLimit'); + +var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); + +var _mapValuesSeries = require('./mapValuesSeries'); + +var _mapValuesSeries2 = _interopRequireDefault(_mapValuesSeries); + +var _memoize = require('./memoize'); + +var _memoize2 = _interopRequireDefault(_memoize); + +var _nextTick = require('./nextTick'); + +var _nextTick2 = _interopRequireDefault(_nextTick); + +var _parallel = require('./parallel'); + +var _parallel2 = _interopRequireDefault(_parallel); + +var _parallelLimit = require('./parallelLimit'); + +var _parallelLimit2 = _interopRequireDefault(_parallelLimit); + +var _priorityQueue = require('./priorityQueue'); + +var _priorityQueue2 = _interopRequireDefault(_priorityQueue); + +var _queue = require('./queue'); + +var _queue2 = _interopRequireDefault(_queue); + +var _race = require('./race'); + +var _race2 = _interopRequireDefault(_race); + +var _reduce = require('./reduce'); + +var _reduce2 = _interopRequireDefault(_reduce); + +var _reduceRight = require('./reduceRight'); + +var _reduceRight2 = _interopRequireDefault(_reduceRight); + +var _reflect = require('./reflect'); + +var _reflect2 = _interopRequireDefault(_reflect); + +var _reflectAll = require('./reflectAll'); + +var _reflectAll2 = _interopRequireDefault(_reflectAll); + +var _reject = require('./reject'); + +var _reject2 = _interopRequireDefault(_reject); + +var _rejectLimit = require('./rejectLimit'); + +var _rejectLimit2 = _interopRequireDefault(_rejectLimit); + +var _rejectSeries = require('./rejectSeries'); + +var _rejectSeries2 = _interopRequireDefault(_rejectSeries); + +var _retry = require('./retry'); + +var _retry2 = _interopRequireDefault(_retry); + +var _retryable = require('./retryable'); + +var _retryable2 = _interopRequireDefault(_retryable); + +var _seq = require('./seq'); + +var _seq2 = _interopRequireDefault(_seq); + +var _series = require('./series'); + +var _series2 = _interopRequireDefault(_series); + +var _setImmediate = require('./setImmediate'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _some = require('./some'); + +var _some2 = _interopRequireDefault(_some); + +var _someLimit = require('./someLimit'); + +var _someLimit2 = _interopRequireDefault(_someLimit); + +var _someSeries = require('./someSeries'); + +var _someSeries2 = _interopRequireDefault(_someSeries); + +var _sortBy = require('./sortBy'); + +var _sortBy2 = _interopRequireDefault(_sortBy); + +var _timeout = require('./timeout'); + +var _timeout2 = _interopRequireDefault(_timeout); + +var _times = require('./times'); + +var _times2 = _interopRequireDefault(_times); + +var _timesLimit = require('./timesLimit'); + +var _timesLimit2 = _interopRequireDefault(_timesLimit); + +var _timesSeries = require('./timesSeries'); + +var _timesSeries2 = _interopRequireDefault(_timesSeries); + +var _transform = require('./transform'); + +var _transform2 = _interopRequireDefault(_transform); + +var _tryEach = require('./tryEach'); + +var _tryEach2 = _interopRequireDefault(_tryEach); + +var _unmemoize = require('./unmemoize'); + +var _unmemoize2 = _interopRequireDefault(_unmemoize); + +var _until = require('./until'); + +var _until2 = _interopRequireDefault(_until); + +var _waterfall = require('./waterfall'); + +var _waterfall2 = _interopRequireDefault(_waterfall); + +var _whilst = require('./whilst'); + +var _whilst2 = _interopRequireDefault(_whilst); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * An "async function" in the context of Async is an asynchronous function with + * a variable number of parameters, with the final parameter being a callback. + * (`function (arg1, arg2, ..., callback) {}`) + * The final callback is of the form `callback(err, results...)`, which must be + * called once the function is completed. The callback should be called with a + * Error as its first argument to signal that an error occurred. + * Otherwise, if no error occurred, it should be called with `null` as the first + * argument, and any additional `result` arguments that may apply, to signal + * successful completion. + * The callback must be called exactly once, ideally on a later tick of the + * JavaScript event loop. + * + * This type of function is also referred to as a "Node-style async function", + * or a "continuation passing-style function" (CPS). Most of the methods of this + * library are themselves CPS/Node-style async functions, or functions that + * return CPS/Node-style async functions. + * + * Wherever we accept a Node-style async function, we also directly accept an + * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. + * In this case, the `async` function will not be passed a final callback + * argument, and any thrown error will be used as the `err` argument of the + * implicit callback, and the return value will be used as the `result` value. + * (i.e. a `rejected` of the returned Promise becomes the `err` callback + * argument, and a `resolved` value becomes the `result`.) + * + * Note, due to JavaScript limitations, we can only detect native `async` + * functions and not transpilied implementations. + * Your environment must have `async`/`await` support for this to work. + * (e.g. Node > v7.6, or a recent version of a modern browser). + * If you are using `async` functions through a transpiler (e.g. Babel), you + * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, + * because the `async function` will be compiled to an ordinary function that + * returns a promise. + * + * @typedef {Function} AsyncFunction + * @static + */ + +/** + * Async is a utility module which provides straight-forward, powerful functions + * for working with asynchronous JavaScript. Although originally designed for + * use with [Node.js](http://nodejs.org) and installable via + * `npm install --save async`, it can also be used directly in the browser. + * @module async + * @see AsyncFunction + */ + +/** + * A collection of `async` functions for manipulating collections, such as + * arrays and objects. + * @module Collections + */ + +/** + * A collection of `async` functions for controlling the flow through a script. + * @module ControlFlow + */ + +/** + * A collection of `async` utility functions. + * @module Utils + */ + +exports.default = { + apply: _apply2.default, + applyEach: _applyEach2.default, + applyEachSeries: _applyEachSeries2.default, + asyncify: _asyncify2.default, + auto: _auto2.default, + autoInject: _autoInject2.default, + cargo: _cargo2.default, + cargoQueue: _cargoQueue2.default, + compose: _compose2.default, + concat: _concat2.default, + concatLimit: _concatLimit2.default, + concatSeries: _concatSeries2.default, + constant: _constant2.default, + detect: _detect2.default, + detectLimit: _detectLimit2.default, + detectSeries: _detectSeries2.default, + dir: _dir2.default, + doUntil: _doUntil2.default, + doWhilst: _doWhilst2.default, + each: _each2.default, + eachLimit: _eachLimit2.default, + eachOf: _eachOf2.default, + eachOfLimit: _eachOfLimit2.default, + eachOfSeries: _eachOfSeries2.default, + eachSeries: _eachSeries2.default, + ensureAsync: _ensureAsync2.default, + every: _every2.default, + everyLimit: _everyLimit2.default, + everySeries: _everySeries2.default, + filter: _filter2.default, + filterLimit: _filterLimit2.default, + filterSeries: _filterSeries2.default, + forever: _forever2.default, + groupBy: _groupBy2.default, + groupByLimit: _groupByLimit2.default, + groupBySeries: _groupBySeries2.default, + log: _log2.default, + map: _map2.default, + mapLimit: _mapLimit2.default, + mapSeries: _mapSeries2.default, + mapValues: _mapValues2.default, + mapValuesLimit: _mapValuesLimit2.default, + mapValuesSeries: _mapValuesSeries2.default, + memoize: _memoize2.default, + nextTick: _nextTick2.default, + parallel: _parallel2.default, + parallelLimit: _parallelLimit2.default, + priorityQueue: _priorityQueue2.default, + queue: _queue2.default, + race: _race2.default, + reduce: _reduce2.default, + reduceRight: _reduceRight2.default, + reflect: _reflect2.default, + reflectAll: _reflectAll2.default, + reject: _reject2.default, + rejectLimit: _rejectLimit2.default, + rejectSeries: _rejectSeries2.default, + retry: _retry2.default, + retryable: _retryable2.default, + seq: _seq2.default, + series: _series2.default, + setImmediate: _setImmediate2.default, + some: _some2.default, + someLimit: _someLimit2.default, + someSeries: _someSeries2.default, + sortBy: _sortBy2.default, + timeout: _timeout2.default, + times: _times2.default, + timesLimit: _timesLimit2.default, + timesSeries: _timesSeries2.default, + transform: _transform2.default, + tryEach: _tryEach2.default, + unmemoize: _unmemoize2.default, + until: _until2.default, + waterfall: _waterfall2.default, + whilst: _whilst2.default, + + // aliases + all: _every2.default, + allLimit: _everyLimit2.default, + allSeries: _everySeries2.default, + any: _some2.default, + anyLimit: _someLimit2.default, + anySeries: _someSeries2.default, + find: _detect2.default, + findLimit: _detectLimit2.default, + findSeries: _detectSeries2.default, + flatMap: _concat2.default, + flatMapLimit: _concatLimit2.default, + flatMapSeries: _concatSeries2.default, + forEach: _each2.default, + forEachSeries: _eachSeries2.default, + forEachLimit: _eachLimit2.default, + forEachOf: _eachOf2.default, + forEachOfSeries: _eachOfSeries2.default, + forEachOfLimit: _eachOfLimit2.default, + inject: _reduce2.default, + foldl: _reduce2.default, + foldr: _reduceRight2.default, + select: _filter2.default, + selectLimit: _filterLimit2.default, + selectSeries: _filterSeries2.default, + wrapSync: _asyncify2.default, + during: _whilst2.default, + doDuring: _doWhilst2.default +}; +exports.apply = _apply2.default; +exports.applyEach = _applyEach2.default; +exports.applyEachSeries = _applyEachSeries2.default; +exports.asyncify = _asyncify2.default; +exports.auto = _auto2.default; +exports.autoInject = _autoInject2.default; +exports.cargo = _cargo2.default; +exports.cargoQueue = _cargoQueue2.default; +exports.compose = _compose2.default; +exports.concat = _concat2.default; +exports.concatLimit = _concatLimit2.default; +exports.concatSeries = _concatSeries2.default; +exports.constant = _constant2.default; +exports.detect = _detect2.default; +exports.detectLimit = _detectLimit2.default; +exports.detectSeries = _detectSeries2.default; +exports.dir = _dir2.default; +exports.doUntil = _doUntil2.default; +exports.doWhilst = _doWhilst2.default; +exports.each = _each2.default; +exports.eachLimit = _eachLimit2.default; +exports.eachOf = _eachOf2.default; +exports.eachOfLimit = _eachOfLimit2.default; +exports.eachOfSeries = _eachOfSeries2.default; +exports.eachSeries = _eachSeries2.default; +exports.ensureAsync = _ensureAsync2.default; +exports.every = _every2.default; +exports.everyLimit = _everyLimit2.default; +exports.everySeries = _everySeries2.default; +exports.filter = _filter2.default; +exports.filterLimit = _filterLimit2.default; +exports.filterSeries = _filterSeries2.default; +exports.forever = _forever2.default; +exports.groupBy = _groupBy2.default; +exports.groupByLimit = _groupByLimit2.default; +exports.groupBySeries = _groupBySeries2.default; +exports.log = _log2.default; +exports.map = _map2.default; +exports.mapLimit = _mapLimit2.default; +exports.mapSeries = _mapSeries2.default; +exports.mapValues = _mapValues2.default; +exports.mapValuesLimit = _mapValuesLimit2.default; +exports.mapValuesSeries = _mapValuesSeries2.default; +exports.memoize = _memoize2.default; +exports.nextTick = _nextTick2.default; +exports.parallel = _parallel2.default; +exports.parallelLimit = _parallelLimit2.default; +exports.priorityQueue = _priorityQueue2.default; +exports.queue = _queue2.default; +exports.race = _race2.default; +exports.reduce = _reduce2.default; +exports.reduceRight = _reduceRight2.default; +exports.reflect = _reflect2.default; +exports.reflectAll = _reflectAll2.default; +exports.reject = _reject2.default; +exports.rejectLimit = _rejectLimit2.default; +exports.rejectSeries = _rejectSeries2.default; +exports.retry = _retry2.default; +exports.retryable = _retryable2.default; +exports.seq = _seq2.default; +exports.series = _series2.default; +exports.setImmediate = _setImmediate2.default; +exports.some = _some2.default; +exports.someLimit = _someLimit2.default; +exports.someSeries = _someSeries2.default; +exports.sortBy = _sortBy2.default; +exports.timeout = _timeout2.default; +exports.times = _times2.default; +exports.timesLimit = _timesLimit2.default; +exports.timesSeries = _timesSeries2.default; +exports.transform = _transform2.default; +exports.tryEach = _tryEach2.default; +exports.unmemoize = _unmemoize2.default; +exports.until = _until2.default; +exports.waterfall = _waterfall2.default; +exports.whilst = _whilst2.default; +exports.all = _every2.default; +exports.allLimit = _everyLimit2.default; +exports.allSeries = _everySeries2.default; +exports.any = _some2.default; +exports.anyLimit = _someLimit2.default; +exports.anySeries = _someSeries2.default; +exports.find = _detect2.default; +exports.findLimit = _detectLimit2.default; +exports.findSeries = _detectSeries2.default; +exports.flatMap = _concat2.default; +exports.flatMapLimit = _concatLimit2.default; +exports.flatMapSeries = _concatSeries2.default; +exports.forEach = _each2.default; +exports.forEachSeries = _eachSeries2.default; +exports.forEachLimit = _eachLimit2.default; +exports.forEachOf = _eachOf2.default; +exports.forEachOfSeries = _eachOfSeries2.default; +exports.forEachOfLimit = _eachOfLimit2.default; +exports.inject = _reduce2.default; +exports.foldl = _reduce2.default; +exports.foldr = _reduceRight2.default; +exports.select = _filter2.default; +exports.selectLimit = _filterLimit2.default; +exports.selectSeries = _filterSeries2.default; +exports.wrapSync = _asyncify2.default; +exports.during = _whilst2.default; +exports.doDuring = _doWhilst2.default; \ No newline at end of file diff --git a/node_modules/async/inject.js b/node_modules/async/inject.js new file mode 100644 index 00000000..56e2db81 --- /dev/null +++ b/node_modules/async/inject.js @@ -0,0 +1,153 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Reduces `coll` into a single value using an async `iteratee` to return each + * successive step. `memo` is the initial state of the reduction. This function + * only operates in series. + * + * For performance reasons, it may make sense to split a call to this function + * into a parallel map, and then use the normal `Array.prototype.reduce` on the + * results. This function is for situations where each step in the reduction + * needs to be async; if you can get the data before reducing it, then it's + * probably a good idea to do so. + * + * @name reduce + * @static + * @memberOf module:Collections + * @method + * @alias inject + * @alias foldl + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; + * + * // asynchronous function that computes the file size in bytes + * // file size is added to the memoized value, then returned + * function getFileSizeInBytes(memo, file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, memo + stat.size); + * }); + * } + * + * // Using callbacks + * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.reduce(fileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.reduce(fileList, 0, getFileSizeInBytes); + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function reduce(coll, memo, iteratee, callback) { + callback = (0, _once2.default)(callback); + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, err => callback(err, memo)); +} +exports.default = (0, _awaitify2.default)(reduce, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/DoublyLinkedList.js b/node_modules/async/internal/DoublyLinkedList.js new file mode 100644 index 00000000..cd11c3b3 --- /dev/null +++ b/node_modules/async/internal/DoublyLinkedList.js @@ -0,0 +1,92 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation +// used for queues. This implementation assumes that the node provided by the user can be modified +// to adjust the next and last properties. We implement only the minimal functionality +// for queue support. +class DLL { + constructor() { + this.head = this.tail = null; + this.length = 0; + } + + removeLink(node) { + if (node.prev) node.prev.next = node.next;else this.head = node.next; + if (node.next) node.next.prev = node.prev;else this.tail = node.prev; + + node.prev = node.next = null; + this.length -= 1; + return node; + } + + empty() { + while (this.head) this.shift(); + return this; + } + + insertAfter(node, newNode) { + newNode.prev = node; + newNode.next = node.next; + if (node.next) node.next.prev = newNode;else this.tail = newNode; + node.next = newNode; + this.length += 1; + } + + insertBefore(node, newNode) { + newNode.prev = node.prev; + newNode.next = node; + if (node.prev) node.prev.next = newNode;else this.head = newNode; + node.prev = newNode; + this.length += 1; + } + + unshift(node) { + if (this.head) this.insertBefore(this.head, node);else setInitial(this, node); + } + + push(node) { + if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node); + } + + shift() { + return this.head && this.removeLink(this.head); + } + + pop() { + return this.tail && this.removeLink(this.tail); + } + + toArray() { + return [...this]; + } + + *[Symbol.iterator]() { + var cur = this.head; + while (cur) { + yield cur.data; + cur = cur.next; + } + } + + remove(testFn) { + var curr = this.head; + while (curr) { + var { next } = curr; + if (testFn(curr)) { + this.removeLink(curr); + } + curr = next; + } + return this; + } +} + +exports.default = DLL; +function setInitial(dll, node) { + dll.length = 1; + dll.head = dll.tail = node; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/Heap.js b/node_modules/async/internal/Heap.js new file mode 100644 index 00000000..80762fe0 --- /dev/null +++ b/node_modules/async/internal/Heap.js @@ -0,0 +1,120 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// Binary min-heap implementation used for priority queue. +// Implementation is stable, i.e. push time is considered for equal priorities +class Heap { + constructor() { + this.heap = []; + this.pushCount = Number.MIN_SAFE_INTEGER; + } + + get length() { + return this.heap.length; + } + + empty() { + this.heap = []; + return this; + } + + percUp(index) { + let p; + + while (index > 0 && smaller(this.heap[index], this.heap[p = parent(index)])) { + let t = this.heap[index]; + this.heap[index] = this.heap[p]; + this.heap[p] = t; + + index = p; + } + } + + percDown(index) { + let l; + + while ((l = leftChi(index)) < this.heap.length) { + if (l + 1 < this.heap.length && smaller(this.heap[l + 1], this.heap[l])) { + l = l + 1; + } + + if (smaller(this.heap[index], this.heap[l])) { + break; + } + + let t = this.heap[index]; + this.heap[index] = this.heap[l]; + this.heap[l] = t; + + index = l; + } + } + + push(node) { + node.pushCount = ++this.pushCount; + this.heap.push(node); + this.percUp(this.heap.length - 1); + } + + unshift(node) { + return this.heap.push(node); + } + + shift() { + let [top] = this.heap; + + this.heap[0] = this.heap[this.heap.length - 1]; + this.heap.pop(); + this.percDown(0); + + return top; + } + + toArray() { + return [...this]; + } + + *[Symbol.iterator]() { + for (let i = 0; i < this.heap.length; i++) { + yield this.heap[i].data; + } + } + + remove(testFn) { + let j = 0; + for (let i = 0; i < this.heap.length; i++) { + if (!testFn(this.heap[i])) { + this.heap[j] = this.heap[i]; + j++; + } + } + + this.heap.splice(j); + + for (let i = parent(this.heap.length - 1); i >= 0; i--) { + this.percDown(i); + } + + return this; + } +} + +exports.default = Heap; +function leftChi(i) { + return (i << 1) + 1; +} + +function parent(i) { + return (i + 1 >> 1) - 1; +} + +function smaller(x, y) { + if (x.priority !== y.priority) { + return x.priority < y.priority; + } else { + return x.pushCount < y.pushCount; + } +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/applyEach.js b/node_modules/async/internal/applyEach.js new file mode 100644 index 00000000..a3f4ef1d --- /dev/null +++ b/node_modules/async/internal/applyEach.js @@ -0,0 +1,29 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (eachfn) { + return function applyEach(fns, ...callArgs) { + const go = (0, _awaitify2.default)(function (callback) { + var that = this; + return eachfn(fns, (fn, cb) => { + (0, _wrapAsync2.default)(fn).apply(that, callArgs.concat(cb)); + }, callback); + }); + return go; + }; +}; + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/asyncEachOfLimit.js b/node_modules/async/internal/asyncEachOfLimit.js new file mode 100644 index 00000000..bba74c7c --- /dev/null +++ b/node_modules/async/internal/asyncEachOfLimit.js @@ -0,0 +1,75 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = asyncEachOfLimit; + +var _breakLoop = require('./breakLoop.js'); + +var _breakLoop2 = _interopRequireDefault(_breakLoop); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// for async generators +function asyncEachOfLimit(generator, limit, iteratee, callback) { + let done = false; + let canceled = false; + let awaiting = false; + let running = 0; + let idx = 0; + + function replenish() { + //console.log('replenish') + if (running >= limit || awaiting || done) return; + //console.log('replenish awaiting') + awaiting = true; + generator.next().then(({ value, done: iterDone }) => { + //console.log('got value', value) + if (canceled || done) return; + awaiting = false; + if (iterDone) { + done = true; + if (running <= 0) { + //console.log('done nextCb') + callback(null); + } + return; + } + running++; + iteratee(value, idx, iterateeCallback); + idx++; + replenish(); + }).catch(handleError); + } + + function iterateeCallback(err, result) { + //console.log('iterateeCallback') + running -= 1; + if (canceled) return; + if (err) return handleError(err); + + if (err === false) { + done = true; + canceled = true; + return; + } + + if (result === _breakLoop2.default || done && running <= 0) { + done = true; + //console.log('done iterCb') + return callback(null); + } + replenish(); + } + + function handleError(err) { + if (canceled) return; + awaiting = false; + done = true; + callback(err); + } + + replenish(); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/awaitify.js b/node_modules/async/internal/awaitify.js new file mode 100644 index 00000000..7b36f1ac --- /dev/null +++ b/node_modules/async/internal/awaitify.js @@ -0,0 +1,27 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = awaitify; +// conditionally promisify a function. +// only return a promise if a callback is omitted +function awaitify(asyncFn, arity = asyncFn.length) { + if (!arity) throw new Error('arity is undefined'); + function awaitable(...args) { + if (typeof args[arity - 1] === 'function') { + return asyncFn.apply(this, args); + } + + return new Promise((resolve, reject) => { + args[arity - 1] = (err, ...cbArgs) => { + if (err) return reject(err); + resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); + }; + asyncFn.apply(this, args); + }); + } + + return awaitable; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/breakLoop.js b/node_modules/async/internal/breakLoop.js new file mode 100644 index 00000000..8245e553 --- /dev/null +++ b/node_modules/async/internal/breakLoop.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// A temporary value used to identify if the loop should be broken. +// See #1064, #1293 +const breakLoop = {}; +exports.default = breakLoop; +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/consoleFunc.js b/node_modules/async/internal/consoleFunc.js new file mode 100644 index 00000000..70347a5d --- /dev/null +++ b/node_modules/async/internal/consoleFunc.js @@ -0,0 +1,31 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = consoleFunc; + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function consoleFunc(name) { + return (fn, ...args) => (0, _wrapAsync2.default)(fn)(...args, (err, ...resultArgs) => { + /* istanbul ignore else */ + if (typeof console === 'object') { + /* istanbul ignore else */ + if (err) { + /* istanbul ignore else */ + if (console.error) { + console.error(err); + } + } else if (console[name]) { + /* istanbul ignore else */ + resultArgs.forEach(x => console[name](x)); + } + } + }); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/createTester.js b/node_modules/async/internal/createTester.js new file mode 100644 index 00000000..7b2d7346 --- /dev/null +++ b/node_modules/async/internal/createTester.js @@ -0,0 +1,40 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _createTester; + +var _breakLoop = require('./breakLoop.js'); + +var _breakLoop2 = _interopRequireDefault(_breakLoop); + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _createTester(check, getResult) { + return (eachfn, arr, _iteratee, cb) => { + var testPassed = false; + var testResult; + const iteratee = (0, _wrapAsync2.default)(_iteratee); + eachfn(arr, (value, _, callback) => { + iteratee(value, (err, result) => { + if (err || err === false) return callback(err); + + if (check(result) && !testResult) { + testPassed = true; + testResult = getResult(true, value); + return callback(null, _breakLoop2.default); + } + callback(); + }); + }, err => { + if (err) return cb(err); + cb(null, testPassed ? testResult : getResult(false)); + }); + }; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/eachOfLimit.js b/node_modules/async/internal/eachOfLimit.js new file mode 100644 index 00000000..fc26b20f --- /dev/null +++ b/node_modules/async/internal/eachOfLimit.js @@ -0,0 +1,90 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _once = require('./once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _iterator = require('./iterator.js'); + +var _iterator2 = _interopRequireDefault(_iterator); + +var _onlyOnce = require('./onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./wrapAsync.js'); + +var _asyncEachOfLimit = require('./asyncEachOfLimit.js'); + +var _asyncEachOfLimit2 = _interopRequireDefault(_asyncEachOfLimit); + +var _breakLoop = require('./breakLoop.js'); + +var _breakLoop2 = _interopRequireDefault(_breakLoop); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = limit => { + return (obj, iteratee, callback) => { + callback = (0, _once2.default)(callback); + if (limit <= 0) { + throw new RangeError('concurrency limit cannot be less than 1'); + } + if (!obj) { + return callback(null); + } + if ((0, _wrapAsync.isAsyncGenerator)(obj)) { + return (0, _asyncEachOfLimit2.default)(obj, limit, iteratee, callback); + } + if ((0, _wrapAsync.isAsyncIterable)(obj)) { + return (0, _asyncEachOfLimit2.default)(obj[Symbol.asyncIterator](), limit, iteratee, callback); + } + var nextElem = (0, _iterator2.default)(obj); + var done = false; + var canceled = false; + var running = 0; + var looping = false; + + function iterateeCallback(err, value) { + if (canceled) return; + running -= 1; + if (err) { + done = true; + callback(err); + } else if (err === false) { + done = true; + canceled = true; + } else if (value === _breakLoop2.default || done && running <= 0) { + done = true; + return callback(null); + } else if (!looping) { + replenish(); + } + } + + function replenish() { + looping = true; + while (running < limit && !done) { + var elem = nextElem(); + if (elem === null) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running += 1; + iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback)); + } + looping = false; + } + + replenish(); + }; +}; + +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/filter.js b/node_modules/async/internal/filter.js new file mode 100644 index 00000000..aef2b9d2 --- /dev/null +++ b/node_modules/async/internal/filter.js @@ -0,0 +1,55 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _filter; + +var _isArrayLike = require('./isArrayLike.js'); + +var _isArrayLike2 = _interopRequireDefault(_isArrayLike); + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function filterArray(eachfn, arr, iteratee, callback) { + var truthValues = new Array(arr.length); + eachfn(arr, (x, index, iterCb) => { + iteratee(x, (err, v) => { + truthValues[index] = !!v; + iterCb(err); + }); + }, err => { + if (err) return callback(err); + var results = []; + for (var i = 0; i < arr.length; i++) { + if (truthValues[i]) results.push(arr[i]); + } + callback(null, results); + }); +} + +function filterGeneric(eachfn, coll, iteratee, callback) { + var results = []; + eachfn(coll, (x, index, iterCb) => { + iteratee(x, (err, v) => { + if (err) return iterCb(err); + if (v) { + results.push({ index, value: x }); + } + iterCb(err); + }); + }, err => { + if (err) return callback(err); + callback(null, results.sort((a, b) => a.index - b.index).map(v => v.value)); + }); +} + +function _filter(eachfn, coll, iteratee, callback) { + var filter = (0, _isArrayLike2.default)(coll) ? filterArray : filterGeneric; + return filter(eachfn, coll, (0, _wrapAsync2.default)(iteratee), callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/getIterator.js b/node_modules/async/internal/getIterator.js new file mode 100644 index 00000000..830a5452 --- /dev/null +++ b/node_modules/async/internal/getIterator.js @@ -0,0 +1,11 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (coll) { + return coll[Symbol.iterator] && coll[Symbol.iterator](); +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/initialParams.js b/node_modules/async/internal/initialParams.js new file mode 100644 index 00000000..245378cf --- /dev/null +++ b/node_modules/async/internal/initialParams.js @@ -0,0 +1,14 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (fn) { + return function (...args /*, callback*/) { + var callback = args.pop(); + return fn.call(this, args, callback); + }; +}; + +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/isArrayLike.js b/node_modules/async/internal/isArrayLike.js new file mode 100644 index 00000000..ce076704 --- /dev/null +++ b/node_modules/async/internal/isArrayLike.js @@ -0,0 +1,10 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = isArrayLike; +function isArrayLike(value) { + return value && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/iterator.js b/node_modules/async/internal/iterator.js new file mode 100644 index 00000000..90b0223b --- /dev/null +++ b/node_modules/async/internal/iterator.js @@ -0,0 +1,57 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = createIterator; + +var _isArrayLike = require('./isArrayLike.js'); + +var _isArrayLike2 = _interopRequireDefault(_isArrayLike); + +var _getIterator = require('./getIterator.js'); + +var _getIterator2 = _interopRequireDefault(_getIterator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function createArrayIterator(coll) { + var i = -1; + var len = coll.length; + return function next() { + return ++i < len ? { value: coll[i], key: i } : null; + }; +} + +function createES2015Iterator(iterator) { + var i = -1; + return function next() { + var item = iterator.next(); + if (item.done) return null; + i++; + return { value: item.value, key: i }; + }; +} + +function createObjectIterator(obj) { + var okeys = obj ? Object.keys(obj) : []; + var i = -1; + var len = okeys.length; + return function next() { + var key = okeys[++i]; + if (key === '__proto__') { + return next(); + } + return i < len ? { value: obj[key], key } : null; + }; +} + +function createIterator(coll) { + if ((0, _isArrayLike2.default)(coll)) { + return createArrayIterator(coll); + } + + var iterator = (0, _getIterator2.default)(coll); + return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/map.js b/node_modules/async/internal/map.js new file mode 100644 index 00000000..af3fd098 --- /dev/null +++ b/node_modules/async/internal/map.js @@ -0,0 +1,30 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _asyncMap; + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _asyncMap(eachfn, arr, iteratee, callback) { + arr = arr || []; + var results = []; + var counter = 0; + var _iteratee = (0, _wrapAsync2.default)(iteratee); + + return eachfn(arr, (value, _, iterCb) => { + var index = counter++; + _iteratee(value, (err, v) => { + results[index] = v; + iterCb(err); + }); + }, err => { + callback(err, results); + }); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/once.js b/node_modules/async/internal/once.js new file mode 100644 index 00000000..49f37270 --- /dev/null +++ b/node_modules/async/internal/once.js @@ -0,0 +1,17 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = once; +function once(fn) { + function wrapper(...args) { + if (fn === null) return; + var callFn = fn; + fn = null; + callFn.apply(this, args); + } + Object.assign(wrapper, fn); + return wrapper; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/onlyOnce.js b/node_modules/async/internal/onlyOnce.js new file mode 100644 index 00000000..6ad721bd --- /dev/null +++ b/node_modules/async/internal/onlyOnce.js @@ -0,0 +1,15 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = onlyOnce; +function onlyOnce(fn) { + return function (...args) { + if (fn === null) throw new Error("Callback was already called."); + var callFn = fn; + fn = null; + callFn.apply(this, args); + }; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/parallel.js b/node_modules/async/internal/parallel.js new file mode 100644 index 00000000..75741bba --- /dev/null +++ b/node_modules/async/internal/parallel.js @@ -0,0 +1,34 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _isArrayLike = require('./isArrayLike.js'); + +var _isArrayLike2 = _interopRequireDefault(_isArrayLike); + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = (0, _awaitify2.default)((eachfn, tasks, callback) => { + var results = (0, _isArrayLike2.default)(tasks) ? [] : {}; + + eachfn(tasks, (task, key, taskCb) => { + (0, _wrapAsync2.default)(task)((err, ...result) => { + if (result.length < 2) { + [result] = result; + } + results[key] = result; + taskCb(err); + }); + }, err => callback(err, results)); +}, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/promiseCallback.js b/node_modules/async/internal/promiseCallback.js new file mode 100644 index 00000000..17a83016 --- /dev/null +++ b/node_modules/async/internal/promiseCallback.js @@ -0,0 +1,23 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +const PROMISE_SYMBOL = Symbol('promiseCallback'); + +function promiseCallback() { + let resolve, reject; + function callback(err, ...args) { + if (err) return reject(err); + resolve(args.length > 1 ? args : args[0]); + } + + callback[PROMISE_SYMBOL] = new Promise((res, rej) => { + resolve = res, reject = rej; + }); + + return callback; +} + +exports.promiseCallback = promiseCallback; +exports.PROMISE_SYMBOL = PROMISE_SYMBOL; \ No newline at end of file diff --git a/node_modules/async/internal/queue.js b/node_modules/async/internal/queue.js new file mode 100644 index 00000000..cbc590d0 --- /dev/null +++ b/node_modules/async/internal/queue.js @@ -0,0 +1,294 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = queue; + +var _onlyOnce = require('./onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _setImmediate = require('./setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _DoublyLinkedList = require('./DoublyLinkedList.js'); + +var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList); + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function queue(worker, concurrency, payload) { + if (concurrency == null) { + concurrency = 1; + } else if (concurrency === 0) { + throw new RangeError('Concurrency must not be zero'); + } + + var _worker = (0, _wrapAsync2.default)(worker); + var numRunning = 0; + var workersList = []; + const events = { + error: [], + drain: [], + saturated: [], + unsaturated: [], + empty: [] + }; + + function on(event, handler) { + events[event].push(handler); + } + + function once(event, handler) { + const handleAndRemove = (...args) => { + off(event, handleAndRemove); + handler(...args); + }; + events[event].push(handleAndRemove); + } + + function off(event, handler) { + if (!event) return Object.keys(events).forEach(ev => events[ev] = []); + if (!handler) return events[event] = []; + events[event] = events[event].filter(ev => ev !== handler); + } + + function trigger(event, ...args) { + events[event].forEach(handler => handler(...args)); + } + + var processingScheduled = false; + function _insert(data, insertAtFront, rejectOnError, callback) { + if (callback != null && typeof callback !== 'function') { + throw new Error('task callback must be a function'); + } + q.started = true; + + var res, rej; + function promiseCallback(err, ...args) { + // we don't care about the error, let the global error handler + // deal with it + if (err) return rejectOnError ? rej(err) : res(); + if (args.length <= 1) return res(args[0]); + res(args); + } + + var item = q._createTaskItem(data, rejectOnError ? promiseCallback : callback || promiseCallback); + + if (insertAtFront) { + q._tasks.unshift(item); + } else { + q._tasks.push(item); + } + + if (!processingScheduled) { + processingScheduled = true; + (0, _setImmediate2.default)(() => { + processingScheduled = false; + q.process(); + }); + } + + if (rejectOnError || !callback) { + return new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + } + } + + function _createCB(tasks) { + return function (err, ...args) { + numRunning -= 1; + + for (var i = 0, l = tasks.length; i < l; i++) { + var task = tasks[i]; + + var index = workersList.indexOf(task); + if (index === 0) { + workersList.shift(); + } else if (index > 0) { + workersList.splice(index, 1); + } + + task.callback(err, ...args); + + if (err != null) { + trigger('error', err, task.data); + } + } + + if (numRunning <= q.concurrency - q.buffer) { + trigger('unsaturated'); + } + + if (q.idle()) { + trigger('drain'); + } + q.process(); + }; + } + + function _maybeDrain(data) { + if (data.length === 0 && q.idle()) { + // call drain immediately if there are no tasks + (0, _setImmediate2.default)(() => trigger('drain')); + return true; + } + return false; + } + + const eventMethod = name => handler => { + if (!handler) { + return new Promise((resolve, reject) => { + once(name, (err, data) => { + if (err) return reject(err); + resolve(data); + }); + }); + } + off(name); + on(name, handler); + }; + + var isProcessing = false; + var q = { + _tasks: new _DoublyLinkedList2.default(), + _createTaskItem(data, callback) { + return { + data, + callback + }; + }, + *[Symbol.iterator]() { + yield* q._tasks[Symbol.iterator](); + }, + concurrency, + payload, + buffer: concurrency / 4, + started: false, + paused: false, + push(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return; + return data.map(datum => _insert(datum, false, false, callback)); + } + return _insert(data, false, false, callback); + }, + pushAsync(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return; + return data.map(datum => _insert(datum, false, true, callback)); + } + return _insert(data, false, true, callback); + }, + kill() { + off(); + q._tasks.empty(); + }, + unshift(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return; + return data.map(datum => _insert(datum, true, false, callback)); + } + return _insert(data, true, false, callback); + }, + unshiftAsync(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) return; + return data.map(datum => _insert(datum, true, true, callback)); + } + return _insert(data, true, true, callback); + }, + remove(testFn) { + q._tasks.remove(testFn); + }, + process() { + // Avoid trying to start too many processing operations. This can occur + // when callbacks resolve synchronously (#1267). + if (isProcessing) { + return; + } + isProcessing = true; + while (!q.paused && numRunning < q.concurrency && q._tasks.length) { + var tasks = [], + data = []; + var l = q._tasks.length; + if (q.payload) l = Math.min(l, q.payload); + for (var i = 0; i < l; i++) { + var node = q._tasks.shift(); + tasks.push(node); + workersList.push(node); + data.push(node.data); + } + + numRunning += 1; + + if (q._tasks.length === 0) { + trigger('empty'); + } + + if (numRunning === q.concurrency) { + trigger('saturated'); + } + + var cb = (0, _onlyOnce2.default)(_createCB(tasks)); + _worker(data, cb); + } + isProcessing = false; + }, + length() { + return q._tasks.length; + }, + running() { + return numRunning; + }, + workersList() { + return workersList; + }, + idle() { + return q._tasks.length + numRunning === 0; + }, + pause() { + q.paused = true; + }, + resume() { + if (q.paused === false) { + return; + } + q.paused = false; + (0, _setImmediate2.default)(q.process); + } + }; + // define these as fixed properties, so people get useful errors when updating + Object.defineProperties(q, { + saturated: { + writable: false, + value: eventMethod('saturated') + }, + unsaturated: { + writable: false, + value: eventMethod('unsaturated') + }, + empty: { + writable: false, + value: eventMethod('empty') + }, + drain: { + writable: false, + value: eventMethod('drain') + }, + error: { + writable: false, + value: eventMethod('error') + } + }); + return q; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/range.js b/node_modules/async/internal/range.js new file mode 100644 index 00000000..6680e642 --- /dev/null +++ b/node_modules/async/internal/range.js @@ -0,0 +1,14 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = range; +function range(size) { + var result = Array(size); + while (size--) { + result[size] = size; + } + return result; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/reject.js b/node_modules/async/internal/reject.js new file mode 100644 index 00000000..7388ef49 --- /dev/null +++ b/node_modules/async/internal/reject.js @@ -0,0 +1,26 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reject; + +var _filter = require('./filter.js'); + +var _filter2 = _interopRequireDefault(_filter); + +var _wrapAsync = require('./wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function reject(eachfn, arr, _iteratee, callback) { + const iteratee = (0, _wrapAsync2.default)(_iteratee); + return (0, _filter2.default)(eachfn, arr, (value, cb) => { + iteratee(value, (err, v) => { + cb(err, !v); + }); + }, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/setImmediate.js b/node_modules/async/internal/setImmediate.js new file mode 100644 index 00000000..513efd13 --- /dev/null +++ b/node_modules/async/internal/setImmediate.js @@ -0,0 +1,34 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fallback = fallback; +exports.wrap = wrap; +/* istanbul ignore file */ + +var hasQueueMicrotask = exports.hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; +var hasSetImmediate = exports.hasSetImmediate = typeof setImmediate === 'function' && setImmediate; +var hasNextTick = exports.hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; + +function fallback(fn) { + setTimeout(fn, 0); +} + +function wrap(defer) { + return (fn, ...args) => defer(() => fn(...args)); +} + +var _defer; + +if (hasQueueMicrotask) { + _defer = queueMicrotask; +} else if (hasSetImmediate) { + _defer = setImmediate; +} else if (hasNextTick) { + _defer = process.nextTick; +} else { + _defer = fallback; +} + +exports.default = wrap(_defer); \ No newline at end of file diff --git a/node_modules/async/internal/withoutIndex.js b/node_modules/async/internal/withoutIndex.js new file mode 100644 index 00000000..ec45fa35 --- /dev/null +++ b/node_modules/async/internal/withoutIndex.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _withoutIndex; +function _withoutIndex(iteratee) { + return (value, index, callback) => iteratee(value, callback); +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/wrapAsync.js b/node_modules/async/internal/wrapAsync.js new file mode 100644 index 00000000..ad4d6198 --- /dev/null +++ b/node_modules/async/internal/wrapAsync.js @@ -0,0 +1,34 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isAsyncIterable = exports.isAsyncGenerator = exports.isAsync = undefined; + +var _asyncify = require('../asyncify.js'); + +var _asyncify2 = _interopRequireDefault(_asyncify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function isAsync(fn) { + return fn[Symbol.toStringTag] === 'AsyncFunction'; +} + +function isAsyncGenerator(fn) { + return fn[Symbol.toStringTag] === 'AsyncGenerator'; +} + +function isAsyncIterable(obj) { + return typeof obj[Symbol.asyncIterator] === 'function'; +} + +function wrapAsync(asyncFn) { + if (typeof asyncFn !== 'function') throw new Error('expected a function'); + return isAsync(asyncFn) ? (0, _asyncify2.default)(asyncFn) : asyncFn; +} + +exports.default = wrapAsync; +exports.isAsync = isAsync; +exports.isAsyncGenerator = isAsyncGenerator; +exports.isAsyncIterable = isAsyncIterable; \ No newline at end of file diff --git a/node_modules/async/log.js b/node_modules/async/log.js new file mode 100644 index 00000000..8fc1ed51 --- /dev/null +++ b/node_modules/async/log.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _consoleFunc = require('./internal/consoleFunc.js'); + +var _consoleFunc2 = _interopRequireDefault(_consoleFunc); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Logs the result of an `async` function to the `console`. Only works in + * Node.js or in browsers that support `console.log` and `console.error` (such + * as FF and Chrome). If multiple arguments are returned from the async + * function, `console.log` is called on each argument in order. + * + * @name log + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} function - The function you want to eventually apply + * all arguments to. + * @param {...*} arguments... - Any number of arguments to apply to the function. + * @example + * + * // in a module + * var hello = function(name, callback) { + * setTimeout(function() { + * callback(null, 'hello ' + name); + * }, 1000); + * }; + * + * // in the node repl + * node> async.log(hello, 'world'); + * 'hello world' + */ +exports.default = (0, _consoleFunc2.default)('log'); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/map.js b/node_modules/async/map.js new file mode 100644 index 00000000..ec4135d1 --- /dev/null +++ b/node_modules/async/map.js @@ -0,0 +1,142 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _map2 = require('./internal/map.js'); + +var _map3 = _interopRequireDefault(_map2); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Produces a new collection of values by mapping each value in `coll` through + * the `iteratee` function. The `iteratee` is called with an item from `coll` + * and a callback for when it has finished processing. Each of these callbacks + * takes 2 arguments: an `error`, and the transformed item from `coll`. If + * `iteratee` passes an error to its callback, the main `callback` (for the + * `map` function) is immediately called with the error. + * + * Note, that since this function applies the `iteratee` to each item in + * parallel, there is no guarantee that the `iteratee` functions will complete + * in order. However, the results array will be in the same order as the + * original `coll`. + * + * If `map` is passed an Object, the results will be an Array. The results + * will roughly be in the order of the original Objects' keys (but this can + * vary across JavaScript engines). + * + * @name map + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an Array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.map(fileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * }); + * + * // Using Promises + * async.map(fileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.map(withMissingFileList, getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.map(fileList, getFileSizeInBytes); + * console.log(results); + * // results is now an array of the file size in bytes for each file, e.g. + * // [ 1000, 2000, 3000] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let results = await async.map(withMissingFileList, getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function map(coll, iteratee, callback) { + return (0, _map3.default)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(map, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapLimit.js b/node_modules/async/mapLimit.js new file mode 100644 index 00000000..b5e461c3 --- /dev/null +++ b/node_modules/async/mapLimit.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _map2 = require('./internal/map.js'); + +var _map3 = _interopRequireDefault(_map2); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. + * + * @name mapLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function mapLimit(coll, limit, iteratee, callback) { + return (0, _map3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(mapLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapSeries.js b/node_modules/async/mapSeries.js new file mode 100644 index 00000000..91f36bf4 --- /dev/null +++ b/node_modules/async/mapSeries.js @@ -0,0 +1,44 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _map2 = require('./internal/map.js'); + +var _map3 = _interopRequireDefault(_map2); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. + * + * @name mapSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.map]{@link module:Collections.map} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with the transformed item. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. Results is an array of the + * transformed items from the `coll`. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function mapSeries(coll, iteratee, callback) { + return (0, _map3.default)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(mapSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValues.js b/node_modules/async/mapValues.js new file mode 100644 index 00000000..00da9262 --- /dev/null +++ b/node_modules/async/mapValues.js @@ -0,0 +1,152 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = mapValues; + +var _mapValuesLimit = require('./mapValuesLimit.js'); + +var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. + * + * Produces a new Object by mapping each value of `obj` through the `iteratee` + * function. The `iteratee` is called each `value` and `key` from `obj` and a + * callback for when it has finished processing. Each of these callbacks takes + * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` + * passes an error to its callback, the main `callback` (for the `mapValues` + * function) is immediately called with the error. + * + * Note, the order of the keys in the result is not guaranteed. The keys will + * be roughly in the order they complete, (but this is very engine-specific) + * + * @name mapValues + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file3.txt' + * }; + * + * const withMissingFileMap = { + * f1: 'file1.txt', + * f2: 'file2.txt', + * f3: 'file4.txt' + * }; + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, key, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * }); + * + * // Error handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.mapValues(fileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * }).catch (err => { + * console.log(err); + * }); + * + * // Error Handling + * async.mapValues(withMissingFileMap, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch (err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.mapValues(fileMap, getFileSizeInBytes); + * console.log(result); + * // result is now a map of file size in bytes for each file, e.g. + * // { + * // f1: 1000, + * // f2: 2000, + * // f3: 3000 + * // } + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function mapValues(obj, iteratee, callback) { + return (0, _mapValuesLimit2.default)(obj, Infinity, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValuesLimit.js b/node_modules/async/mapValuesLimit.js new file mode 100644 index 00000000..93066ee8 --- /dev/null +++ b/node_modules/async/mapValuesLimit.js @@ -0,0 +1,61 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a + * time. + * + * @name mapValuesLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function mapValuesLimit(obj, limit, iteratee, callback) { + callback = (0, _once2.default)(callback); + var newObj = {}; + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _eachOfLimit2.default)(limit)(obj, (val, key, next) => { + _iteratee(val, key, (err, result) => { + if (err) return next(err); + newObj[key] = result; + next(err); + }); + }, err => callback(err, newObj)); +} + +exports.default = (0, _awaitify2.default)(mapValuesLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValuesSeries.js b/node_modules/async/mapValuesSeries.js new file mode 100644 index 00000000..560058aa --- /dev/null +++ b/node_modules/async/mapValuesSeries.js @@ -0,0 +1,37 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = mapValuesSeries; + +var _mapValuesLimit = require('./mapValuesLimit.js'); + +var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. + * + * @name mapValuesSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.mapValues]{@link module:Collections.mapValues} + * @category Collection + * @param {Object} obj - A collection to iterate over. + * @param {AsyncFunction} iteratee - A function to apply to each value and key + * in `coll`. + * The iteratee should complete with the transformed value as its result. + * Invoked with (value, key, callback). + * @param {Function} [callback] - A callback which is called when all `iteratee` + * functions have finished, or an error occurs. `result` is a new object consisting + * of each key from `obj`, with each transformed value on the right-hand side. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function mapValuesSeries(obj, iteratee, callback) { + return (0, _mapValuesLimit2.default)(obj, 1, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/memoize.js b/node_modules/async/memoize.js new file mode 100644 index 00000000..6003e412 --- /dev/null +++ b/node_modules/async/memoize.js @@ -0,0 +1,91 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = memoize; + +var _setImmediate = require('./internal/setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Caches the results of an async function. When creating a hash to store + * function results against, the callback is omitted from the hash and an + * optional hash function can be used. + * + * **Note: if the async function errs, the result will not be cached and + * subsequent calls will call the wrapped function.** + * + * If no hash function is specified, the first argument is used as a hash key, + * which may work reasonably if it is a string or a data type that converts to a + * distinct string. Note that objects and arrays will not behave reasonably. + * Neither will cases where the other arguments are significant. In such cases, + * specify your own hash function. + * + * The cache of results is exposed as the `memo` property of the function + * returned by `memoize`. + * + * @name memoize + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function to proxy and cache results from. + * @param {Function} hasher - An optional function for generating a custom hash + * for storing results. It has all the arguments applied to it apart from the + * callback, and must be synchronous. + * @returns {AsyncFunction} a memoized version of `fn` + * @example + * + * var slow_fn = function(name, callback) { + * // do something + * callback(null, result); + * }; + * var fn = async.memoize(slow_fn); + * + * // fn can now be used as if it were slow_fn + * fn('some name', function() { + * // callback + * }); + */ +function memoize(fn, hasher = v => v) { + var memo = Object.create(null); + var queues = Object.create(null); + var _fn = (0, _wrapAsync2.default)(fn); + var memoized = (0, _initialParams2.default)((args, callback) => { + var key = hasher(...args); + if (key in memo) { + (0, _setImmediate2.default)(() => callback(null, ...memo[key])); + } else if (key in queues) { + queues[key].push(callback); + } else { + queues[key] = [callback]; + _fn(...args, (err, ...resultArgs) => { + // #1465 don't memoize if an error occurred + if (!err) { + memo[key] = resultArgs; + } + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i](err, ...resultArgs); + } + }); + } + }); + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/nextTick.js b/node_modules/async/nextTick.js new file mode 100644 index 00000000..e6d321bc --- /dev/null +++ b/node_modules/async/nextTick.js @@ -0,0 +1,52 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _setImmediate = require('./internal/setImmediate.js'); + +/** + * Calls `callback` on a later loop around the event loop. In Node.js this just + * calls `process.nextTick`. In the browser it will use `setImmediate` if + * available, otherwise `setTimeout(callback, 0)`, which means other higher + * priority events may precede the execution of `callback`. + * + * This is used internally for browser-compatibility purposes. + * + * @name nextTick + * @static + * @memberOf module:Utils + * @method + * @see [async.setImmediate]{@link module:Utils.setImmediate} + * @category Util + * @param {Function} callback - The function to call on a later loop around + * the event loop. Invoked with (args...). + * @param {...*} args... - any number of additional arguments to pass to the + * callback on the next tick. + * @example + * + * var call_order = []; + * async.nextTick(function() { + * call_order.push('two'); + * // call_order now equals ['one','two'] + * }); + * call_order.push('one'); + * + * async.setImmediate(function (a, b, c) { + * // a, b, and c equal 1, 2, and 3 + * }, 1, 2, 3); + */ +var _defer; /* istanbul ignore file */ + + +if (_setImmediate.hasNextTick) { + _defer = process.nextTick; +} else if (_setImmediate.hasSetImmediate) { + _defer = setImmediate; +} else { + _defer = _setImmediate.fallback; +} + +exports.default = (0, _setImmediate.wrap)(_defer); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/package.json b/node_modules/async/package.json new file mode 100644 index 00000000..9c464bc7 --- /dev/null +++ b/node_modules/async/package.json @@ -0,0 +1,75 @@ +{ + "name": "async", + "description": "Higher-order functions and common patterns for asynchronous code", + "version": "3.2.4", + "main": "dist/async.js", + "author": "Caolan McMahon", + "homepage": "https://caolan.github.io/async/", + "repository": { + "type": "git", + "url": "https://github.com/caolan/async.git" + }, + "bugs": { + "url": "https://github.com/caolan/async/issues" + }, + "keywords": [ + "async", + "callback", + "module", + "utility" + ], + "devDependencies": { + "@babel/eslint-parser": "^7.16.5", + "babel-core": "^6.26.3", + "babel-minify": "^0.5.0", + "babel-plugin-add-module-exports": "^1.0.4", + "babel-plugin-istanbul": "^6.1.1", + "babel-plugin-syntax-async-generators": "^6.13.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "babel-preset-es2015": "^6.3.13", + "babel-preset-es2017": "^6.22.0", + "babel-register": "^6.26.0", + "babelify": "^10.0.0", + "benchmark": "^2.1.1", + "bluebird": "^3.4.6", + "browserify": "^17.0.0", + "chai": "^4.2.0", + "cheerio": "^0.22.0", + "es6-promise": "^4.2.8", + "eslint": "^8.6.0", + "eslint-plugin-prefer-arrow": "^1.2.3", + "fs-extra": "^10.0.0", + "jsdoc": "^3.6.2", + "karma": "^6.3.12", + "karma-browserify": "^8.1.0", + "karma-firefox-launcher": "^2.1.2", + "karma-mocha": "^2.0.1", + "karma-mocha-reporter": "^2.2.0", + "karma-safari-launcher": "^1.0.0", + "mocha": "^6.1.4", + "native-promise-only": "^0.8.0-a", + "nyc": "^15.1.0", + "rollup": "^2.66.1", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-npm": "^2.0.0", + "rsvp": "^4.8.5", + "semver": "^7.3.5", + "yargs": "^17.3.1" + }, + "scripts": { + "coverage": "nyc npm run mocha-node-test -- --grep @nycinvalid --invert", + "jsdoc": "jsdoc -c ./support/jsdoc/jsdoc.json && node support/jsdoc/jsdoc-fix-html.js", + "lint": "eslint --fix .", + "mocha-browser-test": "karma start", + "mocha-node-test": "mocha", + "mocha-test": "npm run mocha-node-test && npm run mocha-browser-test", + "test": "npm run lint && npm run mocha-node-test" + }, + "license": "MIT", + "nyc": { + "exclude": [ + "test" + ] + }, + "module": "dist/async.mjs" +} \ No newline at end of file diff --git a/node_modules/async/parallel.js b/node_modules/async/parallel.js new file mode 100644 index 00000000..76bc6243 --- /dev/null +++ b/node_modules/async/parallel.js @@ -0,0 +1,180 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = parallel; + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _parallel2 = require('./internal/parallel.js'); + +var _parallel3 = _interopRequireDefault(_parallel2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Run the `tasks` collection of functions in parallel, without waiting until + * the previous function has completed. If any of the functions pass an error to + * its callback, the main `callback` is immediately called with the value of the + * error. Once the `tasks` have completed, the results are passed to the final + * `callback` as an array. + * + * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about + * parallel execution of code. If your tasks do not use any timers or perform + * any I/O, they will actually be executed in series. Any synchronous setup + * sections for each task will happen one after the other. JavaScript remains + * single-threaded. + * + * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the + * execution of other tasks when a task fails. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.parallel}. + * + * @name parallel + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * + * //Using Callbacks + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.parallel([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] even though + * // the second function had a shorter timeout. + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function parallel(tasks, callback) { + return (0, _parallel3.default)(_eachOf2.default, tasks, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/parallelLimit.js b/node_modules/async/parallelLimit.js new file mode 100644 index 00000000..dbe0bb8c --- /dev/null +++ b/node_modules/async/parallelLimit.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = parallelLimit; + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _parallel = require('./internal/parallel.js'); + +var _parallel2 = _interopRequireDefault(_parallel); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a + * time. + * + * @name parallelLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.parallel]{@link module:ControlFlow.parallel} + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of + * [async functions]{@link AsyncFunction} to run. + * Each async function can complete with any number of optional `result` values. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed successfully. This function gets a results array + * (or object) containing all the result arguments passed to the task callbacks. + * Invoked with (err, results). + * @returns {Promise} a promise, if a callback is not passed + */ +function parallelLimit(tasks, limit, callback) { + return (0, _parallel2.default)((0, _eachOfLimit2.default)(limit), tasks, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/priorityQueue.js b/node_modules/async/priorityQueue.js new file mode 100644 index 00000000..6006f669 --- /dev/null +++ b/node_modules/async/priorityQueue.js @@ -0,0 +1,86 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (worker, concurrency) { + // Start with a normal queue + var q = (0, _queue2.default)(worker, concurrency); + + var { + push, + pushAsync + } = q; + + q._tasks = new _Heap2.default(); + q._createTaskItem = ({ data, priority }, callback) => { + return { + data, + priority, + callback + }; + }; + + function createDataItems(tasks, priority) { + if (!Array.isArray(tasks)) { + return { data: tasks, priority }; + } + return tasks.map(data => { + return { data, priority }; + }); + } + + // Override push to accept second parameter representing priority + q.push = function (data, priority = 0, callback) { + return push(createDataItems(data, priority), callback); + }; + + q.pushAsync = function (data, priority = 0, callback) { + return pushAsync(createDataItems(data, priority), callback); + }; + + // Remove unshift functions + delete q.unshift; + delete q.unshiftAsync; + + return q; +}; + +var _queue = require('./queue.js'); + +var _queue2 = _interopRequireDefault(_queue); + +var _Heap = require('./internal/Heap.js'); + +var _Heap2 = _interopRequireDefault(_Heap); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +module.exports = exports['default']; + +/** + * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and + * completed in ascending priority order. + * + * @name priorityQueue + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.queue]{@link module:ControlFlow.queue} + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. + * Invoked with (task, callback). + * @param {number} concurrency - An `integer` for determining how many `worker` + * functions should be run in parallel. If omitted, the concurrency defaults to + * `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three + * differences between `queue` and `priorityQueue` objects: + * * `push(task, priority, [callback])` - `priority` should be a number. If an + * array of `tasks` is given, all tasks will be assigned the same priority. + * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, + * except this returns a promise that rejects if an error occurs. + * * The `unshift` and `unshiftAsync` methods were removed. + */ \ No newline at end of file diff --git a/node_modules/async/queue.js b/node_modules/async/queue.js new file mode 100644 index 00000000..c69becb8 --- /dev/null +++ b/node_modules/async/queue.js @@ -0,0 +1,167 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (worker, concurrency) { + var _worker = (0, _wrapAsync2.default)(worker); + return (0, _queue2.default)((items, cb) => { + _worker(items[0], cb); + }, concurrency, 1); +}; + +var _queue = require('./internal/queue.js'); + +var _queue2 = _interopRequireDefault(_queue); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +module.exports = exports['default']; + +/** + * A queue of tasks for the worker function to complete. + * @typedef {Iterable} QueueObject + * @memberOf module:ControlFlow + * @property {Function} length - a function returning the number of items + * waiting to be processed. Invoke with `queue.length()`. + * @property {boolean} started - a boolean indicating whether or not any + * items have been pushed and processed by the queue. + * @property {Function} running - a function returning the number of items + * currently being processed. Invoke with `queue.running()`. + * @property {Function} workersList - a function returning the array of items + * currently being processed. Invoke with `queue.workersList()`. + * @property {Function} idle - a function returning false if there are items + * waiting or being processed, or true if not. Invoke with `queue.idle()`. + * @property {number} concurrency - an integer for determining how many `worker` + * functions should be run in parallel. This property can be changed after a + * `queue` is created to alter the concurrency on-the-fly. + * @property {number} payload - an integer that specifies how many items are + * passed to the worker function at a time. only applies if this is a + * [cargo]{@link module:ControlFlow.cargo} object + * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` + * once the `worker` has finished processing the task. Instead of a single task, + * a `tasks` array can be submitted. The respective callback is used for every + * task in the list. Invoke with `queue.push(task, [callback])`, + * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. + * Invoke with `queue.unshift(task, [callback])`. + * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns + * a promise that rejects if an error occurs. + * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns + * a promise that rejects if an error occurs. + * @property {Function} remove - remove items from the queue that match a test + * function. The test function will be passed an object with a `data` property, + * and a `priority` property, if this is a + * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. + * Invoked with `queue.remove(testFn)`, where `testFn` is of the form + * `function ({data, priority}) {}` and returns a Boolean. + * @property {Function} saturated - a function that sets a callback that is + * called when the number of running workers hits the `concurrency` limit, and + * further tasks will be queued. If the callback is omitted, `q.saturated()` + * returns a promise for the next occurrence. + * @property {Function} unsaturated - a function that sets a callback that is + * called when the number of running workers is less than the `concurrency` & + * `buffer` limits, and further tasks will not be queued. If the callback is + * omitted, `q.unsaturated()` returns a promise for the next occurrence. + * @property {number} buffer - A minimum threshold buffer in order to say that + * the `queue` is `unsaturated`. + * @property {Function} empty - a function that sets a callback that is called + * when the last item from the `queue` is given to a `worker`. If the callback + * is omitted, `q.empty()` returns a promise for the next occurrence. + * @property {Function} drain - a function that sets a callback that is called + * when the last item from the `queue` has returned from the `worker`. If the + * callback is omitted, `q.drain()` returns a promise for the next occurrence. + * @property {Function} error - a function that sets a callback that is called + * when a task errors. Has the signature `function(error, task)`. If the + * callback is omitted, `error()` returns a promise that rejects on the next + * error. + * @property {boolean} paused - a boolean for determining whether the queue is + * in a paused state. + * @property {Function} pause - a function that pauses the processing of tasks + * until `resume()` is called. Invoke with `queue.pause()`. + * @property {Function} resume - a function that resumes the processing of + * queued tasks when the queue is paused. Invoke with `queue.resume()`. + * @property {Function} kill - a function that removes the `drain` callback and + * empties remaining tasks from the queue forcing it to go idle. No more tasks + * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. + * + * @example + * const q = async.queue(worker, 2) + * q.push(item1) + * q.push(item2) + * q.push(item3) + * // queues are iterable, spread into an array to inspect + * const items = [...q] // [item1, item2, item3] + * // or use for of + * for (let item of q) { + * console.log(item) + * } + * + * q.drain(() => { + * console.log('all done') + * }) + * // or + * await q.drain() + */ + +/** + * Creates a `queue` object with the specified `concurrency`. Tasks added to the + * `queue` are processed in parallel (up to the `concurrency` limit). If all + * `worker`s are in progress, the task is queued until one becomes available. + * Once a `worker` completes a `task`, that `task`'s callback is called. + * + * @name queue + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} worker - An async function for processing a queued task. + * If you want to handle errors from an individual task, pass a callback to + * `q.push()`. Invoked with (task, callback). + * @param {number} [concurrency=1] - An `integer` for determining how many + * `worker` functions should be run in parallel. If omitted, the concurrency + * defaults to `1`. If the concurrency is `0`, an error is thrown. + * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be + * attached as certain properties to listen for specific events during the + * lifecycle of the queue. + * @example + * + * // create a queue object with concurrency 2 + * var q = async.queue(function(task, callback) { + * console.log('hello ' + task.name); + * callback(); + * }, 2); + * + * // assign a callback + * q.drain(function() { + * console.log('all items have been processed'); + * }); + * // or await the end + * await q.drain() + * + * // assign an error callback + * q.error(function(err, task) { + * console.error('task experienced an error'); + * }); + * + * // add some items to the queue + * q.push({name: 'foo'}, function(err) { + * console.log('finished processing foo'); + * }); + * // callback is optional + * q.push({name: 'bar'}); + * + * // add some items to the queue (batch-wise) + * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { + * console.log('finished processing item'); + * }); + * + * // add some items to the front of the queue + * q.unshift({name: 'bar'}, function (err) { + * console.log('finished processing bar'); + * }); + */ \ No newline at end of file diff --git a/node_modules/async/race.js b/node_modules/async/race.js new file mode 100644 index 00000000..9595d884 --- /dev/null +++ b/node_modules/async/race.js @@ -0,0 +1,67 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Runs the `tasks` array of functions in parallel, without waiting until the + * previous function has completed. Once any of the `tasks` complete or pass an + * error to its callback, the main `callback` is immediately called. It's + * equivalent to `Promise.race()`. + * + * @name race + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} + * to run. Each function can complete with an optional `result` value. + * @param {Function} callback - A callback to run once any of the functions have + * completed. This function gets an error or result from the first function that + * completed. Invoked with (err, result). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.race([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ], + * // main callback + * function(err, result) { + * // the result will be equal to 'two' as it finishes earlier + * }); + */ +function race(tasks, callback) { + callback = (0, _once2.default)(callback); + if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); + if (!tasks.length) return callback(); + for (var i = 0, l = tasks.length; i < l; i++) { + (0, _wrapAsync2.default)(tasks[i])(callback); + } +} + +exports.default = (0, _awaitify2.default)(race, 2); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reduce.js b/node_modules/async/reduce.js new file mode 100644 index 00000000..56e2db81 --- /dev/null +++ b/node_modules/async/reduce.js @@ -0,0 +1,153 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Reduces `coll` into a single value using an async `iteratee` to return each + * successive step. `memo` is the initial state of the reduction. This function + * only operates in series. + * + * For performance reasons, it may make sense to split a call to this function + * into a parallel map, and then use the normal `Array.prototype.reduce` on the + * results. This function is for situations where each step in the reduction + * needs to be async; if you can get the data before reducing it, then it's + * probably a good idea to do so. + * + * @name reduce + * @static + * @memberOf module:Collections + * @method + * @alias inject + * @alias foldl + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * // file4.txt does not exist + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; + * + * // asynchronous function that computes the file size in bytes + * // file size is added to the memoized value, then returned + * function getFileSizeInBytes(memo, file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, memo + stat.size); + * }); + * } + * + * // Using callbacks + * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * } else { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(result); + * } + * }); + * + * // Using Promises + * async.reduce(fileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * }).catch( err => { + * console.log(err); + * }); + * + * // Error Handling + * async.reduce(withMissingFileList, 0, getFileSizeInBytes) + * .then( result => { + * console.log(result); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.reduce(fileList, 0, getFileSizeInBytes); + * console.log(result); + * // 6000 + * // which is the sum of the file sizes of the three files + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // Error Handling + * async () => { + * try { + * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); + * console.log(result); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function reduce(coll, memo, iteratee, callback) { + callback = (0, _once2.default)(callback); + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, err => callback(err, memo)); +} +exports.default = (0, _awaitify2.default)(reduce, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reduceRight.js b/node_modules/async/reduceRight.js new file mode 100644 index 00000000..bee5391d --- /dev/null +++ b/node_modules/async/reduceRight.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reduceRight; + +var _reduce = require('./reduce.js'); + +var _reduce2 = _interopRequireDefault(_reduce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. + * + * @name reduceRight + * @static + * @memberOf module:Collections + * @method + * @see [async.reduce]{@link module:Collections.reduce} + * @alias foldr + * @category Collection + * @param {Array} array - A collection to iterate over. + * @param {*} memo - The initial state of the reduction. + * @param {AsyncFunction} iteratee - A function applied to each item in the + * array to produce the next step in the reduction. + * The `iteratee` should complete with the next state of the reduction. + * If the iteratee completes with an error, the reduction is stopped and the + * main `callback` is immediately called with the error. + * Invoked with (memo, item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the reduced value. Invoked with + * (err, result). + * @returns {Promise} a promise, if no callback is passed + */ +function reduceRight(array, memo, iteratee, callback) { + var reversed = [...array].reverse(); + return (0, _reduce2.default)(reversed, memo, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reflect.js b/node_modules/async/reflect.js new file mode 100644 index 00000000..297ed797 --- /dev/null +++ b/node_modules/async/reflect.js @@ -0,0 +1,78 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reflect; + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Wraps the async function in another function that always completes with a + * result object, even when it errors. + * + * The result object has either the property `error` or `value`. + * + * @name reflect + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} fn - The async function you want to wrap + * @returns {Function} - A function that always passes null to it's callback as + * the error. The second argument to the callback will be an `object` with + * either an `error` or a `value` property. + * @example + * + * async.parallel([ + * async.reflect(function(callback) { + * // do some stuff ... + * callback(null, 'one'); + * }), + * async.reflect(function(callback) { + * // do some more stuff but error ... + * callback('bad stuff happened'); + * }), + * async.reflect(function(callback) { + * // do some more stuff ... + * callback(null, 'two'); + * }) + * ], + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = 'bad stuff happened' + * // results[2].value = 'two' + * }); + */ +function reflect(fn) { + var _fn = (0, _wrapAsync2.default)(fn); + return (0, _initialParams2.default)(function reflectOn(args, reflectCallback) { + args.push((error, ...cbArgs) => { + let retVal = {}; + if (error) { + retVal.error = error; + } + if (cbArgs.length > 0) { + var value = cbArgs; + if (cbArgs.length <= 1) { + [value] = cbArgs; + } + retVal.value = value; + } + reflectCallback(null, retVal); + }); + + return _fn.apply(this, args); + }); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reflectAll.js b/node_modules/async/reflectAll.js new file mode 100644 index 00000000..a862ff05 --- /dev/null +++ b/node_modules/async/reflectAll.js @@ -0,0 +1,93 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reflectAll; + +var _reflect = require('./reflect.js'); + +var _reflect2 = _interopRequireDefault(_reflect); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * A helper function that wraps an array or an object of functions with `reflect`. + * + * @name reflectAll + * @static + * @memberOf module:Utils + * @method + * @see [async.reflect]{@link module:Utils.reflect} + * @category Util + * @param {Array|Object|Iterable} tasks - The collection of + * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. + * @returns {Array} Returns an array of async functions, each wrapped in + * `async.reflect` + * @example + * + * let tasks = [ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * // do some more stuff but error ... + * callback(new Error('bad stuff happened')); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results[0].value = 'one' + * // results[1].error = Error('bad stuff happened') + * // results[2].value = 'two' + * }); + * + * // an example using an object instead of an array + * let tasks = { + * one: function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * two: function(callback) { + * callback('two'); + * }, + * three: function(callback) { + * setTimeout(function() { + * callback(null, 'three'); + * }, 100); + * } + * }; + * + * async.parallel(async.reflectAll(tasks), + * // optional callback + * function(err, results) { + * // values + * // results.one.value = 'one' + * // results.two.error = 'two' + * // results.three.value = 'three' + * }); + */ +function reflectAll(tasks) { + var results; + if (Array.isArray(tasks)) { + results = tasks.map(_reflect2.default); + } else { + results = {}; + Object.keys(tasks).forEach(key => { + results[key] = _reflect2.default.call(this, tasks[key]); + }); + } + return results; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reject.js b/node_modules/async/reject.js new file mode 100644 index 00000000..cabd96ea --- /dev/null +++ b/node_modules/async/reject.js @@ -0,0 +1,87 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _reject2 = require('./internal/reject.js'); + +var _reject3 = _interopRequireDefault(_reject2); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. + * + * @name reject + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.reject(fileList, fileExists, function(err, results) { + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }); + * + * // Using Promises + * async.reject(fileList, fileExists) + * .then( results => { + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.reject(fileList, fileExists); + * console.log(results); + * // [ 'dir3/file6.txt' ] + * // results now equals an array of the non-existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function reject(coll, iteratee, callback) { + return (0, _reject3.default)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(reject, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/rejectLimit.js b/node_modules/async/rejectLimit.js new file mode 100644 index 00000000..1a899252 --- /dev/null +++ b/node_modules/async/rejectLimit.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _reject2 = require('./internal/reject.js'); + +var _reject3 = _interopRequireDefault(_reject2); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a + * time. + * + * @name rejectLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function rejectLimit(coll, limit, iteratee, callback) { + return (0, _reject3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(rejectLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/rejectSeries.js b/node_modules/async/rejectSeries.js new file mode 100644 index 00000000..6e1a1c5e --- /dev/null +++ b/node_modules/async/rejectSeries.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _reject2 = require('./internal/reject.js'); + +var _reject3 = _interopRequireDefault(_reject2); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. + * + * @name rejectSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.reject]{@link module:Collections.reject} + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - An async truth test to apply to each item in + * `coll`. + * The should complete with a boolean value as its `result`. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback is passed + */ +function rejectSeries(coll, iteratee, callback) { + return (0, _reject3.default)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(rejectSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/retry.js b/node_modules/async/retry.js new file mode 100644 index 00000000..dba30301 --- /dev/null +++ b/node_modules/async/retry.js @@ -0,0 +1,159 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = retry; + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _promiseCallback = require('./internal/promiseCallback.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function constant(value) { + return function () { + return value; + }; +} + +/** + * Attempts to get a successful response from `task` no more than `times` times + * before returning an error. If the task is successful, the `callback` will be + * passed the result of the successful task. If all attempts fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name retry + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @see [async.retryable]{@link module:ControlFlow.retryable} + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an + * object with `times` and `interval` or a number. + * * `times` - The number of attempts to make before giving up. The default + * is `5`. + * * `interval` - The time to wait between retries, in milliseconds. The + * default is `0`. The interval may also be specified as a function of the + * retry count (see example). + * * `errorFilter` - An optional synchronous function that is invoked on + * erroneous result. If it returns `true` the retry attempts will continue; + * if the function returns `false` the retry flow is aborted with the current + * attempt's error and result being returned to the final callback. + * Invoked with (err). + * * If `opts` is a number, the number specifies the number of times to retry, + * with the default interval of `0`. + * @param {AsyncFunction} task - An async function to retry. + * Invoked with (callback). + * @param {Function} [callback] - An optional callback which is called when the + * task has succeeded, or after the final failed attempt. It receives the `err` + * and `result` arguments of the last attempt at completing the `task`. Invoked + * with (err, results). + * @returns {Promise} a promise if no callback provided + * + * @example + * + * // The `retry` function can be used as a stand-alone control flow by passing + * // a callback, as shown below: + * + * // try calling apiMethod 3 times + * async.retry(3, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 3 times, waiting 200 ms between each retry + * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod 10 times with exponential backoff + * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) + * async.retry({ + * times: 10, + * interval: function(retryCount) { + * return 50 * Math.pow(2, retryCount); + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod the default 5 times no delay between each retry + * async.retry(apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // try calling apiMethod only when error condition satisfies, all other + * // errors will abort the retry control flow and return to final callback + * async.retry({ + * errorFilter: function(err) { + * return err.message === 'Temporary error'; // only retry on a specific error + * } + * }, apiMethod, function(err, result) { + * // do something with the result + * }); + * + * // to retry individual methods that are not as reliable within other + * // control flow functions, use the `retryable` wrapper: + * async.auto({ + * users: api.getUsers.bind(api), + * payments: async.retryable(3, api.getPayments.bind(api)) + * }, function(err, results) { + * // do something with the results + * }); + * + */ +const DEFAULT_TIMES = 5; +const DEFAULT_INTERVAL = 0; + +function retry(opts, task, callback) { + var options = { + times: DEFAULT_TIMES, + intervalFunc: constant(DEFAULT_INTERVAL) + }; + + if (arguments.length < 3 && typeof opts === 'function') { + callback = task || (0, _promiseCallback.promiseCallback)(); + task = opts; + } else { + parseTimes(options, opts); + callback = callback || (0, _promiseCallback.promiseCallback)(); + } + + if (typeof task !== 'function') { + throw new Error("Invalid arguments for async.retry"); + } + + var _task = (0, _wrapAsync2.default)(task); + + var attempt = 1; + function retryAttempt() { + _task((err, ...args) => { + if (err === false) return; + if (err && attempt++ < options.times && (typeof options.errorFilter != 'function' || options.errorFilter(err))) { + setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); + } else { + callback(err, ...args); + } + }); + } + + retryAttempt(); + return callback[_promiseCallback.PROMISE_SYMBOL]; +} + +function parseTimes(acc, t) { + if (typeof t === 'object') { + acc.times = +t.times || DEFAULT_TIMES; + + acc.intervalFunc = typeof t.interval === 'function' ? t.interval : constant(+t.interval || DEFAULT_INTERVAL); + + acc.errorFilter = t.errorFilter; + } else if (typeof t === 'number' || typeof t === 'string') { + acc.times = +t || DEFAULT_TIMES; + } else { + throw new Error("Invalid arguments for async.retry"); + } +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/retryable.js b/node_modules/async/retryable.js new file mode 100644 index 00000000..1b1147cd --- /dev/null +++ b/node_modules/async/retryable.js @@ -0,0 +1,77 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = retryable; + +var _retry = require('./retry.js'); + +var _retry2 = _interopRequireDefault(_retry); + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _promiseCallback = require('./internal/promiseCallback.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method + * wraps a task and makes it retryable, rather than immediately calling it + * with retries. + * + * @name retryable + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.retry]{@link module:ControlFlow.retry} + * @category Control Flow + * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional + * options, exactly the same as from `retry`, except for a `opts.arity` that + * is the arity of the `task` function, defaulting to `task.length` + * @param {AsyncFunction} task - the asynchronous function to wrap. + * This function will be passed any arguments passed to the returned wrapper. + * Invoked with (...args, callback). + * @returns {AsyncFunction} The wrapped function, which when invoked, will + * retry on an error, based on the parameters specified in `opts`. + * This function will accept the same parameters as `task`. + * @example + * + * async.auto({ + * dep1: async.retryable(3, getFromFlakyService), + * process: ["dep1", async.retryable(3, function (results, cb) { + * maybeProcessData(results.dep1, cb); + * })] + * }, callback); + */ +function retryable(opts, task) { + if (!task) { + task = opts; + opts = null; + } + let arity = opts && opts.arity || task.length; + if ((0, _wrapAsync.isAsync)(task)) { + arity += 1; + } + var _task = (0, _wrapAsync2.default)(task); + return (0, _initialParams2.default)((args, callback) => { + if (args.length < arity - 1 || callback == null) { + args.push(callback); + callback = (0, _promiseCallback.promiseCallback)(); + } + function taskFn(cb) { + _task(...args, cb); + } + + if (opts) (0, _retry2.default)(opts, taskFn, callback);else (0, _retry2.default)(taskFn, callback); + + return callback[_promiseCallback.PROMISE_SYMBOL]; + }); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/select.js b/node_modules/async/select.js new file mode 100644 index 00000000..303dc1fb --- /dev/null +++ b/node_modules/async/select.js @@ -0,0 +1,93 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns a new array of all the values in `coll` which pass an async truth + * test. This operation is performed in parallel, but the results array will be + * in the same order as the original. + * + * @name filter + * @static + * @memberOf module:Collections + * @method + * @alias select + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * + * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.filter(files, fileExists, function(err, results) { + * if(err) { + * console.log(err); + * } else { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * }); + * + * // Using Promises + * async.filter(files, fileExists) + * .then(results => { + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let results = await async.filter(files, fileExists); + * console.log(results); + * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] + * // results is now an array of the existing files + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function filter(coll, iteratee, callback) { + return (0, _filter3.default)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filter, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/selectLimit.js b/node_modules/async/selectLimit.js new file mode 100644 index 00000000..89e55f53 --- /dev/null +++ b/node_modules/async/selectLimit.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a + * time. + * + * @name filterLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results). + * @returns {Promise} a promise, if no callback provided + */ +function filterLimit(coll, limit, iteratee, callback) { + return (0, _filter3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filterLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/selectSeries.js b/node_modules/async/selectSeries.js new file mode 100644 index 00000000..a045e52c --- /dev/null +++ b/node_modules/async/selectSeries.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _filter2 = require('./internal/filter.js'); + +var _filter3 = _interopRequireDefault(_filter2); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. + * + * @name filterSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.filter]{@link module:Collections.filter} + * @alias selectSeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {Function} iteratee - A truth test to apply to each item in `coll`. + * The `iteratee` is passed a `callback(err, truthValue)`, which must be called + * with a boolean argument once it has completed. Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Invoked with (err, results) + * @returns {Promise} a promise, if no callback provided + */ +function filterSeries(coll, iteratee, callback) { + return (0, _filter3.default)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(filterSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/seq.js b/node_modules/async/seq.js new file mode 100644 index 00000000..28c825f2 --- /dev/null +++ b/node_modules/async/seq.js @@ -0,0 +1,79 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = seq; + +var _reduce = require('./reduce.js'); + +var _reduce2 = _interopRequireDefault(_reduce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _promiseCallback = require('./internal/promiseCallback.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Version of the compose function that is more natural to read. Each function + * consumes the return value of the previous function. It is the equivalent of + * [compose]{@link module:ControlFlow.compose} with the arguments reversed. + * + * Each function is executed with the `this` binding of the composed function. + * + * @name seq + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.compose]{@link module:ControlFlow.compose} + * @category Control Flow + * @param {...AsyncFunction} functions - the asynchronous functions to compose + * @returns {Function} a function that composes the `functions` in order + * @example + * + * // Requires lodash (or underscore), express3 and dresende's orm2. + * // Part of an app, that fetches cats of the logged user. + * // This example uses `seq` function to avoid overnesting and error + * // handling clutter. + * app.get('/cats', function(request, response) { + * var User = request.models.User; + * async.seq( + * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) + * function(user, fn) { + * user.getCats(fn); // 'getCats' has signature (callback(err, data)) + * } + * )(req.session.user_id, function (err, cats) { + * if (err) { + * console.error(err); + * response.json({ status: 'error', message: err.message }); + * } else { + * response.json({ status: 'ok', message: 'Cats found', data: cats }); + * } + * }); + * }); + */ +function seq(...functions) { + var _functions = functions.map(_wrapAsync2.default); + return function (...args) { + var that = this; + + var cb = args[args.length - 1]; + if (typeof cb == 'function') { + args.pop(); + } else { + cb = (0, _promiseCallback.promiseCallback)(); + } + + (0, _reduce2.default)(_functions, args, (newargs, fn, iterCb) => { + fn.apply(that, newargs.concat((err, ...nextargs) => { + iterCb(err, nextargs); + })); + }, (err, results) => cb(err, ...results)); + + return cb[_promiseCallback.PROMISE_SYMBOL]; + }; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/series.js b/node_modules/async/series.js new file mode 100644 index 00000000..56e78f9f --- /dev/null +++ b/node_modules/async/series.js @@ -0,0 +1,186 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = series; + +var _parallel2 = require('./internal/parallel.js'); + +var _parallel3 = _interopRequireDefault(_parallel2); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Run the functions in the `tasks` collection in series, each one running once + * the previous function has completed. If any functions in the series pass an + * error to its callback, no more functions are run, and `callback` is + * immediately called with the value of the error. Otherwise, `callback` + * receives an array of results when `tasks` have completed. + * + * It is also possible to use an object instead of an array. Each property will + * be run as a function, and the results will be passed to the final `callback` + * as an object instead of an array. This can be a more readable way of handling + * results from {@link async.series}. + * + * **Note** that while many implementations preserve the order of object + * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) + * explicitly states that + * + * > The mechanics and order of enumerating the properties is not specified. + * + * So if you rely on the order in which your series of functions are executed, + * and want this to work on all platforms, consider using an array. + * + * @name series + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing + * [async functions]{@link AsyncFunction} to run in series. + * Each function can complete with any number of optional `result` values. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This function gets a results array (or object) + * containing all the result arguments passed to the `task` callbacks. Invoked + * with (err, result). + * @return {Promise} a promise, if no callback is passed + * @example + * + * //Using Callbacks + * async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ], function(err, results) { + * console.log(results); + * // results is equal to ['one','two'] + * }); + * + * // an example using objects instead of arrays + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }, function(err, results) { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }); + * + * //Using Promises + * async.series([ + * function(callback) { + * setTimeout(function() { + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * callback(null, 'two'); + * }, 100); + * } + * ]).then(results => { + * console.log(results); + * // results is equal to ['one','two'] + * }).catch(err => { + * console.log(err); + * }); + * + * // an example using an object instead of an array + * async.series({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }).then(results => { + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * }).catch(err => { + * console.log(err); + * }); + * + * //Using async/await + * async () => { + * try { + * let results = await async.series([ + * function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 'one'); + * }, 200); + * }, + * function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 'two'); + * }, 100); + * } + * ]); + * console.log(results); + * // results is equal to ['one','two'] + * } + * catch (err) { + * console.log(err); + * } + * } + * + * // an example using an object instead of an array + * async () => { + * try { + * let results = await async.parallel({ + * one: function(callback) { + * setTimeout(function() { + * // do some async task + * callback(null, 1); + * }, 200); + * }, + * two: function(callback) { + * setTimeout(function() { + * // then do another async task + * callback(null, 2); + * }, 100); + * } + * }); + * console.log(results); + * // results is equal to: { one: 1, two: 2 } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function series(tasks, callback) { + return (0, _parallel3.default)(_eachOfSeries2.default, tasks, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/setImmediate.js b/node_modules/async/setImmediate.js new file mode 100644 index 00000000..c712ec3b --- /dev/null +++ b/node_modules/async/setImmediate.js @@ -0,0 +1,45 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _setImmediate = require('./internal/setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Calls `callback` on a later loop around the event loop. In Node.js this just + * calls `setImmediate`. In the browser it will use `setImmediate` if + * available, otherwise `setTimeout(callback, 0)`, which means other higher + * priority events may precede the execution of `callback`. + * + * This is used internally for browser-compatibility purposes. + * + * @name setImmediate + * @static + * @memberOf module:Utils + * @method + * @see [async.nextTick]{@link module:Utils.nextTick} + * @category Util + * @param {Function} callback - The function to call on a later loop around + * the event loop. Invoked with (args...). + * @param {...*} args... - any number of additional arguments to pass to the + * callback on the next tick. + * @example + * + * var call_order = []; + * async.nextTick(function() { + * call_order.push('two'); + * // call_order now equals ['one','two'] + * }); + * call_order.push('one'); + * + * async.setImmediate(function (a, b, c) { + * // a, b, and c equal 1, 2, and 3 + * }, 1, 2, 3); + */ +exports.default = _setImmediate2.default; +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/some.js b/node_modules/async/some.js new file mode 100644 index 00000000..2046cf64 --- /dev/null +++ b/node_modules/async/some.js @@ -0,0 +1,122 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Returns `true` if at least one element in the `coll` satisfies an async test. + * If any iteratee call returns `true`, the main `callback` is immediately + * called. + * + * @name some + * @static + * @memberOf module:Collections + * @method + * @alias any + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // dir1 is a directory that contains file1.txt, file2.txt + * // dir2 is a directory that contains file3.txt, file4.txt + * // dir3 is a directory that contains file5.txt + * // dir4 does not exist + * + * // asynchronous function that checks if a file exists + * function fileExists(file, callback) { + * fs.access(file, fs.constants.F_OK, (err) => { + * callback(null, !err); + * }); + * } + * + * // Using callbacks + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + *); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, + * function(err, result) { + * console.log(result); + * // false + * // result is false since none of the files exists + * } + *); + * + * // Using Promises + * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) + * .then( result => { + * console.log(result); + * // true + * // result is true since some file in the list exists + * }).catch( err => { + * console.log(err); + * }); + * + * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) + * .then( result => { + * console.log(result); + * // false + * // result is false since none of the files exists + * }).catch( err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); + * console.log(result); + * // true + * // result is true since some file in the list exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + * async () => { + * try { + * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); + * console.log(result); + * // false + * // result is false since none of the files exists + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function some(coll, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)(_eachOf2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(some, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/someLimit.js b/node_modules/async/someLimit.js new file mode 100644 index 00000000..c8a295a8 --- /dev/null +++ b/node_modules/async/someLimit.js @@ -0,0 +1,47 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfLimit = require('./internal/eachOfLimit.js'); + +var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. + * + * @name someLimit + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anyLimit + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in parallel. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someLimit(coll, limit, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(someLimit, 4); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/someSeries.js b/node_modules/async/someSeries.js new file mode 100644 index 00000000..ee0654ba --- /dev/null +++ b/node_modules/async/someSeries.js @@ -0,0 +1,46 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createTester = require('./internal/createTester.js'); + +var _createTester2 = _interopRequireDefault(_createTester); + +var _eachOfSeries = require('./eachOfSeries.js'); + +var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. + * + * @name someSeries + * @static + * @memberOf module:Collections + * @method + * @see [async.some]{@link module:Collections.some} + * @alias anySeries + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async truth test to apply to each item + * in the collections in series. + * The iteratee should complete with a boolean `result` value. + * Invoked with (item, callback). + * @param {Function} [callback] - A callback which is called as soon as any + * iteratee returns `true`, or after all the iteratee functions have finished. + * Result will be either `true` or `false` depending on the values of the async + * tests. Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + */ +function someSeries(coll, iteratee, callback) { + return (0, _createTester2.default)(Boolean, res => res)(_eachOfSeries2.default, coll, iteratee, callback); +} +exports.default = (0, _awaitify2.default)(someSeries, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/sortBy.js b/node_modules/async/sortBy.js new file mode 100644 index 00000000..d17fb6a2 --- /dev/null +++ b/node_modules/async/sortBy.js @@ -0,0 +1,190 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _map = require('./map.js'); + +var _map2 = _interopRequireDefault(_map); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Sorts a list by the results of running each `coll` value through an async + * `iteratee`. + * + * @name sortBy + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {AsyncFunction} iteratee - An async function to apply to each item in + * `coll`. + * The iteratee should complete with a value to use as the sort criteria as + * its `result`. + * Invoked with (item, callback). + * @param {Function} callback - A callback which is called after all the + * `iteratee` functions have finished, or an error occurs. Results is the items + * from the original `coll` sorted by the values returned by the `iteratee` + * calls. Invoked with (err, results). + * @returns {Promise} a promise, if no callback passed + * @example + * + * // bigfile.txt is a file that is 251100 bytes in size + * // mediumfile.txt is a file that is 11000 bytes in size + * // smallfile.txt is a file that is 121 bytes in size + * + * // asynchronous function that returns the file size in bytes + * function getFileSizeInBytes(file, callback) { + * fs.stat(file, function(err, stat) { + * if (err) { + * return callback(err); + * } + * callback(null, stat.size); + * }); + * } + * + * // Using callbacks + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // By modifying the callback parameter the + * // sorting order can be influenced: + * + * // ascending order + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) return callback(getFileSizeErr); + * callback(null, fileSize); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * } + * ); + * + * // descending order + * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { + * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { + * if (getFileSizeErr) { + * return callback(getFileSizeErr); + * } + * callback(null, fileSize * -1); + * }); + * }, function(err, results) { + * if (err) { + * console.log(err); + * } else { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] + * } + * } + * ); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, + * function(err, results) { + * if (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } else { + * console.log(results); + * } + * } + * ); + * + * // Using Promises + * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * }).catch( err => { + * console.log(err); + * }); + * + * // Error handling + * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) + * .then( results => { + * console.log(results); + * }).catch( err => { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * }); + * + * // Using async/await + * (async () => { + * try { + * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * // results is now the original array of files sorted by + * // file size (ascending by default), e.g. + * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * // Error handling + * async () => { + * try { + * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); + * console.log(results); + * } + * catch (err) { + * console.log(err); + * // [ Error: ENOENT: no such file or directory ] + * } + * } + * + */ +function sortBy(coll, iteratee, callback) { + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _map2.default)(coll, (x, iterCb) => { + _iteratee(x, (err, criteria) => { + if (err) return iterCb(err); + iterCb(err, { value: x, criteria }); + }); + }, (err, results) => { + if (err) return callback(err); + callback(null, results.sort(comparator).map(v => v.value)); + }); + + function comparator(left, right) { + var a = left.criteria, + b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + } +} +exports.default = (0, _awaitify2.default)(sortBy, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timeout.js b/node_modules/async/timeout.js new file mode 100644 index 00000000..dd58eb38 --- /dev/null +++ b/node_modules/async/timeout.js @@ -0,0 +1,89 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = timeout; + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Sets a time limit on an asynchronous function. If the function does not call + * its callback within the specified milliseconds, it will be called with a + * timeout error. The code property for the error object will be `'ETIMEDOUT'`. + * + * @name timeout + * @static + * @memberOf module:Utils + * @method + * @category Util + * @param {AsyncFunction} asyncFn - The async function to limit in time. + * @param {number} milliseconds - The specified time limit. + * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) + * to timeout Error for more information.. + * @returns {AsyncFunction} Returns a wrapped function that can be used with any + * of the control flow functions. + * Invoke this function with the same parameters as you would `asyncFunc`. + * @example + * + * function myFunction(foo, callback) { + * doAsyncTask(foo, function(err, data) { + * // handle errors + * if (err) return callback(err); + * + * // do some stuff ... + * + * // return processed data + * return callback(null, data); + * }); + * } + * + * var wrapped = async.timeout(myFunction, 1000); + * + * // call `wrapped` as you would `myFunction` + * wrapped({ bar: 'bar' }, function(err, data) { + * // if `myFunction` takes < 1000 ms to execute, `err` + * // and `data` will have their expected values + * + * // else `err` will be an Error with the code 'ETIMEDOUT' + * }); + */ +function timeout(asyncFn, milliseconds, info) { + var fn = (0, _wrapAsync2.default)(asyncFn); + + return (0, _initialParams2.default)((args, callback) => { + var timedOut = false; + var timer; + + function timeoutCallback() { + var name = asyncFn.name || 'anonymous'; + var error = new Error('Callback function "' + name + '" timed out.'); + error.code = 'ETIMEDOUT'; + if (info) { + error.info = info; + } + timedOut = true; + callback(error); + } + + args.push((...cbArgs) => { + if (!timedOut) { + callback(...cbArgs); + clearTimeout(timer); + } + }); + + // setup timer and call original function + timer = setTimeout(timeoutCallback, milliseconds); + fn(...args); + }); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/times.js b/node_modules/async/times.js new file mode 100644 index 00000000..4484c73e --- /dev/null +++ b/node_modules/async/times.js @@ -0,0 +1,50 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = times; + +var _timesLimit = require('./timesLimit.js'); + +var _timesLimit2 = _interopRequireDefault(_timesLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Calls the `iteratee` function `n` times, and accumulates results in the same + * manner you would use with [map]{@link module:Collections.map}. + * + * @name times + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.map]{@link module:Collections.map} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + * @example + * + * // Pretend this is some complicated async factory + * var createUser = function(id, callback) { + * callback(null, { + * id: 'user' + id + * }); + * }; + * + * // generate 5 users + * async.times(5, function(n, next) { + * createUser(n, function(err, user) { + * next(err, user); + * }); + * }, function(err, users) { + * // we should now have 5 users + * }); + */ +function times(n, iteratee, callback) { + return (0, _timesLimit2.default)(n, Infinity, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timesLimit.js b/node_modules/async/timesLimit.js new file mode 100644 index 00000000..9fb0ba35 --- /dev/null +++ b/node_modules/async/timesLimit.js @@ -0,0 +1,43 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = timesLimit; + +var _mapLimit = require('./mapLimit.js'); + +var _mapLimit2 = _interopRequireDefault(_mapLimit); + +var _range = require('./internal/range.js'); + +var _range2 = _interopRequireDefault(_range); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a + * time. + * + * @name timesLimit + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} count - The number of times to run the function. + * @param {number} limit - The maximum number of async operations at a time. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see [async.map]{@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ +function timesLimit(count, limit, iteratee, callback) { + var _iteratee = (0, _wrapAsync2.default)(iteratee); + return (0, _mapLimit2.default)((0, _range2.default)(count), limit, _iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timesSeries.js b/node_modules/async/timesSeries.js new file mode 100644 index 00000000..a10f0cbe --- /dev/null +++ b/node_modules/async/timesSeries.js @@ -0,0 +1,32 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = timesSeries; + +var _timesLimit = require('./timesLimit.js'); + +var _timesLimit2 = _interopRequireDefault(_timesLimit); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. + * + * @name timesSeries + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.times]{@link module:ControlFlow.times} + * @category Control Flow + * @param {number} n - The number of times to run the function. + * @param {AsyncFunction} iteratee - The async function to call `n` times. + * Invoked with the iteration index and a callback: (n, next). + * @param {Function} callback - see {@link module:Collections.map}. + * @returns {Promise} a promise, if no callback is provided + */ +function timesSeries(n, iteratee, callback) { + return (0, _timesLimit2.default)(n, 1, iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/transform.js b/node_modules/async/transform.js new file mode 100644 index 00000000..75b754e9 --- /dev/null +++ b/node_modules/async/transform.js @@ -0,0 +1,173 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = transform; + +var _eachOf = require('./eachOf.js'); + +var _eachOf2 = _interopRequireDefault(_eachOf); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _promiseCallback = require('./internal/promiseCallback.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * A relative of `reduce`. Takes an Object or Array, and iterates over each + * element in parallel, each step potentially mutating an `accumulator` value. + * The type of the accumulator defaults to the type of collection passed in. + * + * @name transform + * @static + * @memberOf module:Collections + * @method + * @category Collection + * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. + * @param {*} [accumulator] - The initial state of the transform. If omitted, + * it will default to an empty Object or Array, depending on the type of `coll` + * @param {AsyncFunction} iteratee - A function applied to each item in the + * collection that potentially modifies the accumulator. + * Invoked with (accumulator, item, key, callback). + * @param {Function} [callback] - A callback which is called after all the + * `iteratee` functions have finished. Result is the transformed accumulator. + * Invoked with (err, result). + * @returns {Promise} a promise, if no callback provided + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileList = ['file1.txt','file2.txt','file3.txt']; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileList, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * }); + * + * // Using Promises + * async.transform(fileList, transformFileSize) + * .then(result => { + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * (async () => { + * try { + * let result = await async.transform(fileList, transformFileSize); + * console.log(result); + * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] + * } + * catch (err) { + * console.log(err); + * } + * })(); + * + * @example + * + * // file1.txt is a file that is 1000 bytes in size + * // file2.txt is a file that is 2000 bytes in size + * // file3.txt is a file that is 3000 bytes in size + * + * // helper function that returns human-readable size format from bytes + * function formatBytes(bytes, decimals = 2) { + * // implementation not included for brevity + * return humanReadbleFilesize; + * } + * + * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; + * + * // asynchronous function that returns the file size, transformed to human-readable format + * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. + * function transformFileSize(acc, value, key, callback) { + * fs.stat(value, function(err, stat) { + * if (err) { + * return callback(err); + * } + * acc[key] = formatBytes(stat.size); + * callback(null); + * }); + * } + * + * // Using callbacks + * async.transform(fileMap, transformFileSize, function(err, result) { + * if(err) { + * console.log(err); + * } else { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * }); + * + * // Using Promises + * async.transform(fileMap, transformFileSize) + * .then(result => { + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * }).catch(err => { + * console.log(err); + * }); + * + * // Using async/await + * async () => { + * try { + * let result = await async.transform(fileMap, transformFileSize); + * console.log(result); + * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } + * } + * catch (err) { + * console.log(err); + * } + * } + * + */ +function transform(coll, accumulator, iteratee, callback) { + if (arguments.length <= 3 && typeof accumulator === 'function') { + callback = iteratee; + iteratee = accumulator; + accumulator = Array.isArray(coll) ? [] : {}; + } + callback = (0, _once2.default)(callback || (0, _promiseCallback.promiseCallback)()); + var _iteratee = (0, _wrapAsync2.default)(iteratee); + + (0, _eachOf2.default)(coll, (v, k, cb) => { + _iteratee(accumulator, v, k, cb); + }, err => callback(err, accumulator)); + return callback[_promiseCallback.PROMISE_SYMBOL]; +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/tryEach.js b/node_modules/async/tryEach.js new file mode 100644 index 00000000..82fe8ec1 --- /dev/null +++ b/node_modules/async/tryEach.js @@ -0,0 +1,78 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _eachSeries = require('./eachSeries.js'); + +var _eachSeries2 = _interopRequireDefault(_eachSeries); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * It runs each task in series but stops whenever any of the functions were + * successful. If one of the tasks were successful, the `callback` will be + * passed the result of the successful task. If all tasks fail, the callback + * will be passed the error and result (if any) of the final attempt. + * + * @name tryEach + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to + * run, each function is passed a `callback(err, result)` it must call on + * completion with an error `err` (which can be `null`) and an optional `result` + * value. + * @param {Function} [callback] - An optional callback which is called when one + * of the tasks has succeeded, or all have failed. It receives the `err` and + * `result` arguments of the last attempt at completing the `task`. Invoked with + * (err, results). + * @returns {Promise} a promise, if no callback is passed + * @example + * async.tryEach([ + * function getDataFromFirstWebsite(callback) { + * // Try getting the data from the first website + * callback(err, data); + * }, + * function getDataFromSecondWebsite(callback) { + * // First website failed, + * // Try getting the data from the backup website + * callback(err, data); + * } + * ], + * // optional callback + * function(err, results) { + * Now do something with the data. + * }); + * + */ +function tryEach(tasks, callback) { + var error = null; + var result; + return (0, _eachSeries2.default)(tasks, (task, taskCb) => { + (0, _wrapAsync2.default)(task)((err, ...args) => { + if (err === false) return taskCb(err); + + if (args.length < 2) { + [result] = args; + } else { + result = args; + } + error = err; + taskCb(err ? null : {}); + }); + }, () => callback(error, result)); +} + +exports.default = (0, _awaitify2.default)(tryEach); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/unmemoize.js b/node_modules/async/unmemoize.js new file mode 100644 index 00000000..47a92b42 --- /dev/null +++ b/node_modules/async/unmemoize.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = unmemoize; +/** + * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, + * unmemoized form. Handy for testing. + * + * @name unmemoize + * @static + * @memberOf module:Utils + * @method + * @see [async.memoize]{@link module:Utils.memoize} + * @category Util + * @param {AsyncFunction} fn - the memoized function + * @returns {AsyncFunction} a function that calls the original unmemoized function + */ +function unmemoize(fn) { + return (...args) => { + return (fn.unmemoized || fn)(...args); + }; +} +module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/until.js b/node_modules/async/until.js new file mode 100644 index 00000000..3c71e514 --- /dev/null +++ b/node_modules/async/until.js @@ -0,0 +1,61 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = until; + +var _whilst = require('./whilst.js'); + +var _whilst2 = _interopRequireDefault(_whilst); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. `callback` will be passed an error and any + * arguments passed to the final `iteratee`'s callback. + * + * The inverse of [whilst]{@link module:ControlFlow.whilst}. + * + * @name until + * @static + * @memberOf module:ControlFlow + * @method + * @see [async.whilst]{@link module:ControlFlow.whilst} + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (callback). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` fails. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has passed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if a callback is not passed + * + * @example + * const results = [] + * let finished = false + * async.until(function test(cb) { + * cb(null, finished) + * }, function iter(next) { + * fetchPage(url, (err, body) => { + * if (err) return next(err) + * results = results.concat(body.objects) + * finished = !!body.next + * next(err) + * }) + * }, function done (err) { + * // all pages have been fetched + * }) + */ +function until(test, iteratee, callback) { + const _test = (0, _wrapAsync2.default)(test); + return (0, _whilst2.default)(cb => _test((err, truth) => cb(err, !truth)), iteratee, callback); +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/waterfall.js b/node_modules/async/waterfall.js new file mode 100644 index 00000000..fcd0dc1c --- /dev/null +++ b/node_modules/async/waterfall.js @@ -0,0 +1,105 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _once = require('./internal/once.js'); + +var _once2 = _interopRequireDefault(_once); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Runs the `tasks` array of functions in series, each passing their results to + * the next in the array. However, if any of the `tasks` pass an error to their + * own callback, the next function is not executed, and the main `callback` is + * immediately called with the error. + * + * @name waterfall + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} + * to run. + * Each function should complete with any number of `result` values. + * The `result` values will be passed as arguments, in order, to the next task. + * @param {Function} [callback] - An optional callback to run once all the + * functions have completed. This will be passed the results of the last task's + * callback. Invoked with (err, [results]). + * @returns {Promise} a promise, if a callback is omitted + * @example + * + * async.waterfall([ + * function(callback) { + * callback(null, 'one', 'two'); + * }, + * function(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * }, + * function(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + * ], function (err, result) { + * // result now equals 'done' + * }); + * + * // Or, with named functions: + * async.waterfall([ + * myFirstFunction, + * mySecondFunction, + * myLastFunction, + * ], function (err, result) { + * // result now equals 'done' + * }); + * function myFirstFunction(callback) { + * callback(null, 'one', 'two'); + * } + * function mySecondFunction(arg1, arg2, callback) { + * // arg1 now equals 'one' and arg2 now equals 'two' + * callback(null, 'three'); + * } + * function myLastFunction(arg1, callback) { + * // arg1 now equals 'three' + * callback(null, 'done'); + * } + */ +function waterfall(tasks, callback) { + callback = (0, _once2.default)(callback); + if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); + if (!tasks.length) return callback(); + var taskIndex = 0; + + function nextTask(args) { + var task = (0, _wrapAsync2.default)(tasks[taskIndex++]); + task(...args, (0, _onlyOnce2.default)(next)); + } + + function next(err, ...args) { + if (err === false) return; + if (err || taskIndex === tasks.length) { + return callback(err, ...args); + } + nextTask(args); + } + + nextTask([]); +} + +exports.default = (0, _awaitify2.default)(waterfall); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/whilst.js b/node_modules/async/whilst.js new file mode 100644 index 00000000..32a47762 --- /dev/null +++ b/node_modules/async/whilst.js @@ -0,0 +1,78 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _onlyOnce = require('./internal/onlyOnce.js'); + +var _onlyOnce2 = _interopRequireDefault(_onlyOnce); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +var _wrapAsync2 = _interopRequireDefault(_wrapAsync); + +var _awaitify = require('./internal/awaitify.js'); + +var _awaitify2 = _interopRequireDefault(_awaitify); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when + * stopped, or an error occurs. + * + * @name whilst + * @static + * @memberOf module:ControlFlow + * @method + * @category Control Flow + * @param {AsyncFunction} test - asynchronous truth test to perform before each + * execution of `iteratee`. Invoked with (). + * @param {AsyncFunction} iteratee - An async function which is called each time + * `test` passes. Invoked with (callback). + * @param {Function} [callback] - A callback which is called after the test + * function has failed and repeated execution of `iteratee` has stopped. `callback` + * will be passed an error and any arguments passed to the final `iteratee`'s + * callback. Invoked with (err, [results]); + * @returns {Promise} a promise, if no callback is passed + * @example + * + * var count = 0; + * async.whilst( + * function test(cb) { cb(null, count < 5); }, + * function iter(callback) { + * count++; + * setTimeout(function() { + * callback(null, count); + * }, 1000); + * }, + * function (err, n) { + * // 5 seconds have passed, n = 5 + * } + * ); + */ +function whilst(test, iteratee, callback) { + callback = (0, _onlyOnce2.default)(callback); + var _fn = (0, _wrapAsync2.default)(iteratee); + var _test = (0, _wrapAsync2.default)(test); + var results = []; + + function next(err, ...rest) { + if (err) return callback(err); + results = rest; + if (err === false) return; + _test(check); + } + + function check(err, truth) { + if (err) return callback(err); + if (err === false) return; + if (!truth) return callback(null, ...results); + _fn(next); + } + + return _test(check); +} +exports.default = (0, _awaitify2.default)(whilst, 3); +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/wrapSync.js b/node_modules/async/wrapSync.js new file mode 100644 index 00000000..3c3bf886 --- /dev/null +++ b/node_modules/async/wrapSync.js @@ -0,0 +1,118 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = asyncify; + +var _initialParams = require('./internal/initialParams.js'); + +var _initialParams2 = _interopRequireDefault(_initialParams); + +var _setImmediate = require('./internal/setImmediate.js'); + +var _setImmediate2 = _interopRequireDefault(_setImmediate); + +var _wrapAsync = require('./internal/wrapAsync.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Take a sync function and make it async, passing its return value to a + * callback. This is useful for plugging sync functions into a waterfall, + * series, or other async functions. Any arguments passed to the generated + * function will be passed to the wrapped function (except for the final + * callback argument). Errors thrown will be passed to the callback. + * + * If the function passed to `asyncify` returns a Promise, that promises's + * resolved/rejected state will be used to call the callback, rather than simply + * the synchronous return value. + * + * This also means you can asyncify ES2017 `async` functions. + * + * @name asyncify + * @static + * @memberOf module:Utils + * @method + * @alias wrapSync + * @category Util + * @param {Function} func - The synchronous function, or Promise-returning + * function to convert to an {@link AsyncFunction}. + * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be + * invoked with `(args..., callback)`. + * @example + * + * // passing a regular synchronous function + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(JSON.parse), + * function (data, next) { + * // data is the result of parsing the text. + * // If there was a parsing error, it would have been caught. + * } + * ], callback); + * + * // passing a function returning a promise + * async.waterfall([ + * async.apply(fs.readFile, filename, "utf8"), + * async.asyncify(function (contents) { + * return db.model.create(contents); + * }), + * function (model, next) { + * // `model` is the instantiated model object. + * // If there was an error, this function would be skipped. + * } + * ], callback); + * + * // es2017 example, though `asyncify` is not needed if your JS environment + * // supports async functions out of the box + * var q = async.queue(async.asyncify(async function(file) { + * var intermediateStep = await processFile(file); + * return await somePromise(intermediateStep) + * })); + * + * q.push(files); + */ +function asyncify(func) { + if ((0, _wrapAsync.isAsync)(func)) { + return function (...args /*, callback*/) { + const callback = args.pop(); + const promise = func.apply(this, args); + return handlePromise(promise, callback); + }; + } + + return (0, _initialParams2.default)(function (args, callback) { + var result; + try { + result = func.apply(this, args); + } catch (e) { + return callback(e); + } + // if result is Promise object + if (result && typeof result.then === 'function') { + return handlePromise(result, callback); + } else { + callback(null, result); + } + }); +} + +function handlePromise(promise, callback) { + return promise.then(value => { + invokeCallback(callback, null, value); + }, err => { + invokeCallback(callback, err && err.message ? err : new Error(err)); + }); +} + +function invokeCallback(callback, error, value) { + try { + callback(error, value); + } catch (err) { + (0, _setImmediate2.default)(e => { + throw e; + }, err); + } +} +module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/asynckit/LICENSE b/node_modules/asynckit/LICENSE new file mode 100644 index 00000000..c9eca5dd --- /dev/null +++ b/node_modules/asynckit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +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/asynckit/README.md b/node_modules/asynckit/README.md new file mode 100644 index 00000000..ddcc7e6b --- /dev/null +++ b/node_modules/asynckit/README.md @@ -0,0 +1,233 @@ +# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit) + +Minimal async jobs utility library, with streams support. + +[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit) + +[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master) +[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit) +[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit) + + + +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/lib/abort.js b/node_modules/asynckit/lib/abort.js new file mode 100644 index 00000000..114367e5 --- /dev/null +++ b/node_modules/asynckit/lib/abort.js @@ -0,0 +1,29 @@ +// API +module.exports = abort; + +/** + * Aborts leftover active jobs + * + * @param {object} state - current state object + */ +function abort(state) +{ + Object.keys(state.jobs).forEach(clean.bind(state)); + + // reset leftover jobs + state.jobs = {}; +} + +/** + * Cleans up leftover job by invoking abort function for the provided job id + * + * @this state + * @param {string|number} key - job id to abort + */ +function clean(key) +{ + if (typeof this.jobs[key] == 'function') + { + this.jobs[key](); + } +} diff --git a/node_modules/asynckit/lib/async.js b/node_modules/asynckit/lib/async.js new file mode 100644 index 00000000..7f1288a4 --- /dev/null +++ b/node_modules/asynckit/lib/async.js @@ -0,0 +1,34 @@ +var defer = require('./defer.js'); + +// API +module.exports = async; + +/** + * Runs provided callback asynchronously + * even if callback itself is not + * + * @param {function} callback - callback to invoke + * @returns {function} - augmented callback + */ +function async(callback) +{ + var isAsync = false; + + // check if async happened + defer(function() { isAsync = true; }); + + return function async_callback(err, result) + { + if (isAsync) + { + callback(err, result); + } + else + { + defer(function nextTick_callback() + { + callback(err, result); + }); + } + }; +} diff --git a/node_modules/asynckit/lib/defer.js b/node_modules/asynckit/lib/defer.js new file mode 100644 index 00000000..b67110c7 --- /dev/null +++ b/node_modules/asynckit/lib/defer.js @@ -0,0 +1,26 @@ +module.exports = defer; + +/** + * Runs provided function on next iteration of the event loop + * + * @param {function} fn - function to run + */ +function defer(fn) +{ + var nextTick = typeof setImmediate == 'function' + ? setImmediate + : ( + typeof process == 'object' && typeof process.nextTick == 'function' + ? process.nextTick + : null + ); + + if (nextTick) + { + nextTick(fn); + } + else + { + setTimeout(fn, 0); + } +} diff --git a/node_modules/asynckit/lib/iterate.js b/node_modules/asynckit/lib/iterate.js new file mode 100644 index 00000000..5d2839a5 --- /dev/null +++ b/node_modules/asynckit/lib/iterate.js @@ -0,0 +1,75 @@ +var async = require('./async.js') + , abort = require('./abort.js') + ; + +// API +module.exports = iterate; + +/** + * Iterates over each job object + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {object} state - current job status + * @param {function} callback - invoked when all elements processed + */ +function iterate(list, iterator, state, callback) +{ + // store current index + var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; + + state.jobs[key] = runJob(iterator, key, list[key], function(error, output) + { + // don't repeat yourself + // skip secondary callbacks + if (!(key in state.jobs)) + { + return; + } + + // clean up jobs + delete state.jobs[key]; + + if (error) + { + // don't process rest of the results + // stop still active jobs + // and reset the list + abort(state); + } + else + { + state.results[key] = output; + } + + // return salvaged results + callback(error, state.results); + }); +} + +/** + * Runs iterator over provided job element + * + * @param {function} iterator - iterator to invoke + * @param {string|number} key - key/index of the element in the list of jobs + * @param {mixed} item - job description + * @param {function} callback - invoked after iterator is done with the job + * @returns {function|mixed} - job abort function or something else + */ +function runJob(iterator, key, item, callback) +{ + var aborter; + + // allow shortcut if iterator expects only two arguments + if (iterator.length == 2) + { + aborter = iterator(item, async(callback)); + } + // otherwise go with full three arguments + else + { + aborter = iterator(item, key, async(callback)); + } + + return aborter; +} diff --git a/node_modules/asynckit/lib/readable_asynckit.js b/node_modules/asynckit/lib/readable_asynckit.js new file mode 100644 index 00000000..78ad240f --- /dev/null +++ b/node_modules/asynckit/lib/readable_asynckit.js @@ -0,0 +1,91 @@ +var streamify = require('./streamify.js') + , defer = require('./defer.js') + ; + +// API +module.exports = ReadableAsyncKit; + +/** + * Base constructor for all streams + * used to hold properties/methods + */ +function ReadableAsyncKit() +{ + ReadableAsyncKit.super_.apply(this, arguments); + + // list of active jobs + this.jobs = {}; + + // add stream methods + this.destroy = destroy; + this._start = _start; + this._read = _read; +} + +/** + * Destroys readable stream, + * by aborting outstanding jobs + * + * @returns {void} + */ +function destroy() +{ + if (this.destroyed) + { + return; + } + + this.destroyed = true; + + if (typeof this.terminator == 'function') + { + this.terminator(); + } +} + +/** + * Starts provided jobs in async manner + * + * @private + */ +function _start() +{ + // first argument – runner function + var runner = arguments[0] + // take away first argument + , args = Array.prototype.slice.call(arguments, 1) + // second argument - input data + , input = args[0] + // last argument - result callback + , endCb = streamify.callback.call(this, args[args.length - 1]) + ; + + args[args.length - 1] = endCb; + // third argument - iterator + args[1] = streamify.iterator.call(this, args[1]); + + // allow time for proper setup + defer(function() + { + if (!this.destroyed) + { + this.terminator = runner.apply(null, args); + } + else + { + endCb(null, Array.isArray(input) ? [] : {}); + } + }.bind(this)); +} + + +/** + * Implement _read to comply with Readable streams + * Doesn't really make sense for flowing object mode + * + * @private + */ +function _read() +{ + +} diff --git a/node_modules/asynckit/lib/readable_parallel.js b/node_modules/asynckit/lib/readable_parallel.js new file mode 100644 index 00000000..5d2929f7 --- /dev/null +++ b/node_modules/asynckit/lib/readable_parallel.js @@ -0,0 +1,25 @@ +var parallel = require('../parallel.js'); + +// API +module.exports = ReadableParallel; + +/** + * Streaming wrapper to `asynckit.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 {stream.Readable#} + */ +function ReadableParallel(list, iterator, callback) +{ + if (!(this instanceof ReadableParallel)) + { + return new ReadableParallel(list, iterator, callback); + } + + // turn on object mode + ReadableParallel.super_.call(this, {objectMode: true}); + + this._start(parallel, list, iterator, callback); +} diff --git a/node_modules/asynckit/lib/readable_serial.js b/node_modules/asynckit/lib/readable_serial.js new file mode 100644 index 00000000..78226982 --- /dev/null +++ b/node_modules/asynckit/lib/readable_serial.js @@ -0,0 +1,25 @@ +var serial = require('../serial.js'); + +// API +module.exports = ReadableSerial; + +/** + * Streaming wrapper to `asynckit.serial` + * + * @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 {stream.Readable#} + */ +function ReadableSerial(list, iterator, callback) +{ + if (!(this instanceof ReadableSerial)) + { + return new ReadableSerial(list, iterator, callback); + } + + // turn on object mode + ReadableSerial.super_.call(this, {objectMode: true}); + + this._start(serial, list, iterator, callback); +} diff --git a/node_modules/asynckit/lib/readable_serial_ordered.js b/node_modules/asynckit/lib/readable_serial_ordered.js new file mode 100644 index 00000000..3de89c47 --- /dev/null +++ b/node_modules/asynckit/lib/readable_serial_ordered.js @@ -0,0 +1,29 @@ +var serialOrdered = require('../serialOrdered.js'); + +// API +module.exports = ReadableSerialOrdered; +// expose sort helpers +module.exports.ascending = serialOrdered.ascending; +module.exports.descending = serialOrdered.descending; + +/** + * Streaming wrapper to `asynckit.serialOrdered` + * + * @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 {stream.Readable#} + */ +function ReadableSerialOrdered(list, iterator, sortMethod, callback) +{ + if (!(this instanceof ReadableSerialOrdered)) + { + return new ReadableSerialOrdered(list, iterator, sortMethod, callback); + } + + // turn on object mode + ReadableSerialOrdered.super_.call(this, {objectMode: true}); + + this._start(serialOrdered, list, iterator, sortMethod, callback); +} diff --git a/node_modules/asynckit/lib/state.js b/node_modules/asynckit/lib/state.js new file mode 100644 index 00000000..cbea7ad8 --- /dev/null +++ b/node_modules/asynckit/lib/state.js @@ -0,0 +1,37 @@ +// API +module.exports = state; + +/** + * Creates initial state object + * for iteration over list + * + * @param {array|object} list - list to iterate over + * @param {function|null} sortMethod - function to use for keys sort, + * or `null` to keep them as is + * @returns {object} - initial state object + */ +function state(list, sortMethod) +{ + var isNamedList = !Array.isArray(list) + , initState = + { + index : 0, + keyedList: isNamedList || sortMethod ? Object.keys(list) : null, + jobs : {}, + results : isNamedList ? {} : [], + size : isNamedList ? Object.keys(list).length : list.length + } + ; + + if (sortMethod) + { + // sort array keys based on it's values + // sort object's keys just on own merit + initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) + { + return sortMethod(list[a], list[b]); + }); + } + + return initState; +} diff --git a/node_modules/asynckit/lib/streamify.js b/node_modules/asynckit/lib/streamify.js new file mode 100644 index 00000000..f56a1c92 --- /dev/null +++ b/node_modules/asynckit/lib/streamify.js @@ -0,0 +1,141 @@ +var async = require('./async.js'); + +// API +module.exports = { + iterator: wrapIterator, + callback: wrapCallback +}; + +/** + * Wraps iterators with long signature + * + * @this ReadableAsyncKit# + * @param {function} iterator - function to wrap + * @returns {function} - wrapped function + */ +function wrapIterator(iterator) +{ + var stream = this; + + return function(item, key, cb) + { + var aborter + , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) + ; + + stream.jobs[key] = wrappedCb; + + // it's either shortcut (item, cb) + if (iterator.length == 2) + { + aborter = iterator(item, wrappedCb); + } + // or long format (item, key, cb) + else + { + aborter = iterator(item, key, wrappedCb); + } + + return aborter; + }; +} + +/** + * Wraps provided callback function + * allowing to execute snitch function before + * real callback + * + * @this ReadableAsyncKit# + * @param {function} callback - function to wrap + * @returns {function} - wrapped function + */ +function wrapCallback(callback) +{ + var stream = this; + + var wrapped = function(error, result) + { + return finisher.call(stream, error, result, callback); + }; + + return wrapped; +} + +/** + * Wraps provided iterator callback function + * makes sure snitch only called once, + * but passes secondary calls to the original callback + * + * @this ReadableAsyncKit# + * @param {function} callback - callback to wrap + * @param {number|string} key - iteration key + * @returns {function} wrapped callback + */ +function wrapIteratorCallback(callback, key) +{ + var stream = this; + + return function(error, output) + { + // don't repeat yourself + if (!(key in stream.jobs)) + { + callback(error, output); + return; + } + + // clean up jobs + delete stream.jobs[key]; + + return streamer.call(stream, error, {key: key, value: output}, callback); + }; +} + +/** + * Stream wrapper for iterator callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects iterator results + */ +function streamer(error, output, callback) +{ + if (error && !this.error) + { + this.error = error; + this.pause(); + this.emit('error', error); + // send back value only, as expected + callback(error, output && output.value); + return; + } + + // stream stuff + this.push(output); + + // back to original track + // send back value only, as expected + callback(error, output && output.value); +} + +/** + * Stream wrapper for finishing callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects final results + */ +function finisher(error, output, callback) +{ + // signal end of the stream + // only for successfully finished streams + if (!error) + { + this.push(null); + } + + // back to original track + callback(error, output); +} diff --git a/node_modules/asynckit/lib/terminator.js b/node_modules/asynckit/lib/terminator.js new file mode 100644 index 00000000..d6eb9921 --- /dev/null +++ b/node_modules/asynckit/lib/terminator.js @@ -0,0 +1,29 @@ +var abort = require('./abort.js') + , async = require('./async.js') + ; + +// API +module.exports = terminator; + +/** + * Terminates jobs in the attached state context + * + * @this AsyncKitState# + * @param {function} callback - final callback to invoke after termination + */ +function terminator(callback) +{ + if (!Object.keys(this.jobs).length) + { + return; + } + + // fast forward iteration index + this.index = this.size; + + // abort jobs + abort(this); + + // send back results we have so far + async(callback)(null, this.results); +} 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/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..4e9e66fb --- /dev/null +++ b/node_modules/aws4/README.md @@ -0,0 +1,213 @@ +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 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":[]} +... +*/ + +// you can also specify extra headers to ignore during signing +request(aws4.sign({ + host: '07tjusf2h91cunochc.us-east-1.aoss.amazonaws.com', + method: 'PUT', + path: '/my-index', + body: '{"mappings":{}}', + headers: { + 'Content-Type': 'application/json', + 'X-Amz-Content-Sha256': 'UNSIGNED-PAYLOAD' + }, + extraHeadersToIgnore: { + 'content-length': true + } +})) + +// and headers to include that would normally be ignored +request(aws4.sign({ + service: 'mycustomservice', + path: '/whatever', + headers: { + 'Range': 'bytes=200-1000, 2000-6576, 19000-' + }, + extraHeadersToInclude: { + 'range': true + } +})) + + +// 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) +- `extraHeadersToIgnore` (an object with lowercase header keys to ignore when signing, eg `{ 'content-length': true }`) +- `extraHeadersToInclude` (an object with lowercase header keys to include when signing, overriding any ignores) +- `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..b0cfb7c1 --- /dev/null +++ b/node_modules/aws4/aws4.js @@ -0,0 +1,381 @@ +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' + + this.extraHeadersToIgnore = request.extraHeadersToIgnore || Object.create(null) + this.extraHeadersToInclude = request.extraHeadersToInclude || Object.create(null) +} + +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[1] === 'aoss') + 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() { + var extraHeadersToInclude = this.extraHeadersToInclude, + extraHeadersToIgnore = this.extraHeadersToIgnore + return Object.keys(this.request.headers) + .map(function(key) { return key.toLowerCase() }) + .filter(function(key) { + return extraHeadersToInclude[key] || + (HEADERS_TO_IGNORE[key] == null && !extraHeadersToIgnore[key]) + }) + .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..534b31d6 --- /dev/null +++ b/node_modules/aws4/package.json @@ -0,0 +1,17 @@ +{ + "name": "aws4", + "version": "1.12.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/balanced-match/.github/FUNDING.yml b/node_modules/balanced-match/.github/FUNDING.yml new file mode 100644 index 00000000..cea8b16e --- /dev/null +++ b/node_modules/balanced-match/.github/FUNDING.yml @@ -0,0 +1,2 @@ +tidelift: "npm/balanced-match" +patreon: juliangruber 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..d2a48b6b --- /dev/null +++ b/node_modules/balanced-match/README.md @@ -0,0 +1,97 @@ +# 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 +``` + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## 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..c67a6460 --- /dev/null +++ b/node_modules/balanced-match/index.js @@ -0,0 +1,62 @@ +'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) { + if(a===b) { + return [ai, bi]; + } + 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..ce6073e0 --- /dev/null +++ b/node_modules/balanced-match/package.json @@ -0,0 +1,48 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "1.0.2", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "tape test/test.js", + "bench": "matcha test/bench.js" + }, + "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/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..4aab3837 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,260 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "appimage", + "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", + "flatpak", + "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", + "odp", + "ods", + "odt", + "oga", + "ogg", + "ogv", + "otf", + "ott", + "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", + "rpm", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "snap", + "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/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 00000000..94a248c2 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts new file mode 100644 index 00000000..f469ac5f --- /dev/null +++ b/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js new file mode 100644 index 00000000..d46e4688 --- /dev/null +++ b/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license new file mode 100644 index 00000000..401b1c73 --- /dev/null +++ b/node_modules/binary-extensions/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.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..c4d36417 --- /dev/null +++ b/node_modules/binary-extensions/package.json @@ -0,0 +1,38 @@ +{ + "name": "binary-extensions", + "version": "2.2.0", + "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": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md new file mode 100644 index 00000000..3e25dd83 --- /dev/null +++ b/node_modules/binary-extensions/readme.md @@ -0,0 +1,41 @@ +# 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 + + +--- + + diff --git a/node_modules/body-parser/HISTORY.md b/node_modules/body-parser/HISTORY.md new file mode 100644 index 00000000..fb212b36 --- /dev/null +++ b/node_modules/body-parser/HISTORY.md @@ -0,0 +1,657 @@ +1.20.1 / 2022-10-06 +=================== + + * deps: qs@6.11.0 + * perf: remove unnecessary object clone + +1.20.0 / 2022-04-02 +=================== + + * Fix error message for json parse whitespace in `strict` + * Fix internal error when inflated body exceeds limit + * Prevent loss of async hooks context + * Prevent hanging when request already read + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: qs@6.10.3 + * deps: raw-body@2.5.1 + - deps: http-errors@2.0.0 + +1.19.2 / 2022-02-15 +=================== + + * deps: bytes@3.1.2 + * deps: qs@6.9.7 + * Fix handling of `__proto__` keys + * deps: raw-body@2.4.3 + - deps: bytes@3.1.2 + +1.19.1 / 2021-12-10 +=================== + + * deps: bytes@3.1.1 + * deps: http-errors@1.8.1 + - deps: inherits@2.0.4 + - deps: toidentifier@1.0.1 + - deps: setprototypeof@1.2.0 + * deps: qs@6.9.6 + * deps: raw-body@2.4.2 + - deps: bytes@3.1.1 + - deps: http-errors@1.8.1 + * deps: safe-buffer@5.2.1 + * deps: type-is@~1.6.18 + +1.19.0 / 2019-04-25 +=================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + * deps: qs@6.7.0 + - Fix parsing array brackets after index + * deps: raw-body@2.4.0 + - deps: bytes@3.1.0 + - deps: http-errors@1.7.2 + - deps: iconv-lite@0.4.24 + * deps: type-is@~1.6.17 + - deps: mime-types@~2.1.24 + - perf: prevent internal `throw` on invalid type + +1.18.3 / 2018-05-14 +=================== + + * Fix stack trace for strict json parse error + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: http-errors@~1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + * deps: qs@6.5.2 + * deps: raw-body@2.3.3 + - deps: http-errors@1.6.3 + - deps: iconv-lite@0.4.23 + * deps: type-is@~1.6.16 + - deps: mime-types@~2.1.18 + +1.18.2 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: remove argument reassignment + +1.18.1 / 2017-09-12 +=================== + + * deps: content-type@~1.0.4 + - perf: remove argument reassignment + - perf: skip parameter parsing when no parameters + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + * deps: qs@6.5.1 + - Fix parsing & compacting very deep objects + * deps: raw-body@2.3.2 + - deps: iconv-lite@0.4.19 + +1.18.0 / 2017-09-08 +=================== + + * Fix JSON strict violation error to match native parse error + * Include the `body` property on verify errors + * Include the `type` property on all generated errors + * Use `http-errors` to set status code on errors + * deps: bytes@3.0.0 + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + * deps: qs@6.5.0 + * deps: raw-body@2.3.1 + - Use `http-errors` for standard emitted errors + - deps: bytes@3.0.0 + - deps: iconv-lite@0.4.18 + - perf: skip buffer decoding on overage chunk + * perf: prevent internal `throw` when missing charset + +1.17.2 / 2017-05-17 +=================== + + * deps: debug@2.6.7 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@2.0.0 + * deps: type-is@~1.6.15 + - deps: mime-types@~2.1.15 + +1.17.1 / 2017-03-06 +=================== + + * deps: qs@6.4.0 + - Fix regression parsing keys starting with `[` + +1.17.0 / 2017-03-01 +=================== + + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + * deps: qs@6.3.1 + - Fix compacting nested arrays + +1.16.1 / 2017-02-10 +=================== + + * deps: debug@2.6.1 + - Fix deprecation messages in WebStorm and other editors + - Undeprecate `DEBUG_FD` set to `1` or `2` + +1.16.0 / 2017-01-17 +=================== + + * deps: debug@2.6.0 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + * deps: qs@6.2.1 + - Fix array parsing from skipping empty values + * deps: raw-body@~2.2.0 + - deps: iconv-lite@0.4.15 + * deps: type-is@~1.6.14 + - deps: mime-types@~2.1.13 + +1.15.2 / 2016-06-19 +=================== + + * deps: bytes@2.4.0 + * deps: content-type@~1.0.2 + - perf: enable strict mode + * deps: http-errors@~1.5.0 + - Use `setprototypeof` module to replace `__proto__` setting + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: qs@6.2.0 + * deps: raw-body@~2.1.7 + - deps: bytes@2.4.0 + - perf: remove double-cleanup on happy path + * deps: type-is@~1.6.13 + - deps: mime-types@~2.1.11 + +1.15.1 / 2016-05-05 +=================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + * deps: raw-body@~2.1.6 + - deps: bytes@2.3.0 + * deps: type-is@~1.6.12 + - deps: mime-types@~2.1.10 + +1.15.0 / 2016-02-10 +=================== + + * deps: http-errors@~1.4.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.2.1 < 2' + * deps: qs@6.1.0 + * deps: type-is@~1.6.11 + - deps: mime-types@~2.1.9 + +1.14.2 / 2015-12-16 +=================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + * deps: qs@5.2.0 + * deps: raw-body@~2.1.5 + - deps: bytes@2.2.0 + - deps: iconv-lite@0.4.13 + * deps: type-is@~1.6.10 + - deps: mime-types@~2.1.8 + +1.14.1 / 2015-09-27 +=================== + + * Fix issue where invalid charset results in 400 when `verify` used + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + * deps: raw-body@~2.1.4 + - Fix masking critical errors from `iconv-lite` + - deps: iconv-lite@0.4.12 + * deps: type-is@~1.6.9 + - deps: mime-types@~2.1.7 + +1.14.0 / 2015-09-16 +=================== + + * Fix JSON strict parse error to match syntax errors + * Provide static `require` analysis in `urlencoded` parser + * deps: depd@~1.1.0 + - Support web browser loading + * deps: qs@5.1.0 + * deps: raw-body@~2.1.3 + - Fix sync callback when attaching data listener causes sync read + * deps: type-is@~1.6.8 + - Fix type error when given invalid type to match against + - deps: mime-types@~2.1.6 + +1.13.3 / 2015-07-31 +=================== + + * deps: type-is@~1.6.6 + - deps: mime-types@~2.1.4 + +1.13.2 / 2015-07-05 +=================== + + * deps: iconv-lite@0.4.11 + * deps: qs@4.0.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix user-visible incompatibilities from 3.1.0 + - Fix various parsing edge cases + * deps: raw-body@~2.1.2 + - Fix error stack traces to skip `makeError` + - deps: iconv-lite@0.4.11 + * deps: type-is@~1.6.4 + - deps: mime-types@~2.1.2 + - perf: enable strict mode + - perf: remove argument reassignment + +1.13.1 / 2015-06-16 +=================== + + * deps: qs@2.4.2 + - Downgraded from 3.1.0 because of user-visible incompatibilities + +1.13.0 / 2015-06-14 +=================== + + * Add `statusCode` property on `Error`s, in addition to `status` + * Change `type` default to `application/json` for JSON parser + * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser + * Provide static `require` analysis + * Use the `http-errors` module to generate errors + * deps: bytes@2.1.0 + - Slight optimizations + * deps: iconv-lite@0.4.10 + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + - Leading BOM is now removed when decoding + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * deps: qs@3.1.0 + - Fix dropping parameters like `hasOwnProperty` + - Fix various parsing edge cases + - Parsed object now has `null` prototype + * deps: raw-body@~2.1.1 + - Use `unpipe` module for unpiping requests + - deps: iconv-lite@0.4.10 + * deps: type-is@~1.6.3 + - deps: mime-types@~2.1.1 + - perf: reduce try block size + - perf: remove bitwise operations + * perf: enable strict mode + * perf: remove argument reassignment + * perf: remove delete call + +1.12.4 / 2015-05-10 +=================== + + * deps: debug@~2.2.0 + * deps: qs@2.4.2 + - Fix allowing parameters like `constructor` + * deps: on-finished@~2.2.1 + * deps: raw-body@~2.0.1 + - Fix a false-positive when unpiping in Node.js 0.8 + - deps: bytes@2.0.1 + * deps: type-is@~1.6.2 + - deps: mime-types@~2.0.11 + +1.12.3 / 2015-04-15 +=================== + + * Slight efficiency improvement when not debugging + * deps: depd@~1.0.1 + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + * deps: raw-body@1.3.4 + - Fix hanging callback if request aborts during read + - deps: iconv-lite@0.4.8 + +1.12.2 / 2015-03-16 +=================== + + * deps: qs@2.4.1 + - Fix error when parameter `hasOwnProperty` is present + +1.12.1 / 2015-03-15 +=================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + * deps: type-is@~1.6.1 + - deps: mime-types@~2.0.10 + +1.12.0 / 2015-02-13 +=================== + + * add `debug` messages + * accept a function for the `type` option + * use `content-type` to parse `Content-Type` headers + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + * deps: raw-body@1.3.3 + - deps: iconv-lite@0.4.7 + * deps: type-is@~1.6.0 + - fix argument reassignment + - fix false-positives in `hasBody` `Transfer-Encoding` check + - support wildcard for both type and subtype (`*/*`) + - deps: mime-types@~2.0.9 + +1.11.0 / 2015-01-30 +=================== + + * make internal `extended: true` depth limit infinity + * deps: type-is@~1.5.6 + - deps: mime-types@~2.0.8 + +1.10.2 / 2015-01-20 +=================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + * deps: raw-body@1.3.2 + - deps: iconv-lite@0.4.6 + +1.10.1 / 2015-01-01 +=================== + + * deps: on-finished@~2.2.0 + * deps: type-is@~1.5.5 + - deps: mime-types@~2.0.7 + +1.10.0 / 2014-12-02 +=================== + + * make internal `extended: true` array limit dynamic + +1.9.3 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + * deps: qs@2.3.3 + - Fix `arrayLimit` behavior + * deps: raw-body@1.3.1 + - deps: iconv-lite@0.4.5 + * deps: type-is@~1.5.3 + - deps: mime-types@~2.0.3 + +1.9.2 / 2014-10-27 +================== + + * deps: qs@2.3.2 + - Fix parsing of mixed objects and values + +1.9.1 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + * deps: qs@2.3.0 + - Fix parsing of mixed implicit and explicit arrays + * deps: type-is@~1.5.2 + - deps: mime-types@~2.0.2 + +1.9.0 / 2014-09-24 +================== + + * include the charset in "unsupported charset" error message + * include the encoding in "unsupported content encoding" error message + * deps: depd@~1.0.0 + +1.8.4 / 2014-09-23 +================== + + * fix content encoding to be case-insensitive + +1.8.3 / 2014-09-19 +================== + + * deps: qs@2.2.4 + - Fix issue with object keys starting with numbers truncated + +1.8.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + +1.8.1 / 2014-09-07 +================== + + * deps: media-typer@0.3.0 + * deps: type-is@~1.5.1 + +1.8.0 / 2014-09-05 +================== + + * make empty-body-handling consistent between chunked requests + - empty `json` produces `{}` + - empty `raw` produces `new Buffer(0)` + - empty `text` produces `''` + - empty `urlencoded` produces `{}` + * deps: qs@2.2.3 + - Fix issue where first empty value in array is discarded + * deps: type-is@~1.5.0 + - fix `hasbody` to be true for `content-length: 0` + +1.7.0 / 2014-09-01 +================== + + * add `parameterLimit` option to `urlencoded` parser + * change `urlencoded` extended array limit to 100 + * respond with 413 when over `parameterLimit` in `urlencoded` + +1.6.7 / 2014-08-29 +================== + + * deps: qs@2.2.2 + - Remove unnecessary cloning + +1.6.6 / 2014-08-27 +================== + + * deps: qs@2.2.0 + - Array parsing fix + - Performance improvements + +1.6.5 / 2014-08-16 +================== + + * deps: on-finished@2.1.0 + +1.6.4 / 2014-08-14 +================== + + * deps: qs@1.2.2 + +1.6.3 / 2014-08-10 +================== + + * deps: qs@1.2.1 + +1.6.2 / 2014-08-07 +================== + + * deps: qs@1.2.0 + - Fix parsing array of objects + +1.6.1 / 2014-08-06 +================== + + * deps: qs@1.1.0 + - Accept urlencoded square brackets + - Accept empty values in implicit array notation + +1.6.0 / 2014-08-05 +================== + + * deps: qs@1.0.2 + - Complete rewrite + - Limits array length to 20 + - Limits object depth to 5 + - Limits parameters to 1,000 + +1.5.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +1.5.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +1.5.0 / 2014-07-20 +================== + + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + * deps: raw-body@1.3.0 + - deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + - Fix `Cannot switch to old mode now` error on Node.js 0.10+ + * deps: type-is@~1.3.2 + +1.4.3 / 2014-06-19 +================== + + * deps: type-is@1.3.1 + - fix global variable leak + +1.4.2 / 2014-06-19 +================== + + * deps: type-is@1.3.0 + - improve type parsing + +1.4.1 / 2014-06-19 +================== + + * fix urlencoded extended deprecation message + +1.4.0 / 2014-06-19 +================== + + * add `text` parser + * add `raw` parser + * check accepted charset in content-type (accepts utf-8) + * check accepted encoding in content-encoding (accepts identity) + * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed + * deprecate `urlencoded()` without provided `extended` option + * lazy-load urlencoded parsers + * parsers split into files for reduced mem usage + * support gzip and deflate bodies + - set `inflate: false` to turn off + * deps: raw-body@1.2.2 + - Support all encodings from `iconv-lite` + +1.3.1 / 2014-06-11 +================== + + * deps: type-is@1.2.1 + - Switch dependency from mime to mime-types@1.0.0 + +1.3.0 / 2014-05-31 +================== + + * add `extended` option to urlencoded parser + +1.2.2 / 2014-05-27 +================== + + * deps: raw-body@1.1.6 + - assert stream encoding on node.js 0.8 + - assert stream encoding on node.js < 0.10.6 + - deps: bytes@1 + +1.2.1 / 2014-05-26 +================== + + * invoke `next(err)` after request fully read + - prevents hung responses and socket hang ups + +1.2.0 / 2014-05-11 +================== + + * add `verify` option + * deps: type-is@1.2.0 + - support suffix matching + +1.1.2 / 2014-05-11 +================== + + * improve json parser speed + +1.1.1 / 2014-05-11 +================== + + * fix repeated limit parsing with every request + +1.1.0 / 2014-05-10 +================== + + * add `type` option + * deps: pin for safety and consistency + +1.0.2 / 2014-04-14 +================== + + * use `type-is` module + +1.0.1 / 2014-03-20 +================== + + * lower default limits to 100kb diff --git a/node_modules/body-parser/LICENSE b/node_modules/body-parser/LICENSE new file mode 100644 index 00000000..386b7b69 --- /dev/null +++ b/node_modules/body-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/body-parser/README.md b/node_modules/body-parser/README.md new file mode 100644 index 00000000..c507cbb0 --- /dev/null +++ b/node_modules/body-parser/README.md @@ -0,0 +1,464 @@ +# body-parser + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js body parsing middleware. + +Parse incoming request bodies in a middleware before your handlers, available +under the `req.body` property. + +**Note** As `req.body`'s shape is based on user-controlled input, all +properties and values in this object are untrusted and should be validated +before trusting. For example, `req.body.foo.toString()` may fail in multiple +ways, for example the `foo` property may not be there or may not be a string, +and `toString` may not be a function and instead a string or other user input. + +[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). + +_This does not handle multipart bodies_, due to their complex and typically +large nature. For multipart bodies, you may be interested in the following +modules: + + * [busboy](https://www.npmjs.org/package/busboy#readme) and + [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) + * [multiparty](https://www.npmjs.org/package/multiparty#readme) and + [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) + * [formidable](https://www.npmjs.org/package/formidable#readme) + * [multer](https://www.npmjs.org/package/multer#readme) + +This module provides the following parsers: + + * [JSON body parser](#bodyparserjsonoptions) + * [Raw body parser](#bodyparserrawoptions) + * [Text body parser](#bodyparsertextoptions) + * [URL-encoded form body parser](#bodyparserurlencodedoptions) + +Other body parsers you might be interested in: + +- [body](https://www.npmjs.org/package/body#readme) +- [co-body](https://www.npmjs.org/package/co-body#readme) + +## Installation + +```sh +$ npm install body-parser +``` + +## API + +```js +var bodyParser = require('body-parser') +``` + +The `bodyParser` object exposes various factories to create middlewares. All +middlewares will populate the `req.body` property with the parsed body when +the `Content-Type` request header matches the `type` option, or an empty +object (`{}`) if there was no body to parse, the `Content-Type` was not matched, +or an error occurred. + +The various errors returned by this module are described in the +[errors section](#errors). + +### bodyParser.json([options]) + +Returns middleware that only parses `json` and only looks at requests where +the `Content-Type` header matches the `type` option. This parser accepts any +Unicode encoding of the body and supports automatic inflation of `gzip` and +`deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). + +#### Options + +The `json` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### reviver + +The `reviver` option is passed directly to `JSON.parse` as the second +argument. You can find more information on this argument +[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). + +##### strict + +When set to `true`, will only accept arrays and objects; when `false` will +accept anything `JSON.parse` accepts. Defaults to `true`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not a +function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `json`), a mime type (like `application/json`), or +a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a truthy +value. Defaults to `application/json`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.raw([options]) + +Returns middleware that parses all bodies as a `Buffer` and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a `Buffer` object +of the body. + +#### Options + +The `raw` function takes an optional `options` object that may contain any of +the following keys: + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. +If not a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this +can be an extension name (like `bin`), a mime type (like +`application/octet-stream`), or a mime type with a wildcard (like `*/*` or +`application/*`). If a function, the `type` option is called as `fn(req)` +and the request is parsed if it returns a truthy value. Defaults to +`application/octet-stream`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.text([options]) + +Returns middleware that parses all bodies as a string and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser supports automatic inflation of `gzip` and `deflate` encodings. + +A new `body` string containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This will be a string of the +body. + +#### Options + +The `text` function takes an optional `options` object that may contain any of +the following keys: + +##### defaultCharset + +Specify the default character set for the text content if the charset is not +specified in the `Content-Type` header of the request. Defaults to `utf-8`. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `txt`), a mime type (like `text/plain`), or a mime +type with a wildcard (like `*/*` or `text/*`). If a function, the `type` +option is called as `fn(req)` and the request is parsed if it returns a +truthy value. Defaults to `text/plain`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +### bodyParser.urlencoded([options]) + +Returns middleware that only parses `urlencoded` bodies and only looks at +requests where the `Content-Type` header matches the `type` option. This +parser accepts only UTF-8 encoding of the body and supports automatic +inflation of `gzip` and `deflate` encodings. + +A new `body` object containing the parsed data is populated on the `request` +object after the middleware (i.e. `req.body`). This object will contain +key-value pairs, where the value can be a string or array (when `extended` is +`false`), or any type (when `extended` is `true`). + +#### Options + +The `urlencoded` function takes an optional `options` object that may contain +any of the following keys: + +##### extended + +The `extended` option allows to choose between parsing the URL-encoded data +with the `querystring` library (when `false`) or the `qs` library (when +`true`). The "extended" syntax allows for rich objects and arrays to be +encoded into the URL-encoded format, allowing for a JSON-like experience +with URL-encoded. For more information, please +[see the qs library](https://www.npmjs.org/package/qs#readme). + +Defaults to `true`, but using the default has been deprecated. Please +research into the difference between `qs` and `querystring` and choose the +appropriate setting. + +##### inflate + +When set to `true`, then deflated (compressed) bodies will be inflated; when +`false`, deflated bodies are rejected. Defaults to `true`. + +##### limit + +Controls the maximum request body size. If this is a number, then the value +specifies the number of bytes; if it is a string, the value is passed to the +[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults +to `'100kb'`. + +##### parameterLimit + +The `parameterLimit` option controls the maximum number of parameters that +are allowed in the URL-encoded data. If a request contains more parameters +than this value, a 413 will be returned to the client. Defaults to `1000`. + +##### type + +The `type` option is used to determine what media type the middleware will +parse. This option can be a string, array of strings, or a function. If not +a function, `type` option is passed directly to the +[type-is](https://www.npmjs.org/package/type-is#readme) library and this can +be an extension name (like `urlencoded`), a mime type (like +`application/x-www-form-urlencoded`), or a mime type with a wildcard (like +`*/x-www-form-urlencoded`). If a function, the `type` option is called as +`fn(req)` and the request is parsed if it returns a truthy value. Defaults +to `application/x-www-form-urlencoded`. + +##### verify + +The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, +where `buf` is a `Buffer` of the raw request body and `encoding` is the +encoding of the request. The parsing can be aborted by throwing an error. + +## Errors + +The middlewares provided by this module create errors using the +[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors +will typically have a `status`/`statusCode` property that contains the suggested +HTTP response code, an `expose` property to determine if the `message` property +should be displayed to the client, a `type` property to determine the type of +error without matching against the `message`, and a `body` property containing +the read body, if available. + +The following are the common errors created, though any error can come through +for various reasons. + +### content encoding unsupported + +This error will occur when the request had a `Content-Encoding` header that +contained an encoding but the "inflation" option was set to `false`. The +`status` property is set to `415`, the `type` property is set to +`'encoding.unsupported'`, and the `charset` property will be set to the +encoding that is unsupported. + +### entity parse failed + +This error will occur when the request contained an entity that could not be +parsed by the middleware. The `status` property is set to `400`, the `type` +property is set to `'entity.parse.failed'`, and the `body` property is set to +the entity value that failed parsing. + +### entity verify failed + +This error will occur when the request contained an entity that could not be +failed verification by the defined `verify` option. The `status` property is +set to `403`, the `type` property is set to `'entity.verify.failed'`, and the +`body` property is set to the entity value that failed verification. + +### request aborted + +This error will occur when the request is aborted by the client before reading +the body has finished. The `received` property will be set to the number of +bytes received before the request was aborted and the `expected` property is +set to the number of expected bytes. The `status` property is set to `400` +and `type` property is set to `'request.aborted'`. + +### request entity too large + +This error will occur when the request body's size is larger than the "limit" +option. The `limit` property will be set to the byte limit and the `length` +property will be set to the request body's length. The `status` property is +set to `413` and the `type` property is set to `'entity.too.large'`. + +### request size did not match content length + +This error will occur when the request's length did not match the length from +the `Content-Length` header. This typically occurs when the request is malformed, +typically when the `Content-Length` header was calculated based on characters +instead of bytes. The `status` property is set to `400` and the `type` property +is set to `'request.size.invalid'`. + +### stream encoding should not be set + +This error will occur when something called the `req.setEncoding` method prior +to this middleware. This module operates directly on bytes only and you cannot +call `req.setEncoding` when using this module. The `status` property is set to +`500` and the `type` property is set to `'stream.encoding.set'`. + +### stream is not readable + +This error will occur when the request is no longer readable when this middleware +attempts to read it. This typically means something other than a middleware from +this module read the request body already and the middleware was also configured to +read the same request. The `status` property is set to `500` and the `type` +property is set to `'stream.not.readable'`. + +### too many parameters + +This error will occur when the content of the request exceeds the configured +`parameterLimit` for the `urlencoded` parser. The `status` property is set to +`413` and the `type` property is set to `'parameters.too.many'`. + +### unsupported charset "BOGUS" + +This error will occur when the request had a charset parameter in the +`Content-Type` header, but the `iconv-lite` module does not support it OR the +parser does not support it. The charset is contained in the message as well +as in the `charset` property. The `status` property is set to `415`, the +`type` property is set to `'charset.unsupported'`, and the `charset` property +is set to the charset that is unsupported. + +### unsupported content encoding "bogus" + +This error will occur when the request had a `Content-Encoding` header that +contained an unsupported encoding. The encoding is contained in the message +as well as in the `encoding` property. The `status` property is set to `415`, +the `type` property is set to `'encoding.unsupported'`, and the `encoding` +property is set to the encoding that is unsupported. + +## Examples + +### Express/Connect top-level generic + +This example demonstrates adding a generic JSON and URL-encoded parser as a +top-level middleware, which will parse the bodies of all incoming requests. +This is the simplest setup. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: false })) + +// parse application/json +app.use(bodyParser.json()) + +app.use(function (req, res) { + res.setHeader('Content-Type', 'text/plain') + res.write('you posted:\n') + res.end(JSON.stringify(req.body, null, 2)) +}) +``` + +### Express route-specific + +This example demonstrates adding body parsers specifically to the routes that +need them. In general, this is the most recommended way to use body-parser with +Express. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// create application/json parser +var jsonParser = bodyParser.json() + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }) + +// POST /login gets urlencoded bodies +app.post('/login', urlencodedParser, function (req, res) { + res.send('welcome, ' + req.body.username) +}) + +// POST /api/users gets JSON bodies +app.post('/api/users', jsonParser, function (req, res) { + // create user in req.body +}) +``` + +### Change accepted type for parsers + +All the parsers accept a `type` option which allows you to change the +`Content-Type` that the middleware will parse. + +```js +var express = require('express') +var bodyParser = require('body-parser') + +var app = express() + +// parse various different custom JSON types as JSON +app.use(bodyParser.json({ type: 'application/*+json' })) + +// parse some custom thing into a Buffer +app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) + +// parse an HTML body into a string +app.use(bodyParser.text({ type: 'text/html' })) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/body-parser.svg +[npm-url]: https://npmjs.org/package/body-parser +[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg +[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master +[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg +[downloads-url]: https://npmjs.org/package/body-parser +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/expressjs/body-parser/ci/master?label=ci +[github-actions-ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml diff --git a/node_modules/body-parser/SECURITY.md b/node_modules/body-parser/SECURITY.md new file mode 100644 index 00000000..9694d429 --- /dev/null +++ b/node_modules/body-parser/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The Express team and community take all security bugs seriously. Thank you +for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `body-parser`. This +information can be found in the npm registry using the command +`npm owner ls body-parser`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/expressjs/body-parser/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/node_modules/body-parser/index.js b/node_modules/body-parser/index.js new file mode 100644 index 00000000..bb24d739 --- /dev/null +++ b/node_modules/body-parser/index.js @@ -0,0 +1,156 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('body-parser') + +/** + * Cache of loaded parsers. + * @private + */ + +var parsers = Object.create(null) + +/** + * @typedef Parsers + * @type {function} + * @property {function} json + * @property {function} raw + * @property {function} text + * @property {function} urlencoded + */ + +/** + * Module exports. + * @type {Parsers} + */ + +exports = module.exports = deprecate.function(bodyParser, + 'bodyParser: use individual json/urlencoded middlewares') + +/** + * JSON parser. + * @public + */ + +Object.defineProperty(exports, 'json', { + configurable: true, + enumerable: true, + get: createParserGetter('json') +}) + +/** + * Raw parser. + * @public + */ + +Object.defineProperty(exports, 'raw', { + configurable: true, + enumerable: true, + get: createParserGetter('raw') +}) + +/** + * Text parser. + * @public + */ + +Object.defineProperty(exports, 'text', { + configurable: true, + enumerable: true, + get: createParserGetter('text') +}) + +/** + * URL-encoded parser. + * @public + */ + +Object.defineProperty(exports, 'urlencoded', { + configurable: true, + enumerable: true, + get: createParserGetter('urlencoded') +}) + +/** + * Create a middleware to parse json and urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @deprecated + * @public + */ + +function bodyParser (options) { + // use default type for parsers + var opts = Object.create(options || null, { + type: { + configurable: true, + enumerable: true, + value: undefined, + writable: true + } + }) + + var _urlencoded = exports.urlencoded(opts) + var _json = exports.json(opts) + + return function bodyParser (req, res, next) { + _json(req, res, function (err) { + if (err) return next(err) + _urlencoded(req, res, next) + }) + } +} + +/** + * Create a getter for loading a parser. + * @private + */ + +function createParserGetter (name) { + return function get () { + return loadParser(name) + } +} + +/** + * Load a parser module. + * @private + */ + +function loadParser (parserName) { + var parser = parsers[parserName] + + if (parser !== undefined) { + return parser + } + + // this uses a switch for static require analysis + switch (parserName) { + case 'json': + parser = require('./lib/types/json') + break + case 'raw': + parser = require('./lib/types/raw') + break + case 'text': + parser = require('./lib/types/text') + break + case 'urlencoded': + parser = require('./lib/types/urlencoded') + break + } + + // store to prevent invoking require() + return (parsers[parserName] = parser) +} diff --git a/node_modules/body-parser/lib/read.js b/node_modules/body-parser/lib/read.js new file mode 100644 index 00000000..fce6283f --- /dev/null +++ b/node_modules/body-parser/lib/read.js @@ -0,0 +1,205 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var destroy = require('destroy') +var getBody = require('raw-body') +var iconv = require('iconv-lite') +var onFinished = require('on-finished') +var unpipe = require('unpipe') +var zlib = require('zlib') + +/** + * Module exports. + */ + +module.exports = read + +/** + * Read a request into a buffer and parse. + * + * @param {object} req + * @param {object} res + * @param {function} next + * @param {function} parse + * @param {function} debug + * @param {object} options + * @private + */ + +function read (req, res, next, parse, debug, options) { + var length + var opts = options + var stream + + // flag as parsed + req._body = true + + // read options + var encoding = opts.encoding !== null + ? opts.encoding + : null + var verify = opts.verify + + try { + // get the content stream + stream = contentstream(req, debug, opts.inflate) + length = stream.length + stream.length = undefined + } catch (err) { + return next(err) + } + + // set raw-body options + opts.length = length + opts.encoding = verify + ? null + : encoding + + // assert charset is supported + if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { + return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + })) + } + + // read body + debug('read body') + getBody(stream, opts, function (error, body) { + if (error) { + var _error + + if (error.type === 'encoding.unsupported') { + // echo back charset + _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { + charset: encoding.toLowerCase(), + type: 'charset.unsupported' + }) + } else { + // set status code on error + _error = createError(400, error) + } + + // unpipe from stream and destroy + if (stream !== req) { + unpipe(req) + destroy(stream, true) + } + + // read off entire request + dump(req, function onfinished () { + next(createError(400, _error)) + }) + return + } + + // verify + if (verify) { + try { + debug('verify body') + verify(req, res, body, encoding) + } catch (err) { + next(createError(403, err, { + body: body, + type: err.type || 'entity.verify.failed' + })) + return + } + } + + // parse + var str = body + try { + debug('parse body') + str = typeof body !== 'string' && encoding !== null + ? iconv.decode(body, encoding) + : body + req.body = parse(str) + } catch (err) { + next(createError(400, err, { + body: str, + type: err.type || 'entity.parse.failed' + })) + return + } + + next() + }) +} + +/** + * Get the content stream of the request. + * + * @param {object} req + * @param {function} debug + * @param {boolean} [inflate=true] + * @return {object} + * @api private + */ + +function contentstream (req, debug, inflate) { + var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() + var length = req.headers['content-length'] + var stream + + debug('content-encoding "%s"', encoding) + + if (inflate === false && encoding !== 'identity') { + throw createError(415, 'content encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + switch (encoding) { + case 'deflate': + stream = zlib.createInflate() + debug('inflate body') + req.pipe(stream) + break + case 'gzip': + stream = zlib.createGunzip() + debug('gunzip body') + req.pipe(stream) + break + case 'identity': + stream = req + stream.length = length + break + default: + throw createError(415, 'unsupported content encoding "' + encoding + '"', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } + + return stream +} + +/** + * Dump the contents of a request. + * + * @param {object} req + * @param {function} callback + * @api private + */ + +function dump (req, callback) { + if (onFinished.isFinished(req)) { + callback(null) + } else { + onFinished(req, callback) + req.resume() + } +} diff --git a/node_modules/body-parser/lib/types/json.js b/node_modules/body-parser/lib/types/json.js new file mode 100644 index 00000000..c2745be3 --- /dev/null +++ b/node_modules/body-parser/lib/types/json.js @@ -0,0 +1,236 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:json') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = json + +/** + * RegExp to match the first non-space in a string. + * + * Allowed whitespace is defined in RFC 7159: + * + * ws = *( + * %x20 / ; Space + * %x09 / ; Horizontal tab + * %x0A / ; Line feed or New line + * %x0D ) ; Carriage return + */ + +var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex + +/** + * Create a middleware to parse JSON bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function json (options) { + var opts = options || {} + + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var inflate = opts.inflate !== false + var reviver = opts.reviver + var strict = opts.strict !== false + var type = opts.type || 'application/json' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + if (body.length === 0) { + // special-case empty json body, as it's a common client-side mistake + // TODO: maybe make this configurable or part of "strict" option + return {} + } + + if (strict) { + var first = firstchar(body) + + if (first !== '{' && first !== '[') { + debug('strict violation') + throw createStrictSyntaxError(body, first) + } + } + + try { + debug('parse json') + return JSON.parse(body, reviver) + } catch (e) { + throw normalizeJsonSyntaxError(e, { + message: e.message, + stack: e.stack + }) + } + } + + return function jsonParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset per RFC 7159 sec 8.1 + var charset = getCharset(req) || 'utf-8' + if (charset.slice(0, 4) !== 'utf-') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Create strict violation syntax error matching native error. + * + * @param {string} str + * @param {string} char + * @return {Error} + * @private + */ + +function createStrictSyntaxError (str, char) { + var index = str.indexOf(char) + var partial = index !== -1 + ? str.substring(0, index) + '#' + : '' + + try { + JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') + } catch (e) { + return normalizeJsonSyntaxError(e, { + message: e.message.replace('#', char), + stack: e.stack + }) + } +} + +/** + * Get the first non-whitespace character in a string. + * + * @param {string} str + * @return {function} + * @private + */ + +function firstchar (str) { + var match = FIRST_CHAR_REGEXP.exec(str) + + return match + ? match[1] + : undefined +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Normalize a SyntaxError for JSON.parse. + * + * @param {SyntaxError} error + * @param {object} obj + * @return {SyntaxError} + */ + +function normalizeJsonSyntaxError (error, obj) { + var keys = Object.getOwnPropertyNames(error) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + if (key !== 'stack' && key !== 'message') { + delete error[key] + } + } + + // replace stack before message for Node.js 0.10 and below + error.stack = obj.stack.replace(error.message, obj.message) + error.message = obj.message + + return error +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/raw.js b/node_modules/body-parser/lib/types/raw.js new file mode 100644 index 00000000..f5d1b674 --- /dev/null +++ b/node_modules/body-parser/lib/types/raw.js @@ -0,0 +1,101 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var debug = require('debug')('body-parser:raw') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = raw + +/** + * Create a middleware to parse raw bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function raw (options) { + var opts = options || {} + + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/octet-stream' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function rawParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // read + read(req, res, next, parse, debug, { + encoding: null, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/text.js b/node_modules/body-parser/lib/types/text.js new file mode 100644 index 00000000..083a0090 --- /dev/null +++ b/node_modules/body-parser/lib/types/text.js @@ -0,0 +1,121 @@ +/*! + * body-parser + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var debug = require('debug')('body-parser:text') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = text + +/** + * Create a middleware to parse text bodies. + * + * @param {object} [options] + * @return {function} + * @api public + */ + +function text (options) { + var opts = options || {} + + var defaultCharset = opts.defaultCharset || 'utf-8' + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'text/plain' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (buf) { + return buf + } + + return function textParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // get charset + var charset = getCharset(req) || defaultCharset + + // read + read(req, res, next, parse, debug, { + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/lib/types/urlencoded.js b/node_modules/body-parser/lib/types/urlencoded.js new file mode 100644 index 00000000..b2ca8f16 --- /dev/null +++ b/node_modules/body-parser/lib/types/urlencoded.js @@ -0,0 +1,284 @@ +/*! + * body-parser + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var bytes = require('bytes') +var contentType = require('content-type') +var createError = require('http-errors') +var debug = require('debug')('body-parser:urlencoded') +var deprecate = require('depd')('body-parser') +var read = require('../read') +var typeis = require('type-is') + +/** + * Module exports. + */ + +module.exports = urlencoded + +/** + * Cache of parser modules. + */ + +var parsers = Object.create(null) + +/** + * Create a middleware to parse urlencoded bodies. + * + * @param {object} [options] + * @return {function} + * @public + */ + +function urlencoded (options) { + var opts = options || {} + + // notice because option default will flip in next major + if (opts.extended === undefined) { + deprecate('undefined extended: provide extended option') + } + + var extended = opts.extended !== false + var inflate = opts.inflate !== false + var limit = typeof opts.limit !== 'number' + ? bytes.parse(opts.limit || '100kb') + : opts.limit + var type = opts.type || 'application/x-www-form-urlencoded' + var verify = opts.verify || false + + if (verify !== false && typeof verify !== 'function') { + throw new TypeError('option verify must be function') + } + + // create the appropriate query parser + var queryparse = extended + ? extendedparser(opts) + : simpleparser(opts) + + // create the appropriate type checking function + var shouldParse = typeof type !== 'function' + ? typeChecker(type) + : type + + function parse (body) { + return body.length + ? queryparse(body) + : {} + } + + return function urlencodedParser (req, res, next) { + if (req._body) { + debug('body already parsed') + next() + return + } + + req.body = req.body || {} + + // skip requests without bodies + if (!typeis.hasBody(req)) { + debug('skip empty body') + next() + return + } + + debug('content-type %j', req.headers['content-type']) + + // determine if request should be parsed + if (!shouldParse(req)) { + debug('skip parsing') + next() + return + } + + // assert charset + var charset = getCharset(req) || 'utf-8' + if (charset !== 'utf-8') { + debug('invalid charset') + next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { + charset: charset, + type: 'charset.unsupported' + })) + return + } + + // read + read(req, res, next, parse, debug, { + debug: debug, + encoding: charset, + inflate: inflate, + limit: limit, + verify: verify + }) + } +} + +/** + * Get the extended query parser. + * + * @param {object} options + */ + +function extendedparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('qs') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + var arrayLimit = Math.max(100, paramCount) + + debug('parse extended urlencoding') + return parse(body, { + allowPrototypes: true, + arrayLimit: arrayLimit, + depth: Infinity, + parameterLimit: parameterLimit + }) + } +} + +/** + * Get the charset of a request. + * + * @param {object} req + * @api private + */ + +function getCharset (req) { + try { + return (contentType.parse(req).parameters.charset || '').toLowerCase() + } catch (e) { + return undefined + } +} + +/** + * Count the number of parameters, stopping once limit reached + * + * @param {string} body + * @param {number} limit + * @api private + */ + +function parameterCount (body, limit) { + var count = 0 + var index = 0 + + while ((index = body.indexOf('&', index)) !== -1) { + count++ + index++ + + if (count === limit) { + return undefined + } + } + + return count +} + +/** + * Get parser for module name dynamically. + * + * @param {string} name + * @return {function} + * @api private + */ + +function parser (name) { + var mod = parsers[name] + + if (mod !== undefined) { + return mod.parse + } + + // this uses a switch for static require analysis + switch (name) { + case 'qs': + mod = require('qs') + break + case 'querystring': + mod = require('querystring') + break + } + + // store to prevent invoking require() + parsers[name] = mod + + return mod.parse +} + +/** + * Get the simple query parser. + * + * @param {object} options + */ + +function simpleparser (options) { + var parameterLimit = options.parameterLimit !== undefined + ? options.parameterLimit + : 1000 + var parse = parser('querystring') + + if (isNaN(parameterLimit) || parameterLimit < 1) { + throw new TypeError('option parameterLimit must be a positive number') + } + + if (isFinite(parameterLimit)) { + parameterLimit = parameterLimit | 0 + } + + return function queryparse (body) { + var paramCount = parameterCount(body, parameterLimit) + + if (paramCount === undefined) { + debug('too many parameters') + throw createError(413, 'too many parameters', { + type: 'parameters.too.many' + }) + } + + debug('parse urlencoding') + return parse(body, undefined, undefined, { maxKeys: parameterLimit }) + } +} + +/** + * Get the simple type checker. + * + * @param {string} type + * @return {function} + */ + +function typeChecker (type) { + return function checkType (req) { + return Boolean(typeis(req, type)) + } +} diff --git a/node_modules/body-parser/package.json b/node_modules/body-parser/package.json new file mode 100644 index 00000000..9cd2ccbb --- /dev/null +++ b/node_modules/body-parser/package.json @@ -0,0 +1,56 @@ +{ + "name": "body-parser", + "description": "Node.js body parsing middleware", + "version": "1.20.1", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "expressjs/body-parser", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "devDependencies": { + "eslint": "8.24.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-markdown": "3.0.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.0.1", + "eslint-plugin-standard": "4.1.0", + "methods": "1.1.2", + "mocha": "10.0.0", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "supertest": "6.3.0" + }, + "files": [ + "lib/", + "LICENSE", + "HISTORY.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} 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/CHANGELOG.md b/node_modules/braces/CHANGELOG.md new file mode 100644 index 00000000..36f798b0 --- /dev/null +++ b/node_modules/braces/CHANGELOG.md @@ -0,0 +1,184 @@ +# 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. + +
+ +## [3.0.0] - 2018-04-08 + +v3.0 is a complete refactor, resulting in a faster, smaller codebase, with fewer deps, and a more accurate parser and compiler. + +**Breaking Changes** + +- The undocumented `.makeRe` method was removed + +**Non-breaking changes** + +- Caching was removed + +## [2.3.2] - 2018-04-08 + +- start refactoring +- cover sets +- better range handling + +## [2.3.1] - 2018-02-17 + +- Remove unnecessary escape in Regex. (#14) + +## [2.3.0] - 2017-10-19 + +- minor code reorganization +- optimize regex +- expose `maxLength` option + +## [2.2.1] - 2017-05-30 + +- don't condense when braces contain extglobs + +## [2.2.0] - 2017-05-28 + +- ensure word boundaries are preserved +- fixes edge case where extglob characters precede a brace pattern + +## [2.1.1] - 2017-04-27 + +- use snapdragon-node +- handle edge case +- optimizations, lint + +## [2.0.4] - 2017-04-11 + +- pass opts to compiler +- minor optimization in create method +- re-write parser handlers to remove negation regex + +## [2.0.3] - 2016-12-10 + +- use split-string +- clear queue at the end +- adds sequences example +- add unit tests + +## [2.0.2] - 2016-10-21 + +- fix comma handling in nested extglobs + +## [2.0.1] - 2016-10-20 + +- add comments +- more tests, ensure quotes are stripped + +## [2.0.0] - 2016-10-19 + +- don't expand braces inside character classes +- add quantifier pattern + +## [1.8.5] - 2016-05-21 + +- Refactor (#10) + +## [1.8.4] - 2016-04-20 + +- fixes https://github.com/jonschlinkert/micromatch/issues/66 + +## [1.8.0] - 2015-03-18 + +- adds exponent examples, tests +- fixes the first example in https://github.com/jonschlinkert/micromatch/issues/38 + +## [1.6.0] - 2015-01-30 + +- optimizations, `bash` mode: +- improve path escaping + +## [1.5.0] - 2015-01-28 + +- Merge pull request #5 from eush77/lib-files + +## [1.4.0] - 2015-01-24 + +- add extglob tests +- externalize exponent function +- better whitespace handling + +## [1.3.0] - 2015-01-24 + +- make regex patterns explicity + +## [1.1.0] - 2015-01-11 + +- don't create a match group with `makeRe` + +## [1.0.0] - 2014-12-23 + +- Merge commit '97b05f5544f8348736a8efaecf5c32bbe3e2ad6e' +- support empty brace syntax +- better bash coverage +- better support for regex strings + +## [0.1.4] - 2014-11-14 + +- improve recognition of bad args, recognize mismatched argument types +- support escaping +- remove pathname-expansion +- support whitespace in patterns + +## [0.1.0] + +- first commit + +[2.3.2]: https://github.com/micromatch/braces/compare/2.3.1...2.3.2 +[2.3.1]: https://github.com/micromatch/braces/compare/2.3.0...2.3.1 +[2.3.0]: https://github.com/micromatch/braces/compare/2.2.1...2.3.0 +[2.2.1]: https://github.com/micromatch/braces/compare/2.2.0...2.2.1 +[2.2.0]: https://github.com/micromatch/braces/compare/2.1.1...2.2.0 +[2.1.1]: https://github.com/micromatch/braces/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/micromatch/braces/compare/2.0.4...2.1.0 +[2.0.4]: https://github.com/micromatch/braces/compare/2.0.3...2.0.4 +[2.0.3]: https://github.com/micromatch/braces/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/micromatch/braces/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/micromatch/braces/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/micromatch/braces/compare/1.8.5...2.0.0 +[1.8.5]: https://github.com/micromatch/braces/compare/1.8.4...1.8.5 +[1.8.4]: https://github.com/micromatch/braces/compare/1.8.0...1.8.4 +[1.8.0]: https://github.com/micromatch/braces/compare/1.6.0...1.8.0 +[1.6.0]: https://github.com/micromatch/braces/compare/1.5.0...1.6.0 +[1.5.0]: https://github.com/micromatch/braces/compare/1.4.0...1.5.0 +[1.4.0]: https://github.com/micromatch/braces/compare/1.3.0...1.4.0 +[1.3.0]: https://github.com/micromatch/braces/compare/1.2.0...1.3.0 +[1.2.0]: https://github.com/micromatch/braces/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/micromatch/braces/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/micromatch/braces/compare/0.1.4...1.0.0 +[0.1.4]: https://github.com/micromatch/braces/compare/0.1.0...0.1.4 + +[Unreleased]: https://github.com/micromatch/braces/compare/0.1.0...HEAD +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog \ No newline at end of file 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..cba2f600 --- /dev/null +++ b/node_modules/braces/README.md @@ -0,0 +1,593 @@ +# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![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) + +> 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 +``` + +## v3.0.0 Released!! + +See the [changelog](CHANGELOG.md) for details. + +## Why use braces? + +Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. + +* **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** - The parser and compiler are easy to maintain and update when edge cases crop up. +* **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). +* **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). +* [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +* [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` +* [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` +* [Supports escaping](#escaping) - To prevent evaluation of special characters. + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +const braces = require('braces'); +// braces(patterns[, options]); + +console.log(braces(['{01..05}', '{a..e}'])); +//=> ['(0[1-5])', '([a-e])'] + +console.log(braces(['{01..05}', '{a..e}'], { expand: true })); +//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] +``` + +### Brace Expansion vs. Compilation + +By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. + +**Compiled** + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); +//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] +``` + +**Expanded** + +Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): + +```js +console.log(braces('a/{x,y,z}/b', { expand: true })); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] + +console.log(braces.expand('{01..10}')); +//=> ['01','02','03','04','05','06','07','08','09','10'] +``` + +### Lists + +Expand lists (like Bash "sets"): + +```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 + +Expand ranges of characters (like Bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] +console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] +console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] + +// supports zero-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'] +``` + +See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. + +### Steppped ranges + +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 (alternatively you can use the `braces.expand()` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', { expand: true })); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Remove duplicates from the returned array. + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `1000` + +**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. + +You can customize `options.rangeLimit` or set it 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. + +**Example: Transforming non-numeric values** + +```js +const alpha = braces.expand('x/{a..e}/y', { + transform(value, index) { + // When non-numeric values are passed, "value" is a character code. + return 'foo/' + String.fromCharCode(value) + '-' + index; + } +}); +console.log(alpha); +//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] +``` + +**Example: Transforming numeric values** + +```js +const numeric = braces.expand('{1..5}', { + transform(value) { + // when numeric values are passed, "value" is a number + return 'foo/' + value * 2; + } +}); +console.log(numeric); +//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] +``` + +### 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 +const 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][]** | +| --- | --- | --- | +| `{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][]** | +| --- | --- | --- | +| `{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 + +Braces is more accurate, without sacrificing performance. + +```bash +# range (expanded) + braces x 29,040 ops/sec ±3.69% (91 runs sampled)) + minimatch x 4,735 ops/sec ±1.28% (90 runs sampled) + +# range (optimized for regex) + braces x 382,878 ops/sec ±0.56% (94 runs sampled) + minimatch x 1,040 ops/sec ±0.44% (93 runs sampled) + +# nested ranges (expanded) + braces x 19,744 ops/sec ±2.27% (92 runs sampled)) + minimatch x 4,579 ops/sec ±0.50% (93 runs sampled) + +# nested ranges (optimized for regex) + braces x 246,019 ops/sec ±2.02% (93 runs sampled) + minimatch x 1,028 ops/sec ±0.39% (94 runs sampled) + +# set (expanded) + braces x 138,641 ops/sec ±0.53% (95 runs sampled) + minimatch x 219,582 ops/sec ±0.98% (94 runs sampled) + +# set (optimized for regex) + braces x 388,408 ops/sec ±0.41% (95 runs sampled) + minimatch x 44,724 ops/sec ±0.91% (89 runs sampled) + +# nested sets (expanded) + braces x 84,966 ops/sec ±0.48% (94 runs sampled) + minimatch x 140,720 ops/sec ±0.37% (95 runs sampled) + +# nested sets (optimized for regex) + braces x 263,340 ops/sec ±2.06% (92 runs sampled) + minimatch x 28,714 ops/sec ±0.40% (90 runs sampled) +``` + +## 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** | +| --- | --- | +| 197 | [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) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [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.8.0, on April 08, 2019._ \ 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..0eee0f56 --- /dev/null +++ b/node_modules/braces/index.js @@ -0,0 +1,170 @@ +'use strict'; + +const stringify = require('./lib/stringify'); +const compile = require('./lib/compile'); +const expand = require('./lib/expand'); +const parse = require('./lib/parse'); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * 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 [.compile](#compile) instead. + * + * ```js + * const 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 = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * 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 + * const 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 = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js new file mode 100644 index 00000000..3e984a4b --- /dev/null +++ b/node_modules/braces/lib/compile.js @@ -0,0 +1,57 @@ +'use strict'; + +const fill = require('fill-range'); +const utils = require('./utils'); + +const compile = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; + + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } + + if (node.type === 'open') { + return invalid ? (prefix + node.value) : '('; + } + + if (node.type === 'close') { + return invalid ? (prefix + node.value) : ')'; + } + + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); + } + + if (node.value) { + return node.value; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, { ...options, wrap: false, toRegex: true }); + + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); + } + } + return output; + }; + + return walk(ast); +}; + +module.exports = compile; diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js new file mode 100644 index 00000000..a9379436 --- /dev/null +++ b/node_modules/braces/lib/constants.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = { + MAX_LENGTH: 1024 * 64, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js new file mode 100644 index 00000000..376c748a --- /dev/null +++ b/node_modules/braces/lib/expand.js @@ -0,0 +1,113 @@ +'use strict'; + +const fill = require('fill-range'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +const append = (queue = '', stash = '', enclose = false) => { + let result = []; + + queue = [].concat(queue); + stash = [].concat(stash); + + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } + + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + } + } + } + return utils.flatten(result); +}; + +const expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; + + let walk = (node, parent = {}) => { + node.queue = []; + + let p = parent; + let q = parent.queue; + + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } + + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } + + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; + + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } + + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } + + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } + + if (child.nodes) { + walk(child, node); + } + } + + return queue; + }; + + return utils.flatten(walk(ast)); +}; + +module.exports = expand; diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js new file mode 100644 index 00000000..145ea264 --- /dev/null +++ b/node_modules/braces/lib/parse.js @@ -0,0 +1,333 @@ +'use strict'; + +const stringify = require('./stringify'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = require('./constants'); + +/** + * parse + */ + +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + let opts = options || {}; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + + let ast = { type: 'root', input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; + + /** + * Helpers + */ + + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } + + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; + } + + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + + push({ type: 'bos' }); + + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + + /** + * Invalid chars + */ + + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + + /** + * Escaped chars + */ + + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } + + /** + * Right square bracket (literal): ']' + */ + + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } + + /** + * Left square bracket: '[' + */ + + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + + let closed = true; + let next; + + while (index < length && (next = advance())) { + value += next; + + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + let brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + let type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; + } + + /** + * Text + */ + + push({ type: 'text', value }); + } + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + let parent = stack[stack.length - 1]; + let index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js new file mode 100644 index 00000000..414b7bcc --- /dev/null +++ b/node_modules/braces/lib/stringify.js @@ -0,0 +1,32 @@ +'use strict'; + +const utils = require('./utils'); + +module.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; + } + + if (node.value) { + return node.value; + } + + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js new file mode 100644 index 00000000..e3551a67 --- /dev/null +++ b/node_modules/braces/lib/utils.js @@ -0,0 +1,112 @@ +'use strict'; + +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; + +/** + * Find a node of the given type + */ + +exports.find = (node, type) => node.nodes.find(node => node.type === type); + +/** + * Find a node of the given type + */ + +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; + +/** + * Escape the given node with '\\' before node.value + */ + +exports.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) return; + + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; + +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; +}; + +/** + * Reduce an array of text nodes. + */ + +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); + +/** + * Flatten an array + */ + +exports.flatten = (...args) => { + const result = []; + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; +}; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json new file mode 100644 index 00000000..3f52e346 --- /dev/null +++ b/node_modules/braces/package.json @@ -0,0 +1,77 @@ +{ + "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": "3.0.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": ">=8" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "fill-range": "^7.0.1" + }, + "devDependencies": { + "ansi-colors": "^3.2.4", + "bash-path": "^2.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "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" + ] + } +} diff --git a/node_modules/bytes/History.md b/node_modules/bytes/History.md new file mode 100644 index 00000000..d60ce0e6 --- /dev/null +++ b/node_modules/bytes/History.md @@ -0,0 +1,97 @@ +3.1.2 / 2022-01-27 +================== + + * Fix return value for un-parsable strings + +3.1.1 / 2021-11-15 +================== + + * Fix "thousandsSeparator" incorrecting formatting fractional part + +3.1.0 / 2019-01-22 +================== + + * Add petabyte (`pb`) support + +3.0.0 / 2017-08-31 +================== + + * Change "kB" to "KB" in format output + * Remove support for Node.js 0.6 + * Remove support for ComponentJS + +2.5.0 / 2017-03-24 +================== + + * Add option "unit" + +2.4.0 / 2016-06-01 +================== + + * Add option "unitSeparator" + +2.3.0 / 2016-02-15 +================== + + * Drop partial bytes on all parsed units + * Fix non-finite numbers to `.format` to return `null` + * Fix parsing byte string that looks like hex + * perf: hoist regular expressions + +2.2.0 / 2015-11-13 +================== + + * add option "decimalPlaces" + * add option "fixedDecimals" + +2.1.0 / 2015-05-21 +================== + + * add `.format` export + * add `.parse` export + +2.0.2 / 2015-05-20 +================== + + * remove map recreation + * remove unnecessary object construction + +2.0.1 / 2015-05-07 +================== + + * fix browserify require + * remove node.extend dependency + +2.0.0 / 2015-04-12 +================== + + * add option "case" + * add option "thousandsSeparator" + * return "null" on invalid parse input + * support proper round-trip: bytes(bytes(num)) === num + * units no longer case sensitive when parsing + +1.0.0 / 2014-05-05 +================== + + * add negative support. fixes #6 + +0.3.0 / 2014-03-19 +================== + + * added terabyte support + +0.2.1 / 2013-04-01 +================== + + * add .component + +0.2.0 / 2012-10-28 +================== + + * bytes(200).should.eql('200b') + +0.1.0 / 2012-07-04 +================== + + * add bytes to string conversion [yields] diff --git a/node_modules/bytes/LICENSE b/node_modules/bytes/LICENSE new file mode 100644 index 00000000..63e95a96 --- /dev/null +++ b/node_modules/bytes/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +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/bytes/Readme.md b/node_modules/bytes/Readme.md new file mode 100644 index 00000000..5790e23e --- /dev/null +++ b/node_modules/bytes/Readme.md @@ -0,0 +1,152 @@ +# Bytes utility + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install bytes +``` + +## Usage + +```js +var bytes = require('bytes'); +``` + +#### bytes(number|string value, [options]): number|string|null + +Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number`|`string` | Number value to format or string value to parse | +| options | `Object` | Conversion options for `format` | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. | + +**Example** + +```js +bytes(1024); +// output: '1KB' + +bytes('1KB'); +// output: 1024 +``` + +#### bytes.format(number value, [options]): string|null + +Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is + rounded. + +**Arguments** + +| Name | Type | Description | +|---------|----------|--------------------| +| value | `number` | Value in bytes | +| options | `Object` | Conversion options | + +**Options** + +| Property | Type | Description | +|-------------------|--------|-----------------------------------------------------------------------------------------| +| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | +| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | +| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. | +| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | +| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | + +**Returns** + +| Name | Type | Description | +|---------|------------------|-------------------------------------------------| +| results | `string`|`null` | Return null upon error. String value otherwise. | + +**Example** + +```js +bytes.format(1024); +// output: '1KB' + +bytes.format(1000); +// output: '1000B' + +bytes.format(1000, {thousandsSeparator: ' '}); +// output: '1 000B' + +bytes.format(1024 * 1.7, {decimalPlaces: 0}); +// output: '2KB' + +bytes.format(1024, {unitSeparator: ' '}); +// output: '1 KB' +``` + +#### bytes.parse(string|number value): number|null + +Parse the string value into an integer in bytes. If no unit is given, or `value` +is a number, it is assumed the value is in bytes. + +Supported units and abbreviations are as follows and are case-insensitive: + + * `b` for bytes + * `kb` for kilobytes + * `mb` for megabytes + * `gb` for gigabytes + * `tb` for terabytes + * `pb` for petabytes + +The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. + +**Arguments** + +| Name | Type | Description | +|---------------|--------|--------------------| +| value | `string`|`number` | String to parse, or number in bytes. | + +**Returns** + +| Name | Type | Description | +|---------|-------------|-------------------------| +| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | + +**Example** + +```js +bytes.parse('1KB'); +// output: 1024 + +bytes.parse('1024'); +// output: 1024 + +bytes.parse(1024); +// output: 1024 +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci +[ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master +[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master +[downloads-image]: https://badgen.net/npm/dm/bytes +[downloads-url]: https://npmjs.org/package/bytes +[npm-image]: https://badgen.net/npm/v/bytes +[npm-url]: https://npmjs.org/package/bytes diff --git a/node_modules/bytes/index.js b/node_modules/bytes/index.js new file mode 100644 index 00000000..6f2d0f89 --- /dev/null +++ b/node_modules/bytes/index.js @@ -0,0 +1,170 @@ +/*! + * bytes + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015 Jed Watson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = bytes; +module.exports.format = format; +module.exports.parse = parse; + +/** + * Module variables. + * @private + */ + +var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; + +var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; + +var map = { + b: 1, + kb: 1 << 10, + mb: 1 << 20, + gb: 1 << 30, + tb: Math.pow(1024, 4), + pb: Math.pow(1024, 5), +}; + +var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i; + +/** + * Convert the given value in bytes into a string or parse to string to an integer in bytes. + * + * @param {string|number} value + * @param {{ + * case: [string], + * decimalPlaces: [number] + * fixedDecimals: [boolean] + * thousandsSeparator: [string] + * unitSeparator: [string] + * }} [options] bytes options. + * + * @returns {string|number|null} + */ + +function bytes(value, options) { + if (typeof value === 'string') { + return parse(value); + } + + if (typeof value === 'number') { + return format(value, options); + } + + return null; +} + +/** + * Format the given value in bytes into a string. + * + * If the value is negative, it is kept as such. If it is a float, + * it is rounded. + * + * @param {number} value + * @param {object} [options] + * @param {number} [options.decimalPlaces=2] + * @param {number} [options.fixedDecimals=false] + * @param {string} [options.thousandsSeparator=] + * @param {string} [options.unit=] + * @param {string} [options.unitSeparator=] + * + * @returns {string|null} + * @public + */ + +function format(value, options) { + if (!Number.isFinite(value)) { + return null; + } + + var mag = Math.abs(value); + var thousandsSeparator = (options && options.thousandsSeparator) || ''; + var unitSeparator = (options && options.unitSeparator) || ''; + var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; + var fixedDecimals = Boolean(options && options.fixedDecimals); + var unit = (options && options.unit) || ''; + + if (!unit || !map[unit.toLowerCase()]) { + if (mag >= map.pb) { + unit = 'PB'; + } else if (mag >= map.tb) { + unit = 'TB'; + } else if (mag >= map.gb) { + unit = 'GB'; + } else if (mag >= map.mb) { + unit = 'MB'; + } else if (mag >= map.kb) { + unit = 'KB'; + } else { + unit = 'B'; + } + } + + var val = value / map[unit.toLowerCase()]; + var str = val.toFixed(decimalPlaces); + + if (!fixedDecimals) { + str = str.replace(formatDecimalsRegExp, '$1'); + } + + if (thousandsSeparator) { + str = str.split('.').map(function (s, i) { + return i === 0 + ? s.replace(formatThousandsRegExp, thousandsSeparator) + : s + }).join('.'); + } + + return str + unitSeparator + unit; +} + +/** + * Parse the string value into an integer in bytes. + * + * If no unit is given, it is assumed the value is in bytes. + * + * @param {number|string} val + * + * @returns {number|null} + * @public + */ + +function parse(val) { + if (typeof val === 'number' && !isNaN(val)) { + return val; + } + + if (typeof val !== 'string') { + return null; + } + + // Test if the string passed is valid + var results = parseRegExp.exec(val); + var floatValue; + var unit = 'b'; + + if (!results) { + // Nothing could be extracted from the given string + floatValue = parseInt(val, 10); + unit = 'b' + } else { + // Retrieve the value and the unit + floatValue = parseFloat(results[1]); + unit = results[4].toLowerCase(); + } + + if (isNaN(floatValue)) { + return null; + } + + return Math.floor(map[unit] * floatValue); +} diff --git a/node_modules/bytes/package.json b/node_modules/bytes/package.json new file mode 100644 index 00000000..f2b6a8b0 --- /dev/null +++ b/node_modules/bytes/package.json @@ -0,0 +1,42 @@ +{ + "name": "bytes", + "description": "Utility to parse a string bytes to bytes and vice-versa", + "version": "3.1.2", + "author": "TJ Holowaychuk (http://tjholowaychuk.com)", + "contributors": [ + "Jed Watson ", + "Théo FIDRY " + ], + "license": "MIT", + "keywords": [ + "byte", + "bytes", + "utility", + "parse", + "parser", + "convert", + "converter" + ], + "repository": "visionmedia/bytes.js", + "devDependencies": { + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "History.md", + "LICENSE", + "Readme.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --check-leaks --reporter spec", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} 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..62a37279 --- /dev/null +++ b/node_modules/call-bind/CHANGELOG.md @@ -0,0 +1,42 @@ +# 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.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11 + +### Commits + +- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d) + +## [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..6fa3e4af --- /dev/null +++ b/node_modules/call-bind/index.js @@ -0,0 +1,47 @@ +'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) { + // original length, plus the receiver, minus any additional arguments (after the receiver) + $defineProperty( + func, + 'length', + { value: 1 + $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..4360556a --- /dev/null +++ b/node_modules/call-bind/package.json @@ -0,0 +1,80 @@ +{ + "name": "call-bind", + "version": "1.0.2", + "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..bf6769c7 --- /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 + 1, '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, '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 - 1, '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/camel-case/LICENSE b/node_modules/camel-case/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/camel-case/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/camel-case/camel-case.d.ts b/node_modules/camel-case/camel-case.d.ts new file mode 100644 index 00000000..782ef3b5 --- /dev/null +++ b/node_modules/camel-case/camel-case.d.ts @@ -0,0 +1,3 @@ +declare function camelCase (value: string, locale?: string, mergeNumbers?: boolean): string; + +export = camelCase; diff --git a/node_modules/camel-case/camel-case.js b/node_modules/camel-case/camel-case.js new file mode 100644 index 00000000..1be652e0 --- /dev/null +++ b/node_modules/camel-case/camel-case.js @@ -0,0 +1,23 @@ +var upperCase = require('upper-case') +var noCase = require('no-case') + +/** + * Camel case a string. + * + * @param {string} value + * @param {string} [locale] + * @return {string} + */ +module.exports = function (value, locale, mergeNumbers) { + var result = noCase(value, locale) + + // Replace periods between numeric entities with an underscore. + if (!mergeNumbers) { + result = result.replace(/ (?=\d)/g, '_') + } + + // Replace spaces between words with an upper cased character. + return result.replace(/ (.)/g, function (m, $1) { + return upperCase($1, locale) + }) +} diff --git a/node_modules/camel-case/package.json b/node_modules/camel-case/package.json new file mode 100644 index 00000000..725b39b0 --- /dev/null +++ b/node_modules/camel-case/package.json @@ -0,0 +1,56 @@ +{ + "name": "camel-case", + "version": "3.0.0", + "description": "Camel case a string", + "main": "camel-case.js", + "typings": "camel-case.d.ts", + "files": [ + "camel-case.js", + "camel-case.d.ts", + "LICENSE" + ], + "scripts": { + "lint": "standard", + "test-spec": "mocha -- -R spec --bail", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -R spec --bail", + "test": "npm run lint && npm run test-cov" + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/camel-case.git" + }, + "keywords": [ + "camel", + "case", + "camelcase", + "camel-case", + "dash", + "hyphen", + "dot", + "underscore", + "lodash", + "separator", + "string", + "text", + "convert" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/camel-case/issues" + }, + "homepage": "https://github.com/blakeembrey/camel-case", + "devDependencies": { + "istanbul": "^0.4.3", + "mocha": "^2.2.1", + "standard": "^7.1.2" + }, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } +} 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.d.ts b/node_modules/chalk/index.d.ts new file mode 100644 index 00000000..9cd88f38 --- /dev/null +++ b/node_modules/chalk/index.d.ts @@ -0,0 +1,415 @@ +/** +Basic foreground colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type ForegroundColor = + | 'black' + | 'red' + | 'green' + | 'yellow' + | 'blue' + | 'magenta' + | 'cyan' + | 'white' + | 'gray' + | 'grey' + | 'blackBright' + | 'redBright' + | 'greenBright' + | 'yellowBright' + | 'blueBright' + | 'magentaBright' + | 'cyanBright' + | 'whiteBright'; + +/** +Basic background colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type BackgroundColor = + | 'bgBlack' + | 'bgRed' + | 'bgGreen' + | 'bgYellow' + | 'bgBlue' + | 'bgMagenta' + | 'bgCyan' + | 'bgWhite' + | 'bgGray' + | 'bgGrey' + | 'bgBlackBright' + | 'bgRedBright' + | 'bgGreenBright' + | 'bgYellowBright' + | 'bgBlueBright' + | 'bgMagentaBright' + | 'bgCyanBright' + | 'bgWhiteBright'; + +/** +Basic colors. + +[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +*/ +declare type Color = ForegroundColor | BackgroundColor; + +declare type Modifiers = + | 'reset' + | 'bold' + | 'dim' + | 'italic' + | 'underline' + | 'inverse' + | 'hidden' + | 'strikethrough' + | 'visible'; + +declare namespace chalk { + /** + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + type Level = 0 | 1 | 2 | 3; + + interface Options { + /** + Specify the color support for Chalk. + + By default, color support is automatically detected based on the environment. + + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + level?: Level; + } + + /** + Return a new Chalk instance. + */ + type Instance = new (options?: Options) => Chalk; + + /** + Detect whether the terminal supports color. + */ + interface ColorSupport { + /** + The color level used by Chalk. + */ + level: Level; + + /** + Return whether Chalk supports basic 16 colors. + */ + hasBasic: boolean; + + /** + Return whether Chalk supports ANSI 256 colors. + */ + has256: boolean; + + /** + Return whether Chalk supports Truecolor 16 million colors. + */ + has16m: boolean; + } + + interface ChalkFunction { + /** + Use a template string. + + @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) + + @example + ``` + import chalk = require('chalk'); + + log(chalk` + CPU: {red ${cpu.totalPercent}%} + RAM: {green ${ram.used / ram.total * 100}%} + DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} + `); + ``` + + @example + ``` + import chalk = require('chalk'); + + log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) + ``` + */ + (text: TemplateStringsArray, ...placeholders: unknown[]): string; + + (...text: unknown[]): string; + } + + interface Chalk extends ChalkFunction { + /** + Return a new Chalk instance. + */ + Instance: Instance; + + /** + The color support for Chalk. + + By default, color support is automatically detected based on the environment. + + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. + */ + level: Level; + + /** + Use HEX value to set text color. + + @param color - Hexadecimal value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.hex('#DEADED'); + ``` + */ + hex(color: string): Chalk; + + /** + Use keyword color value to set text color. + + @param color - Keyword value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.keyword('orange'); + ``` + */ + keyword(color: string): Chalk; + + /** + Use RGB values to set text color. + */ + rgb(red: number, green: number, blue: number): Chalk; + + /** + Use HSL values to set text color. + */ + hsl(hue: number, saturation: number, lightness: number): Chalk; + + /** + Use HSV values to set text color. + */ + hsv(hue: number, saturation: number, value: number): Chalk; + + /** + Use HWB values to set text color. + */ + hwb(hue: number, whiteness: number, blackness: number): Chalk; + + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. + + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + */ + ansi(code: number): Chalk; + + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256(index: number): Chalk; + + /** + Use HEX value to set background color. + + @param color - Hexadecimal value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.bgHex('#DEADED'); + ``` + */ + bgHex(color: string): Chalk; + + /** + Use keyword color value to set background color. + + @param color - Keyword value representing the desired color. + + @example + ``` + import chalk = require('chalk'); + + chalk.bgKeyword('orange'); + ``` + */ + bgKeyword(color: string): Chalk; + + /** + Use RGB values to set background color. + */ + bgRgb(red: number, green: number, blue: number): Chalk; + + /** + Use HSL values to set background color. + */ + bgHsl(hue: number, saturation: number, lightness: number): Chalk; + + /** + Use HSV values to set background color. + */ + bgHsv(hue: number, saturation: number, value: number): Chalk; + + /** + Use HWB values to set background color. + */ + bgHwb(hue: number, whiteness: number, blackness: number): Chalk; + + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. + + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + Use the foreground code, not the background code (for example, not 41, nor 101). + */ + bgAnsi(code: number): Chalk; + + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. + */ + bgAnsi256(index: number): Chalk; + + /** + Modifier: Resets the current color chain. + */ + readonly reset: Chalk; + + /** + Modifier: Make text bold. + */ + readonly bold: Chalk; + + /** + Modifier: Emitting only a small amount of light. + */ + readonly dim: Chalk; + + /** + Modifier: Make text italic. (Not widely supported) + */ + readonly italic: Chalk; + + /** + Modifier: Make text underline. (Not widely supported) + */ + readonly underline: Chalk; + + /** + Modifier: Inverse background and foreground colors. + */ + readonly inverse: Chalk; + + /** + Modifier: Prints the text, but makes it invisible. + */ + readonly hidden: Chalk; + + /** + Modifier: Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: Chalk; + + /** + Modifier: Prints the text only when Chalk has a color support level > 0. + Can be useful for things that are purely cosmetic. + */ + readonly visible: Chalk; + + readonly black: Chalk; + readonly red: Chalk; + readonly green: Chalk; + readonly yellow: Chalk; + readonly blue: Chalk; + readonly magenta: Chalk; + readonly cyan: Chalk; + readonly white: Chalk; + + /* + Alias for `blackBright`. + */ + readonly gray: Chalk; + + /* + Alias for `blackBright`. + */ + readonly grey: Chalk; + + readonly blackBright: Chalk; + readonly redBright: Chalk; + readonly greenBright: Chalk; + readonly yellowBright: Chalk; + readonly blueBright: Chalk; + readonly magentaBright: Chalk; + readonly cyanBright: Chalk; + readonly whiteBright: Chalk; + + readonly bgBlack: Chalk; + readonly bgRed: Chalk; + readonly bgGreen: Chalk; + readonly bgYellow: Chalk; + readonly bgBlue: Chalk; + readonly bgMagenta: Chalk; + readonly bgCyan: Chalk; + readonly bgWhite: Chalk; + + /* + Alias for `bgBlackBright`. + */ + readonly bgGray: Chalk; + + /* + Alias for `bgBlackBright`. + */ + readonly bgGrey: Chalk; + + readonly bgBlackBright: Chalk; + readonly bgRedBright: Chalk; + readonly bgGreenBright: Chalk; + readonly bgYellowBright: Chalk; + readonly bgBlueBright: Chalk; + readonly bgMagentaBright: Chalk; + readonly bgCyanBright: Chalk; + readonly bgWhiteBright: Chalk; + } +} + +/** +Main Chalk object that allows to chain styles together. +Call the last one as a method with a string argument. +Order doesn't matter, and later styles take precedent in case of a conflict. +This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. +*/ +declare const chalk: chalk.Chalk & chalk.ChalkFunction & { + supportsColor: chalk.ColorSupport | false; + Level: chalk.Level; + Color: Color; + ForegroundColor: ForegroundColor; + BackgroundColor: BackgroundColor; + Modifiers: Modifiers; + stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false}; +}; + +export = 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/node_modules/has-flag/index.d.ts b/node_modules/chalk/node_modules/has-flag/index.d.ts new file mode 100644 index 00000000..a0a48c89 --- /dev/null +++ b/node_modules/chalk/node_modules/has-flag/index.d.ts @@ -0,0 +1,39 @@ +/** +Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag. + +@param flag - CLI flag to look for. The `--` prefix is optional. +@param argv - CLI arguments. Default: `process.argv`. +@returns Whether the flag exists. + +@example +``` +// $ ts-node foo.ts -f --unicorn --foo=bar -- --rainbow + +// foo.ts +import hasFlag = require('has-flag'); + +hasFlag('unicorn'); +//=> true + +hasFlag('--unicorn'); +//=> true + +hasFlag('f'); +//=> true + +hasFlag('-f'); +//=> true + +hasFlag('foo=bar'); +//=> true + +hasFlag('foo'); +//=> false + +hasFlag('rainbow'); +//=> false +``` +*/ +declare function hasFlag(flag: string, argv?: string[]): boolean; + +export = hasFlag; diff --git a/node_modules/chalk/node_modules/has-flag/index.js b/node_modules/chalk/node_modules/has-flag/index.js new file mode 100644 index 00000000..b6f80b1f --- /dev/null +++ b/node_modules/chalk/node_modules/has-flag/index.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +}; diff --git a/node_modules/chalk/node_modules/has-flag/license b/node_modules/chalk/node_modules/has-flag/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/node_modules/has-flag/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/node_modules/has-flag/package.json b/node_modules/chalk/node_modules/has-flag/package.json new file mode 100644 index 00000000..a9cba4b8 --- /dev/null +++ b/node_modules/chalk/node_modules/has-flag/package.json @@ -0,0 +1,46 @@ +{ + "name": "has-flag", + "version": "4.0.0", + "description": "Check if argv has a specific flag", + "license": "MIT", + "repository": "sindresorhus/has-flag", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "has", + "check", + "detect", + "contains", + "find", + "flag", + "cli", + "command-line", + "argv", + "process", + "arg", + "args", + "argument", + "arguments", + "getopt", + "minimist", + "optimist" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/chalk/node_modules/has-flag/readme.md b/node_modules/chalk/node_modules/has-flag/readme.md new file mode 100644 index 00000000..3f72dff2 --- /dev/null +++ b/node_modules/chalk/node_modules/has-flag/readme.md @@ -0,0 +1,89 @@ +# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag) + +> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag + +Correctly stops looking after an `--` argument terminator. + +--- + +
+ + 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 has-flag +``` + + +## Usage + +```js +// foo.js +const hasFlag = require('has-flag'); + +hasFlag('unicorn'); +//=> true + +hasFlag('--unicorn'); +//=> true + +hasFlag('f'); +//=> true + +hasFlag('-f'); +//=> true + +hasFlag('foo=bar'); +//=> true + +hasFlag('foo'); +//=> false + +hasFlag('rainbow'); +//=> false +``` + +``` +$ node foo.js -f --unicorn --foo=bar -- --rainbow +``` + + +## API + +### hasFlag(flag, [argv]) + +Returns a boolean for whether the flag exists. + +#### flag + +Type: `string` + +CLI flag to look for. The `--` prefix is optional. + +#### argv + +Type: `string[]`
+Default: `process.argv` + +CLI arguments. + + +## 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 © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/chalk/node_modules/supports-color/browser.js b/node_modules/chalk/node_modules/supports-color/browser.js new file mode 100644 index 00000000..62afa3a7 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/browser.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; diff --git a/node_modules/chalk/node_modules/supports-color/index.js b/node_modules/chalk/node_modules/supports-color/index.js new file mode 100644 index 00000000..6fada390 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/index.js @@ -0,0 +1,135 @@ +'use strict'; +const os = require('os'); +const tty = require('tty'); +const hasFlag = require('has-flag'); + +const {env} = process; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} + +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } + + if (process.platform === 'win32') { + // 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(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', 'GITHUB_ACTIONS', 'BUILDKITE'].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; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) +}; diff --git a/node_modules/chalk/node_modules/supports-color/license b/node_modules/chalk/node_modules/supports-color/license new file mode 100644 index 00000000..e7af2f77 --- /dev/null +++ b/node_modules/chalk/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/chalk/node_modules/supports-color/package.json b/node_modules/chalk/node_modules/supports-color/package.json new file mode 100644 index 00000000..f7182edc --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/package.json @@ -0,0 +1,53 @@ +{ + "name": "supports-color", + "version": "7.2.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": ">=8" + }, + "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": "^4.0.0" + }, + "devDependencies": { + "ava": "^1.4.1", + "import-fresh": "^3.0.0", + "xo": "^0.24.0" + }, + "browser": "browser.js" +} diff --git a/node_modules/chalk/node_modules/supports-color/readme.md b/node_modules/chalk/node_modules/supports-color/readme.md new file mode 100644 index 00000000..36542285 --- /dev/null +++ b/node_modules/chalk/node_modules/supports-color/readme.md @@ -0,0 +1,76 @@ +# 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. + +For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) 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-) + + +--- + +
+ + 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. +
+
+ +--- diff --git a/node_modules/chalk/package.json b/node_modules/chalk/package.json new file mode 100644 index 00000000..47c23f29 --- /dev/null +++ b/node_modules/chalk/package.json @@ -0,0 +1,68 @@ +{ + "name": "chalk", + "version": "4.1.2", + "description": "Terminal string styling done right", + "license": "MIT", + "repository": "chalk/chalk", + "funding": "https://github.com/chalk/chalk?sponsor=1", + "main": "source", + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && nyc ava && tsd", + "bench": "matcha benchmark.js" + }, + "files": [ + "source", + "index.d.ts" + ], + "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": "^4.1.0", + "supports-color": "^7.1.0" + }, + "devDependencies": { + "ava": "^2.4.0", + "coveralls": "^3.0.7", + "execa": "^4.0.0", + "import-fresh": "^3.1.0", + "matcha": "^0.7.0", + "nyc": "^15.0.0", + "resolve-from": "^5.0.0", + "tsd": "^0.7.4", + "xo": "^0.28.2" + }, + "xo": { + "rules": { + "unicorn/prefer-string-slice": "off", + "unicorn/prefer-includes": "off", + "@typescript-eslint/member-ordering": "off", + "no-redeclare": "off", + "unicorn/string-content": "off", + "unicorn/better-regex": "off" + } + } +} diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md new file mode 100644 index 00000000..a055d21c --- /dev/null +++ b/node_modules/chalk/readme.md @@ -0,0 +1,341 @@ +

+
+
+ 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) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](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) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) + + + +
+ +--- + + + +--- + +
+ +## 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 ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020 + +## 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..aaae4173 --- /dev/null +++ b/node_modules/psl/data/rules.json @@ -0,0 +1,9376 @@ +[ +"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", +"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", +"bet.ar", +"com.ar", +"coop.ar", +"edu.ar", +"gob.ar", +"gov.ar", +"int.ar", +"mil.ar", +"musica.ar", +"mutual.ar", +"net.ar", +"org.ar", +"senasa.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", +"sth.ac.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", +"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", +"app.br", +"arq.br", +"art.br", +"ato.br", +"b.br", +"barueri.br", +"belem.br", +"bhz.br", +"bib.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", +"coz.br", +"cri.br", +"cuiaba.br", +"curitiba.br", +"def.br", +"des.br", +"det.br", +"dev.br", +"ecn.br", +"eco.br", +"edu.br", +"emp.br", +"enf.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", +"geo.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", +"log.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", +"rep.br", +"ribeirao.br", +"rio.br", +"riobranco.br", +"riopreto.br", +"salvador.br", +"sampa.br", +"santamaria.br", +"santoandre.br", +"saobernardo.br", +"saogonca.br", +"seg.br", +"sjc.br", +"slg.br", +"slz.br", +"sorocaba.br", +"srv.br", +"taxi.br", +"tc.br", +"tec.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", +"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", +"com.cv", +"edu.cv", +"int.cv", +"nome.cv", +"org.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", +"mil.cy", +"net.cy", +"org.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", +"art.dz", +"asso.dz", +"com.dz", +"edu.dz", +"gov.dz", +"org.dz", +"net.dz", +"pol.dz", +"soc.dz", +"tm.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", +"com.fm", +"edu.fm", +"net.fm", +"org.fm", +"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", +"edu.gd", +"gov.gd", +"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", +"com.ky", +"edu.ky", +"net.ky", +"org.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", +"biz.my", +"com.my", +"edu.my", +"gov.my", +"mil.my", +"name.my", +"net.my", +"org.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", +"me.ss", +"net.ss", +"org.ss", +"sch.ss", +"st", +"co.st", +"com.st", +"consulado.st", +"edu.st", +"embaixada.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", +"info.tn", +"intl.tn", +"mincom.tn", +"nat.tn", +"net.tn", +"org.tn", +"perso.tn", +"tourism.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", +"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.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", +"bib.ve", +"co.ve", +"com.ve", +"e12.ve", +"edu.ve", +"firm.ve", +"gob.ve", +"gov.ve", +"info.ve", +"int.ve", +"mil.ve", +"net.ve", +"nom.ve", +"org.ve", +"rar.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", +"com.ye", +"edu.ye", +"gov.ye", +"net.ye", +"mil.ye", +"org.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", +"afl", +"africa", +"agakhan", +"agency", +"aig", +"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", +"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", +"cash", +"casino", +"catering", +"catholic", +"cba", +"cbn", +"cbre", +"cbs", +"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", +"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", +"dunlop", +"dupont", +"durban", +"dvag", +"dvr", +"earth", +"eat", +"eco", +"edeka", +"education", +"email", +"emerck", +"energy", +"engineer", +"engineering", +"enterprises", +"epson", +"equipment", +"ericsson", +"erni", +"esq", +"estate", +"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", +"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", +"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", +"international", +"intuit", +"investments", +"ipiranga", +"irish", +"ismaili", +"ist", +"istanbul", +"itau", +"itv", +"jaguar", +"java", +"jcb", +"jeep", +"jetzt", +"jewelry", +"jio", +"jll", +"jmp", +"jnj", +"joburg", +"jot", +"joy", +"jpmorgan", +"jprs", +"juegos", +"juniper", +"kaufen", +"kddi", +"kerryhotels", +"kerrylogistics", +"kerryproperties", +"kfh", +"kia", +"kids", +"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", +"llc", +"llp", +"loan", +"loans", +"locker", +"locus", +"loft", +"lol", +"london", +"lotte", +"lotto", +"love", +"lpl", +"lplfinancial", +"ltd", +"ltda", +"lundbeck", +"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", +"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", +"music", +"mutual", +"nab", +"nagoya", +"natura", +"navy", +"nba", +"nec", +"netbank", +"netflix", +"network", +"neustar", +"new", +"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", +"office", +"okinawa", +"olayan", +"olayangroup", +"oldnavy", +"ollo", +"omega", +"one", +"ong", +"onl", +"online", +"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", +"racing", +"radio", +"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", +"ril", +"rio", +"rip", +"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", +"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", +"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", +"srl", +"stada", +"staples", +"star", +"statebank", +"statefarm", +"stc", +"stcgroup", +"stockholm", +"storage", +"store", +"stream", +"studio", +"study", +"style", +"sucks", +"supplies", +"supply", +"support", +"surf", +"surgery", +"suzuki", +"swatch", +"swiss", +"sydney", +"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", +"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", +"611.to", +"graphox.us", +"*.devcdnaccesso.com", +"adobeaemcloud.com", +"*.dev.adobeaemcloud.com", +"hlx.live", +"adobeaemcloud.net", +"hlx.page", +"hlx3.page", +"beep.pl", +"airkitapps.com", +"airkitapps-au.com", +"airkitapps.eu", +"aivencloud.com", +"barsy.ca", +"*.compute.estate", +"*.alces.network", +"kasserver.com", +"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", +"awsglobalaccelerator.com", +"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", +"t3l3p0rt.net", +"tele.amune.org", +"apigee.io", +"siiites.com", +"appspacehosted.com", +"appspaceusercontent.com", +"appudo.net", +"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", +"cdn.prod.atlassian-dev.net", +"translated.page", +"myfritz.net", +"onavstack.net", +"*.awdev.ca", +"*.advisor.ws", +"ecommerce-shop.pl", +"b-data.io", +"backplaneapp.io", +"balena-devices.com", +"rs.ba", +"*.banzai.cloud", +"app.banzaicloud.io", +"*.backyards.banzaicloud.io", +"base.ec", +"official.ec", +"buyshop.jp", +"fashionstore.jp", +"handcrafted.jp", +"kawaiishop.jp", +"supersale.jp", +"theshop.jp", +"shopselect.net", +"base.shop", +"*.beget.app", +"betainabox.com", +"bnr.la", +"bitbucket.io", +"blackbaudcdn.net", +"of.je", +"bluebite.io", +"boomla.net", +"boutir.com", +"boxfuse.io", +"square7.ch", +"bplaced.com", +"bplaced.de", +"square7.de", +"bplaced.net", +"square7.net", +"shop.brendly.rs", +"browsersafetymark.io", +"uk0.bigv.io", +"dh.bytemark.co.uk", +"vm.bytemark.co.uk", +"cafjs.com", +"mycd.eu", +"drr.ac", +"uwu.ai", +"carrd.co", +"crd.co", +"ju.mp", +"ae.org", +"br.com", +"cn.com", +"com.de", +"com.se", +"de.com", +"eu.com", +"gb.net", +"hu.net", +"jp.net", +"jpn.com", +"mex.com", +"ru.com", +"sa.com", +"se.net", +"uk.com", +"uk.net", +"us.com", +"za.bz", +"za.com", +"ar.com", +"hu.com", +"kr.com", +"no.com", +"qc.com", +"uy.com", +"africa.com", +"gr.com", +"in.net", +"web.in", +"us.org", +"co.com", +"aus.basketball", +"nz.basketball", +"radio.am", +"radio.fm", +"c.la", +"certmgr.org", +"cx.ua", +"discourse.group", +"discourse.team", +"cleverapps.io", +"clerk.app", +"clerkstage.app", +"*.lcl.dev", +"*.lclstage.dev", +"*.stg.dev", +"*.stgstage.dev", +"clickrising.net", +"c66.me", +"cloud66.ws", +"cloud66.zone", +"jdevcloud.com", +"wpdevcloud.com", +"cloudaccess.host", +"freesite.host", +"cloudaccess.net", +"cloudcontrolled.com", +"cloudcontrolapp.com", +"*.cloudera.site", +"pages.dev", +"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", +"cnpy.gdn", +"codeberg.page", +"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", +"curv.dev", +"*.customer-oci.com", +"*.oci.customer-oci.com", +"*.ocp.customer-oci.com", +"*.ocs.customer-oci.com", +"cyon.link", +"cyon.site", +"fnwk.site", +"folionetwork.site", +"platform0.app", +"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", +"dyndns.dappnode.io", +"*.dapps.earth", +"*.bzz.dapps.earth", +"builtwithdark.com", +"demo.datadetect.com", +"instance.datadetect.com", +"edgestack.me", +"ddns5.com", +"debian.net", +"deno.dev", +"deno-staging.dev", +"dedyn.io", +"deta.app", +"deta.dev", +"*.rss.my.id", +"*.diher.solutions", +"discordsays.com", +"discordsez.com", +"jozi.biz", +"dnshome.de", +"online.th", +"shop.th", +"drayddns.com", +"shoparena.pl", +"dreamhosters.com", +"mydrobo.com", +"drud.io", +"drud.us", +"duckdns.org", +"bip.sh", +"bitbridge.net", +"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", +"ondigitalocean.app", +"*.digitaloceanspaces.com", +"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", +"eero.online", +"eero-stage.online", +"elementor.cloud", +"elementor.cool", +"en-root.fr", +"mytuleap.com", +"tuleap-partners.com", +"encr.app", +"encoreapi.com", +"onred.one", +"staging.onred.one", +"eu.encoway.cloud", +"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", +"eurodir.ru", +"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", +"onfabrica.com", +"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", +"edgecompute.app", +"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", +"fastvps-server.com", +"fastvps.host", +"myfast.host", +"fastvps.site", +"myfast.space", +"fedorainfracloud.org", +"fedorapeople.org", +"cloud.fedoraproject.org", +"app.os.fedoraproject.org", +"app.os.stg.fedoraproject.org", +"conn.uk", +"copro.uk", +"hosp.uk", +"mydobiss.com", +"fh-muenster.io", +"filegear.me", +"filegear-au.me", +"filegear-de.me", +"filegear-gb.me", +"filegear-ie.me", +"filegear-jp.me", +"filegear-sg.me", +"firebaseapp.com", +"fireweb.app", +"flap.id", +"onflashdrive.app", +"fldrv.com", +"fly.dev", +"edgeapp.net", +"shw.io", +"flynnhosting.net", +"forgeblocks.com", +"id.forgerock.io", +"framer.app", +"framercanvas.com", +"*.frusky.de", +"ravpage.co.il", +"0e.vc", +"freebox-os.com", +"freeboxos.com", +"fbx-os.fr", +"fbxos.fr", +"freebox-os.fr", +"freeboxos.fr", +"freedesktop.org", +"freemyip.com", +"wien.funkfeuer.at", +"*.futurecms.at", +"*.ex.futurecms.at", +"*.in.futurecms.at", +"futurehosting.at", +"futuremailing.at", +"*.ex.ortsinfo.at", +"*.kunden.ortsinfo.at", +"*.statics.cloud", +"independent-commission.uk", +"independent-inquest.uk", +"independent-inquiry.uk", +"independent-panel.uk", +"independent-review.uk", +"public-inquiry.uk", +"royal-commission.uk", +"campaign.gov.uk", +"service.gov.uk", +"api.gov.uk", +"gehirn.ne.jp", +"usercontent.jp", +"gentapps.com", +"gentlentapis.com", +"lab.ms", +"cdn-edges.net", +"ghost.io", +"gsj.bz", +"githubusercontent.com", +"githubpreview.dev", +"github.io", +"gitlab.io", +"gitapp.si", +"gitpage.si", +"glitch.me", +"nog.community", +"co.ro", +"shop.ro", +"lolipop.io", +"angry.jp", +"babyblue.jp", +"babymilk.jp", +"backdrop.jp", +"bambina.jp", +"bitter.jp", +"blush.jp", +"boo.jp", +"boy.jp", +"boyfriend.jp", +"but.jp", +"candypop.jp", +"capoo.jp", +"catfood.jp", +"cheap.jp", +"chicappa.jp", +"chillout.jp", +"chips.jp", +"chowder.jp", +"chu.jp", +"ciao.jp", +"cocotte.jp", +"coolblog.jp", +"cranky.jp", +"cutegirl.jp", +"daa.jp", +"deca.jp", +"deci.jp", +"digick.jp", +"egoism.jp", +"fakefur.jp", +"fem.jp", +"flier.jp", +"floppy.jp", +"fool.jp", +"frenchkiss.jp", +"girlfriend.jp", +"girly.jp", +"gloomy.jp", +"gonna.jp", +"greater.jp", +"hacca.jp", +"heavy.jp", +"her.jp", +"hiho.jp", +"hippy.jp", +"holy.jp", +"hungry.jp", +"icurus.jp", +"itigo.jp", +"jellybean.jp", +"kikirara.jp", +"kill.jp", +"kilo.jp", +"kuron.jp", +"littlestar.jp", +"lolipopmc.jp", +"lolitapunk.jp", +"lomo.jp", +"lovepop.jp", +"lovesick.jp", +"main.jp", +"mods.jp", +"mond.jp", +"mongolian.jp", +"moo.jp", +"namaste.jp", +"nikita.jp", +"nobushi.jp", +"noor.jp", +"oops.jp", +"parallel.jp", +"parasite.jp", +"pecori.jp", +"peewee.jp", +"penne.jp", +"pepper.jp", +"perma.jp", +"pigboat.jp", +"pinoko.jp", +"punyu.jp", +"pupu.jp", +"pussycat.jp", +"pya.jp", +"raindrop.jp", +"readymade.jp", +"sadist.jp", +"schoolbus.jp", +"secret.jp", +"staba.jp", +"stripper.jp", +"sub.jp", +"sunnyday.jp", +"thick.jp", +"tonkotsu.jp", +"under.jp", +"upper.jp", +"velvet.jp", +"verse.jp", +"versus.jp", +"vivian.jp", +"watson.jp", +"weblike.jp", +"whitesnow.jp", +"zombie.jp", +"heteml.net", +"cloudapps.digital", +"london.cloudapps.digital", +"pymnt.uk", +"homeoffice.gov.uk", +"ro.im", +"goip.de", +"run.app", +"a.run.app", +"web.app", +"*.0emm.com", +"appspot.com", +"*.r.appspot.com", +"codespot.com", +"googleapis.com", +"googlecode.com", +"pagespeedmobilizer.com", +"publishproxy.com", +"withgoogle.com", +"withyoutube.com", +"*.gateway.dev", +"cloud.goog", +"translate.goog", +"*.usercontent.goog", +"cloudfunctions.net", +"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", +"goupile.fr", +"gov.nl", +"awsmppl.com", +"günstigbestellen.de", +"günstigliefern.de", +"fin.ci", +"free.hr", +"caa.li", +"ua.rs", +"conf.se", +"hs.zone", +"hs.run", +"hashbang.sh", +"hasura.app", +"hasura-app.io", +"pages.it.hs-heilbronn.de", +"hepforge.org", +"herokuapp.com", +"herokussl.com", +"ravendb.cloud", +"myravendb.com", +"ravendb.community", +"ravendb.me", +"development.run", +"ravendb.run", +"homesklep.pl", +"secaas.hk", +"hoplix.shop", +"orx.biz", +"biz.gl", +"col.ng", +"firm.ng", +"gen.ng", +"ltd.ng", +"ngo.ng", +"edu.scot", +"sch.so", +"hostyhosting.io", +"häkkinen.fi", +"*.moonscale.io", +"moonscale.net", +"iki.fi", +"ibxos.it", +"iliadboxos.it", +"impertrixcdn.com", +"impertrix.com", +"smushcdn.com", +"wphostedmail.com", +"wpmucdn.com", +"tempurl.host", +"wpmudev.host", +"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", +"na4u.ru", +"iopsys.se", +"ipifony.net", +"iservschule.de", +"mein-iserv.de", +"schulplattform.de", +"schulserver.de", +"test-iserv.de", +"iserv.dev", +"iobb.net", +"mel.cloudlets.com.au", +"cloud.interhostsolutions.be", +"users.scale.virtualcloud.com.br", +"mycloud.by", +"alp1.ae.flow.ch", +"appengine.flow.ch", +"es-1.axarnet.cloud", +"diadem.cloud", +"vip.jelastic.cloud", +"jele.cloud", +"it1.eur.aruba.jenv-aruba.cloud", +"it1.jenv-aruba.cloud", +"keliweb.cloud", +"cs.keliweb.cloud", +"oxa.cloud", +"tn.oxa.cloud", +"uk.oxa.cloud", +"primetel.cloud", +"uk.primetel.cloud", +"ca.reclaim.cloud", +"uk.reclaim.cloud", +"us.reclaim.cloud", +"ch.trendhosting.cloud", +"de.trendhosting.cloud", +"jele.club", +"amscompute.com", +"clicketcloud.com", +"dopaas.com", +"hidora.com", +"paas.hosted-by-previder.com", +"rag-cloud.hosteur.com", +"rag-cloud-ch.hosteur.com", +"jcloud.ik-server.com", +"jcloud-ver-jpc.ik-server.com", +"demo.jelastic.com", +"kilatiron.com", +"paas.massivegrid.com", +"jed.wafaicloud.com", +"lon.wafaicloud.com", +"ryd.wafaicloud.com", +"j.scaleforce.com.cy", +"jelastic.dogado.eu", +"fi.cloudplatform.fi", +"demo.datacenter.fi", +"paas.datacenter.fi", +"jele.host", +"mircloud.host", +"paas.beebyte.io", +"sekd1.beebyteapp.io", +"jele.io", +"cloud-fr1.unispace.io", +"jc.neen.it", +"cloud.jelastic.open.tim.it", +"jcloud.kz", +"upaas.kazteleport.kz", +"cloudjiffy.net", +"fra1-de.cloudjiffy.net", +"west1-us.cloudjiffy.net", +"jls-sto1.elastx.net", +"jls-sto2.elastx.net", +"jls-sto3.elastx.net", +"faststacks.net", +"fr-1.paas.massivegrid.net", +"lon-1.paas.massivegrid.net", +"lon-2.paas.massivegrid.net", +"ny-1.paas.massivegrid.net", +"ny-2.paas.massivegrid.net", +"sg-1.paas.massivegrid.net", +"jelastic.saveincloud.net", +"nordeste-idc.saveincloud.net", +"j.scaleforce.net", +"jelastic.tsukaeru.net", +"sdscloud.pl", +"unicloud.pl", +"mircloud.ru", +"jelastic.regruhosting.ru", +"enscaled.sg", +"jele.site", +"jelastic.team", +"orangecloud.tn", +"j.layershift.co.uk", +"phx.enscaled.us", +"mircloud.us", +"myjino.ru", +"*.hosting.myjino.ru", +"*.landing.myjino.ru", +"*.spectrum.myjino.ru", +"*.vps.myjino.ru", +"jotelulu.cloud", +"*.triton.zone", +"*.cns.joyent.com", +"js.org", +"kaas.gg", +"khplay.nl", +"ktistory.com", +"kapsi.fi", +"keymachine.de", +"kinghost.net", +"uni5.net", +"knightpoint.systems", +"koobin.events", +"oya.to", +"kuleuven.cloud", +"ezproxy.kuleuven.be", +"co.krd", +"edu.krd", +"krellian.net", +"webthings.io", +"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", +"linkyard.cloud", +"linkyard-cloud.ch", +"members.linode.com", +"*.nodebalancer.linode.com", +"*.linodeobjects.com", +"ip.linodeusercontent.com", +"we.bs", +"*.user.localcert.dev", +"localzone.xyz", +"loginline.app", +"loginline.dev", +"loginline.io", +"loginline.services", +"loginline.site", +"servers.run", +"lohmus.me", +"krasnik.pl", +"leczna.pl", +"lubartow.pl", +"lublin.pl", +"poniatowa.pl", +"swidnik.pl", +"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.ro", +"barsy.shop", +"barsy.site", +"barsy.support", +"barsy.uk", +"*.magentosite.cloud", +"mayfirst.info", +"mayfirst.org", +"hb.cldmail.ru", +"cn.vu", +"mazeplay.com", +"mcpe.me", +"mcdir.me", +"mcdir.ru", +"mcpre.ru", +"vps.mcdir.ru", +"mediatech.by", +"mediatech.dev", +"hra.health", +"miniserver.com", +"memset.net", +"messerli.app", +"*.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", +"azurestaticapps.net", +"1.azurestaticapps.net", +"centralus.azurestaticapps.net", +"eastasia.azurestaticapps.net", +"eastus2.azurestaticapps.net", +"westeurope.azurestaticapps.net", +"westus2.azurestaticapps.net", +"csx.cc", +"mintere.site", +"forte.id", +"mozilla-iot.org", +"bmoattachments.org", +"net.ru", +"org.ru", +"pp.ru", +"hostedpi.com", +"customer.mythic-beasts.com", +"caracal.mythic-beasts.com", +"fentiger.mythic-beasts.com", +"lynx.mythic-beasts.com", +"ocelot.mythic-beasts.com", +"oncilla.mythic-beasts.com", +"onza.mythic-beasts.com", +"sphinx.mythic-beasts.com", +"vs.mythic-beasts.com", +"x.mythic-beasts.com", +"yali.mythic-beasts.com", +"cust.retrosnub.co.uk", +"ui.nabu.casa", +"pony.club", +"of.fashion", +"in.london", +"of.london", +"from.marketing", +"with.marketing", +"for.men", +"repair.men", +"and.mom", +"for.mom", +"for.one", +"under.one", +"for.sale", +"that.win", +"from.work", +"to.work", +"cloud.nospamproxy.com", +"netlify.app", +"4u.com", +"ngrok.io", +"nh-serv.co.uk", +"nfshost.com", +"*.developer.app", +"noop.app", +"*.northflank.app", +"*.build.run", +"*.code.run", +"*.database.run", +"*.migration.run", +"noticeable.news", +"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", +"pcloud.host", +"nyc.mn", +"static.observableusercontent.com", +"cya.gg", +"omg.lol", +"cloudycluster.net", +"omniwe.site", +"service.one", +"nid.io", +"opensocial.site", +"opencraft.hosting", +"orsites.com", +"operaunite.com", +"tech.orange", +"authgear-staging.com", +"authgearapps.com", +"skygearapp.com", +"outsystemscloud.com", +"*.webpaas.ovh.net", +"*.hosting.ovh.net", +"ownprovider.com", +"own.pm", +"*.owo.codes", +"ox.rs", +"oy.lc", +"pgfog.com", +"pagefrontapp.com", +"pagexl.com", +"*.paywhirl.com", +"bar0.net", +"bar1.net", +"bar2.net", +"rdv.to", +"art.pl", +"gliwice.pl", +"krakow.pl", +"poznan.pl", +"wroc.pl", +"zakopane.pl", +"pantheonsite.io", +"gotpantheon.com", +"mypep.link", +"perspecta.cloud", +"lk3.ru", +"on-web.fr", +"bc.platform.sh", +"ent.platform.sh", +"eu.platform.sh", +"us.platform.sh", +"*.platformsh.site", +"*.tst.site", +"platter-app.com", +"platter-app.dev", +"platterp.us", +"pdns.page", +"plesk.page", +"pleskns.com", +"dyn53.io", +"onporter.run", +"co.bn", +"postman-echo.com", +"pstmn.io", +"mock.pstmn.io", +"httpbin.org", +"prequalifyme.today", +"xen.prgmr.com", +"priv.at", +"prvcy.page", +"*.dweb.link", +"protonet.io", +"chirurgiens-dentistes-en-france.fr", +"byen.site", +"pubtls.org", +"pythonanywhere.com", +"eu.pythonanywhere.com", +"qoto.io", +"qualifioapp.com", +"qbuser.com", +"cloudsite.builders", +"instances.spawn.cc", +"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", +"g.vbrplsbx.io", +"*.on-k3s.io", +"*.on-rancher.cloud", +"*.on-rio.io", +"readthedocs.io", +"rhcloud.com", +"app.render.com", +"onrender.com", +"repl.co", +"id.repl.co", +"repl.run", +"resindevice.io", +"devices.resinstaging.io", +"hzc.io", +"wellbeingzone.eu", +"wellbeingzone.co.uk", +"adimo.co.uk", +"itcouldbewor.se", +"git-pages.rit.edu", +"rocky.page", +"биз.рус", +"ком.рус", +"крым.рус", +"мир.рус", +"мск.рус", +"орг.рус", +"самара.рус", +"сочи.рус", +"спб.рус", +"я.рус", +"*.builder.code.com", +"*.dev-builder.code.com", +"*.stg-builder.code.com", +"sandcats.io", +"logoip.de", +"logoip.com", +"fr-par-1.baremetal.scw.cloud", +"fr-par-2.baremetal.scw.cloud", +"nl-ams-1.baremetal.scw.cloud", +"fnc.fr-par.scw.cloud", +"functions.fnc.fr-par.scw.cloud", +"k8s.fr-par.scw.cloud", +"nodes.k8s.fr-par.scw.cloud", +"s3.fr-par.scw.cloud", +"s3-website.fr-par.scw.cloud", +"whm.fr-par.scw.cloud", +"priv.instances.scw.cloud", +"pub.instances.scw.cloud", +"k8s.scw.cloud", +"k8s.nl-ams.scw.cloud", +"nodes.k8s.nl-ams.scw.cloud", +"s3.nl-ams.scw.cloud", +"s3-website.nl-ams.scw.cloud", +"whm.nl-ams.scw.cloud", +"k8s.pl-waw.scw.cloud", +"nodes.k8s.pl-waw.scw.cloud", +"s3.pl-waw.scw.cloud", +"s3-website.pl-waw.scw.cloud", +"scalebook.scw.cloud", +"smartlabeling.scw.cloud", +"dedibox.fr", +"schokokeks.net", +"gov.scot", +"service.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", +"seidat.net", +"sellfy.store", +"senseering.net", +"minisite.ms", +"magnet.page", +"biz.ua", +"co.ua", +"pp.ua", +"shiftcrypto.dev", +"shiftcrypto.io", +"shiftedit.io", +"myshopblocks.com", +"myshopify.com", +"shopitsite.com", +"shopware.store", +"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", +"small-web.org", +"vp4.me", +"try-snowplow.com", +"srht.site", +"stackhero-network.com", +"musician.io", +"novecore.site", +"static.land", +"dev.static.land", +"sites.static.land", +"storebase.store", +"vps-host.net", +"atl.jelastic.vps-host.net", +"njs.jelastic.vps-host.net", +"ric.jelastic.vps-host.net", +"playstation-cloud.com", +"apps.lair.io", +"*.stolos.io", +"spacekit.io", +"customer.speedpartner.de", +"myspreadshop.at", +"myspreadshop.com.au", +"myspreadshop.be", +"myspreadshop.ca", +"myspreadshop.ch", +"myspreadshop.com", +"myspreadshop.de", +"myspreadshop.dk", +"myspreadshop.es", +"myspreadshop.fi", +"myspreadshop.fr", +"myspreadshop.ie", +"myspreadshop.it", +"myspreadshop.net", +"myspreadshop.nl", +"myspreadshop.no", +"myspreadshop.pl", +"myspreadshop.se", +"myspreadshop.co.uk", +"api.stdlib.com", +"storj.farm", +"utwente.io", +"soc.srcf.net", +"user.srcf.net", +"temp-dns.com", +"supabase.co", +"supabase.in", +"supabase.net", +"su.paba.se", +"*.s5y.io", +"*.sensiosite.cloud", +"syncloud.it", +"dscloud.biz", +"direct.quickconnect.cn", +"dsmynas.com", +"familyds.com", +"diskstation.me", +"dscloud.me", +"i234.me", +"myds.me", +"synology.me", +"dscloud.mobi", +"dsmynas.net", +"familyds.net", +"dsmynas.org", +"familyds.org", +"vpnplus.to", +"direct.quickconnect.to", +"tabitorder.co.il", +"taifun-dns.de", +"beta.tailscale.net", +"ts.net", +"gda.pl", +"gdansk.pl", +"gdynia.pl", +"med.pl", +"sopot.pl", +"site.tb-hosting.com", +"edugit.io", +"s3.teckids.org", +"telebit.app", +"telebit.io", +"*.telebit.xyz", +"gwiddle.co.uk", +"*.firenet.ch", +"*.svc.firenet.ch", +"reservd.com", +"thingdustdata.com", +"cust.dev.thingdust.io", +"cust.disrec.thingdust.io", +"cust.prod.thingdust.io", +"cust.testing.thingdust.io", +"reservd.dev.thingdust.io", +"reservd.disrec.thingdust.io", +"reservd.testing.thingdust.io", +"tickets.io", +"arvo.network", +"azimuth.network", +"tlon.network", +"torproject.net", +"pages.torproject.net", +"bloxcms.com", +"townnews-staging.com", +"tbits.me", +"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", +"site.transip.me", +"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", +"typedream.app", +"pro.typeform.com", +"uber.space", +"*.uberspace.de", +"hk.com", +"hk.org", +"ltd.hk", +"inc.hk", +"name.pm", +"sch.tf", +"biz.wf", +"sch.wf", +"org.yt", +"virtualuser.de", +"virtual-user.de", +"upli.io", +"urown.cloud", +"dnsupdate.info", +"lib.de.us", +"2038.io", +"vercel.app", +"vercel.dev", +"now.sh", +"router.management", +"v-info.info", +"voorloper.cloud", +"neko.am", +"nyaa.am", +"be.ax", +"cat.ax", +"es.ax", +"eu.ax", +"gg.ax", +"mc.ax", +"us.ax", +"xy.ax", +"nl.ci", +"xx.gl", +"app.gp", +"blog.gt", +"de.gt", +"to.gt", +"be.gy", +"cc.hn", +"blog.kg", +"io.kg", +"jp.kg", +"tv.kg", +"uk.kg", +"us.kg", +"de.ls", +"at.md", +"de.md", +"jp.md", +"to.md", +"indie.porn", +"vxl.sh", +"ch.tc", +"me.tc", +"we.tc", +"nyan.to", +"at.vg", +"blog.vu", +"dev.vu", +"me.vu", +"v.ua", +"*.vultrobjects.com", +"wafflecell.com", +"*.webhare.dev", +"reserve-online.net", +"reserve-online.com", +"bookonline.app", +"hotelwithflight.com", +"wedeploy.io", +"wedeploy.me", +"wedeploy.sh", +"remotewd.com", +"pages.wiardweb.com", +"wmflabs.org", +"toolforge.org", +"wmcloud.org", +"panel.gg", +"daemon.panel.gg", +"messwithdns.com", +"woltlab-demo.com", +"myforum.community", +"community-pro.de", +"diskussionsbereich.de", +"community-pro.net", +"meinforum.net", +"affinitylottery.org.uk", +"raffleentry.org.uk", +"weeklylottery.org.uk", +"wpenginepowered.com", +"js.wpenginepowered.com", +"wixsite.com", +"editorx.io", +"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", +"ynh.fr", +"nohost.me", +"noho.st", +"za.net", +"za.org", +"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..2e967dfe --- /dev/null +++ b/node_modules/psl/dist/psl.js @@ -0,0 +1,10187 @@ +(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){(function (){ +/*! 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)}).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..cbcd8eb3 --- /dev/null +++ b/node_modules/psl/dist/psl.min.js @@ -0,0 +1 @@ +!function(a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define([],a):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}(function(){return function e(s,n,t){function m(o,a){if(!n[o]){if(!s[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(u)return u(o,!0);throw(a=new Error("Cannot find module '"+o+"'")).code="MODULE_NOT_FOUND",a}i=n[o]={exports:{}},s[o][0].call(i.exports,function(a){return m(s[o][1][a]||a)},i,i.exports,e,s,n,t)}return n[o].exports}for(var u="function"==typeof require&&require,a=0;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},l=j-1,y=Math.floor,f=String.fromCharCode;function v(a){throw new RangeError(c[a])}function k(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="",i=(1>>10&1023|55296),a=56320|1023&a),o+=f(a)}).join("")}function z(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function x(a,o,i){var e=0;for(a=i?y(a/m):a>>1,a+=y(a/o);l*b>>1y((d-p)/n))&&v("overflow"),p+=m*n,!(m<(m=t<=l?1:l+b<=t?b:t-l));t+=j)n>y(d/(m=j-m))&&v("overflow"),n*=m;l=x(p-s,o=u.length+1,0==s),y(p/o)>d-c&&v("overflow"),c+=y(p/o),p%=o,u.splice(p++,0,c)}return h(u)}function A(a){for(var o,i,e,s,n,t,m,u,r,p,c=[],l=(a=w(a)).length,k=128,g=72,h=o=0;hy((d-o)/(u=i+1))&&v("overflow"),o+=(s-k)*u,k=s,h=0;hd&&v("overflow"),m==k){for(n=o,t=j;!(n<(r=t<=g?1:g+b<=t?b:t-g));t+=j)c.push(f(z(r+(p=n-r)%(r=j-r),0))),n=y(p/r);c.push(f(z(n,0))),g=x(o,u,i==e),o=0,++i}++o,++k}return c.join("")}if(s={version:"1.4.1",ucs2:{decode:w,encode:h},decode:q,encode:A,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+A(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?q(a.slice(4).toLowerCase()):a})}},o&&i)if(_.exports==o)i.exports=s;else for(n in s)s.hasOwnProperty(n)&&(o[n]=s[n]);else a.punycode=s}.call(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..baddd50b --- /dev/null +++ b/node_modules/psl/package.json @@ -0,0 +1,43 @@ +{ + "name": "psl", + "version": "1.9.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": { + "lint": "eslint .", + "test": "mocha test/*.spec.js", + "test:browserstack": "node test/browserstack.js", + "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": { + "browserify": "^17.0.0", + "browserslist-browserstack": "^3.1.1", + "browserstack-local": "^1.5.1", + "chai": "^4.3.6", + "commit-and-pr": "^1.0.4", + "eslint": "^8.19.0", + "JSONStream": "^1.3.5", + "mocha": "^7.2.0", + "porch": "^2.0.0", + "request": "^2.88.2", + "selenium-webdriver": "^4.3.0", + "serve-handler": "^6.1.3", + "uglify-js": "^3.16.2", + "watchify": "^4.0.0" + } +} diff --git a/node_modules/pstree.remy/.travis.yml b/node_modules/pstree.remy/.travis.yml new file mode 100644 index 00000000..5bf093ee --- /dev/null +++ b/node_modules/pstree.remy/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +cache: + directories: + - ~/.npm +notifications: + email: false +node_js: + - '8' diff --git a/node_modules/pstree.remy/LICENSE b/node_modules/pstree.remy/LICENSE new file mode 100644 index 00000000..e83bea65 --- /dev/null +++ b/node_modules/pstree.remy/LICENSE @@ -0,0 +1,7 @@ +The MIT License (MIT) +Copyright © 2019 Remy Sharp, https://remysharp.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/pstree.remy/README.md b/node_modules/pstree.remy/README.md new file mode 100644 index 00000000..5f44c629 --- /dev/null +++ b/node_modules/pstree.remy/README.md @@ -0,0 +1,26 @@ +# pstree.remy + +> Cross platform ps-tree (including unix flavours without ps) + +## Installation + +```shel +npm install pstree.remy +``` + +## Usage + +```js +const psTree = psTree require('pstree.remy'); + +psTree(PID, (err, pids) => { + if (err) { + console.error(err); + } + console.log(pids) +}); + +console.log(psTree.hasPS + ? "This platform has the ps shell command" + : "This platform does not have the ps shell command"); +``` diff --git a/node_modules/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js new file mode 100644 index 00000000..743e9979 --- /dev/null +++ b/node_modules/pstree.remy/lib/index.js @@ -0,0 +1,37 @@ +const exec = require('child_process').exec; +const tree = require('./tree'); +const utils = require('./utils'); +var hasPS = true; + +// discover if the OS has `ps`, and therefore can use psTree +exec('ps', (error) => { + module.exports.hasPS = hasPS = !error; +}); + +module.exports = function main(pid, callback) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + + if (hasPS && !process.env.NO_PS) { + return tree(pid, callback); + } + + utils + .getStat() + .then(utils.tree) + .then((tree) => utils.pidsForTree(tree, pid)) + .then((res) => + callback( + null, + res.map((p) => p.PID) + ) + ) + .catch((error) => callback(error)); +}; + +if (!module.parent) { + module.exports(process.argv[2], (e, pids) => console.log(pids)); +} + +module.exports.hasPS = hasPS; diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js new file mode 100644 index 00000000..bac7cce6 --- /dev/null +++ b/node_modules/pstree.remy/lib/tree.js @@ -0,0 +1,37 @@ +const spawn = require('child_process').spawn; + +module.exports = function (rootPid, callback) { + const pidsOfInterest = new Set([parseInt(rootPid, 10)]); + var output = ''; + + // *nix + const ps = spawn('ps', ['-A', '-o', 'ppid,pid']); + ps.stdout.on('data', (data) => { + output += data.toString('ascii'); + }); + + ps.on('close', () => { + try { + const res = output + .split('\n') + .slice(1) + .map((_) => _.trim()) + .reduce((acc, line) => { + const pids = line.split(/\s+/); + const ppid = parseInt(pids[0], 10); + + if (pidsOfInterest.has(ppid)) { + const pid = parseInt(pids[1], 10); + acc.push(pid); + pidsOfInterest.add(pid); + } + + return acc; + }, []); + + callback(null, res); + } catch (e) { + callback(e, null); + } + }); +}; diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js new file mode 100644 index 00000000..8fa5719e --- /dev/null +++ b/node_modules/pstree.remy/lib/utils.js @@ -0,0 +1,53 @@ +const spawn = require('child_process').spawn; + +module.exports = { tree, pidsForTree, getStat }; + +function getStat() { + return new Promise((resolve) => { + const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`; + const spawned = spawn('sh', ['-c', command], { + stdio: ['pipe', 'pipe', 'pipe'], + }); + + var res = ''; + spawned.stdout.on('data', (data) => (res += data)); + spawned.on('close', () => resolve(res)); + }); +} + +function template(s) { + var stat = null; + // 'pid', 'comm', 'state', 'ppid', 'pgrp' + // %d (%s) %c %d %d + s.replace( + /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g, + (all, PID, COMMAND, STAT, PPID) => { + stat = { PID, COMMAND, PPID, STAT }; + } + ); + + return stat; +} + +function tree(stats) { + const processes = stats.split('\n').map(template).filter(Boolean); + + return processes; +} + +function pidsForTree(tree, pid) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + const parents = [pid]; + const pids = []; + + tree.forEach((proc) => { + if (parents.indexOf(proc.PPID) !== -1) { + parents.push(proc.PID); + pids.push(proc); + } + }); + + return pids; +} diff --git a/node_modules/pstree.remy/package.json b/node_modules/pstree.remy/package.json new file mode 100644 index 00000000..35c70683 --- /dev/null +++ b/node_modules/pstree.remy/package.json @@ -0,0 +1,33 @@ +{ + "name": "pstree.remy", + "version": "1.1.8", + "main": "lib/index.js", + "prettier": { + "trailingComma": "es5", + "semi": true, + "singleQuote": true + }, + "scripts": { + "test": "tap tests/*.test.js", + "_prepublish": "npm test" + }, + "keywords": [ + "ps", + "pstree", + "ps tree" + ], + "author": "Remy Sharp", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/remy/pstree.git" + }, + "devDependencies": { + "tap": "^11.0.0" + }, + "directories": { + "test": "tests" + }, + "dependencies": {}, + "description": "Collects the full tree of processes from /proc" +} diff --git a/node_modules/pstree.remy/tests/fixtures/index.js b/node_modules/pstree.remy/tests/fixtures/index.js new file mode 100644 index 00000000..4cdbcb1b --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/index.js @@ -0,0 +1,13 @@ +const spawn = require('child_process').spawn; +function run() { + spawn( + 'sh', + ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'], + { + stdio: 'pipe', + } + ); +} + +var runCallCount = process.argv[2] || 1; +for (var i = 0; i < runCallCount; i++) run(); diff --git a/node_modules/pstree.remy/tests/fixtures/out1 b/node_modules/pstree.remy/tests/fixtures/out1 new file mode 100644 index 00000000..abfe5810 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out1 @@ -0,0 +1,10 @@ +1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0 +15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0 +16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0 +27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0 +28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0 +39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0 +45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0 +cat: /proc/50/stat: No such file or directory +cat: /proc/51/stat: No such file or directory +52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0 diff --git a/node_modules/pstree.remy/tests/fixtures/out2 b/node_modules/pstree.remy/tests/fixtures/out2 new file mode 100644 index 00000000..3b31137d --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out2 @@ -0,0 +1,29 @@ +cat: /proc/4087/stat: No such file or directory +cat: /proc/4088/stat: No such file or directory +1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0 +1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0 +194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0 +359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0 +4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0 +4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0 +4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0 +4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0 +4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0 +4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0 +4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0 +50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0 +79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0 +94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/node_modules/pstree.remy/tests/index.test.js b/node_modules/pstree.remy/tests/index.test.js new file mode 100644 index 00000000..50096b95 --- /dev/null +++ b/node_modules/pstree.remy/tests/index.test.js @@ -0,0 +1,51 @@ +const tap = require('tap'); +const test = tap.test; +const readFile = require('fs').readFileSync; +const spawn = require('child_process').spawn; +const pstree = require('../'); +const { tree, pidsForTree, getStat } = require('../lib/utils'); + +if (process.platform !== 'darwin') { + test('reads from /proc', async (t) => { + const ps = await getStat(); + t.ok(ps.split('\n').length > 1); + }); +} + +test('tree for live env', async (t) => { + const pid = 4079; + const fixture = readFile(__dirname + '/fixtures/out2', 'utf8'); + const ps = await tree(fixture); + t.deepEqual( + pidsForTree(ps, pid).map((_) => _.PID), + ['4080'] + ); +}); + +function testTree(t, runCallCount) { + const sub = spawn('node', [`${__dirname}/fixtures/index.js`, runCallCount], { + stdio: 'pipe', + }); + setTimeout(() => { + const pid = sub.pid; + + pstree(pid, (error, pids) => { + pids.concat([pid]).forEach((p) => { + spawn('kill', ['-s', 'SIGTERM', p]); + }); + + // the fixture launches `sh` which launches node which is why we + // are looking for two processes. + // Important: IDKW but MacOS seems to skip the `sh` process. no idea. + t.equal(pids.length, runCallCount * 2); + t.end(); + }); + }, 1000); +} + +test('can read full process tree', (t) => { + testTree(t, 1); +}); +test('can read full process tree with multiple processes', (t) => { + testTree(t, 2); +}); 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..72b632cd --- /dev/null +++ b/node_modules/punycode/README.md @@ -0,0 +1,126 @@ +# Punycode.js [![punycode on npm](https://img.shields.io/npm/v/punycode)](https://www.npmjs.com/package/emoji-test-regex-pattern) [![](https://data.jsdelivr.com/v1/package/npm/punycode/badge)](https://www.jsdelivr.com/package/npm/punycode) + +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). + +This project provides a CommonJS module that uses ES2015+ features and JavaScript module, which work in modern Node.js versions and browsers. For the old Punycode.js version that offers the same functionality in a UMD build with support for older pre-ES2015 runtimes, including Rhino, Ringo, and Narwhal, see [v1.4.1](https://github.com/mathiasbynens/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/): + +> ⚠️ Note that userland modules don't hide core modules. +> For example, `require('punycode')` still imports the deprecated core module even if you executed `npm install punycode`. +> Use `require('punycode/')` to import userland modules rather than core modules. + +```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..9d0790b2 --- /dev/null +++ b/node_modules/punycode/package.json @@ -0,0 +1,58 @@ +{ + "name": "punycode", + "version": "2.3.0", + "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/mathiasbynens/punycode.js.git" + }, + "bugs": "https://github.com/mathiasbynens/punycode.js/issues", + "files": [ + "LICENSE-MIT.txt", + "punycode.js", + "punycode.es6.js" + ], + "scripts": { + "test": "mocha tests", + "build": "node scripts/prepublish.js" + }, + "devDependencies": { + "codecov": "^1.0.1", + "istanbul": "^0.4.1", + "mocha": "^10.2.0" + }, + "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..244e1bfb --- /dev/null +++ b/node_modules/punycode/punycode.es6.js @@ -0,0 +1,444 @@ +'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-\x7F]/; // Note: U+007F DEL is excluded too. +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, callback) { + const result = []; + let length = array.length; + while (length--) { + result[length] = callback(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 {String} A new string of characters returned by the callback + * function. + */ +function mapDomain(domain, callback) { + const parts = domain.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] + '@'; + domain = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + domain = domain.replace(regexSeparators, '\x2E'); + const labels = domain.split('.'); + const encoded = map(labels, callback).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 = codePoints => String.fromCodePoint(...codePoints); + +/** + * 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 && codePoint < 0x3A) { + return 26 + (codePoint - 0x30); + } + if (codePoint >= 0x41 && codePoint < 0x5B) { + return codePoint - 0x41; + } + if (codePoint >= 0x61 && codePoint < 0x7B) { + 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`. + const 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) { + error('invalid-input'); + } + if (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. + const 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)); + } + } + + const 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..752b98a9 --- /dev/null +++ b/node_modules/punycode/punycode.js @@ -0,0 +1,443 @@ +'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-\x7F]/; // Note: U+007F DEL is excluded too. +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, callback) { + const result = []; + let length = array.length; + while (length--) { + result[length] = callback(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 {String} A new string of characters returned by the callback + * function. + */ +function mapDomain(domain, callback) { + const parts = domain.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] + '@'; + domain = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + domain = domain.replace(regexSeparators, '\x2E'); + const labels = domain.split('.'); + const encoded = map(labels, callback).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 = codePoints => String.fromCodePoint(...codePoints); + +/** + * 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 && codePoint < 0x3A) { + return 26 + (codePoint - 0x30); + } + if (codePoint >= 0x41 && codePoint < 0x5B) { + return codePoint - 0x41; + } + if (codePoint >= 0x61 && codePoint < 0x7B) { + 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`. + const 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) { + error('invalid-input'); + } + if (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. + const 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)); + } + } + + const 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..2f084445 --- /dev/null +++ b/node_modules/qs/.editorconfig @@ -0,0 +1,43 @@ +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 = 160 +quote_type = single + +[test/*] +max_line_length = off + +[LICENSE.md] +indent_size = 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 + +[coverage/**/*] +indent_size = off +indent_style = off +indent = off +max_line_length = off + +[.nycrc] +indent_style = tab diff --git a/node_modules/qs/.eslintrc b/node_modules/qs/.eslintrc new file mode 100644 index 00000000..35220cd9 --- /dev/null +++ b/node_modules/qs/.eslintrc @@ -0,0 +1,38 @@ +{ + "root": true, + + "extends": "@ljharb", + + "ignorePatterns": [ + "dist/", + ], + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-lines-per-function": [2, { "max": 150 }], + "max-params": [2, 16], + "max-statements": [2, 53], + "multiline-comment-style": 0, + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + }, + + "overrides": [ + { + "files": "test/**", + "rules": { + "function-paren-newline": 0, + "max-lines-per-function": 0, + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-throw-literal": 0, + }, + }, + ], +} diff --git a/node_modules/qs/.github/FUNDING.yml b/node_modules/qs/.github/FUNDING.yml new file mode 100644 index 00000000..0355f4f5 --- /dev/null +++ b/node_modules/qs/.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/qs +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 a single custom sponsorship URL diff --git a/node_modules/qs/.nycrc b/node_modules/qs/.nycrc new file mode 100644 index 00000000..1d57cabe --- /dev/null +++ b/node_modules/qs/.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", + "dist" + ] +} diff --git a/node_modules/qs/CHANGELOG.md b/node_modules/qs/CHANGELOG.md new file mode 100644 index 00000000..37b1d3f0 --- /dev/null +++ b/node_modules/qs/CHANGELOG.md @@ -0,0 +1,546 @@ +## **6.11.0 +- [New] [Fix] `stringify`: revert 0e903c0; add `commaRoundTrip` option (#442) +- [readme] fix version badge + +## **6.10.5** +- [Fix] `stringify`: with `arrayFormat: comma`, properly include an explicit `[]` on a single-item array (#434) + +## **6.10.4** +- [Fix] `stringify`: with `arrayFormat: comma`, include an explicit `[]` on a single-item array (#441) +- [meta] use `npmignore` to autogenerate an npmignore file +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-symbol`, `object-inspect`, `tape` + +## **6.10.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [actions] reuse common workflows +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `tape` + +## **6.10.2** +- [Fix] `stringify`: actually fix cyclic references (#426) +- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] add note and links for coercing primitive values (#408) +- [actions] update codecov uploader +- [actions] update workflows +- [Tests] clean up stringify tests slightly +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `safe-publish-latest`, `tape` + +## **6.10.1** +- [Fix] `stringify`: avoid exception on repeated object values (#402) + +## **6.10.0** +- [New] `stringify`: throw on cycles, instead of an infinite loop (#395, #394, #393) +- [New] `parse`: add `allowSparse` option for collapsing arrays with missing indices (#312) +- [meta] fix README.md (#399) +- [meta] only run `npm run dist` in publish, not install +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-symbols`, `tape` +- [Tests] fix tests on node v0.6 +- [Tests] use `ljharb/actions/node/install` instead of `ljharb/actions/node/run` +- [Tests] Revert "[meta] ignore eclint transitive audit warning" + +## **6.9.7** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] add note and links for coercing primitive values (#408) +- [Tests] clean up stringify tests slightly +- [meta] fix README.md (#399) +- Revert "[meta] ignore eclint transitive audit warning" +- [actions] backport actions from main +- [Dev Deps] backport updates from main + +## **6.9.6** +- [Fix] restore `dist` dir; mistakenly removed in d4f6c32 + +## **6.9.5** +- [Fix] `stringify`: do not encode parens for RFC1738 +- [Fix] `stringify`: fix arrayFormat comma with empty array/objects (#350) +- [Refactor] `format`: remove `util.assign` call +- [meta] add "Allow Edits" workflow; update rebase workflow +- [actions] switch Automatic Rebase workflow to `pull_request_target` event +- [Tests] `stringify`: add tests for #378 +- [Tests] migrate tests to Github Actions +- [Tests] run `nyc` on all tests; use `tape` runner +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `mkdirp`, `object-inspect`, `tape`; add `aud` + +## **6.9.4** +- [Fix] `stringify`: when `arrayFormat` is `comma`, respect `serializeDate` (#364) +- [Refactor] `stringify`: reduce branching (part of #350) +- [Refactor] move `maybeMap` to `utils` +- [Dev Deps] update `browserify`, `tape` + +## **6.9.3** +- [Fix] proper comma parsing of URL-encoded commas (#361) +- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) + +## **6.9.2** +- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) +- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) +- [meta] ignore eclint transitive audit warning +- [meta] fix indentation in package.json +- [meta] add tidelift marketing copy +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `has-symbols`, `tape`, `mkdirp`, `iconv-lite` +- [actions] add automatic rebasing / merge commit blocking + +## **6.9.1** +- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) +- [Fix] `parse`: with comma true, do not split non-string values (#334) +- [meta] add `funding` field +- [Dev Deps] update `eslint`, `@ljharb/eslint-config` +- [Tests] use shared travis-ci config + +## **6.9.0** +- [New] `parse`/`stringify`: Pass extra key/value argument to `decoder` (#333) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `evalmd` +- [Tests] `parse`: add passing `arrayFormat` tests +- [Tests] add `posttest` using `npx aud` to run `npm audit` without a lockfile +- [Tests] up to `node` `v12.10`, `v11.15`, `v10.16`, `v8.16` +- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray + +## **6.8.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Tests] clean up stringify tests slightly +- [Docs] add note and links for coercing primitive values (#408) +- [meta] fix README.md (#399) +- [actions] backport actions from main +- [Dev Deps] backport updates from main +- [Refactor] `stringify`: reduce branching +- [meta] do not publish workflow files + +## **6.8.2** +- [Fix] proper comma parsing of URL-encoded commas (#361) +- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) + +## **6.8.1** +- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) +- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) +- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) +- [fix] `parse`: with comma true, do not split non-string values (#334) +- [meta] add tidelift marketing copy +- [meta] add `funding` field +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `safe-publish-latest`, `evalmd`, `has-symbols`, `iconv-lite`, `mkdirp`, `object-inspect` +- [Tests] `parse`: add passing `arrayFormat` tests +- [Tests] use shared travis-ci configs +- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray +- [actions] add automatic rebasing / merge commit blocking + +## **6.8.0** +- [New] add `depth=false` to preserve the original key; [Fix] `depth=0` should preserve the original key (#326) +- [New] [Fix] stringify symbols and bigints +- [Fix] ensure node 0.12 can stringify Symbols +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Refactor] `formats`: tiny bit of cleanup. +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `safe-publish-latest`, `iconv-lite`, `tape` +- [Tests] add tests for `depth=0` and `depth=false` behavior, both current and intuitive/intended (#326) +- [Tests] use `eclint` instead of `editorconfig-tools` +- [docs] readme: add security note +- [meta] add github sponsorship +- [meta] add FUNDING.yml +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause + +## **6.7.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] add note and links for coercing primitive values (#408) +- [meta] fix README.md (#399) +- [meta] do not publish workflow files +- [actions] backport actions from main +- [Dev Deps] backport updates from main +- [Tests] use `nyc` for coverage +- [Tests] clean up stringify tests slightly + +## **6.7.2** +- [Fix] proper comma parsing of URL-encoded commas (#361) +- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) + +## **6.7.1** +- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) +- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) +- [fix] `parse`: with comma true, do not split non-string values (#334) +- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Refactor] `formats`: tiny bit of cleanup. +- readme: add security note +- [meta] add tidelift marketing copy +- [meta] add `funding` field +- [meta] add FUNDING.yml +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `safe-publish-latest`, `evalmd`, `iconv-lite`, `mkdirp`, `object-inspect`, `browserify` +- [Tests] `parse`: add passing `arrayFormat` tests +- [Tests] use shared travis-ci configs +- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray +- [Tests] add tests for `depth=0` and `depth=false` behavior, both current and intuitive/intended +- [Tests] use `eclint` instead of `editorconfig-tools` +- [actions] add automatic rebasing / merge commit blocking + +## **6.7.0** +- [New] `stringify`/`parse`: add `comma` as an `arrayFormat` option (#276, #219) +- [Fix] correctly parse nested arrays (#212) +- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source, also with an array source +- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` +- [Refactor] `utils`: `isBuffer`: small tweak; add tests +- [Refactor] use cached `Array.isArray` +- [Refactor] `parse`/`stringify`: make a function to normalize the options +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] `stringify`/`utils`: cache `Array.isArray` +- [Tests] always use `String(x)` over `x.toString()` +- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 +- [Tests] temporarily allow coverage to fail + +## **6.6.1** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] correctly parse nested arrays +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` +- [Refactor] `formats`: tiny bit of cleanup. +- [Refactor] `utils`: `isBuffer`: small tweak; add tests +- [Refactor]: `stringify`/`utils`: cache `Array.isArray` +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] use cached `Array.isArray` +- [Refactor] `parse`/`stringify`: make a function to normalize the options +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] do not publish workflow files +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause +- [meta] add FUNDING.yml +- [meta] Fixes typo in CHANGELOG.md +- [actions] backport actions from main +- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 +- [Tests] always use `String(x)` over `x.toString()` +- [Dev Deps] backport from main + +## **6.6.0** +- [New] Add support for iso-8859-1, utf8 "sentinel" and numeric entities (#268) +- [New] move two-value combine to a `utils` function (#189) +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` (#260) +- [Fix] `stringify`: do not crash in an obscure combo of `interpretNumericEntities`, a bad custom `decoder`, & `iso-8859-1` +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Refactor] `parse`: only need to reassign the var once +- [Refactor] `parse`/`stringify`: clean up `charset` options checking; fix defaults +- [Refactor] add missing defaults +- [Refactor] `parse`: one less `concat` call +- [Refactor] `utils`: `compactQueue`: make it explicitly side-effecting +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`, `iconv-lite`, `safe-publish-latest`, `tape` +- [Tests] up to `node` `v10.10`, `v9.11`, `v8.12`, `v6.14`, `v4.9`; pin included builds to LTS + +## **6.5.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] correctly parse nested arrays +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] use cached `Array.isArray` +- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Refactor] `parse`: only need to reassign the var once +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] Clean up license text so it’s properly detected as BSD-3-Clause +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] add FUNDING.yml +- [actions] backport actions from main +- [Tests] always use `String(x)` over `x.toString()` +- [Tests] remove nonexistent tape option +- [Dev Deps] backport from main + +## **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.1** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [Refactor] use cached `Array.isArray` +- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause +- [meta] add FUNDING.yml +- [actions] backport actions from main +- [Tests] remove nonexistent tape option +- [Dev Deps] backport from main + +## **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.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [Refactor] use cached `Array.isArray` +- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause +- [meta] add FUNDING.yml +- [actions] backport actions from main +- [Tests] use `safer-buffer` instead of `Buffer` constructor +- [Tests] remove nonexistent tape option +- [Dev Deps] backport from main + +## **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.4** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [Refactor] use cached `Array.isArray` +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] Clean up license text so it’s properly detected as BSD-3-Clause +- [meta] add FUNDING.yml +- [actions] backport actions from main +- [Tests] use `safer-buffer` instead of `Buffer` constructor +- [Tests] remove nonexistent tape option +- [Dev Deps] backport from main + +## **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.md b/node_modules/qs/LICENSE.md new file mode 100644 index 00000000..fecf6b69 --- /dev/null +++ b/node_modules/qs/LICENSE.md @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/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: + +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 the copyright holder 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/qs/README.md b/node_modules/qs/README.md new file mode 100644 index 00000000..11be8531 --- /dev/null +++ b/node_modules/qs/README.md @@ -0,0 +1,625 @@ +# qs [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +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' } }); +``` + +If you have to deal with legacy browsers or services, there's +also support for decoding percent-encoded octets as iso-8859-1: + +```javascript +var oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' }); +assert.deepEqual(oldCharset, { a: '§' }); +``` + +Some services add an initial `utf8=✓` value to forms so that old +Internet Explorer versions are more likely to submit the form as +utf-8. Additionally, the server can check the value against wrong +encodings of the checkmark character and detect that a query string +or `application/x-www-form-urlencoded` body was *not* sent as +utf-8, eg. if the form had an `accept-charset` parameter or the +containing page had a different character set. + +**qs** supports this mechanism via the `charsetSentinel` option. +If specified, the `utf8` parameter will be omitted from the +returned object. It will be used to switch to `iso-8859-1`/`utf-8` +mode depending on how the checkmark is encoded. + +**Important**: When you specify both the `charset` option and the +`charsetSentinel` option, the `charset` will be overridden when +the request contains a `utf8` parameter from which the actual +charset can be deduced. In that sense the `charset` will behave +as the default charset rather than the authoritative charset. + +```javascript +var detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', { + charset: 'iso-8859-1', + charsetSentinel: true +}); +assert.deepEqual(detectedAsUtf8, { a: 'ø' }); + +// Browsers encode the checkmark as ✓ when submitting as iso-8859-1: +var detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', { + charset: 'utf-8', + charsetSentinel: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: 'ø' }); +``` + +If you want to decode the `&#...;` syntax to the actual character, +you can specify the `interpretNumericEntities` option as well: + +```javascript +var detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', { + charset: 'iso-8859-1', + interpretNumericEntities: true +}); +assert.deepEqual(detectedAsIso8859_1, { a: '☺' }); +``` + +It also works when the charset has been detected in `charsetSentinel` +mode. + +### 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'] }); +``` + +You may also use `allowSparse` option to parse sparse arrays: + +```javascript +var sparseArray = qs.parse('a[1]=2&a[3]=5', { allowSparse: true }); +assert.deepEqual(sparseArray, { a: [, '2', , '5'] }); +``` + +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. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. + +```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' }] }); +``` + +Some people use comma to join array, **qs** can parse it: +```javascript +var arraysOfObjects = qs.parse('a=b,c', { comma: true }) +assert.deepEqual(arraysOfObjects, { a: ['b', 'c'] }) +``` +(_this cannot convert nested objects, such as `a={b:1},{c:d}`_) + +### Parsing primitive/scalar values (numbers, booleans, null, etc) + +By default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91). + +```javascript +var primitiveValues = qs.parse('a=15&b=true&c=null'); +assert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' }); +``` + +If you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters. + +### 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 +}}) +``` + +You can encode keys and values using different logic by using the type argument provided to the encoder: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) { + if (type === 'key') { + return // Encoded key + } else if (type === 'value') { + return // Encoded value + } +}}) +``` + +The type argument is also provided to the decoder: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) { + if (type === 'key') { + return // Decoded key + } else if (type === 'value') { + return // Decoded value + } +}}) +``` + +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' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' }) +// 'a=b,c' +``` + +Note: when using `arrayFormat` set to `'comma'`, you can also pass the `commaRoundTrip` option set to `true` or `false`, to append `[]` on single-item arrays, so that they can round trip through a parse. + +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'); +``` + +If you're communicating with legacy systems, you can switch to `iso-8859-1` +using the `charset` option: + +```javascript +var iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }); +assert.equal(iso, '%E6=%E6'); +``` + +Characters that don't exist in `iso-8859-1` will be converted to numeric +entities, similar to what browsers do: + +```javascript +var numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }); +assert.equal(numeric, 'a=%26%239786%3B'); +``` + +You can use the `charsetSentinel` option to announce the character by +including an `utf8=✓` parameter with the proper encoding if the checkmark, +similar to what Ruby on Rails and others do when submitting forms. + +```javascript +var sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true }); +assert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA'); + +var isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }); +assert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`, +and `iso-8859-1` support is also built in via the `charset` parameter. + +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'); +``` + +## Security + +Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. + +## qs for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of qs 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-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +[package-url]: https://npmjs.org/package/qs +[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg +[deps-svg]: https://david-dm.org/ljharb/qs.svg +[deps-url]: https://david-dm.org/ljharb/qs +[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/qs.svg +[downloads-url]: https://npm-stat.com/charts.html?package=qs +[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/qs/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs +[actions-url]: https://github.com/ljharb/qs/actions diff --git a/node_modules/qs/dist/qs.js b/node_modules/qs/dist/qs.js new file mode 100644 index 00000000..1c620a48 --- /dev/null +++ b/node_modules/qs/dist/qs.js @@ -0,0 +1,2054 @@ +(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 -1) { + return val.split(','); + } + + return val; +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray(val) ? [val] : val; + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + 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 (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (cleanRoot !== '__proto__') { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + 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 = options.depth > 0 && 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 (options.depth > 0 && (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, valuesParsed); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + 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, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } + + if (options.allowSparse === true) { + return obj; + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var getSideChannel = require('side-channel'); +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray = Array.isArray; +var split = String.prototype.split; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaultFormat = formats['default']; +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; +}; + +var sentinel = {}; + +var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + commaRoundTrip, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + sideChannel +) { + var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + if (generateArrayPrefix === 'comma' && encodeValuesOnly) { + var valuesArray = split.call(String(obj), ','); + var valuesJoined = ''; + for (var i = 0; i < valuesArray.length; ++i) { + valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); + } + return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; + } + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (generateArrayPrefix === 'comma' && isArray(obj)) { + // we need to join elements in + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; + } else if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; + + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var keyPrefix = isArray(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix + : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); + + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + commaRoundTrip, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + format: format, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { + throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); + } + var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + var sideChannel = getSideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + commaRoundTrip, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.format, + options.formatter, + options.encodeValuesOnly, + options.charset, + sideChannel + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){ +'use strict'; + +var formats = require('./formats'); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +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) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (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; + } + } +}; + +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) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, 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, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset, kind, format) { + // 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 = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); + } + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + 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 + || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) + ) { + 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)); + /* eslint operator-linebreak: [2, "before"] */ + 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); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +var maybeMap = function maybeMap(val, fn) { + if (isArray(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge +}; + +},{"./formats":1}],6:[function(require,module,exports){ + +},{}],7:[function(require,module,exports){ +'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; +}; + +},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){ +'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) { + // original length, plus the receiver, minus any additional arguments (after the receiver) + $defineProperty( + func, + 'length', + { value: 1 + $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; +} + +},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){ +'use strict'; + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var slice = Array.prototype.slice; +var toStr = Object.prototype.toString; +var funcType = '[object Function]'; + +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.call(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slice.call(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + } + }; + + var boundLength = Math.max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + +var implementation = require('./implementation'); + +module.exports = Function.prototype.bind || implementation; + +},{"./implementation":9}],11:[function(require,module,exports){ +'use strict'; + +var undefined; + +var $SyntaxError = SyntaxError; +var $Function = Function; +var $TypeError = TypeError; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = Object.getOwnPropertyDescriptor; +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} + +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = require('has-symbols')(); + +var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': EvalError, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': Object, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': RangeError, + '%ReferenceError%': ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet +}; + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + +var bind = require('function-bind'); +var hasOwn = require('has'); +var $concat = bind.call(Function.call, Array.prototype.concat); +var $spliceApply = bind.call(Function.apply, Array.prototype.splice); +var $replace = bind.call(Function.call, String.prototype.replace); +var $strSlice = bind.call(Function.call, String.prototype.slice); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + +},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){ +'use strict'; + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = require('./shams'); + +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return hasSymbolSham(); +}; + +},{"./shams":13}],13:[function(require,module,exports){ +'use strict'; + +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + +},{}],14:[function(require,module,exports){ +'use strict'; + +var bind = require('function-bind'); + +module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); + +},{"function-bind":10}],15:[function(require,module,exports){ +var hasMap = typeof Map === 'function' && Map.prototype; +var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; +var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; +var mapForEach = hasMap && Map.prototype.forEach; +var hasSet = typeof Set === 'function' && Set.prototype; +var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; +var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; +var setForEach = hasSet && Set.prototype.forEach; +var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; +var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; +var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; +var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; +var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; +var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; +var booleanValueOf = Boolean.prototype.valueOf; +var objectToString = Object.prototype.toString; +var functionToString = Function.prototype.toString; +var $match = String.prototype.match; +var $slice = String.prototype.slice; +var $replace = String.prototype.replace; +var $toUpperCase = String.prototype.toUpperCase; +var $toLowerCase = String.prototype.toLowerCase; +var $test = RegExp.prototype.test; +var $concat = Array.prototype.concat; +var $join = Array.prototype.join; +var $arrSlice = Array.prototype.slice; +var $floor = Math.floor; +var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; +var gOPS = Object.getOwnPropertySymbols; +var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; +var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; +// ie, `has-tostringtag/shams +var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') + ? Symbol.toStringTag + : null; +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( + [].__proto__ === Array.prototype // eslint-disable-line no-proto + ? function (O) { + return O.__proto__; // eslint-disable-line no-proto + } + : null +); + +function addNumericSeparator(num, str) { + if ( + num === Infinity + || num === -Infinity + || num !== num + || (num && num > -1000 && num < 1000) + || $test.call(/e/, str) + ) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === 'number') { + var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); + } + } + return $replace.call(str, sepRegex, '$&_'); +} + +var utilInspect = require('./util.inspect'); +var inspectCustom = utilInspect.custom; +var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + +module.exports = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + + if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if ( + has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' + ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity + : opts.maxStringLength !== null + ) + ) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; + if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { + throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); + } + + if ( + has(opts, 'indent') + && opts.indent !== null + && opts.indent !== '\t' + && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) + ) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + if (typeof obj === 'boolean') { + return obj ? 'true' : 'false'; + } + + if (typeof obj === 'string') { + return inspectString(obj, opts); + } + if (typeof obj === 'number') { + if (obj === 0) { + return Infinity / obj > 0 ? '0' : '-0'; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === 'bigint') { + var bigIntStr = String(obj) + 'n'; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + + var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; + if (typeof depth === 'undefined') { depth = 0; } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { + return isArray(obj) ? '[Array]' : '[Object]'; + } + + var indent = getIndent(opts, depth); + + if (typeof seen === 'undefined') { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return '[Circular]'; + } + + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, 'quoteStyle')) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + + if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); + return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = '<' + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); + } + s += '>'; + if (obj.childNodes && obj.childNodes.length) { s += '...'; } + s += ''; + return s; + } + if (isArray(obj)) { + if (obj.length === 0) { return '[]'; } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return '[' + indentedJoin(xs, indent) + ']'; + } + return '[ ' + $join.call(xs, ', ') + ' ]'; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { + return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; + } + if (parts.length === 0) { return '[' + String(obj) + ']'; } + return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; + } + if (typeof obj === 'object' && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { + return utilInspect(obj, { depth: maxDepth - depth }); + } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + mapForEach.call(obj, function (value, key) { + mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); + }); + return collectionOf('Map', mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + setForEach.call(obj, function (value) { + setParts.push(inspect(value, obj)); + }); + return collectionOf('Set', setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf('WeakMap'); + } + if (isWeakSet(obj)) { + return weakCollectionOf('WeakSet'); + } + if (isWeakRef(obj)) { + return weakCollectionOf('WeakRef'); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + if (!isDate(obj) && !isRegExp(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? '' : 'null prototype'; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; + var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; + var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); + if (ys.length === 0) { return tag + '{}'; } + if (indent) { + return tag + '{' + indentedJoin(ys, indent) + '}'; + } + return tag + '{ ' + $join.call(ys, ', ') + ' }'; + } + return String(obj); +}; + +function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; + return quoteChar + s + quoteChar; +} + +function quote(s) { + return $replace.call(String(s), /"/g, '"'); +} + +function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } + +// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives +function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === 'object' && obj instanceof Symbol; + } + if (typeof obj === 'symbol') { + return true; + } + if (!obj || typeof obj !== 'object' || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) {} + return false; +} + +function isBigInt(obj) { + if (!obj || typeof obj !== 'object' || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) {} + return false; +} + +var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; +function has(obj, key) { + return hasOwn.call(obj, key); +} + +function toStr(obj) { + return objectToString.call(obj); +} + +function nameOf(f) { + if (f.name) { return f.name; } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { return m[1]; } + return null; +} + +function indexOf(xs, x) { + if (xs.indexOf) { return xs.indexOf(x); } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { return i; } + } + return -1; +} + +function isMap(x) { + if (!mapSize || !x || typeof x !== 'object') { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== 'object') { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== 'object') { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) {} + return false; +} + +function isSet(x) { + if (!setSize || !x || typeof x !== 'object') { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== 'object') { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isElement(x) { + if (!x || typeof x !== 'object') { return false; } + if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; +} + +function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + // eslint-disable-next-line no-control-regex + var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, 'single', opts); +} + +function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: 'b', + 9: 't', + 10: 'n', + 12: 'f', + 13: 'r' + }[n]; + if (x) { return '\\' + x; } + return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); +} + +function markBoxed(str) { + return 'Object(' + str + ')'; +} + +function weakCollectionOf(type) { + return type + ' { ? }'; +} + +function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); + return type + ' (' + size + ') {' + joinedEntries + '}'; +} + +function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], '\n') >= 0) { + return false; + } + } + return true; +} + +function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === '\t') { + baseIndent = '\t'; + } else if (typeof opts.indent === 'number' && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), ' '); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; +} + +function indentedJoin(xs, indent) { + if (xs.length === 0) { return ''; } + var lineJoiner = '\n' + indent.prev + indent.base; + return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; +} + +function arrObjKeys(obj, inspect) { + var isArr = isArray(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; + } + } + var syms = typeof gOPS === 'function' ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap['$' + syms[k]] = syms[k]; + } + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { + // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section + continue; // eslint-disable-line no-restricted-syntax, no-continue + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); + } else { + xs.push(key + ': ' + inspect(obj[key], obj)); + } + } + if (typeof gOPS === 'function') { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); + } + } + } + return xs; +} + +},{"./util.inspect":6}],16:[function(require,module,exports){ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); +var callBound = require('call-bind/callBound'); +var inspect = require('object-inspect'); + +var $TypeError = GetIntrinsic('%TypeError%'); +var $WeakMap = GetIntrinsic('%WeakMap%', true); +var $Map = GetIntrinsic('%Map%', true); + +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); + +/* + * This function traverses the list returning the node corresponding to the + * given key. + * + * That node is also moved to the head of the list, so that if it's accessed + * again we don't need to traverse the whole list. By doing so, all the recently + * used nodes can be accessed relatively quickly. + */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + curr.next = list.next; + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; + +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = { // eslint-disable-line no-param-reassign + key: key, + next: objects.next, + value: value + }; + } +}; +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; + +module.exports = function getSideChannel() { + var $wm; + var $m; + var $o; + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + inspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + /* + * Initialize the linked list as an empty node, so that we don't have + * to special-case handling of the first node: we can always refer to + * it as (previous node).next, instead of something like (list).head + */ + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; + +},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2) +}); diff --git a/node_modules/qs/lib/formats.js b/node_modules/qs/lib/formats.js new file mode 100644 index 00000000..f36cf206 --- /dev/null +++ b/node_modules/qs/lib/formats.js @@ -0,0 +1,23 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +var Format = { + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; + +module.exports = { + 'default': Format.RFC3986, + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + }, + RFC1738: Format.RFC1738, + RFC3986: Format.RFC3986 +}; diff --git a/node_modules/qs/lib/index.js b/node_modules/qs/lib/index.js new file mode 100644 index 00000000..0d6a97dc --- /dev/null +++ b/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/node_modules/qs/lib/parse.js b/node_modules/qs/lib/parse.js new file mode 100644 index 00000000..a4ac4fa0 --- /dev/null +++ b/node_modules/qs/lib/parse.js @@ -0,0 +1,263 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var defaults = { + allowDots: false, + allowPrototypes: false, + allowSparse: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false +}; + +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; + +var parseArrayValue = function (val, options) { + if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { + return val.split(','); + } + + return val; +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray(val) ? [val] : val; + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + 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 (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (cleanRoot !== '__proto__') { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + 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 = options.depth > 0 && 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 (options.depth > 0 && (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, valuesParsed); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); + + 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, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } + + if (options.allowSparse === true) { + return obj; + } + + return utils.compact(obj); +}; diff --git a/node_modules/qs/lib/stringify.js b/node_modules/qs/lib/stringify.js new file mode 100644 index 00000000..48ec0306 --- /dev/null +++ b/node_modules/qs/lib/stringify.js @@ -0,0 +1,326 @@ +'use strict'; + +var getSideChannel = require('side-channel'); +var utils = require('./utils'); +var formats = require('./formats'); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray = Array.isArray; +var split = String.prototype.split; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaultFormat = formats['default']; +var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; +}; + +var sentinel = {}; + +var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + commaRoundTrip, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + sideChannel +) { + var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + if (generateArrayPrefix === 'comma' && encodeValuesOnly) { + var valuesArray = split.call(String(obj), ','); + var valuesJoined = ''; + for (var i = 0; i < valuesArray.length; ++i) { + valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); + } + return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; + } + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (generateArrayPrefix === 'comma' && isArray(obj)) { + // we need to join elements in + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; + } else if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; + + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var keyPrefix = isArray(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix + : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); + + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + commaRoundTrip, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + format: format, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { + throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); + } + var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + var sideChannel = getSideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + commaRoundTrip, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.format, + options.formatter, + options.encodeValuesOnly, + options.charset, + sideChannel + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; diff --git a/node_modules/qs/lib/utils.js b/node_modules/qs/lib/utils.js new file mode 100644 index 00000000..1e545381 --- /dev/null +++ b/node_modules/qs/lib/utils.js @@ -0,0 +1,252 @@ +'use strict'; + +var formats = require('./formats'); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +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) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (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; + } + } +}; + +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) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, 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, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset, kind, format) { + // 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 = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); + } + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + 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 + || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) + ) { + 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)); + /* eslint operator-linebreak: [2, "before"] */ + 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); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +var maybeMap = function maybeMap(val, fn) { + if (isArray(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge +}; diff --git a/node_modules/qs/package.json b/node_modules/qs/package.json new file mode 100644 index 00000000..2ff42f37 --- /dev/null +++ b/node_modules/qs/package.json @@ -0,0 +1,77 @@ +{ + "name": "qs", + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "homepage": "https://github.com/ljharb/qs", + "version": "6.11.0", + "repository": { + "type": "git", + "url": "https://github.com/ljharb/qs.git" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "main": "lib/index.js", + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "keywords": [ + "querystring", + "qs", + "query", + "url", + "parse", + "stringify" + ], + "engines": { + "node": ">=0.6" + }, + "dependencies": { + "side-channel": "^1.0.4" + }, + "devDependencies": { + "@ljharb/eslint-config": "^21.0.0", + "aud": "^2.0.0", + "browserify": "^16.5.2", + "eclint": "^2.8.1", + "eslint": "=8.8.0", + "evalmd": "^0.0.19", + "for-each": "^0.3.3", + "has-symbols": "^1.0.3", + "iconv-lite": "^0.5.1", + "in-publish": "^2.0.1", + "mkdirp": "^0.5.5", + "npmignore": "^0.3.0", + "nyc": "^10.3.2", + "object-inspect": "^1.12.2", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^2.0.0", + "safer-buffer": "^2.1.2", + "tape": "^5.5.3" + }, + "scripts": { + "prepack": "npmignore --auto --commentLines=autogenerated", + "prepublishOnly": "safe-publish-latest && npm run dist", + "prepublish": "not-in-publish || npm run prepublishOnly", + "pretest": "npm run --silent readme && npm run --silent lint", + "test": "npm run tests-only", + "tests-only": "nyc tape 'test/**/*.js'", + "posttest": "aud --production", + "readme": "evalmd README.md", + "postlint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)", + "lint": "eslint --ext=js,mjs .", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" + }, + "license": "BSD-3-Clause", + "publishConfig": { + "ignore": [ + "!dist/*", + "bower.json", + "component.json", + ".github/workflows" + ] + } +} diff --git a/node_modules/qs/test/parse.js b/node_modules/qs/test/parse.js new file mode 100644 index 00000000..7d7b4dd8 --- /dev/null +++ b/node_modules/qs/test/parse.js @@ -0,0 +1,855 @@ +'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('arrayFormat: brackets allows only explicit arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'brackets' }), { a: 'b,c' }); + st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); + st.end(); + }); + + t.test('arrayFormat: indices allows only indexed arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'indices' }), { a: 'b,c' }); + st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); + st.end(); + }); + + t.test('arrayFormat: comma allows only comma-separated arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'comma' }), { a: 'b,c' }); + st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); + st.end(); + }); + + t.test('arrayFormat: repeat allows only repeated values', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'repeat' }), { a: 'b,c' }); + st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); + 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.test('uses original key when depth = 0', function (st) { + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { depth: 0 }), { 'a[0]': 'b', 'a[1]': 'c' }); + st.deepEqual(qs.parse('a[0][0]=b&a[0][1]=c&a[1]=d&e=2', { depth: 0 }), { 'a[0][0]': 'b', 'a[0][1]': 'c', 'a[1]': 'd', e: '2' }); + st.end(); + }); + + t.test('uses original key when depth = false', function (st) { + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { depth: false }), { 'a[0]': 'b', 'a[1]': 'c' }); + st.deepEqual(qs.parse('a[0][0]=b&a[0][1]=c&a[1]=d&e=2', { depth: false }), { 'a[0][0]': 'b', 'a[0][1]': 'c', 'a[1]': 'd', e: '2' }); + 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.deepEqual(qs.parse('a[20]=a'), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a'), { 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 sparse arrays', function (st) { + /* eslint no-sparse-arrays: 0 */ + st.deepEqual(qs.parse('a[4]=1&a[1]=2', { allowSparse: true }), { a: [, '2', , , '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { allowSparse: true }), { a: [, { b: [, , { c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { allowSparse: true }), { a: [, [, , [, , , { c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { allowSparse: true }), { 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('parses jquery-param strings', function (st) { + // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' + var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; + var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; + st.deepEqual(qs.parse(encoded), expected); + 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', 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) { + var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); + st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); + st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); + + var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); + st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); + st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); + + 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 string with comma as array divider', function (st) { + st.deepEqual(qs.parse('foo=bar,tee', { comma: true }), { foo: ['bar', 'tee'] }); + st.deepEqual(qs.parse('foo[bar]=coffee,tee', { comma: true }), { foo: { bar: ['coffee', 'tee'] } }); + st.deepEqual(qs.parse('foo=', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true }), { foo: '' }); + st.deepEqual(qs.parse('foo', { comma: true, strictNullHandling: true }), { foo: null }); + + // test cases inversed from from stringify tests + st.deepEqual(qs.parse('a[0]=c'), { a: ['c'] }); + st.deepEqual(qs.parse('a[]=c'), { a: ['c'] }); + st.deepEqual(qs.parse('a[]=c', { comma: true }), { a: ['c'] }); + + st.deepEqual(qs.parse('a[0]=c&a[1]=d'), { a: ['c', 'd'] }); + st.deepEqual(qs.parse('a[]=c&a[]=d'), { a: ['c', 'd'] }); + st.deepEqual(qs.parse('a=c,d', { comma: true }), { a: ['c', 'd'] }); + + st.end(); + }); + + t.test('parses values with comma as array divider', function (st) { + st.deepEqual(qs.parse({ foo: 'bar,tee' }, { comma: false }), { foo: 'bar,tee' }); + st.deepEqual(qs.parse({ foo: 'bar,tee' }, { comma: true }), { foo: ['bar', 'tee'] }); + st.end(); + }); + + t.test('use number decoder, parses string that has one number with comma option enabled', function (st) { + var decoder = function (str, defaultDecoder, charset, type) { + if (!isNaN(Number(str))) { + return parseFloat(str); + } + return defaultDecoder(str, defaultDecoder, charset, type); + }; + + st.deepEqual(qs.parse('foo=1', { comma: true, decoder: decoder }), { foo: 1 }); + st.deepEqual(qs.parse('foo=0', { comma: true, decoder: decoder }), { foo: 0 }); + + st.end(); + }); + + t.test('parses brackets holds array of arrays when having two parts of strings with comma as array divider', function (st) { + st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=4,5,6', { comma: true }), { foo: [['1', '2', '3'], ['4', '5', '6']] }); + st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=', { comma: true }), { foo: [['1', '2', '3'], ''] }); + st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=,', { comma: true }), { foo: [['1', '2', '3'], ['', '']] }); + st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=a', { comma: true }), { foo: [['1', '2', '3'], 'a'] }); + + st.end(); + }); + + t.test('parses comma delimited array while having percent-encoded comma treated as normal text', function (st) { + st.deepEqual(qs.parse('foo=a%2Cb', { comma: true }), { foo: 'a,b' }); + st.deepEqual(qs.parse('foo=a%2C%20b,d', { comma: true }), { foo: ['a, b', 'd'] }); + st.deepEqual(qs.parse('foo=a%2C%20b,c%2C%20d', { comma: true }), { foo: ['a, b', 'c, d'] }); + + 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 }), + { __proto__: null, a: { __proto__: null, b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('dunder proto is ignored', function (st) { + var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42'; + var result = qs.parse(payload, { allowPrototypes: true }); + + st.deepEqual( + result, + { + categories: { + length: '42' + } + }, + 'silent [[Prototype]] payload' + ); + + var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true }); + + st.deepEqual( + plainResult, + { + __proto__: null, + categories: { + __proto__: null, + length: '42' + } + }, + 'silent [[Prototype]] payload: plain objects' + ); + + var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true }); + + st.notOk(Array.isArray(query.categories), 'is not an array'); + st.notOk(query.categories instanceof Array, 'is not instanceof an array'); + st.deepEqual(query.categories, { some: { json: 'toInject' } }); + st.equal(JSON.stringify(query.categories), '{"some":{"json":"toInject"}}', 'stringifies as a non-array'); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }), + { + foo: { + bar: 'stuffs' + } + }, + 'hidden values' + ); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }), + { + __proto__: null, + foo: { + __proto__: null, + bar: 'stuffs' + } + }, + 'hidden values: plain objects' + ); + + 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 String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); + } + }), { 県: '大阪府' }); + 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.test('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.parse('a=b', { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('parses an iso-8859-1 string if asked to', function (st) { + st.deepEqual(qs.parse('%A2=%BD', { charset: 'iso-8859-1' }), { '¢': '½' }); + st.end(); + }); + + var urlEncodedCheckmarkInUtf8 = '%E2%9C%93'; + var urlEncodedOSlashInUtf8 = '%C3%B8'; + var urlEncodedNumCheckmark = '%26%2310003%3B'; + var urlEncodedNumSmiley = '%26%239786%3B'; + + t.test('prefers an utf-8 charset specified by the utf8 sentinel to a default charset of iso-8859-1', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'iso-8859-1' }), { ø: 'ø' }); + st.end(); + }); + + t.test('prefers an iso-8859-1 charset specified by the utf8 sentinel to a default charset of utf-8', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('does not require the utf8 sentinel to be defined before the parameters whose decoding it affects', function (st) { + st.deepEqual(qs.parse('a=' + urlEncodedOSlashInUtf8 + '&utf8=' + urlEncodedNumCheckmark, { charsetSentinel: true, charset: 'utf-8' }), { a: 'ø' }); + st.end(); + }); + + t.test('should ignore an utf8 sentinel with an unknown value', function (st) { + st.deepEqual(qs.parse('utf8=foo&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to utf-8 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { ø: 'ø' }); + st.end(); + }); + + t.test('uses the utf8 sentinel to switch to iso-8859-1 when no default charset is given', function (st) { + st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { 'ø': 'ø' }); + st.end(); + }); + + t.test('interprets numeric entities in iso-8859-1 when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('handles a custom decoder returning `null`, in the `iso-8859-1` charset, when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=&bar=' + urlEncodedNumSmiley, { + charset: 'iso-8859-1', + decoder: function (str, defaultDecoder, charset) { + return str ? defaultDecoder(str, defaultDecoder, charset) : null; + }, + interpretNumericEntities: true + }), { foo: null, bar: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities in iso-8859-1 when `interpretNumericEntities` is absent', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1' }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret numeric entities when the charset is utf-8, even when `interpretNumericEntities`', function (st) { + st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'utf-8', interpretNumericEntities: true }), { foo: '☺' }); + st.end(); + }); + + t.test('does not interpret %uXXXX syntax in iso-8859-1 mode', function (st) { + st.deepEqual(qs.parse('%u263A=%u263A', { charset: 'iso-8859-1' }), { '%u263A': '%u263A' }); + st.end(); + }); + + t.test('allows for decoding keys and values differently', function (st) { + var decoder = function (str, defaultDecoder, charset, type) { + if (type === 'key') { + return defaultDecoder(str, defaultDecoder, charset, type).toLowerCase(); + } + if (type === 'value') { + return defaultDecoder(str, defaultDecoder, charset, type).toUpperCase(); + } + throw 'this should never happen! type: ' + type; + }; + + st.deepEqual(qs.parse('KeY=vAlUe', { decoder: decoder }), { key: 'VALUE' }); + 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..f0cdfefa --- /dev/null +++ b/node_modules/qs/test/stringify.js @@ -0,0 +1,909 @@ +'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; +var hasSymbols = require('has-symbols'); +var hasBigInt = typeof BigInt === 'function'; + +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('stringifies falsy values', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(null, { strictNullHandling: true }), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(0), ''); + st.end(); + }); + + t.test('stringifies symbols', { skip: !hasSymbols() }, function (st) { + st.equal(qs.stringify(Symbol.iterator), ''); + st.equal(qs.stringify([Symbol.iterator]), '0=Symbol%28Symbol.iterator%29'); + st.equal(qs.stringify({ a: Symbol.iterator }), 'a=Symbol%28Symbol.iterator%29'); + st.equal( + qs.stringify({ a: [Symbol.iterator] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), + 'a[]=Symbol%28Symbol.iterator%29' + ); + st.end(); + }); + + t.test('stringifies bigints', { skip: !hasBigInt }, function (st) { + var three = BigInt(3); + var encodeWithN = function (value, defaultEncoder, charset) { + var result = defaultEncoder(value, defaultEncoder, charset); + return typeof value === 'bigint' ? result + 'n' : result; + }; + st.equal(qs.stringify(three), ''); + st.equal(qs.stringify([three]), '0=3'); + st.equal(qs.stringify([three], { encoder: encodeWithN }), '0=3n'); + st.equal(qs.stringify({ a: three }), 'a=3'); + st.equal(qs.stringify({ a: three }, { encoder: encodeWithN }), 'a=3n'); + st.equal( + qs.stringify({ a: [three] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), + 'a[]=3' + ); + st.equal( + qs.stringify({ a: [three] }, { encodeValuesOnly: true, encoder: encodeWithN, arrayFormat: 'brackets' }), + 'a[]=3n' + ); + 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 nested falsy values', function (st) { + st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); + st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); + st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); + 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'] }, { arrayFormat: 'comma' }), + 'a=b%2Cc%2Cd', + 'comma => comma' + ); + 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 an array value with one item vs multiple items', function (st) { + st.test('non-array item', function (s2t) { + s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a=c'); + s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a=c'); + s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c'); + s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true }), 'a=c'); + + s2t.end(); + }); + + st.test('array with a single item', function (s2t) { + s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[0]=c'); + s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[]=c'); + s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c'); + s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'comma', commaRoundTrip: true }), 'a[]=c'); // so it parses back as an array + s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true }), 'a[0]=c'); + + s2t.end(); + }); + + st.test('array with multiple items', function (s2t) { + s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[0]=c&a[1]=d'); + s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[]=c&a[]=d'); + s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c,d'); + s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true }), 'a[0]=c&a[1]=d'); + + s2t.end(); + }); + + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[b][0]=c&a[b][1]=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[b][]=c&a[b][]=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c,d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true }), 'a[b][0]=c&a[b][1]=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, encodeValuesOnly: true, 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, encodeValuesOnly: true, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encodeValuesOnly: true, arrayFormat: 'comma' } + ), + 'a.b=c,d', + 'comma: stringifies with dots + comma' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encodeValuesOnly: true } + ), + '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', // a[0][b]=c + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', // a[][b]=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] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), + '???', + 'brackets => brackets', + { skip: 'TODO: figure out what this should do' } + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true }), + '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 an empty array in different arrayFormat', function (st) { + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false }), 'b[0]=&c=c'); + // arrayFormat default + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices' }), 'b[0]=&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets' }), 'b[]=&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat' }), 'b=&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma' }), 'b=&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', commaRoundTrip: true }), 'b[]=&c=c'); + // with strictNullHandling + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices', strictNullHandling: true }), 'b[0]&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets', strictNullHandling: true }), 'b[]&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat', strictNullHandling: true }), 'b&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', strictNullHandling: true }), 'b&c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', strictNullHandling: true, commaRoundTrip: true }), 'b[]&c=c'); + // with skipNulls + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices', skipNulls: true }), 'c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets', skipNulls: true }), 'c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat', skipNulls: true }), 'c=c'); + st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', skipNulls: true }), 'c=c'); + + 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('does not 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('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + st['throws']( + function () { qs.stringify({ 'foo[bar]': 'baz', 'foo[baz]': a }); }, + /RangeError: Cyclic object value/, + 'cyclic values throw' + ); + + var circular = { + a: 'value' + }; + circular.a = circular; + st['throws']( + function () { qs.stringify(circular); }, + /RangeError: Cyclic object value/, + 'cyclic values throw' + ); + + var arr = ['a']; + st.doesNotThrow( + function () { qs.stringify({ x: arr, y: arr }); }, + 'non-cyclic values do not throw' + ); + + st.end(); + }); + + t.test('non-circular duplicated references can still work', function (st) { + var hourOfDay = { + 'function': 'hour_of_day' + }; + + var p1 = { + 'function': 'gte', + arguments: [hourOfDay, 0] + }; + var p2 = { + 'function': 'lte', + arguments: [hourOfDay, 23] + }; + + st.equal( + qs.stringify({ filters: { $and: [p1, p2] } }, { encodeValuesOnly: true }), + 'filters[$and][0][function]=gte&filters[$and][0][arguments][0][function]=hour_of_day&filters[$and][0][arguments][1]=0&filters[$and][1][function]=lte&filters[$and][1][arguments][0][function]=hour_of_day&filters[$and][1][arguments][1]=23' + ); + + 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.equal(qs.stringify({ a: SaferBuffer.from('a b') }, { + encoder: function (buffer) { + return buffer; + } + }), 'a=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.equal( + qs.stringify( + { a: [date] }, + { + serializeDate: function (d) { return d.getTime(); }, + arrayFormat: 'comma' + } + ), + 'a=' + date.getTime(), + 'works with arrayFormat comma' + ); + st.equal( + qs.stringify( + { a: [date] }, + { + serializeDate: function (d) { return d.getTime(); }, + arrayFormat: 'comma', + commaRoundTrip: true + } + ), + 'a%5B%5D=' + date.getTime(), + 'works with arrayFormat comma' + ); + + st.end(); + }); + + t.test('RFC 1738 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC1738 }), 'a+b=a+b'); + + st.equal(qs.stringify({ 'foo(ref)': 'bar' }, { format: qs.formats.RFC1738 }), 'foo(ref)=bar'); + + 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC3986 }), 'a%20b=a%20b'); + + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }), 'a%20b=a%20b'); + + 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('throws if an invalid charset is specified', function (st) { + st['throws'](function () { + qs.stringify({ a: 'b' }, { charset: 'foobar' }); + }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); + st.end(); + }); + + t.test('respects a charset of iso-8859-1', function (st) { + st.equal(qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }), '%E6=%E6'); + st.end(); + }); + + t.test('encodes unrepresentable chars as numeric entities in iso-8859-1 mode', function (st) { + st.equal(qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }), 'a=%26%239786%3B'); + st.end(); + }); + + t.test('respects an explicit charset of utf-8 (the default)', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charset: 'utf-8' }), 'a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is utf-8', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'utf-8' }), 'utf8=%E2%9C%93&a=%C3%A6'); + st.end(); + }); + + t.test('adds the right sentinel when instructed to and the charset is iso-8859-1', function (st) { + st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }), 'utf8=%26%2310003%3B&a=%E6'); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.test('strictNullHandling works with custom filter', function (st) { + var filter = function (prefix, value) { + return value; + }; + + var options = { strictNullHandling: true, filter: filter }; + st.equal(qs.stringify({ key: null }, options), 'key'); + st.end(); + }); + + t.test('strictNullHandling works with null serializeDate', function (st) { + var serializeDate = function () { + return null; + }; + var options = { strictNullHandling: true, serializeDate: serializeDate }; + var date = new Date(); + st.equal(qs.stringify({ key: date }, options), 'key'); + st.end(); + }); + + t.test('allows for encoding keys and values differently', function (st) { + var encoder = function (str, defaultEncoder, charset, type) { + if (type === 'key') { + return defaultEncoder(str, defaultEncoder, charset, type).toLowerCase(); + } + if (type === 'value') { + return defaultEncoder(str, defaultEncoder, charset, type).toUpperCase(); + } + throw 'this should never happen! type: ' + type; + }; + + st.deepEqual(qs.stringify({ KeY: 'vAlUe' }, { encoder: encoder }), 'key=VALUE'); + st.end(); + }); + + t.test('objects inside arrays', function (st) { + var obj = { a: { b: { c: 'd', e: 'f' } } }; + var withArray = { a: { b: [{ c: 'd', e: 'f' }] } }; + + st.equal(qs.stringify(obj, { encode: false }), 'a[b][c]=d&a[b][e]=f', 'no array, no arrayFormat'); + st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'bracket' }), 'a[b][c]=d&a[b][e]=f', 'no array, bracket'); + st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'indices' }), 'a[b][c]=d&a[b][e]=f', 'no array, indices'); + st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'comma' }), 'a[b][c]=d&a[b][e]=f', 'no array, comma'); + + st.equal(qs.stringify(withArray, { encode: false }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, no arrayFormat'); + st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'bracket' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, bracket'); + st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'indices' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, indices'); + st.equal( + qs.stringify(withArray, { encode: false, arrayFormat: 'comma' }), + '???', + 'array, comma', + { skip: 'TODO: figure out what this should do' } + ); + + st.end(); + }); + + t.test('stringifies sparse arrays', function (st) { + /* eslint no-sparse-arrays: 0 */ + st.equal(qs.stringify({ a: [, '2', , , '1'] }, { encodeValuesOnly: true }), 'a[1]=2&a[4]=1'); + st.equal(qs.stringify({ a: [, { b: [, , { c: '1' }] }] }, { encodeValuesOnly: true }), 'a[1][b][2][c]=1'); + st.equal(qs.stringify({ a: [, [, , [, , , { c: '1' }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c]=1'); + st.equal(qs.stringify({ a: [, [, , [, , , { c: [, '1'] }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c][1]=1'); + + 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..aa84dfdc --- /dev/null +++ b/node_modules/qs/test/utils.js @@ -0,0 +1,136 @@ +'use strict'; + +var test = require('tape'); +var inspect = require('object-inspect'); +var SaferBuffer = require('safer-buffer').Buffer; +var forEach = require('for-each'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); + + t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); + + 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'] }); + + var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); + t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); + + t.test( + 'avoids invoking array setters unnecessarily', + { skip: typeof Object.defineProperty !== 'function' }, + function (st) { + var setCount = 0; + var getCount = 0; + var observed = []; + Object.defineProperty(observed, 0, { + get: function () { + getCount += 1; + return { bar: 'baz' }; + }, + set: function () { setCount += 1; } + }); + utils.merge(observed, [null]); + st.equal(setCount, 0); + st.equal(getCount, 1); + observed[0] = observed[0]; // eslint-disable-line no-self-assign + st.equal(setCount, 1); + st.equal(getCount, 2); + st.end(); + } + ); + + 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(); +}); + +test('combine()', function (t) { + t.test('both arrays', function (st) { + var a = [1]; + var b = [2]; + var combined = utils.combine(a, b); + + st.deepEqual(a, [1], 'a is not mutated'); + st.deepEqual(b, [2], 'b is not mutated'); + st.notEqual(a, combined, 'a !== combined'); + st.notEqual(b, combined, 'b !== combined'); + st.deepEqual(combined, [1, 2], 'combined is a + b'); + + st.end(); + }); + + t.test('one array, one non-array', function (st) { + var aN = 1; + var a = [aN]; + var bN = 2; + var b = [bN]; + + var combinedAnB = utils.combine(aN, b); + st.deepEqual(b, [bN], 'b is not mutated'); + st.notEqual(aN, combinedAnB, 'aN + b !== aN'); + st.notEqual(a, combinedAnB, 'aN + b !== a'); + st.notEqual(bN, combinedAnB, 'aN + b !== bN'); + st.notEqual(b, combinedAnB, 'aN + b !== b'); + st.deepEqual([1, 2], combinedAnB, 'first argument is array-wrapped when not an array'); + + var combinedABn = utils.combine(a, bN); + st.deepEqual(a, [aN], 'a is not mutated'); + st.notEqual(aN, combinedABn, 'a + bN !== aN'); + st.notEqual(a, combinedABn, 'a + bN !== a'); + st.notEqual(bN, combinedABn, 'a + bN !== bN'); + st.notEqual(b, combinedABn, 'a + bN !== b'); + st.deepEqual([1, 2], combinedABn, 'second argument is array-wrapped when not an array'); + + st.end(); + }); + + t.test('neither is an array', function (st) { + var combined = utils.combine(1, 2); + st.notEqual(1, combined, '1 + 2 !== 1'); + st.notEqual(2, combined, '1 + 2 !== 2'); + st.deepEqual([1, 2], combined, 'both arguments are array-wrapped when not an array'); + + st.end(); + }); + + t.end(); +}); + +test('isBuffer()', function (t) { + forEach([null, undefined, true, false, '', 'abc', 42, 0, NaN, {}, [], function () {}, /a/g], function (x) { + t.equal(utils.isBuffer(x), false, inspect(x) + ' is not a buffer'); + }); + + var fakeBuffer = { constructor: Buffer }; + t.equal(utils.isBuffer(fakeBuffer), false, 'fake buffer is not a buffer'); + + var saferBuffer = SaferBuffer.from('abc'); + t.equal(utils.isBuffer(saferBuffer), true, 'SaferBuffer instance is a buffer'); + + var buffer = Buffer.from && Buffer.alloc ? Buffer.from('abc') : new Buffer('abc'); + t.equal(utils.isBuffer(buffer), true, 'real Buffer instance is a buffer'); + t.end(); +}); diff --git a/node_modules/range-parser/HISTORY.md b/node_modules/range-parser/HISTORY.md new file mode 100644 index 00000000..70a973d8 --- /dev/null +++ b/node_modules/range-parser/HISTORY.md @@ -0,0 +1,56 @@ +1.2.1 / 2019-05-10 +================== + + * Improve error when `str` is not a string + +1.2.0 / 2016-06-01 +================== + + * Add `combine` option to combine overlapping ranges + +1.1.0 / 2016-05-13 +================== + + * Fix incorrectly returning -1 when there is at least one valid range + * perf: remove internal function + +1.0.3 / 2015-10-29 +================== + + * perf: enable strict mode + +1.0.2 / 2014-09-08 +================== + + * Support Node.js 0.6 + +1.0.1 / 2014-09-07 +================== + + * Move repository to jshttp + +1.0.0 / 2013-12-11 +================== + + * Add repository to package.json + * Add MIT license + +0.0.4 / 2012-06-17 +================== + + * Change ret -1 for unsatisfiable and -2 when invalid + +0.0.3 / 2012-06-17 +================== + + * Fix last-byte-pos default to len - 1 + +0.0.2 / 2012-06-14 +================== + + * Add `.type` + +0.0.1 / 2012-06-11 +================== + + * Initial release diff --git a/node_modules/range-parser/LICENSE b/node_modules/range-parser/LICENSE new file mode 100644 index 00000000..35999543 --- /dev/null +++ b/node_modules/range-parser/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +```js +var parseRange = require('range-parser') +``` + +### parseRange(size, header, options) + +Parse the given `header` string where `size` is the maximum size of the resource. +An array of ranges will be returned or negative numbers indicating an error parsing. + + * `-2` signals a malformed header string + * `-1` signals an unsatisfiable range + + + +```js +// parse header from request +var range = parseRange(size, req.headers.range) + +// the type of the range +if (range.type === 'bytes') { + // the ranges + range.forEach(function (r) { + // do something with r.start and r.end + }) +} +``` + +#### Options + +These properties are accepted in the options object. + +##### combine + +Specifies if overlapping & adjacent ranges should be combined, defaults to `false`. +When `true`, ranges will be combined and returned as if they were specified that +way in the header. + + + +```js +parseRange(100, 'bytes=50-55,0-10,5-10,56-60', { combine: true }) +// => [ +// { start: 0, end: 10 }, +// { start: 50, end: 60 } +// ] +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/range-parser/master +[coveralls-url]: https://coveralls.io/r/jshttp/range-parser?branch=master +[node-image]: https://badgen.net/npm/node/range-parser +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/range-parser +[npm-url]: https://npmjs.org/package/range-parser +[npm-version-image]: https://badgen.net/npm/v/range-parser +[travis-image]: https://badgen.net/travis/jshttp/range-parser/master +[travis-url]: https://travis-ci.org/jshttp/range-parser diff --git a/node_modules/range-parser/index.js b/node_modules/range-parser/index.js new file mode 100644 index 00000000..b7dc5c0f --- /dev/null +++ b/node_modules/range-parser/index.js @@ -0,0 +1,162 @@ +/*! + * range-parser + * Copyright(c) 2012-2014 TJ Holowaychuk + * Copyright(c) 2015-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = rangeParser + +/** + * Parse "Range" header `str` relative to the given file `size`. + * + * @param {Number} size + * @param {String} str + * @param {Object} [options] + * @return {Array} + * @public + */ + +function rangeParser (size, str, options) { + if (typeof str !== 'string') { + throw new TypeError('argument str must be a string') + } + + var index = str.indexOf('=') + + if (index === -1) { + return -2 + } + + // split the range string + var arr = str.slice(index + 1).split(',') + var ranges = [] + + // add ranges type + ranges.type = str.slice(0, index) + + // parse all ranges + for (var i = 0; i < arr.length; i++) { + var range = arr[i].split('-') + var start = parseInt(range[0], 10) + var end = parseInt(range[1], 10) + + // -nnn + if (isNaN(start)) { + start = size - end + end = size - 1 + // nnn- + } else if (isNaN(end)) { + end = size - 1 + } + + // limit last-byte-pos to current length + if (end > size - 1) { + end = size - 1 + } + + // invalid or unsatisifiable + if (isNaN(start) || isNaN(end) || start > end || start < 0) { + continue + } + + // add range + ranges.push({ + start: start, + end: end + }) + } + + if (ranges.length < 1) { + // unsatisifiable + return -1 + } + + return options && options.combine + ? combineRanges(ranges) + : ranges +} + +/** + * Combine overlapping & adjacent ranges. + * @private + */ + +function combineRanges (ranges) { + var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart) + + for (var j = 0, i = 1; i < ordered.length; i++) { + var range = ordered[i] + var current = ordered[j] + + if (range.start > current.end + 1) { + // next range + ordered[++j] = range + } else if (range.end > current.end) { + // extend range + current.end = range.end + current.index = Math.min(current.index, range.index) + } + } + + // trim ordered array + ordered.length = j + 1 + + // generate combined range + var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) + + // copy ranges type + combined.type = ranges.type + + return combined +} + +/** + * Map function to add index value to ranges. + * @private + */ + +function mapWithIndex (range, index) { + return { + start: range.start, + end: range.end, + index: index + } +} + +/** + * Map function to remove index value from ranges. + * @private + */ + +function mapWithoutIndex (range) { + return { + start: range.start, + end: range.end + } +} + +/** + * Sort function to sort ranges by index. + * @private + */ + +function sortByRangeIndex (a, b) { + return a.index - b.index +} + +/** + * Sort function to sort ranges by start position. + * @private + */ + +function sortByRangeStart (a, b) { + return a.start - b.start +} diff --git a/node_modules/range-parser/package.json b/node_modules/range-parser/package.json new file mode 100644 index 00000000..abea6d85 --- /dev/null +++ b/node_modules/range-parser/package.json @@ -0,0 +1,44 @@ +{ + "name": "range-parser", + "author": "TJ Holowaychuk (http://tjholowaychuk.com)", + "description": "Range header field string parser", + "version": "1.2.1", + "contributors": [ + "Douglas Christopher Wilson ", + "James Wyatt Cready ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "keywords": [ + "range", + "parser", + "http" + ], + "repository": "jshttp/range-parser", + "devDependencies": { + "deep-equal": "1.0.1", + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.1.1" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + } +} diff --git a/node_modules/raw-body/HISTORY.md b/node_modules/raw-body/HISTORY.md new file mode 100644 index 00000000..0b6b8373 --- /dev/null +++ b/node_modules/raw-body/HISTORY.md @@ -0,0 +1,303 @@ +2.5.1 / 2022-02-28 +================== + + * Fix error on early async hooks implementations + +2.5.0 / 2022-02-21 +================== + + * Prevent loss of async hooks context + * Prevent hanging when stream is not readable + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + +2.4.3 / 2022-02-14 +================== + + * deps: bytes@3.1.2 + +2.4.2 / 2021-11-16 +================== + + * deps: bytes@3.1.1 + * deps: http-errors@1.8.1 + - deps: setprototypeof@1.2.0 + - deps: toidentifier@1.0.1 + +2.4.1 / 2019-06-25 +================== + + * deps: http-errors@1.7.3 + - deps: inherits@2.0.4 + +2.4.0 / 2019-04-17 +================== + + * deps: bytes@3.1.0 + - Add petabyte (`pb`) support + * deps: http-errors@1.7.2 + - Set constructor name when possible + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: iconv-lite@0.4.24 + - Added encoding MIK + +2.3.3 / 2018-05-08 +================== + + * deps: http-errors@1.6.3 + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.0 + - deps: statuses@'>= 1.3.1 < 2' + * deps: iconv-lite@0.4.23 + - Fix loading encoding with year appended + - Fix deprecation warnings on Node.js 10+ + +2.3.2 / 2017-09-09 +================== + + * deps: iconv-lite@0.4.19 + - Fix ISO-8859-1 regression + - Update Windows-1255 + +2.3.1 / 2017-09-07 +================== + + * deps: bytes@3.0.0 + * deps: http-errors@1.6.2 + - deps: depd@1.1.1 + * perf: skip buffer decoding on overage chunk + +2.3.0 / 2017-08-04 +================== + + * Add TypeScript definitions + * Use `http-errors` for standard emitted errors + * deps: bytes@2.5.0 + * deps: iconv-lite@0.4.18 + - Add support for React Native + - Add a warning if not loaded as utf-8 + - Fix CESU-8 decoding in Node.js 8 + - Improve speed of ISO-8859-1 encoding + +2.2.0 / 2017-01-02 +================== + + * deps: iconv-lite@0.4.15 + - Added encoding MS-31J + - Added encoding MS-932 + - Added encoding MS-936 + - Added encoding MS-949 + - Added encoding MS-950 + - Fix GBK/GB18030 handling of Euro character + +2.1.7 / 2016-06-19 +================== + + * deps: bytes@2.4.0 + * perf: remove double-cleanup on happy path + +2.1.6 / 2016-03-07 +================== + + * deps: bytes@2.3.0 + - Drop partial bytes on all parsed units + - Fix parsing byte string that looks like hex + +2.1.5 / 2015-11-30 +================== + + * deps: bytes@2.2.0 + * deps: iconv-lite@0.4.13 + +2.1.4 / 2015-09-27 +================== + + * Fix masking critical errors from `iconv-lite` + * deps: iconv-lite@0.4.12 + - Fix CESU-8 decoding in Node.js 4.x + +2.1.3 / 2015-09-12 +================== + + * Fix sync callback when attaching data listener causes sync read + - Node.js 0.10 compatibility issue + +2.1.2 / 2015-07-05 +================== + + * Fix error stack traces to skip `makeError` + * deps: iconv-lite@0.4.11 + - Add encoding CESU-8 + +2.1.1 / 2015-06-14 +================== + + * Use `unpipe` module for unpiping requests + +2.1.0 / 2015-05-28 +================== + + * deps: iconv-lite@0.4.10 + - Improved UTF-16 endianness detection + - Leading BOM is now removed when decoding + - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails + +2.0.2 / 2015-05-21 +================== + + * deps: bytes@2.1.0 + - Slight optimizations + +2.0.1 / 2015-05-10 +================== + + * Fix a false-positive when unpiping in Node.js 0.8 + +2.0.0 / 2015-05-08 +================== + + * Return a promise without callback instead of thunk + * deps: bytes@2.0.1 + - units no longer case sensitive when parsing + +1.3.4 / 2015-04-15 +================== + + * Fix hanging callback if request aborts during read + * deps: iconv-lite@0.4.8 + - Add encoding alias UNICODE-1-1-UTF-7 + +1.3.3 / 2015-02-08 +================== + + * deps: iconv-lite@0.4.7 + - Gracefully support enumerables on `Object.prototype` + +1.3.2 / 2015-01-20 +================== + + * deps: iconv-lite@0.4.6 + - Fix rare aliases of single-byte encodings + +1.3.1 / 2014-11-21 +================== + + * deps: iconv-lite@0.4.5 + - Fix Windows-31J and X-SJIS encoding support + +1.3.0 / 2014-07-20 +================== + + * Fully unpipe the stream on error + - Fixes `Cannot switch to old mode now` error on Node.js 0.10+ + +1.2.3 / 2014-07-20 +================== + + * deps: iconv-lite@0.4.4 + - Added encoding UTF-7 + +1.2.2 / 2014-06-19 +================== + + * Send invalid encoding error to callback + +1.2.1 / 2014-06-15 +================== + + * deps: iconv-lite@0.4.3 + - Added encodings UTF-16BE and UTF-16 with BOM + +1.2.0 / 2014-06-13 +================== + + * Passing string as `options` interpreted as encoding + * Support all encodings from `iconv-lite` + +1.1.7 / 2014-06-12 +================== + + * use `string_decoder` module from npm + +1.1.6 / 2014-05-27 +================== + + * check encoding for old streams1 + * support node.js < 0.10.6 + +1.1.5 / 2014-05-14 +================== + + * bump bytes + +1.1.4 / 2014-04-19 +================== + + * allow true as an option + * bump bytes + +1.1.3 / 2014-03-02 +================== + + * fix case when length=null + +1.1.2 / 2013-12-01 +================== + + * be less strict on state.encoding check + +1.1.1 / 2013-11-27 +================== + + * add engines + +1.1.0 / 2013-11-27 +================== + + * add err.statusCode and err.type + * allow for encoding option to be true + * pause the stream instead of dumping on error + * throw if the stream's encoding is set + +1.0.1 / 2013-11-19 +================== + + * dont support streams1, throw if dev set encoding + +1.0.0 / 2013-11-17 +================== + + * rename `expected` option to `length` + +0.2.0 / 2013-11-15 +================== + + * republish + +0.1.1 / 2013-11-15 +================== + + * use bytes + +0.1.0 / 2013-11-11 +================== + + * generator support + +0.0.3 / 2013-10-10 +================== + + * update repo + +0.0.2 / 2013-09-14 +================== + + * dump stream on bad headers + * listen to events after defining received and buffers + +0.0.1 / 2013-09-14 +================== + + * Initial release diff --git a/node_modules/raw-body/LICENSE b/node_modules/raw-body/LICENSE new file mode 100644 index 00000000..1029a7a7 --- /dev/null +++ b/node_modules/raw-body/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2013-2014 Jonathan Ong +Copyright (c) 2014-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/raw-body/README.md b/node_modules/raw-body/README.md new file mode 100644 index 00000000..695c6607 --- /dev/null +++ b/node_modules/raw-body/README.md @@ -0,0 +1,223 @@ +# raw-body + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build status][github-actions-ci-image]][github-actions-ci-url] +[![Test coverage][coveralls-image]][coveralls-url] + +Gets the entire buffer of a stream either as a `Buffer` or a string. +Validates the stream's length against an expected length and maximum limit. +Ideal for parsing request bodies. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install raw-body +``` + +### TypeScript + +This module includes a [TypeScript](https://www.typescriptlang.org/) +declaration file to enable auto complete in compatible editors and type +information for TypeScript projects. This module depends on the Node.js +types, so install `@types/node`: + +```sh +$ npm install @types/node +``` + +## API + +```js +var getRawBody = require('raw-body') +``` + +### getRawBody(stream, [options], [callback]) + +**Returns a promise if no callback specified and global `Promise` exists.** + +Options: + +- `length` - The length of the stream. + If the contents of the stream do not add up to this length, + an `400` error code is returned. +- `limit` - The byte limit of the body. + This is the number of bytes or any string format supported by + [bytes](https://www.npmjs.com/package/bytes), + for example `1000`, `'500kb'` or `'3mb'`. + If the body ends up being larger than this limit, + a `413` error code is returned. +- `encoding` - The encoding to use to decode the body into a string. + By default, a `Buffer` instance will be returned when no encoding is specified. + Most likely, you want `utf-8`, so setting `encoding` to `true` will decode as `utf-8`. + You can use any type of encoding supported by [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme). + +You can also pass a string in place of options to just specify the encoding. + +If an error occurs, the stream will be paused, everything unpiped, +and you are responsible for correctly disposing the stream. +For HTTP requests, you may need to finish consuming the stream if +you want to keep the socket open for future requests. For streams +that use file descriptors, you should `stream.destroy()` or +`stream.close()` to prevent leaks. + +## Errors + +This module creates errors depending on the error condition during reading. +The error may be an error from the underlying Node.js implementation, but is +otherwise an error created by this module, which has the following attributes: + + * `limit` - the limit in bytes + * `length` and `expected` - the expected length of the stream + * `received` - the received bytes + * `encoding` - the invalid encoding + * `status` and `statusCode` - the corresponding status code for the error + * `type` - the error type + +### Types + +The errors from this module have a `type` property which allows for the programmatic +determination of the type of error returned. + +#### encoding.unsupported + +This error will occur when the `encoding` option is specified, but the value does +not map to an encoding supported by the [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme) +module. + +#### entity.too.large + +This error will occur when the `limit` option is specified, but the stream has +an entity that is larger. + +#### request.aborted + +This error will occur when the request stream is aborted by the client before +reading the body has finished. + +#### request.size.invalid + +This error will occur when the `length` option is specified, but the stream has +emitted more bytes. + +#### stream.encoding.set + +This error will occur when the given stream has an encoding set on it, making it +a decoded stream. The stream should not have an encoding set and is expected to +emit `Buffer` objects. + +#### stream.not.readable + +This error will occur when the given stream is not readable. + +## Examples + +### Simple Express example + +```js +var contentType = require('content-type') +var express = require('express') +var getRawBody = require('raw-body') + +var app = express() + +app.use(function (req, res, next) { + getRawBody(req, { + length: req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(req).parameters.charset + }, function (err, string) { + if (err) return next(err) + req.text = string + next() + }) +}) + +// now access req.text +``` + +### Simple Koa example + +```js +var contentType = require('content-type') +var getRawBody = require('raw-body') +var koa = require('koa') + +var app = koa() + +app.use(function * (next) { + this.text = yield getRawBody(this.req, { + length: this.req.headers['content-length'], + limit: '1mb', + encoding: contentType.parse(this.req).parameters.charset + }) + yield next +}) + +// now access this.text +``` + +### Using as a promise + +To use this library as a promise, simply omit the `callback` and a promise is +returned, provided that a global `Promise` is defined. + +```js +var getRawBody = require('raw-body') +var http = require('http') + +var server = http.createServer(function (req, res) { + getRawBody(req) + .then(function (buf) { + res.statusCode = 200 + res.end(buf.length + ' bytes submitted') + }) + .catch(function (err) { + res.statusCode = 500 + res.end(err.message) + }) +}) + +server.listen(3000) +``` + +### Using with TypeScript + +```ts +import * as getRawBody from 'raw-body'; +import * as http from 'http'; + +const server = http.createServer((req, res) => { + getRawBody(req) + .then((buf) => { + res.statusCode = 200; + res.end(buf.length + ' bytes submitted'); + }) + .catch((err) => { + res.statusCode = err.statusCode; + res.end(err.message); + }); +}); + +server.listen(3000); +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/raw-body.svg +[npm-url]: https://npmjs.org/package/raw-body +[node-version-image]: https://img.shields.io/node/v/raw-body.svg +[node-version-url]: https://nodejs.org/en/download/ +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/raw-body/master.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/raw-body?branch=master +[downloads-image]: https://img.shields.io/npm/dm/raw-body.svg +[downloads-url]: https://npmjs.org/package/raw-body +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/raw-body/ci/master?label=ci +[github-actions-ci-url]: https://github.com/jshttp/stream-utils/raw-body?query=workflow%3Aci diff --git a/node_modules/raw-body/SECURITY.md b/node_modules/raw-body/SECURITY.md new file mode 100644 index 00000000..2421efc4 --- /dev/null +++ b/node_modules/raw-body/SECURITY.md @@ -0,0 +1,24 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The `raw-body` team and community take all security bugs seriously. Thank you +for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owners of `raw-body`. This information +can be found in the npm registry using the command `npm owner ls raw-body`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/stream-utils/raw-body/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/node_modules/raw-body/index.d.ts b/node_modules/raw-body/index.d.ts new file mode 100644 index 00000000..dcbbebd4 --- /dev/null +++ b/node_modules/raw-body/index.d.ts @@ -0,0 +1,87 @@ +import { Readable } from 'stream'; + +declare namespace getRawBody { + export type Encoding = string | true; + + export interface Options { + /** + * The expected length of the stream. + */ + length?: number | string | null; + /** + * The byte limit of the body. This is the number of bytes or any string + * format supported by `bytes`, for example `1000`, `'500kb'` or `'3mb'`. + */ + limit?: number | string | null; + /** + * The encoding to use to decode the body into a string. By default, a + * `Buffer` instance will be returned when no encoding is specified. Most + * likely, you want `utf-8`, so setting encoding to `true` will decode as + * `utf-8`. You can use any type of encoding supported by `iconv-lite`. + */ + encoding?: Encoding | null; + } + + export interface RawBodyError extends Error { + /** + * The limit in bytes. + */ + limit?: number; + /** + * The expected length of the stream. + */ + length?: number; + expected?: number; + /** + * The received bytes. + */ + received?: number; + /** + * The encoding. + */ + encoding?: string; + /** + * The corresponding status code for the error. + */ + status: number; + statusCode: number; + /** + * The error type. + */ + type: string; + } +} + +/** + * Gets the entire buffer of a stream either as a `Buffer` or a string. + * Validates the stream's length against an expected length and maximum + * limit. Ideal for parsing request bodies. + */ +declare function getRawBody( + stream: Readable, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding, + callback: (err: getRawBody.RawBodyError, body: string) => void +): void; + +declare function getRawBody( + stream: Readable, + options: getRawBody.Options, + callback: (err: getRawBody.RawBodyError, body: Buffer) => void +): void; + +declare function getRawBody( + stream: Readable, + options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding +): Promise; + +declare function getRawBody( + stream: Readable, + options?: getRawBody.Options +): Promise; + +export = getRawBody; diff --git a/node_modules/raw-body/index.js b/node_modules/raw-body/index.js new file mode 100644 index 00000000..a8f537f3 --- /dev/null +++ b/node_modules/raw-body/index.js @@ -0,0 +1,329 @@ +/*! + * raw-body + * Copyright(c) 2013-2014 Jonathan Ong + * Copyright(c) 2014-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var asyncHooks = tryRequireAsyncHooks() +var bytes = require('bytes') +var createError = require('http-errors') +var iconv = require('iconv-lite') +var unpipe = require('unpipe') + +/** + * Module exports. + * @public + */ + +module.exports = getRawBody + +/** + * Module variables. + * @private + */ + +var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: / + +/** + * Get the decoder for a given encoding. + * + * @param {string} encoding + * @private + */ + +function getDecoder (encoding) { + if (!encoding) return null + + try { + return iconv.getDecoder(encoding) + } catch (e) { + // error getting decoder + if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e + + // the encoding was not found + throw createError(415, 'specified encoding unsupported', { + encoding: encoding, + type: 'encoding.unsupported' + }) + } +} + +/** + * Get the raw body of a stream (typically HTTP). + * + * @param {object} stream + * @param {object|string|function} [options] + * @param {function} [callback] + * @public + */ + +function getRawBody (stream, options, callback) { + var done = callback + var opts = options || {} + + if (options === true || typeof options === 'string') { + // short cut for encoding + opts = { + encoding: options + } + } + + if (typeof options === 'function') { + done = options + opts = {} + } + + // validate callback is a function, if provided + if (done !== undefined && typeof done !== 'function') { + throw new TypeError('argument callback must be a function') + } + + // require the callback without promises + if (!done && !global.Promise) { + throw new TypeError('argument callback is required') + } + + // get encoding + var encoding = opts.encoding !== true + ? opts.encoding + : 'utf-8' + + // convert the limit to an integer + var limit = bytes.parse(opts.limit) + + // convert the expected length to an integer + var length = opts.length != null && !isNaN(opts.length) + ? parseInt(opts.length, 10) + : null + + if (done) { + // classic callback style + return readStream(stream, encoding, length, limit, wrap(done)) + } + + return new Promise(function executor (resolve, reject) { + readStream(stream, encoding, length, limit, function onRead (err, buf) { + if (err) return reject(err) + resolve(buf) + }) + }) +} + +/** + * Halt a stream. + * + * @param {Object} stream + * @private + */ + +function halt (stream) { + // unpipe everything from the stream + unpipe(stream) + + // pause stream + if (typeof stream.pause === 'function') { + stream.pause() + } +} + +/** + * Read the data from the stream. + * + * @param {object} stream + * @param {string} encoding + * @param {number} length + * @param {number} limit + * @param {function} callback + * @public + */ + +function readStream (stream, encoding, length, limit, callback) { + var complete = false + var sync = true + + // check the length and limit options. + // note: we intentionally leave the stream paused, + // so users should handle the stream themselves. + if (limit !== null && length !== null && length > limit) { + return done(createError(413, 'request entity too large', { + expected: length, + length: length, + limit: limit, + type: 'entity.too.large' + })) + } + + // streams1: assert request encoding is buffer. + // streams2+: assert the stream encoding is buffer. + // stream._decoder: streams1 + // state.encoding: streams2 + // state.decoder: streams2, specifically < 0.10.6 + var state = stream._readableState + if (stream._decoder || (state && (state.encoding || state.decoder))) { + // developer error + return done(createError(500, 'stream encoding should not be set', { + type: 'stream.encoding.set' + })) + } + + if (typeof stream.readable !== 'undefined' && !stream.readable) { + return done(createError(500, 'stream is not readable', { + type: 'stream.not.readable' + })) + } + + var received = 0 + var decoder + + try { + decoder = getDecoder(encoding) + } catch (err) { + return done(err) + } + + var buffer = decoder + ? '' + : [] + + // attach listeners + stream.on('aborted', onAborted) + stream.on('close', cleanup) + stream.on('data', onData) + stream.on('end', onEnd) + stream.on('error', onEnd) + + // mark sync section complete + sync = false + + function done () { + var args = new Array(arguments.length) + + // copy arguments + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + + // mark complete + complete = true + + if (sync) { + process.nextTick(invokeCallback) + } else { + invokeCallback() + } + + function invokeCallback () { + cleanup() + + if (args[0]) { + // halt the stream on error + halt(stream) + } + + callback.apply(null, args) + } + } + + function onAborted () { + if (complete) return + + done(createError(400, 'request aborted', { + code: 'ECONNABORTED', + expected: length, + length: length, + received: received, + type: 'request.aborted' + })) + } + + function onData (chunk) { + if (complete) return + + received += chunk.length + + if (limit !== null && received > limit) { + done(createError(413, 'request entity too large', { + limit: limit, + received: received, + type: 'entity.too.large' + })) + } else if (decoder) { + buffer += decoder.write(chunk) + } else { + buffer.push(chunk) + } + } + + function onEnd (err) { + if (complete) return + if (err) return done(err) + + if (length !== null && received !== length) { + done(createError(400, 'request size did not match content length', { + expected: length, + length: length, + received: received, + type: 'request.size.invalid' + })) + } else { + var string = decoder + ? buffer + (decoder.end() || '') + : Buffer.concat(buffer) + done(null, string) + } + } + + function cleanup () { + buffer = null + + stream.removeListener('aborted', onAborted) + stream.removeListener('data', onData) + stream.removeListener('end', onEnd) + stream.removeListener('error', onEnd) + stream.removeListener('close', cleanup) + } +} + +/** + * Try to require async_hooks + * @private + */ + +function tryRequireAsyncHooks () { + try { + return require('async_hooks') + } catch (e) { + return {} + } +} + +/** + * Wrap function with async resource, if possible. + * AsyncResource.bind static method backported. + * @private + */ + +function wrap (fn) { + var res + + // create anonymous resource + if (asyncHooks.AsyncResource) { + res = new asyncHooks.AsyncResource(fn.name || 'bound-anonymous-fn') + } + + // incompatible node.js + if (!res || !res.runInAsyncScope) { + return fn + } + + // return bound function + return res.runInAsyncScope.bind(res, fn, null) +} diff --git a/node_modules/raw-body/package.json b/node_modules/raw-body/package.json new file mode 100644 index 00000000..50fc90ad --- /dev/null +++ b/node_modules/raw-body/package.json @@ -0,0 +1,49 @@ +{ + "name": "raw-body", + "description": "Get and validate the raw body of a readable stream.", + "version": "2.5.1", + "author": "Jonathan Ong (http://jongleberry.com)", + "contributors": [ + "Douglas Christopher Wilson ", + "Raynos " + ], + "license": "MIT", + "repository": "stream-utils/raw-body", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "devDependencies": { + "bluebird": "3.7.2", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.1", + "nyc": "15.1.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.8" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "SECURITY.md", + "index.d.ts", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE new file mode 100644 index 00000000..037cbb4e --- /dev/null +++ b/node_modules/readdirp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.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/readdirp/README.md b/node_modules/readdirp/README.md new file mode 100644 index 00000000..465593c9 --- /dev/null +++ b/node_modules/readdirp/README.md @@ -0,0 +1,122 @@ +# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp) + +Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**. + + +```sh +npm install readdirp +``` + +```javascript +const readdirp = require('readdirp'); + +// Use streams to achieve small RAM & CPU footprint. +// 1) Streams example with for-await. +for await (const entry of readdirp('.')) { + const {path} = entry; + console.log(`${JSON.stringify({path})}`); +} + +// 2) Streams example, non for-await. +// Print out all JS files along with their size within the current folder & subfolders. +readdirp('.', {fileFilter: '*.js', alwaysStat: true}) + .on('data', (entry) => { + const {path, stats: {size}} = entry; + console.log(`${JSON.stringify({path, size})}`); + }) + // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted + .on('warn', error => console.error('non-fatal error', error)) + .on('error', error => console.error('fatal error', error)) + .on('end', () => console.log('done')); + +// 3) Promise example. More RAM and CPU than streams / for-await. +const files = await readdirp.promise('.'); +console.log(files.map(file => file.path)); + +// Other options. +readdirp('test', { + fileFilter: '*.js', + directoryFilter: ['!.git', '!*modules'] + // directoryFilter: (di) => di.basename.length === 9 + type: 'files_directories', + depth: 1 +}); +``` + +For more examples, check out `examples` directory. + +## API + +`const stream = readdirp(root[, options])` — **Stream API** + +- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo) +- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`). +- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir. +- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user. +- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed. +- `on('end')` — we are done. Called when all entries were found and no more will be emitted. +- `on('close')` — stream is destroyed via `stream.destroy()`. + 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](https://nodejs.org/api/stream.html) + or the [stream-handbook](https://github.com/substack/stream-handbook) + +`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo). + +First argument is awalys `root`, path in which to start reading and recursing into subdirectories. + +### options + +- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings. + - **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 [picomatch](https://github.com/micromatch/picomatch), 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. +- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into. +- `depth: 5`: depth at which to stop recursing even if more subdirectories are found +- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes. +- `alwaysStat: false`: always return `stats` property for every file. Default is `false`, readdirp will return `Dirent` entries. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0. +- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat` + +### `EntryInfo` + +Has the following properties: + +- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root) +- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found +- `basename: 'react.js'`: name of the file/directory +- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false` +- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true` + +## Changelog + +- 3.5 (Oct 13, 2020) disallows recursive directory-based symlinks. + Before, it could have entered infinite loop. +- 3.4 (Mar 19, 2020) adds support for directory-based symlinks. +- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping. +- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic. +- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions". +- 3.0 brings huge performance improvements and stream backpressure support. +- Upgrading 2.x to 3.x: + - Signature changed from `readdirp(options)` to `readdirp(root, options)` + - Replaced callback API with promise API. + - Renamed `entryType` option to `type` + - Renamed `entryType: 'both'` to `'files_directories'` + - `EntryInfo` + - Renamed `stat` to `stats` + - Emitted only when `alwaysStat: true` + - `dirent` is emitted instead of `stats` by default with `alwaysStat: false` + - Renamed `name` to `basename` + - Removed `parentDir` and `fullParentDir` properties +- Supported node.js versions: + - 3.x: node 8+ + - 2.x: node 0.6+ + +## License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller () + +MIT License, see [LICENSE](LICENSE) file. diff --git a/node_modules/readdirp/index.d.ts b/node_modules/readdirp/index.d.ts new file mode 100644 index 00000000..cbbd76ca --- /dev/null +++ b/node_modules/readdirp/index.d.ts @@ -0,0 +1,43 @@ +// TypeScript Version: 3.2 + +/// + +import * as fs from 'fs'; +import { Readable } from 'stream'; + +declare namespace readdir { + interface EntryInfo { + path: string; + fullPath: string; + basename: string; + stats?: fs.Stats; + dirent?: fs.Dirent; + } + + interface ReaddirpOptions { + root?: string; + fileFilter?: string | string[] | ((entry: EntryInfo) => boolean); + directoryFilter?: string | string[] | ((entry: EntryInfo) => boolean); + type?: 'files' | 'directories' | 'files_directories' | 'all'; + lstat?: boolean; + depth?: number; + alwaysStat?: boolean; + } + + interface ReaddirpStream extends Readable, AsyncIterable { + read(): EntryInfo; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + + function promise( + root: string, + options?: ReaddirpOptions + ): Promise; +} + +declare function readdir( + root: string, + options?: readdir.ReaddirpOptions +): readdir.ReaddirpStream; + +export = readdir; diff --git a/node_modules/readdirp/index.js b/node_modules/readdirp/index.js new file mode 100644 index 00000000..cf739b2d --- /dev/null +++ b/node_modules/readdirp/index.js @@ -0,0 +1,287 @@ +'use strict'; + +const fs = require('fs'); +const { Readable } = require('stream'); +const sysPath = require('path'); +const { promisify } = require('util'); +const picomatch = require('picomatch'); + +const readdir = promisify(fs.readdir); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const realpath = promisify(fs.realpath); + +/** + * @typedef {Object} EntryInfo + * @property {String} path + * @property {String} fullPath + * @property {fs.Stats=} stats + * @property {fs.Dirent=} dirent + * @property {String} basename + */ + +const BANG = '!'; +const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR'; +const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]); +const FILE_TYPE = 'files'; +const DIR_TYPE = 'directories'; +const FILE_DIR_TYPE = 'files_directories'; +const EVERYTHING_TYPE = 'all'; +const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; + +const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code); +const [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10)); +const wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5)); + +const normalizeFilter = filter => { + if (filter === undefined) return; + if (typeof filter === 'function') return filter; + + if (typeof filter === 'string') { + const glob = picomatch(filter.trim()); + return entry => glob(entry.basename); + } + + if (Array.isArray(filter)) { + const positive = []; + const negative = []; + for (const item of filter) { + const trimmed = item.trim(); + if (trimmed.charAt(0) === BANG) { + negative.push(picomatch(trimmed.slice(1))); + } else { + positive.push(picomatch(trimmed)); + } + } + + if (negative.length > 0) { + if (positive.length > 0) { + return entry => + positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename)); + } + return entry => !negative.some(f => f(entry.basename)); + } + return entry => positive.some(f => f(entry.basename)); + } +}; + +class ReaddirpStream extends Readable { + static get defaultOptions() { + return { + root: '.', + /* eslint-disable no-unused-vars */ + fileFilter: (path) => true, + directoryFilter: (path) => true, + /* eslint-enable no-unused-vars */ + type: FILE_TYPE, + lstat: false, + depth: 2147483648, + alwaysStat: false + }; + } + + constructor(options = {}) { + super({ + objectMode: true, + autoDestroy: true, + highWaterMark: options.highWaterMark || 4096 + }); + const opts = { ...ReaddirpStream.defaultOptions, ...options }; + const { root, type } = opts; + + this._fileFilter = normalizeFilter(opts.fileFilter); + this._directoryFilter = normalizeFilter(opts.directoryFilter); + + const statMethod = opts.lstat ? lstat : stat; + // Use bigint stats if it's windows and stat() supports options (node 10+). + if (wantBigintFsStats) { + this._stat = path => statMethod(path, { bigint: true }); + } else { + this._stat = statMethod; + } + + this._maxDepth = opts.depth; + this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsEverything = type === EVERYTHING_TYPE; + this._root = sysPath.resolve(root); + this._isDirent = ('Dirent' in fs) && !opts.alwaysStat; + this._statsProp = this._isDirent ? 'dirent' : 'stats'; + this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent }; + + // Launch stream with one parent, the root dir. + this.parents = [this._exploreDir(root, 1)]; + this.reading = false; + this.parent = undefined; + } + + async _read(batch) { + if (this.reading) return; + this.reading = true; + + try { + while (!this.destroyed && batch > 0) { + const { path, depth, files = [] } = this.parent || {}; + + if (files.length > 0) { + const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path)); + for (const entry of await Promise.all(slice)) { + if (this.destroyed) return; + + const entryType = await this._getEntryType(entry); + if (entryType === 'directory' && this._directoryFilter(entry)) { + if (depth <= this._maxDepth) { + this.parents.push(this._exploreDir(entry.fullPath, depth + 1)); + } + + if (this._wantsDir) { + this.push(entry); + batch--; + } + } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) { + if (this._wantsFile) { + this.push(entry); + batch--; + } + } + } + } else { + const parent = this.parents.pop(); + if (!parent) { + this.push(null); + break; + } + this.parent = await parent; + if (this.destroyed) return; + } + } + } catch (error) { + this.destroy(error); + } finally { + this.reading = false; + } + } + + async _exploreDir(path, depth) { + let files; + try { + files = await readdir(path, this._rdOptions); + } catch (error) { + this._onError(error); + } + return { files, depth, path }; + } + + async _formatEntry(dirent, path) { + let entry; + try { + const basename = this._isDirent ? dirent.name : dirent; + const fullPath = sysPath.resolve(sysPath.join(path, basename)); + entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename }; + entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); + } catch (err) { + this._onError(err); + } + return entry; + } + + _onError(err) { + if (isNormalFlowError(err) && !this.destroyed) { + this.emit('warn', err); + } else { + this.destroy(err); + } + } + + async _getEntryType(entry) { + // entry may be undefined, because a warning or an error were emitted + // and the statsProp is undefined + const stats = entry && entry[this._statsProp]; + if (!stats) { + return; + } + if (stats.isFile()) { + return 'file'; + } + if (stats.isDirectory()) { + return 'directory'; + } + if (stats && stats.isSymbolicLink()) { + const full = entry.fullPath; + try { + const entryRealPath = await realpath(full); + const entryRealPathStats = await lstat(entryRealPath); + if (entryRealPathStats.isFile()) { + return 'file'; + } + if (entryRealPathStats.isDirectory()) { + const len = entryRealPath.length; + if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) { + const recursiveError = new Error( + `Circular symlink detected: "${full}" points to "${entryRealPath}"` + ); + recursiveError.code = RECURSIVE_ERROR_CODE; + return this._onError(recursiveError); + } + return 'directory'; + } + } catch (error) { + this._onError(error); + } + } + } + + _includeAsFile(entry) { + const stats = entry && entry[this._statsProp]; + + return stats && this._wantsEverything && !stats.isDirectory(); + } +} + +/** + * @typedef {Object} ReaddirpArguments + * @property {Function=} fileFilter + * @property {Function=} directoryFilter + * @property {String=} type + * @property {Number=} depth + * @property {String=} root + * @property {Boolean=} lstat + * @property {Boolean=} bigint + */ + +/** + * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. + * @param {String} root Root directory + * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth + */ +const readdirp = (root, options = {}) => { + let type = options.entryType || options.type; + if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility + if (type) options.type = type; + if (!root) { + throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)'); + } else if (typeof root !== 'string') { + throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)'); + } else if (type && !ALL_TYPES.includes(type)) { + throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`); + } + + options.root = root; + return new ReaddirpStream(options); +}; + +const readdirpPromise = (root, options = {}) => { + return new Promise((resolve, reject) => { + const files = []; + readdirp(root, options) + .on('data', entry => files.push(entry)) + .on('end', () => resolve(files)) + .on('error', error => reject(error)); + }); +}; + +readdirp.promise = readdirpPromise; +readdirp.ReaddirpStream = ReaddirpStream; +readdirp.default = readdirp; + +module.exports = readdirp; diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json new file mode 100644 index 00000000..dba53888 --- /dev/null +++ b/node_modules/readdirp/package.json @@ -0,0 +1,122 @@ +{ + "name": "readdirp", + "description": "Recursive version of fs.readdir with streaming API.", + "version": "3.6.0", + "homepage": "https://github.com/paulmillr/readdirp", + "repository": { + "type": "git", + "url": "git://github.com/paulmillr/readdirp.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/paulmillr/readdirp/issues" + }, + "author": "Thorsten Lorenz (thlorenz.com)", + "contributors": [ + "Thorsten Lorenz (thlorenz.com)", + "Paul Miller (https://paulmillr.com)" + ], + "main": "index.js", + "engines": { + "node": ">=8.10.0" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "recursive", + "fs", + "stream", + "streams", + "readdir", + "filesystem", + "find", + "filter" + ], + "scripts": { + "dtslint": "dtslint", + "nyc": "nyc", + "mocha": "mocha --exit", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "test": "npm run lint && nyc npm run mocha" + }, + "dependencies": { + "picomatch": "^2.2.1" + }, + "devDependencies": { + "@types/node": "^14", + "chai": "^4.2", + "chai-subset": "^1.6", + "dtslint": "^3.3.0", + "eslint": "^7.0.0", + "mocha": "^7.1.1", + "nyc": "^15.0.0", + "rimraf": "^3.0.0", + "typescript": "^4.0.3" + }, + "nyc": { + "reporter": [ + "html", + "text" + ] + }, + "eslintConfig": { + "root": true, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 9, + "sourceType": "script" + }, + "env": { + "node": true, + "es6": true + }, + "rules": { + "array-callback-return": "error", + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], + "no-else-return": [ + "error", + { + "allowElseIf": false + } + ], + "no-lonely-if": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-arrow-callback": [ + "error", + { + "allowNamedFunctions": true + } + ], + "prefer-const": [ + "error", + { + "ignoreReadBeforeAssign": true + } + ], + "prefer-destructuring": [ + "error", + { + "object": true, + "array": false + } + ], + "prefer-spread": "error", + "prefer-template": "error", + "radix": "error", + "semi": "error", + "strict": "error", + "quotes": [ + "error", + "single" + ] + } + } +} diff --git a/node_modules/relateurl/README.md b/node_modules/relateurl/README.md new file mode 100644 index 00000000..fb65fca3 --- /dev/null +++ b/node_modules/relateurl/README.md @@ -0,0 +1,159 @@ +# relateurl [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][david-image]][david-url] + +> Minify URLs by converting them from absolute to relative. + +If you were to use this library on a website like `http://example.com/dir1/dir1-1/`, you would get results such as: + +| Before | After | +| :------------------------------------------ | :----------------------------------- | +| `http://example.com/dir1/dir1-2/index.html` | `../dir1-2/` | +| `http://example.com/dir2/dir2-1/` | `/dir2/dir2-1/` | +| `http://example.com/dir1/dir1-1/` | ` ` | +| `https://example.com/dir1/dir1-1/` | `https://example.com/dir1/dir1-1/` | +| `http://google.com:80/dir/` | `//google.com/dir/` | +| `../../../../../../../../#anchor` | `/#anchor` | + +**All string parsing.** *No* directory browsing. It is thoroughly tested, very fast and lightweight with zero external dependencies. + +## Getting Started + +This utility requires [Node.js](http://nodejs.org/) `>= 0.10`. To install, type this at the command line: +``` +npm install relateurl --save-dev +``` + +### Options + +#### options.defaultPorts +Type: `Object` +Default value: `{ftp:21, http:80, https:443}` + +Extend the list with any ports you need. Any URLs containing these default ports will have them removed. Example: `http://example.com:80/` will become `http://example.com/`. + +#### options.directoryIndexes +Type: `Array` +Default value: `["index.html"]` + +Extend the list with any resources you need. Works with [`options.removeDirectoryIndexes`](#options.removeDirectoryIndexes). + +#### options.ignore_www +Type: `Boolean` +Default value: `false` + +This will, for example, consider any domains containing `http://www.example.com/` to be related to any that contain `http://example.com/`. + +#### options.output +Type: constant or `String` +Choices: `RelateUrl.ABSOLUTE`,`RelateUrl.PATH_RELATIVE`,`RelateUrl.ROOT_RELATIVE`,`RelateUrl.SHORTEST` +Choices: `"absolute"`,`"pathRelative"`,`"rootRelative"`,`"shortest"` +Default value: `RelateUrl.SHORTEST` + +`RelateUrl.ABSOLUTE` will produce an absolute URL. Overrides [`options.schemeRelative`](#options.schemeRelative) with a value of `false`. +`RelateUrl.PATH_RELATIVE` will produce something like `../child-of-parent/etc/`. +`RelateUrl.ROOT_RELATIVE` will produce something like `/child-of-root/etc/`. +`RelateUrl.SHORTEST` will choose whichever is shortest between root- and path-relative. + +#### options.rejectedSchemes +Type: `Array` +Default value: `["data","javascript","mailto"]` + +Extend the list with any additional schemes. Example: `javascript:something` will not be modified. + +#### options.removeAuth +Type: `Boolean` +Default value: `false` + +Remove user authentication information from the output URL. + +#### options.removeDirectoryIndexes +Type: `Boolean` +Default value: `true` + +Remove any resources that match any found in [`options.directoryIndexes`](#options.directoryIndexes). + +#### options.removeEmptyQueries +Type: `Boolean` +Default value: `false` + +Remove empty query variables. Example: `http://domain.com/?var1&var2=&var3=asdf` will become `http://domain.com/?var3=adsf`. This does not apply to unrelated URLs (with other protocols, auths, hosts and/or ports). + +#### options.removeRootTrailingSlash +Type: `Boolean` +Default value: `true` + +Remove trailing slashes from root paths. Example: `http://domain.com/?var` will become `http://domain.com?var` while `http://domain.com/dir/?var` will not be modified. + +#### options.schemeRelative +Type: `Boolean` +Default value: `true` + +Output URLs relative to the scheme. Example: `http://example.com/` will become `//example.com/`. + +#### options.site +Type: `String` +Default value: `undefined` + +An options-based version of the [`from`](#examples) argument. If both are specified, `from` takes priority. + +#### options.slashesDenoteHost +Type: `Boolean` +Default value: `true` + +Passed to Node's [`url.parse`](http://nodejs.org/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost). + +### Examples +This library can be used as a [function for single-use](#single-instance) or as a [class for multiple conversions](#reusable-instances). + +Upon successful conversion, a `String` will be returned. If an issue is encountered while parsing `from`, an error will be thrown. + +#### Single Instance +```js +var RelateUrl = require("relateurl"); + +var result = RelateUrl.relate(from, to, options); +``` + +#### Reusable Instances +```js +var RelateUrl = require("relateurl"); + +var instance = new RelateUrl(from, options); + +var result1 = instance.relate(to1); +var result2 = instance.relate(to2, customOptions); +var result3 = instance.relate(to3); +``` + +## FAQ +1. **Why bother writing/using this?** +To aid in further minifying HTML, mainly for the purpose of faster page loads and SEO. It's been integrated into [HTMLMinifier](https://github.com/kangax/html-minifier). + +2. **Why not just use Node's `url.parse`, `url.resolve` and `path.relative`?** +`url.parse` *is* used, but `url.resolve` and `path.relative` are both slower and less powerful than this library. + + +## Release History +* 0.2.7 Node v6 support +* 0.2.6 minor enhancements +* 0.2.5 added `options.removeRootTrailingSlash` +* 0.2.4 added `options.site` +* 0.2.3 added browserify npm-script +* 0.2.2 removed task runner +* 0.2.1 shorten resource- and query-relative URLs, test variations list with other site URLs +* 0.2.0 code cleanup, `options.removeEmptyQueries=true` only applied to unrelated URLs +* 0.1.0 initial release + + +## Roadmap +* 0.2.8 check if queries are the same, regardless of param order +* 0.2.8 possible [scheme exclusions](http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml) such as `tel:` +* 0.2.8 decipher and return invalid input (special cases) to complete test suite +* 0.3.0 test `options.slashesDenoteHost=false`, add something like `options.externalDirectoryIndexes=[]` for external sites + + +[npm-image]: https://img.shields.io/npm/v/relateurl.svg +[npm-url]: https://npmjs.org/package/relateurl +[travis-image]: https://img.shields.io/travis/stevenvachon/relateurl.svg +[travis-url]: https://travis-ci.org/stevenvachon/relateurl +[david-image]: https://img.shields.io/david/stevenvachon/relateurl.svg +[david-url]: https://david-dm.org/stevenvachon/relateurl diff --git a/node_modules/relateurl/lib/constants.js b/node_modules/relateurl/lib/constants.js new file mode 100644 index 00000000..d4cc8dd6 --- /dev/null +++ b/node_modules/relateurl/lib/constants.js @@ -0,0 +1,10 @@ +"use strict"; + +module.exports = +{ + // Output + ABSOLUTE: "absolute", + PATH_RELATIVE: "pathRelative", + ROOT_RELATIVE: "rootRelative", + SHORTEST: "shortest" +}; diff --git a/node_modules/relateurl/lib/format.js b/node_modules/relateurl/lib/format.js new file mode 100644 index 00000000..4dd5ddc0 --- /dev/null +++ b/node_modules/relateurl/lib/format.js @@ -0,0 +1,174 @@ +"use strict"; + +var constants = require("./constants"); + + + +function formatAuth(urlObj, options) +{ + if (urlObj.auth && !options.removeAuth && (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE)) + { + return urlObj.auth + "@"; + } + + return ""; +} + + + +function formatHash(urlObj, options) +{ + return urlObj.hash ? urlObj.hash : ""; +} + + + +function formatHost(urlObj, options) +{ + if (urlObj.host.full && (urlObj.extra.relation.maximumAuth || options.output===constants.ABSOLUTE)) + { + return urlObj.host.full; + } + + return ""; +} + + + +function formatPath(urlObj, options) +{ + var str = ""; + + var absolutePath = urlObj.path.absolute.string; + var relativePath = urlObj.path.relative.string; + var resource = showResource(urlObj, options); + + if (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE || options.output===constants.ROOT_RELATIVE) + { + str = absolutePath; + } + else if (relativePath.length<=absolutePath.length && options.output===constants.SHORTEST || options.output===constants.PATH_RELATIVE) + { + str = relativePath; + + if (str === "") + { + var query = showQuery(urlObj,options) && !!getQuery(urlObj,options); + + if (urlObj.extra.relation.maximumPath && !resource) + { + str = "./"; + } + else if (urlObj.extra.relation.overridesQuery && !resource && !query) + { + str = "./"; + } + } + } + else + { + str = absolutePath; + } + + if ( str==="/" && !resource && options.removeRootTrailingSlash && (!urlObj.extra.relation.minimumPort || options.output===constants.ABSOLUTE) ) + { + str = ""; + } + + return str; +} + + + +function formatPort(urlObj, options) +{ + if (urlObj.port && !urlObj.extra.portIsDefault && urlObj.extra.relation.maximumHost) + { + return ":" + urlObj.port; + } + + return ""; +} + + + +function formatQuery(urlObj, options) +{ + return showQuery(urlObj,options) ? getQuery(urlObj, options) : ""; +} + + + +function formatResource(urlObj, options) +{ + return showResource(urlObj,options) ? urlObj.resource : ""; +} + + + +function formatScheme(urlObj, options) +{ + var str = ""; + + if (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE) + { + if (!urlObj.extra.relation.minimumScheme || !options.schemeRelative || options.output===constants.ABSOLUTE) + { + str += urlObj.scheme + "://"; + } + else + { + str += "//"; + } + } + + return str; +} + + + +function formatUrl(urlObj, options) +{ + var url = ""; + + url += formatScheme(urlObj, options); + url += formatAuth(urlObj, options); + url += formatHost(urlObj, options); + url += formatPort(urlObj, options); + url += formatPath(urlObj, options); + url += formatResource(urlObj, options); + url += formatQuery(urlObj, options); + url += formatHash(urlObj, options); + + return url; +} + + + +function getQuery(urlObj, options) +{ + var stripQuery = options.removeEmptyQueries && urlObj.extra.relation.minimumPort; + + return urlObj.query.string[ stripQuery ? "stripped" : "full" ]; +} + + + +function showQuery(urlObj, options) +{ + return !urlObj.extra.relation.minimumQuery || options.output===constants.ABSOLUTE || options.output===constants.ROOT_RELATIVE; +} + + + +function showResource(urlObj, options) +{ + var removeIndex = options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex; + var removeMatchingResource = urlObj.extra.relation.minimumResource && options.output!==constants.ABSOLUTE && options.output!==constants.ROOT_RELATIVE; + + return !!urlObj.resource && !removeMatchingResource && !removeIndex; +} + + + +module.exports = formatUrl; diff --git a/node_modules/relateurl/lib/index.js b/node_modules/relateurl/lib/index.js new file mode 100644 index 00000000..714237d5 --- /dev/null +++ b/node_modules/relateurl/lib/index.js @@ -0,0 +1,94 @@ +"use strict"; + +var constants = require("./constants"); +var formatUrl = require("./format"); +var getOptions = require("./options"); +var objUtils = require("./util/object"); +var parseUrl = require("./parse"); +var relateUrl = require("./relate"); + + + +function RelateUrl(from, options) +{ + this.options = getOptions(options, + { + defaultPorts: {ftp:21, http:80, https:443}, + directoryIndexes: ["index.html"], + ignore_www: false, + output: RelateUrl.SHORTEST, + rejectedSchemes: ["data","javascript","mailto"], + removeAuth: false, + removeDirectoryIndexes: true, + removeEmptyQueries: false, + removeRootTrailingSlash: true, + schemeRelative: true, + site: undefined, + slashesDenoteHost: true + }); + + this.from = parseUrl.from(from, this.options, null); +} + + + +/* + Usage: instance=new RelateUrl(); instance.relate(); +*/ +RelateUrl.prototype.relate = function(from, to, options) +{ + // relate(to,options) + if ( objUtils.isPlainObject(to) ) + { + options = to; + to = from; + from = null; + } + // relate(to) + else if (!to) + { + to = from; + from = null; + } + + options = getOptions(options, this.options); + from = from || options.site; + from = parseUrl.from(from, options, this.from); + + if (!from || !from.href) + { + throw new Error("from value not defined."); + } + else if (from.extra.hrefInfo.minimumPathOnly) + { + throw new Error("from value supplied is not absolute: "+from.href); + } + + to = parseUrl.to(to, options); + + if (to.valid===false) return to.href; + + to = relateUrl(from, to, options); + to = formatUrl(to, options); + + return to; +} + + + +/* + Usage: RelateUrl.relate(); +*/ +RelateUrl.relate = function(from, to, options) +{ + return new RelateUrl().relate(from, to, options); +} + + + +// Make constants accessible from API +objUtils.shallowMerge(RelateUrl, constants); + + + +module.exports = RelateUrl; diff --git a/node_modules/relateurl/lib/options.js b/node_modules/relateurl/lib/options.js new file mode 100644 index 00000000..fe8910f7 --- /dev/null +++ b/node_modules/relateurl/lib/options.js @@ -0,0 +1,57 @@ +"use strict"; + +var objUtils = require("./util/object"); + + + +function getOptions(options, defaults) +{ + if ( objUtils.isPlainObject(options) ) + { + var newOptions = {}; + + for (var i in defaults) + { + if ( defaults.hasOwnProperty(i) ) + { + if (options[i] !== undefined) + { + newOptions[i] = mergeOption(options[i], defaults[i]); + } + else + { + newOptions[i] = defaults[i]; + } + } + } + + return newOptions; + } + else + { + return defaults; + } +} + + + +function mergeOption(newValues, defaultValues) +{ + if (defaultValues instanceof Object && newValues instanceof Object) + { + if (defaultValues instanceof Array && newValues instanceof Array) + { + return defaultValues.concat(newValues); + } + else + { + return objUtils.shallowMerge(newValues, defaultValues); + } + } + + return newValues; +} + + + +module.exports = getOptions; diff --git a/node_modules/relateurl/lib/parse/host.js b/node_modules/relateurl/lib/parse/host.js new file mode 100644 index 00000000..21f04ff9 --- /dev/null +++ b/node_modules/relateurl/lib/parse/host.js @@ -0,0 +1,26 @@ +"use strict"; + +function parseHost(urlObj, options) +{ + // TWEAK :: condition only for speed optimization + if (options.ignore_www) + { + var host = urlObj.host.full; + + if (host) + { + var stripped = host; + + if (host.indexOf("www.") === 0) + { + stripped = host.substr(4); + } + + urlObj.host.stripped = stripped; + } + } +} + + + +module.exports = parseHost; diff --git a/node_modules/relateurl/lib/parse/hrefInfo.js b/node_modules/relateurl/lib/parse/hrefInfo.js new file mode 100644 index 00000000..8cac2bd8 --- /dev/null +++ b/node_modules/relateurl/lib/parse/hrefInfo.js @@ -0,0 +1,20 @@ +"use strict"; + +function hrefInfo(urlObj) +{ + var minimumPathOnly = (!urlObj.scheme && !urlObj.auth && !urlObj.host.full && !urlObj.port); + var minimumResourceOnly = (minimumPathOnly && !urlObj.path.absolute.string); + var minimumQueryOnly = (minimumResourceOnly && !urlObj.resource); + var minimumHashOnly = (minimumQueryOnly && !urlObj.query.string.full.length); + var empty = (minimumHashOnly && !urlObj.hash); + + urlObj.extra.hrefInfo.minimumPathOnly = minimumPathOnly; + urlObj.extra.hrefInfo.minimumResourceOnly = minimumResourceOnly; + urlObj.extra.hrefInfo.minimumQueryOnly = minimumQueryOnly; + urlObj.extra.hrefInfo.minimumHashOnly = minimumHashOnly; + urlObj.extra.hrefInfo.empty = empty; +} + + + +module.exports = hrefInfo; diff --git a/node_modules/relateurl/lib/parse/index.js b/node_modules/relateurl/lib/parse/index.js new file mode 100644 index 00000000..9f367781 --- /dev/null +++ b/node_modules/relateurl/lib/parse/index.js @@ -0,0 +1,58 @@ +"use strict"; + +var hrefInfo = require("./hrefInfo"); +var parseHost = require("./host"); +var parsePath = require("./path"); +var parsePort = require("./port"); +var parseQuery = require("./query"); +var parseUrlString = require("./urlstring"); +var pathUtils = require("../util/path"); + + + +function parseFromUrl(url, options, fallback) +{ + if (url) + { + var urlObj = parseUrl(url, options); + + // Because the following occurs in the relate stage for "to" URLs, + // such had to be mostly duplicated here + + var pathArray = pathUtils.resolveDotSegments(urlObj.path.absolute.array); + + urlObj.path.absolute.array = pathArray; + urlObj.path.absolute.string = "/" + pathUtils.join(pathArray); + + return urlObj; + } + else + { + return fallback; + } +} + + + +function parseUrl(url, options) +{ + var urlObj = parseUrlString(url, options); + + if (urlObj.valid===false) return urlObj; + + parseHost(urlObj, options); + parsePort(urlObj, options); + parsePath(urlObj, options); + parseQuery(urlObj, options); + hrefInfo(urlObj); + + return urlObj; +} + + + +module.exports = +{ + from: parseFromUrl, + to: parseUrl +}; diff --git a/node_modules/relateurl/lib/parse/path.js b/node_modules/relateurl/lib/parse/path.js new file mode 100644 index 00000000..093c00c6 --- /dev/null +++ b/node_modules/relateurl/lib/parse/path.js @@ -0,0 +1,100 @@ +"use strict"; + +function isDirectoryIndex(resource, options) +{ + var verdict = false; + + options.directoryIndexes.every( function(index) + { + if (index === resource) + { + verdict = true; + return false; + } + + return true; + }); + + return verdict; +} + + + +function parsePath(urlObj, options) +{ + var path = urlObj.path.absolute.string; + + if (path) + { + var lastSlash = path.lastIndexOf("/"); + + if (lastSlash > -1) + { + if (++lastSlash < path.length) + { + var resource = path.substr(lastSlash); + + if (resource!=="." && resource!=="..") + { + urlObj.resource = resource; + path = path.substr(0, lastSlash); + } + else + { + path += "/"; + } + } + + urlObj.path.absolute.string = path; + urlObj.path.absolute.array = splitPath(path); + } + else if (path==="." || path==="..") + { + // "..?var", "..#anchor", etc ... not "..index.html" + path += "/"; + + urlObj.path.absolute.string = path; + urlObj.path.absolute.array = splitPath(path); + } + else + { + // Resource-only + urlObj.resource = path; + urlObj.path.absolute.string = null; + } + + urlObj.extra.resourceIsIndex = isDirectoryIndex(urlObj.resource, options); + } + // Else: query/hash-only or empty +} + + + +function splitPath(path) +{ + // TWEAK :: condition only for speed optimization + if (path !== "/") + { + var cleaned = []; + + path.split("/").forEach( function(dir) + { + // Cleanup -- splitting "/dir/" becomes ["","dir",""] + if (dir !== "") + { + cleaned.push(dir); + } + }); + + return cleaned; + } + else + { + // Faster to skip the above block and just create an array + return []; + } +} + + + +module.exports = parsePath; diff --git a/node_modules/relateurl/lib/parse/port.js b/node_modules/relateurl/lib/parse/port.js new file mode 100644 index 00000000..8c4ee2e8 --- /dev/null +++ b/node_modules/relateurl/lib/parse/port.js @@ -0,0 +1,32 @@ +"use strict"; + +function parsePort(urlObj, options) +{ + var defaultPort = -1; + + for (var i in options.defaultPorts) + { + if ( i===urlObj.scheme && options.defaultPorts.hasOwnProperty(i) ) + { + defaultPort = options.defaultPorts[i]; + break; + } + } + + if (defaultPort > -1) + { + // Force same type as urlObj.port + defaultPort = defaultPort.toString(); + + if (urlObj.port === null) + { + urlObj.port = defaultPort; + } + + urlObj.extra.portIsDefault = (urlObj.port === defaultPort); + } +} + + + +module.exports = parsePort; diff --git a/node_modules/relateurl/lib/parse/query.js b/node_modules/relateurl/lib/parse/query.js new file mode 100644 index 00000000..dbb85045 --- /dev/null +++ b/node_modules/relateurl/lib/parse/query.js @@ -0,0 +1,53 @@ +"use strict"; +var hasOwnProperty = Object.prototype.hasOwnProperty; + + + +function parseQuery(urlObj, options) +{ + urlObj.query.string.full = stringify(urlObj.query.object, false); + + // TWEAK :: condition only for speed optimization + if (options.removeEmptyQueries) + { + urlObj.query.string.stripped = stringify(urlObj.query.object, true); + } +} + + + +function stringify(queryObj, removeEmptyQueries) +{ + var count = 0; + var str = ""; + + for (var i in queryObj) + { + if ( i!=="" && hasOwnProperty.call(queryObj, i)===true ) + { + var value = queryObj[i]; + + if (value !== "" || !removeEmptyQueries) + { + str += (++count===1) ? "?" : "&"; + + i = encodeURIComponent(i); + + if (value !== "") + { + str += i +"="+ encodeURIComponent(value).replace(/%20/g,"+"); + } + else + { + str += i; + } + } + } + } + + return str; +} + + + +module.exports = parseQuery; diff --git a/node_modules/relateurl/lib/parse/urlstring.js b/node_modules/relateurl/lib/parse/urlstring.js new file mode 100644 index 00000000..ca4d7d43 --- /dev/null +++ b/node_modules/relateurl/lib/parse/urlstring.js @@ -0,0 +1,146 @@ +"use strict"; + +var _parseUrl = require("url").parse; + + + +/* + Customize the URL object that Node generates + because: + + * necessary data for later + * urlObj.host is useless + * urlObj.hostname is too long + * urlObj.path is useless + * urlObj.pathname is too long + * urlObj.protocol is inaccurate; should be called "scheme" + * urlObj.search is mostly useless +*/ +function clean(urlObj) +{ + var scheme = urlObj.protocol; + + if (scheme) + { + // Remove ":" suffix + if (scheme.indexOf(":") === scheme.length-1) + { + scheme = scheme.substr(0, scheme.length-1); + } + } + + urlObj.host = + { + // TODO :: unescape(encodeURIComponent(s)) ? ... http://ecmanaut.blogspot.ca/2006/07/encoding-decoding-utf8-in-javascript.html + full: urlObj.hostname, + stripped: null + }; + + urlObj.path = + { + absolute: + { + array: null, + string: urlObj.pathname + }, + relative: + { + array: null, + string: null + } + }; + + urlObj.query = + { + object: urlObj.query, + string: + { + full: null, + stripped: null + } + }; + + urlObj.extra = + { + hrefInfo: + { + minimumPathOnly: null, + minimumResourceOnly: null, + minimumQueryOnly: null, + minimumHashOnly: null, + empty: null, + + separatorOnlyQuery: urlObj.search==="?" + }, + portIsDefault: null, + relation: + { + maximumScheme: null, + maximumAuth: null, + maximumHost: null, + maximumPort: null, + maximumPath: null, + maximumResource: null, + maximumQuery: null, + maximumHash: null, + + minimumScheme: null, + minimumAuth: null, + minimumHost: null, + minimumPort: null, + minimumPath: null, + minimumResource: null, + minimumQuery: null, + minimumHash: null, + + overridesQuery: null + }, + resourceIsIndex: null, + slashes: urlObj.slashes + }; + + urlObj.resource = null; + urlObj.scheme = scheme; + delete urlObj.hostname; + delete urlObj.pathname; + delete urlObj.protocol; + delete urlObj.search; + delete urlObj.slashes; + + return urlObj; +} + + + +function validScheme(url, options) +{ + var valid = true; + + options.rejectedSchemes.every( function(rejectedScheme) + { + valid = !(url.indexOf(rejectedScheme+":") === 0); + + // Break loop + return valid; + }); + + return valid; +} + + + +function parseUrlString(url, options) +{ + if ( validScheme(url,options) ) + { + return clean( _parseUrl(url, true, options.slashesDenoteHost) ); + } + else + { + return {href:url, valid:false}; + } +} + + + +module.exports = parseUrlString; diff --git a/node_modules/relateurl/lib/relate/absolutize.js b/node_modules/relateurl/lib/relate/absolutize.js new file mode 100644 index 00000000..2b535a59 --- /dev/null +++ b/node_modules/relateurl/lib/relate/absolutize.js @@ -0,0 +1,89 @@ +"use strict"; + +var findRelation = require("./findRelation"); +var objUtils = require("../util/object"); +var pathUtils = require("../util/path"); + + + +function absolutize(urlObj, siteUrlObj, options) +{ + findRelation.upToPath(urlObj, siteUrlObj, options); + + // Fill in relative URLs + if (urlObj.extra.relation.minimumScheme) urlObj.scheme = siteUrlObj.scheme; + if (urlObj.extra.relation.minimumAuth) urlObj.auth = siteUrlObj.auth; + if (urlObj.extra.relation.minimumHost) urlObj.host = objUtils.clone(siteUrlObj.host); + if (urlObj.extra.relation.minimumPort) copyPort(urlObj, siteUrlObj); + if (urlObj.extra.relation.minimumScheme) copyPath(urlObj, siteUrlObj); + + // Check remaining relativeness now that path has been copied and/or resolved + findRelation.pathOn(urlObj, siteUrlObj, options); + + // Fill in relative URLs + if (urlObj.extra.relation.minimumResource) copyResource(urlObj, siteUrlObj); + if (urlObj.extra.relation.minimumQuery) urlObj.query = objUtils.clone(siteUrlObj.query); + if (urlObj.extra.relation.minimumHash) urlObj.hash = siteUrlObj.hash; +} + + + +/* + Get an absolute path that's relative to site url. +*/ +function copyPath(urlObj, siteUrlObj) +{ + if (urlObj.extra.relation.maximumHost || !urlObj.extra.hrefInfo.minimumResourceOnly) + { + var pathArray = urlObj.path.absolute.array; + var pathString = "/"; + + // If not erroneous URL + if (pathArray) + { + // If is relative path + if (urlObj.extra.hrefInfo.minimumPathOnly && urlObj.path.absolute.string.indexOf("/")!==0) + { + // Append path to site path + pathArray = siteUrlObj.path.absolute.array.concat(pathArray); + } + + pathArray = pathUtils.resolveDotSegments(pathArray); + pathString += pathUtils.join(pathArray); + } + else + { + pathArray = []; + } + + urlObj.path.absolute.array = pathArray; + urlObj.path.absolute.string = pathString; + } + else + { + // Resource-, query- or hash-only or empty + urlObj.path = objUtils.clone(siteUrlObj.path); + } +} + + + +function copyPort(urlObj, siteUrlObj) +{ + urlObj.port = siteUrlObj.port; + + urlObj.extra.portIsDefault = siteUrlObj.extra.portIsDefault; +} + + + +function copyResource(urlObj, siteUrlObj) +{ + urlObj.resource = siteUrlObj.resource; + + urlObj.extra.resourceIsIndex = siteUrlObj.extra.resourceIsIndex; +} + + + +module.exports = absolutize; diff --git a/node_modules/relateurl/lib/relate/findRelation.js b/node_modules/relateurl/lib/relate/findRelation.js new file mode 100644 index 00000000..c5423c3c --- /dev/null +++ b/node_modules/relateurl/lib/relate/findRelation.js @@ -0,0 +1,79 @@ +"use strict"; + +function findRelation_upToPath(urlObj, siteUrlObj, options) +{ + // Path- or root-relative URL + var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly; + + // Matching scheme, scheme-relative or path-only + var minimumScheme = (urlObj.scheme===siteUrlObj.scheme || !urlObj.scheme); + + // Matching auth, ignoring auth or path-only + var minimumAuth = minimumScheme && (urlObj.auth===siteUrlObj.auth || options.removeAuth || pathOnly); + + // Matching host or path-only + var www = options.ignore_www ? "stripped" : "full"; + var minimumHost = minimumAuth && (urlObj.host[www]===siteUrlObj.host[www] || pathOnly); + + // Matching port or path-only + var minimumPort = minimumHost && (urlObj.port===siteUrlObj.port || pathOnly); + + urlObj.extra.relation.minimumScheme = minimumScheme; + urlObj.extra.relation.minimumAuth = minimumAuth; + urlObj.extra.relation.minimumHost = minimumHost; + urlObj.extra.relation.minimumPort = minimumPort; + + urlObj.extra.relation.maximumScheme = !minimumScheme || minimumScheme && !minimumAuth; + urlObj.extra.relation.maximumAuth = !minimumScheme || minimumScheme && !minimumHost; + urlObj.extra.relation.maximumHost = !minimumScheme || minimumScheme && !minimumPort; +} + + + +function findRelation_pathOn(urlObj, siteUrlObj, options) +{ + var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly; + var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly; + var empty = urlObj.extra.hrefInfo.empty; // not required, but self-documenting + + // From upToPath() + var minimumPort = urlObj.extra.relation.minimumPort; + var minimumScheme = urlObj.extra.relation.minimumScheme; + + // Matching port and path + var minimumPath = minimumPort && urlObj.path.absolute.string===siteUrlObj.path.absolute.string; + + // Matching resource or query/hash-only or empty + var matchingResource = (urlObj.resource===siteUrlObj.resource || !urlObj.resource && siteUrlObj.extra.resourceIsIndex) || (options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex && !siteUrlObj.resource); + var minimumResource = minimumPath && (matchingResource || queryOnly || hashOnly || empty); + + // Matching query or hash-only/empty + var query = options.removeEmptyQueries ? "stripped" : "full"; + var urlQuery = urlObj.query.string[query]; + var siteUrlQuery = siteUrlObj.query.string[query]; + var minimumQuery = (minimumResource && !!urlQuery && urlQuery===siteUrlQuery) || ((hashOnly || empty) && !urlObj.extra.hrefInfo.separatorOnlyQuery); + + var minimumHash = minimumQuery && urlObj.hash===siteUrlObj.hash; + + urlObj.extra.relation.minimumPath = minimumPath; + urlObj.extra.relation.minimumResource = minimumResource; + urlObj.extra.relation.minimumQuery = minimumQuery; + urlObj.extra.relation.minimumHash = minimumHash; + + urlObj.extra.relation.maximumPort = !minimumScheme || minimumScheme && !minimumPath; + urlObj.extra.relation.maximumPath = !minimumScheme || minimumScheme && !minimumResource; + urlObj.extra.relation.maximumResource = !minimumScheme || minimumScheme && !minimumQuery; + urlObj.extra.relation.maximumQuery = !minimumScheme || minimumScheme && !minimumHash; + urlObj.extra.relation.maximumHash = !minimumScheme || minimumScheme && !minimumHash; // there's nothing after hash, so it's the same as maximumQuery + + // Matching path and/or resource with existing but non-matching site query + urlObj.extra.relation.overridesQuery = minimumPath && urlObj.extra.relation.maximumResource && !minimumQuery && !!siteUrlQuery; +} + + + +module.exports = +{ + pathOn: findRelation_pathOn, + upToPath: findRelation_upToPath +}; diff --git a/node_modules/relateurl/lib/relate/index.js b/node_modules/relateurl/lib/relate/index.js new file mode 100644 index 00000000..f9083818 --- /dev/null +++ b/node_modules/relateurl/lib/relate/index.js @@ -0,0 +1,18 @@ +"use strict"; + +var absolutize = require("./absolutize"); +var relativize = require("./relativize"); + + + +function relateUrl(siteUrlObj, urlObj, options) +{ + absolutize(urlObj, siteUrlObj, options); + relativize(urlObj, siteUrlObj, options); + + return urlObj; +} + + + +module.exports = relateUrl; diff --git a/node_modules/relateurl/lib/relate/relativize.js b/node_modules/relateurl/lib/relate/relativize.js new file mode 100644 index 00000000..9af9a101 --- /dev/null +++ b/node_modules/relateurl/lib/relate/relativize.js @@ -0,0 +1,67 @@ +"use strict"; + +var pathUtils = require("../util/path"); + + + +/* + Get a path relative to the site path. +*/ +function relatePath(absolutePath, siteAbsolutePath) +{ + var relativePath = []; + + // At this point, it's related to the host/port + var related = true; + var parentIndex = -1; + + // Find parents + siteAbsolutePath.forEach( function(siteAbsoluteDir, i) + { + if (related) + { + if (absolutePath[i] !== siteAbsoluteDir) + { + related = false; + } + else + { + parentIndex = i; + } + } + + if (!related) + { + // Up one level + relativePath.push(".."); + } + }); + + // Form path + absolutePath.forEach( function(dir, i) + { + if (i > parentIndex) + { + relativePath.push(dir); + } + }); + + return relativePath; +} + + + +function relativize(urlObj, siteUrlObj, options) +{ + if (urlObj.extra.relation.minimumScheme) + { + var pathArray = relatePath(urlObj.path.absolute.array, siteUrlObj.path.absolute.array); + + urlObj.path.relative.array = pathArray; + urlObj.path.relative.string = pathUtils.join(pathArray); + } +} + + + +module.exports = relativize; diff --git a/node_modules/relateurl/lib/util/devlog.js b/node_modules/relateurl/lib/util/devlog.js new file mode 100644 index 00000000..086bdc94 --- /dev/null +++ b/node_modules/relateurl/lib/util/devlog.js @@ -0,0 +1,25 @@ +"use strict"; + +var inspect = require("util").inspect; + + + +function log(data) +{ + console.log( inspect(data, {depth:null, colors:true}) ); +} + + + +function logAll(data) +{ + console.log( inspect(data, {depth:null, showHidden:true, colors:true}) ); +} + + + +module.exports = +{ + log: log, + logAll: logAll +}; diff --git a/node_modules/relateurl/lib/util/object.js b/node_modules/relateurl/lib/util/object.js new file mode 100644 index 00000000..8eab7940 --- /dev/null +++ b/node_modules/relateurl/lib/util/object.js @@ -0,0 +1,64 @@ +"use strict"; + +/* + Deep-clone an object. +*/ +function clone(obj) +{ + if (obj instanceof Object) + { + var clonedObj = (obj instanceof Array) ? [] : {}; + + for (var i in obj) + { + if ( obj.hasOwnProperty(i) ) + { + clonedObj[i] = clone( obj[i] ); + } + } + + return clonedObj; + } + + return obj; +} + + + +/* + https://github.com/jonschlinkert/is-plain-object +*/ +function isPlainObject(obj) +{ + return !!obj && typeof obj==="object" && obj.constructor===Object; +} + + + +/* + Shallow-merge two objects. +*/ +function shallowMerge(target, source) +{ + if (target instanceof Object && source instanceof Object) + { + for (var i in source) + { + if ( source.hasOwnProperty(i) ) + { + target[i] = source[i]; + } + } + } + + return target; +} + + + +module.exports = +{ + clone: clone, + isPlainObject: isPlainObject, + shallowMerge: shallowMerge +}; diff --git a/node_modules/relateurl/lib/util/path.js b/node_modules/relateurl/lib/util/path.js new file mode 100644 index 00000000..f1e9d119 --- /dev/null +++ b/node_modules/relateurl/lib/util/path.js @@ -0,0 +1,49 @@ +"use strict"; + +function joinPath(pathArray) +{ + if (pathArray.length > 0) + { + return pathArray.join("/") + "/"; + } + else + { + return ""; + } +} + + + +function resolveDotSegments(pathArray) +{ + var pathAbsolute = []; + + pathArray.forEach( function(dir) + { + if (dir !== "..") + { + if (dir !== ".") + { + pathAbsolute.push(dir); + } + } + else + { + // Remove parent + if (pathAbsolute.length > 0) + { + pathAbsolute.splice(pathAbsolute.length-1, 1); + } + } + }); + + return pathAbsolute; +} + + + +module.exports = +{ + join: joinPath, + resolveDotSegments: resolveDotSegments +}; diff --git a/node_modules/relateurl/license b/node_modules/relateurl/license new file mode 100644 index 00000000..b760007a --- /dev/null +++ b/node_modules/relateurl/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Steven Vachon (svachon.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/relateurl/package.json b/node_modules/relateurl/package.json new file mode 100644 index 00000000..f4b236a7 --- /dev/null +++ b/node_modules/relateurl/package.json @@ -0,0 +1,46 @@ +{ + "name": "relateurl", + "description": "Minify URLs by converting them from absolute to relative.", + "version": "0.2.7", + "license": "MIT", + "homepage": "https://github.com/stevenvachon/relateurl", + "author": { + "name": "Steven Vachon", + "email": "contact@svachon.com", + "url": "http://www.svachon.com/" + }, + "main": "lib", + "repository": { + "type": "git", + "url": "git://github.com/stevenvachon/relateurl.git" + }, + "bugs": { + "url": "https://github.com/stevenvachon/relateurl/issues" + }, + "devDependencies": { + "browserify": "^13.0.1", + "chai": "^3.5.0", + "mocha": "^2.5.3", + "uglify-js": "^2.7.0" + }, + "engines": { + "node": ">= 0.10" + }, + "scripts": { + "browserify": "browserify lib/ --standalone RelateUrl | uglifyjs --compress --mangle -o relateurl-browser.js", + "test": "mocha test/ --bail --reporter spec --check-leaks" + }, + "files": [ + "lib", + "license" + ], + "keywords": [ + "uri", + "url", + "minifier", + "minify", + "lint", + "relative", + "absolute" + ] +} 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/lib/auth.js b/node_modules/request/lib/auth.js new file mode 100644 index 00000000..02f20386 --- /dev/null +++ b/node_modules/request/lib/auth.js @@ -0,0 +1,167 @@ +'use strict' + +var caseless = require('caseless') +var uuid = require('uuid/v4') +var helpers = require('./helpers') + +var md5 = helpers.md5 +var toBase64 = helpers.toBase64 + +function Auth (request) { + // define all public properties here + this.request = request + this.hasAuth = false + this.sentAuth = false + this.bearerToken = null + this.user = null + this.pass = null +} + +Auth.prototype.basic = function (user, pass, sendImmediately) { + var self = this + if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { + self.request.emit('error', new Error('auth() received invalid user or password')) + } + self.user = user + self.pass = pass + self.hasAuth = true + var header = user + ':' + (pass || '') + if (sendImmediately || typeof sendImmediately === 'undefined') { + var authHeader = 'Basic ' + toBase64(header) + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.bearer = function (bearer, sendImmediately) { + var self = this + self.bearerToken = bearer + self.hasAuth = true + if (sendImmediately || typeof sendImmediately === 'undefined') { + if (typeof bearer === 'function') { + bearer = bearer() + } + var authHeader = 'Bearer ' + (bearer || '') + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.digest = function (method, path, authHeader) { + // TODO: More complete implementation of RFC 2617. + // - handle challenge.domain + // - support qop="auth-int" only + // - handle Authentication-Info (not necessarily?) + // - check challenge.stale (not necessarily?) + // - increase nc (not necessarily?) + // For reference: + // http://tools.ietf.org/html/rfc2617#section-3 + // https://github.com/bagder/curl/blob/master/lib/http_digest.c + + var self = this + + var challenge = {} + var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi + while (true) { + var match = re.exec(authHeader) + if (!match) { + break + } + challenge[match[1]] = match[2] || match[3] + } + + /** + * RFC 2617: handle both MD5 and MD5-sess algorithms. + * + * If the algorithm directive's value is "MD5" or unspecified, then HA1 is + * HA1=MD5(username:realm:password) + * If the algorithm directive's value is "MD5-sess", then HA1 is + * HA1=MD5(MD5(username:realm:password):nonce:cnonce) + */ + var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) { + var ha1 = md5(user + ':' + realm + ':' + pass) + if (algorithm && algorithm.toLowerCase() === 'md5-sess') { + return md5(ha1 + ':' + nonce + ':' + cnonce) + } else { + return ha1 + } + } + + var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' + var nc = qop && '00000001' + var cnonce = qop && uuid().replace(/-/g, '') + var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce) + var ha2 = md5(method + ':' + path) + var digestResponse = qop + ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) + : md5(ha1 + ':' + challenge.nonce + ':' + ha2) + var authValues = { + username: self.user, + realm: challenge.realm, + nonce: challenge.nonce, + uri: path, + qop: qop, + response: digestResponse, + nc: nc, + cnonce: cnonce, + algorithm: challenge.algorithm, + opaque: challenge.opaque + } + + authHeader = [] + for (var k in authValues) { + if (authValues[k]) { + if (k === 'qop' || k === 'nc' || k === 'algorithm') { + authHeader.push(k + '=' + authValues[k]) + } else { + authHeader.push(k + '="' + authValues[k] + '"') + } + } + } + authHeader = 'Digest ' + authHeader.join(', ') + self.sentAuth = true + return authHeader +} + +Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) { + var self = this + var request = self.request + + var authHeader + if (bearer === undefined && user === undefined) { + self.request.emit('error', new Error('no auth mechanism defined')) + } else if (bearer !== undefined) { + authHeader = self.bearer(bearer, sendImmediately) + } else { + authHeader = self.basic(user, pass, sendImmediately) + } + if (authHeader) { + request.setHeader('authorization', authHeader) + } +} + +Auth.prototype.onResponse = function (response) { + var self = this + var request = self.request + + if (!self.hasAuth || self.sentAuth) { return null } + + var c = caseless(response.headers) + + var authHeader = c.get('www-authenticate') + var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() + request.debug('reauth', authVerb) + + switch (authVerb) { + case 'basic': + return self.basic(self.user, self.pass, true) + + case 'bearer': + return self.bearer(self.bearerToken, true) + + case 'digest': + return self.digest(request.method, request.path, authHeader) + } +} + +exports.Auth = Auth diff --git a/node_modules/request/lib/cookies.js b/node_modules/request/lib/cookies.js new file mode 100644 index 00000000..bd5d46be --- /dev/null +++ b/node_modules/request/lib/cookies.js @@ -0,0 +1,38 @@ +'use strict' + +var tough = require('tough-cookie') + +var Cookie = tough.Cookie +var CookieJar = tough.CookieJar + +exports.parse = function (str) { + if (str && str.uri) { + str = str.uri + } + if (typeof str !== 'string') { + throw new Error('The cookie function only accepts STRING as param') + } + return Cookie.parse(str, {loose: true}) +} + +// Adapt the sometimes-Async api of tough.CookieJar to our requirements +function RequestJar (store) { + var self = this + self._jar = new CookieJar(store, {looseMode: true}) +} +RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) { + var self = this + return self._jar.setCookieSync(cookieOrStr, uri, options || {}) +} +RequestJar.prototype.getCookieString = function (uri) { + var self = this + return self._jar.getCookieStringSync(uri) +} +RequestJar.prototype.getCookies = function (uri) { + var self = this + return self._jar.getCookiesSync(uri) +} + +exports.jar = function (store) { + return new RequestJar(store) +} diff --git a/node_modules/request/lib/getProxyFromURI.js b/node_modules/request/lib/getProxyFromURI.js new file mode 100644 index 00000000..0b9b18e5 --- /dev/null +++ b/node_modules/request/lib/getProxyFromURI.js @@ -0,0 +1,79 @@ +'use strict' + +function formatHostname (hostname) { + // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' + return hostname.replace(/^\.*/, '.').toLowerCase() +} + +function parseNoProxyZone (zone) { + zone = zone.trim().toLowerCase() + + var zoneParts = zone.split(':', 2) + var zoneHost = formatHostname(zoneParts[0]) + var zonePort = zoneParts[1] + var hasPort = zone.indexOf(':') > -1 + + return {hostname: zoneHost, port: zonePort, hasPort: hasPort} +} + +function uriInNoProxy (uri, noProxy) { + var port = uri.port || (uri.protocol === 'https:' ? '443' : '80') + var hostname = formatHostname(uri.hostname) + var noProxyList = noProxy.split(',') + + // iterate through the noProxyList until it finds a match. + return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { + var isMatchedAt = hostname.indexOf(noProxyZone.hostname) + var hostnameMatched = ( + isMatchedAt > -1 && + (isMatchedAt === hostname.length - noProxyZone.hostname.length) + ) + + if (noProxyZone.hasPort) { + return (port === noProxyZone.port) && hostnameMatched + } + + return hostnameMatched + }) +} + +function getProxyFromURI (uri) { + // Decide the proper request proxy to use based on the request URI object and the + // environmental variables (NO_PROXY, HTTP_PROXY, etc.) + // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html) + + var noProxy = process.env.NO_PROXY || process.env.no_proxy || '' + + // if the noProxy is a wildcard then return null + + if (noProxy === '*') { + return null + } + + // if the noProxy is not empty and the uri is found return null + + if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { + return null + } + + // Check for HTTP or HTTPS Proxy in environment Else default to null + + if (uri.protocol === 'http:') { + return process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + if (uri.protocol === 'https:') { + return process.env.HTTPS_PROXY || + process.env.https_proxy || + process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + // if none of that works, return null + // (What uri protocol are you using then?) + + return null +} + +module.exports = getProxyFromURI diff --git a/node_modules/request/lib/har.js b/node_modules/request/lib/har.js new file mode 100644 index 00000000..0dedee44 --- /dev/null +++ b/node_modules/request/lib/har.js @@ -0,0 +1,205 @@ +'use strict' + +var fs = require('fs') +var qs = require('querystring') +var validate = require('har-validator') +var extend = require('extend') + +function Har (request) { + this.request = request +} + +Har.prototype.reducer = function (obj, pair) { + // new property ? + if (obj[pair.name] === undefined) { + obj[pair.name] = pair.value + return obj + } + + // existing? convert to array + var arr = [ + obj[pair.name], + pair.value + ] + + obj[pair.name] = arr + + return obj +} + +Har.prototype.prep = function (data) { + // construct utility properties + data.queryObj = {} + data.headersObj = {} + data.postData.jsonObj = false + data.postData.paramsObj = false + + // construct query objects + if (data.queryString && data.queryString.length) { + data.queryObj = data.queryString.reduce(this.reducer, {}) + } + + // construct headers objects + if (data.headers && data.headers.length) { + // loweCase header keys + data.headersObj = data.headers.reduceRight(function (headers, header) { + headers[header.name] = header.value + return headers + }, {}) + } + + // construct Cookie header + if (data.cookies && data.cookies.length) { + var cookies = data.cookies.map(function (cookie) { + return cookie.name + '=' + cookie.value + }) + + if (cookies.length) { + data.headersObj.cookie = cookies.join('; ') + } + } + + // prep body + function some (arr) { + return arr.some(function (type) { + return data.postData.mimeType.indexOf(type) === 0 + }) + } + + if (some([ + 'multipart/mixed', + 'multipart/related', + 'multipart/form-data', + 'multipart/alternative'])) { + // reset values + data.postData.mimeType = 'multipart/form-data' + } else if (some([ + 'application/x-www-form-urlencoded'])) { + if (!data.postData.params) { + data.postData.text = '' + } else { + data.postData.paramsObj = data.postData.params.reduce(this.reducer, {}) + + // always overwrite + data.postData.text = qs.stringify(data.postData.paramsObj) + } + } else if (some([ + 'text/json', + 'text/x-json', + 'application/json', + 'application/x-json'])) { + data.postData.mimeType = 'application/json' + + if (data.postData.text) { + try { + data.postData.jsonObj = JSON.parse(data.postData.text) + } catch (e) { + this.request.debug(e) + + // force back to text/plain + data.postData.mimeType = 'text/plain' + } + } + } + + return data +} + +Har.prototype.options = function (options) { + // skip if no har property defined + if (!options.har) { + return options + } + + var har = {} + extend(har, options.har) + + // only process the first entry + if (har.log && har.log.entries) { + har = har.log.entries[0] + } + + // add optional properties to make validation successful + har.url = har.url || options.url || options.uri || options.baseUrl || '/' + har.httpVersion = har.httpVersion || 'HTTP/1.1' + har.queryString = har.queryString || [] + har.headers = har.headers || [] + har.cookies = har.cookies || [] + har.postData = har.postData || {} + har.postData.mimeType = har.postData.mimeType || 'application/octet-stream' + + har.bodySize = 0 + har.headersSize = 0 + har.postData.size = 0 + + if (!validate.request(har)) { + return options + } + + // clean up and get some utility properties + var req = this.prep(har) + + // construct new options + if (req.url) { + options.url = req.url + } + + if (req.method) { + options.method = req.method + } + + if (Object.keys(req.queryObj).length) { + options.qs = req.queryObj + } + + if (Object.keys(req.headersObj).length) { + options.headers = req.headersObj + } + + function test (type) { + return req.postData.mimeType.indexOf(type) === 0 + } + if (test('application/x-www-form-urlencoded')) { + options.form = req.postData.paramsObj + } else if (test('application/json')) { + if (req.postData.jsonObj) { + options.body = req.postData.jsonObj + options.json = true + } + } else if (test('multipart/form-data')) { + options.formData = {} + + req.postData.params.forEach(function (param) { + var attachment = {} + + if (!param.fileName && !param.contentType) { + options.formData[param.name] = param.value + return + } + + // attempt to read from disk! + if (param.fileName && !param.value) { + attachment.value = fs.createReadStream(param.fileName) + } else if (param.value) { + attachment.value = param.value + } + + if (param.fileName) { + attachment.options = { + filename: param.fileName, + contentType: param.contentType ? param.contentType : null + } + } + + options.formData[param.name] = attachment + }) + } else { + if (req.postData.text) { + options.body = req.postData.text + } + } + + return options +} + +exports.Har = Har diff --git a/node_modules/request/lib/hawk.js b/node_modules/request/lib/hawk.js new file mode 100644 index 00000000..de48a985 --- /dev/null +++ b/node_modules/request/lib/hawk.js @@ -0,0 +1,89 @@ +'use strict' + +var crypto = require('crypto') + +function randomString (size) { + var bits = (size + 1) * 6 + var buffer = crypto.randomBytes(Math.ceil(bits / 8)) + var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') + return string.slice(0, size) +} + +function calculatePayloadHash (payload, algorithm, contentType) { + var hash = crypto.createHash(algorithm) + hash.update('hawk.1.payload\n') + hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\n') + hash.update(payload || '') + hash.update('\n') + return hash.digest('base64') +} + +exports.calculateMac = function (credentials, opts) { + var normalized = 'hawk.1.header\n' + + opts.ts + '\n' + + opts.nonce + '\n' + + (opts.method || '').toUpperCase() + '\n' + + opts.resource + '\n' + + opts.host.toLowerCase() + '\n' + + opts.port + '\n' + + (opts.hash || '') + '\n' + + if (opts.ext) { + normalized = normalized + opts.ext.replace('\\', '\\\\').replace('\n', '\\n') + } + + normalized = normalized + '\n' + + if (opts.app) { + normalized = normalized + opts.app + '\n' + (opts.dlg || '') + '\n' + } + + var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized) + var digest = hmac.digest('base64') + return digest +} + +exports.header = function (uri, method, opts) { + var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000) + var credentials = opts.credentials + if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) { + return '' + } + + if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) { + return '' + } + + var artifacts = { + ts: timestamp, + nonce: opts.nonce || randomString(6), + method: method, + resource: uri.pathname + (uri.search || ''), + host: uri.hostname, + port: uri.port || (uri.protocol === 'http:' ? 80 : 443), + hash: opts.hash, + ext: opts.ext, + app: opts.app, + dlg: opts.dlg + } + + if (!artifacts.hash && (opts.payload || opts.payload === '')) { + artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType) + } + + var mac = exports.calculateMac(credentials, artifacts) + + var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '' + var header = 'Hawk id="' + credentials.id + + '", ts="' + artifacts.ts + + '", nonce="' + artifacts.nonce + + (artifacts.hash ? '", hash="' + artifacts.hash : '') + + (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : '') + + '", mac="' + mac + '"' + + if (artifacts.app) { + header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"' + } + + return header +} diff --git a/node_modules/request/lib/helpers.js b/node_modules/request/lib/helpers.js new file mode 100644 index 00000000..8b2a7e6e --- /dev/null +++ b/node_modules/request/lib/helpers.js @@ -0,0 +1,66 @@ +'use strict' + +var jsonSafeStringify = require('json-stringify-safe') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +var defer = typeof setImmediate === 'undefined' + ? process.nextTick + : setImmediate + +function paramsHaveRequestBody (params) { + return ( + params.body || + params.requestBodyStream || + (params.json && typeof params.json !== 'boolean') || + params.multipart + ) +} + +function safeStringify (obj, replacer) { + var ret + try { + ret = JSON.stringify(obj, replacer) + } catch (e) { + ret = jsonSafeStringify(obj, replacer) + } + return ret +} + +function md5 (str) { + return crypto.createHash('md5').update(str).digest('hex') +} + +function isReadStream (rs) { + return rs.readable && rs.path && rs.mode +} + +function toBase64 (str) { + return Buffer.from(str || '', 'utf8').toString('base64') +} + +function copy (obj) { + var o = {} + Object.keys(obj).forEach(function (i) { + o[i] = obj[i] + }) + return o +} + +function version () { + var numbers = process.version.replace('v', '').split('.') + return { + major: parseInt(numbers[0], 10), + minor: parseInt(numbers[1], 10), + patch: parseInt(numbers[2], 10) + } +} + +exports.paramsHaveRequestBody = paramsHaveRequestBody +exports.safeStringify = safeStringify +exports.md5 = md5 +exports.isReadStream = isReadStream +exports.toBase64 = toBase64 +exports.copy = copy +exports.version = version +exports.defer = defer diff --git a/node_modules/request/lib/multipart.js b/node_modules/request/lib/multipart.js new file mode 100644 index 00000000..6a009bc1 --- /dev/null +++ b/node_modules/request/lib/multipart.js @@ -0,0 +1,112 @@ +'use strict' + +var uuid = require('uuid/v4') +var CombinedStream = require('combined-stream') +var isstream = require('isstream') +var Buffer = require('safe-buffer').Buffer + +function Multipart (request) { + this.request = request + this.boundary = uuid() + this.chunked = false + this.body = null +} + +Multipart.prototype.isChunked = function (options) { + var self = this + var chunked = false + var parts = options.data || options + + if (!parts.forEach) { + self.request.emit('error', new Error('Argument error, options.multipart.')) + } + + if (options.chunked !== undefined) { + chunked = options.chunked + } + + if (self.request.getHeader('transfer-encoding') === 'chunked') { + chunked = true + } + + if (!chunked) { + parts.forEach(function (part) { + if (typeof part.body === 'undefined') { + self.request.emit('error', new Error('Body attribute missing in multipart.')) + } + if (isstream(part.body)) { + chunked = true + } + }) + } + + return chunked +} + +Multipart.prototype.setHeaders = function (chunked) { + var self = this + + if (chunked && !self.request.hasHeader('transfer-encoding')) { + self.request.setHeader('transfer-encoding', 'chunked') + } + + var header = self.request.getHeader('content-type') + + if (!header || header.indexOf('multipart') === -1) { + self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) + } else { + if (header.indexOf('boundary') !== -1) { + self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1') + } else { + self.request.setHeader('content-type', header + '; boundary=' + self.boundary) + } + } +} + +Multipart.prototype.build = function (parts, chunked) { + var self = this + var body = chunked ? new CombinedStream() : [] + + function add (part) { + if (typeof part === 'number') { + part = part.toString() + } + return chunked ? body.append(part) : body.push(Buffer.from(part)) + } + + if (self.request.preambleCRLF) { + add('\r\n') + } + + parts.forEach(function (part) { + var preamble = '--' + self.boundary + '\r\n' + Object.keys(part).forEach(function (key) { + if (key === 'body') { return } + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n' + add(preamble) + add(part.body) + add('\r\n') + }) + add('--' + self.boundary + '--') + + if (self.request.postambleCRLF) { + add('\r\n') + } + + return body +} + +Multipart.prototype.onRequest = function (options) { + var self = this + + var chunked = self.isChunked(options) + var parts = options.data || options + + self.setHeaders(chunked) + self.chunked = chunked + self.body = self.build(parts, chunked) +} + +exports.Multipart = Multipart diff --git a/node_modules/request/lib/oauth.js b/node_modules/request/lib/oauth.js new file mode 100644 index 00000000..96de72b8 --- /dev/null +++ b/node_modules/request/lib/oauth.js @@ -0,0 +1,148 @@ +'use strict' + +var url = require('url') +var qs = require('qs') +var caseless = require('caseless') +var uuid = require('uuid/v4') +var oauth = require('oauth-sign') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +function OAuth (request) { + this.request = request + this.params = null +} + +OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) { + var oa = {} + for (var i in _oauth) { + oa['oauth_' + i] = _oauth[i] + } + if (!oa.oauth_version) { + oa.oauth_version = '1.0' + } + if (!oa.oauth_timestamp) { + oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString() + } + if (!oa.oauth_nonce) { + oa.oauth_nonce = uuid().replace(/-/g, '') + } + if (!oa.oauth_signature_method) { + oa.oauth_signature_method = 'HMAC-SHA1' + } + + var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase + delete oa.oauth_consumer_secret + delete oa.oauth_private_key + + var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase + delete oa.oauth_token_secret + + var realm = oa.oauth_realm + delete oa.oauth_realm + delete oa.oauth_transport_method + + var baseurl = uri.protocol + '//' + uri.host + uri.pathname + var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&')) + + oa.oauth_signature = oauth.sign( + oa.oauth_signature_method, + method, + baseurl, + params, + consumer_secret_or_private_key, // eslint-disable-line camelcase + token_secret // eslint-disable-line camelcase + ) + + if (realm) { + oa.realm = realm + } + + return oa +} + +OAuth.prototype.buildBodyHash = function (_oauth, body) { + if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) { + this.request.emit('error', new Error('oauth: ' + _oauth.signature_method + + ' signature_method not supported with body_hash signing.')) + } + + var shasum = crypto.createHash('sha1') + shasum.update(body || '') + var sha1 = shasum.digest('hex') + + return Buffer.from(sha1, 'hex').toString('base64') +} + +OAuth.prototype.concatParams = function (oa, sep, wrap) { + wrap = wrap || '' + + var params = Object.keys(oa).filter(function (i) { + return i !== 'realm' && i !== 'oauth_signature' + }).sort() + + if (oa.realm) { + params.splice(0, 0, 'realm') + } + params.push('oauth_signature') + + return params.map(function (i) { + return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap + }).join(sep) +} + +OAuth.prototype.onRequest = function (_oauth) { + var self = this + self.params = _oauth + + var uri = self.request.uri || {} + var method = self.request.method || '' + var headers = caseless(self.request.headers) + var body = self.request.body || '' + var qsLib = self.request.qsLib || qs + + var form + var query + var contentType = headers.get('content-type') || '' + var formContentType = 'application/x-www-form-urlencoded' + var transport = _oauth.transport_method || 'header' + + if (contentType.slice(0, formContentType.length) === formContentType) { + contentType = formContentType + form = body + } + if (uri.query) { + query = uri.query + } + if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) { + self.request.emit('error', new Error('oauth: transport_method of body requires POST ' + + 'and content-type ' + formContentType)) + } + + if (!form && typeof _oauth.body_hash === 'boolean') { + _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString()) + } + + var oa = self.buildParams(_oauth, uri, method, query, form, qsLib) + + switch (transport) { + case 'header': + self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"')) + break + + case 'query': + var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&') + self.request.uri = url.parse(href) + self.request.path = self.request.uri.path + break + + case 'body': + self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&') + break + + default: + self.request.emit('error', new Error('oauth: transport_method invalid')) + } +} + +exports.OAuth = OAuth diff --git a/node_modules/request/lib/querystring.js b/node_modules/request/lib/querystring.js new file mode 100644 index 00000000..4a32cd14 --- /dev/null +++ b/node_modules/request/lib/querystring.js @@ -0,0 +1,50 @@ +'use strict' + +var qs = require('qs') +var querystring = require('querystring') + +function Querystring (request) { + this.request = request + this.lib = null + this.useQuerystring = null + this.parseOptions = null + this.stringifyOptions = null +} + +Querystring.prototype.init = function (options) { + if (this.lib) { return } + + this.useQuerystring = options.useQuerystring + this.lib = (this.useQuerystring ? querystring : qs) + + this.parseOptions = options.qsParseOptions || {} + this.stringifyOptions = options.qsStringifyOptions || {} +} + +Querystring.prototype.stringify = function (obj) { + return (this.useQuerystring) + ? this.rfc3986(this.lib.stringify(obj, + this.stringifyOptions.sep || null, + this.stringifyOptions.eq || null, + this.stringifyOptions)) + : this.lib.stringify(obj, this.stringifyOptions) +} + +Querystring.prototype.parse = function (str) { + return (this.useQuerystring) + ? this.lib.parse(str, + this.parseOptions.sep || null, + this.parseOptions.eq || null, + this.parseOptions) + : this.lib.parse(str, this.parseOptions) +} + +Querystring.prototype.rfc3986 = function (str) { + return str.replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +Querystring.prototype.unescape = querystring.unescape + +exports.Querystring = Querystring diff --git a/node_modules/request/lib/redirect.js b/node_modules/request/lib/redirect.js new file mode 100644 index 00000000..b9150e77 --- /dev/null +++ b/node_modules/request/lib/redirect.js @@ -0,0 +1,154 @@ +'use strict' + +var url = require('url') +var isUrl = /^https?:/ + +function Redirect (request) { + this.request = request + this.followRedirect = true + this.followRedirects = true + this.followAllRedirects = false + this.followOriginalHttpMethod = false + this.allowRedirect = function () { return true } + this.maxRedirects = 10 + this.redirects = [] + this.redirectsFollowed = 0 + this.removeRefererHeader = false +} + +Redirect.prototype.onRequest = function (options) { + var self = this + + if (options.maxRedirects !== undefined) { + self.maxRedirects = options.maxRedirects + } + if (typeof options.followRedirect === 'function') { + self.allowRedirect = options.followRedirect + } + if (options.followRedirect !== undefined) { + self.followRedirects = !!options.followRedirect + } + if (options.followAllRedirects !== undefined) { + self.followAllRedirects = options.followAllRedirects + } + if (self.followRedirects || self.followAllRedirects) { + self.redirects = self.redirects || [] + } + if (options.removeRefererHeader !== undefined) { + self.removeRefererHeader = options.removeRefererHeader + } + if (options.followOriginalHttpMethod !== undefined) { + self.followOriginalHttpMethod = options.followOriginalHttpMethod + } +} + +Redirect.prototype.redirectTo = function (response) { + var self = this + var request = self.request + + var redirectTo = null + if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { + var location = response.caseless.get('location') + request.debug('redirect', location) + + if (self.followAllRedirects) { + redirectTo = location + } else if (self.followRedirects) { + switch (request.method) { + case 'PATCH': + case 'PUT': + case 'POST': + case 'DELETE': + // Do not follow redirects + break + default: + redirectTo = location + break + } + } + } else if (response.statusCode === 401) { + var authHeader = request._auth.onResponse(response) + if (authHeader) { + request.setHeader('authorization', authHeader) + redirectTo = request.uri + } + } + return redirectTo +} + +Redirect.prototype.onResponse = function (response) { + var self = this + var request = self.request + + var redirectTo = self.redirectTo(response) + if (!redirectTo || !self.allowRedirect.call(request, response)) { + return false + } + + request.debug('redirect to', redirectTo) + + // ignore any potential response body. it cannot possibly be useful + // to us at this point. + // response.resume should be defined, but check anyway before calling. Workaround for browserify. + if (response.resume) { + response.resume() + } + + if (self.redirectsFollowed >= self.maxRedirects) { + request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href)) + return false + } + self.redirectsFollowed += 1 + + if (!isUrl.test(redirectTo)) { + redirectTo = url.resolve(request.uri.href, redirectTo) + } + + var uriPrev = request.uri + request.uri = url.parse(redirectTo) + + // handle the case where we change protocol from https to http or vice versa + if (request.uri.protocol !== uriPrev.protocol) { + delete request.agent + } + + self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }) + + if (self.followAllRedirects && request.method !== 'HEAD' && + response.statusCode !== 401 && response.statusCode !== 307) { + request.method = self.followOriginalHttpMethod ? request.method : 'GET' + } + // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215 + delete request.src + delete request.req + delete request._started + if (response.statusCode !== 401 && response.statusCode !== 307) { + // Remove parameters from the previous response, unless this is the second request + // for a server that requires digest authentication. + delete request.body + delete request._form + if (request.headers) { + request.removeHeader('host') + request.removeHeader('content-type') + request.removeHeader('content-length') + if (request.uri.hostname !== request.originalHost.split(':')[0]) { + // Remove authorization if changing hostnames (but not if just + // changing ports or protocols). This matches the behavior of curl: + // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710 + request.removeHeader('authorization') + } + } + } + + if (!self.removeRefererHeader) { + request.setHeader('referer', uriPrev.href) + } + + request.emit('redirect') + + request.init() + + return true +} + +exports.Redirect = Redirect diff --git a/node_modules/request/lib/tunnel.js b/node_modules/request/lib/tunnel.js new file mode 100644 index 00000000..4479003f --- /dev/null +++ b/node_modules/request/lib/tunnel.js @@ -0,0 +1,175 @@ +'use strict' + +var url = require('url') +var tunnel = require('tunnel-agent') + +var defaultProxyHeaderWhiteList = [ + 'accept', + 'accept-charset', + 'accept-encoding', + 'accept-language', + 'accept-ranges', + 'cache-control', + 'content-encoding', + 'content-language', + 'content-location', + 'content-md5', + 'content-range', + 'content-type', + 'connection', + 'date', + 'expect', + 'max-forwards', + 'pragma', + 'referer', + 'te', + 'user-agent', + 'via' +] + +var defaultProxyHeaderExclusiveList = [ + 'proxy-authorization' +] + +function constructProxyHost (uriObject) { + var port = uriObject.port + var protocol = uriObject.protocol + var proxyHost = uriObject.hostname + ':' + + if (port) { + proxyHost += port + } else if (protocol === 'https:') { + proxyHost += '443' + } else { + proxyHost += '80' + } + + return proxyHost +} + +function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) { + var whiteList = proxyHeaderWhiteList + .reduce(function (set, header) { + set[header.toLowerCase()] = true + return set + }, {}) + + return Object.keys(headers) + .filter(function (header) { + return whiteList[header.toLowerCase()] + }) + .reduce(function (set, header) { + set[header] = headers[header] + return set + }, {}) +} + +function constructTunnelOptions (request, proxyHeaders) { + var proxy = request.proxy + + var tunnelOptions = { + proxy: { + host: proxy.hostname, + port: +proxy.port, + proxyAuth: proxy.auth, + headers: proxyHeaders + }, + headers: request.headers, + ca: request.ca, + cert: request.cert, + key: request.key, + passphrase: request.passphrase, + pfx: request.pfx, + ciphers: request.ciphers, + rejectUnauthorized: request.rejectUnauthorized, + secureOptions: request.secureOptions, + secureProtocol: request.secureProtocol + } + + return tunnelOptions +} + +function constructTunnelFnName (uri, proxy) { + var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http') + var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http') + return [uriProtocol, proxyProtocol].join('Over') +} + +function getTunnelFn (request) { + var uri = request.uri + var proxy = request.proxy + var tunnelFnName = constructTunnelFnName(uri, proxy) + return tunnel[tunnelFnName] +} + +function Tunnel (request) { + this.request = request + this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList + this.proxyHeaderExclusiveList = [] + if (typeof request.tunnel !== 'undefined') { + this.tunnelOverride = request.tunnel + } +} + +Tunnel.prototype.isEnabled = function () { + var self = this + var request = self.request + // Tunnel HTTPS by default. Allow the user to override this setting. + + // If self.tunnelOverride is set (the user specified a value), use it. + if (typeof self.tunnelOverride !== 'undefined') { + return self.tunnelOverride + } + + // If the destination is HTTPS, tunnel. + if (request.uri.protocol === 'https:') { + return true + } + + // Otherwise, do not use tunnel. + return false +} + +Tunnel.prototype.setup = function (options) { + var self = this + var request = self.request + + options = options || {} + + if (typeof request.proxy === 'string') { + request.proxy = url.parse(request.proxy) + } + + if (!request.proxy || !request.tunnel) { + return false + } + + // Setup Proxy Header Exclusive List and White List + if (options.proxyHeaderWhiteList) { + self.proxyHeaderWhiteList = options.proxyHeaderWhiteList + } + if (options.proxyHeaderExclusiveList) { + self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList + } + + var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) + var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) + + // Setup Proxy Headers and Proxy Headers Host + // Only send the Proxy White Listed Header names + var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList) + proxyHeaders.host = constructProxyHost(request.uri) + + proxyHeaderExclusiveList.forEach(request.removeHeader, request) + + // Set Agent from Tunnel Data + var tunnelFn = getTunnelFn(request) + var tunnelOptions = constructTunnelOptions(request, proxyHeaders) + request.agent = tunnelFn(tunnelOptions) + + return true +} + +Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList +Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList +exports.Tunnel = Tunnel diff --git a/node_modules/request/node_modules/qs/.editorconfig b/node_modules/request/node_modules/qs/.editorconfig new file mode 100644 index 00000000..2f084445 --- /dev/null +++ b/node_modules/request/node_modules/qs/.editorconfig @@ -0,0 +1,43 @@ +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 = 160 +quote_type = single + +[test/*] +max_line_length = off + +[LICENSE.md] +indent_size = 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 + +[coverage/**/*] +indent_size = off +indent_style = off +indent = off +max_line_length = off + +[.nycrc] +indent_style = tab diff --git a/node_modules/request/node_modules/qs/.eslintrc b/node_modules/request/node_modules/qs/.eslintrc new file mode 100644 index 00000000..3f848996 --- /dev/null +++ b/node_modules/request/node_modules/qs/.eslintrc @@ -0,0 +1,37 @@ +{ + "root": true, + + "extends": "@ljharb", + + "ignorePatterns": [ + "dist/", + ], + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-lines-per-function": 0, + "max-params": [2, 12], + "max-statements": [2, 45], + "multiline-comment-style": 0, + "no-continue": 1, + "no-magic-numbers": 0, + "no-param-reassign": 1, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + }, + + "overrides": [ + { + "files": "test/**", + "rules": { + "max-lines-per-function": 0, + "max-statements": 0, + "no-extend-native": 0, + "function-paren-newline": 0, + }, + }, + ], +} diff --git a/node_modules/request/node_modules/qs/.github/FUNDING.yml b/node_modules/request/node_modules/qs/.github/FUNDING.yml new file mode 100644 index 00000000..0355f4f5 --- /dev/null +++ b/node_modules/request/node_modules/qs/.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/qs +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 a single custom sponsorship URL diff --git a/node_modules/request/node_modules/qs/.nycrc b/node_modules/request/node_modules/qs/.nycrc new file mode 100644 index 00000000..1d57cabe --- /dev/null +++ b/node_modules/request/node_modules/qs/.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", + "dist" + ] +} diff --git a/node_modules/request/node_modules/qs/CHANGELOG.md b/node_modules/request/node_modules/qs/CHANGELOG.md new file mode 100644 index 00000000..849c92ea --- /dev/null +++ b/node_modules/request/node_modules/qs/CHANGELOG.md @@ -0,0 +1,250 @@ +## **6.5.3** +- [Fix] `parse`: ignore `__proto__` keys (#428) +- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source +- [Fix] correctly parse nested arrays +- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) +- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided +- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` +- [Fix] fix for an impossible situation: when the formatter is called with a non-string value +- [Fix] `utils.merge`: avoid a crash with a null target and an array source +- [Refactor] `utils`: reduce observable [[Get]]s +- [Refactor] use cached `Array.isArray` +- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) +- [Refactor] `parse`: only need to reassign the var once +- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) +- [readme] remove travis badge; add github actions/codecov badges; update URLs +- [Docs] Clean up license text so it’s properly detected as BSD-3-Clause +- [Docs] Clarify the need for "arrayLimit" option +- [meta] fix README.md (#399) +- [meta] add FUNDING.yml +- [actions] backport actions from main +- [Tests] always use `String(x)` over `x.toString()` +- [Tests] remove nonexistent tape option +- [Dev Deps] backport from main + +## **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/request/node_modules/qs/LICENSE.md b/node_modules/request/node_modules/qs/LICENSE.md new file mode 100644 index 00000000..fecf6b69 --- /dev/null +++ b/node_modules/request/node_modules/qs/LICENSE.md @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/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: + +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 the copyright holder 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/request/node_modules/qs/README.md b/node_modules/request/node_modules/qs/README.md new file mode 100644 index 00000000..20fb9cad --- /dev/null +++ b/node_modules/request/node_modules/qs/README.md @@ -0,0 +1,510 @@ +# qs [![Version Badge][2]][1] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +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. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. + +```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 +}}) +``` + +You can encode keys and values using different logic by using the type argument provided to the encoder: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) { + if (type === 'key') { + return // Encoded key + } else if (type === 'value') { + return // Encoded value + } +}}) +``` + +The type argument is also provided to the decoder: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) { + if (type === 'key') { + return // Decoded key + } else if (type === 'value') { + return // Decoded value + } +}}) +``` + +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'); +``` + +## Security + +Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. + +## qs for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of qs 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-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +[package-url]: https://npmjs.org/package/qs +[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg +[deps-svg]: https://david-dm.org/ljharb/qs.svg +[deps-url]: https://david-dm.org/ljharb/qs +[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg +[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies +[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/qs.svg +[downloads-url]: https://npm-stat.com/charts.html?package=qs +[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/ljharb/qs/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs +[actions-url]: https://github.com/ljharb/qs/actions diff --git a/node_modules/request/node_modules/qs/bower.json b/node_modules/request/node_modules/qs/bower.json new file mode 100644 index 00000000..7a582762 --- /dev/null +++ b/node_modules/request/node_modules/qs/bower.json @@ -0,0 +1,21 @@ +{ + "name": "qs", + "main": "dist/qs.js", + "homepage": "https://github.com/hapijs/qs", + "authors": [ + "Nathan LaFreniere " + ], + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "keywords": [ + "querystring", + "qs" + ], + "license": "BSD-3-Clause", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/node_modules/request/node_modules/qs/component.json b/node_modules/request/node_modules/qs/component.json new file mode 100644 index 00000000..dd13558f --- /dev/null +++ b/node_modules/request/node_modules/qs/component.json @@ -0,0 +1,15 @@ +{ + "name": "qs", + "repository": "ljharb/qs", + "description": "query-string parser / stringifier with nesting support", + "version": "6.5.3", + "keywords": ["querystring", "query", "parser"], + "main": "lib/index.js", + "scripts": [ + "lib/index.js", + "lib/parse.js", + "lib/stringify.js", + "lib/utils.js" + ], + "license": "BSD-3-Clause" +} diff --git a/node_modules/request/node_modules/qs/dist/qs.js b/node_modules/request/node_modules/qs/dist/qs.js new file mode 100644 index 00000000..9f54e3fb --- /dev/null +++ b/node_modules/request/node_modules/qs/dist/qs.js @@ -0,0 +1,648 @@ +(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 === '[]' && options.parseArrays) { + 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 (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (cleanRoot !== '__proto__') { + 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) { + return prefix + '[]'; + }, + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( + 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); + } + + 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 (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 (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + pushToArray(values, 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 && typeof 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 (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; + } + pushToArray(keys, 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 (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || 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)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, 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)); + /* eslint operator-linebreak: [2, "before"] */ + 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/request/node_modules/qs/lib/formats.js b/node_modules/request/node_modules/qs/lib/formats.js new file mode 100644 index 00000000..702da12e --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/formats.js @@ -0,0 +1,18 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +module.exports = { + 'default': 'RFC3986', + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + }, + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; diff --git a/node_modules/request/node_modules/qs/lib/index.js b/node_modules/request/node_modules/qs/lib/index.js new file mode 100644 index 00000000..0d6a97dc --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/request/node_modules/qs/lib/parse.js new file mode 100644 index 00000000..cb7127d9 --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/parse.js @@ -0,0 +1,175 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; + +var defaults = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + decoder: utils.decode, + delimiter: '&', + depth: 5, + parameterLimit: 1000, + plainObjects: false, + strictNullHandling: false +}; + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + + for (var i = 0; i < parts.length; ++i) { + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder); + val = options.decoder(part.slice(pos + 1), defaults.decoder); + } + if (has.call(obj, key)) { + obj[key] = [].concat(obj[key]).concat(val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + 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 (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (cleanRoot !== '__proto__') { + 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); +}; diff --git a/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/request/node_modules/qs/lib/stringify.js new file mode 100644 index 00000000..12a96e65 --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/stringify.js @@ -0,0 +1,217 @@ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( + 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); + } + + 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 (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 (isArray(obj)) { + pushToArray(values, stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + pushToArray(values, 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 && typeof 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 (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; + } + pushToArray(keys, 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 : ''; +}; diff --git a/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/request/node_modules/qs/lib/utils.js new file mode 100644 index 00000000..6592e206 --- /dev/null +++ b/node_modules/request/node_modules/qs/lib/utils.js @@ -0,0 +1,215 @@ +'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 (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || 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)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, 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)); + /* eslint operator-linebreak: [2, "before"] */ + 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 +}; diff --git a/node_modules/request/node_modules/qs/package.json b/node_modules/request/node_modules/qs/package.json new file mode 100644 index 00000000..cc651b82 --- /dev/null +++ b/node_modules/request/node_modules/qs/package.json @@ -0,0 +1,54 @@ +{ + "name": "qs", + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "homepage": "https://github.com/ljharb/qs", + "version": "6.5.3", + "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" + }, + "devDependencies": { + "@ljharb/eslint-config": "^20.1.0", + "aud": "^1.1.5", + "browserify": "^16.5.2", + "eclint": "^2.8.1", + "eslint": "^8.6.0", + "evalmd": "^0.0.17", + "iconv-lite": "^0.4.24", + "in-publish": "^2.0.1", + "mkdirp": "^0.5.1", + "nyc": "^10.3.2", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^2.0.0", + "safer-buffer": "^2.1.2", + "tape": "^5.4.0" + }, + "scripts": { + "prepublishOnly": "safe-publish-latest && npm run dist", + "prepublish": "not-in-publish || npm run prepublishOnly", + "pretest": "npm run --silent readme && npm run --silent lint", + "test": "npm run --silent tests-only", + "tests-only": "nyc tape 'test/**/*.js'", + "posttest": "aud --production", + "readme": "evalmd README.md", + "postlint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')", + "lint": "eslint --ext=js,mjs .", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" + }, + "license": "BSD-3-Clause" +} diff --git a/node_modules/request/node_modules/qs/test/index.js b/node_modules/request/node_modules/qs/test/index.js new file mode 100644 index 00000000..5e6bc8fb --- /dev/null +++ b/node_modules/request/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/node_modules/request/node_modules/qs/test/parse.js b/node_modules/request/node_modules/qs/test/parse.js new file mode 100644 index 00000000..7c198380 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/parse.js @@ -0,0 +1,649 @@ +'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('parses jquery-param strings', function (st) { + // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' + var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; + var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; + st.deepEqual(qs.parse(encoded), expected); + 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', 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) { + var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); + st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); + st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); + + var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); + st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); + st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); + + 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 }), + { __proto__: null, a: { __proto__: null, b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('dunder proto is ignored', function (st) { + var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42'; + var result = qs.parse(payload, { allowPrototypes: true }); + + st.deepEqual( + result, + { + categories: { + length: '42' + } + }, + 'silent [[Prototype]] payload' + ); + + var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true }); + + st.deepEqual( + plainResult, + { + __proto__: null, + categories: { + __proto__: null, + length: '42' + } + }, + 'silent [[Prototype]] payload: plain objects' + ); + + var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true }); + + st.notOk(Array.isArray(query.categories), 'is not an array'); + st.notOk(query.categories instanceof Array, 'is not instanceof an array'); + st.deepEqual(query.categories, { some: { json: 'toInject' } }); + st.equal(JSON.stringify(query.categories), '{"some":{"json":"toInject"}}', 'stringifies as a non-array'); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }), + { + foo: { + bar: 'stuffs' + } + }, + 'hidden values' + ); + + st.deepEqual( + qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }), + { + __proto__: null, + foo: { + __proto__: null, + bar: 'stuffs' + } + }, + 'hidden values: plain objects' + ); + + 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 String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); + } + }), { 県: '大阪府' }); + 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/request/node_modules/qs/test/stringify.js b/node_modules/request/node_modules/qs/test/stringify.js new file mode 100644 index 00000000..08f78430 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/stringify.js @@ -0,0 +1,642 @@ +'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('stringifies falsy values', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(null, { strictNullHandling: true }), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(0), ''); + 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 nested falsy values', function (st) { + st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); + st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); + st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); + 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.equal(qs.stringify({ a: SaferBuffer.from('a b') }, { + encoder: function (buffer) { + return buffer; + } + }), 'a=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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC1738 }), 'a+b=a+b'); + 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC3986 }), 'a%20b=a%20b'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }), 'a%20b=a%20b'); + 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.test('strictNullHandling works with custom filter', function (st) { + var filter = function (prefix, value) { + return value; + }; + + var options = { strictNullHandling: true, filter: filter }; + st.equal(qs.stringify({ key: null }, options), 'key'); + st.end(); + }); + + t.test('strictNullHandling works with null serializeDate', function (st) { + var serializeDate = function () { + return null; + }; + var options = { strictNullHandling: true, serializeDate: serializeDate }; + var date = new Date(); + st.equal(qs.stringify({ key: date }, options), 'key'); + st.end(); + }); + + t.end(); +}); diff --git a/node_modules/request/node_modules/qs/test/utils.js b/node_modules/request/node_modules/qs/test/utils.js new file mode 100644 index 00000000..2bfe03a6 --- /dev/null +++ b/node_modules/request/node_modules/qs/test/utils.js @@ -0,0 +1,65 @@ +'use strict'; + +var test = require('tape'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); + + t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); + + 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'] }); + + var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); + t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); + + t.test( + 'avoids invoking array setters unnecessarily', + { skip: typeof Object.defineProperty !== 'function' }, + function (st) { + var setCount = 0; + var getCount = 0; + var observed = []; + Object.defineProperty(observed, 0, { + get: function () { + getCount += 1; + return { bar: 'baz' }; + }, + set: function () { setCount += 1; } + }); + utils.merge(observed, [null]); + st.equal(setCount, 0); + st.equal(getCount, 1); + observed[0] = observed[0]; // eslint-disable-line no-self-assign + st.equal(setCount, 1); + st.equal(getCount, 2); + st.end(); + } + ); + + 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/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/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/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/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md new file mode 100644 index 00000000..66304fdd --- /dev/null +++ b/node_modules/semver/CHANGELOG.md @@ -0,0 +1,39 @@ +# changes log + +## 5.7 + +* Add `minVersion` method + +## 5.6 + +* Move boolean `loose` param to an options object, with + backwards-compatibility protection. +* Add ability to opt out of special prerelease version handling with + the `includePrerelease` option flag. + +## 5.5 + +* Add version coercion capabilities + +## 5.4 + +* Add intersection checking + +## 5.3 + +* Add `minSatisfying` method + +## 5.2 + +* Add `prerelease(v)` that returns prerelease components + +## 5.1 + +* Add Backus-Naur for ranges +* Remove excessively cute inspection methods + +## 5.0 + +* Remove AMD/Browserified build artifacts +* Fix ltr and gtr when using the `*` range +* Fix for range `*` with a prerelease identifier 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..f8dfa5a0 --- /dev/null +++ b/node_modules/semver/README.md @@ -0,0 +1,412 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install --save semver +```` + +## Usage + +As a node module: + +```js +const 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 +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://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 + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +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. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for the purpose of range +matching) by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### 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: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ 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 `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +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. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### 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. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### 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. +* `minVersion(range)`: Return the lowest version that can possibly match + the given range. +* `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`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +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. + +### Coercion + +* `coerce(version)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string, and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver new file mode 100755 index 00000000..801e77f1 --- /dev/null +++ b/node_modules/semver/bin/semver @@ -0,0 +1,160 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + +var versions = [] + +var range = [] + +var inc = null + +var version = require('../package.json').version + +var loose = false + +var includePrerelease = false + +var coerce = false + +var identifier + +var semver = require('../semver') + +var reverse = false + +var options = {} + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var indexOfEqualSign = a.indexOf('=') + if (indexOfEqualSign !== -1) { + a = a.slice(0, indexOfEqualSign) + argv.unshift(a.slice(indexOfEqualSign + 1)) + } + switch (a) { + case '-rv': case '-rev': case '--rev': case '--reverse': + reverse = true + break + case '-l': case '--loose': + loose = true + break + case '-p': case '--include-prerelease': + includePrerelease = true + break + case '-v': case '--version': + versions.push(argv.shift()) + break + case '-i': case '--inc': case '--increment': + switch (argv[0]) { + case 'major': case 'minor': case 'patch': case 'prerelease': + case 'premajor': case 'preminor': case 'prepatch': + inc = argv.shift() + break + default: + inc = 'patch' + break + } + break + case '--preid': + identifier = argv.shift() + break + case '-r': case '--range': + range.push(argv.shift()) + break + case '-c': case '--coerce': + coerce = true + break + case '-h': case '--help': case '-?': + return help() + default: + versions.push(a) + break + } + } + + var options = { loose: loose, includePrerelease: includePrerelease } + + versions = versions.map(function (v) { + return coerce ? (semver.coerce(v) || { version: v }).version : v + }).filter(function (v) { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) { return failInc() } + + for (var i = 0, l = range.length; i < l; i++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], options) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error('--inc can only be used on a single version with no range') + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? 'rcompare' : 'compare' + versions.sort(function (a, b) { + return semver[compare](a, b, options) + }).map(function (v) { + return semver.clean(v, options) + }).map(function (v) { + return inc ? semver.inc(v, inc, options, identifier) : v + }).forEach(function (v, i, _) { console.log(v) }) +} + +function help () { + console.log(['SemVer ' + version, + '', + 'A JavaScript implementation of the https://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', + '', + '-p --include-prerelease', + ' Always include prerelease versions in range matching', + '', + '-c --coerce', + ' Coerce a string into SemVer if possible', + ' (does not imply --loose)', + '', + '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.' + ].join('\n')) +} diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json new file mode 100644 index 00000000..69d2db16 --- /dev/null +++ b/node_modules/semver/package.json @@ -0,0 +1,28 @@ +{ + "name": "semver", + "version": "5.7.1", + "description": "The semantic version parser used by npm.", + "main": "semver.js", + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "devDependencies": { + "tap": "^13.0.0-rc.18" + }, + "license": "ISC", + "repository": "https://github.com/npm/node-semver", + "bin": { + "semver": "./bin/semver" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ], + "tap": { + "check-coverage": true + } +} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf new file mode 100644 index 00000000..d4c6ae0d --- /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..d315d5d6 --- /dev/null +++ b/node_modules/semver/semver.js @@ -0,0 +1,1483 @@ +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + 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 || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// 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] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' + +// 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, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.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, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.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.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + 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.options) + } + + // 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) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +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 a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +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(new SemVer(b, loose)) +} + +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) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.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.options.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.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // 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.options.loose + range = range.trim() + // `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, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.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, this.options) + }, this) + + return set +} + +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).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, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + 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, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.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) + 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, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.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 (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, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} + +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.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) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + 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 { + 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, options) { + debug('replaceStars', comp, options) + // 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.options) + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false +} + +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // 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 (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, options) { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) + + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} + +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).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, options) { + return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) + + 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, options)) { + 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, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + 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, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + var match = version.match(re[COERCE]) + + if (match == null) { + return null + } + + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} diff --git a/node_modules/send/HISTORY.md b/node_modules/send/HISTORY.md new file mode 100644 index 00000000..a7397749 --- /dev/null +++ b/node_modules/send/HISTORY.md @@ -0,0 +1,521 @@ +0.18.0 / 2022-03-23 +=================== + + * Fix emitted 416 error missing headers property + * Limit the headers removed for 304 response + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: destroy@1.2.0 + * deps: http-errors@2.0.0 + - deps: depd@2.0.0 + - deps: statuses@2.0.1 + * deps: on-finished@2.4.1 + * deps: statuses@2.0.1 + +0.17.2 / 2021-12-11 +=================== + + * pref: ignore empty http tokens + * deps: http-errors@1.8.1 + - deps: inherits@2.0.4 + - deps: toidentifier@1.0.1 + - deps: setprototypeof@1.2.0 + * deps: ms@2.1.3 + +0.17.1 / 2019-05-10 +=================== + + * Set stricter CSP header in redirect & error responses + * deps: range-parser@~1.2.1 + +0.17.0 / 2019-05-03 +=================== + + * deps: http-errors@~1.7.2 + - Set constructor name when possible + - Use `toidentifier` module to make class names + - deps: depd@~1.1.2 + - deps: setprototypeof@1.1.1 + - deps: statuses@'>= 1.5.0 < 2' + * deps: mime@1.6.0 + - Add extensions for JPEG-2000 images + - Add new `font/*` types from IANA + - Add WASM mapping + - Update `.bdoc` to `application/bdoc` + - Update `.bmp` to `image/bmp` + - Update `.m4a` to `audio/mp4` + - Update `.rtf` to `application/rtf` + - Update `.wav` to `audio/wav` + - Update `.xml` to `application/xml` + - Update generic extensions to `application/octet-stream`: + `.deb`, `.dll`, `.dmg`, `.exe`, `.iso`, `.msi` + - Use mime-score module to resolve extension conflicts + * deps: ms@2.1.1 + - Add `week`/`w` support + - Fix negative number handling + * deps: statuses@~1.5.0 + * perf: remove redundant `path.normalize` call + +0.16.2 / 2018-02-07 +=================== + + * Fix incorrect end tag in default error & redirects + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: statuses@~1.4.0 + +0.16.1 / 2017-09-29 +=================== + + * Fix regression in edge-case behavior for empty `path` + +0.16.0 / 2017-09-27 +=================== + + * Add `immutable` option + * Fix missing `` in default error & redirects + * Use instance methods on steam to check for listeners + * deps: mime@1.4.1 + - Add 70 new types for file extensions + - Set charset as "UTF-8" for .js and .json + * perf: improve path validation speed + +0.15.6 / 2017-09-22 +=================== + + * deps: debug@2.6.9 + * perf: improve `If-Match` token parsing + +0.15.5 / 2017-09-20 +=================== + + * deps: etag@~1.8.1 + - perf: replace regular expression with substring + * deps: fresh@0.5.2 + - Fix handling of modified headers with invalid dates + - perf: improve ETag match loop + - perf: improve `If-None-Match` token parsing + +0.15.4 / 2017-08-05 +=================== + + * deps: debug@2.6.8 + * deps: depd@~1.1.1 + - Remove unnecessary `Buffer` loading + * deps: http-errors@~1.6.2 + - deps: depd@1.1.1 + +0.15.3 / 2017-05-16 +=================== + + * deps: debug@2.6.7 + - deps: ms@2.0.0 + * deps: ms@2.0.0 + +0.15.2 / 2017-04-26 +=================== + + * deps: debug@2.6.4 + - Fix `DEBUG_MAX_ARRAY_LENGTH` + - deps: ms@0.7.3 + * deps: ms@1.0.0 + +0.15.1 / 2017-03-04 +=================== + + * Fix issue when `Date.parse` does not return `NaN` on invalid date + * Fix strict violation in broken environments + +0.15.0 / 2017-02-25 +=================== + + * Support `If-Match` and `If-Unmodified-Since` headers + * Add `res` and `path` arguments to `directory` event + * Remove usage of `res._headers` private field + - Improves compatibility with Node.js 8 nightly + * Send complete HTML document in redirect & error responses + * Set default CSP header in redirect & error responses + * Use `res.getHeaderNames()` when available + * Use `res.headersSent` when available + * deps: debug@2.6.1 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable set to `3` or higher + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + * deps: etag@~1.8.0 + * deps: fresh@0.5.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - perf: delay reading header values until needed + - perf: enable strict mode + - perf: hoist regular expressions + - perf: remove duplicate conditional + - perf: remove unnecessary boolean coercions + - perf: skip checking modified time if ETag check failed + - perf: skip parsing `If-None-Match` when no `ETag` header + - perf: use `Date.parse` instead of `new Date` + * deps: http-errors@~1.6.1 + - Make `message` property enumerable for `HttpError`s + - deps: setprototypeof@1.0.3 + +0.14.2 / 2017-01-23 +=================== + + * deps: http-errors@~1.5.1 + - deps: inherits@2.0.3 + - deps: setprototypeof@1.0.2 + - deps: statuses@'>= 1.3.1 < 2' + * deps: ms@0.7.2 + * deps: statuses@~1.3.1 + +0.14.1 / 2016-06-09 +=================== + + * Fix redirect error when `path` contains raw non-URL characters + * Fix redirect when `path` starts with multiple forward slashes + +0.14.0 / 2016-06-06 +=================== + + * Add `acceptRanges` option + * Add `cacheControl` option + * Attempt to combine multiple ranges into single range + * Correctly inherit from `Stream` class + * Fix `Content-Range` header in 416 responses when using `start`/`end` options + * Fix `Content-Range` header missing from default 416 responses + * Ignore non-byte `Range` headers + * deps: http-errors@~1.5.0 + - Add `HttpError` export, for `err instanceof createError.HttpError` + - Support new code `421 Misdirected Request` + - Use `setprototypeof` module to replace `__proto__` setting + - deps: inherits@2.0.1 + - deps: statuses@'>= 1.3.0 < 2' + - perf: enable strict mode + * deps: range-parser@~1.2.0 + - Fix incorrectly returning -1 when there is at least one valid range + - perf: remove internal function + * deps: statuses@~1.3.0 + - Add `421 Misdirected Request` + - perf: enable strict mode + * perf: remove argument reassignment + +0.13.2 / 2016-03-05 +=================== + + * Fix invalid `Content-Type` header when `send.mime.default_type` unset + +0.13.1 / 2016-01-16 +=================== + + * deps: depd@~1.1.0 + - Support web browser loading + - perf: enable strict mode + * deps: destroy@~1.0.4 + - perf: enable strict mode + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + * deps: range-parser@~1.0.3 + - perf: enable strict mode + +0.13.0 / 2015-06-16 +=================== + + * Allow Node.js HTTP server to set `Date` response header + * Fix incorrectly removing `Content-Location` on 304 response + * Improve the default redirect response headers + * Send appropriate headers on default error response + * Use `http-errors` for standard emitted errors + * Use `statuses` instead of `http` module for status messages + * deps: escape-html@1.0.2 + * deps: etag@~1.7.0 + - Improve stat performance by removing hashing + * deps: fresh@0.3.0 + - Add weak `ETag` matching support + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * perf: enable strict mode + * perf: remove unnecessary array allocations + +0.12.3 / 2015-05-13 +=================== + + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + * deps: depd@~1.0.1 + * deps: etag@~1.6.0 + - Improve support for JXcore + - Support "fake" stats objects in environments without `fs` + * deps: ms@0.7.1 + - Prevent extraordinarily long inputs + * deps: on-finished@~2.2.1 + +0.12.2 / 2015-03-13 +=================== + + * Throw errors early for invalid `extensions` or `index` options + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + +0.12.1 / 2015-02-17 +=================== + + * Fix regression sending zero-length files + +0.12.0 / 2015-02-16 +=================== + + * Always read the stat size from the file + * Fix mutating passed-in `options` + * deps: mime@1.3.4 + +0.11.1 / 2015-01-20 +=================== + + * Fix `root` path disclosure + +0.11.0 / 2015-01-05 +=================== + + * deps: debug@~2.1.1 + * deps: etag@~1.5.1 + - deps: crc@3.2.1 + * deps: ms@0.7.0 + - Add `milliseconds` + - Add `msecs` + - Add `secs` + - Add `mins` + - Add `hrs` + - Add `yrs` + * deps: on-finished@~2.2.0 + +0.10.1 / 2014-10-22 +=================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + +0.10.0 / 2014-10-15 +=================== + + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + * deps: depd@~1.0.0 + * deps: etag@~1.5.0 + - Improve string performance + - Slightly improve speed for weak ETags over 1KB + +0.9.3 / 2014-09-24 +================== + + * deps: etag@~1.4.0 + - Support "fake" stats objects + +0.9.2 / 2014-09-15 +================== + + * deps: depd@0.4.5 + * deps: etag@~1.3.1 + * deps: range-parser@~1.0.2 + +0.9.1 / 2014-09-07 +================== + + * deps: fresh@0.2.4 + +0.9.0 / 2014-09-07 +================== + + * Add `lastModified` option + * Use `etag` to generate `ETag` header + * deps: debug@~2.0.0 + +0.8.5 / 2014-09-04 +================== + + * Fix malicious path detection for empty string path + +0.8.4 / 2014-09-04 +================== + + * Fix a path traversal issue when using `root` + +0.8.3 / 2014-08-16 +================== + + * deps: destroy@1.0.3 + - renamed from dethroy + * deps: on-finished@2.1.0 + +0.8.2 / 2014-08-14 +================== + + * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + * deps: dethroy@1.0.2 + +0.8.1 / 2014-08-05 +================== + + * Fix `extensions` behavior when file already has extension + +0.8.0 / 2014-08-05 +================== + + * Add `extensions` option + +0.7.4 / 2014-08-04 +================== + + * Fix serving index files without root dir + +0.7.3 / 2014-07-29 +================== + + * Fix incorrect 403 on Windows and Node.js 0.11 + +0.7.2 / 2014-07-27 +================== + + * deps: depd@0.4.4 + - Work-around v8 generating empty stack traces + +0.7.1 / 2014-07-26 +================== + + * deps: depd@0.4.3 + - Fix exception when global `Error.stackTraceLimit` is too low + +0.7.0 / 2014-07-20 +================== + + * Deprecate `hidden` option; use `dotfiles` option + * Add `dotfiles` option + * deps: debug@1.0.4 + * deps: depd@0.4.2 + - Add `TRACE_DEPRECATION` environment variable + - Remove non-standard grey color from color output + - Support `--no-deprecation` argument + - Support `--trace-deprecation` argument + +0.6.0 / 2014-07-11 +================== + + * Deprecate `from` option; use `root` option + * Deprecate `send.etag()` -- use `etag` in `options` + * Deprecate `send.hidden()` -- use `hidden` in `options` + * Deprecate `send.index()` -- use `index` in `options` + * Deprecate `send.maxage()` -- use `maxAge` in `options` + * Deprecate `send.root()` -- use `root` in `options` + * Cap `maxAge` value to 1 year + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + +0.5.0 / 2014-06-28 +================== + + * Accept string for `maxAge` (converted by `ms`) + * Add `headers` event + * Include link in default redirect response + * Use `EventEmitter.listenerCount` to count listeners + +0.4.3 / 2014-06-11 +================== + + * Do not throw un-catchable error on file open race condition + * Use `escape-html` for HTML escaping + * deps: debug@1.0.2 + - fix some debugging output colors on node.js 0.8 + * deps: finished@1.2.2 + * deps: fresh@0.2.2 + +0.4.2 / 2014-06-09 +================== + + * fix "event emitter leak" warnings + * deps: debug@1.0.1 + * deps: finished@1.2.1 + +0.4.1 / 2014-06-02 +================== + + * Send `max-age` in `Cache-Control` in correct format + +0.4.0 / 2014-05-27 +================== + + * Calculate ETag with md5 for reduced collisions + * Fix wrong behavior when index file matches directory + * Ignore stream errors after request ends + - Goodbye `EBADF, read` + * Skip directories in index file search + * deps: debug@0.8.1 + +0.3.0 / 2014-04-24 +================== + + * Fix sending files with dots without root set + * Coerce option types + * Accept API options in options object + * Set etags to "weak" + * Include file path in etag + * Make "Can't set headers after they are sent." catchable + * Send full entity-body for multi range requests + * Default directory access to 403 when index disabled + * Support multiple index paths + * Support "If-Range" header + * Control whether to generate etags + * deps: mime@1.2.11 + +0.2.0 / 2014-01-29 +================== + + * update range-parser and fresh + +0.1.4 / 2013-08-11 +================== + + * update fresh + +0.1.3 / 2013-07-08 +================== + + * Revert "Fix fd leak" + +0.1.2 / 2013-07-03 +================== + + * Fix fd leak + +0.1.0 / 2012-08-25 +================== + + * add options parameter to send() that is passed to fs.createReadStream() [kanongil] + +0.0.4 / 2012-08-16 +================== + + * allow custom "Accept-Ranges" definition + +0.0.3 / 2012-07-16 +================== + + * fix normalization of the root directory. Closes #3 + +0.0.2 / 2012-07-09 +================== + + * add passing of req explicitly for now (YUCK) + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/send/LICENSE b/node_modules/send/LICENSE new file mode 100644 index 00000000..b6ea1c1f --- /dev/null +++ b/node_modules/send/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/send/README.md b/node_modules/send/README.md new file mode 100644 index 00000000..fadf8383 --- /dev/null +++ b/node_modules/send/README.md @@ -0,0 +1,327 @@ +# send + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Linux Build][github-actions-ci-image]][github-actions-ci-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Send is a library for streaming files from the file system as a http response +supporting partial responses (Ranges), conditional-GET negotiation (If-Match, +If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage, +and granular events which may be leveraged to take appropriate actions in your +application or framework. + +Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static). + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install send +``` + +## API + +```js +var send = require('send') +``` + +### send(req, path, [options]) + +Create a new `SendStream` for the given path to send to a `res`. The `req` is +the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded, +not the actual file-system path). + +#### Options + +##### acceptRanges + +Enable or disable accepting ranged requests, defaults to true. +Disabling this will not send `Accept-Ranges` and ignore the contents +of the `Range` request header. + +##### cacheControl + +Enable or disable setting `Cache-Control` response header, defaults to +true. Disabling this will ignore the `immutable` and `maxAge` options. + +##### dotfiles + +Set how "dotfiles" are treated when encountered. A dotfile is a file +or directory that begins with a dot ("."). Note this check is done on +the path itself without checking if the path actually exists on the +disk. If `root` is specified, only the dotfiles above the root are +checked (i.e. the root itself can be within a dotfile when when set +to "deny"). + + - `'allow'` No special treatment for dotfiles. + - `'deny'` Send a 403 for any request for a dotfile. + - `'ignore'` Pretend like the dotfile does not exist and 404. + +The default value is _similar_ to `'ignore'`, with the exception that +this default will not ignore the files within a directory that begins +with a dot, for backward-compatibility. + +##### end + +Byte offset at which the stream ends, defaults to the length of the file +minus 1. The end is inclusive in the stream, meaning `end: 3` will include +the 4th byte in the stream. + +##### etag + +Enable or disable etag generation, defaults to true. + +##### extensions + +If a given file doesn't exist, try appending one of the given extensions, +in the given order. By default, this is disabled (set to `false`). An +example value that will serve extension-less HTML files: `['html', 'htm']`. +This is skipped if the requested file already has an extension. + +##### immutable + +Enable or disable the `immutable` directive in the `Cache-Control` response +header, defaults to `false`. If set to `true`, the `maxAge` option should +also be specified to enable caching. The `immutable` directive will prevent +supported clients from making conditional requests during the life of the +`maxAge` option to check if the file has changed. + +##### index + +By default send supports "index.html" files, to disable this +set `false` or to supply a new index pass a string or an array +in preferred order. + +##### lastModified + +Enable or disable `Last-Modified` header, defaults to true. Uses the file +system's last modified value. + +##### maxAge + +Provide a max-age in milliseconds for http caching, defaults to 0. +This can also be a string accepted by the +[ms](https://www.npmjs.org/package/ms#readme) module. + +##### root + +Serve files relative to `path`. + +##### start + +Byte offset at which the stream starts, defaults to 0. The start is inclusive, +meaning `start: 2` will include the 3rd byte in the stream. + +#### Events + +The `SendStream` is an event emitter and will emit the following events: + + - `error` an error occurred `(err)` + - `directory` a directory was requested `(res, path)` + - `file` a file was requested `(path, stat)` + - `headers` the headers are about to be set on a file `(res, path, stat)` + - `stream` file streaming has started `(stream)` + - `end` streaming has completed + +#### .pipe + +The `pipe` method is used to pipe the response into the Node.js HTTP response +object, typically `send(req, path, options).pipe(res)`. + +### .mime + +The `mime` export is the global instance of of the +[`mime` npm module](https://www.npmjs.com/package/mime). + +This is used to configure the MIME types that are associated with file extensions +as well as other options for how to resolve the MIME type of a file (like the +default type to use for an unknown file extension). + +## Error-handling + +By default when no `error` listeners are present an automatic response will be +made, otherwise you have full control over the response, aka you may show a 5xx +page etc. + +## Caching + +It does _not_ perform internal caching, you should use a reverse proxy cache +such as Varnish for this, or those fancy things called CDNs. If your +application is small enough that it would benefit from single-node memory +caching, it's small enough that it does not need caching at all ;). + +## Debugging + +To enable `debug()` instrumentation output export __DEBUG__: + +``` +$ DEBUG=send node app +``` + +## Running tests + +``` +$ npm install +$ npm test +``` + +## Examples + +### Serve a specific file + +This simple example will send a specific file to all requests. + +```js +var http = require('http') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + send(req, '/path/to/index.html') + .pipe(res) +}) + +server.listen(3000) +``` + +### Serve all files from a directory + +This simple example will just serve up all the files in a +given directory as the top-level. For example, a request +`GET /foo.txt` will send back `/www/public/foo.txt`. + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .pipe(res) +}) + +server.listen(3000) +``` + +### Custom file types + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +// Default unknown types to text/plain +send.mime.default_type = 'text/plain' + +// Add a custom type +send.mime.define({ + 'application/x-my-type': ['x-mt', 'x-mtt'] +}) + +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .pipe(res) +}) + +server.listen(3000) +``` + +### Custom directory index view + +This is a example of serving up a structure of directories with a +custom function to render a listing of a directory. + +```js +var http = require('http') +var fs = require('fs') +var parseUrl = require('parseurl') +var send = require('send') + +// Transfer arbitrary files from within /www/example.com/public/* +// with a custom handler for directory listing +var server = http.createServer(function onRequest (req, res) { + send(req, parseUrl(req).pathname, { index: false, root: '/www/public' }) + .once('directory', directory) + .pipe(res) +}) + +server.listen(3000) + +// Custom directory handler +function directory (res, path) { + var stream = this + + // redirect to trailing slash for consistent url + if (!stream.hasTrailingSlash()) { + return stream.redirect(path) + } + + // get directory list + fs.readdir(path, function onReaddir (err, list) { + if (err) return stream.error(err) + + // render an index for the directory + res.setHeader('Content-Type', 'text/plain; charset=UTF-8') + res.end(list.join('\n') + '\n') + }) +} +``` + +### Serving from a root directory with custom error-handling + +```js +var http = require('http') +var parseUrl = require('parseurl') +var send = require('send') + +var server = http.createServer(function onRequest (req, res) { + // your custom error-handling logic: + function error (err) { + res.statusCode = err.status || 500 + res.end(err.message) + } + + // your custom headers + function headers (res, path, stat) { + // serve all files for download + res.setHeader('Content-Disposition', 'attachment') + } + + // your custom directory handling logic: + function redirect () { + res.statusCode = 301 + res.setHeader('Location', req.url + '/') + res.end('Redirecting to ' + req.url + '/') + } + + // transfer arbitrary files from within + // /www/example.com/public/* + send(req, parseUrl(req).pathname, { root: '/www/public' }) + .on('error', error) + .on('directory', redirect) + .on('headers', headers) + .pipe(res) +}) + +server.listen(3000) +``` + +## License + +[MIT](LICENSE) + +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/send/master?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send +[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master +[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=linux +[github-actions-ci-url]: https://github.com/pillarjs/send/actions/workflows/ci.yml +[node-image]: https://badgen.net/npm/node/send +[node-url]: https://nodejs.org/en/download/ +[npm-downloads-image]: https://badgen.net/npm/dm/send +[npm-url]: https://npmjs.org/package/send +[npm-version-image]: https://badgen.net/npm/v/send diff --git a/node_modules/send/SECURITY.md b/node_modules/send/SECURITY.md new file mode 100644 index 00000000..46b48f7b --- /dev/null +++ b/node_modules/send/SECURITY.md @@ -0,0 +1,24 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The `send` team and community take all security bugs seriously. Thank you +for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `send`. This information +can be found in the npm registry using the command `npm owner ls send`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/pillarjs/send/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/node_modules/send/index.js b/node_modules/send/index.js new file mode 100644 index 00000000..89afd7e5 --- /dev/null +++ b/node_modules/send/index.js @@ -0,0 +1,1143 @@ +/*! + * send + * Copyright(c) 2012 TJ Holowaychuk + * Copyright(c) 2014-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var createError = require('http-errors') +var debug = require('debug')('send') +var deprecate = require('depd')('send') +var destroy = require('destroy') +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var etag = require('etag') +var fresh = require('fresh') +var fs = require('fs') +var mime = require('mime') +var ms = require('ms') +var onFinished = require('on-finished') +var parseRange = require('range-parser') +var path = require('path') +var statuses = require('statuses') +var Stream = require('stream') +var util = require('util') + +/** + * Path function references. + * @private + */ + +var extname = path.extname +var join = path.join +var normalize = path.normalize +var resolve = path.resolve +var sep = path.sep + +/** + * Regular expression for identifying a bytes Range header. + * @private + */ + +var BYTES_RANGE_REGEXP = /^ *bytes=/ + +/** + * Maximum value allowed for the max age. + * @private + */ + +var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year + +/** + * Regular expression to match a path with a directory up component. + * @private + */ + +var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/ + +/** + * Module exports. + * @public + */ + +module.exports = send +module.exports.mime = mime + +/** + * Return a `SendStream` for `req` and `path`. + * + * @param {object} req + * @param {string} path + * @param {object} [options] + * @return {SendStream} + * @public + */ + +function send (req, path, options) { + return new SendStream(req, path, options) +} + +/** + * Initialize a `SendStream` with the given `path`. + * + * @param {Request} req + * @param {String} path + * @param {object} [options] + * @private + */ + +function SendStream (req, path, options) { + Stream.call(this) + + var opts = options || {} + + this.options = opts + this.path = path + this.req = req + + this._acceptRanges = opts.acceptRanges !== undefined + ? Boolean(opts.acceptRanges) + : true + + this._cacheControl = opts.cacheControl !== undefined + ? Boolean(opts.cacheControl) + : true + + this._etag = opts.etag !== undefined + ? Boolean(opts.etag) + : true + + this._dotfiles = opts.dotfiles !== undefined + ? opts.dotfiles + : 'ignore' + + if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { + throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') + } + + this._hidden = Boolean(opts.hidden) + + if (opts.hidden !== undefined) { + deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') + } + + // legacy support + if (opts.dotfiles === undefined) { + this._dotfiles = undefined + } + + this._extensions = opts.extensions !== undefined + ? normalizeList(opts.extensions, 'extensions option') + : [] + + this._immutable = opts.immutable !== undefined + ? Boolean(opts.immutable) + : false + + this._index = opts.index !== undefined + ? normalizeList(opts.index, 'index option') + : ['index.html'] + + this._lastModified = opts.lastModified !== undefined + ? Boolean(opts.lastModified) + : true + + this._maxage = opts.maxAge || opts.maxage + this._maxage = typeof this._maxage === 'string' + ? ms(this._maxage) + : Number(this._maxage) + this._maxage = !isNaN(this._maxage) + ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) + : 0 + + this._root = opts.root + ? resolve(opts.root) + : null + + if (!this._root && opts.from) { + this.from(opts.from) + } +} + +/** + * Inherits from `Stream`. + */ + +util.inherits(SendStream, Stream) + +/** + * Enable or disable etag generation. + * + * @param {Boolean} val + * @return {SendStream} + * @api public + */ + +SendStream.prototype.etag = deprecate.function(function etag (val) { + this._etag = Boolean(val) + debug('etag %s', this._etag) + return this +}, 'send.etag: pass etag as option') + +/** + * Enable or disable "hidden" (dot) files. + * + * @param {Boolean} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.hidden = deprecate.function(function hidden (val) { + this._hidden = Boolean(val) + this._dotfiles = undefined + debug('hidden %s', this._hidden) + return this +}, 'send.hidden: use dotfiles option') + +/** + * Set index `paths`, set to a falsy + * value to disable index support. + * + * @param {String|Boolean|Array} paths + * @return {SendStream} + * @api public + */ + +SendStream.prototype.index = deprecate.function(function index (paths) { + var index = !paths ? [] : normalizeList(paths, 'paths argument') + debug('index %o', paths) + this._index = index + return this +}, 'send.index: pass index as option') + +/** + * Set root `path`. + * + * @param {String} path + * @return {SendStream} + * @api public + */ + +SendStream.prototype.root = function root (path) { + this._root = resolve(String(path)) + debug('root %s', this._root) + return this +} + +SendStream.prototype.from = deprecate.function(SendStream.prototype.root, + 'send.from: pass root as option') + +SendStream.prototype.root = deprecate.function(SendStream.prototype.root, + 'send.root: pass root as option') + +/** + * Set max-age to `maxAge`. + * + * @param {Number} maxAge + * @return {SendStream} + * @api public + */ + +SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) { + this._maxage = typeof maxAge === 'string' + ? ms(maxAge) + : Number(maxAge) + this._maxage = !isNaN(this._maxage) + ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) + : 0 + debug('max-age %d', this._maxage) + return this +}, 'send.maxage: pass maxAge as option') + +/** + * Emit error with `status`. + * + * @param {number} status + * @param {Error} [err] + * @private + */ + +SendStream.prototype.error = function error (status, err) { + // emit if listeners instead of responding + if (hasListeners(this, 'error')) { + return this.emit('error', createHttpError(status, err)) + } + + var res = this.res + var msg = statuses.message[status] || String(status) + var doc = createHtmlDocument('Error', escapeHtml(msg)) + + // clear existing headers + clearHeaders(res) + + // add error headers + if (err && err.headers) { + setHeaders(res, err.headers) + } + + // send basic response + res.statusCode = status + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.end(doc) +} + +/** + * Check if the pathname ends with "/". + * + * @return {boolean} + * @private + */ + +SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () { + return this.path[this.path.length - 1] === '/' +} + +/** + * Check if this is a conditional GET request. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isConditionalGET = function isConditionalGET () { + return this.req.headers['if-match'] || + this.req.headers['if-unmodified-since'] || + this.req.headers['if-none-match'] || + this.req.headers['if-modified-since'] +} + +/** + * Check if the request preconditions failed. + * + * @return {boolean} + * @private + */ + +SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () { + var req = this.req + var res = this.res + + // if-match + var match = req.headers['if-match'] + if (match) { + var etag = res.getHeader('ETag') + return !etag || (match !== '*' && parseTokenList(match).every(function (match) { + return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag + })) + } + + // if-unmodified-since + var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since']) + if (!isNaN(unmodifiedSince)) { + var lastModified = parseHttpDate(res.getHeader('Last-Modified')) + return isNaN(lastModified) || lastModified > unmodifiedSince + } + + return false +} + +/** + * Strip various content header fields for a change in entity. + * + * @private + */ + +SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () { + var res = this.res + + res.removeHeader('Content-Encoding') + res.removeHeader('Content-Language') + res.removeHeader('Content-Length') + res.removeHeader('Content-Range') + res.removeHeader('Content-Type') +} + +/** + * Respond with 304 not modified. + * + * @api private + */ + +SendStream.prototype.notModified = function notModified () { + var res = this.res + debug('not modified') + this.removeContentHeaderFields() + res.statusCode = 304 + res.end() +} + +/** + * Raise error that headers already sent. + * + * @api private + */ + +SendStream.prototype.headersAlreadySent = function headersAlreadySent () { + var err = new Error('Can\'t set headers after they are sent.') + debug('headers already sent') + this.error(500, err) +} + +/** + * Check if the request is cacheable, aka + * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isCachable = function isCachable () { + var statusCode = this.res.statusCode + return (statusCode >= 200 && statusCode < 300) || + statusCode === 304 +} + +/** + * Handle stat() error. + * + * @param {Error} error + * @private + */ + +SendStream.prototype.onStatError = function onStatError (error) { + switch (error.code) { + case 'ENAMETOOLONG': + case 'ENOENT': + case 'ENOTDIR': + this.error(404, error) + break + default: + this.error(500, error) + break + } +} + +/** + * Check if the cache is fresh. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isFresh = function isFresh () { + return fresh(this.req.headers, { + etag: this.res.getHeader('ETag'), + 'last-modified': this.res.getHeader('Last-Modified') + }) +} + +/** + * Check if the range is fresh. + * + * @return {Boolean} + * @api private + */ + +SendStream.prototype.isRangeFresh = function isRangeFresh () { + var ifRange = this.req.headers['if-range'] + + if (!ifRange) { + return true + } + + // if-range as etag + if (ifRange.indexOf('"') !== -1) { + var etag = this.res.getHeader('ETag') + return Boolean(etag && ifRange.indexOf(etag) !== -1) + } + + // if-range as modified date + var lastModified = this.res.getHeader('Last-Modified') + return parseHttpDate(lastModified) <= parseHttpDate(ifRange) +} + +/** + * Redirect to path. + * + * @param {string} path + * @private + */ + +SendStream.prototype.redirect = function redirect (path) { + var res = this.res + + if (hasListeners(this, 'directory')) { + this.emit('directory', res, path) + return + } + + if (this.hasTrailingSlash()) { + this.error(403) + return + } + + var loc = encodeUrl(collapseLeadingSlashes(this.path + '/')) + var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + + escapeHtml(loc) + '') + + // redirect + res.statusCode = 301 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.setHeader('Location', loc) + res.end(doc) +} + +/** + * Pipe to `res. + * + * @param {Stream} res + * @return {Stream} res + * @api public + */ + +SendStream.prototype.pipe = function pipe (res) { + // root path + var root = this._root + + // references + this.res = res + + // decode the path + var path = decode(this.path) + if (path === -1) { + this.error(400) + return res + } + + // null byte(s) + if (~path.indexOf('\0')) { + this.error(400) + return res + } + + var parts + if (root !== null) { + // normalize + if (path) { + path = normalize('.' + sep + path) + } + + // malicious path + if (UP_PATH_REGEXP.test(path)) { + debug('malicious path "%s"', path) + this.error(403) + return res + } + + // explode path parts + parts = path.split(sep) + + // join / normalize from optional root dir + path = normalize(join(root, path)) + } else { + // ".." is malicious without "root" + if (UP_PATH_REGEXP.test(path)) { + debug('malicious path "%s"', path) + this.error(403) + return res + } + + // explode path parts + parts = normalize(path).split(sep) + + // resolve the path + path = resolve(path) + } + + // dotfile handling + if (containsDotFile(parts)) { + var access = this._dotfiles + + // legacy support + if (access === undefined) { + access = parts[parts.length - 1][0] === '.' + ? (this._hidden ? 'allow' : 'ignore') + : 'allow' + } + + debug('%s dotfile "%s"', access, path) + switch (access) { + case 'allow': + break + case 'deny': + this.error(403) + return res + case 'ignore': + default: + this.error(404) + return res + } + } + + // index file support + if (this._index.length && this.hasTrailingSlash()) { + this.sendIndex(path) + return res + } + + this.sendFile(path) + return res +} + +/** + * Transfer `path`. + * + * @param {String} path + * @api public + */ + +SendStream.prototype.send = function send (path, stat) { + var len = stat.size + var options = this.options + var opts = {} + var res = this.res + var req = this.req + var ranges = req.headers.range + var offset = options.start || 0 + + if (headersSent(res)) { + // impossible to send now + this.headersAlreadySent() + return + } + + debug('pipe "%s"', path) + + // set header fields + this.setHeader(path, stat) + + // set content-type + this.type(path) + + // conditional GET support + if (this.isConditionalGET()) { + if (this.isPreconditionFailure()) { + this.error(412) + return + } + + if (this.isCachable() && this.isFresh()) { + this.notModified() + return + } + } + + // adjust len to start/end options + len = Math.max(0, len - offset) + if (options.end !== undefined) { + var bytes = options.end - offset + 1 + if (len > bytes) len = bytes + } + + // Range support + if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) { + // parse + ranges = parseRange(len, ranges, { + combine: true + }) + + // If-Range support + if (!this.isRangeFresh()) { + debug('range stale') + ranges = -2 + } + + // unsatisfiable + if (ranges === -1) { + debug('range unsatisfiable') + + // Content-Range + res.setHeader('Content-Range', contentRange('bytes', len)) + + // 416 Requested Range Not Satisfiable + return this.error(416, { + headers: { 'Content-Range': res.getHeader('Content-Range') } + }) + } + + // valid (syntactically invalid/multiple ranges are treated as a regular response) + if (ranges !== -2 && ranges.length === 1) { + debug('range %j', ranges) + + // Content-Range + res.statusCode = 206 + res.setHeader('Content-Range', contentRange('bytes', len, ranges[0])) + + // adjust for requested range + offset += ranges[0].start + len = ranges[0].end - ranges[0].start + 1 + } + } + + // clone options + for (var prop in options) { + opts[prop] = options[prop] + } + + // set read options + opts.start = offset + opts.end = Math.max(offset, offset + len - 1) + + // content-length + res.setHeader('Content-Length', len) + + // HEAD support + if (req.method === 'HEAD') { + res.end() + return + } + + this.stream(path, opts) +} + +/** + * Transfer file for `path`. + * + * @param {String} path + * @api private + */ +SendStream.prototype.sendFile = function sendFile (path) { + var i = 0 + var self = this + + debug('stat "%s"', path) + fs.stat(path, function onstat (err, stat) { + if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) { + // not found, check extensions + return next(err) + } + if (err) return self.onStatError(err) + if (stat.isDirectory()) return self.redirect(path) + self.emit('file', path, stat) + self.send(path, stat) + }) + + function next (err) { + if (self._extensions.length <= i) { + return err + ? self.onStatError(err) + : self.error(404) + } + + var p = path + '.' + self._extensions[i++] + + debug('stat "%s"', p) + fs.stat(p, function (err, stat) { + if (err) return next(err) + if (stat.isDirectory()) return next() + self.emit('file', p, stat) + self.send(p, stat) + }) + } +} + +/** + * Transfer index for `path`. + * + * @param {String} path + * @api private + */ +SendStream.prototype.sendIndex = function sendIndex (path) { + var i = -1 + var self = this + + function next (err) { + if (++i >= self._index.length) { + if (err) return self.onStatError(err) + return self.error(404) + } + + var p = join(path, self._index[i]) + + debug('stat "%s"', p) + fs.stat(p, function (err, stat) { + if (err) return next(err) + if (stat.isDirectory()) return next() + self.emit('file', p, stat) + self.send(p, stat) + }) + } + + next() +} + +/** + * Stream `path` to the response. + * + * @param {String} path + * @param {Object} options + * @api private + */ + +SendStream.prototype.stream = function stream (path, options) { + var self = this + var res = this.res + + // pipe + var stream = fs.createReadStream(path, options) + this.emit('stream', stream) + stream.pipe(res) + + // cleanup + function cleanup () { + destroy(stream, true) + } + + // response finished, cleanup + onFinished(res, cleanup) + + // error handling + stream.on('error', function onerror (err) { + // clean up stream early + cleanup() + + // error + self.onStatError(err) + }) + + // end + stream.on('end', function onend () { + self.emit('end') + }) +} + +/** + * Set content-type based on `path` + * if it hasn't been explicitly set. + * + * @param {String} path + * @api private + */ + +SendStream.prototype.type = function type (path) { + var res = this.res + + if (res.getHeader('Content-Type')) return + + var type = mime.lookup(path) + + if (!type) { + debug('no content-type') + return + } + + var charset = mime.charsets.lookup(type) + + debug('content-type %s', type) + res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')) +} + +/** + * Set response header fields, most + * fields may be pre-defined. + * + * @param {String} path + * @param {Object} stat + * @api private + */ + +SendStream.prototype.setHeader = function setHeader (path, stat) { + var res = this.res + + this.emit('headers', res, path, stat) + + if (this._acceptRanges && !res.getHeader('Accept-Ranges')) { + debug('accept ranges') + res.setHeader('Accept-Ranges', 'bytes') + } + + if (this._cacheControl && !res.getHeader('Cache-Control')) { + var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000) + + if (this._immutable) { + cacheControl += ', immutable' + } + + debug('cache-control %s', cacheControl) + res.setHeader('Cache-Control', cacheControl) + } + + if (this._lastModified && !res.getHeader('Last-Modified')) { + var modified = stat.mtime.toUTCString() + debug('modified %s', modified) + res.setHeader('Last-Modified', modified) + } + + if (this._etag && !res.getHeader('ETag')) { + var val = etag(stat) + debug('etag %s', val) + res.setHeader('ETag', val) + } +} + +/** + * Clear all headers from a response. + * + * @param {object} res + * @private + */ + +function clearHeaders (res) { + var headers = getHeaderNames(res) + + for (var i = 0; i < headers.length; i++) { + res.removeHeader(headers[i]) + } +} + +/** + * Collapse all leading slashes into a single slash + * + * @param {string} str + * @private + */ +function collapseLeadingSlashes (str) { + for (var i = 0; i < str.length; i++) { + if (str[i] !== '/') { + break + } + } + + return i > 1 + ? '/' + str.substr(i) + : str +} + +/** + * Determine if path parts contain a dotfile. + * + * @api private + */ + +function containsDotFile (parts) { + for (var i = 0; i < parts.length; i++) { + var part = parts[i] + if (part.length > 1 && part[0] === '.') { + return true + } + } + + return false +} + +/** + * Create a Content-Range header. + * + * @param {string} type + * @param {number} size + * @param {array} [range] + */ + +function contentRange (type, size, range) { + return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size +} + +/** + * Create a minimal HTML document. + * + * @param {string} title + * @param {string} body + * @private + */ + +function createHtmlDocument (title, body) { + return '\n' + + '\n' + + '\n' + + '\n' + + '' + title + '\n' + + '\n' + + '\n' + + '
' + body + '
\n' + + '\n' + + '\n' +} + +/** + * Create a HttpError object from simple arguments. + * + * @param {number} status + * @param {Error|object} err + * @private + */ + +function createHttpError (status, err) { + if (!err) { + return createError(status) + } + + return err instanceof Error + ? createError(status, err, { expose: false }) + : createError(status, err) +} + +/** + * decodeURIComponent. + * + * Allows V8 to only deoptimize this fn instead of all + * of send(). + * + * @param {String} path + * @api private + */ + +function decode (path) { + try { + return decodeURIComponent(path) + } catch (err) { + return -1 + } +} + +/** + * Get the header names on a respnse. + * + * @param {object} res + * @returns {array[string]} + * @private + */ + +function getHeaderNames (res) { + return typeof res.getHeaderNames !== 'function' + ? Object.keys(res._headers || {}) + : res.getHeaderNames() +} + +/** + * Determine if emitter has listeners of a given type. + * + * The way to do this check is done three different ways in Node.js >= 0.8 + * so this consolidates them into a minimal set using instance methods. + * + * @param {EventEmitter} emitter + * @param {string} type + * @returns {boolean} + * @private + */ + +function hasListeners (emitter, type) { + var count = typeof emitter.listenerCount !== 'function' + ? emitter.listeners(type).length + : emitter.listenerCount(type) + + return count > 0 +} + +/** + * Determine if the response headers have been sent. + * + * @param {object} res + * @returns {boolean} + * @private + */ + +function headersSent (res) { + return typeof res.headersSent !== 'boolean' + ? Boolean(res._header) + : res.headersSent +} + +/** + * Normalize the index option into an array. + * + * @param {boolean|string|array} val + * @param {string} name + * @private + */ + +function normalizeList (val, name) { + var list = [].concat(val || []) + + for (var i = 0; i < list.length; i++) { + if (typeof list[i] !== 'string') { + throw new TypeError(name + ' must be array of strings or false') + } + } + + return list +} + +/** + * Parse an HTTP Date into a number. + * + * @param {string} date + * @private + */ + +function parseHttpDate (date) { + var timestamp = date && Date.parse(date) + + return typeof timestamp === 'number' + ? timestamp + : NaN +} + +/** + * Parse a HTTP token list. + * + * @param {string} str + * @private + */ + +function parseTokenList (str) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = str.length; i < len; i++) { + switch (str.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + if (start !== end) { + list.push(str.substring(start, end)) + } + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + if (start !== end) { + list.push(str.substring(start, end)) + } + + return list +} + +/** + * Set an object of headers on a response. + * + * @param {object} res + * @param {object} headers + * @private + */ + +function setHeaders (res, headers) { + var keys = Object.keys(headers) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + res.setHeader(key, headers[key]) + } +} diff --git a/node_modules/send/node_modules/ms/index.js b/node_modules/send/node_modules/ms/index.js new file mode 100644 index 00000000..ea734fb7 --- /dev/null +++ b/node_modules/send/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function (val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/node_modules/send/node_modules/ms/license.md b/node_modules/send/node_modules/ms/license.md new file mode 100644 index 00000000..fa5d39b6 --- /dev/null +++ b/node_modules/send/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Vercel, Inc. + +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/send/node_modules/ms/package.json b/node_modules/send/node_modules/ms/package.json new file mode 100644 index 00000000..49971890 --- /dev/null +++ b/node_modules/send/node_modules/ms/package.json @@ -0,0 +1,38 @@ +{ + "name": "ms", + "version": "2.1.3", + "description": "Tiny millisecond conversion utility", + "repository": "vercel/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "4.18.2", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1", + "prettier": "2.0.5" + } +} diff --git a/node_modules/send/node_modules/ms/readme.md b/node_modules/send/node_modules/ms/readme.md new file mode 100644 index 00000000..0fc1abb3 --- /dev/null +++ b/node_modules/send/node_modules/ms/readme.md @@ -0,0 +1,59 @@ +# ms + +![CI](https://github.com/vercel/ms/workflows/CI/badge.svg) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node_modules/send/package.json b/node_modules/send/package.json new file mode 100644 index 00000000..7f269d51 --- /dev/null +++ b/node_modules/send/package.json @@ -0,0 +1,62 @@ +{ + "name": "send", + "description": "Better streaming static file server with Range and conditional-GET support", + "version": "0.18.0", + "author": "TJ Holowaychuk ", + "contributors": [ + "Douglas Christopher Wilson ", + "James Wyatt Cready ", + "Jesús Leganés Combarro " + ], + "license": "MIT", + "repository": "pillarjs/send", + "keywords": [ + "static", + "file", + "server" + ], + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "devDependencies": { + "after": "0.8.2", + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.2", + "nyc": "15.1.0", + "supertest": "6.2.2" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --check-leaks --reporter spec --bail", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/node_modules/serve-static/HISTORY.md b/node_modules/serve-static/HISTORY.md new file mode 100644 index 00000000..6b584563 --- /dev/null +++ b/node_modules/serve-static/HISTORY.md @@ -0,0 +1,471 @@ +1.15.0 / 2022-03-24 +=================== + + * deps: send@0.18.0 + - Fix emitted 416 error missing headers property + - Limit the headers removed for 304 response + - deps: depd@2.0.0 + - deps: destroy@1.2.0 + - deps: http-errors@2.0.0 + - deps: on-finished@2.4.1 + - deps: statuses@2.0.1 + +1.14.2 / 2021-12-15 +=================== + + * deps: send@0.17.2 + - deps: http-errors@1.8.1 + - deps: ms@2.1.3 + - pref: ignore empty http tokens + +1.14.1 / 2019-05-10 +=================== + + * Set stricter CSP header in redirect response + * deps: send@0.17.1 + - deps: range-parser@~1.2.1 + +1.14.0 / 2019-05-07 +=================== + + * deps: parseurl@~1.3.3 + * deps: send@0.17.0 + - deps: http-errors@~1.7.2 + - deps: mime@1.6.0 + - deps: ms@2.1.1 + - deps: statuses@~1.5.0 + - perf: remove redundant `path.normalize` call + +1.13.2 / 2018-02-07 +=================== + + * Fix incorrect end tag in redirects + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: send@0.16.2 + - deps: depd@~1.1.2 + - deps: encodeurl@~1.0.2 + - deps: statuses@~1.4.0 + +1.13.1 / 2017-09-29 +=================== + + * Fix regression when `root` is incorrectly set to a file + * deps: send@0.16.1 + +1.13.0 / 2017-09-27 +=================== + + * deps: send@0.16.0 + - Add 70 new types for file extensions + - Add `immutable` option + - Fix missing `` in default error & redirects + - Set charset as "UTF-8" for .js and .json + - Use instance methods on steam to check for listeners + - deps: mime@1.4.1 + - perf: improve path validation speed + +1.12.6 / 2017-09-22 +=================== + + * deps: send@0.15.6 + - deps: debug@2.6.9 + - perf: improve `If-Match` token parsing + * perf: improve slash collapsing + +1.12.5 / 2017-09-21 +=================== + + * deps: parseurl@~1.3.2 + - perf: reduce overhead for full URLs + - perf: unroll the "fast-path" `RegExp` + * deps: send@0.15.5 + - Fix handling of modified headers with invalid dates + - deps: etag@~1.8.1 + - deps: fresh@0.5.2 + +1.12.4 / 2017-08-05 +=================== + + * deps: send@0.15.4 + - deps: debug@2.6.8 + - deps: depd@~1.1.1 + - deps: http-errors@~1.6.2 + +1.12.3 / 2017-05-16 +=================== + + * deps: send@0.15.3 + - deps: debug@2.6.7 + +1.12.2 / 2017-04-26 +=================== + + * deps: send@0.15.2 + - deps: debug@2.6.4 + +1.12.1 / 2017-03-04 +=================== + + * deps: send@0.15.1 + - Fix issue when `Date.parse` does not return `NaN` on invalid date + - Fix strict violation in broken environments + +1.12.0 / 2017-02-25 +=================== + + * Send complete HTML document in redirect response + * Set default CSP header in redirect response + * deps: send@0.15.0 + - Fix false detection of `no-cache` request directive + - Fix incorrect result when `If-None-Match` has both `*` and ETags + - Fix weak `ETag` matching to match spec + - Remove usage of `res._headers` private field + - Support `If-Match` and `If-Unmodified-Since` headers + - Use `res.getHeaderNames()` when available + - Use `res.headersSent` when available + - deps: debug@2.6.1 + - deps: etag@~1.8.0 + - deps: fresh@0.5.0 + - deps: http-errors@~1.6.1 + +1.11.2 / 2017-01-23 +=================== + + * deps: send@0.14.2 + - deps: http-errors@~1.5.1 + - deps: ms@0.7.2 + - deps: statuses@~1.3.1 + +1.11.1 / 2016-06-10 +=================== + + * Fix redirect error when `req.url` contains raw non-URL characters + * deps: send@0.14.1 + +1.11.0 / 2016-06-07 +=================== + + * Use status code 301 for redirects + * deps: send@0.14.0 + - Add `acceptRanges` option + - Add `cacheControl` option + - Attempt to combine multiple ranges into single range + - Correctly inherit from `Stream` class + - Fix `Content-Range` header in 416 responses when using `start`/`end` options + - Fix `Content-Range` header missing from default 416 responses + - Ignore non-byte `Range` headers + - deps: http-errors@~1.5.0 + - deps: range-parser@~1.2.0 + - deps: statuses@~1.3.0 + - perf: remove argument reassignment + +1.10.3 / 2016-05-30 +=================== + + * deps: send@0.13.2 + - Fix invalid `Content-Type` header when `send.mime.default_type` unset + +1.10.2 / 2016-01-19 +=================== + + * deps: parseurl@~1.3.1 + - perf: enable strict mode + +1.10.1 / 2016-01-16 +=================== + + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + * deps: send@0.13.1 + - deps: depd@~1.1.0 + - deps: destroy@~1.0.4 + - deps: escape-html@~1.0.3 + - deps: range-parser@~1.0.3 + +1.10.0 / 2015-06-17 +=================== + + * Add `fallthrough` option + - Allows declaring this middleware is the final destination + - Provides better integration with Express patterns + * Fix reading options from options prototype + * Improve the default redirect response headers + * deps: escape-html@1.0.2 + * deps: send@0.13.0 + - Allow Node.js HTTP server to set `Date` response header + - Fix incorrectly removing `Content-Location` on 304 response + - Improve the default redirect response headers + - Send appropriate headers on default error response + - Use `http-errors` for standard emitted errors + - Use `statuses` instead of `http` module for status messages + - deps: escape-html@1.0.2 + - deps: etag@~1.7.0 + - deps: fresh@0.3.0 + - deps: on-finished@~2.3.0 + - perf: enable strict mode + - perf: remove unnecessary array allocations + * perf: enable strict mode + * perf: remove argument reassignment + +1.9.3 / 2015-05-14 +================== + + * deps: send@0.12.3 + - deps: debug@~2.2.0 + - deps: depd@~1.0.1 + - deps: etag@~1.6.0 + - deps: ms@0.7.1 + - deps: on-finished@~2.2.1 + +1.9.2 / 2015-03-14 +================== + + * deps: send@0.12.2 + - Throw errors early for invalid `extensions` or `index` options + - deps: debug@~2.1.3 + +1.9.1 / 2015-02-17 +================== + + * deps: send@0.12.1 + - Fix regression sending zero-length files + +1.9.0 / 2015-02-16 +================== + + * deps: send@0.12.0 + - Always read the stat size from the file + - Fix mutating passed-in `options` + - deps: mime@1.3.4 + +1.8.1 / 2015-01-20 +================== + + * Fix redirect loop in Node.js 0.11.14 + * deps: send@0.11.1 + - Fix root path disclosure + +1.8.0 / 2015-01-05 +================== + + * deps: send@0.11.0 + - deps: debug@~2.1.1 + - deps: etag@~1.5.1 + - deps: ms@0.7.0 + - deps: on-finished@~2.2.0 + +1.7.2 / 2015-01-02 +================== + + * Fix potential open redirect when mounted at root + +1.7.1 / 2014-10-22 +================== + + * deps: send@0.10.1 + - deps: on-finished@~2.1.1 + +1.7.0 / 2014-10-15 +================== + + * deps: send@0.10.0 + - deps: debug@~2.1.0 + - deps: depd@~1.0.0 + - deps: etag@~1.5.0 + +1.6.5 / 2015-02-04 +================== + + * Fix potential open redirect when mounted at root + - Back-ported from v1.7.2 + +1.6.4 / 2014-10-08 +================== + + * Fix redirect loop when index file serving disabled + +1.6.3 / 2014-09-24 +================== + + * deps: send@0.9.3 + - deps: etag@~1.4.0 + +1.6.2 / 2014-09-15 +================== + + * deps: send@0.9.2 + - deps: depd@0.4.5 + - deps: etag@~1.3.1 + - deps: range-parser@~1.0.2 + +1.6.1 / 2014-09-07 +================== + + * deps: send@0.9.1 + - deps: fresh@0.2.4 + +1.6.0 / 2014-09-07 +================== + + * deps: send@0.9.0 + - Add `lastModified` option + - Use `etag` to generate `ETag` header + - deps: debug@~2.0.0 + +1.5.4 / 2014-09-04 +================== + + * deps: send@0.8.5 + - Fix a path traversal issue when using `root` + - Fix malicious path detection for empty string path + +1.5.3 / 2014-08-17 +================== + + * deps: send@0.8.3 + +1.5.2 / 2014-08-14 +================== + + * deps: send@0.8.2 + - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` + +1.5.1 / 2014-08-09 +================== + + * Fix parsing of weird `req.originalUrl` values + * deps: parseurl@~1.3.0 + * deps: utils-merge@1.0.0 + +1.5.0 / 2014-08-05 +================== + + * deps: send@0.8.1 + - Add `extensions` option + +1.4.4 / 2014-08-04 +================== + + * deps: send@0.7.4 + - Fix serving index files without root dir + +1.4.3 / 2014-07-29 +================== + + * deps: send@0.7.3 + - Fix incorrect 403 on Windows and Node.js 0.11 + +1.4.2 / 2014-07-27 +================== + + * deps: send@0.7.2 + - deps: depd@0.4.4 + +1.4.1 / 2014-07-26 +================== + + * deps: send@0.7.1 + - deps: depd@0.4.3 + +1.4.0 / 2014-07-21 +================== + + * deps: parseurl@~1.2.0 + - Cache URLs based on original value + - Remove no-longer-needed URL mis-parse work-around + - Simplify the "fast-path" `RegExp` + * deps: send@0.7.0 + - Add `dotfiles` option + - deps: debug@1.0.4 + - deps: depd@0.4.2 + +1.3.2 / 2014-07-11 +================== + + * deps: send@0.6.0 + - Cap `maxAge` value to 1 year + - deps: debug@1.0.3 + +1.3.1 / 2014-07-09 +================== + + * deps: parseurl@~1.1.3 + - faster parsing of href-only URLs + +1.3.0 / 2014-06-28 +================== + + * Add `setHeaders` option + * Include HTML link in redirect response + * deps: send@0.5.0 + - Accept string for `maxAge` (converted by `ms`) + +1.2.3 / 2014-06-11 +================== + + * deps: send@0.4.3 + - Do not throw un-catchable error on file open race condition + - Use `escape-html` for HTML escaping + - deps: debug@1.0.2 + - deps: finished@1.2.2 + - deps: fresh@0.2.2 + +1.2.2 / 2014-06-09 +================== + + * deps: send@0.4.2 + - fix "event emitter leak" warnings + - deps: debug@1.0.1 + - deps: finished@1.2.1 + +1.2.1 / 2014-06-02 +================== + + * use `escape-html` for escaping + * deps: send@0.4.1 + - Send `max-age` in `Cache-Control` in correct format + +1.2.0 / 2014-05-29 +================== + + * deps: send@0.4.0 + - Calculate ETag with md5 for reduced collisions + - Fix wrong behavior when index file matches directory + - Ignore stream errors after request ends + - Skip directories in index file search + - deps: debug@0.8.1 + +1.1.0 / 2014-04-24 +================== + + * Accept options directly to `send` module + * deps: send@0.3.0 + +1.0.4 / 2014-04-07 +================== + + * Resolve relative paths at middleware setup + * Use parseurl to parse the URL from request + +1.0.3 / 2014-03-20 +================== + + * Do not rely on connect-like environments + +1.0.2 / 2014-03-06 +================== + + * deps: send@0.2.0 + +1.0.1 / 2014-03-05 +================== + + * Add mime export for back-compat + +1.0.0 / 2014-03-05 +================== + + * Genesis from `connect` diff --git a/node_modules/serve-static/LICENSE b/node_modules/serve-static/LICENSE new file mode 100644 index 00000000..cbe62e8e --- /dev/null +++ b/node_modules/serve-static/LICENSE @@ -0,0 +1,25 @@ +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/serve-static/README.md b/node_modules/serve-static/README.md new file mode 100644 index 00000000..262d944a --- /dev/null +++ b/node_modules/serve-static/README.md @@ -0,0 +1,257 @@ +# serve-static + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Linux Build][github-actions-ci-image]][github-actions-ci-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install serve-static +``` + +## API + +```js +var serveStatic = require('serve-static') +``` + +### serveStatic(root, options) + +Create a new middleware function to serve files from within a given root +directory. The file to serve will be determined by combining `req.url` +with the provided root directory. When a file is not found, instead of +sending a 404 response, this module will instead call `next()` to move on +to the next middleware, allowing for stacking and fall-backs. + +#### Options + +##### acceptRanges + +Enable or disable accepting ranged requests, defaults to true. +Disabling this will not send `Accept-Ranges` and ignore the contents +of the `Range` request header. + +##### cacheControl + +Enable or disable setting `Cache-Control` response header, defaults to +true. Disabling this will ignore the `immutable` and `maxAge` options. + +##### dotfiles + + Set how "dotfiles" are treated when encountered. A dotfile is a file +or directory that begins with a dot ("."). Note this check is done on +the path itself without checking if the path actually exists on the +disk. If `root` is specified, only the dotfiles above the root are +checked (i.e. the root itself can be within a dotfile when set +to "deny"). + + - `'allow'` No special treatment for dotfiles. + - `'deny'` Deny a request for a dotfile and 403/`next()`. + - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`. + +The default value is similar to `'ignore'`, with the exception that this +default will not ignore the files within a directory that begins with a dot. + +##### etag + +Enable or disable etag generation, defaults to true. + +##### extensions + +Set file extension fallbacks. When set, if a file is not found, the given +extensions will be added to the file name and search for. The first that +exists will be served. Example: `['html', 'htm']`. + +The default value is `false`. + +##### fallthrough + +Set the middleware to have client errors fall-through as just unhandled +requests, otherwise forward a client error. The difference is that client +errors like a bad request or a request to a non-existent file will cause +this middleware to simply `next()` to your next middleware when this value +is `true`. When this value is `false`, these errors (even 404s), will invoke +`next(err)`. + +Typically `true` is desired such that multiple physical directories can be +mapped to the same web address or for routes to fill in non-existent files. + +The value `false` can be used if this middleware is mounted at a path that +is designed to be strictly a single file system directory, which allows for +short-circuiting 404s for less overhead. This middleware will also reply to +all methods. + +The default value is `true`. + +##### immutable + +Enable or disable the `immutable` directive in the `Cache-Control` response +header, defaults to `false`. If set to `true`, the `maxAge` option should +also be specified to enable caching. The `immutable` directive will prevent +supported clients from making conditional requests during the life of the +`maxAge` option to check if the file has changed. + +##### index + +By default this module will send "index.html" files in response to a request +on a directory. To disable this set `false` or to supply a new index pass a +string or an array in preferred order. + +##### lastModified + +Enable or disable `Last-Modified` header, defaults to true. Uses the file +system's last modified value. + +##### maxAge + +Provide a max-age in milliseconds for http caching, defaults to 0. This +can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) +module. + +##### redirect + +Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. + +##### setHeaders + +Function to set custom headers on response. Alterations to the headers need to +occur synchronously. The function is called as `fn(res, path, stat)`, where +the arguments are: + + - `res` the response object + - `path` the file path that is being sent + - `stat` the stat object of the file that is being sent + +## Examples + +### Serve files with vanilla node.js http server + +```js +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +// Serve up public/ftp folder +var serve = serveStatic('public/ftp', { index: ['index.html', 'index.htm'] }) + +// Create server +var server = http.createServer(function onRequest (req, res) { + serve(req, res, finalhandler(req, res)) +}) + +// Listen +server.listen(3000) +``` + +### Serve all files as downloads + +```js +var contentDisposition = require('content-disposition') +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +// Serve up public/ftp folder +var serve = serveStatic('public/ftp', { + index: false, + setHeaders: setHeaders +}) + +// Set header to force download +function setHeaders (res, path) { + res.setHeader('Content-Disposition', contentDisposition(path)) +} + +// Create server +var server = http.createServer(function onRequest (req, res) { + serve(req, res, finalhandler(req, res)) +}) + +// Listen +server.listen(3000) +``` + +### Serving using express + +#### Simple + +This is a simple example of using Express. + +```js +var express = require('express') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic('public/ftp', { index: ['default.html', 'default.htm'] })) +app.listen(3000) +``` + +#### Multiple roots + +This example shows a simple way to search through multiple directories. +Files are searched for in `public-optimized/` first, then `public/` second +as a fallback. + +```js +var express = require('express') +var path = require('path') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic(path.join(__dirname, 'public-optimized'))) +app.use(serveStatic(path.join(__dirname, 'public'))) +app.listen(3000) +``` + +#### Different settings for paths + +This example shows how to set a different max age depending on the served +file type. In this example, HTML files are not cached, while everything else +is for 1 day. + +```js +var express = require('express') +var path = require('path') +var serveStatic = require('serve-static') + +var app = express() + +app.use(serveStatic(path.join(__dirname, 'public'), { + maxAge: '1d', + setHeaders: setCustomCacheControl +})) + +app.listen(3000) + +function setCustomCacheControl (res, path) { + if (serveStatic.mime.lookup(path) === 'text/html') { + // Custom Cache-Control for HTML files + res.setHeader('Cache-Control', 'public, max-age=0') + } +} +``` + +## License + +[MIT](LICENSE) + +[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/serve-static/master?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static +[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master +[coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master +[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/serve-static/master?label=linux +[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions/workflows/ci.yml +[node-image]: https://badgen.net/npm/node/serve-static +[node-url]: https://nodejs.org/en/download/ +[npm-downloads-image]: https://badgen.net/npm/dm/serve-static +[npm-url]: https://npmjs.org/package/serve-static +[npm-version-image]: https://badgen.net/npm/v/serve-static diff --git a/node_modules/serve-static/index.js b/node_modules/serve-static/index.js new file mode 100644 index 00000000..b7d3984c --- /dev/null +++ b/node_modules/serve-static/index.js @@ -0,0 +1,210 @@ +/*! + * serve-static + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var parseUrl = require('parseurl') +var resolve = require('path').resolve +var send = require('send') +var url = require('url') + +/** + * Module exports. + * @public + */ + +module.exports = serveStatic +module.exports.mime = send.mime + +/** + * @param {string} root + * @param {object} [options] + * @return {function} + * @public + */ + +function serveStatic (root, options) { + if (!root) { + throw new TypeError('root path required') + } + + if (typeof root !== 'string') { + throw new TypeError('root path must be a string') + } + + // copy options object + var opts = Object.create(options || null) + + // fall-though + var fallthrough = opts.fallthrough !== false + + // default redirect + var redirect = opts.redirect !== false + + // headers listener + var setHeaders = opts.setHeaders + + if (setHeaders && typeof setHeaders !== 'function') { + throw new TypeError('option setHeaders must be function') + } + + // setup options for send + opts.maxage = opts.maxage || opts.maxAge || 0 + opts.root = resolve(root) + + // construct directory listener + var onDirectory = redirect + ? createRedirectDirectoryListener() + : createNotFoundDirectoryListener() + + return function serveStatic (req, res, next) { + if (req.method !== 'GET' && req.method !== 'HEAD') { + if (fallthrough) { + return next() + } + + // method not allowed + res.statusCode = 405 + res.setHeader('Allow', 'GET, HEAD') + res.setHeader('Content-Length', '0') + res.end() + return + } + + var forwardError = !fallthrough + var originalUrl = parseUrl.original(req) + var path = parseUrl(req).pathname + + // make sure redirect occurs at mount + if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { + path = '' + } + + // create send stream + var stream = send(req, path, opts) + + // add directory handler + stream.on('directory', onDirectory) + + // add headers listener + if (setHeaders) { + stream.on('headers', setHeaders) + } + + // add file listener for fallthrough + if (fallthrough) { + stream.on('file', function onFile () { + // once file is determined, always forward error + forwardError = true + }) + } + + // forward errors + stream.on('error', function error (err) { + if (forwardError || !(err.statusCode < 500)) { + next(err) + return + } + + next() + }) + + // pipe + stream.pipe(res) + } +} + +/** + * Collapse all leading slashes into a single slash + * @private + */ +function collapseLeadingSlashes (str) { + for (var i = 0; i < str.length; i++) { + if (str.charCodeAt(i) !== 0x2f /* / */) { + break + } + } + + return i > 1 + ? '/' + str.substr(i) + : str +} + +/** + * Create a minimal HTML document. + * + * @param {string} title + * @param {string} body + * @private + */ + +function createHtmlDocument (title, body) { + return '\n' + + '\n' + + '\n' + + '\n' + + '' + title + '\n' + + '\n' + + '\n' + + '
' + body + '
\n' + + '\n' + + '\n' +} + +/** + * Create a directory listener that just 404s. + * @private + */ + +function createNotFoundDirectoryListener () { + return function notFound () { + this.error(404) + } +} + +/** + * Create a directory listener that performs a redirect. + * @private + */ + +function createRedirectDirectoryListener () { + return function redirect (res) { + if (this.hasTrailingSlash()) { + this.error(404) + return + } + + // get original URL + var originalUrl = parseUrl.original(this.req) + + // append trailing slash + originalUrl.path = null + originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') + + // reformat the URL + var loc = encodeUrl(url.format(originalUrl)) + var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + + escapeHtml(loc) + '') + + // send redirect response + res.statusCode = 301 + res.setHeader('Content-Type', 'text/html; charset=UTF-8') + res.setHeader('Content-Length', Buffer.byteLength(doc)) + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + res.setHeader('Location', loc) + res.end(doc) + } +} diff --git a/node_modules/serve-static/package.json b/node_modules/serve-static/package.json new file mode 100644 index 00000000..9d935f5d --- /dev/null +++ b/node_modules/serve-static/package.json @@ -0,0 +1,42 @@ +{ + "name": "serve-static", + "description": "Serve static files", + "version": "1.15.0", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "repository": "expressjs/serve-static", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "devDependencies": { + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.2", + "nyc": "15.1.0", + "safe-buffer": "5.2.1", + "supertest": "6.2.2" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/node_modules/setprototypeof/LICENSE b/node_modules/setprototypeof/LICENSE new file mode 100644 index 00000000..61afa2f1 --- /dev/null +++ b/node_modules/setprototypeof/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2015, Wes Todd + +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/setprototypeof/README.md b/node_modules/setprototypeof/README.md new file mode 100644 index 00000000..791eeff0 --- /dev/null +++ b/node_modules/setprototypeof/README.md @@ -0,0 +1,31 @@ +# Polyfill for `Object.setPrototypeOf` + +[![NPM Version](https://img.shields.io/npm/v/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) +[![NPM Downloads](https://img.shields.io/npm/dm/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) +[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/standard/standard) + +A simple cross platform implementation to set the prototype of an instianted object. Supports all modern browsers and at least back to IE8. + +## Usage: + +``` +$ npm install --save setprototypeof +``` + +```javascript +var setPrototypeOf = require('setprototypeof') + +var obj = {} +setPrototypeOf(obj, { + foo: function () { + return 'bar' + } +}) +obj.foo() // bar +``` + +TypeScript is also supported: + +```typescript +import setPrototypeOf from 'setprototypeof' +``` diff --git a/node_modules/setprototypeof/index.d.ts b/node_modules/setprototypeof/index.d.ts new file mode 100644 index 00000000..f108ecd0 --- /dev/null +++ b/node_modules/setprototypeof/index.d.ts @@ -0,0 +1,2 @@ +declare function setPrototypeOf(o: any, proto: object | null): any; +export = setPrototypeOf; diff --git a/node_modules/setprototypeof/index.js b/node_modules/setprototypeof/index.js new file mode 100644 index 00000000..c5270551 --- /dev/null +++ b/node_modules/setprototypeof/index.js @@ -0,0 +1,17 @@ +'use strict' +/* eslint no-proto: 0 */ +module.exports = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties) + +function setProtoOf (obj, proto) { + obj.__proto__ = proto + return obj +} + +function mixinProperties (obj, proto) { + for (var prop in proto) { + if (!Object.prototype.hasOwnProperty.call(obj, prop)) { + obj[prop] = proto[prop] + } + } + return obj +} diff --git a/node_modules/setprototypeof/package.json b/node_modules/setprototypeof/package.json new file mode 100644 index 00000000..f20915be --- /dev/null +++ b/node_modules/setprototypeof/package.json @@ -0,0 +1,38 @@ +{ + "name": "setprototypeof", + "version": "1.2.0", + "description": "A small polyfill for Object.setprototypeof", + "main": "index.js", + "typings": "index.d.ts", + "scripts": { + "test": "standard && mocha", + "testallversions": "npm run node010 && npm run node4 && npm run node6 && npm run node9 && npm run node11", + "testversion": "docker run -it --rm -v $(PWD):/usr/src/app -w /usr/src/app node:${NODE_VER} npm install mocha@${MOCHA_VER:-latest} && npm t", + "node010": "NODE_VER=0.10 MOCHA_VER=3 npm run testversion", + "node4": "NODE_VER=4 npm run testversion", + "node6": "NODE_VER=6 npm run testversion", + "node9": "NODE_VER=9 npm run testversion", + "node11": "NODE_VER=11 npm run testversion", + "prepublishOnly": "npm t", + "postpublish": "git push origin && git push origin --tags" + }, + "repository": { + "type": "git", + "url": "https://github.com/wesleytodd/setprototypeof.git" + }, + "keywords": [ + "polyfill", + "object", + "setprototypeof" + ], + "author": "Wes Todd", + "license": "ISC", + "bugs": { + "url": "https://github.com/wesleytodd/setprototypeof/issues" + }, + "homepage": "https://github.com/wesleytodd/setprototypeof", + "devDependencies": { + "mocha": "^6.1.4", + "standard": "^13.0.2" + } +} diff --git a/node_modules/setprototypeof/test/index.js b/node_modules/setprototypeof/test/index.js new file mode 100644 index 00000000..afeb4ddb --- /dev/null +++ b/node_modules/setprototypeof/test/index.js @@ -0,0 +1,24 @@ +'use strict' +/* eslint-env mocha */ +/* eslint no-proto: 0 */ +var assert = require('assert') +var setPrototypeOf = require('..') + +describe('setProtoOf(obj, proto)', function () { + it('should merge objects', function () { + var obj = { a: 1, b: 2 } + var proto = { b: 3, c: 4 } + var mergeObj = setPrototypeOf(obj, proto) + + if (Object.getPrototypeOf) { + assert.strictEqual(Object.getPrototypeOf(obj), proto) + } else if ({ __proto__: [] } instanceof Array) { + assert.strictEqual(obj.__proto__, proto) + } else { + assert.strictEqual(obj.a, 1) + assert.strictEqual(obj.b, 2) + assert.strictEqual(obj.c, 4) + } + assert.strictEqual(mergeObj, obj) + }) +}) diff --git a/node_modules/side-channel/.eslintignore b/node_modules/side-channel/.eslintignore new file mode 100644 index 00000000..404abb22 --- /dev/null +++ b/node_modules/side-channel/.eslintignore @@ -0,0 +1 @@ +coverage/ diff --git a/node_modules/side-channel/.eslintrc b/node_modules/side-channel/.eslintrc new file mode 100644 index 00000000..850ac1fa --- /dev/null +++ b/node_modules/side-channel/.eslintrc @@ -0,0 +1,11 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "max-lines-per-function": 0, + "max-params": 0, + "new-cap": [2, { "capIsNewExceptions": ["GetIntrinsic"] }], + }, +} diff --git a/node_modules/side-channel/.github/FUNDING.yml b/node_modules/side-channel/.github/FUNDING.yml new file mode 100644 index 00000000..2a94840c --- /dev/null +++ b/node_modules/side-channel/.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/side-channel +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/side-channel/.nycrc b/node_modules/side-channel/.nycrc new file mode 100644 index 00000000..1826526e --- /dev/null +++ b/node_modules/side-channel/.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/side-channel/CHANGELOG.md b/node_modules/side-channel/CHANGELOG.md new file mode 100644 index 00000000..a3d161fa --- /dev/null +++ b/node_modules/side-channel/CHANGELOG.md @@ -0,0 +1,65 @@ +# 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.4](https://github.com/ljharb/side-channel/compare/v1.0.3...v1.0.4) - 2020-12-29 + +### Commits + +- [Tests] migrate tests to Github Actions [`10909cb`](https://github.com/ljharb/side-channel/commit/10909cbf8ce9c0bf96f604cf13d7ffd5a22c2d40) +- [Refactor] Use a linked list rather than an array, and move accessed nodes to the beginning [`195613f`](https://github.com/ljharb/side-channel/commit/195613f28b5c1e6072ef0b61b5beebaf2b6a304e) +- [meta] do not publish github action workflow files [`290ec29`](https://github.com/ljharb/side-channel/commit/290ec29cd21a60585145b4a7237ec55228c52c27) +- [Tests] run `nyc` on all tests; use `tape` runner [`ea6d030`](https://github.com/ljharb/side-channel/commit/ea6d030ff3fe6be2eca39e859d644c51ecd88869) +- [actions] add "Allow Edits" workflow [`d464d8f`](https://github.com/ljharb/side-channel/commit/d464d8fe52b5eddf1504a0ed97f0941a90f32c15) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog` [`02daca8`](https://github.com/ljharb/side-channel/commit/02daca87c6809821c97be468d1afa2f5ef447383) +- [Refactor] use `call-bind` and `get-intrinsic` instead of `es-abstract` [`e09d481`](https://github.com/ljharb/side-channel/commit/e09d481528452ebafa5cdeae1af665c35aa2deee) +- [Deps] update `object.assign` [`ee83aa8`](https://github.com/ljharb/side-channel/commit/ee83aa81df313b5e46319a63adb05cf0c179079a) +- [actions] update rebase action to use checkout v2 [`7726b0b`](https://github.com/ljharb/side-channel/commit/7726b0b058b632fccea709f58960871defaaa9d7) + +## [v1.0.3](https://github.com/ljharb/side-channel/compare/v1.0.2...v1.0.3) - 2020-08-23 + +### Commits + +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`1f10561`](https://github.com/ljharb/side-channel/commit/1f105611ef3acf32dec8032ae5c0baa5e56bb868) +- [Deps] update `es-abstract`, `object-inspect` [`bc20159`](https://github.com/ljharb/side-channel/commit/bc201597949a505e37cef9eaf24c7010831e6f03) +- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`b9b2b22`](https://github.com/ljharb/side-channel/commit/b9b2b225f9e0ea72a6ec2b89348f0bd690bc9ed1) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`7055ab4`](https://github.com/ljharb/side-channel/commit/7055ab4de0860606efd2003674a74f1fe6ebc07e) +- [Dev Deps] update `auto-changelog`; add `aud` [`d278c37`](https://github.com/ljharb/side-channel/commit/d278c37d08227be4f84aa769fcd919e73feeba40) +- [actions] switch Automatic Rebase workflow to `pull_request_target` event [`3bcf982`](https://github.com/ljharb/side-channel/commit/3bcf982faa122745b39c33ce83d32fdf003741c6) +- [Tests] only audit prod deps [`18d01c4`](https://github.com/ljharb/side-channel/commit/18d01c4015b82a3d75044c4d5ba7917b2eac01ec) +- [Deps] update `es-abstract` [`6ab096d`](https://github.com/ljharb/side-channel/commit/6ab096d9de2b482cf5e0717e34e212f5b2b9bc9a) +- [Dev Deps] update `tape` [`9dc174c`](https://github.com/ljharb/side-channel/commit/9dc174cc651dfd300b4b72da936a0a7eda5f9452) +- [Deps] update `es-abstract` [`431d0f0`](https://github.com/ljharb/side-channel/commit/431d0f0ff11fbd2ae6f3115582a356d3a1cfce82) +- [Deps] update `es-abstract` [`49869fd`](https://github.com/ljharb/side-channel/commit/49869fd323bf4453f0ba515c0fb265cf5ab7b932) +- [meta] Add package.json to package's exports [`77d9cdc`](https://github.com/ljharb/side-channel/commit/77d9cdceb2a9e47700074f2ae0c0a202e7dac0d4) + +## [v1.0.2](https://github.com/ljharb/side-channel/compare/v1.0.1...v1.0.2) - 2019-12-20 + +### Commits + +- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`4a526df`](https://github.com/ljharb/side-channel/commit/4a526df44e4701566ed001ec78546193f818b082) +- [Deps] update `es-abstract` [`d4f6e62`](https://github.com/ljharb/side-channel/commit/d4f6e629b6fb93a07415db7f30d3c90fd7f264fe) + +## [v1.0.1](https://github.com/ljharb/side-channel/compare/v1.0.0...v1.0.1) - 2019-12-01 + +### Commits + +- [Fix] add missing "exports" [`d212907`](https://github.com/ljharb/side-channel/commit/d2129073abf0701a5343bf28aa2145617604dc2e) + +## v1.0.0 - 2019-12-01 + +### Commits + +- Initial implementation [`dbebd3a`](https://github.com/ljharb/side-channel/commit/dbebd3a4b5ed64242f9a6810efe7c4214cd8cde4) +- Initial tests [`73bdefe`](https://github.com/ljharb/side-channel/commit/73bdefe568c9076cf8c0b8719bc2141aec0e19b8) +- Initial commit [`43c03e1`](https://github.com/ljharb/side-channel/commit/43c03e1c2849ec50a87b7a5cd76238a62b0b8770) +- npm init [`5c090a7`](https://github.com/ljharb/side-channel/commit/5c090a765d66a5527d9889b89aeff78dee91348c) +- [meta] add `auto-changelog` [`a5c4e56`](https://github.com/ljharb/side-channel/commit/a5c4e5675ec02d5eb4d84b4243aeea2a1d38fbec) +- [actions] add automatic rebasing / merge commit blocking [`bab1683`](https://github.com/ljharb/side-channel/commit/bab1683d8f9754b086e94397699fdc645e0d7077) +- [meta] add `funding` field; create FUNDING.yml [`63d7aea`](https://github.com/ljharb/side-channel/commit/63d7aeaf34f5650650ae97ca4b9fae685bd0937c) +- [Tests] add `npm run lint` [`46a5a81`](https://github.com/ljharb/side-channel/commit/46a5a81705cd2664f83df232c01dbbf2ee952885) +- Only apps should have lockfiles [`8b16b03`](https://github.com/ljharb/side-channel/commit/8b16b0305f00895d90c4e2e5773c854cfea0e448) +- [meta] add `safe-publish-latest` [`2f098ef`](https://github.com/ljharb/side-channel/commit/2f098ef092a39399cfe548b19a1fc03c2fd2f490) diff --git a/node_modules/side-channel/LICENSE b/node_modules/side-channel/LICENSE new file mode 100644 index 00000000..3900dd7e --- /dev/null +++ b/node_modules/side-channel/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 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/side-channel/README.md b/node_modules/side-channel/README.md new file mode 100644 index 00000000..7fa4f068 --- /dev/null +++ b/node_modules/side-channel/README.md @@ -0,0 +1,2 @@ +# side-channel +Store information about any JS value in a side channel. Uses WeakMap if available. diff --git a/node_modules/side-channel/index.js b/node_modules/side-channel/index.js new file mode 100644 index 00000000..f1c48264 --- /dev/null +++ b/node_modules/side-channel/index.js @@ -0,0 +1,124 @@ +'use strict'; + +var GetIntrinsic = require('get-intrinsic'); +var callBound = require('call-bind/callBound'); +var inspect = require('object-inspect'); + +var $TypeError = GetIntrinsic('%TypeError%'); +var $WeakMap = GetIntrinsic('%WeakMap%', true); +var $Map = GetIntrinsic('%Map%', true); + +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); + +/* + * This function traverses the list returning the node corresponding to the + * given key. + * + * That node is also moved to the head of the list, so that if it's accessed + * again we don't need to traverse the whole list. By doing so, all the recently + * used nodes can be accessed relatively quickly. + */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + curr.next = list.next; + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; + +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = { // eslint-disable-line no-param-reassign + key: key, + next: objects.next, + value: value + }; + } +}; +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; + +module.exports = function getSideChannel() { + var $wm; + var $m; + var $o; + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + inspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + /* + * Initialize the linked list as an empty node, so that we don't have + * to special-case handling of the first node: we can always refer to + * it as (previous node).next, instead of something like (list).head + */ + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; diff --git a/node_modules/side-channel/package.json b/node_modules/side-channel/package.json new file mode 100644 index 00000000..a3e33f66 --- /dev/null +++ b/node_modules/side-channel/package.json @@ -0,0 +1,67 @@ +{ + "name": "side-channel", + "version": "1.0.4", + "description": "Store information about any JS value in a side channel. Uses WeakMap if available.", + "main": "index.js", + "exports": { + "./package.json": "./package.json", + ".": [ + { + "default": "./index.js" + }, + "./index.js" + ] + }, + "scripts": { + "prepublish": "safe-publish-latest", + "lint": "eslint .", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "npx 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/side-channel.git" + }, + "keywords": [ + "weakmap", + "map", + "side", + "channel", + "metadata" + ], + "author": "Jordan Harband ", + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/ljharb/side-channel/issues" + }, + "homepage": "https://github.com/ljharb/side-channel#readme", + "devDependencies": { + "@ljharb/eslint-config": "^17.3.0", + "aud": "^1.1.3", + "auto-changelog": "^2.2.1", + "eslint": "^7.16.0", + "nyc": "^10.3.2", + "safe-publish-latest": "^1.1.4", + "tape": "^5.0.1" + }, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + } +} diff --git a/node_modules/side-channel/test/index.js b/node_modules/side-channel/test/index.js new file mode 100644 index 00000000..3b92ef7e --- /dev/null +++ b/node_modules/side-channel/test/index.js @@ -0,0 +1,78 @@ +'use strict'; + +var test = require('tape'); + +var getSideChannel = require('../'); + +test('export', function (t) { + t.equal(typeof getSideChannel, 'function', 'is a function'); + t.equal(getSideChannel.length, 0, 'takes no arguments'); + + var channel = getSideChannel(); + t.ok(channel, 'is truthy'); + t.equal(typeof channel, 'object', 'is an object'); + + t.end(); +}); + +test('assert', function (t) { + var channel = getSideChannel(); + t['throws']( + function () { channel.assert({}); }, + TypeError, + 'nonexistent value throws' + ); + + var o = {}; + channel.set(o, 'data'); + t.doesNotThrow(function () { channel.assert(o); }, 'existent value noops'); + + t.end(); +}); + +test('has', function (t) { + var channel = getSideChannel(); + var o = []; + + t.equal(channel.has(o), false, 'nonexistent value yields false'); + + channel.set(o, 'foo'); + t.equal(channel.has(o), true, 'existent value yields true'); + + t.end(); +}); + +test('get', function (t) { + var channel = getSideChannel(); + var o = {}; + t.equal(channel.get(o), undefined, 'nonexistent value yields undefined'); + + var data = {}; + channel.set(o, data); + t.equal(channel.get(o), data, '"get" yields data set by "set"'); + + t.end(); +}); + +test('set', function (t) { + var channel = getSideChannel(); + var o = function () {}; + t.equal(channel.get(o), undefined, 'value not set'); + + channel.set(o, 42); + t.equal(channel.get(o), 42, 'value was set'); + + channel.set(o, Infinity); + t.equal(channel.get(o), Infinity, 'value was set again'); + + var o2 = {}; + channel.set(o2, 17); + t.equal(channel.get(o), Infinity, 'o is not modified'); + t.equal(channel.get(o2), 17, 'o2 is set'); + + channel.set(o, 14); + t.equal(channel.get(o), 14, 'o is modified'); + t.equal(channel.get(o2), 17, 'o2 is not modified'); + + t.end(); +}); diff --git a/node_modules/simple-update-notifier/LICENSE b/node_modules/simple-update-notifier/LICENSE new file mode 100644 index 00000000..1e0b0c11 --- /dev/null +++ b/node_modules/simple-update-notifier/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Alex Brazier + +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/simple-update-notifier/README.md b/node_modules/simple-update-notifier/README.md new file mode 100644 index 00000000..ec177944 --- /dev/null +++ b/node_modules/simple-update-notifier/README.md @@ -0,0 +1,82 @@ +# simple-update-notifier [![GitHub stars](https://img.shields.io/github/stars/alexbrazier/simple-update-notifier?label=Star%20Project&style=social)](https://github.com/alexbrazier/simple-update-notifier/stargazers) + +[![CI](https://github.com/alexbrazier/simple-update-notifier/workflows/Build%20and%20Deploy/badge.svg)](https://github.com/alexbrazier/simple-update-notifier/actions) +[![Dependencies](https://img.shields.io/librariesio/release/npm/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier?activeTab=dependencies) +[![npm](https://img.shields.io/npm/v/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) +[![npm bundle size](https://img.shields.io/bundlephobia/min/simple-update-notifier)](https://bundlephobia.com/result?p=simple-update-notifier) +[![npm downloads](https://img.shields.io/npm/dw/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) +[![License](https://img.shields.io/npm/l/simple-update-notifier)](./LICENSE) + +Simple update notifier to check for npm updates for cli applications. + +Demo in terminal showing an update is required + +Checks for updates for an npm module and outputs to the command line if there is one available. The result is cached for the specified time so it doesn't check every time the app runs. + +## Install + +```bash +npm install simple-update-notifier +OR +yarn add simple-update-notifier +``` + +## Usage + +```js +import updateNotifier from 'simple-update-notifier'; +import packageJson from './package.json' assert { type: 'json' }; + +updateNotifier({ pkg: packageJson }); +``` + +### Options + +#### pkg + +Type: `object` + +##### name + +_Required_\ +Type: `string` + +##### version + +_Required_\ +Type: `string` + +#### updateCheckInterval + +Type: `number`\ +Default: `1000 * 60 * 60 * 24` _(1 day)_ + +How often to check for updates. + +#### shouldNotifyInNpmScript + +Type: `boolean`\ +Default: `false` + +Allows notification to be shown when running as an npm script. + +#### distTag + +Type: `string`\ +Default: `'latest'` + +Which [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages) to use to find the latest version. + +#### alwaysRun + +Type: `boolean`\ +Default: `false` + +When set, `updateCheckInterval` will not be respected and a check for an update will always be performed. + +#### debug + +Type: `boolean`\ +Default: `false` + +When set, logs explaining the decision will be output to `stderr` whenever the module opts to not print an update notification diff --git a/node_modules/simple-update-notifier/build/index.d.ts b/node_modules/simple-update-notifier/build/index.d.ts new file mode 100644 index 00000000..60f53e05 --- /dev/null +++ b/node_modules/simple-update-notifier/build/index.d.ts @@ -0,0 +1,13 @@ +interface IUpdate { + pkg: { + name: string; + version: string; + }; + updateCheckInterval?: number; + shouldNotifyInNpmScript?: boolean; + distTag?: string; + alwaysRun?: boolean; + debug?: boolean; +} +declare const simpleUpdateNotifier: (args: IUpdate) => Promise; +export { simpleUpdateNotifier as default }; diff --git a/node_modules/simple-update-notifier/build/index.js b/node_modules/simple-update-notifier/build/index.js new file mode 100644 index 00000000..3dd2076c --- /dev/null +++ b/node_modules/simple-update-notifier/build/index.js @@ -0,0 +1,217 @@ +'use strict'; + +var process$1 = require('process'); +var semver = require('semver'); +var os = require('os'); +var path = require('path'); +var fs = require('fs'); +var https = require('https'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var process__default = /*#__PURE__*/_interopDefaultLegacy(process$1); +var semver__default = /*#__PURE__*/_interopDefaultLegacy(semver); +var os__default = /*#__PURE__*/_interopDefaultLegacy(os); +var path__default = /*#__PURE__*/_interopDefaultLegacy(path); +var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); +var https__default = /*#__PURE__*/_interopDefaultLegacy(https); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +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. +***************************************************************************** */ + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var packageJson = process__default["default"].env.npm_package_json; +var userAgent = process__default["default"].env.npm_config_user_agent; +var isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); +var isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); +var isNpm = isNpm6 || isNpm7; +var isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); +var isNpmOrYarn = isNpm || isYarn; + +var homeDirectory = os__default["default"].homedir(); +var configDir = process.env.XDG_CONFIG_HOME || + path__default["default"].join(homeDirectory, '.config', 'simple-update-notifier'); +var getConfigFile = function (packageName) { + return path__default["default"].join(configDir, "".concat(packageName.replace('@', '').replace('/', '__'), ".json")); +}; +var createConfigDir = function () { + if (!fs__default["default"].existsSync(configDir)) { + fs__default["default"].mkdirSync(configDir, { recursive: true }); + } +}; +var getLastUpdate = function (packageName) { + var configFile = getConfigFile(packageName); + try { + if (!fs__default["default"].existsSync(configFile)) { + return undefined; + } + var file = JSON.parse(fs__default["default"].readFileSync(configFile, 'utf8')); + return file.lastUpdateCheck; + } + catch (_a) { + return undefined; + } +}; +var saveLastUpdate = function (packageName) { + var configFile = getConfigFile(packageName); + fs__default["default"].writeFileSync(configFile, JSON.stringify({ lastUpdateCheck: new Date().getTime() })); +}; + +var getDistVersion = function (packageName, distTag) { return __awaiter(void 0, void 0, void 0, function () { + var url; + return __generator(this, function (_a) { + url = "https://registry.npmjs.org/-/package/".concat(packageName, "/dist-tags"); + return [2 /*return*/, new Promise(function (resolve, reject) { + https__default["default"] + .get(url, function (res) { + var body = ''; + res.on('data', function (chunk) { return (body += chunk); }); + res.on('end', function () { + try { + var json = JSON.parse(body); + var version = json[distTag]; + if (!version) { + reject(new Error('Error getting version')); + } + resolve(version); + } + catch (_a) { + reject(new Error('Could not parse version response')); + } + }); + }) + .on('error', function (err) { return reject(err); }); + })]; + }); +}); }; + +var hasNewVersion = function (_a) { + var pkg = _a.pkg, _b = _a.updateCheckInterval, updateCheckInterval = _b === void 0 ? 1000 * 60 * 60 * 24 : _b, _c = _a.distTag, distTag = _c === void 0 ? 'latest' : _c, alwaysRun = _a.alwaysRun, debug = _a.debug; + return __awaiter(void 0, void 0, void 0, function () { + var lastUpdateCheck, latestVersion; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + createConfigDir(); + lastUpdateCheck = getLastUpdate(pkg.name); + if (!(alwaysRun || + !lastUpdateCheck || + lastUpdateCheck < new Date().getTime() - updateCheckInterval)) return [3 /*break*/, 2]; + return [4 /*yield*/, getDistVersion(pkg.name, distTag)]; + case 1: + latestVersion = _d.sent(); + saveLastUpdate(pkg.name); + if (semver__default["default"].gt(latestVersion, pkg.version)) { + return [2 /*return*/, latestVersion]; + } + else if (debug) { + console.error("Latest version (".concat(latestVersion, ") not newer than current version (").concat(pkg.version, ")")); + } + return [3 /*break*/, 3]; + case 2: + if (debug) { + console.error("Too recent to check for a new update. simpleUpdateNotifier() interval set to ".concat(updateCheckInterval, "ms but only ").concat(new Date().getTime() - lastUpdateCheck, "ms since last check.")); + } + _d.label = 3; + case 3: return [2 /*return*/, false]; + } + }); + }); +}; + +var borderedText = function (text) { + var lines = text.split('\n'); + var width = Math.max.apply(Math, lines.map(function (l) { return l.length; })); + var res = ["\u250C".concat('─'.repeat(width + 2), "\u2510")]; + for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) { + var line = lines_1[_i]; + res.push("\u2502 ".concat(line.padEnd(width), " \u2502")); + } + res.push("\u2514".concat('─'.repeat(width + 2), "\u2518")); + return res.join('\n'); +}; + +var simpleUpdateNotifier = function (args) { return __awaiter(void 0, void 0, void 0, function () { + var latestVersion, err_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!args.alwaysRun && + (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))) { + if (args.debug) { + console.error('Opting out of running simpleUpdateNotifier()'); + } + return [2 /*return*/]; + } + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, hasNewVersion(args)]; + case 2: + latestVersion = _a.sent(); + if (latestVersion) { + console.error(borderedText("New version of ".concat(args.pkg.name, " available!\nCurrent Version: ").concat(args.pkg.version, "\nLatest Version: ").concat(latestVersion))); + } + return [3 /*break*/, 4]; + case 3: + err_1 = _a.sent(); + // Catch any network errors or cache writing errors so module doesn't cause a crash + if (args.debug && err_1 instanceof Error) { + console.error('Unexpected error in simpleUpdateNotifier():', err_1); + } + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); +}); }; + +module.exports = simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/node_modules/.bin/semver b/node_modules/simple-update-notifier/node_modules/.bin/semver new file mode 120000 index 00000000..5aaadf42 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md b/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md new file mode 100644 index 00000000..d366696b --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md @@ -0,0 +1,74 @@ +# changes log + +## 6.3.0 + +* Expose the token enum on the exports + +## 6.2.0 + +* Coerce numbers to strings when passed to semver.coerce() +* Add `rtl` option to coerce from right to left + +## 6.1.3 + +* Handle X-ranges properly in includePrerelease mode + +## 6.1.2 + +* Do not throw when testing invalid version strings + +## 6.1.1 + +* Add options support for semver.coerce() +* Handle undefined version passed to Range.test + +## 6.1.0 + +* Add semver.compareBuild function +* Support `*` in semver.intersects + +## 6.0 + +* Fix `intersects` logic. + + This is technically a bug fix, but since it is also a change to behavior + that may require users updating their code, it is marked as a major + version increment. + +## 5.7 + +* Add `minVersion` method + +## 5.6 + +* Move boolean `loose` param to an options object, with + backwards-compatibility protection. +* Add ability to opt out of special prerelease version handling with + the `includePrerelease` option flag. + +## 5.5 + +* Add version coercion capabilities + +## 5.4 + +* Add intersection checking + +## 5.3 + +* Add `minSatisfying` method + +## 5.2 + +* Add `prerelease(v)` that returns prerelease components + +## 5.1 + +* Add Backus-Naur for ranges +* Remove excessively cute inspection methods + +## 5.0 + +* Remove AMD/Browserified build artifacts +* Fix ltr and gtr when using the `*` range +* Fix for range `*` with a prerelease identifier diff --git a/node_modules/simple-update-notifier/node_modules/semver/LICENSE b/node_modules/simple-update-notifier/node_modules/semver/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/node_modules/simple-update-notifier/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/simple-update-notifier/node_modules/semver/README.md b/node_modules/simple-update-notifier/node_modules/semver/README.md new file mode 100644 index 00000000..15464585 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/README.md @@ -0,0 +1,499 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install semver +```` + +## Usage + +As a node module: + +```js +const 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 +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://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 + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +--rtl + Coerce version strings right to left + +--ltr + Coerce version strings left to right (default) + +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. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for the purpose of range +matching) by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### 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: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ 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 element 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 `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +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. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### 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()`. +* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions + are equal. Sorts in ascending order if passed to `Array.sort()`. + `v2` is greater. Sorts in ascending order if 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. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### 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. +* `minVersion(range)`: Return the lowest version that can possibly match + the given range. +* `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`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +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. + +### Coercion + +* `coerce(version, options)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string, and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). + +If the `options.rtl` flag is set, then `coerce` will return the right-most +coercible tuple that does not share an ending index with a longer coercible +tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not +`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of +any other overlapping SemVer tuple. + +### Clean + +* `clean(version)`: Clean a string to be a valid semver if possible + +This will return a cleaned and trimmed semver version. If the provided +version is not valid a null will be returned. This does not work for +ranges. + +ex. +* `s.clean(' = v 2.1.5foo')`: `null` +* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean(' = v 2.1.5-foo')`: `null` +* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean('=v2.1.5')`: `'2.1.5'` +* `s.clean(' =v2.1.5')`: `2.1.5` +* `s.clean(' 2.1.5 ')`: `'2.1.5'` +* `s.clean('~1.0.0')`: `null` + +## Exported Modules + + + +You may pull in just the part of this semver utility that you need, if you +are sensitive to packing and tree-shaking concerns. The main +`require('semver')` export uses getter functions to lazily load the parts +of the API that are used. + +The following modules are available: + +* `require('semver')` +* `require('semver/classes')` +* `require('semver/classes/comparator')` +* `require('semver/classes/range')` +* `require('semver/classes/semver')` +* `require('semver/functions/clean')` +* `require('semver/functions/cmp')` +* `require('semver/functions/coerce')` +* `require('semver/functions/compare')` +* `require('semver/functions/compare-build')` +* `require('semver/functions/compare-loose')` +* `require('semver/functions/diff')` +* `require('semver/functions/eq')` +* `require('semver/functions/gt')` +* `require('semver/functions/gte')` +* `require('semver/functions/inc')` +* `require('semver/functions/lt')` +* `require('semver/functions/lte')` +* `require('semver/functions/major')` +* `require('semver/functions/minor')` +* `require('semver/functions/neq')` +* `require('semver/functions/parse')` +* `require('semver/functions/patch')` +* `require('semver/functions/prerelease')` +* `require('semver/functions/rcompare')` +* `require('semver/functions/rsort')` +* `require('semver/functions/satisfies')` +* `require('semver/functions/sort')` +* `require('semver/functions/valid')` +* `require('semver/ranges/gtr')` +* `require('semver/ranges/intersects')` +* `require('semver/ranges/ltr')` +* `require('semver/ranges/max-satisfying')` +* `require('semver/ranges/min-satisfying')` +* `require('semver/ranges/min-version')` +* `require('semver/ranges/outside')` +* `require('semver/ranges/to-comparators')` +* `require('semver/ranges/valid')` diff --git a/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js b/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js new file mode 100755 index 00000000..73fe2953 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js @@ -0,0 +1,173 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +const argv = process.argv.slice(2) + +let versions = [] + +const range = [] + +let inc = null + +const version = require('../package.json').version + +let loose = false + +let includePrerelease = false + +let coerce = false + +let rtl = false + +let identifier + +const semver = require('../') + +let reverse = false + +const options = {} + +const main = () => { + if (!argv.length) return help() + while (argv.length) { + let a = argv.shift() + const indexOfEqualSign = a.indexOf('=') + if (indexOfEqualSign !== -1) { + a = a.slice(0, indexOfEqualSign) + argv.unshift(a.slice(indexOfEqualSign + 1)) + } + switch (a) { + case '-rv': case '-rev': case '--rev': case '--reverse': + reverse = true + break + case '-l': case '--loose': + loose = true + break + case '-p': case '--include-prerelease': + includePrerelease = true + break + case '-v': case '--version': + versions.push(argv.shift()) + break + case '-i': case '--inc': case '--increment': + switch (argv[0]) { + case 'major': case 'minor': case 'patch': case 'prerelease': + case 'premajor': case 'preminor': case 'prepatch': + inc = argv.shift() + break + default: + inc = 'patch' + break + } + break + case '--preid': + identifier = argv.shift() + break + case '-r': case '--range': + range.push(argv.shift()) + break + case '-c': case '--coerce': + coerce = true + break + case '--rtl': + rtl = true + break + case '--ltr': + rtl = false + break + case '-h': case '--help': case '-?': + return help() + default: + versions.push(a) + break + } + } + + const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl } + + versions = versions.map((v) => { + return coerce ? (semver.coerce(v, options) || { version: v }).version : v + }).filter((v) => { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) { return failInc() } + + for (let i = 0, l = range.length; i < l; i++) { + versions = versions.filter((v) => { + return semver.satisfies(v, range[i], options) + }) + if (!versions.length) return fail() + } + return success(versions) +} + + +const failInc = () => { + console.error('--inc can only be used on a single version with no range') + fail() +} + +const fail = () => process.exit(1) + +const success = () => { + const compare = reverse ? 'rcompare' : 'compare' + versions.sort((a, b) => { + return semver[compare](a, b, options) + }).map((v) => { + return semver.clean(v, options) + }).map((v) => { + return inc ? semver.inc(v, inc, options, identifier) : v + }).forEach((v, i, _) => { console.log(v) }) +} + +const help = () => console.log( +`SemVer ${version} + +A JavaScript implementation of the https://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 + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +--rtl + Coerce version strings right to left + +--ltr + Coerce version strings left to right (default) + +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.`) + +main() diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js b/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js new file mode 100644 index 00000000..3595792d --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js @@ -0,0 +1,139 @@ +const ANY = Symbol('SemVer ANY') +// hoisted class for cyclic dependency +class Comparator { + static get ANY () { + return ANY + } + constructor (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) + } + + parse (comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + const m = comp.match(r) + + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`) + } + + this.operator = m[1] !== undefined ? 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.options.loose) + } + } + + toString () { + return this.value + } + + test (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY || version === ANY) { + return true + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + return cmp(version, this.operator, this.semver, this.options) + } + + intersects (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (this.operator === '') { + if (this.value === '') { + return true + } + return new Range(comp.value, options).test(this.value) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + return new Range(this.value, options).test(comp.semver) + } + + const sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + const sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + const sameSemVer = this.semver.version === comp.semver.version + const differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + const oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<') + const oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>') + + return ( + sameDirectionIncreasing || + sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || + oppositeDirectionsGreaterThan + ) + } +} + +module.exports = Comparator + +const {re, t} = require('../internal/re') +const cmp = require('../functions/cmp') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const Range = require('./range') diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/index.js b/node_modules/simple-update-notifier/node_modules/semver/classes/index.js new file mode 100644 index 00000000..198b84d6 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/classes/index.js @@ -0,0 +1,5 @@ +module.exports = { + SemVer: require('./semver.js'), + Range: require('./range.js'), + Comparator: require('./comparator.js') +} diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/range.js b/node_modules/simple-update-notifier/node_modules/semver/classes/range.js new file mode 100644 index 00000000..90876c38 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/classes/range.js @@ -0,0 +1,448 @@ +// hoisted class for cyclic dependency +class Range { + constructor (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if ( + range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease + ) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + // just put it in the set and return + this.raw = range.value + this.set = [[range]] + this.format() + return this + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range + .split(/\s*\|\|\s*/) + // map the range to a 2d array of comparators + .map(range => this.parseRange(range.trim())) + // throw out any comparator lists that are empty + // this generally means that it was not a valid range, which is allowed + // in loose mode, but will still throw if the WHOLE range is invalid. + .filter(c => c.length) + + if (!this.set.length) { + throw new TypeError(`Invalid SemVer Range: ${range}`) + } + + this.format() + } + + format () { + this.range = this.set + .map((comps) => { + return comps.join(' ').trim() + }) + .join('||') + .trim() + return this.range + } + + toString () { + return this.range + } + + parseRange (range) { + const loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.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[t.COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[t.COMPARATORTRIM]) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[t.CARETTRIM], caretTrimReplace) + + // normalize spaces + range = range.split(/\s+/).join(' ') + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + return range + .split(' ') + .map(comp => parseComparator(comp, this.options)) + .join(' ') + .split(/\s+/) + // in loose mode, throw out any that are not valid comparators + .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) + .map(comp => new Comparator(comp, this.options)) + } + + intersects (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some((thisComparators) => { + return ( + isSatisfiable(thisComparators, options) && + range.set.some((rangeComparators) => { + return ( + isSatisfiable(rangeComparators, options) && + thisComparators.every((thisComparator) => { + return rangeComparators.every((rangeComparator) => { + return thisComparator.intersects(rangeComparator, options) + }) + }) + ) + }) + ) + }) + } + + // if ANY of the sets match ALL of its comparators, then pass + test (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + for (let i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false + } +} +module.exports = Range + +const Comparator = require('./comparator') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const { + re, + t, + comparatorTrimReplace, + tildeTrimReplace, + caretTrimReplace +} = require('../internal/re') + +// take a set of comparators and determine whether there +// exists a version which can satisfy it +const isSatisfiable = (comparators, options) => { + let result = true + const remainingComparators = comparators.slice() + let testComparator = remainingComparators.pop() + + while (result && remainingComparators.length) { + result = remainingComparators.every((otherComparator) => { + return testComparator.intersects(otherComparator, options) + }) + + testComparator = remainingComparators.pop() + } + + return result +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +const parseComparator = (comp, options) => { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +const isX = id => !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 +const replaceTildes = (comp, options) => + comp.trim().split(/\s+/).map((comp) => { + return replaceTilde(comp, options) + }).join(' ') + +const replaceTilde = (comp, options) => { + const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + return comp.replace(r, (_, M, m, p, pr) => { + debug('tilde', comp, _, M, m, p, pr) + let 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) + 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 +const replaceCarets = (comp, options) => + comp.trim().split(/\s+/).map((comp) => { + return replaceCaret(comp, options) + }).join(' ') + +const replaceCaret = (comp, options) => { + debug('caret', comp, options) + const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] + return comp.replace(r, (_, M, m, p, pr) => { + debug('caret', comp, _, M, m, p, pr) + let 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 (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 + }) +} + +const replaceXRanges = (comp, options) => { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map((comp) => { + return replaceXRange(comp, options) + }).join(' ') +} + +const replaceXRange = (comp, options) => { + comp = comp.trim() + const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] + return comp.replace(r, (ret, gtlt, M, m, p, pr) => { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + const xM = isX(M) + const xm = xM || isX(m) + const xp = xm || isX(p) + const anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + // if we're including prereleases in the match, then we need + // to fix this to -0, the lowest possible prerelease value + pr = options.includePrerelease ? '-0' : '' + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0-0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + 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}${pr}` + } else if (xm) { + ret = `>=${M}.0.0${pr} <${+M + 1}.0.0${pr}` + } else if (xp) { + ret = `>=${M}.${m}.0${pr + } <${M}.${+m + 1}.0${pr}` + } + + 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. +const replaceStars = (comp, options) => { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[t.STAR], '') +} + +// This function is passed to string.replace(re[t.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 +const 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() +} + +const testSet = (set, version, options) => { + for (let i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // 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 (let i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === Comparator.ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + const 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 +} diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js b/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js new file mode 100644 index 00000000..73247ad2 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js @@ -0,0 +1,290 @@ +const debug = require('../internal/debug') +const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants') +const { re, t } = require('../internal/re') + +const { compareIdentifiers } = require('../internal/identifiers') +class SemVer { + constructor (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === !!options.loose && + version.includePrerelease === !!options.includePrerelease) { + 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` + ) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + // this isn't actually relevant for versions, but keep it so that we + // don't run into trouble passing this.options around. + this.includePrerelease = !!options.includePrerelease + + const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.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((id) => { + if (/^[0-9]+$/.test(id)) { + const num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() + } + + format () { + this.version = `${this.major}.${this.minor}.${this.patch}` + if (this.prerelease.length) { + this.version += `-${this.prerelease.join('.')}` + } + return this.version + } + + toString () { + return this.version + } + + compare (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + if (typeof other === 'string' && other === this.version) { + return 0 + } + other = new SemVer(other, this.options) + } + + if (other.version === this.version) { + return 0 + } + + return this.compareMain(other) || this.comparePre(other) + } + + compareMain (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return ( + compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) + ) + } + + comparePre (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // 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 + } + + let i = 0 + do { + const a = this.prerelease[i] + const 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) + } + + compareBuild (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + let i = 0 + do { + const a = this.build[i] + const b = other.build[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. + inc (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 { + let 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 + } +} + +module.exports = SemVer diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js b/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js new file mode 100644 index 00000000..811fe6b8 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const clean = (version, options) => { + const s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} +module.exports = clean diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js b/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js new file mode 100644 index 00000000..3b89db77 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js @@ -0,0 +1,48 @@ +const eq = require('./eq') +const neq = require('./neq') +const gt = require('./gt') +const gte = require('./gte') +const lt = require('./lt') +const lte = require('./lte') + +const cmp = (a, op, b, loose) => { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError(`Invalid operator: ${op}`) + } +} +module.exports = cmp diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js b/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js new file mode 100644 index 00000000..106ca71c --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js @@ -0,0 +1,51 @@ +const SemVer = require('../classes/semver') +const parse = require('./parse') +const {re, t} = require('../internal/re') + +const coerce = (version, options) => { + if (version instanceof SemVer) { + return version + } + + if (typeof version === 'number') { + version = String(version) + } + + if (typeof version !== 'string') { + return null + } + + options = options || {} + + let match = null + if (!options.rtl) { + match = version.match(re[t.COERCE]) + } else { + // Find the right-most coercible string that does not share + // a terminus with a more left-ward coercible string. + // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' + // + // Walk through the string checking with a /g regexp + // Manually set the index so as to pick up overlapping matches. + // Stop when we get a match that ends at the string end, since no + // coercible string can be more right-ward without the same terminus. + let next + while ((next = re[t.COERCERTL].exec(version)) && + (!match || match.index + match[0].length !== version.length) + ) { + if (!match || + next.index + next[0].length !== match.index + match[0].length) { + match = next + } + re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length + } + // leave it in a clean state + re[t.COERCERTL].lastIndex = -1 + } + + if (match === null) + return null + + return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options) +} +module.exports = coerce diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js new file mode 100644 index 00000000..9eb881be --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js @@ -0,0 +1,7 @@ +const SemVer = require('../classes/semver') +const compareBuild = (a, b, loose) => { + const versionA = new SemVer(a, loose) + const versionB = new SemVer(b, loose) + return versionA.compare(versionB) || versionA.compareBuild(versionB) +} +module.exports = compareBuild diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js new file mode 100644 index 00000000..4881fbe0 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const compareLoose = (a, b) => compare(a, b, true) +module.exports = compareLoose diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js new file mode 100644 index 00000000..748b7afa --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js @@ -0,0 +1,5 @@ +const SemVer = require('../classes/semver') +const compare = (a, b, loose) => + new SemVer(a, loose).compare(new SemVer(b, loose)) + +module.exports = compare diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js b/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js new file mode 100644 index 00000000..1493666e --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js @@ -0,0 +1,25 @@ +const parse = require('./parse') +const eq = require('./eq') + +const diff = (version1, version2) => { + if (eq(version1, version2)) { + return null + } else { + const v1 = parse(version1) + const v2 = parse(version2) + let prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (const key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} +module.exports = diff diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js b/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js new file mode 100644 index 00000000..271fed97 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const eq = (a, b, loose) => compare(a, b, loose) === 0 +module.exports = eq diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js b/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js new file mode 100644 index 00000000..d9b2156d --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gt = (a, b, loose) => compare(a, b, loose) > 0 +module.exports = gt diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js b/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js new file mode 100644 index 00000000..5aeaa634 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gte = (a, b, loose) => compare(a, b, loose) >= 0 +module.exports = gte diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js b/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js new file mode 100644 index 00000000..aa4d83ab --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js @@ -0,0 +1,15 @@ +const SemVer = require('../classes/semver') + +const inc = (version, release, options, identifier) => { + if (typeof (options) === 'string') { + identifier = options + options = undefined + } + + try { + return new SemVer(version, options).inc(release, identifier).version + } catch (er) { + return null + } +} +module.exports = inc diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js b/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js new file mode 100644 index 00000000..b440ab7d --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lt = (a, b, loose) => compare(a, b, loose) < 0 +module.exports = lt diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js b/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js new file mode 100644 index 00000000..6dcc9565 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lte = (a, b, loose) => compare(a, b, loose) <= 0 +module.exports = lte diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/major.js b/node_modules/simple-update-notifier/node_modules/semver/functions/major.js new file mode 100644 index 00000000..4283165e --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/major.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const major = (a, loose) => new SemVer(a, loose).major +module.exports = major diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js b/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js new file mode 100644 index 00000000..57b3455f --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const minor = (a, loose) => new SemVer(a, loose).minor +module.exports = minor diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js b/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js new file mode 100644 index 00000000..f944c015 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const neq = (a, b, loose) => compare(a, b, loose) !== 0 +module.exports = neq diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js b/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js new file mode 100644 index 00000000..457fee04 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js @@ -0,0 +1,37 @@ +const {MAX_LENGTH} = require('../internal/constants') +const { re, t } = require('../internal/re') +const SemVer = require('../classes/semver') + +const parse = (version, options) => { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + const r = options.loose ? re[t.LOOSE] : re[t.FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +module.exports = parse diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js b/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js new file mode 100644 index 00000000..63afca25 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const patch = (a, loose) => new SemVer(a, loose).patch +module.exports = patch diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js b/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js new file mode 100644 index 00000000..06aa1324 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const prerelease = (version, options) => { + const parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} +module.exports = prerelease diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js b/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js new file mode 100644 index 00000000..0ac509e7 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const rcompare = (a, b, loose) => compare(b, a, loose) +module.exports = rcompare diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js b/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js new file mode 100644 index 00000000..82404c5c --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) +module.exports = rsort diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js b/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js new file mode 100644 index 00000000..50af1c19 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js @@ -0,0 +1,10 @@ +const Range = require('../classes/range') +const satisfies = (version, range, options) => { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} +module.exports = satisfies diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js b/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js new file mode 100644 index 00000000..4d10917a --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) +module.exports = sort diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js b/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js new file mode 100644 index 00000000..f27bae10 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const valid = (version, options) => { + const v = parse(version, options) + return v ? v.version : null +} +module.exports = valid diff --git a/node_modules/simple-update-notifier/node_modules/semver/index.js b/node_modules/simple-update-notifier/node_modules/semver/index.js new file mode 100644 index 00000000..068f8b4e --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/index.js @@ -0,0 +1,64 @@ +const lrCache = {} +const lazyRequire = (path, subkey) => { + const module = lrCache[path] || (lrCache[path] = require(path)) + return subkey ? module[subkey] : module +} + +const lazyExport = (key, path, subkey) => { + Object.defineProperty(exports, key, { + get: () => { + const res = lazyRequire(path, subkey) + Object.defineProperty(exports, key, { + value: res, + enumerable: true, + configurable: true + }) + return res + }, + configurable: true, + enumerable: true + }) +} + +lazyExport('re', './internal/re', 're') +lazyExport('src', './internal/re', 'src') +lazyExport('tokens', './internal/re', 't') +lazyExport('SEMVER_SPEC_VERSION', './internal/constants', 'SEMVER_SPEC_VERSION') +lazyExport('SemVer', './classes/semver') +lazyExport('compareIdentifiers', './internal/identifiers', 'compareIdentifiers') +lazyExport('rcompareIdentifiers', './internal/identifiers', 'rcompareIdentifiers') +lazyExport('parse', './functions/parse') +lazyExport('valid', './functions/valid') +lazyExport('clean', './functions/clean') +lazyExport('inc', './functions/inc') +lazyExport('diff', './functions/diff') +lazyExport('major', './functions/major') +lazyExport('minor', './functions/minor') +lazyExport('patch', './functions/patch') +lazyExport('prerelease', './functions/prerelease') +lazyExport('compare', './functions/compare') +lazyExport('rcompare', './functions/rcompare') +lazyExport('compareLoose', './functions/compare-loose') +lazyExport('compareBuild', './functions/compare-build') +lazyExport('sort', './functions/sort') +lazyExport('rsort', './functions/rsort') +lazyExport('gt', './functions/gt') +lazyExport('lt', './functions/lt') +lazyExport('eq', './functions/eq') +lazyExport('neq', './functions/neq') +lazyExport('gte', './functions/gte') +lazyExport('lte', './functions/lte') +lazyExport('cmp', './functions/cmp') +lazyExport('coerce', './functions/coerce') +lazyExport('Comparator', './classes/comparator') +lazyExport('Range', './classes/range') +lazyExport('satisfies', './functions/satisfies') +lazyExport('toComparators', './ranges/to-comparators') +lazyExport('maxSatisfying', './ranges/max-satisfying') +lazyExport('minSatisfying', './ranges/min-satisfying') +lazyExport('minVersion', './ranges/min-version') +lazyExport('validRange', './ranges/valid') +lazyExport('outside', './ranges/outside') +lazyExport('gtr', './ranges/gtr') +lazyExport('ltr', './ranges/ltr') +lazyExport('intersects', './ranges/intersects') diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js b/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js new file mode 100644 index 00000000..49df215a --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js @@ -0,0 +1,17 @@ +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +const SEMVER_SPEC_VERSION = '2.0.0' + +const MAX_LENGTH = 256 +const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +const MAX_SAFE_COMPONENT_LENGTH = 16 + +module.exports = { + SEMVER_SPEC_VERSION, + MAX_LENGTH, + MAX_SAFE_INTEGER, + MAX_SAFE_COMPONENT_LENGTH +} diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js b/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js new file mode 100644 index 00000000..1c00e136 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js @@ -0,0 +1,9 @@ +const debug = ( + typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG) +) ? (...args) => console.error('SEMVER', ...args) + : () => {} + +module.exports = debug diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js b/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js new file mode 100644 index 00000000..ed130942 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js @@ -0,0 +1,23 @@ +const numeric = /^[0-9]+$/ +const compareIdentifiers = (a, b) => { + const anum = numeric.test(a) + const bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) + +module.exports = { + compareIdentifiers, + rcompareIdentifiers +} diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/re.js b/node_modules/simple-update-notifier/node_modules/semver/internal/re.js new file mode 100644 index 00000000..0e8fb528 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/internal/re.js @@ -0,0 +1,179 @@ +const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants') +const debug = require('./debug') +exports = module.exports = {} + +// The actual regexps go on exports.re +const re = exports.re = [] +const src = exports.src = [] +const t = exports.t = {} +let R = 0 + +const createToken = (name, value, isGlobal) => { + const index = R++ + debug(index, value) + t[name] = index + src[index] = value + re[index] = new RegExp(value, isGlobal ? 'g' : undefined) +} + +// 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. + +createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') +createToken('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. + +createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') + +// ## Main Version +// Three dot-separated numeric identifiers. + +createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})`) + +createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] +}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) + +createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] +}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] +}(?:\\.${src[t.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. + +createToken('FULLPLAIN', `v?${src[t.MAINVERSION] +}${src[t.PRERELEASE]}?${ + src[t.BUILD]}?`) + +createToken('FULL', `^${src[t.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. +createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] +}${src[t.PRERELEASELOOSE]}?${ + src[t.BUILD]}?`) + +createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) + +createToken('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. +createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) +createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) + +createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:${src[t.PRERELEASE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:${src[t.PRERELEASELOOSE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) +createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +createToken('COERCE', `${'(^|[^\\d])' + + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + + `(?:$|[^\\d])`) +createToken('COERCERTL', src[t.COERCE], true) + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +createToken('LONETILDE', '(?:~>?)') + +createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) +exports.tildeTrimReplace = '$1~' + +createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) +createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +createToken('LONECARET', '(?:\\^)') + +createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) +exports.caretTrimReplace = '$1^' + +createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) +createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) +createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] +}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) +exports.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. +createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAIN]})` + + `\\s*$`) + +createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAINLOOSE]})` + + `\\s*$`) + +// Star ranges basically just allow anything at all. +createToken('STAR', '(<|>)?=?\\s*\\*') diff --git a/node_modules/simple-update-notifier/node_modules/semver/package.json b/node_modules/simple-update-notifier/node_modules/semver/package.json new file mode 100644 index 00000000..88574c09 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/package.json @@ -0,0 +1,34 @@ +{ + "name": "semver", + "version": "7.0.0", + "description": "The semantic version parser used by npm.", + "main": "index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "devDependencies": { + "tap": "^14.10.1" + }, + "license": "ISC", + "repository": "https://github.com/npm/node-semver", + "bin": { + "semver": "./bin/semver.js" + }, + "files": [ + "bin", + "range.bnf", + "classes", + "functions", + "internal", + "ranges", + "index.js" + ], + "tap": { + "check-coverage": true, + "coverage-map": "map.js" + } +} diff --git a/node_modules/simple-update-notifier/node_modules/semver/range.bnf b/node_modules/simple-update-notifier/node_modules/semver/range.bnf new file mode 100644 index 00000000..d4c6ae0d --- /dev/null +++ b/node_modules/simple-update-notifier/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/simple-update-notifier/node_modules/semver/ranges/gtr.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js new file mode 100644 index 00000000..db7e3559 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js @@ -0,0 +1,4 @@ +// Determine if version is greater than all the versions possible in the range. +const outside = require('./outside') +const gtr = (version, range, options) => outside(version, range, '>', options) +module.exports = gtr diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js new file mode 100644 index 00000000..3d1a6f31 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js @@ -0,0 +1,7 @@ +const Range = require('../classes/range') +const intersects = (r1, r2, options) => { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} +module.exports = intersects diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js new file mode 100644 index 00000000..528a885e --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js @@ -0,0 +1,4 @@ +const outside = require('./outside') +// Determine if version is less than all the versions possible in the range +const ltr = (version, range, options) => outside(version, range, '<', options) +module.exports = ltr diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js new file mode 100644 index 00000000..6e3d993c --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js @@ -0,0 +1,25 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') + +const maxSatisfying = (versions, range, options) => { + let max = null + let maxSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} +module.exports = maxSatisfying diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js new file mode 100644 index 00000000..9b60974e --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js @@ -0,0 +1,24 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const minSatisfying = (versions, range, options) => { + let min = null + let minSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} +module.exports = minSatisfying diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js new file mode 100644 index 00000000..7118d237 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js @@ -0,0 +1,57 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const gt = require('../functions/gt') + +const minVersion = (range, loose) => { + range = new Range(range, loose) + + let minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + comparators.forEach((comparator) => { + // Clone to avoid manipulating the comparator's semver object. + const compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error(`Unexpected operation: ${comparator.operator}`) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} +module.exports = minVersion diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js new file mode 100644 index 00000000..e35ed117 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js @@ -0,0 +1,80 @@ +const SemVer = require('../classes/semver') +const Comparator = require('../classes/comparator') +const {ANY} = Comparator +const Range = require('../classes/range') +const satisfies = require('../functions/satisfies') +const gt = require('../functions/gt') +const lt = require('../functions/lt') +const lte = require('../functions/lte') +const gte = require('../functions/gte') + +const outside = (version, range, hilo, options) => { + version = new SemVer(version, options) + range = new Range(range, options) + + let 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, options)) { + 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 (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + let high = null + let low = null + + comparators.forEach((comparator) => { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + 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 +} + +module.exports = outside diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js new file mode 100644 index 00000000..6c8bc7e6 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js @@ -0,0 +1,8 @@ +const Range = require('../classes/range') + +// Mostly just for testing and legacy API reasons +const toComparators = (range, options) => + new Range(range, options).set + .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) + +module.exports = toComparators diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js new file mode 100644 index 00000000..365f3568 --- /dev/null +++ b/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js @@ -0,0 +1,11 @@ +const Range = require('../classes/range') +const validRange = (range, options) => { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} +module.exports = validRange diff --git a/node_modules/simple-update-notifier/package.json b/node_modules/simple-update-notifier/package.json new file mode 100644 index 00000000..62f1da5c --- /dev/null +++ b/node_modules/simple-update-notifier/package.json @@ -0,0 +1,97 @@ +{ + "name": "simple-update-notifier", + "version": "1.1.0", + "description": "Simple update notifier to check for npm updates for cli applications", + "main": "build/index.js", + "types": "build/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/alexbrazier/simple-update-notifier.git" + }, + "homepage": "https://github.com/alexbrazier/simple-update-notifier.git", + "author": "alexbrazier", + "license": "MIT", + "engines": { + "node": ">=8.10.0" + }, + "scripts": { + "test": "jest src --noStackTrace", + "build": "rollup -c rollup.config.js", + "prettier:check": "prettier --check src/**/*.ts", + "prettier": "prettier --write src/**/*.ts", + "eslint": "eslint src/**/*.ts", + "lint": "yarn prettier:check && yarn eslint", + "prepare": "yarn lint && yarn build", + "release": "release-it" + }, + "dependencies": { + "semver": "~7.0.0" + }, + "devDependencies": { + "@babel/preset-env": "^7.19.1", + "@babel/preset-typescript": "^7.17.12", + "@release-it/conventional-changelog": "^5.1.0", + "@types/jest": "^29.0.3", + "@types/node": "^18.7.18", + "@typescript-eslint/eslint-plugin": "^5.37.0", + "@typescript-eslint/parser": "^5.37.0", + "eslint": "^8.23.1", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^29.0.3", + "prettier": "^2.7.1", + "release-it": "^15.4.2", + "rollup": "^2.79.0", + "rollup-plugin-ts": "^3.0.2", + "typescript": "^4.8.3" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "files": [ + "build", + "src" + ], + "release-it": { + "git": { + "commitMessage": "chore: release ${version}", + "tagName": "v${version}" + }, + "npm": { + "publish": true + }, + "github": { + "release": true + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "infile": "CHANGELOG.md" + } + } + }, + "eslintConfig": { + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "extends": [ + "prettier", + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "rules": { + "prettier/prettier": [ + "error", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + } +} diff --git a/node_modules/simple-update-notifier/src/borderedText.ts b/node_modules/simple-update-notifier/src/borderedText.ts new file mode 100644 index 00000000..7145ac2f --- /dev/null +++ b/node_modules/simple-update-notifier/src/borderedText.ts @@ -0,0 +1,12 @@ +const borderedText = (text: string) => { + const lines = text.split('\n'); + const width = Math.max(...lines.map((l) => l.length)); + const res = [`┌${'─'.repeat(width + 2)}┐`]; + for (const line of lines) { + res.push(`│ ${line.padEnd(width)} │`); + } + res.push(`└${'─'.repeat(width + 2)}┘`); + return res.join('\n'); +}; + +export default borderedText; diff --git a/node_modules/simple-update-notifier/src/cache.spec.ts b/node_modules/simple-update-notifier/src/cache.spec.ts new file mode 100644 index 00000000..49e1cb27 --- /dev/null +++ b/node_modules/simple-update-notifier/src/cache.spec.ts @@ -0,0 +1,17 @@ +import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; + +createConfigDir(); + +jest.useFakeTimers().setSystemTime(new Date('2022-01-01')); + +const fakeTime = new Date('2022-01-01').getTime(); + +test('can save update then get the update details', () => { + saveLastUpdate('test'); + expect(getLastUpdate('test')).toBe(fakeTime); +}); + +test('prefixed module can save update then get the update details', () => { + saveLastUpdate('@alexbrazier/test'); + expect(getLastUpdate('@alexbrazier/test')).toBe(fakeTime); +}); diff --git a/node_modules/simple-update-notifier/src/cache.ts b/node_modules/simple-update-notifier/src/cache.ts new file mode 100644 index 00000000..e11deba0 --- /dev/null +++ b/node_modules/simple-update-notifier/src/cache.ts @@ -0,0 +1,44 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs'; + +const homeDirectory = os.homedir(); +const configDir = + process.env.XDG_CONFIG_HOME || + path.join(homeDirectory, '.config', 'simple-update-notifier'); + +const getConfigFile = (packageName: string) => { + return path.join( + configDir, + `${packageName.replace('@', '').replace('/', '__')}.json` + ); +}; + +export const createConfigDir = () => { + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir, { recursive: true }); + } +}; + +export const getLastUpdate = (packageName: string) => { + const configFile = getConfigFile(packageName); + + try { + if (!fs.existsSync(configFile)) { + return undefined; + } + const file = JSON.parse(fs.readFileSync(configFile, 'utf8')); + return file.lastUpdateCheck as number; + } catch { + return undefined; + } +}; + +export const saveLastUpdate = (packageName: string) => { + const configFile = getConfigFile(packageName); + + fs.writeFileSync( + configFile, + JSON.stringify({ lastUpdateCheck: new Date().getTime() }) + ); +}; diff --git a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts new file mode 100644 index 00000000..b78a42e5 --- /dev/null +++ b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts @@ -0,0 +1,35 @@ +import Stream from 'stream'; +import https from 'https'; +import getDistVersion from './getDistVersion'; + +jest.mock('https', () => ({ + get: jest.fn(), +})); + +test('Valid response returns version', async () => { + const st = new Stream(); + (https.get as jest.Mock).mockImplementation((url, cb) => { + cb(st); + + st.emit('data', '{"latest":"1.0.0"}'); + st.emit('end'); + }); + + const version = await getDistVersion('test', 'latest'); + + expect(version).toEqual('1.0.0'); +}); + +test('Invalid response throws error', async () => { + const st = new Stream(); + (https.get as jest.Mock).mockImplementation((url, cb) => { + cb(st); + + st.emit('data', 'some invalid json'); + st.emit('end'); + }); + + expect(getDistVersion('test', 'latest')).rejects.toThrow( + 'Could not parse version response' + ); +}); diff --git a/node_modules/simple-update-notifier/src/getDistVersion.ts b/node_modules/simple-update-notifier/src/getDistVersion.ts new file mode 100644 index 00000000..d474e1f9 --- /dev/null +++ b/node_modules/simple-update-notifier/src/getDistVersion.ts @@ -0,0 +1,29 @@ +import https from 'https'; + +const getDistVersion = async (packageName: string, distTag: string) => { + const url = `https://registry.npmjs.org/-/package/${packageName}/dist-tags`; + + return new Promise((resolve, reject) => { + https + .get(url, (res) => { + let body = ''; + + res.on('data', (chunk) => (body += chunk)); + res.on('end', () => { + try { + const json = JSON.parse(body); + const version = json[distTag]; + if (!version) { + reject(new Error('Error getting version')); + } + resolve(version); + } catch { + reject(new Error('Could not parse version response')); + } + }); + }) + .on('error', (err) => reject(err)); + }); +}; + +export default getDistVersion; diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts new file mode 100644 index 00000000..af7ab22c --- /dev/null +++ b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts @@ -0,0 +1,82 @@ +import hasNewVersion from './hasNewVersion'; +import { getLastUpdate } from './cache'; +import getDistVersion from './getDistVersion'; + +jest.mock('./getDistVersion', () => jest.fn().mockReturnValue('1.0.0')); +jest.mock('./cache', () => ({ + getLastUpdate: jest.fn().mockReturnValue(undefined), + createConfigDir: jest.fn(), + saveLastUpdate: jest.fn(), +})); + +const pkg = { name: 'test', version: '1.0.0' }; + +afterEach(() => jest.clearAllMocks()); + +const defaultArgs = { + pkg, + shouldNotifyInNpmScript: true, + alwaysRun: true, +}; + +test('it should not trigger update for same version', async () => { + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe(false); +}); + +test('it should trigger update for patch version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('1.0.1'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('1.0.1'); +}); + +test('it should trigger update for minor version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('1.1.0'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('1.1.0'); +}); + +test('it should trigger update for major version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('2.0.0'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('2.0.0'); +}); + +test('it should not trigger update if version is lower', async () => { + (getDistVersion as jest.Mock).mockReturnValue('0.0.9'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe(false); +}); + +it('should trigger update check if last update older than config', async () => { + const TWO_WEEKS = new Date().getTime() - 1000 * 60 * 60 * 24 * 14; + (getLastUpdate as jest.Mock).mockReturnValue(TWO_WEEKS); + const newVersion = await hasNewVersion({ + pkg, + shouldNotifyInNpmScript: true, + }); + + expect(newVersion).toBe(false); + expect(getDistVersion).toHaveBeenCalled(); +}); + +it('should not trigger update check if last update is too recent', async () => { + const TWELVE_HOURS = new Date().getTime() - 1000 * 60 * 60 * 12; + (getLastUpdate as jest.Mock).mockReturnValue(TWELVE_HOURS); + const newVersion = await hasNewVersion({ + pkg, + shouldNotifyInNpmScript: true, + }); + + expect(newVersion).toBe(false); + expect(getDistVersion).not.toHaveBeenCalled(); +}); diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.ts b/node_modules/simple-update-notifier/src/hasNewVersion.ts new file mode 100644 index 00000000..31d5069f --- /dev/null +++ b/node_modules/simple-update-notifier/src/hasNewVersion.ts @@ -0,0 +1,40 @@ +import semver from 'semver'; +import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; +import getDistVersion from './getDistVersion'; +import { IUpdate } from './types'; + +const hasNewVersion = async ({ + pkg, + updateCheckInterval = 1000 * 60 * 60 * 24, + distTag = 'latest', + alwaysRun, + debug, +}: IUpdate) => { + createConfigDir(); + const lastUpdateCheck = getLastUpdate(pkg.name); + if ( + alwaysRun || + !lastUpdateCheck || + lastUpdateCheck < new Date().getTime() - updateCheckInterval + ) { + const latestVersion = await getDistVersion(pkg.name, distTag); + saveLastUpdate(pkg.name); + if (semver.gt(latestVersion, pkg.version)) { + return latestVersion; + } else if (debug) { + console.error( + `Latest version (${latestVersion}) not newer than current version (${pkg.version})` + ); + } + } else if (debug) { + console.error( + `Too recent to check for a new update. simpleUpdateNotifier() interval set to ${updateCheckInterval}ms but only ${ + new Date().getTime() - lastUpdateCheck + }ms since last check.` + ); + } + + return false; +}; + +export default hasNewVersion; diff --git a/node_modules/simple-update-notifier/src/index.spec.ts b/node_modules/simple-update-notifier/src/index.spec.ts new file mode 100644 index 00000000..98ffb5a9 --- /dev/null +++ b/node_modules/simple-update-notifier/src/index.spec.ts @@ -0,0 +1,27 @@ +import simpleUpdateNotifier from '.'; +import hasNewVersion from './hasNewVersion'; + +const consoleSpy = jest.spyOn(console, 'error'); + +jest.mock('./hasNewVersion', () => jest.fn().mockResolvedValue('2.0.0')); + +beforeEach(jest.clearAllMocks); + +test('it logs message if update is available', async () => { + await simpleUpdateNotifier({ + pkg: { name: 'test', version: '1.0.0' }, + alwaysRun: true, + }); + + expect(consoleSpy).toHaveBeenCalledTimes(1); +}); + +test('it does not log message if update is not available', async () => { + (hasNewVersion as jest.Mock).mockResolvedValue(false); + await simpleUpdateNotifier({ + pkg: { name: 'test', version: '2.0.0' }, + alwaysRun: true, + }); + + expect(consoleSpy).toHaveBeenCalledTimes(0); +}); diff --git a/node_modules/simple-update-notifier/src/index.ts b/node_modules/simple-update-notifier/src/index.ts new file mode 100644 index 00000000..2b0d2cfc --- /dev/null +++ b/node_modules/simple-update-notifier/src/index.ts @@ -0,0 +1,34 @@ +import isNpmOrYarn from './isNpmOrYarn'; +import hasNewVersion from './hasNewVersion'; +import { IUpdate } from './types'; +import borderedText from './borderedText'; + +const simpleUpdateNotifier = async (args: IUpdate) => { + if ( + !args.alwaysRun && + (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript)) + ) { + if (args.debug) { + console.error('Opting out of running simpleUpdateNotifier()'); + } + return; + } + + try { + const latestVersion = await hasNewVersion(args); + if (latestVersion) { + console.error( + borderedText(`New version of ${args.pkg.name} available! +Current Version: ${args.pkg.version} +Latest Version: ${latestVersion}`) + ); + } + } catch (err) { + // Catch any network errors or cache writing errors so module doesn't cause a crash + if (args.debug && err instanceof Error) { + console.error('Unexpected error in simpleUpdateNotifier():', err); + } + } +}; + +export default simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts new file mode 100644 index 00000000..ee4c8371 --- /dev/null +++ b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts @@ -0,0 +1,12 @@ +import process from 'process'; + +const packageJson = process.env.npm_package_json; +const userAgent = process.env.npm_config_user_agent; +const isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); +const isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); + +const isNpm = isNpm6 || isNpm7; +const isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); +const isNpmOrYarn = isNpm || isYarn; + +export default isNpmOrYarn; diff --git a/node_modules/simple-update-notifier/src/types.ts b/node_modules/simple-update-notifier/src/types.ts new file mode 100644 index 00000000..c395eb00 --- /dev/null +++ b/node_modules/simple-update-notifier/src/types.ts @@ -0,0 +1,8 @@ +export interface IUpdate { + pkg: { name: string; version: string }; + updateCheckInterval?: number; + shouldNotifyInNpmScript?: boolean; + distTag?: string; + alwaysRun?: boolean; + debug?: boolean; +} 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..32813394 --- /dev/null +++ b/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/source-map/dist/source-map.debug.js b/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 00000000..b5ab6382 --- /dev/null +++ b/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/source-map/dist/source-map.js b/node_modules/source-map/dist/source-map.js new file mode 100644 index 00000000..4e630e29 --- /dev/null +++ b/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/source-map/dist/source-map.min.js b/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 00000000..f2a46bd0 --- /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(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/source-map/lib/array-set.js b/node_modules/source-map/lib/array-set.js new file mode 100644 index 00000000..fbd5c81c --- /dev/null +++ b/node_modules/source-map/lib/array-set.js @@ -0,0 +1,121 @@ +/* -*- 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 = require('./util'); +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; diff --git a/node_modules/source-map/lib/base64-vlq.js b/node_modules/source-map/lib/base64-vlq.js new file mode 100644 index 00000000..612b4040 --- /dev/null +++ b/node_modules/source-map/lib/base64-vlq.js @@ -0,0 +1,140 @@ +/* -*- 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 = require('./base64'); + +// 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; +}; diff --git a/node_modules/source-map/lib/base64.js b/node_modules/source-map/lib/base64.js new file mode 100644 index 00000000..8aa86b30 --- /dev/null +++ b/node_modules/source-map/lib/base64.js @@ -0,0 +1,67 @@ +/* -*- 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; +}; diff --git a/node_modules/source-map/lib/binary-search.js b/node_modules/source-map/lib/binary-search.js new file mode 100644 index 00000000..010ac941 --- /dev/null +++ b/node_modules/source-map/lib/binary-search.js @@ -0,0 +1,111 @@ +/* -*- 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; +}; diff --git a/node_modules/source-map/lib/mapping-list.js b/node_modules/source-map/lib/mapping-list.js new file mode 100644 index 00000000..06d1274a --- /dev/null +++ b/node_modules/source-map/lib/mapping-list.js @@ -0,0 +1,79 @@ +/* -*- 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 = require('./util'); + +/** + * 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; diff --git a/node_modules/source-map/lib/quick-sort.js b/node_modules/source-map/lib/quick-sort.js new file mode 100644 index 00000000..6a7caadb --- /dev/null +++ b/node_modules/source-map/lib/quick-sort.js @@ -0,0 +1,114 @@ +/* -*- 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); +}; diff --git a/node_modules/source-map/lib/source-map-consumer.js b/node_modules/source-map/lib/source-map-consumer.js new file mode 100644 index 00000000..6abcc280 --- /dev/null +++ b/node_modules/source-map/lib/source-map-consumer.js @@ -0,0 +1,1082 @@ +/* -*- 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 = require('./util'); +var binarySearch = require('./binary-search'); +var ArraySet = require('./array-set').ArraySet; +var base64VLQ = require('./base64-vlq'); +var quickSort = require('./quick-sort').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; diff --git a/node_modules/source-map/lib/source-map-generator.js b/node_modules/source-map/lib/source-map-generator.js new file mode 100644 index 00000000..aff1e7fb --- /dev/null +++ b/node_modules/source-map/lib/source-map-generator.js @@ -0,0 +1,416 @@ +/* -*- 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 = require('./base64-vlq'); +var util = require('./util'); +var ArraySet = require('./array-set').ArraySet; +var MappingList = require('./mapping-list').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; diff --git a/node_modules/source-map/lib/source-node.js b/node_modules/source-map/lib/source-node.js new file mode 100644 index 00000000..d196a53f --- /dev/null +++ b/node_modules/source-map/lib/source-node.js @@ -0,0 +1,413 @@ +/* -*- 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 = require('./source-map-generator').SourceMapGenerator; +var util = require('./util'); + +// 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; diff --git a/node_modules/source-map/lib/util.js b/node_modules/source-map/lib/util.js new file mode 100644 index 00000000..44e0e452 --- /dev/null +++ b/node_modules/source-map/lib/util.js @@ -0,0 +1,417 @@ +/* -*- 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; diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json new file mode 100644 index 00000000..048e3ae8 --- /dev/null +++ b/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/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/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/Jenkinsfile b/node_modules/sshpk/Jenkinsfile new file mode 100644 index 00000000..cd0bf225 --- /dev/null +++ b/node_modules/sshpk/Jenkinsfile @@ -0,0 +1,86 @@ +@Library('jenkins-joylib@v1.0.8') _ + +pipeline { + + agent none + + options { + buildDiscarder(logRotator(numToKeepStr: '30')) + timestamps() + } + + stages { + stage('top') { + parallel { + stage('v0.10.48-zone') { + agent { + label joyCommonLabels(image_ver: '15.4.1') + } + tools { + nodejs 'sdcnode-v0.10.48-zone' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + + stage('v4-zone') { + agent { + label joyCommonLabels(image_ver: '15.4.1') + } + tools { + nodejs 'sdcnode-v4-zone' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + + stage('v6-zone64') { + agent { + label joyCommonLabels(image_ver: '18.4.0') + } + tools { + nodejs 'sdcnode-v6-zone64' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + } + } + } + + post { + always { + joySlackNotifications() + } + } +} 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/bin/sshpk-conv b/node_modules/sshpk/bin/sshpk-conv new file mode 100755 index 00000000..e839ede5 --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-conv @@ -0,0 +1,243 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2018 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var tty = require('tty'); +var readline = require('readline'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['outformat', 't'], + type: 'string', + help: 'Output format' + }, + { + names: ['informat', 'T'], + type: 'string', + help: 'Input format' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input file name (default stdin)' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output file name (default stdout)' + }, + { + names: ['private', 'p'], + type: 'bool', + help: 'Produce a private key as output' + }, + { + names: ['derive', 'd'], + type: 'string', + help: 'Output a new key derived from this one, with given algo' + }, + { + names: ['identify', 'i'], + type: 'bool', + help: 'Print key metadata instead of converting' + }, + { + names: ['fingerprint', 'F'], + type: 'bool', + help: 'Output key fingerprint' + }, + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash function to use for key fingeprint with -F' + }, + { + names: ['spki', 's'], + type: 'bool', + help: 'With -F, generates an SPKI fingerprint instead of SSH' + }, + { + names: ['comment', 'c'], + type: 'string', + help: 'Set key comment, if output format supports' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-conv: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-conv: converts between SSH key formats\n'); + console.error(help); + console.error('\navailable key formats:'); + console.error(' - pem, pkcs1 eg id_rsa'); + console.error(' - ssh eg id_rsa.pub'); + console.error(' - pkcs8 format you want for openssl'); + console.error(' - openssh like output of ssh-keygen -o'); + console.error(' - rfc4253 raw OpenSSH wire format'); + console.error(' - dnssec dnssec-keygen format'); + console.error(' - putty PuTTY ppk format'); + console.error('\navailable fingerprint formats:'); + console.error(' - hex colon-separated hex for SSH'); + console.error(' straight hex for SPKI'); + console.error(' - base64 SHA256:* format from OpenSSH'); + process.exit(1); + } + + /* + * Key derivation can only be done on private keys, so use of the -d + * option necessarily implies -p. + */ + if (opts.derive) + opts.private = true; + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + ifError(e, 'error opening input file'); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + ifError(e, 'error opening output file'); + } + + var bufs = []; + inFile.on('readable', function () { + var data; + while ((data = inFile.read())) + bufs.push(data); + }); + var parseOpts = {}; + parseOpts.filename = inFileName; + inFile.on('end', function processKey() { + var buf = Buffer.concat(bufs); + var fmt = 'auto'; + if (opts.informat) + fmt = opts.informat; + var f = sshpk.parseKey; + if (opts.private) + f = sshpk.parsePrivateKey; + try { + var key = f(buf, fmt, parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + if (err) + ifError(err); + parseOpts.passphrase = pw; + processKey(); + }); + return; + } + ifError(e); + } + + if (opts.derive) + key = key.derive(opts.derive); + + if (opts.comment) + key.comment = opts.comment; + + if (opts.identify) { + var kind = 'public'; + if (sshpk.PrivateKey.isPrivateKey(key)) + kind = 'private'; + console.log('%s: a %d bit %s %s key', inFileName, + key.size, key.type.toUpperCase(), kind); + if (key.type === 'ecdsa') + console.log('ECDSA curve: %s', key.curve); + if (key.comment) + console.log('Comment: %s', key.comment); + console.log('SHA256 fingerprint: ' + + key.fingerprint('sha256').toString()); + console.log('MD5 fingerprint: ' + + key.fingerprint('md5').toString()); + console.log('SPKI-SHA256 fingerprint: ' + + key.fingerprint('sha256', 'spki').toString()); + process.exit(0); + return; + } + + if (opts.fingerprint) { + var hash = opts.hash; + var type = opts.spki ? 'spki' : 'ssh'; + var format = opts.outformat; + var fp = key.fingerprint(hash, type).toString(format); + outFile.write(fp); + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + return; + } + + fmt = undefined; + if (opts.outformat) + fmt = opts.outformat; + outFile.write(key.toBuffer(fmt)); + if (fmt === 'ssh' || + (!opts.private && fmt === undefined)) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} + +function ifError(e, txt) { + if (txt) + txt = txt + ': '; + else + txt = ''; + console.error('sshpk-conv: ' + txt + e.name + ': ' + e.message); + if (process.env['DEBUG'] || process.env['V']) { + console.error(e.stack); + if (e.innerErr) + console.error(e.innerErr.stack); + } + process.exit(1); +} diff --git a/node_modules/sshpk/bin/sshpk-sign b/node_modules/sshpk/bin/sshpk-sign new file mode 100755 index 00000000..673fc986 --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-sign @@ -0,0 +1,191 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['binary', 'b'], + type: 'bool', + help: 'Output raw binary instead of base64' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +var parseOpts = {}; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-sign: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: sign data using an SSH key\n'); + console.error(help); + process.exit(1); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(1); + } + + var keyData = fs.readFileSync(opts.identity); + parseOpts.filename = opts.identity; + + run(); +} + +function run() { + var key; + try { + key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + parseOpts.passphrase = pw; + run(); + }); + return; + } + console.error('sshpk-sign: error loading private key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(1); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var signer; + try { + signer = key.createSign(hash); + } catch (e) { + console.error('sshpk-sign: error creating signer: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (opts.verbose) { + console.error('sshpk-sign: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-sign: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + console.error('sshpk-sign: error opening output file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + inFile.pipe(signer); + inFile.on('end', function () { + var sig; + try { + sig = signer.sign(); + } catch (e) { + console.error('sshpk-sign: error signing data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + var fmt = opts.format || 'asn1'; + var output; + try { + output = sig.toBuffer(fmt); + if (!opts.binary) + output = output.toString('base64'); + } catch (e) { + console.error('sshpk-sign: error converting signature' + + ' to ' + fmt + ' format: ' + e.name + ': ' + + e.message); + process.exit(1); + } + + outFile.write(output); + if (!opts.binary) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} diff --git a/node_modules/sshpk/bin/sshpk-verify b/node_modules/sshpk/bin/sshpk-verify new file mode 100755 index 00000000..fc71a82c --- /dev/null +++ b/node_modules/sshpk/bin/sshpk-verify @@ -0,0 +1,167 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var Buffer = require('safer-buffer').Buffer; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to (public) key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['signature', 's'], + type: 'string', + help: 'base64-encoded signature data' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-verify: error: %s', e.message); + process.exit(3); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: sign data using an SSH key\n'); + console.error(help); + process.exit(3); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + if (!opts.signature) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -s or --signature option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + var keyData = fs.readFileSync(opts.identity); + + var key; + try { + key = sshpk.parseKey(keyData); + } catch (e) { + console.error('sshpk-verify: error loading key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(2); + } + + var fmt = opts.format || 'asn1'; + var sigData = Buffer.from(opts.signature, 'base64'); + + var sig; + try { + sig = sshpk.parseSignature(sigData, key.type, fmt); + } catch (e) { + console.error('sshpk-verify: error parsing signature: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var verifier; + try { + verifier = key.createVerify(hash); + } catch (e) { + console.error('sshpk-verify: error creating verifier: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + if (opts.verbose) { + console.error('sshpk-verify: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-verify: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(2); + } + + inFile.pipe(verifier); + inFile.on('end', function () { + var ret; + try { + ret = verifier.verify(sig); + } catch (e) { + console.error('sshpk-verify: error verifying data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (ret) { + console.error('OK'); + process.exit(0); + } + + console.error('NOT OK'); + process.exit(1); + }); +} diff --git a/node_modules/sshpk/lib/algs.js b/node_modules/sshpk/lib/algs.js new file mode 100644 index 00000000..3b01e7d1 --- /dev/null +++ b/node_modules/sshpk/lib/algs.js @@ -0,0 +1,168 @@ +// Copyright 2015 Joyent, Inc. + +var Buffer = require('safer-buffer').Buffer; + +var algInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y'], + sizePart: 'p' + }, + 'rsa': { + parts: ['e', 'n'], + sizePart: 'n' + }, + 'ecdsa': { + parts: ['curve', 'Q'], + sizePart: 'Q' + }, + 'ed25519': { + parts: ['A'], + sizePart: 'A' + } +}; +algInfo['curve25519'] = algInfo['ed25519']; + +var algPrivInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y', 'x'] + }, + 'rsa': { + parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] + }, + 'ecdsa': { + parts: ['curve', 'Q', 'd'] + }, + 'ed25519': { + parts: ['A', 'k'] + } +}; +algPrivInfo['curve25519'] = algPrivInfo['ed25519']; + +var hashAlgs = { + 'md5': true, + 'sha1': true, + 'sha256': true, + 'sha384': true, + 'sha512': true +}; + +/* + * Taken from + * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf + */ +var curves = { + 'nistp256': { + size: 256, + pkcs8oid: '1.2.840.10045.3.1.7', + p: Buffer.from(('00' + + 'ffffffff 00000001 00000000 00000000' + + '00000000 ffffffff ffffffff ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF 00000001 00000000 00000000' + + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + + '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'c49d3608 86e70493 6a6678e1 139d26b7' + + '819f7e90'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff 00000000 ffffffff ffffffff' + + 'bce6faad a7179e84 f3b9cac2 fc632551'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + + '77037d81 2deb33a0 f4a13945 d898c296' + + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + + '2bce3357 6b315ece cbb64068 37bf51f5'). + replace(/ /g, ''), 'hex') + }, + 'nistp384': { + size: 384, + pkcs8oid: '1.3.132.0.34', + p: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffe' + + 'ffffffff 00000000 00000000 ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + + 'FFFFFFFF 00000000 00000000 FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + 'b3312fa7 e23ee7e4 988e056b e3f82d19' + + '181d9c6e fe814112 0314088f 5013875a' + + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'a335926a a319a27a 1d00896a 6773a482' + + '7acdac73'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff c7634d81 f4372ddf' + + '581a0db2 48b0a77a ecec196a ccc52973'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + + '6e1d3b62 8ba79b98 59f741e0 82542a38' + + '5502f25d bf55296c 3a545e38 72760ab7' + + '3617de4a 96262c6f 5d9e98bf 9292dc29' + + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). + replace(/ /g, ''), 'hex') + }, + 'nistp521': { + size: 521, + pkcs8oid: '1.3.132.0.35', + p: Buffer.from(( + '01ffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffff').replace(/ /g, ''), 'hex'), + a: Buffer.from(('01FF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(('51' + + '953eb961 8e1c9a1f 929a21a0 b68540ee' + + 'a2da725b 99b315f3 b8b48991 8ef109e1' + + '56193951 ec7e937b 1652c0bd 3bb1bf07' + + '3573df88 3d2c34f1 ef451fd4 6b503f00'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'd09e8800 291cb853 96cc6717 393284aa' + + 'a0da64ba').replace(/ /g, ''), 'hex'), + n: Buffer.from(('01ff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffa' + + '51868783 bf2f966b 7fcc0148 f709a5d0' + + '3bb5c9b8 899c47ae bb6fb71e 91386409'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + + '9c648139 053fb521 f828af60 6b4d3dba' + + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + + '3348b3c1 856a429b f97e7e31 c2e5bd66' + + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + + '98f54449 579b4468 17afbd17 273e662c' + + '97ee7299 5ef42640 c550b901 3fad0761' + + '353c7086 a272c240 88be9476 9fd16650'). + replace(/ /g, ''), 'hex') + } +}; + +module.exports = { + info: algInfo, + privInfo: algPrivInfo, + hashAlgs: hashAlgs, + curves: curves +}; diff --git a/node_modules/sshpk/lib/certificate.js b/node_modules/sshpk/lib/certificate.js new file mode 100644 index 00000000..69323570 --- /dev/null +++ b/node_modules/sshpk/lib/certificate.js @@ -0,0 +1,410 @@ +// Copyright 2016 Joyent, Inc. + +module.exports = Certificate; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Identity = require('./identity'); + +var formats = {}; +formats['openssh'] = require('./formats/openssh-cert'); +formats['x509'] = require('./formats/x509'); +formats['pem'] = require('./formats/x509-pem'); + +var CertificateParseError = errs.CertificateParseError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Certificate(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.subjects, 'options.subjects'); + utils.assertCompatible(opts.subjects[0], Identity, [1, 0], + 'options.subjects'); + utils.assertCompatible(opts.subjectKey, Key, [1, 0], + 'options.subjectKey'); + utils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer'); + if (opts.issuerKey !== undefined) { + utils.assertCompatible(opts.issuerKey, Key, [1, 0], + 'options.issuerKey'); + } + assert.object(opts.signatures, 'options.signatures'); + assert.buffer(opts.serial, 'options.serial'); + assert.date(opts.validFrom, 'options.validFrom'); + assert.date(opts.validUntil, 'optons.validUntil'); + + assert.optionalArrayOfString(opts.purposes, 'options.purposes'); + + this._hashCache = {}; + + this.subjects = opts.subjects; + this.issuer = opts.issuer; + this.subjectKey = opts.subjectKey; + this.issuerKey = opts.issuerKey; + this.signatures = opts.signatures; + this.serial = opts.serial; + this.validFrom = opts.validFrom; + this.validUntil = opts.validUntil; + this.purposes = opts.purposes; +} + +Certificate.formats = formats; + +Certificate.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'x509'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +Certificate.prototype.toString = function (format, options) { + if (format === undefined) + format = 'pem'; + return (this.toBuffer(format, options).toString()); +}; + +Certificate.prototype.fingerprint = function (algo) { + if (algo === undefined) + algo = 'sha256'; + assert.string(algo, 'algorithm'); + var opts = { + type: 'certificate', + hash: this.hash(algo), + algorithm: algo + }; + return (new Fingerprint(opts)); +}; + +Certificate.prototype.hash = function (algo) { + assert.string(algo, 'algorithm'); + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + if (this._hashCache[algo]) + return (this._hashCache[algo]); + + var hash = crypto.createHash(algo). + update(this.toBuffer('x509')).digest(); + this._hashCache[algo] = hash; + return (hash); +}; + +Certificate.prototype.isExpired = function (when) { + if (when === undefined) + when = new Date(); + return (!((when.getTime() >= this.validFrom.getTime()) && + (when.getTime() < this.validUntil.getTime()))); +}; + +Certificate.prototype.isSignedBy = function (issuerCert) { + utils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer'); + + if (!this.issuer.equals(issuerCert.subjects[0])) + return (false); + if (this.issuer.purposes && this.issuer.purposes.length > 0 && + this.issuer.purposes.indexOf('ca') === -1) { + return (false); + } + + return (this.isSignedByKey(issuerCert.subjectKey)); +}; + +Certificate.prototype.getExtension = function (keyOrOid) { + assert.string(keyOrOid, 'keyOrOid'); + var ext = this.getExtensions().filter(function (maybeExt) { + if (maybeExt.format === 'x509') + return (maybeExt.oid === keyOrOid); + if (maybeExt.format === 'openssh') + return (maybeExt.name === keyOrOid); + return (false); + })[0]; + return (ext); +}; + +Certificate.prototype.getExtensions = function () { + var exts = []; + var x509 = this.signatures.x509; + if (x509 && x509.extras && x509.extras.exts) { + x509.extras.exts.forEach(function (ext) { + ext.format = 'x509'; + exts.push(ext); + }); + } + var openssh = this.signatures.openssh; + if (openssh && openssh.exts) { + openssh.exts.forEach(function (ext) { + ext.format = 'openssh'; + exts.push(ext); + }); + } + return (exts); +}; + +Certificate.prototype.isSignedByKey = function (issuerKey) { + utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey'); + + if (this.issuerKey !== undefined) { + return (this.issuerKey. + fingerprint('sha512').matches(issuerKey)); + } + + var fmt = Object.keys(this.signatures)[0]; + var valid = formats[fmt].verify(this, issuerKey); + if (valid) + this.issuerKey = issuerKey; + return (valid); +}; + +Certificate.prototype.signWith = function (key) { + utils.assertCompatible(key, PrivateKey, [1, 2], 'key'); + var fmts = Object.keys(formats); + var didOne = false; + for (var i = 0; i < fmts.length; ++i) { + if (fmts[i] !== 'pem') { + var ret = formats[fmts[i]].sign(this, key); + if (ret === true) + didOne = true; + } + } + if (!didOne) { + throw (new Error('Failed to sign the certificate for any ' + + 'available certificate formats')); + } +}; + +Certificate.createSelfSigned = function (subjectOrSubjects, key, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, PrivateKey, [1, 2], 'private key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + /* Self-signed certs are always CAs. */ + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + + /* + * If we weren't explicitly given any other purposes, do the sensible + * thing and add some basic ones depending on the subject type. + */ + if (purposes.length <= 3) { + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + } + + var cert = new Certificate({ + subjects: subjects, + issuer: subjects[0], + subjectKey: key.toPublic(), + issuerKey: key.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(key); + + return (cert); +}; + +Certificate.create = + function (subjectOrSubjects, key, issuer, issuerKey, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, Key, [1, 0], 'key'); + if (PrivateKey.isPrivateKey(key)) + key = key.toPublic(); + utils.assertCompatible(issuer, Identity, [1, 0], 'issuer'); + utils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + if (options.ca === true) { + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + } + + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + + var cert = new Certificate({ + subjects: subjects, + issuer: issuer, + subjectKey: key, + issuerKey: issuerKey.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(issuerKey); + + return (cert); +}; + +Certificate.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + return (k); + } catch (e) { + throw (new CertificateParseError(options.filename, format, e)); + } +}; + +Certificate.isCertificate = function (obj, ver) { + return (utils.isCompatible(obj, Certificate, ver)); +}; + +/* + * API versions for Certificate: + * [1,0] -- initial ver + * [1,1] -- openssh format now unpacks extensions + */ +Certificate.prototype._sshpkApiVersion = [1, 1]; + +Certificate._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/dhe.js b/node_modules/sshpk/lib/dhe.js new file mode 100644 index 00000000..a3c8032c --- /dev/null +++ b/node_modules/sshpk/lib/dhe.js @@ -0,0 +1,397 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + DiffieHellman: DiffieHellman, + generateECDSA: generateECDSA, + generateED25519: generateED25519 +}; + +var assert = require('assert-plus'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var utils = require('./utils'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); +var PrivateKey = require('./private-key'); + +var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined); + +var ecdh = require('ecc-jsbn'); +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; + +function DiffieHellman(key) { + utils.assertCompatible(key, Key, [1, 4], 'key'); + this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]); + this._algo = key.type; + this._curve = key.curve; + this._key = key; + if (key.type === 'dsa') { + if (!CRYPTO_HAVE_ECDH) { + throw (new Error('Due to bugs in the node 0.10 ' + + 'crypto API, node 0.12.x or later is required ' + + 'to use DH')); + } + this._dh = crypto.createDiffieHellman( + key.part.p.data, undefined, + key.part.g.data, undefined); + this._p = key.part.p; + this._g = key.part.g; + if (this._isPriv) + this._dh.setPrivateKey(key.part.x.data); + this._dh.setPublicKey(key.part.y.data); + + } else if (key.type === 'ecdsa') { + if (!CRYPTO_HAVE_ECDH) { + this._ecParams = new X9ECParameters(this._curve); + + if (this._isPriv) { + this._priv = new ECPrivate( + this._ecParams, key.part.d.data); + } + return; + } + + var curve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[key.curve]; + this._dh = crypto.createECDH(curve); + if (typeof (this._dh) !== 'object' || + typeof (this._dh.setPrivateKey) !== 'function') { + CRYPTO_HAVE_ECDH = false; + DiffieHellman.call(this, key); + return; + } + if (this._isPriv) + this._dh.setPrivateKey(key.part.d.data); + this._dh.setPublicKey(key.part.Q.data); + + } else if (key.type === 'curve25519') { + if (this._isPriv) { + utils.assertCompatible(key, PrivateKey, [1, 5], 'key'); + this._priv = key.part.k.data; + } + + } else { + throw (new Error('DH not supported for ' + key.type + ' keys')); + } +} + +DiffieHellman.prototype.getPublicKey = function () { + if (this._isPriv) + return (this._key.toPublic()); + return (this._key); +}; + +DiffieHellman.prototype.getPrivateKey = function () { + if (this._isPriv) + return (this._key); + else + return (undefined); +}; +DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey; + +DiffieHellman.prototype._keyCheck = function (pk, isPub) { + assert.object(pk, 'key'); + if (!isPub) + utils.assertCompatible(pk, PrivateKey, [1, 3], 'key'); + utils.assertCompatible(pk, Key, [1, 4], 'key'); + + if (pk.type !== this._algo) { + throw (new Error('A ' + pk.type + ' key cannot be used in ' + + this._algo + ' Diffie-Hellman')); + } + + if (pk.curve !== this._curve) { + throw (new Error('A key from the ' + pk.curve + ' curve ' + + 'cannot be used with a ' + this._curve + + ' Diffie-Hellman')); + } + + if (pk.type === 'dsa') { + assert.deepEqual(pk.part.p, this._p, + 'DSA key prime does not match'); + assert.deepEqual(pk.part.g, this._g, + 'DSA key generator does not match'); + } +}; + +DiffieHellman.prototype.setKey = function (pk) { + this._keyCheck(pk); + + if (pk.type === 'dsa') { + this._dh.setPrivateKey(pk.part.x.data); + this._dh.setPublicKey(pk.part.y.data); + + } else if (pk.type === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.setPrivateKey(pk.part.d.data); + this._dh.setPublicKey(pk.part.Q.data); + } else { + this._priv = new ECPrivate( + this._ecParams, pk.part.d.data); + } + + } else if (pk.type === 'curve25519') { + var k = pk.part.k; + if (!pk.part.k) + k = pk.part.r; + this._priv = k.data; + if (this._priv[0] === 0x00) + this._priv = this._priv.slice(1); + this._priv = this._priv.slice(0, 32); + } + this._key = pk; + this._isPriv = true; +}; +DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey; + +DiffieHellman.prototype.computeSecret = function (otherpk) { + this._keyCheck(otherpk, true); + if (!this._isPriv) + throw (new Error('DH exchange has not been initialized with ' + + 'a private key yet')); + + var pub; + if (this._algo === 'dsa') { + return (this._dh.computeSecret( + otherpk.part.y.data)); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + return (this._dh.computeSecret( + otherpk.part.Q.data)); + } else { + pub = new ECPublic( + this._ecParams, otherpk.part.Q.data); + return (this._priv.deriveSharedSecret(pub)); + } + + } else if (this._algo === 'curve25519') { + pub = otherpk.part.A.data; + while (pub[0] === 0x00 && pub.length > 32) + pub = pub.slice(1); + var priv = this._priv; + assert.strictEqual(pub.length, 32); + assert.strictEqual(priv.length, 32); + + var secret = nacl.box.before(new Uint8Array(pub), + new Uint8Array(priv)); + + return (Buffer.from(secret)); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; + +DiffieHellman.prototype.generateKey = function () { + var parts = []; + var priv, pub; + if (this._algo === 'dsa') { + this._dh.generateKeys(); + + parts.push({name: 'p', data: this._p.data}); + parts.push({name: 'q', data: this._key.part.q.data}); + parts.push({name: 'g', data: this._g.data}); + parts.push({name: 'y', data: this._dh.getPublicKey()}); + parts.push({name: 'x', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'dsa', + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: this._dh.getPublicKey()}); + parts.push({name: 'd', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else { + var n = this._ecParams.getN(); + var r = new jsbn(crypto.randomBytes(n.bitLength())); + var n1 = n.subtract(jsbn.ONE); + priv = r.mod(n1).add(jsbn.ONE); + pub = this._ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(this._ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + this._priv = new ECPrivate(this._ecParams, priv); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + } else if (this._algo === 'curve25519') { + var pair = nacl.box.keyPair(); + priv = Buffer.from(pair.secretKey); + pub = Buffer.from(pair.publicKey); + priv = Buffer.concat([priv, pub]); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv}); + this._key = new PrivateKey({ + type: 'curve25519', + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; +DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey; + +/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */ + +function X9ECParameters(name) { + var params = algs.curves[name]; + assert.object(params); + + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var n = new jsbn(params.n); + var h = jsbn.ONE; + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + this.curve = curve; + this.g = G; + this.n = n; + this.h = h; +} +X9ECParameters.prototype.getCurve = function () { return (this.curve); }; +X9ECParameters.prototype.getG = function () { return (this.g); }; +X9ECParameters.prototype.getN = function () { return (this.n); }; +X9ECParameters.prototype.getH = function () { return (this.h); }; + +function ECPublic(params, buffer) { + this._params = params; + if (buffer[0] === 0x00) + buffer = buffer.slice(1); + this._pub = params.getCurve().decodePointHex(buffer.toString('hex')); +} + +function ECPrivate(params, buffer) { + this._params = params; + this._priv = new jsbn(utils.mpNormalize(buffer)); +} +ECPrivate.prototype.deriveSharedSecret = function (pubKey) { + assert.ok(pubKey instanceof ECPublic); + var S = pubKey._pub.multiply(this._priv); + return (Buffer.from(S.getX().toBigInteger().toByteArray())); +}; + +function generateED25519() { + var pair = nacl.sign.keyPair(); + var priv = Buffer.from(pair.secretKey); + var pub = Buffer.from(pair.publicKey); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + var parts = []; + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv.slice(0, 32)}); + var key = new PrivateKey({ + type: 'ed25519', + parts: parts + }); + return (key); +} + +/* Generates a new ECDSA private key on a given curve. */ +function generateECDSA(curve) { + var parts = []; + var key; + + if (CRYPTO_HAVE_ECDH) { + /* + * Node crypto doesn't expose key generation directly, but the + * ECDH instances can generate keys. It turns out this just + * calls into the OpenSSL generic key generator, and we can + * read its output happily without doing an actual DH. So we + * use that here. + */ + var osCurve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[curve]; + + var dh = crypto.createECDH(osCurve); + dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(curve)}); + parts.push({name: 'Q', data: dh.getPublicKey()}); + parts.push({name: 'd', data: dh.getPrivateKey()}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } else { + + var ecParams = new X9ECParameters(curve); + + /* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */ + var n = ecParams.getN(); + /* + * The crypto.randomBytes() function can only give us whole + * bytes, so taking a nod from X9.62, we round up. + */ + var cByteLen = Math.ceil((n.bitLength() + 64) / 8); + var c = new jsbn(crypto.randomBytes(cByteLen)); + + var n1 = n.subtract(jsbn.ONE); + var priv = c.mod(n1).add(jsbn.ONE); + var pub = ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + parts.push({name: 'curve', data: Buffer.from(curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } +} diff --git a/node_modules/sshpk/lib/ed-compat.js b/node_modules/sshpk/lib/ed-compat.js new file mode 100644 index 00000000..70732e1f --- /dev/null +++ b/node_modules/sshpk/lib/ed-compat.js @@ -0,0 +1,92 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + Verifier: Verifier, + Signer: Signer +}; + +var nacl = require('tweetnacl'); +var stream = require('stream'); +var util = require('util'); +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Signature = require('./signature'); + +function Verifier(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Verifier, stream.Writable); + +Verifier.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Verifier.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Verifier.prototype.verify = function (signature, fmt) { + var sig; + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== 'ed25519') + return (false); + sig = signature.toBuffer('raw'); + + } else if (typeof (signature) === 'string') { + sig = Buffer.from(signature, 'base64'); + + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + } + + assert.buffer(sig); + return (nacl.sign.detached.verify( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(sig), + new Uint8Array(this.key.part.A.data))); +}; + +function Signer(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Signer, stream.Writable); + +Signer.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Signer.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Signer.prototype.sign = function () { + var sig = nacl.sign.detached( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(Buffer.concat([ + this.key.part.k.data, this.key.part.A.data]))); + var sigBuf = Buffer.from(sig); + var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw'); + sigObj.hashAlgorithm = 'sha512'; + return (sigObj); +}; diff --git a/node_modules/sshpk/lib/errors.js b/node_modules/sshpk/lib/errors.js new file mode 100644 index 00000000..1cc09ec7 --- /dev/null +++ b/node_modules/sshpk/lib/errors.js @@ -0,0 +1,84 @@ +// Copyright 2015 Joyent, Inc. + +var assert = require('assert-plus'); +var util = require('util'); + +function FingerprintFormatError(fp, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, FingerprintFormatError); + this.name = 'FingerprintFormatError'; + this.fingerprint = fp; + this.format = format; + this.message = 'Fingerprint format is not supported, or is invalid: '; + if (fp !== undefined) + this.message += ' fingerprint = ' + fp; + if (format !== undefined) + this.message += ' format = ' + format; +} +util.inherits(FingerprintFormatError, Error); + +function InvalidAlgorithmError(alg) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, InvalidAlgorithmError); + this.name = 'InvalidAlgorithmError'; + this.algorithm = alg; + this.message = 'Algorithm "' + alg + '" is not supported'; +} +util.inherits(InvalidAlgorithmError, Error); + +function KeyParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyParseError); + this.name = 'KeyParseError'; + this.format = format; + this.keyName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format key: ' + innerErr.message; +} +util.inherits(KeyParseError, Error); + +function SignatureParseError(type, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, SignatureParseError); + this.name = 'SignatureParseError'; + this.type = type; + this.format = format; + this.innerErr = innerErr; + this.message = 'Failed to parse the given data as a ' + type + + ' signature in ' + format + ' format: ' + innerErr.message; +} +util.inherits(SignatureParseError, Error); + +function CertificateParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, CertificateParseError); + this.name = 'CertificateParseError'; + this.format = format; + this.certName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format certificate: ' + innerErr.message; +} +util.inherits(CertificateParseError, Error); + +function KeyEncryptedError(name, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyEncryptedError); + this.name = 'KeyEncryptedError'; + this.format = format; + this.keyName = name; + this.message = 'The ' + format + ' format key ' + name + ' is ' + + 'encrypted (password-protected), and no passphrase was ' + + 'provided in `options`'; +} +util.inherits(KeyEncryptedError, Error); + +module.exports = { + FingerprintFormatError: FingerprintFormatError, + InvalidAlgorithmError: InvalidAlgorithmError, + KeyParseError: KeyParseError, + SignatureParseError: SignatureParseError, + KeyEncryptedError: KeyEncryptedError, + CertificateParseError: CertificateParseError +}; diff --git a/node_modules/sshpk/lib/fingerprint.js b/node_modules/sshpk/lib/fingerprint.js new file mode 100644 index 00000000..0004b376 --- /dev/null +++ b/node_modules/sshpk/lib/fingerprint.js @@ -0,0 +1,220 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Fingerprint; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var utils = require('./utils'); + +var FingerprintFormatError = errs.FingerprintFormatError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Fingerprint(opts) { + assert.object(opts, 'options'); + assert.string(opts.type, 'options.type'); + assert.buffer(opts.hash, 'options.hash'); + assert.string(opts.algorithm, 'options.algorithm'); + + this.algorithm = opts.algorithm.toLowerCase(); + if (algs.hashAlgs[this.algorithm] !== true) + throw (new InvalidAlgorithmError(this.algorithm)); + + this.hash = opts.hash; + this.type = opts.type; + this.hashType = opts.hashType; +} + +Fingerprint.prototype.toString = function (format) { + if (format === undefined) { + if (this.algorithm === 'md5' || this.hashType === 'spki') + format = 'hex'; + else + format = 'base64'; + } + assert.string(format); + + switch (format) { + case 'hex': + if (this.hashType === 'spki') + return (this.hash.toString('hex')); + return (addColons(this.hash.toString('hex'))); + case 'base64': + if (this.hashType === 'spki') + return (this.hash.toString('base64')); + return (sshBase64Format(this.algorithm, + this.hash.toString('base64'))); + default: + throw (new FingerprintFormatError(undefined, format)); + } +}; + +Fingerprint.prototype.matches = function (other) { + assert.object(other, 'key or certificate'); + if (this.type === 'key' && this.hashType !== 'ssh') { + utils.assertCompatible(other, Key, [1, 7], 'key with spki'); + if (PrivateKey.isPrivateKey(other)) { + utils.assertCompatible(other, PrivateKey, [1, 6], + 'privatekey with spki support'); + } + } else if (this.type === 'key') { + utils.assertCompatible(other, Key, [1, 0], 'key'); + } else { + utils.assertCompatible(other, Certificate, [1, 0], + 'certificate'); + } + + var theirHash = other.hash(this.algorithm, this.hashType); + var theirHash2 = crypto.createHash(this.algorithm). + update(theirHash).digest('base64'); + + if (this.hash2 === undefined) + this.hash2 = crypto.createHash(this.algorithm). + update(this.hash).digest('base64'); + + return (this.hash2 === theirHash2); +}; + +/*JSSTYLED*/ +var base64RE = /^[A-Za-z0-9+\/=]+$/; +/*JSSTYLED*/ +var hexRE = /^[a-fA-F0-9]+$/; + +Fingerprint.parse = function (fp, options) { + assert.string(fp, 'fingerprint'); + + var alg, hash, enAlgs; + if (Array.isArray(options)) { + enAlgs = options; + options = {}; + } + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + if (options.enAlgs !== undefined) + enAlgs = options.enAlgs; + if (options.algorithms !== undefined) + enAlgs = options.algorithms; + assert.optionalArrayOfString(enAlgs, 'algorithms'); + + var hashType = 'ssh'; + if (options.hashType !== undefined) + hashType = options.hashType; + assert.string(hashType, 'options.hashType'); + + var parts = fp.split(':'); + if (parts.length == 2) { + alg = parts[0].toLowerCase(); + if (!base64RE.test(parts[1])) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts[1], 'base64'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else if (parts.length > 2) { + alg = 'md5'; + if (parts[0].toLowerCase() === 'md5') + parts = parts.slice(1); + parts = parts.map(function (p) { + while (p.length < 2) + p = '0' + p; + if (p.length > 2) + throw (new FingerprintFormatError(fp)); + return (p); + }); + parts = parts.join(''); + if (!hexRE.test(parts) || parts.length % 2 !== 0) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts, 'hex'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else { + if (hexRE.test(fp)) { + hash = Buffer.from(fp, 'hex'); + } else if (base64RE.test(fp)) { + hash = Buffer.from(fp, 'base64'); + } else { + throw (new FingerprintFormatError(fp)); + } + + switch (hash.length) { + case 32: + alg = 'sha256'; + break; + case 16: + alg = 'md5'; + break; + case 20: + alg = 'sha1'; + break; + case 64: + alg = 'sha512'; + break; + default: + throw (new FingerprintFormatError(fp)); + } + + /* Plain hex/base64: guess it's probably SPKI unless told. */ + if (options.hashType === undefined) + hashType = 'spki'; + } + + if (alg === undefined) + throw (new FingerprintFormatError(fp)); + + if (algs.hashAlgs[alg] === undefined) + throw (new InvalidAlgorithmError(alg)); + + if (enAlgs !== undefined) { + enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); }); + if (enAlgs.indexOf(alg) === -1) + throw (new InvalidAlgorithmError(alg)); + } + + return (new Fingerprint({ + algorithm: alg, + hash: hash, + type: options.type || 'key', + hashType: hashType + })); +}; + +function addColons(s) { + /*JSSTYLED*/ + return (s.replace(/(.{2})(?=.)/g, '$1:')); +} + +function base64Strip(s) { + /*JSSTYLED*/ + return (s.replace(/=*$/, '')); +} + +function sshBase64Format(alg, h) { + return (alg.toUpperCase() + ':' + base64Strip(h)); +} + +Fingerprint.isFingerprint = function (obj, ver) { + return (utils.isCompatible(obj, Fingerprint, ver)); +}; + +/* + * API versions for Fingerprint: + * [1,0] -- initial ver + * [1,1] -- first tagged ver + * [1,2] -- hashType and spki support + */ +Fingerprint.prototype._sshpkApiVersion = [1, 2]; + +Fingerprint._oldVersionDetect = function (obj) { + assert.func(obj.toString); + assert.func(obj.matches); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/formats/auto.js b/node_modules/sshpk/lib/formats/auto.js new file mode 100644 index 00000000..f32cd964 --- /dev/null +++ b/node_modules/sshpk/lib/formats/auto.js @@ -0,0 +1,124 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pem = require('./pem'); +var ssh = require('./ssh'); +var rfc4253 = require('./rfc4253'); +var dnssec = require('./dnssec'); +var putty = require('./putty'); + +var DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1'; + +function read(buf, options) { + if (typeof (buf) === 'string') { + if (buf.trim().match(/^[-]+[ ]*BEGIN/)) + return (pem.read(buf, options)); + if (buf.match(/^\s*ssh-[a-z]/)) + return (ssh.read(buf, options)); + if (buf.match(/^\s*ecdsa-/)) + return (ssh.read(buf, options)); + if (buf.match(/^putty-user-key-file-2:/i)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + buf = Buffer.from(buf, 'binary'); + } else { + assert.buffer(buf); + if (findPEMHeader(buf)) + return (pem.read(buf, options)); + if (findSSHHeader(buf)) + return (ssh.read(buf, options)); + if (findPuTTYHeader(buf)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + } + if (buf.readUInt32BE(0) < buf.length) + return (rfc4253.read(buf, options)); + throw (new Error('Failed to auto-detect format of key')); +} + +function findPuTTYHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 22 <= buf.length && + buf.slice(offset, offset + 22).toString('ascii').toLowerCase() === + 'putty-user-key-file-2:') + return (true); + return (false); +} + +function findSSHHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 4 <= buf.length && + buf.slice(offset, offset + 4).toString('ascii') === 'ssh-') + return (true); + if (offset + 6 <= buf.length && + buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-') + return (true); + return (false); +} + +function findPEMHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10)) + ++offset; + if (buf[offset] !== 45) + return (false); + while (offset < buf.length && + (buf[offset] === 45)) + ++offset; + while (offset < buf.length && + (buf[offset] === 32)) + ++offset; + if (offset + 5 > buf.length || + buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN') + return (false); + return (true); +} + +function findDNSSECHeader(buf) { + // private case first + if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length) + return (false); + var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length); + if (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX) + return (true); + + // public-key RFC3110 ? + // 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...' + // skip any comment-lines + if (typeof (buf) !== 'string') { + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + if (lines[line].toString('ascii').match(/\. IN KEY /)) + return (true); + if (lines[line].toString('ascii').match(/\. IN DNSKEY /)) + return (true); + return (false); +} + +function write(key, options) { + throw (new Error('"auto" format cannot be used for writing')); +} diff --git a/node_modules/sshpk/lib/formats/dnssec.js b/node_modules/sshpk/lib/formats/dnssec.js new file mode 100644 index 00000000..a74ea9ce --- /dev/null +++ b/node_modules/sshpk/lib/formats/dnssec.js @@ -0,0 +1,287 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var utils = require('../utils'); +var SSHBuffer = require('../ssh-buffer'); +var Dhe = require('../dhe'); + +var supportedAlgos = { + 'rsa-sha1' : 5, + 'rsa-sha256' : 8, + 'rsa-sha512' : 10, + 'ecdsa-p256-sha256' : 13, + 'ecdsa-p384-sha384' : 14 + /* + * ed25519 is hypothetically supported with id 15 + * but the common tools available don't appear to be + * capable of generating/using ed25519 keys + */ +}; + +var supportedAlgosById = {}; +Object.keys(supportedAlgos).forEach(function (k) { + supportedAlgosById[supportedAlgos[k]] = k.toUpperCase(); +}); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + if (lines[0].match(/^Private-key-format\: v1/)) { + var algElems = lines[1].split(' '); + var algoNum = parseInt(algElems[1], 10); + var algoName = algElems[2]; + if (!supportedAlgosById[algoNum]) + throw (new Error('Unsupported algorithm: ' + algoName)); + return (readDNSSECPrivateKey(algoNum, lines.slice(2))); + } + + // skip any comment-lines + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + // we should now have *one single* line left with our KEY on it. + if ((lines[line].match(/\. IN KEY /) || + lines[line].match(/\. IN DNSKEY /)) && lines[line+1].length === 0) { + return (readRFC3110(lines[line])); + } + throw (new Error('Cannot parse dnssec key')); +} + +function readRFC3110(keyString) { + var elems = keyString.split(' '); + //unused var flags = parseInt(elems[3], 10); + //unused var protocol = parseInt(elems[4], 10); + var algorithm = parseInt(elems[5], 10); + if (!supportedAlgosById[algorithm]) + throw (new Error('Unsupported algorithm: ' + algorithm)); + var base64key = elems.slice(6, elems.length).join(); + var keyBuffer = Buffer.from(base64key, 'base64'); + if (supportedAlgosById[algorithm].match(/^RSA-/)) { + // join the rest of the body into a single base64-blob + var publicExponentLen = keyBuffer.readUInt8(0); + if (publicExponentLen != 3 && publicExponentLen != 1) + throw (new Error('Cannot parse dnssec key: ' + + 'unsupported exponent length')); + + var publicExponent = keyBuffer.slice(1, publicExponentLen+1); + publicExponent = utils.mpNormalize(publicExponent); + var modulus = keyBuffer.slice(1+publicExponentLen); + modulus = utils.mpNormalize(modulus); + // now, make the key + var rsaKey = { + type: 'rsa', + parts: [] + }; + rsaKey.parts.push({ name: 'e', data: publicExponent}); + rsaKey.parts.push({ name: 'n', data: modulus}); + return (new Key(rsaKey)); + } + if (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' || + supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') { + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) { + curve = 'nistp256'; + size = 256; + } + + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'Q', data: utils.ecNormalize(keyBuffer) } + ] + }; + return (new Key(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + + supportedAlgosById[algorithm])); +} + +function elementToBuf(e) { + return (Buffer.from(e.split(' ')[1], 'base64')); +} + +function readDNSSECRSAPrivateKey(elements) { + var rsaParams = {}; + elements.forEach(function (element) { + if (element.split(' ')[0] === 'Modulus:') + rsaParams['n'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PublicExponent:') + rsaParams['e'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PrivateExponent:') + rsaParams['d'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime1:') + rsaParams['p'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime2:') + rsaParams['q'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent1:') + rsaParams['dmodp'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent2:') + rsaParams['dmodq'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Coefficient:') + rsaParams['iqmp'] = elementToBuf(element); + }); + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: utils.mpNormalize(rsaParams['e'])}, + { name: 'n', data: utils.mpNormalize(rsaParams['n'])}, + { name: 'd', data: utils.mpNormalize(rsaParams['d'])}, + { name: 'p', data: utils.mpNormalize(rsaParams['p'])}, + { name: 'q', data: utils.mpNormalize(rsaParams['q'])}, + { name: 'dmodp', + data: utils.mpNormalize(rsaParams['dmodp'])}, + { name: 'dmodq', + data: utils.mpNormalize(rsaParams['dmodq'])}, + { name: 'iqmp', + data: utils.mpNormalize(rsaParams['iqmp'])} + ] + }; + return (new PrivateKey(key)); +} + +function readDNSSECPrivateKey(alg, elements) { + if (supportedAlgosById[alg].match(/^RSA-/)) { + return (readDNSSECRSAPrivateKey(elements)); + } + if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' || + supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + var d = Buffer.from(elements[0].split(' ')[1], 'base64'); + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + curve = 'nistp256'; + size = 256; + } + // DNSSEC generates the public-key on the fly (go calculate it) + var publicKey = utils.publicFromPrivateECDSA(curve, d); + var Q = publicKey.part['Q'].data; + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'd', data: d }, + {name: 'Q', data: Q } + ] + }; + return (new PrivateKey(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + supportedAlgosById[alg])); +} + +function dnssecTimestamp(date) { + var year = date.getFullYear() + ''; //stringify + var month = (date.getMonth() + 1); + var timestampStr = year + month + date.getUTCDate(); + timestampStr += '' + date.getUTCHours() + date.getUTCMinutes(); + timestampStr += date.getUTCSeconds(); + return (timestampStr); +} + +function rsaAlgFromOptions(opts) { + if (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1') + return ('5 (RSASHA1)'); + else if (opts.hashAlgo === 'sha256') + return ('8 (RSASHA256)'); + else if (opts.hashAlgo === 'sha512') + return ('10 (RSASHA512)'); + else + throw (new Error('Unknown or unsupported hash: ' + + opts.hashAlgo)); +} + +function writeRSA(key, options) { + // if we're missing parts, add them. + if (!key.part.dmodp || !key.part.dmodq) { + utils.addRSAMissing(key); + } + + var out = ''; + out += 'Private-key-format: v1.3\n'; + out += 'Algorithm: ' + rsaAlgFromOptions(options) + '\n'; + var n = utils.mpDenormalize(key.part['n'].data); + out += 'Modulus: ' + n.toString('base64') + '\n'; + var e = utils.mpDenormalize(key.part['e'].data); + out += 'PublicExponent: ' + e.toString('base64') + '\n'; + var d = utils.mpDenormalize(key.part['d'].data); + out += 'PrivateExponent: ' + d.toString('base64') + '\n'; + var p = utils.mpDenormalize(key.part['p'].data); + out += 'Prime1: ' + p.toString('base64') + '\n'; + var q = utils.mpDenormalize(key.part['q'].data); + out += 'Prime2: ' + q.toString('base64') + '\n'; + var dmodp = utils.mpDenormalize(key.part['dmodp'].data); + out += 'Exponent1: ' + dmodp.toString('base64') + '\n'; + var dmodq = utils.mpDenormalize(key.part['dmodq'].data); + out += 'Exponent2: ' + dmodq.toString('base64') + '\n'; + var iqmp = utils.mpDenormalize(key.part['iqmp'].data); + out += 'Coefficient: ' + iqmp.toString('base64') + '\n'; + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + return (Buffer.from(out, 'ascii')); +} + +function writeECDSA(key, options) { + var out = ''; + out += 'Private-key-format: v1.3\n'; + + if (key.curve === 'nistp256') { + out += 'Algorithm: 13 (ECDSAP256SHA256)\n'; + } else if (key.curve === 'nistp384') { + out += 'Algorithm: 14 (ECDSAP384SHA384)\n'; + } else { + throw (new Error('Unsupported curve')); + } + var base64Key = key.part['d'].data.toString('base64'); + out += 'PrivateKey: ' + base64Key + '\n'; + + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + + return (Buffer.from(out, 'ascii')); +} + +function write(key, options) { + if (PrivateKey.isPrivateKey(key)) { + if (key.type === 'rsa') { + return (writeRSA(key, options)); + } else if (key.type === 'ecdsa') { + return (writeECDSA(key, options)); + } else { + throw (new Error('Unsupported algorithm: ' + key.type)); + } + } else if (Key.isKey(key)) { + /* + * RFC3110 requires a keyname, and a keytype, which we + * don't really have a mechanism for specifying such + * additional metadata. + */ + throw (new Error('Format "dnssec" only supports ' + + 'writing private keys')); + } else { + throw (new Error('key is not a Key or PrivateKey')); + } +} diff --git a/node_modules/sshpk/lib/formats/openssh-cert.js b/node_modules/sshpk/lib/formats/openssh-cert.js new file mode 100644 index 00000000..766f3d39 --- /dev/null +++ b/node_modules/sshpk/lib/formats/openssh-cert.js @@ -0,0 +1,352 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write, + + /* Internal private API */ + fromBuffer: fromBuffer, + toBuffer: toBuffer +}; + +var assert = require('assert-plus'); +var SSHBuffer = require('../ssh-buffer'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var Identity = require('../identity'); +var rfc4253 = require('./rfc4253'); +var Signature = require('../signature'); +var utils = require('../utils'); +var Certificate = require('../certificate'); + +function verify(cert, key) { + /* + * We always give an issuerKey, so if our verify() is being called then + * there was no signature. Return false. + */ + return (false); +} + +var TYPES = { + 'user': 1, + 'host': 2 +}; +Object.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; }); + +var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/; + +function read(buf, options) { + if (Buffer.isBuffer(buf)) + buf = buf.toString('ascii'); + var parts = buf.trim().split(/[ \t\n]+/g); + if (parts.length < 2 || parts.length > 3) + throw (new Error('Not a valid SSH certificate line')); + + var algo = parts[0]; + var data = parts[1]; + + data = Buffer.from(data, 'base64'); + return (fromBuffer(data, algo)); +} + +function fromBuffer(data, algo, partial) { + var sshbuf = new SSHBuffer({ buffer: data }); + var innerAlgo = sshbuf.readString(); + if (algo !== undefined && innerAlgo !== algo) + throw (new Error('SSH certificate algorithm mismatch')); + if (algo === undefined) + algo = innerAlgo; + + var cert = {}; + cert.signatures = {}; + cert.signatures.openssh = {}; + + cert.signatures.openssh.nonce = sshbuf.readBuffer(); + + var key = {}; + var parts = (key.parts = []); + key.type = getAlg(algo); + + var partCount = algs.info[key.type].parts.length; + while (parts.length < partCount) + parts.push(sshbuf.readPart()); + assert.ok(parts.length >= 1, 'key must have at least one part'); + + var algInfo = algs.info[key.type]; + if (key.type === 'ecdsa') { + var res = ECDSA_ALGO.exec(algo); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + for (var i = 0; i < algInfo.parts.length; ++i) { + parts[i].name = algInfo.parts[i]; + if (parts[i].name !== 'curve' && + algInfo.normalize !== false) { + var p = parts[i]; + p.data = utils.mpNormalize(p.data); + } + } + + cert.subjectKey = new Key(key); + + cert.serial = sshbuf.readInt64(); + + var type = TYPES[sshbuf.readInt()]; + assert.string(type, 'valid cert type'); + + cert.signatures.openssh.keyId = sshbuf.readString(); + + var principals = []; + var pbuf = sshbuf.readBuffer(); + var psshbuf = new SSHBuffer({ buffer: pbuf }); + while (!psshbuf.atEnd()) + principals.push(psshbuf.readString()); + if (principals.length === 0) + principals = ['*']; + + cert.subjects = principals.map(function (pr) { + if (type === 'user') + return (Identity.forUser(pr)); + else if (type === 'host') + return (Identity.forHost(pr)); + throw (new Error('Unknown identity type ' + type)); + }); + + cert.validFrom = int64ToDate(sshbuf.readInt64()); + cert.validUntil = int64ToDate(sshbuf.readInt64()); + + var exts = []; + var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + var ext; + while (!extbuf.atEnd()) { + ext = { critical: true }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + while (!extbuf.atEnd()) { + ext = { critical: false }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + cert.signatures.openssh.exts = exts; + + /* reserved */ + sshbuf.readBuffer(); + + var signingKeyBuf = sshbuf.readBuffer(); + cert.issuerKey = rfc4253.read(signingKeyBuf); + + /* + * OpenSSH certs don't give the identity of the issuer, just their + * public key. So, we use an Identity that matches anything. The + * isSignedBy() function will later tell you if the key matches. + */ + cert.issuer = Identity.forHost('**'); + + var sigBuf = sshbuf.readBuffer(); + cert.signatures.openssh.signature = + Signature.parse(sigBuf, cert.issuerKey.type, 'ssh'); + + if (partial !== undefined) { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Certificate(cert)); +} + +function int64ToDate(buf) { + var i = buf.readUInt32BE(0) * 4294967296; + i += buf.readUInt32BE(4); + var d = new Date(); + d.setTime(i * 1000); + d.sourceInt64 = buf; + return (d); +} + +function dateToInt64(date) { + if (date.sourceInt64 !== undefined) + return (date.sourceInt64); + var i = Math.round(date.getTime() / 1000); + var upper = Math.floor(i / 4294967296); + var lower = Math.floor(i % 4294967296); + var buf = Buffer.alloc(8); + buf.writeUInt32BE(upper, 0); + buf.writeUInt32BE(lower, 4); + return (buf); +} + +function sign(cert, key) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + return (false); + } + var sig = cert.signatures.openssh; + var hashAlgo = undefined; + if (key.type === 'rsa' || key.type === 'dsa') + hashAlgo = 'sha1'; + var signer = key.createSign(hashAlgo); + signer.write(blob); + sig.signature = signer.sign(); + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + done(e); + return; + } + var sig = cert.signatures.openssh; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + try { + /* + * This will throw if the signature isn't of a + * type/algo that can be used for SSH. + */ + signature.toBuffer('ssh'); + } catch (e) { + done(e); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + if (options === undefined) + options = {}; + + var blob = toBuffer(cert); + var out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64'); + if (options.comment) + out = out + ' ' + options.comment; + return (out); +} + + +function toBuffer(cert, noSig) { + assert.object(cert.signatures.openssh, 'signature for openssh format'); + var sig = cert.signatures.openssh; + + if (sig.nonce === undefined) + sig.nonce = crypto.randomBytes(16); + var buf = new SSHBuffer({}); + buf.writeString(getCertType(cert.subjectKey)); + buf.writeBuffer(sig.nonce); + + var key = cert.subjectKey; + var algInfo = algs.info[key.type]; + algInfo.parts.forEach(function (part) { + buf.writePart(key.part[part]); + }); + + buf.writeInt64(cert.serial); + + var type = cert.subjects[0].type; + assert.notStrictEqual(type, 'unknown'); + cert.subjects.forEach(function (id) { + assert.strictEqual(id.type, type); + }); + type = TYPES[type]; + buf.writeInt(type); + + if (sig.keyId === undefined) { + sig.keyId = cert.subjects[0].type + '_' + + (cert.subjects[0].uid || cert.subjects[0].hostname); + } + buf.writeString(sig.keyId); + + var sub = new SSHBuffer({}); + cert.subjects.forEach(function (id) { + if (type === TYPES.host) + sub.writeString(id.hostname); + else if (type === TYPES.user) + sub.writeString(id.uid); + }); + buf.writeBuffer(sub.toBuffer()); + + buf.writeInt64(dateToInt64(cert.validFrom)); + buf.writeInt64(dateToInt64(cert.validUntil)); + + var exts = sig.exts; + if (exts === undefined) + exts = []; + + var extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical !== true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical === true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + /* reserved */ + buf.writeBuffer(Buffer.alloc(0)); + + sub = rfc4253.write(cert.issuerKey); + buf.writeBuffer(sub); + + if (!noSig) + buf.writeBuffer(sig.signature.toBuffer('ssh')); + + return (buf.toBuffer()); +} + +function getAlg(certType) { + if (certType === 'ssh-rsa-cert-v01@openssh.com') + return ('rsa'); + if (certType === 'ssh-dss-cert-v01@openssh.com') + return ('dsa'); + if (certType.match(ECDSA_ALGO)) + return ('ecdsa'); + if (certType === 'ssh-ed25519-cert-v01@openssh.com') + return ('ed25519'); + throw (new Error('Unsupported cert type ' + certType)); +} + +function getCertType(key) { + if (key.type === 'rsa') + return ('ssh-rsa-cert-v01@openssh.com'); + if (key.type === 'dsa') + return ('ssh-dss-cert-v01@openssh.com'); + if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com'); + if (key.type === 'ed25519') + return ('ssh-ed25519-cert-v01@openssh.com'); + throw (new Error('Unsupported key type ' + key.type)); +} diff --git a/node_modules/sshpk/lib/formats/pem.js b/node_modules/sshpk/lib/formats/pem.js new file mode 100644 index 00000000..bbe78fcb --- /dev/null +++ b/node_modules/sshpk/lib/formats/pem.js @@ -0,0 +1,290 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pkcs1 = require('./pkcs1'); +var pkcs8 = require('./pkcs8'); +var sshpriv = require('./ssh-private'); +var rfc4253 = require('./rfc4253'); + +var errors = require('../errors'); + +var OID_PBES2 = '1.2.840.113549.1.5.13'; +var OID_PBKDF2 = '1.2.840.113549.1.5.12'; + +var OID_TO_CIPHER = { + '1.2.840.113549.3.7': '3des-cbc', + '2.16.840.1.101.3.4.1.2': 'aes128-cbc', + '2.16.840.1.101.3.4.1.42': 'aes256-cbc' +}; +var CIPHER_TO_OID = {}; +Object.keys(OID_TO_CIPHER).forEach(function (k) { + CIPHER_TO_OID[OID_TO_CIPHER[k]] = k; +}); + +var OID_TO_HASH = { + '1.2.840.113549.2.7': 'sha1', + '1.2.840.113549.2.9': 'sha256', + '1.2.840.113549.2.11': 'sha512' +}; +var HASH_TO_OID = {}; +Object.keys(OID_TO_HASH).forEach(function (k) { + HASH_TO_OID[OID_TO_HASH[k]] = k; +}); + +/* + * For reading we support both PKCS#1 and PKCS#8. If we find a private key, + * we just take the public component of it and use that. + */ +function read(buf, options, forceType) { + var input = buf; + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + /* Begin and end banners must match key type */ + assert.equal(m[2], m2[2]); + var type = m[2].toLowerCase(); + + var alg; + if (m[1]) { + /* They also must match algorithms, if given */ + assert.equal(m[1], m2[1], 'PEM header and footer mismatch'); + alg = m[1].trim(); + } + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + var cipher, key, iv; + if (headers['proc-type']) { + var parts = headers['proc-type'].split(','); + if (parts[0] === '4' && parts[1] === 'ENCRYPTED') { + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } else { + parts = headers['dek-info'].split(','); + assert.ok(parts.length === 2); + cipher = parts[0].toLowerCase(); + iv = Buffer.from(parts[1], 'hex'); + key = utils.opensslKeyDeriv(cipher, iv, + options.passphrase, 1).key; + } + } + } + + if (alg && alg.toLowerCase() === 'encrypted') { + var eder = new asn1.BerReader(buf); + var pbesEnd; + eder.readSequence(); + + eder.readSequence(); + pbesEnd = eder.offset + eder.length; + + var method = eder.readOID(); + if (method !== OID_PBES2) { + throw (new Error('Unsupported PEM/PKCS8 encryption ' + + 'scheme: ' + method)); + } + + eder.readSequence(); /* PBES2-params */ + + eder.readSequence(); /* keyDerivationFunc */ + var kdfEnd = eder.offset + eder.length; + var kdfOid = eder.readOID(); + if (kdfOid !== OID_PBKDF2) + throw (new Error('Unsupported PBES2 KDF: ' + kdfOid)); + eder.readSequence(); + var salt = eder.readString(asn1.Ber.OctetString, true); + var iterations = eder.readInt(); + var hashAlg = 'sha1'; + if (eder.offset < kdfEnd) { + eder.readSequence(); + var hashAlgOid = eder.readOID(); + hashAlg = OID_TO_HASH[hashAlgOid]; + if (hashAlg === undefined) { + throw (new Error('Unsupported PBKDF2 hash: ' + + hashAlgOid)); + } + } + eder._offset = kdfEnd; + + eder.readSequence(); /* encryptionScheme */ + var cipherOid = eder.readOID(); + cipher = OID_TO_CIPHER[cipherOid]; + if (cipher === undefined) { + throw (new Error('Unsupported PBES2 cipher: ' + + cipherOid)); + } + iv = eder.readString(asn1.Ber.OctetString, true); + + eder._offset = pbesEnd; + buf = eder.readString(asn1.Ber.OctetString, true); + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } + + var cinfo = utils.opensshCipherInfo(cipher); + + cipher = cinfo.opensslName; + key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, + options.passphrase); + alg = undefined; + } + + if (cipher && key && iv) { + var cipherStream = crypto.createDecipheriv(cipher, key, iv); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(buf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + buf = Buffer.concat(chunks); + } + + /* The new OpenSSH internal format abuses PEM headers */ + if (alg && alg.toLowerCase() === 'openssh') + return (sshpriv.readSSHPrivate(type, buf, options)); + if (alg && alg.toLowerCase() === 'ssh2') + return (rfc4253.readType(type, buf, options)); + + var der = new asn1.BerReader(buf); + der.originalInput = input; + + /* + * All of the PEM file types start with a sequence tag, so chop it + * off here + */ + der.readSequence(); + + /* PKCS#1 type keys name an algorithm in the banner explicitly */ + if (alg) { + if (forceType) + assert.strictEqual(forceType, 'pkcs1'); + return (pkcs1.readPkcs1(alg, type, der)); + } else { + if (forceType) + assert.strictEqual(forceType, 'pkcs8'); + return (pkcs8.readPkcs8(alg, type, der)); + } +} + +function write(key, options, type) { + assert.object(key); + + var alg = { + 'ecdsa': 'EC', + 'rsa': 'RSA', + 'dsa': 'DSA', + 'ed25519': 'EdDSA' + }[key.type]; + var header; + + var der = new asn1.BerWriter(); + + if (PrivateKey.isPrivateKey(key)) { + if (type && type === 'pkcs8') { + header = 'PRIVATE KEY'; + pkcs8.writePkcs8(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs1'); + header = alg + ' PRIVATE KEY'; + pkcs1.writePkcs1(der, key); + } + + } else if (Key.isKey(key)) { + if (type && type === 'pkcs1') { + header = alg + ' PUBLIC KEY'; + pkcs1.writePkcs1(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs8'); + header = 'PUBLIC KEY'; + pkcs8.writePkcs8(der, key); + } + + } else { + throw (new Error('key is not a Key or PrivateKey')); + } + + var tmp = der.buffer.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/pkcs1.js b/node_modules/sshpk/lib/formats/pkcs1.js new file mode 100644 index 00000000..bc485500 --- /dev/null +++ b/node_modules/sshpk/lib/formats/pkcs1.js @@ -0,0 +1,373 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readPkcs1: readPkcs1, + write: write, + writePkcs1: writePkcs1 +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +var pkcs8 = require('./pkcs8'); +var readECDSACurve = pkcs8.readECDSACurve; + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs1')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs1')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs1(alg, type, der) { + switch (alg) { + case 'RSA': + if (type === 'public') + return (readPkcs1RSAPublic(der)); + else if (type === 'private') + return (readPkcs1RSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'DSA': + if (type === 'public') + return (readPkcs1DSAPublic(der)); + else if (type === 'private') + return (readPkcs1DSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EC': + case 'ECDSA': + if (type === 'private') + return (readPkcs1ECDSAPrivate(der)); + else if (type === 'public') + return (readPkcs1ECDSAPublic(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EDDSA': + case 'EdDSA': + if (type === 'private') + return (readPkcs1EdDSAPrivate(der)); + throw (new Error(type + ' keys not supported with EdDSA')); + default: + throw (new Error('Unknown key algo: ' + alg)); + } +} + +function readPkcs1RSAPublic(der) { + // modulus and exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs1RSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version[0], 0); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 0); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + var y = readMPInt(der, 'y'); + var x = readMPInt(der, 'x'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1EdDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var k = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var oid = der.readOID(); + assert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier'); + + der.readSequence(0xa1); + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: k } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPublic(der) { + var y = readMPInt(der, 'y'); + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + var key = { + type: 'dsa', + parts: [ + { name: 'y', data: y }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPublic(der) { + der.readSequence(); + + var oid = der.readOID(); + assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey'); + + var curveOid = der.readOID(); + + var curve; + var curves = Object.keys(algs.curves); + for (var j = 0; j < curves.length; ++j) { + var c = curves[j]; + var cd = algs.curves[c]; + if (cd.pkcs8oid === curveOid) { + curve = c; + break; + } + } + assert.string(curve, 'a known ECDSA named curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var d = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var curve = readECDSACurve(der); + assert.string(curve, 'a known elliptic curve'); + + der.readSequence(0xa1); + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function writePkcs1(der, key) { + der.startSequence(); + + switch (key.type) { + case 'rsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1RSAPrivate(der, key); + else + writePkcs1RSAPublic(der, key); + break; + case 'dsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1DSAPrivate(der, key); + else + writePkcs1DSAPublic(der, key); + break; + case 'ecdsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1ECDSAPrivate(der, key); + else + writePkcs1ECDSAPublic(der, key); + break; + case 'ed25519': + if (PrivateKey.isPrivateKey(key)) + writePkcs1EdDSAPrivate(der, key); + else + writePkcs1EdDSAPublic(der, key); + break; + default: + throw (new Error('Unknown key algo: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs1RSAPublic(der, key) { + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); +} + +function writePkcs1RSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPublic(der, key) { + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); +} + +function writePkcs1ECDSAPublic(der, key) { + der.startSequence(); + + der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */ + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs1ECDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + der.endSequence(); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); +} + +function writePkcs1EdDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.k.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + der.writeOID('1.3.101.112'); + der.endSequence(); + + der.startSequence(0xa1); + utils.writeBitString(der, key.part.A.data); + der.endSequence(); +} + +function writePkcs1EdDSAPublic(der, key) { + throw (new Error('Public keys are not supported for EdDSA PKCS#1')); +} diff --git a/node_modules/sshpk/lib/formats/pkcs8.js b/node_modules/sshpk/lib/formats/pkcs8.js new file mode 100644 index 00000000..2ca3ca7a --- /dev/null +++ b/node_modules/sshpk/lib/formats/pkcs8.js @@ -0,0 +1,631 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + readPkcs8: readPkcs8, + write: write, + writePkcs8: writePkcs8, + pkcs8ToBuffer: pkcs8ToBuffer, + + readECDSACurve: readECDSACurve, + writeECDSACurve: writeECDSACurve +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs8')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs8')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs8(alg, type, der) { + /* Private keys in pkcs#8 format have a weird extra int */ + if (der.peek() === asn1.Ber.Integer) { + assert.strictEqual(type, 'private', + 'unexpected Integer at start of public key'); + der.readString(asn1.Ber.Integer, true); + } + + der.readSequence(); + var next = der.offset + der.length; + + var oid = der.readOID(); + switch (oid) { + case '1.2.840.113549.1.1.1': + der._offset = next; + if (type === 'public') + return (readPkcs8RSAPublic(der)); + else + return (readPkcs8RSAPrivate(der)); + case '1.2.840.10040.4.1': + if (type === 'public') + return (readPkcs8DSAPublic(der)); + else + return (readPkcs8DSAPrivate(der)); + case '1.2.840.10045.2.1': + if (type === 'public') + return (readPkcs8ECDSAPublic(der)); + else + return (readPkcs8ECDSAPrivate(der)); + case '1.3.101.112': + if (type === 'public') { + return (readPkcs8EdDSAPublic(der)); + } else { + return (readPkcs8EdDSAPrivate(der)); + } + case '1.3.101.110': + if (type === 'public') { + return (readPkcs8X25519Public(der)); + } else { + return (readPkcs8X25519Private(der)); + } + default: + throw (new Error('Unknown key type OID ' + oid)); + } +} + +function readPkcs8RSAPublic(der) { + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + der.readSequence(); + + // modulus + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + source: der.originalInput, + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs8RSAPrivate(der) { + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var ver = readMPInt(der, 'version'); + assert.equal(ver[0], 0x0, 'unknown RSA private key version'); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8DSAPublic(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + + var y = readMPInt(der, 'y'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y } + ] + }; + + return (new Key(key)); +} + +function readPkcs8DSAPrivate(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + der.readSequence(asn1.Ber.OctetString); + var x = readMPInt(der, 'x'); + + /* The pkcs#8 format does not include the public key */ + var y = utils.calculateDSAPublic(g, p, x); + + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readECDSACurve(der) { + var curveName, curveNames; + var j, c, cd; + + if (der.peek() === asn1.Ber.OID) { + var oid = der.readOID(); + + curveNames = Object.keys(algs.curves); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + if (cd.pkcs8oid === oid) { + curveName = c; + break; + } + } + + } else { + // ECParameters sequence + der.readSequence(); + var version = der.readString(asn1.Ber.Integer, true); + assert.strictEqual(version[0], 1, 'ECDSA key not version 1'); + + var curve = {}; + + // FieldID sequence + der.readSequence(); + var fieldTypeOid = der.readOID(); + assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1', + 'ECDSA key is not from a prime-field'); + var p = curve.p = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + /* + * p always starts with a 1 bit, so count the zeros to get its + * real size. + */ + curve.size = p.length * 8 - utils.countZeros(p); + + // Curve sequence + der.readSequence(); + curve.a = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + curve.b = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + if (der.peek() === asn1.Ber.BitString) + curve.s = der.readString(asn1.Ber.BitString, true); + + // Combined Gx and Gy + curve.G = der.readString(asn1.Ber.OctetString, true); + assert.strictEqual(curve.G[0], 0x4, + 'uncompressed G is required'); + + curve.n = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + curve.h = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' + + 'required'); + + curveNames = Object.keys(algs.curves); + var ks = Object.keys(curve); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + var equal = true; + for (var i = 0; i < ks.length; ++i) { + var k = ks[i]; + if (cd[k] === undefined) + continue; + if (typeof (cd[k]) === 'object' && + cd[k].equals !== undefined) { + if (!cd[k].equals(curve[k])) { + equal = false; + break; + } + } else if (Buffer.isBuffer(cd[k])) { + if (cd[k].toString('binary') + !== curve[k].toString('binary')) { + equal = false; + break; + } + } else { + if (cd[k] !== curve[k]) { + equal = false; + break; + } + } + } + if (equal) { + curveName = c; + break; + } + } + } + return (curveName); +} + +function readPkcs8ECDSAPrivate(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var version = readMPInt(der, 'version'); + assert.equal(version[0], 1, 'unknown version of ECDSA key'); + + var d = der.readString(asn1.Ber.OctetString, true); + var Q; + + if (der.peek() == 0xa0) { + der.readSequence(0xa0); + der._offset += der.length; + } + if (der.peek() == 0xa1) { + der.readSequence(0xa1); + Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + } + + if (Q === undefined) { + var pub = utils.publicFromPrivateECDSA(curveName, d); + Q = pub.part.Q.data; + } + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8ECDSAPublic(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPublic(der) { + if (der.peek() === 0x00) + der.readByte(); + + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8X25519Public(der) { + var A = utils.readBitString(der); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPrivate(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A; + if (der.peek() === asn1.Ber.BitString) { + A = utils.readBitString(der); + A = utils.zeroPadToLength(A, 32); + } else { + A = utils.calculateED25519Public(k); + } + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8X25519Private(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A = utils.calculateX25519Public(k); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function pkcs8ToBuffer(key) { + var der = new asn1.BerWriter(); + writePkcs8(der, key); + return (der.buffer); +} + +function writePkcs8(der, key) { + der.startSequence(); + + if (PrivateKey.isPrivateKey(key)) { + var sillyInt = Buffer.from([0]); + der.writeBuffer(sillyInt, asn1.Ber.Integer); + } + + der.startSequence(); + switch (key.type) { + case 'rsa': + der.writeOID('1.2.840.113549.1.1.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8RSAPrivate(key, der); + else + writePkcs8RSAPublic(key, der); + break; + case 'dsa': + der.writeOID('1.2.840.10040.4.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8DSAPrivate(key, der); + else + writePkcs8DSAPublic(key, der); + break; + case 'ecdsa': + der.writeOID('1.2.840.10045.2.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8ECDSAPrivate(key, der); + else + writePkcs8ECDSAPublic(key, der); + break; + case 'ed25519': + der.writeOID('1.3.101.112'); + if (PrivateKey.isPrivateKey(key)) + throw (new Error('Ed25519 private keys in pkcs8 ' + + 'format are not supported')); + writePkcs8EdDSAPublic(key, der); + break; + default: + throw (new Error('Unsupported key type: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs8RSAPrivate(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([0]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8RSAPublic(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + + der.startSequence(); + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); +} + +function writePkcs8DSAPrivate(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writePkcs8DSAPublic(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writeECDSACurve(key, der) { + var curve = algs.curves[key.curve]; + if (curve.pkcs8oid) { + /* This one has a name in pkcs#8, so just write the oid */ + der.writeOID(curve.pkcs8oid); + + } else { + // ECParameters sequence + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + // FieldID sequence + der.startSequence(); + der.writeOID('1.2.840.10045.1.1'); // prime-field + der.writeBuffer(curve.p, asn1.Ber.Integer); + der.endSequence(); + + // Curve sequence + der.startSequence(); + var a = curve.p; + if (a[0] === 0x0) + a = a.slice(1); + der.writeBuffer(a, asn1.Ber.OctetString); + der.writeBuffer(curve.b, asn1.Ber.OctetString); + der.writeBuffer(curve.s, asn1.Ber.BitString); + der.endSequence(); + + der.writeBuffer(curve.G, asn1.Ber.OctetString); + der.writeBuffer(curve.n, asn1.Ber.Integer); + var h = curve.h; + if (!h) { + h = Buffer.from([1]); + } + der.writeBuffer(h, asn1.Ber.Integer); + + // ECParameters + der.endSequence(); + } +} + +function writePkcs8ECDSAPublic(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs8ECDSAPrivate(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8EdDSAPublic(key, der) { + der.endSequence(); + + utils.writeBitString(der, key.part.A.data); +} + +function writePkcs8EdDSAPrivate(key, der) { + der.endSequence(); + + var k = utils.mpNormalize(key.part.k.data, true); + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(k, asn1.Ber.OctetString); + der.endSequence(); +} diff --git a/node_modules/sshpk/lib/formats/putty.js b/node_modules/sshpk/lib/formats/putty.js new file mode 100644 index 00000000..e7b2add3 --- /dev/null +++ b/node_modules/sshpk/lib/formats/putty.js @@ -0,0 +1,194 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var Key = require('../key'); +var SSHBuffer = require('../ssh-buffer'); +var crypto = require('crypto'); +var PrivateKey = require('../private-key'); + +var errors = require('../errors'); + +// https://tartarus.org/~simon/putty-prerel-snapshots/htmldoc/AppendixC.html +function read(buf, options) { + var lines = buf.toString('ascii').split(/[\r\n]+/); + var found = false; + var parts; + var si = 0; + var formatVersion; + while (si < lines.length) { + parts = splitHeader(lines[si++]); + if (parts) { + formatVersion = { + 'putty-user-key-file-2': 2, + 'putty-user-key-file-3': 3 + }[parts[0].toLowerCase()]; + if (formatVersion) { + found = true; + break; + } + } + } + if (!found) { + throw (new Error('No PuTTY format first line found')); + } + var alg = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'encryption'); + var encryption = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'comment'); + var comment = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'public-lines'); + var publicLines = parseInt(parts[1], 10); + if (!isFinite(publicLines) || publicLines < 0 || + publicLines > lines.length) { + throw (new Error('Invalid public-lines count')); + } + + var publicBuf = Buffer.from( + lines.slice(si, si + publicLines).join(''), 'base64'); + var keyType = rfc4253.algToKeyType(alg); + var key = rfc4253.read(publicBuf); + if (key.type !== keyType) { + throw (new Error('Outer key algorithm mismatch')); + } + + si += publicLines; + if (lines[si]) { + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'private-lines'); + var privateLines = parseInt(parts[1], 10); + if (!isFinite(privateLines) || privateLines < 0 || + privateLines > lines.length) { + throw (new Error('Invalid private-lines count')); + } + + var privateBuf = Buffer.from( + lines.slice(si, si + privateLines).join(''), 'base64'); + + if (encryption !== 'none' && formatVersion === 3) { + throw new Error('Encrypted keys arenot supported for' + + ' PuTTY format version 3'); + } + + if (encryption === 'aes256-cbc') { + if (!options.passphrase) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } + + var iv = Buffer.alloc(16, 0); + var decipher = crypto.createDecipheriv( + 'aes-256-cbc', + derivePPK2EncryptionKey(options.passphrase), + iv); + decipher.setAutoPadding(false); + privateBuf = Buffer.concat([ + decipher.update(privateBuf), decipher.final()]); + } + + key = new PrivateKey(key); + if (key.type !== keyType) { + throw (new Error('Outer key algorithm mismatch')); + } + + var sshbuf = new SSHBuffer({buffer: privateBuf}); + var privateKeyParts; + if (alg === 'ssh-dss') { + privateKeyParts = [ { + name: 'x', + data: sshbuf.readBuffer() + }]; + } else if (alg === 'ssh-rsa') { + privateKeyParts = [ + { name: 'd', data: sshbuf.readBuffer() }, + { name: 'p', data: sshbuf.readBuffer() }, + { name: 'q', data: sshbuf.readBuffer() }, + { name: 'iqmp', data: sshbuf.readBuffer() } + ]; + } else if (alg.match(/^ecdsa-sha2-nistp/)) { + privateKeyParts = [ { + name: 'd', data: sshbuf.readBuffer() + } ]; + } else if (alg === 'ssh-ed25519') { + privateKeyParts = [ { + name: 'k', data: sshbuf.readBuffer() + } ]; + } else { + throw new Error('Unsupported PPK key type: ' + alg); + } + + key = new PrivateKey({ + type: key.type, + parts: key.parts.concat(privateKeyParts) + }); + } + + key.comment = comment; + return (key); +} + +function derivePPK2EncryptionKey(passphrase) { + var hash1 = crypto.createHash('sha1').update(Buffer.concat([ + Buffer.from([0, 0, 0, 0]), + Buffer.from(passphrase) + ])).digest(); + var hash2 = crypto.createHash('sha1').update(Buffer.concat([ + Buffer.from([0, 0, 0, 1]), + Buffer.from(passphrase) + ])).digest(); + return (Buffer.concat([hash1, hash2]).slice(0, 32)); +} + +function splitHeader(line) { + var idx = line.indexOf(':'); + if (idx === -1) + return (null); + var header = line.slice(0, idx); + ++idx; + while (line[idx] === ' ') + ++idx; + var rest = line.slice(idx); + return ([header, rest]); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var alg = rfc4253.keyTypeToAlg(key); + var buf = rfc4253.write(key); + var comment = key.comment || ''; + + var b64 = buf.toString('base64'); + var lines = wrap(b64, 64); + + lines.unshift('Public-Lines: ' + lines.length); + lines.unshift('Comment: ' + comment); + lines.unshift('Encryption: none'); + lines.unshift('PuTTY-User-Key-File-2: ' + alg); + + return (Buffer.from(lines.join('\n') + '\n')); +} + +function wrap(txt, len) { + var lines = []; + var pos = 0; + while (pos < txt.length) { + lines.push(txt.slice(pos, pos + 64)); + pos += 64; + } + return (lines); +} diff --git a/node_modules/sshpk/lib/formats/rfc4253.js b/node_modules/sshpk/lib/formats/rfc4253.js new file mode 100644 index 00000000..52fddcb6 --- /dev/null +++ b/node_modules/sshpk/lib/formats/rfc4253.js @@ -0,0 +1,166 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read.bind(undefined, false, undefined), + readType: read.bind(undefined, false), + write: write, + /* semi-private api, used by sshpk-agent */ + readPartial: read.bind(undefined, true), + + /* shared with ssh format */ + readInternal: read, + keyTypeToAlg: keyTypeToAlg, + algToKeyType: algToKeyType +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var SSHBuffer = require('../ssh-buffer'); + +function algToKeyType(alg) { + assert.string(alg); + if (alg === 'ssh-dss') + return ('dsa'); + else if (alg === 'ssh-rsa') + return ('rsa'); + else if (alg === 'ssh-ed25519') + return ('ed25519'); + else if (alg === 'ssh-curve25519') + return ('curve25519'); + else if (alg.match(/^ecdsa-sha2-/)) + return ('ecdsa'); + else + throw (new Error('Unknown algorithm ' + alg)); +} + +function keyTypeToAlg(key) { + assert.object(key); + if (key.type === 'dsa') + return ('ssh-dss'); + else if (key.type === 'rsa') + return ('ssh-rsa'); + else if (key.type === 'ed25519') + return ('ssh-ed25519'); + else if (key.type === 'curve25519') + return ('ssh-curve25519'); + else if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.part.curve.data.toString()); + else + throw (new Error('Unknown key type ' + key.type)); +} + +function read(partial, type, buf, options) { + if (typeof (buf) === 'string') + buf = Buffer.from(buf); + assert.buffer(buf, 'buf'); + + var key = {}; + + var parts = key.parts = []; + var sshbuf = new SSHBuffer({buffer: buf}); + + var alg = sshbuf.readString(); + assert.ok(!sshbuf.atEnd(), 'key must have at least one part'); + + key.type = algToKeyType(alg); + + var partCount = algs.info[key.type].parts.length; + if (type && type === 'private') + partCount = algs.privInfo[key.type].parts.length; + + while (!sshbuf.atEnd() && parts.length < partCount) + parts.push(sshbuf.readPart()); + while (!partial && !sshbuf.atEnd()) + parts.push(sshbuf.readPart()); + + assert.ok(parts.length >= 1, + 'key must have at least one part'); + assert.ok(partial || sshbuf.atEnd(), + 'leftover bytes at end of key'); + + var Constructor = Key; + var algInfo = algs.info[key.type]; + if (type === 'private' || algInfo.parts.length !== parts.length) { + algInfo = algs.privInfo[key.type]; + Constructor = PrivateKey; + } + assert.strictEqual(algInfo.parts.length, parts.length); + + if (key.type === 'ecdsa') { + var res = /^ecdsa-sha2-(.+)$/.exec(alg); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + var normalized = true; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = parts[i]; + p.name = algInfo.parts[i]; + /* + * OpenSSH stores ed25519 "private" keys as seed + public key + * concat'd together (k followed by A). We want to keep them + * separate for other formats that don't do this. + */ + if (key.type === 'ed25519' && p.name === 'k') + p.data = p.data.slice(0, 32); + + if (p.name !== 'curve' && algInfo.normalize !== false) { + var nd; + if (key.type === 'ed25519') { + nd = utils.zeroPadToLength(p.data, 32); + } else { + nd = utils.mpNormalize(p.data); + } + if (nd.toString('binary') !== + p.data.toString('binary')) { + p.data = nd; + normalized = false; + } + } + } + + if (normalized) + key._rfc4253Cache = sshbuf.toBuffer(); + + if (partial && typeof (partial) === 'object') { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Constructor(key)); +} + +function write(key, options) { + assert.object(key); + + var alg = keyTypeToAlg(key); + var i; + + var algInfo = algs.info[key.type]; + if (PrivateKey.isPrivateKey(key)) + algInfo = algs.privInfo[key.type]; + var parts = algInfo.parts; + + var buf = new SSHBuffer({}); + + buf.writeString(alg); + + for (i = 0; i < parts.length; ++i) { + var data = key.part[parts[i]].data; + if (algInfo.normalize !== false) { + if (key.type === 'ed25519') + data = utils.zeroPadToLength(data, 32); + else + data = utils.mpNormalize(data); + } + if (key.type === 'ed25519' && parts[i] === 'k') + data = Buffer.concat([data, key.part.A.data]); + buf.writeBuffer(data); + } + + return (buf.toBuffer()); +} diff --git a/node_modules/sshpk/lib/formats/ssh-private.js b/node_modules/sshpk/lib/formats/ssh-private.js new file mode 100644 index 00000000..5e7eed88 --- /dev/null +++ b/node_modules/sshpk/lib/formats/ssh-private.js @@ -0,0 +1,262 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readSSHPrivate: readSSHPrivate, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var crypto = require('crypto'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var rfc4253 = require('./rfc4253'); +var SSHBuffer = require('../ssh-buffer'); +var errors = require('../errors'); + +var bcrypt; + +function read(buf, options) { + return (pem.read(buf, options)); +} + +var MAGIC = 'openssh-key-v1'; + +function readSSHPrivate(type, buf, options) { + buf = new SSHBuffer({buffer: buf}); + + var magic = buf.readCString(); + assert.strictEqual(magic, MAGIC, 'bad magic string'); + + var cipher = buf.readString(); + var kdf = buf.readString(); + var kdfOpts = buf.readBuffer(); + + var nkeys = buf.readInt(); + if (nkeys !== 1) { + throw (new Error('OpenSSH-format key file contains ' + + 'multiple keys: this is unsupported.')); + } + + var pubKey = buf.readBuffer(); + + if (type === 'public') { + assert.ok(buf.atEnd(), 'excess bytes left after key'); + return (rfc4253.read(pubKey)); + } + + var privKeyBlob = buf.readBuffer(); + assert.ok(buf.atEnd(), 'excess bytes left after key'); + + var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); + switch (kdf) { + case 'none': + if (cipher !== 'none') { + throw (new Error('OpenSSH-format key uses KDF "none" ' + + 'but specifies a cipher other than "none"')); + } + break; + case 'bcrypt': + var salt = kdfOptsBuf.readBuffer(); + var rounds = kdfOptsBuf.readInt(); + var cinf = utils.opensshCipherInfo(cipher); + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from(options.passphrase, + 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'OpenSSH')); + } + + var pass = new Uint8Array(options.passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + var cipherStream = crypto.createDecipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(privKeyBlob); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privKeyBlob = Buffer.concat(chunks); + break; + default: + throw (new Error( + 'OpenSSH-format key uses unknown KDF "' + kdf + '"')); + } + + buf = new SSHBuffer({buffer: privKeyBlob}); + + var checkInt1 = buf.readInt(); + var checkInt2 = buf.readInt(); + if (checkInt1 !== checkInt2) { + throw (new Error('Incorrect passphrase supplied, could not ' + + 'decrypt key')); + } + + var ret = {}; + var key = rfc4253.readInternal(ret, 'private', buf.remainder()); + + buf.skip(ret.consumed); + + var comment = buf.readString(); + key.comment = comment; + + return (key); +} + +function write(key, options) { + var pubKey; + if (PrivateKey.isPrivateKey(key)) + pubKey = key.toPublic(); + else + pubKey = key; + + var cipher = 'none'; + var kdf = 'none'; + var kdfopts = Buffer.alloc(0); + var cinf = { blockSize: 8 }; + var passphrase; + if (options !== undefined) { + passphrase = options.passphrase; + if (typeof (passphrase) === 'string') + passphrase = Buffer.from(passphrase, 'utf-8'); + if (passphrase !== undefined) { + assert.buffer(passphrase, 'options.passphrase'); + assert.optionalString(options.cipher, 'options.cipher'); + cipher = options.cipher; + if (cipher === undefined) + cipher = 'aes128-ctr'; + cinf = utils.opensshCipherInfo(cipher); + kdf = 'bcrypt'; + } + } + + var privBuf; + if (PrivateKey.isPrivateKey(key)) { + privBuf = new SSHBuffer({}); + var checkInt = crypto.randomBytes(4).readUInt32BE(0); + privBuf.writeInt(checkInt); + privBuf.writeInt(checkInt); + privBuf.write(key.toBuffer('rfc4253')); + privBuf.writeString(key.comment || ''); + + var n = 1; + while (privBuf._offset % cinf.blockSize !== 0) + privBuf.writeChar(n++); + privBuf = privBuf.toBuffer(); + } + + switch (kdf) { + case 'none': + break; + case 'bcrypt': + var salt = crypto.randomBytes(16); + var rounds = 16; + var kdfssh = new SSHBuffer({}); + kdfssh.writeBuffer(salt); + kdfssh.writeInt(rounds); + kdfopts = kdfssh.toBuffer(); + + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + var pass = new Uint8Array(passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + + var cipherStream = crypto.createCipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + throw (e); + }); + cipherStream.write(privBuf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privBuf = Buffer.concat(chunks); + break; + default: + throw (new Error('Unsupported kdf ' + kdf)); + } + + var buf = new SSHBuffer({}); + + buf.writeCString(MAGIC); + buf.writeString(cipher); /* cipher */ + buf.writeString(kdf); /* kdf */ + buf.writeBuffer(kdfopts); /* kdfoptions */ + + buf.writeInt(1); /* nkeys */ + buf.writeBuffer(pubKey.toBuffer('rfc4253')); + + if (privBuf) + buf.writeBuffer(privBuf); + + buf = buf.toBuffer(); + + var header; + if (PrivateKey.isPrivateKey(key)) + header = 'OPENSSH PRIVATE KEY'; + else + header = 'OPENSSH PUBLIC KEY'; + + var tmp = buf.toString('base64'); + var len = tmp.length + (tmp.length / 70) + + 18 + 16 + header.length*2 + 10; + buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 70; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/ssh.js b/node_modules/sshpk/lib/formats/ssh.js new file mode 100644 index 00000000..c8e9c931 --- /dev/null +++ b/node_modules/sshpk/lib/formats/ssh.js @@ -0,0 +1,115 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var sshpriv = require('./ssh-private'); + +/*JSSTYLED*/ +var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; +/*JSSTYLED*/ +var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/; + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var trimmed = buf.trim().replace(/[\\\r]/g, ''); + var m = trimmed.match(SSHKEY_RE); + if (!m) + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + + var type = rfc4253.algToKeyType(m[1]); + var kbuf = Buffer.from(m[2], 'base64'); + + /* + * This is a bit tricky. If we managed to parse the key and locate the + * key comment with the regex, then do a non-partial read and assert + * that we have consumed all bytes. If we couldn't locate the key + * comment, though, there may be whitespace shenanigans going on that + * have conjoined the comment to the rest of the key. We do a partial + * read in this case to try to make the best out of a sorry situation. + */ + var key; + var ret = {}; + if (m[4]) { + try { + key = rfc4253.read(kbuf); + + } catch (e) { + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + kbuf = Buffer.from(m[2], 'base64'); + key = rfc4253.readInternal(ret, 'public', kbuf); + } + } else { + key = rfc4253.readInternal(ret, 'public', kbuf); + } + + assert.strictEqual(type, key.type); + + if (m[4] && m[4].length > 0) { + key.comment = m[4]; + + } else if (ret.consumed) { + /* + * Now the magic: trying to recover the key comment when it's + * gotten conjoined to the key or otherwise shenanigan'd. + * + * Work out how much base64 we used, then drop all non-base64 + * chars from the beginning up to this point in the the string. + * Then offset in this and try to make up for missing = chars. + */ + var data = m[2] + (m[3] ? m[3] : ''); + var realOffset = Math.ceil(ret.consumed / 3) * 4; + data = data.slice(0, realOffset - 2). /*JSSTYLED*/ + replace(/[^a-zA-Z0-9+\/=]/g, '') + + data.slice(realOffset - 2); + + var padding = ret.consumed % 3; + if (padding > 0 && + data.slice(realOffset - 1, realOffset) !== '=') + realOffset--; + while (data.slice(realOffset, realOffset + 1) === '=') + realOffset++; + + /* Finally, grab what we think is the comment & clean it up. */ + var trailer = data.slice(realOffset); + trailer = trailer.replace(/[\r\n]/g, ' '). + replace(/^\s+/, ''); + if (trailer.match(/^[a-zA-Z0-9]/)) + key.comment = trailer; + } + + return (key); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var parts = []; + var alg = rfc4253.keyTypeToAlg(key); + parts.push(alg); + + var buf = rfc4253.write(key); + parts.push(buf.toString('base64')); + + if (key.comment) + parts.push(key.comment); + + return (Buffer.from(parts.join(' '))); +} diff --git a/node_modules/sshpk/lib/formats/x509-pem.js b/node_modules/sshpk/lib/formats/x509-pem.js new file mode 100644 index 00000000..3155ef0b --- /dev/null +++ b/node_modules/sshpk/lib/formats/x509-pem.js @@ -0,0 +1,88 @@ +// Copyright 2016 Joyent, Inc. + +var x509 = require('./x509'); + +module.exports = { + read: read, + verify: x509.verify, + sign: x509.sign, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END CERTIFICATE[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + return (x509.read(buf, options)); +} + +function write(cert, options) { + var dbuf = x509.write(cert, options); + + var header = 'CERTIFICATE'; + var tmp = dbuf.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/node_modules/sshpk/lib/formats/x509.js b/node_modules/sshpk/lib/formats/x509.js new file mode 100644 index 00000000..0144c444 --- /dev/null +++ b/node_modules/sshpk/lib/formats/x509.js @@ -0,0 +1,752 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); +var pkcs8 = require('./pkcs8'); + +/* + * This file is based on RFC5280 (X.509). + */ + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function verify(cert, key) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var algParts = sig.algo.split('-'); + if (algParts[0] !== key.type) + return (false); + + var blob = sig.cache; + if (blob === undefined) { + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + blob = der.buffer; + } + + var verifier = key.createVerify(algParts[1]); + verifier.write(blob); + return (verifier.verify(sig.signature)); +} + +function Local(i) { + return (asn1.Ber.Context | asn1.Ber.Constructor | i); +} + +function Context(i) { + return (asn1.Ber.Context | i); +} + +var SIGN_ALGS = { + 'rsa-md5': '1.2.840.113549.1.1.4', + 'rsa-sha1': '1.2.840.113549.1.1.5', + 'rsa-sha256': '1.2.840.113549.1.1.11', + 'rsa-sha384': '1.2.840.113549.1.1.12', + 'rsa-sha512': '1.2.840.113549.1.1.13', + 'dsa-sha1': '1.2.840.10040.4.3', + 'dsa-sha256': '2.16.840.1.101.3.4.3.2', + 'ecdsa-sha1': '1.2.840.10045.4.1', + 'ecdsa-sha256': '1.2.840.10045.4.3.2', + 'ecdsa-sha384': '1.2.840.10045.4.3.3', + 'ecdsa-sha512': '1.2.840.10045.4.3.4', + 'ed25519-sha512': '1.3.101.112' +}; +Object.keys(SIGN_ALGS).forEach(function (k) { + SIGN_ALGS[SIGN_ALGS[k]] = k; +}); +SIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5'; +SIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1'; + +var EXTS = { + 'issuerKeyId': '2.5.29.35', + 'altName': '2.5.29.17', + 'basicConstraints': '2.5.29.19', + 'keyUsage': '2.5.29.15', + 'extKeyUsage': '2.5.29.37' +}; + +function read(buf, options) { + if (typeof (buf) === 'string') { + buf = Buffer.from(buf, 'binary'); + } + assert.buffer(buf, 'buf'); + + var der = new asn1.BerReader(buf); + + der.readSequence(); + if (Math.abs(der.length - der.remain) > 1) { + throw (new Error('DER sequence does not contain whole byte ' + + 'stream')); + } + + var tbsStart = der.offset; + der.readSequence(); + var sigOffset = der.offset + der.length; + var tbsEnd = sigOffset; + + if (der.peek() === Local(0)) { + der.readSequence(Local(0)); + var version = der.readInt(); + assert.ok(version <= 3, + 'only x.509 versions up to v3 supported'); + } + + var cert = {}; + cert.signatures = {}; + var sig = (cert.signatures.x509 = {}); + sig.extras = {}; + + cert.serial = readMPInt(der, 'serial'); + + der.readSequence(); + var after = der.offset + der.length; + var certAlgOid = der.readOID(); + var certAlg = SIGN_ALGS[certAlgOid]; + if (certAlg === undefined) + throw (new Error('unknown signature algorithm ' + certAlgOid)); + + der._offset = after; + cert.issuer = Identity.parseAsn1(der); + + der.readSequence(); + cert.validFrom = readDate(der); + cert.validUntil = readDate(der); + + cert.subjects = [Identity.parseAsn1(der)]; + + der.readSequence(); + after = der.offset + der.length; + cert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der); + der._offset = after; + + /* issuerUniqueID */ + if (der.peek() === Local(1)) { + der.readSequence(Local(1)); + sig.extras.issuerUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* subjectUniqueID */ + if (der.peek() === Local(2)) { + der.readSequence(Local(2)); + sig.extras.subjectUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* extensions */ + if (der.peek() === Local(3)) { + der.readSequence(Local(3)); + var extEnd = der.offset + der.length; + der.readSequence(); + + while (der.offset < extEnd) + readExtension(cert, buf, der); + + assert.strictEqual(der.offset, extEnd); + } + + assert.strictEqual(der.offset, sigOffset); + + der.readSequence(); + after = der.offset + der.length; + var sigAlgOid = der.readOID(); + var sigAlg = SIGN_ALGS[sigAlgOid]; + if (sigAlg === undefined) + throw (new Error('unknown signature algorithm ' + sigAlgOid)); + der._offset = after; + + var sigData = der.readString(asn1.Ber.BitString, true); + if (sigData[0] === 0) + sigData = sigData.slice(1); + var algParts = sigAlg.split('-'); + + sig.signature = Signature.parse(sigData, algParts[0], 'asn1'); + sig.signature.hashAlgorithm = algParts[1]; + sig.algo = sigAlg; + sig.cache = buf.slice(tbsStart, tbsEnd); + + return (new Certificate(cert)); +} + +function readDate(der) { + if (der.peek() === asn1.Ber.UTCTime) { + return (utcTimeToDate(der.readString(asn1.Ber.UTCTime))); + } else if (der.peek() === asn1.Ber.GeneralizedTime) { + return (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime))); + } else { + throw (new Error('Unsupported date format')); + } +} + +function writeDate(der, date) { + if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) { + der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime); + } else { + der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime); + } +} + +/* RFC5280, section 4.2.1.6 (GeneralName type) */ +var ALTNAME = { + OtherName: Local(0), + RFC822Name: Context(1), + DNSName: Context(2), + X400Address: Local(3), + DirectoryName: Local(4), + EDIPartyName: Local(5), + URI: Context(6), + IPAddress: Context(7), + OID: Context(8) +}; + +/* RFC5280, section 4.2.1.12 (KeyPurposeId) */ +var EXTPURPOSE = { + 'serverAuth': '1.3.6.1.5.5.7.3.1', + 'clientAuth': '1.3.6.1.5.5.7.3.2', + 'codeSigning': '1.3.6.1.5.5.7.3.3', + + /* See https://github.com/joyent/oid-docs/blob/master/root.md */ + 'joyentDocker': '1.3.6.1.4.1.38678.1.4.1', + 'joyentCmon': '1.3.6.1.4.1.38678.1.4.2' +}; +var EXTPURPOSE_REV = {}; +Object.keys(EXTPURPOSE).forEach(function (k) { + EXTPURPOSE_REV[EXTPURPOSE[k]] = k; +}); + +var KEYUSEBITS = [ + 'signature', 'identity', 'keyEncryption', + 'encryption', 'keyAgreement', 'ca', 'crl' +]; + +function readExtension(cert, buf, der) { + der.readSequence(); + var after = der.offset + der.length; + var extId = der.readOID(); + var id; + var sig = cert.signatures.x509; + if (!sig.extras.exts) + sig.extras.exts = []; + + var critical; + if (der.peek() === asn1.Ber.Boolean) + critical = der.readBoolean(); + + switch (extId) { + case (EXTS.basicConstraints): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var bcEnd = der.offset + der.length; + var ca = false; + if (der.peek() === asn1.Ber.Boolean) + ca = der.readBoolean(); + if (cert.purposes === undefined) + cert.purposes = []; + if (ca === true) + cert.purposes.push('ca'); + var bc = { oid: extId, critical: critical }; + if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer) + bc.pathLen = der.readInt(); + sig.extras.exts.push(bc); + break; + case (EXTS.extKeyUsage): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + if (cert.purposes === undefined) + cert.purposes = []; + var ekEnd = der.offset + der.length; + while (der.offset < ekEnd) { + var oid = der.readOID(); + cert.purposes.push(EXTPURPOSE_REV[oid] || oid); + } + /* + * This is a bit of a hack: in the case where we have a cert + * that's only allowed to do serverAuth or clientAuth (and not + * the other), we want to make sure all our Subjects are of + * the right type. But we already parsed our Subjects and + * decided if they were hosts or users earlier (since it appears + * first in the cert). + * + * So we go through and mutate them into the right kind here if + * it doesn't match. This might not be hugely beneficial, as it + * seems that single-purpose certs are not often seen in the + * wild. + */ + if (cert.purposes.indexOf('serverAuth') !== -1 && + cert.purposes.indexOf('clientAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'host') { + ide.type = 'host'; + ide.hostname = ide.uid || + ide.email || + ide.components[0].value; + } + }); + } else if (cert.purposes.indexOf('clientAuth') !== -1 && + cert.purposes.indexOf('serverAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'user') { + ide.type = 'user'; + ide.uid = ide.hostname || + ide.email || + ide.components[0].value; + } + }); + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + case (EXTS.keyUsage): + der.readSequence(asn1.Ber.OctetString); + var bits = der.readString(asn1.Ber.BitString, true); + var setBits = readBitField(bits, KEYUSEBITS); + setBits.forEach(function (bit) { + if (cert.purposes === undefined) + cert.purposes = []; + if (cert.purposes.indexOf(bit) === -1) + cert.purposes.push(bit); + }); + sig.extras.exts.push({ oid: extId, critical: critical, + bits: bits }); + break; + case (EXTS.altName): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var aeEnd = der.offset + der.length; + while (der.offset < aeEnd) { + switch (der.peek()) { + case ALTNAME.OtherName: + case ALTNAME.EDIPartyName: + der.readSequence(); + der._offset += der.length; + break; + case ALTNAME.OID: + der.readOID(ALTNAME.OID); + break; + case ALTNAME.RFC822Name: + /* RFC822 specifies email addresses */ + var email = der.readString(ALTNAME.RFC822Name); + id = Identity.forEmail(email); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DirectoryName: + der.readSequence(ALTNAME.DirectoryName); + id = Identity.parseAsn1(der); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DNSName: + var host = der.readString( + ALTNAME.DNSName); + id = Identity.forHost(host); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + default: + der.readString(der.peek()); + break; + } + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + default: + sig.extras.exts.push({ + oid: extId, + critical: critical, + data: der.readString(asn1.Ber.OctetString, true) + }); + break; + } + + der._offset = after; +} + +var UTCTIME_RE = + /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function utcTimeToDate(t) { + var m = t.match(UTCTIME_RE); + assert.ok(m, 'timestamps must be in UTC'); + var d = new Date(); + + var thisYear = d.getUTCFullYear(); + var century = Math.floor(thisYear / 100) * 100; + + var year = parseInt(m[1], 10); + if (thisYear % 100 < 50 && year >= 60) + year += (century - 1); + else + year += century; + d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +var GTIME_RE = + /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function gTimeToDate(t) { + var m = t.match(GTIME_RE); + assert.ok(m); + var d = new Date(); + + d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, + parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +function zeroPad(n, m) { + if (m === undefined) + m = 2; + var s = '' + n; + while (s.length < m) + s = '0' + s; + return (s); +} + +function dateToUTCTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear() % 100); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function dateToGTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear(), 4); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function sign(cert, key) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + sig.algo = key.type + '-' + key.defaultHashAlgorithm(); + if (SIGN_ALGS[sig.algo] === undefined) + return (false); + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + var signer = key.createSign(); + signer.write(blob); + cert.signatures.x509.signature = signer.sign(); + + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + sig.algo = signature.type + '-' + signature.hashAlgorithm; + if (SIGN_ALGS[sig.algo] === undefined) { + done(new Error('Invalid signing algorithm "' + + sig.algo + '"')); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var der = new asn1.BerWriter(); + der.startSequence(); + if (sig.cache) { + der._ensure(sig.cache.length); + sig.cache.copy(der._buf, der._offset); + der._offset += sig.cache.length; + } else { + writeTBSCert(cert, der); + } + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + var sigData = sig.signature.toBuffer('asn1'); + var data = Buffer.alloc(sigData.length + 1); + data[0] = 0; + sigData.copy(data, 1); + der.writeBuffer(data, asn1.Ber.BitString); + der.endSequence(); + + return (der.buffer); +} + +function writeTBSCert(cert, der) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + der.startSequence(); + + der.startSequence(Local(0)); + der.writeInt(2); + der.endSequence(); + + der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer); + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + cert.issuer.toAsn1(der); + + der.startSequence(); + writeDate(der, cert.validFrom); + writeDate(der, cert.validUntil); + der.endSequence(); + + var subject = cert.subjects[0]; + var altNames = cert.subjects.slice(1); + subject.toAsn1(der); + + pkcs8.writePkcs8(der, cert.subjectKey); + + if (sig.extras && sig.extras.issuerUniqueID) { + der.writeBuffer(sig.extras.issuerUniqueID, Local(1)); + } + + if (sig.extras && sig.extras.subjectUniqueID) { + der.writeBuffer(sig.extras.subjectUniqueID, Local(2)); + } + + if (altNames.length > 0 || subject.type === 'host' || + (cert.purposes !== undefined && cert.purposes.length > 0) || + (sig.extras && sig.extras.exts)) { + der.startSequence(Local(3)); + der.startSequence(); + + var exts = []; + if (cert.purposes !== undefined && cert.purposes.length > 0) { + exts.push({ + oid: EXTS.basicConstraints, + critical: true + }); + exts.push({ + oid: EXTS.keyUsage, + critical: true + }); + exts.push({ + oid: EXTS.extKeyUsage, + critical: true + }); + } + exts.push({ oid: EXTS.altName }); + if (sig.extras && sig.extras.exts) + exts = sig.extras.exts; + + for (var i = 0; i < exts.length; ++i) { + der.startSequence(); + der.writeOID(exts[i].oid); + + if (exts[i].critical !== undefined) + der.writeBoolean(exts[i].critical); + + if (exts[i].oid === EXTS.altName) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + if (subject.type === 'host') { + der.writeString(subject.hostname, + Context(2)); + } + for (var j = 0; j < altNames.length; ++j) { + if (altNames[j].type === 'host') { + der.writeString( + altNames[j].hostname, + ALTNAME.DNSName); + } else if (altNames[j].type === + 'email') { + der.writeString( + altNames[j].email, + ALTNAME.RFC822Name); + } else { + /* + * Encode anything else as a + * DN style name for now. + */ + der.startSequence( + ALTNAME.DirectoryName); + altNames[j].toAsn1(der); + der.endSequence(); + } + } + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.basicConstraints) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + var ca = (cert.purposes.indexOf('ca') !== -1); + var pathLen = exts[i].pathLen; + der.writeBoolean(ca); + if (pathLen !== undefined) + der.writeInt(pathLen); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.extKeyUsage) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + cert.purposes.forEach(function (purpose) { + if (purpose === 'ca') + return; + if (KEYUSEBITS.indexOf(purpose) !== -1) + return; + var oid = purpose; + if (EXTPURPOSE[purpose] !== undefined) + oid = EXTPURPOSE[purpose]; + der.writeOID(oid); + }); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.keyUsage) { + der.startSequence(asn1.Ber.OctetString); + /* + * If we parsed this certificate from a byte + * stream (i.e. we didn't generate it in sshpk) + * then we'll have a ".bits" property on the + * ext with the original raw byte contents. + * + * If we have this, use it here instead of + * regenerating it. This guarantees we output + * the same data we parsed, so signatures still + * validate. + */ + if (exts[i].bits !== undefined) { + der.writeBuffer(exts[i].bits, + asn1.Ber.BitString); + } else { + var bits = writeBitField(cert.purposes, + KEYUSEBITS); + der.writeBuffer(bits, + asn1.Ber.BitString); + } + der.endSequence(); + } else { + der.writeBuffer(exts[i].data, + asn1.Ber.OctetString); + } + + der.endSequence(); + } + + der.endSequence(); + der.endSequence(); + } + + der.endSequence(); +} + +/* + * Reads an ASN.1 BER bitfield out of the Buffer produced by doing + * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw + * contents of the BitString tag, which is a count of unused bits followed by + * the bits as a right-padded byte string. + * + * `bits` is the Buffer, `bitIndex` should contain an array of string names + * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec. + * + * Returns an array of Strings, the names of the bits that were set to 1. + */ +function readBitField(bits, bitIndex) { + var bitLen = 8 * (bits.length - 1) - bits[0]; + var setBits = {}; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var bitVal = ((bits[byteN] & mask) !== 0); + var name = bitIndex[i]; + if (bitVal && typeof (name) === 'string') { + setBits[name] = true; + } + } + return (Object.keys(setBits)); +} + +/* + * `setBits` is an array of strings, containing the names for each bit that + * sould be set to 1. `bitIndex` is same as in `readBitField()`. + * + * Returns a Buffer, ready to be written out with `BerWriter#writeString()`. + */ +function writeBitField(setBits, bitIndex) { + var bitLen = bitIndex.length; + var blen = Math.ceil(bitLen / 8); + var unused = blen * 8 - bitLen; + var bits = Buffer.alloc(1 + blen); // zero-filled + bits[0] = unused; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var name = bitIndex[i]; + if (name === undefined) + continue; + var bitVal = (setBits.indexOf(name) !== -1); + if (bitVal) { + bits[byteN] |= mask; + } + } + return (bits); +} diff --git a/node_modules/sshpk/lib/identity.js b/node_modules/sshpk/lib/identity.js new file mode 100644 index 00000000..7d75b667 --- /dev/null +++ b/node_modules/sshpk/lib/identity.js @@ -0,0 +1,373 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = Identity; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; + +/*JSSTYLED*/ +var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i; + +var oids = {}; +oids.cn = '2.5.4.3'; +oids.o = '2.5.4.10'; +oids.ou = '2.5.4.11'; +oids.l = '2.5.4.7'; +oids.s = '2.5.4.8'; +oids.c = '2.5.4.6'; +oids.sn = '2.5.4.4'; +oids.postalCode = '2.5.4.17'; +oids.serialNumber = '2.5.4.5'; +oids.street = '2.5.4.9'; +oids.x500UniqueIdentifier = '2.5.4.45'; +oids.role = '2.5.4.72'; +oids.telephoneNumber = '2.5.4.20'; +oids.description = '2.5.4.13'; +oids.dc = '0.9.2342.19200300.100.1.25'; +oids.uid = '0.9.2342.19200300.100.1.1'; +oids.mail = '0.9.2342.19200300.100.1.3'; +oids.title = '2.5.4.12'; +oids.gn = '2.5.4.42'; +oids.initials = '2.5.4.43'; +oids.pseudonym = '2.5.4.65'; +oids.emailAddress = '1.2.840.113549.1.9.1'; + +var unoids = {}; +Object.keys(oids).forEach(function (k) { + unoids[oids[k]] = k; +}); + +function Identity(opts) { + var self = this; + assert.object(opts, 'options'); + assert.arrayOfObject(opts.components, 'options.components'); + this.components = opts.components; + this.componentLookup = {}; + this.components.forEach(function (c) { + if (c.name && !c.oid) + c.oid = oids[c.name]; + if (c.oid && !c.name) + c.name = unoids[c.oid]; + if (self.componentLookup[c.name] === undefined) + self.componentLookup[c.name] = []; + self.componentLookup[c.name].push(c); + }); + if (this.componentLookup.cn && this.componentLookup.cn.length > 0) { + this.cn = this.componentLookup.cn[0].value; + } + assert.optionalString(opts.type, 'options.type'); + if (opts.type === undefined) { + if (this.components.length === 1 && + this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.dc && + this.components.length === this.componentLookup.dc.length) { + this.type = 'host'; + this.hostname = this.componentLookup.dc.map( + function (c) { + return (c.value); + }).join('.'); + + } else if (this.componentLookup.uid && + this.components.length === + this.componentLookup.uid.length) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.uid && + this.componentLookup.uid.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.mail && + this.componentLookup.mail.length === 1) { + this.type = 'email'; + this.email = this.componentLookup.mail[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.cn[0].value; + + } else { + this.type = 'unknown'; + } + } else { + this.type = opts.type; + if (this.type === 'host') + this.hostname = opts.hostname; + else if (this.type === 'user') + this.uid = opts.uid; + else if (this.type === 'email') + this.email = opts.email; + else + throw (new Error('Unknown type ' + this.type)); + } +} + +Identity.prototype.toString = function () { + return (this.components.map(function (c) { + var n = c.name.toUpperCase(); + /*JSSTYLED*/ + n = n.replace(/=/g, '\\='); + var v = c.value; + /*JSSTYLED*/ + v = v.replace(/,/g, '\\,'); + return (n + '=' + v); + }).join(', ')); +}; + +Identity.prototype.get = function (name, asArray) { + assert.string(name, 'name'); + var arr = this.componentLookup[name]; + if (arr === undefined || arr.length === 0) + return (undefined); + if (!asArray && arr.length > 1) + throw (new Error('Multiple values for attribute ' + name)); + if (!asArray) + return (arr[0].value); + return (arr.map(function (c) { + return (c.value); + })); +}; + +Identity.prototype.toArray = function (idx) { + return (this.components.map(function (c) { + return ({ + name: c.name, + value: c.value + }); + })); +}; + +/* + * These are from X.680 -- PrintableString allowed chars are in section 37.4 + * table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to + * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006 + * (the basic ASCII character set). + */ +/* JSSTYLED */ +var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/; +/* JSSTYLED */ +var NOT_IA5 = /[^\x00-\x7f]/; + +Identity.prototype.toAsn1 = function (der, tag) { + der.startSequence(tag); + this.components.forEach(function (c) { + der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set); + der.startSequence(); + der.writeOID(c.oid); + /* + * If we fit in a PrintableString, use that. Otherwise use an + * IA5String or UTF8String. + * + * If this identity was parsed from a DN, use the ASN.1 types + * from the original representation (otherwise this might not + * be a full match for the original in some validators). + */ + if (c.asn1type === asn1.Ber.Utf8String || + c.value.match(NOT_IA5)) { + var v = Buffer.from(c.value, 'utf8'); + der.writeBuffer(v, asn1.Ber.Utf8String); + + } else if (c.asn1type === asn1.Ber.IA5String || + c.value.match(NOT_PRINTABLE)) { + der.writeString(c.value, asn1.Ber.IA5String); + + } else { + var type = asn1.Ber.PrintableString; + if (c.asn1type !== undefined) + type = c.asn1type; + der.writeString(c.value, type); + } + der.endSequence(); + der.endSequence(); + }); + der.endSequence(); +}; + +function globMatch(a, b) { + if (a === '**' || b === '**') + return (true); + var aParts = a.split('.'); + var bParts = b.split('.'); + if (aParts.length !== bParts.length) + return (false); + for (var i = 0; i < aParts.length; ++i) { + if (aParts[i] === '*' || bParts[i] === '*') + continue; + if (aParts[i] !== bParts[i]) + return (false); + } + return (true); +} + +Identity.prototype.equals = function (other) { + if (!Identity.isIdentity(other, [1, 0])) + return (false); + if (other.components.length !== this.components.length) + return (false); + for (var i = 0; i < this.components.length; ++i) { + if (this.components[i].oid !== other.components[i].oid) + return (false); + if (!globMatch(this.components[i].value, + other.components[i].value)) { + return (false); + } + } + return (true); +}; + +Identity.forHost = function (hostname) { + assert.string(hostname, 'hostname'); + return (new Identity({ + type: 'host', + hostname: hostname, + components: [ { name: 'cn', value: hostname } ] + })); +}; + +Identity.forUser = function (uid) { + assert.string(uid, 'uid'); + return (new Identity({ + type: 'user', + uid: uid, + components: [ { name: 'uid', value: uid } ] + })); +}; + +Identity.forEmail = function (email) { + assert.string(email, 'email'); + return (new Identity({ + type: 'email', + email: email, + components: [ { name: 'mail', value: email } ] + })); +}; + +Identity.parseDN = function (dn) { + assert.string(dn, 'dn'); + var parts = ['']; + var idx = 0; + var rem = dn; + while (rem.length > 0) { + var m; + /*JSSTYLED*/ + if ((m = /^,/.exec(rem)) !== null) { + parts[++idx] = ''; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\,/.exec(rem)) !== null) { + parts[idx] += ','; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\./.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^[^\\,]+/.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + } else { + throw (new Error('Failed to parse DN')); + } + } + var cmps = parts.map(function (c) { + c = c.trim(); + var eqPos = c.indexOf('='); + while (eqPos > 0 && c.charAt(eqPos - 1) === '\\') + eqPos = c.indexOf('=', eqPos + 1); + if (eqPos === -1) { + throw (new Error('Failed to parse DN')); + } + /*JSSTYLED*/ + var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '='); + var value = c.slice(eqPos + 1); + return ({ name: name, value: value }); + }); + return (new Identity({ components: cmps })); +}; + +Identity.fromArray = function (components) { + assert.arrayOfObject(components, 'components'); + components.forEach(function (cmp) { + assert.object(cmp, 'component'); + assert.string(cmp.name, 'component.name'); + if (!Buffer.isBuffer(cmp.value) && + !(typeof (cmp.value) === 'string')) { + throw (new Error('Invalid component value')); + } + }); + return (new Identity({ components: components })); +}; + +Identity.parseAsn1 = function (der, top) { + var components = []; + der.readSequence(top); + var end = der.offset + der.length; + while (der.offset < end) { + der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set); + var after = der.offset + der.length; + der.readSequence(); + var oid = der.readOID(); + var type = der.peek(); + var value; + switch (type) { + case asn1.Ber.PrintableString: + case asn1.Ber.IA5String: + case asn1.Ber.OctetString: + case asn1.Ber.T61String: + value = der.readString(type); + break; + case asn1.Ber.Utf8String: + value = der.readString(type, true); + value = value.toString('utf8'); + break; + case asn1.Ber.CharacterString: + case asn1.Ber.BMPString: + value = der.readString(type, true); + value = value.toString('utf16le'); + break; + default: + throw (new Error('Unknown asn1 type ' + type)); + } + components.push({ oid: oid, asn1type: type, value: value }); + der._offset = after; + } + der._offset = end; + return (new Identity({ + components: components + })); +}; + +Identity.isIdentity = function (obj, ver) { + return (utils.isCompatible(obj, Identity, ver)); +}; + +/* + * API versions for Identity: + * [1,0] -- initial ver + */ +Identity.prototype._sshpkApiVersion = [1, 0]; + +Identity._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/index.js b/node_modules/sshpk/lib/index.js new file mode 100644 index 00000000..f76db791 --- /dev/null +++ b/node_modules/sshpk/lib/index.js @@ -0,0 +1,40 @@ +// Copyright 2015 Joyent, Inc. + +var Key = require('./key'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var Identity = require('./identity'); +var errs = require('./errors'); + +module.exports = { + /* top-level classes */ + Key: Key, + parseKey: Key.parse, + Fingerprint: Fingerprint, + parseFingerprint: Fingerprint.parse, + Signature: Signature, + parseSignature: Signature.parse, + PrivateKey: PrivateKey, + parsePrivateKey: PrivateKey.parse, + generatePrivateKey: PrivateKey.generate, + Certificate: Certificate, + parseCertificate: Certificate.parse, + createSelfSignedCertificate: Certificate.createSelfSigned, + createCertificate: Certificate.create, + Identity: Identity, + identityFromDN: Identity.parseDN, + identityForHost: Identity.forHost, + identityForUser: Identity.forUser, + identityForEmail: Identity.forEmail, + identityFromArray: Identity.fromArray, + + /* errors */ + FingerprintFormatError: errs.FingerprintFormatError, + InvalidAlgorithmError: errs.InvalidAlgorithmError, + KeyParseError: errs.KeyParseError, + SignatureParseError: errs.SignatureParseError, + KeyEncryptedError: errs.KeyEncryptedError, + CertificateParseError: errs.CertificateParseError +}; diff --git a/node_modules/sshpk/lib/key.js b/node_modules/sshpk/lib/key.js new file mode 100644 index 00000000..706f8340 --- /dev/null +++ b/node_modules/sshpk/lib/key.js @@ -0,0 +1,294 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Key; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var DiffieHellman = require('./dhe').DiffieHellman; +var errs = require('./errors'); +var utils = require('./utils'); +var PrivateKey = require('./private-key'); +var edCompat; + +try { + edCompat = require('./ed-compat'); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh'] = require('./formats/ssh'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); +formats['putty'] = require('./formats/putty'); +formats['ppk'] = formats['putty']; + +function Key(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + assert.optionalString(opts.comment, 'options.comment'); + + var algInfo = algs.info[opts.type]; + if (typeof (algInfo) !== 'object') + throw (new InvalidAlgorithmError(opts.type)); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.parts = opts.parts; + this.part = partLookup; + this.comment = undefined; + this.source = opts.source; + + /* for speeding up hashing/fingerprint operations */ + this._rfc4253Cache = opts._rfc4253Cache; + this._hashCache = {}; + + var sz; + this.curve = undefined; + if (this.type === 'ecdsa') { + var curve = this.part.curve.data.toString(); + this.curve = curve; + sz = algs.curves[curve].size; + } else if (this.type === 'ed25519' || this.type === 'curve25519') { + sz = 256; + this.curve = 'curve25519'; + } else { + var szPart = this.part[algInfo.sizePart]; + sz = szPart.data.length; + sz = sz * 8 - utils.countZeros(szPart.data); + } + this.size = sz; +} + +Key.formats = formats; + +Key.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'ssh'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + if (format === 'rfc4253') { + if (this._rfc4253Cache === undefined) + this._rfc4253Cache = formats['rfc4253'].write(this); + return (this._rfc4253Cache); + } + + return (formats[format].write(this, options)); +}; + +Key.prototype.toString = function (format, options) { + return (this.toBuffer(format, options).toString()); +}; + +Key.prototype.hash = function (algo, type) { + assert.string(algo, 'algorithm'); + assert.optionalString(type, 'type'); + if (type === undefined) + type = 'ssh'; + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + var cacheKey = algo + '||' + type; + if (this._hashCache[cacheKey]) + return (this._hashCache[cacheKey]); + + var buf; + if (type === 'ssh') { + buf = this.toBuffer('rfc4253'); + } else if (type === 'spki') { + buf = formats.pkcs8.pkcs8ToBuffer(this); + } else { + throw (new Error('Hash type ' + type + ' not supported')); + } + var hash = crypto.createHash(algo).update(buf).digest(); + this._hashCache[cacheKey] = hash; + return (hash); +}; + +Key.prototype.fingerprint = function (algo, type) { + if (algo === undefined) + algo = 'sha256'; + if (type === undefined) + type = 'ssh'; + assert.string(algo, 'algorithm'); + assert.string(type, 'type'); + var opts = { + type: 'key', + hash: this.hash(algo, type), + algorithm: algo, + hashType: type + }; + return (new Fingerprint(opts)); +}; + +Key.prototype.defaultHashAlgorithm = function () { + var hashAlgo = 'sha1'; + if (this.type === 'rsa') + hashAlgo = 'sha256'; + if (this.type === 'dsa' && this.size > 1024) + hashAlgo = 'sha256'; + if (this.type === 'ed25519') + hashAlgo = 'sha512'; + if (this.type === 'ecdsa') { + if (this.size <= 256) + hashAlgo = 'sha256'; + else if (this.size <= 384) + hashAlgo = 'sha384'; + else + hashAlgo = 'sha512'; + } + return (hashAlgo); +}; + +Key.prototype.createVerify = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Verifier(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldVerify = v.verify.bind(v); + var key = this.toBuffer('pkcs8'); + var curve = this.curve; + var self = this; + v.verify = function (signature, fmt) { + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== self.type) + return (false); + if (signature.hashAlgorithm && + signature.hashAlgorithm !== hashAlgo) + return (false); + if (signature.curve && self.type === 'ecdsa' && + signature.curve !== curve) + return (false); + return (oldVerify(key, signature.toBuffer('asn1'))); + + } else if (typeof (signature) === 'string' || + Buffer.isBuffer(signature)) { + return (oldVerify(key, signature, fmt)); + + /* + * Avoid doing this on valid arguments, walking the prototype + * chain can be quite slow. + */ + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + + } else { + throw (new TypeError('signature must be a string, ' + + 'Buffer, or Signature object')); + } + }; + return (v); +}; + +Key.prototype.createDiffieHellman = function () { + if (this.type === 'rsa') + throw (new Error('RSA keys do not support Diffie-Hellman')); + + return (new DiffieHellman(this)); +}; +Key.prototype.createDH = Key.prototype.createDiffieHellman; + +Key.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + if (k instanceof PrivateKey) + k = k.toPublic(); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +Key.isKey = function (obj, ver) { + return (utils.isCompatible(obj, Key, ver)); +}; + +/* + * API versions for Key: + * [1,0] -- initial ver, may take Signature for createVerify or may not + * [1,1] -- added pkcs1, pkcs8 formats + * [1,2] -- added auto, ssh-private, openssh formats + * [1,3] -- added defaultHashAlgorithm + * [1,4] -- added ed support, createDH + * [1,5] -- first explicitly tagged version + * [1,6] -- changed ed25519 part names + * [1,7] -- spki hash types + */ +Key.prototype._sshpkApiVersion = [1, 7]; + +Key._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + assert.func(obj.fingerprint); + if (obj.createDH) + return ([1, 4]); + if (obj.defaultHashAlgorithm) + return ([1, 3]); + if (obj.formats['auto']) + return ([1, 2]); + if (obj.formats['pkcs1']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/private-key.js b/node_modules/sshpk/lib/private-key.js new file mode 100644 index 00000000..570e0543 --- /dev/null +++ b/node_modules/sshpk/lib/private-key.js @@ -0,0 +1,247 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = PrivateKey; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var dhe = require('./dhe'); +var generateECDSA = dhe.generateECDSA; +var generateED25519 = dhe.generateED25519; +var edCompat = require('./ed-compat'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; +var KeyEncryptedError = errs.KeyEncryptedError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['ssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); +formats['putty'] = require('./formats/putty'); + +function PrivateKey(opts) { + assert.object(opts, 'options'); + Key.call(this, opts); + + this._pubCache = undefined; +} +util.inherits(PrivateKey, Key); + +PrivateKey.formats = formats; + +PrivateKey.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'pkcs1'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +PrivateKey.prototype.hash = function (algo, type) { + return (this.toPublic().hash(algo, type)); +}; + +PrivateKey.prototype.fingerprint = function (algo, type) { + return (this.toPublic().fingerprint(algo, type)); +}; + +PrivateKey.prototype.toPublic = function () { + if (this._pubCache) + return (this._pubCache); + + var algInfo = algs.info[this.type]; + var pubParts = []; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = algInfo.parts[i]; + pubParts.push(this.part[p]); + } + + this._pubCache = new Key({ + type: this.type, + source: this, + parts: pubParts + }); + if (this.comment) + this._pubCache.comment = this.comment; + return (this._pubCache); +}; + +PrivateKey.prototype.derive = function (newType) { + assert.string(newType, 'type'); + var priv, pub, pair; + + if (this.type === 'ed25519' && newType === 'curve25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'curve25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } else if (this.type === 'curve25519' && newType === 'ed25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'ed25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } + throw (new Error('Key derivation not supported from ' + this.type + + ' to ' + newType)); +}; + +PrivateKey.prototype.createVerify = function (hashAlgo) { + return (this.toPublic().createVerify(hashAlgo)); +}; + +PrivateKey.prototype.createSign = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Signer(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldSign = v.sign.bind(v); + var key = this.toBuffer('pkcs1'); + var type = this.type; + var curve = this.curve; + v.sign = function () { + var sig = oldSign(key); + if (typeof (sig) === 'string') + sig = Buffer.from(sig, 'binary'); + sig = Signature.parse(sig, type, 'asn1'); + sig.hashAlgorithm = hashAlgo; + sig.curve = curve; + return (sig); + }; + return (v); +}; + +PrivateKey.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + assert.ok(k instanceof PrivateKey, 'key is not a private key'); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +PrivateKey.isPrivateKey = function (obj, ver) { + return (utils.isCompatible(obj, PrivateKey, ver)); +}; + +PrivateKey.generate = function (type, options) { + if (options === undefined) + options = {}; + assert.object(options, 'options'); + + switch (type) { + case 'ecdsa': + if (options.curve === undefined) + options.curve = 'nistp256'; + assert.string(options.curve, 'options.curve'); + return (generateECDSA(options.curve)); + case 'ed25519': + return (generateED25519()); + default: + throw (new Error('Key generation not supported with key ' + + 'type "' + type + '"')); + } +}; + +/* + * API versions for PrivateKey: + * [1,0] -- initial ver + * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats + * [1,2] -- added defaultHashAlgorithm + * [1,3] -- added derive, ed, createDH + * [1,4] -- first tagged version + * [1,5] -- changed ed25519 part names and format + * [1,6] -- type arguments for hash() and fingerprint() + */ +PrivateKey.prototype._sshpkApiVersion = [1, 6]; + +PrivateKey._oldVersionDetect = function (obj) { + assert.func(obj.toPublic); + assert.func(obj.createSign); + if (obj.derive) + return ([1, 3]); + if (obj.defaultHashAlgorithm) + return ([1, 2]); + if (obj.formats['auto']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/signature.js b/node_modules/sshpk/lib/signature.js new file mode 100644 index 00000000..aa8fdbb8 --- /dev/null +++ b/node_modules/sshpk/lib/signature.js @@ -0,0 +1,314 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = Signature; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var SSHBuffer = require('./ssh-buffer'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var SignatureParseError = errs.SignatureParseError; + +function Signature(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.hashAlgorithm = opts.hashAlgo; + this.curve = opts.curve; + this.parts = opts.parts; + this.part = partLookup; +} + +Signature.prototype.toBuffer = function (format) { + if (format === undefined) + format = 'asn1'; + assert.string(format, 'format'); + + var buf; + var stype = 'ssh-' + this.type; + + switch (this.type) { + case 'rsa': + switch (this.hashAlgorithm) { + case 'sha256': + stype = 'rsa-sha2-256'; + break; + case 'sha512': + stype = 'rsa-sha2-512'; + break; + case 'sha1': + case undefined: + break; + default: + throw (new Error('SSH signature ' + + 'format does not support hash ' + + 'algorithm ' + this.hashAlgorithm)); + } + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'ed25519': + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'dsa': + case 'ecdsa': + var r, s; + if (format === 'asn1') { + var der = new asn1.BerWriter(); + der.startSequence(); + r = utils.mpNormalize(this.part.r.data); + s = utils.mpNormalize(this.part.s.data); + der.writeBuffer(r, asn1.Ber.Integer); + der.writeBuffer(s, asn1.Ber.Integer); + der.endSequence(); + return (der.buffer); + } else if (format === 'ssh' && this.type === 'dsa') { + buf = new SSHBuffer({}); + buf.writeString('ssh-dss'); + r = this.part.r.data; + if (r.length > 20 && r[0] === 0x00) + r = r.slice(1); + s = this.part.s.data; + if (s.length > 20 && s[0] === 0x00) + s = s.slice(1); + if ((this.hashAlgorithm && + this.hashAlgorithm !== 'sha1') || + r.length + s.length !== 40) { + throw (new Error('OpenSSH only supports ' + + 'DSA signatures with SHA1 hash')); + } + buf.writeBuffer(Buffer.concat([r, s])); + return (buf.toBuffer()); + } else if (format === 'ssh' && this.type === 'ecdsa') { + var inner = new SSHBuffer({}); + r = this.part.r.data; + inner.writeBuffer(r); + inner.writePart(this.part.s); + + buf = new SSHBuffer({}); + /* XXX: find a more proper way to do this? */ + var curve; + if (r[0] === 0x00) + r = r.slice(1); + var sz = r.length * 8; + if (sz === 256) + curve = 'nistp256'; + else if (sz === 384) + curve = 'nistp384'; + else if (sz === 528) + curve = 'nistp521'; + buf.writeString('ecdsa-sha2-' + curve); + buf.writeBuffer(inner.toBuffer()); + return (buf.toBuffer()); + } + throw (new Error('Invalid signature format')); + default: + throw (new Error('Invalid signature data')); + } +}; + +Signature.prototype.toString = function (format) { + assert.optionalString(format, 'format'); + return (this.toBuffer(format).toString('base64')); +}; + +Signature.parse = function (data, type, format) { + if (typeof (data) === 'string') + data = Buffer.from(data, 'base64'); + assert.buffer(data, 'data'); + assert.string(format, 'format'); + assert.string(type, 'type'); + + var opts = {}; + opts.type = type.toLowerCase(); + opts.parts = []; + + try { + assert.ok(data.length > 0, 'signature must not be empty'); + switch (opts.type) { + case 'rsa': + return (parseOneNum(data, type, format, opts)); + case 'ed25519': + return (parseOneNum(data, type, format, opts)); + + case 'dsa': + case 'ecdsa': + if (format === 'asn1') + return (parseDSAasn1(data, type, format, opts)); + else if (opts.type === 'dsa') + return (parseDSA(data, type, format, opts)); + else + return (parseECDSA(data, type, format, opts)); + + default: + throw (new InvalidAlgorithmError(type)); + } + + } catch (e) { + if (e instanceof InvalidAlgorithmError) + throw (e); + throw (new SignatureParseError(type, format, e)); + } +}; + +function parseOneNum(data, type, format, opts) { + if (format === 'ssh') { + try { + var buf = new SSHBuffer({buffer: data}); + var head = buf.readString(); + } catch (e) { + /* fall through */ + } + if (buf !== undefined) { + var msg = 'SSH signature does not match expected ' + + 'type (expected ' + type + ', got ' + head + ')'; + switch (head) { + case 'ssh-rsa': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha1'; + break; + case 'rsa-sha2-256': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha256'; + break; + case 'rsa-sha2-512': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha512'; + break; + case 'ssh-ed25519': + assert.strictEqual(type, 'ed25519', msg); + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unknown SSH signature ' + + 'type: ' + head)); + } + var sig = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + sig.name = 'sig'; + opts.parts.push(sig); + return (new Signature(opts)); + } + } + opts.parts.push({name: 'sig', data: data}); + return (new Signature(opts)); +} + +function parseDSAasn1(data, type, format, opts) { + var der = new asn1.BerReader(data); + der.readSequence(); + var r = der.readString(asn1.Ber.Integer, true); + var s = der.readString(asn1.Ber.Integer, true); + + opts.parts.push({name: 'r', data: utils.mpNormalize(r)}); + opts.parts.push({name: 's', data: utils.mpNormalize(s)}); + + return (new Signature(opts)); +} + +function parseDSA(data, type, format, opts) { + if (data.length != 40) { + var buf = new SSHBuffer({buffer: data}); + var d = buf.readBuffer(); + if (d.toString('ascii') === 'ssh-dss') + d = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + assert.strictEqual(d.length, 40, 'invalid inner length'); + data = d; + } + opts.parts.push({name: 'r', data: data.slice(0, 20)}); + opts.parts.push({name: 's', data: data.slice(20, 40)}); + return (new Signature(opts)); +} + +function parseECDSA(data, type, format, opts) { + var buf = new SSHBuffer({buffer: data}); + + var r, s; + var inner = buf.readBuffer(); + var stype = inner.toString('ascii'); + if (stype.slice(0, 6) === 'ecdsa-') { + var parts = stype.split('-'); + assert.strictEqual(parts[0], 'ecdsa'); + assert.strictEqual(parts[1], 'sha2'); + opts.curve = parts[2]; + switch (opts.curve) { + case 'nistp256': + opts.hashAlgo = 'sha256'; + break; + case 'nistp384': + opts.hashAlgo = 'sha384'; + break; + case 'nistp521': + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unsupported ECDSA curve: ' + + opts.curve)); + } + inner = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes on outer'); + buf = new SSHBuffer({buffer: inner}); + r = buf.readPart(); + } else { + r = {data: inner}; + } + + s = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + + r.name = 'r'; + s.name = 's'; + + opts.parts.push(r); + opts.parts.push(s); + return (new Signature(opts)); +} + +Signature.isSignature = function (obj, ver) { + return (utils.isCompatible(obj, Signature, ver)); +}; + +/* + * API versions for Signature: + * [1,0] -- initial ver + * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent + * hashAlgorithm property + * [2,1] -- first tagged version + */ +Signature.prototype._sshpkApiVersion = [2, 1]; + +Signature._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + if (obj.hasOwnProperty('hashAlgorithm')) + return ([2, 0]); + return ([1, 0]); +}; diff --git a/node_modules/sshpk/lib/ssh-buffer.js b/node_modules/sshpk/lib/ssh-buffer.js new file mode 100644 index 00000000..1dd286c8 --- /dev/null +++ b/node_modules/sshpk/lib/ssh-buffer.js @@ -0,0 +1,149 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = SSHBuffer; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; + +function SSHBuffer(opts) { + assert.object(opts, 'options'); + if (opts.buffer !== undefined) + assert.buffer(opts.buffer, 'options.buffer'); + + this._size = opts.buffer ? opts.buffer.length : 1024; + this._buffer = opts.buffer || Buffer.alloc(this._size); + this._offset = 0; +} + +SSHBuffer.prototype.toBuffer = function () { + return (this._buffer.slice(0, this._offset)); +}; + +SSHBuffer.prototype.atEnd = function () { + return (this._offset >= this._buffer.length); +}; + +SSHBuffer.prototype.remainder = function () { + return (this._buffer.slice(this._offset)); +}; + +SSHBuffer.prototype.skip = function (n) { + this._offset += n; +}; + +SSHBuffer.prototype.expand = function () { + this._size *= 2; + var buf = Buffer.alloc(this._size); + this._buffer.copy(buf, 0); + this._buffer = buf; +}; + +SSHBuffer.prototype.readPart = function () { + return ({data: this.readBuffer()}); +}; + +SSHBuffer.prototype.readBuffer = function () { + var len = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + assert.ok(this._offset + len <= this._buffer.length, + 'length out of bounds at +0x' + this._offset.toString(16) + + ' (data truncated?)'); + var buf = this._buffer.slice(this._offset, this._offset + len); + this._offset += len; + return (buf); +}; + +SSHBuffer.prototype.readString = function () { + return (this.readBuffer().toString()); +}; + +SSHBuffer.prototype.readCString = function () { + var offset = this._offset; + while (offset < this._buffer.length && + this._buffer[offset] !== 0x00) + offset++; + assert.ok(offset < this._buffer.length, 'c string does not terminate'); + var str = this._buffer.slice(this._offset, offset).toString(); + this._offset = offset + 1; + return (str); +}; + +SSHBuffer.prototype.readInt = function () { + var v = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + return (v); +}; + +SSHBuffer.prototype.readInt64 = function () { + assert.ok(this._offset + 8 < this._buffer.length, + 'buffer not long enough to read Int64'); + var v = this._buffer.slice(this._offset, this._offset + 8); + this._offset += 8; + return (v); +}; + +SSHBuffer.prototype.readChar = function () { + var v = this._buffer[this._offset++]; + return (v); +}; + +SSHBuffer.prototype.writeBuffer = function (buf) { + while (this._offset + 4 + buf.length > this._size) + this.expand(); + this._buffer.writeUInt32BE(buf.length, this._offset); + this._offset += 4; + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; + +SSHBuffer.prototype.writeString = function (str) { + this.writeBuffer(Buffer.from(str, 'utf8')); +}; + +SSHBuffer.prototype.writeCString = function (str) { + while (this._offset + 1 + str.length > this._size) + this.expand(); + this._buffer.write(str, this._offset); + this._offset += str.length; + this._buffer[this._offset++] = 0; +}; + +SSHBuffer.prototype.writeInt = function (v) { + while (this._offset + 4 > this._size) + this.expand(); + this._buffer.writeUInt32BE(v, this._offset); + this._offset += 4; +}; + +SSHBuffer.prototype.writeInt64 = function (v) { + assert.buffer(v, 'value'); + if (v.length > 8) { + var lead = v.slice(0, v.length - 8); + for (var i = 0; i < lead.length; ++i) { + assert.strictEqual(lead[i], 0, + 'must fit in 64 bits of precision'); + } + v = v.slice(v.length - 8, v.length); + } + while (this._offset + 8 > this._size) + this.expand(); + v.copy(this._buffer, this._offset); + this._offset += 8; +}; + +SSHBuffer.prototype.writeChar = function (v) { + while (this._offset + 1 > this._size) + this.expand(); + this._buffer[this._offset++] = v; +}; + +SSHBuffer.prototype.writePart = function (p) { + this.writeBuffer(p.data); +}; + +SSHBuffer.prototype.write = function (buf) { + while (this._offset + buf.length > this._size) + this.expand(); + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; diff --git a/node_modules/sshpk/lib/utils.js b/node_modules/sshpk/lib/utils.js new file mode 100644 index 00000000..6b83a322 --- /dev/null +++ b/node_modules/sshpk/lib/utils.js @@ -0,0 +1,404 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + bufferSplit: bufferSplit, + addRSAMissing: addRSAMissing, + calculateDSAPublic: calculateDSAPublic, + calculateED25519Public: calculateED25519Public, + calculateX25519Public: calculateX25519Public, + mpNormalize: mpNormalize, + mpDenormalize: mpDenormalize, + ecNormalize: ecNormalize, + countZeros: countZeros, + assertCompatible: assertCompatible, + isCompatible: isCompatible, + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo, + publicFromPrivateECDSA: publicFromPrivateECDSA, + zeroPadToLength: zeroPadToLength, + writeBitString: writeBitString, + readBitString: readBitString, + pbkdf2: pbkdf2 +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var PrivateKey = require('./private-key'); +var Key = require('./key'); +var crypto = require('crypto'); +var algs = require('./algs'); +var asn1 = require('asn1'); + +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; +var nacl = require('tweetnacl'); + +var MAX_CLASS_DEPTH = 3; + +function isCompatible(obj, klass, needVer) { + if (obj === null || typeof (obj) !== 'object') + return (false); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return (true); + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + if (!proto || ++depth > MAX_CLASS_DEPTH) + return (false); + } + if (proto.constructor.name !== klass.name) + return (false); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + if (ver[0] != needVer[0] || ver[1] < needVer[1]) + return (false); + return (true); +} + +function assertCompatible(obj, klass, needVer, name) { + if (name === undefined) + name = 'object'; + assert.ok(obj, name + ' must not be null'); + assert.object(obj, name + ' must be an object'); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return; + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, + name + ' must be a ' + klass.name + ' instance'); + } + assert.strictEqual(proto.constructor.name, klass.name, + name + ' must be a ' + klass.name + ' instance'); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], + name + ' must be compatible with ' + klass.name + ' klass ' + + 'version ' + needVer[0] + '.' + needVer[1]); +} + +var CIPHER_LEN = { + 'des-ede3-cbc': { key: 24, iv: 8 }, + 'aes-128-cbc': { key: 16, iv: 16 }, + 'aes-256-cbc': { key: 32, iv: 16 } +}; +var PKCS5_SALT_LEN = 8; + +function opensslKeyDeriv(cipher, salt, passphrase, count) { + assert.buffer(salt, 'salt'); + assert.buffer(passphrase, 'passphrase'); + assert.number(count, 'iteration count'); + + var clen = CIPHER_LEN[cipher]; + assert.object(clen, 'supported cipher'); + + salt = salt.slice(0, PKCS5_SALT_LEN); + + var D, D_prev, bufs; + var material = Buffer.alloc(0); + while (material.length < clen.key + clen.iv) { + bufs = []; + if (D_prev) + bufs.push(D_prev); + bufs.push(passphrase); + bufs.push(salt); + D = Buffer.concat(bufs); + for (var j = 0; j < count; ++j) + D = crypto.createHash('md5').update(D).digest(); + material = Buffer.concat([material, D]); + D_prev = D; + } + + return ({ + key: material.slice(0, clen.key), + iv: material.slice(clen.key, clen.key + clen.iv) + }); +} + +/* See: RFC2898 */ +function pbkdf2(hashAlg, salt, iterations, size, passphrase) { + var hkey = Buffer.alloc(salt.length + 4); + salt.copy(hkey); + + var gen = 0, ts = []; + var i = 1; + while (gen < size) { + var t = T(i++); + gen += t.length; + ts.push(t); + } + return (Buffer.concat(ts).slice(0, size)); + + function T(I) { + hkey.writeUInt32BE(I, hkey.length - 4); + + var hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(hkey); + + var Ti = hmac.digest(); + var Uc = Ti; + var c = 1; + while (c++ < iterations) { + hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(Uc); + Uc = hmac.digest(); + for (var x = 0; x < Ti.length; ++x) + Ti[x] ^= Uc[x]; + } + return (Ti); + } +} + +/* Count leading zero bits on a buffer */ +function countZeros(buf) { + var o = 0, obit = 8; + while (o < buf.length) { + var mask = (1 << obit); + if ((buf[o] & mask) === mask) + break; + obit--; + if (obit < 0) { + o++; + obit = 8; + } + } + return (o*8 + (8 - obit) - 1); +} + +function bufferSplit(buf, chr) { + assert.buffer(buf); + assert.string(chr); + + var parts = []; + var lastPart = 0; + var matches = 0; + for (var i = 0; i < buf.length; ++i) { + if (buf[i] === chr.charCodeAt(matches)) + ++matches; + else if (buf[i] === chr.charCodeAt(0)) + matches = 1; + else + matches = 0; + + if (matches >= chr.length) { + var newPart = i + 1; + parts.push(buf.slice(lastPart, newPart - matches)); + lastPart = newPart; + matches = 0; + } + } + if (lastPart <= buf.length) + parts.push(buf.slice(lastPart, buf.length)); + + return (parts); +} + +function ecNormalize(buf, addZero) { + assert.buffer(buf); + if (buf[0] === 0x00 && buf[1] === 0x04) { + if (addZero) + return (buf); + return (buf.slice(1)); + } else if (buf[0] === 0x04) { + if (!addZero) + return (buf); + } else { + while (buf[0] === 0x00) + buf = buf.slice(1); + if (buf[0] === 0x02 || buf[0] === 0x03) + throw (new Error('Compressed elliptic curve points ' + + 'are not supported')); + if (buf[0] !== 0x04) + throw (new Error('Not a valid elliptic curve point')); + if (!addZero) + return (buf); + } + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x0; + buf.copy(b, 1); + return (b); +} + +function readBitString(der, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var buf = der.readString(tag, true); + assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + + 'not supported (0x' + buf[0].toString(16) + ')'); + return (buf.slice(1)); +} + +function writeBitString(der, buf, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + der.writeBuffer(b, tag); +} + +function mpNormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) + buf = buf.slice(1); + if ((buf[0] & 0x80) === 0x80) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function mpDenormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00) + buf = buf.slice(1); + return (buf); +} + +function zeroPadToLength(buf, len) { + assert.buffer(buf); + assert.number(len); + while (buf.length > len) { + assert.equal(buf[0], 0x00); + buf = buf.slice(1); + } + while (buf.length < len) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function bigintToMpBuf(bigint) { + var buf = Buffer.from(bigint.toByteArray()); + buf = mpNormalize(buf); + return (buf); +} + +function calculateDSAPublic(g, p, x) { + assert.buffer(g); + assert.buffer(p); + assert.buffer(x); + g = new jsbn(g); + p = new jsbn(p); + x = new jsbn(x); + var y = g.modPow(x, p); + var ybuf = bigintToMpBuf(y); + return (ybuf); +} + +function calculateED25519Public(k) { + assert.buffer(k); + + var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function calculateX25519Public(k) { + assert.buffer(k); + + var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function addRSAMissing(key) { + assert.object(key); + assertCompatible(key, PrivateKey, [1, 1]); + + var d = new jsbn(key.part.d.data); + var buf; + + if (!key.part.dmodp) { + var p = new jsbn(key.part.p.data); + var dmodp = d.mod(p.subtract(1)); + + buf = bigintToMpBuf(dmodp); + key.part.dmodp = {name: 'dmodp', data: buf}; + key.parts.push(key.part.dmodp); + } + if (!key.part.dmodq) { + var q = new jsbn(key.part.q.data); + var dmodq = d.mod(q.subtract(1)); + + buf = bigintToMpBuf(dmodq); + key.part.dmodq = {name: 'dmodq', data: buf}; + key.parts.push(key.part.dmodq); + } +} + +function publicFromPrivateECDSA(curveName, priv) { + assert.string(curveName, 'curveName'); + assert.buffer(priv); + var params = algs.curves[curveName]; + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + var d = new jsbn(mpNormalize(priv)); + var pub = G.multiply(d); + pub = Buffer.from(curve.encodePointHex(pub), 'hex'); + + var parts = []; + parts.push({name: 'curve', data: Buffer.from(curveName)}); + parts.push({name: 'Q', data: pub}); + + var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); + return (key); +} + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} 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..967a8d3f --- /dev/null +++ b/node_modules/sshpk/package.json @@ -0,0 +1,60 @@ +{ + "name": "sshpk", + "version": "1.17.0", + "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/statuses/HISTORY.md b/node_modules/statuses/HISTORY.md new file mode 100644 index 00000000..fa4556ef --- /dev/null +++ b/node_modules/statuses/HISTORY.md @@ -0,0 +1,82 @@ +2.0.1 / 2021-01-03 +================== + + * Fix returning values from `Object.prototype` + +2.0.0 / 2020-04-19 +================== + + * Drop support for Node.js 0.6 + * Fix messaging casing of `418 I'm a Teapot` + * Remove code 306 + * Remove `status[code]` exports; use `status.message[code]` + * Remove `status[msg]` exports; use `status.code[msg]` + * Rename `425 Unordered Collection` to standard `425 Too Early` + * Rename `STATUS_CODES` export to `message` + * Return status message for `statuses(code)` when given code + +1.5.0 / 2018-03-27 +================== + + * Add `103 Early Hints` + +1.4.0 / 2017-10-20 +================== + + * Add `STATUS_CODES` export + +1.3.1 / 2016-11-11 +================== + + * Fix return type in JSDoc + +1.3.0 / 2016-05-17 +================== + + * Add `421 Misdirected Request` + * perf: enable strict mode + +1.2.1 / 2015-02-01 +================== + + * Fix message for status 451 + - `451 Unavailable For Legal Reasons` + +1.2.0 / 2014-09-28 +================== + + * Add `208 Already Repored` + * Add `226 IM Used` + * Add `306 (Unused)` + * Add `415 Unable For Legal Reasons` + * Add `508 Loop Detected` + +1.1.1 / 2014-09-24 +================== + + * Add missing 308 to `codes.json` + +1.1.0 / 2014-09-21 +================== + + * Add `codes.json` for universal support + +1.0.4 / 2014-08-20 +================== + + * Package cleanup + +1.0.3 / 2014-06-08 +================== + + * Add 308 to `.redirect` category + +1.0.2 / 2014-03-13 +================== + + * Add `.retry` category + +1.0.1 / 2014-03-12 +================== + + * Initial release diff --git a/node_modules/statuses/LICENSE b/node_modules/statuses/LICENSE new file mode 100644 index 00000000..28a31618 --- /dev/null +++ b/node_modules/statuses/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/statuses/README.md b/node_modules/statuses/README.md new file mode 100644 index 00000000..57967e6e --- /dev/null +++ b/node_modules/statuses/README.md @@ -0,0 +1,136 @@ +# statuses + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP status utility for node. + +This module provides a list of status codes and messages sourced from +a few different projects: + + * The [IANA Status Code Registry](https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) + * The [Node.js project](https://nodejs.org/) + * The [NGINX project](https://www.nginx.com/) + * The [Apache HTTP Server project](https://httpd.apache.org/) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install statuses +``` + +## API + + + +```js +var status = require('statuses') +``` + +### status(code) + +Returns the status message string for a known HTTP status code. The code +may be a number or a string. An error is thrown for an unknown status code. + + + +```js +status(403) // => 'Forbidden' +status('403') // => 'Forbidden' +status(306) // throws +``` + +### status(msg) + +Returns the numeric status code for a known HTTP status message. The message +is case-insensitive. An error is thrown for an unknown status message. + + + +```js +status('forbidden') // => 403 +status('Forbidden') // => 403 +status('foo') // throws +``` + +### status.codes + +Returns an array of all the status codes as `Integer`s. + +### status.code[msg] + +Returns the numeric status code for a known status message (in lower-case), +otherwise `undefined`. + + + +```js +status['not found'] // => 404 +``` + +### status.empty[code] + +Returns `true` if a status code expects an empty body. + + + +```js +status.empty[200] // => undefined +status.empty[204] // => true +status.empty[304] // => true +``` + +### status.message[code] + +Returns the string message for a known numeric status code, otherwise +`undefined`. This object is the same format as the +[Node.js http module `http.STATUS_CODES`](https://nodejs.org/dist/latest/docs/api/http.html#http_http_status_codes). + + + +```js +status.message[404] // => 'Not Found' +``` + +### status.redirect[code] + +Returns `true` if a status code is a valid redirect status. + + + +```js +status.redirect[200] // => undefined +status.redirect[301] // => true +``` + +### status.retry[code] + +Returns `true` if you should retry the rest. + + + +```js +status.retry[501] // => undefined +status.retry[503] // => true +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/statuses/master?label=ci +[ci-url]: https://github.com/jshttp/statuses/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/statuses/master +[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master +[node-version-image]: https://badgen.net/npm/node/statuses +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/statuses +[npm-url]: https://npmjs.org/package/statuses +[npm-version-image]: https://badgen.net/npm/v/statuses diff --git a/node_modules/statuses/codes.json b/node_modules/statuses/codes.json new file mode 100644 index 00000000..1333ed10 --- /dev/null +++ b/node_modules/statuses/codes.json @@ -0,0 +1,65 @@ +{ + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a Teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Too Early", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" +} diff --git a/node_modules/statuses/index.js b/node_modules/statuses/index.js new file mode 100644 index 00000000..ea351c55 --- /dev/null +++ b/node_modules/statuses/index.js @@ -0,0 +1,146 @@ +/*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var codes = require('./codes.json') + +/** + * Module exports. + * @public + */ + +module.exports = status + +// status code to message map +status.message = codes + +// status message (lower-case) to code map +status.code = createMessageToStatusCodeMap(codes) + +// array of status codes +status.codes = createStatusCodeList(codes) + +// status codes for redirects +status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true +} + +// status codes for empty bodies +status.empty = { + 204: true, + 205: true, + 304: true +} + +// status codes for when you should retry the request +status.retry = { + 502: true, + 503: true, + 504: true +} + +/** + * Create a map of message to status code. + * @private + */ + +function createMessageToStatusCodeMap (codes) { + var map = {} + + Object.keys(codes).forEach(function forEachCode (code) { + var message = codes[code] + var status = Number(code) + + // populate map + map[message.toLowerCase()] = status + }) + + return map +} + +/** + * Create a list of all status codes. + * @private + */ + +function createStatusCodeList (codes) { + return Object.keys(codes).map(function mapCode (code) { + return Number(code) + }) +} + +/** + * Get the status code for given message. + * @private + */ + +function getStatusCode (message) { + var msg = message.toLowerCase() + + if (!Object.prototype.hasOwnProperty.call(status.code, msg)) { + throw new Error('invalid status message: "' + message + '"') + } + + return status.code[msg] +} + +/** + * Get the status message for given code. + * @private + */ + +function getStatusMessage (code) { + if (!Object.prototype.hasOwnProperty.call(status.message, code)) { + throw new Error('invalid status code: ' + code) + } + + return status.message[code] +} + +/** + * Get the status code. + * + * Given a number, this will throw if it is not a known status + * code, otherwise the code will be returned. Given a string, + * the string will be parsed for a number and return the code + * if valid, otherwise will lookup the code assuming this is + * the status message. + * + * @param {string|number} code + * @returns {number} + * @public + */ + +function status (code) { + if (typeof code === 'number') { + return getStatusMessage(code) + } + + if (typeof code !== 'string') { + throw new TypeError('code must be a number or string') + } + + // '403' + var n = parseInt(code, 10) + if (!isNaN(n)) { + return getStatusMessage(n) + } + + return getStatusCode(code) +} diff --git a/node_modules/statuses/package.json b/node_modules/statuses/package.json new file mode 100644 index 00000000..8c3e719b --- /dev/null +++ b/node_modules/statuses/package.json @@ -0,0 +1,49 @@ +{ + "name": "statuses", + "description": "HTTP status utility", + "version": "2.0.1", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "repository": "jshttp/statuses", + "license": "MIT", + "keywords": [ + "http", + "status", + "code" + ], + "files": [ + "HISTORY.md", + "index.js", + "codes.json", + "LICENSE" + ], + "devDependencies": { + "csv-parse": "4.14.2", + "eslint": "7.17.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-markdown": "1.0.2", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "8.2.1", + "nyc": "15.1.0", + "raw-body": "2.4.1", + "stream-to-array": "2.3.0" + }, + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "build": "node scripts/build.js", + "fetch": "node scripts/fetch-apache.js && node scripts/fetch-iana.js && node scripts/fetch-nginx.js && node scripts/fetch-node.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "update": "npm run fetch && npm run build", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} 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/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE new file mode 100644 index 00000000..7cccaf9e --- /dev/null +++ b/node_modules/to-regex-range/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/to-regex-range/README.md b/node_modules/to-regex-range/README.md new file mode 100644 index 00000000..38887daf --- /dev/null +++ b/node_modules/to-regex-range/README.md @@ -0,0 +1,305 @@ +# to-regex-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![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. + +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 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 +const toRegexRange = require('to-regex-range'); +const 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 07, 2019, this library runs [>1m test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are correct. + +Tests run in ~280ms on my MacBook Pro, 2.5 GHz Intel Core i7. + +### Optimized + +Generated regular expressions are 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 +const 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 +const source = toRegexRange('15', '95'); +//=> 1[5-9]|[2-8][0-9]|9[0-5] + +const regex = new RegExp(`^${source}$`); +console.log(regex.test('14')); //=> false +console.log(regex.test('50')); //=> true +console.log(regex.test('94')); //=> true +console.log(regex.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 relaxes matching for leading zeros when when ranges are zero-padded. + +```js +const source = toRegexRange('-0010', '0010'); +const regex = new RegExp(`^${source}$`); +console.log(regex.test('-10')); //=> true +console.log(regex.test('-010')); //=> true +console.log(regex.test('-0010')); //=> true +console.log(regex.test('10')); //=> true +console.log(regex.test('010')); //=> true +console.log(regex.test('0010')); //=> true +``` + +When `relaxZeros` is false, matching is strict: + +```js +const source = toRegexRange('-0010', '0010', { relaxZeros: false }); +const regex = new RegExp(`^${source}$`); +console.log(regex.test('-10')); //=> false +console.log(regex.test('-010')); //=> false +console.log(regex.test('-0010')); //=> true +console.log(regex.test('10')); //=> false +console.log(regex.test('010')); //=> false +console.log(regex.test('0010')); //=> true +``` + +## Examples + +| **Range** | **Result** | **Compile time** | +| --- | --- | --- | +| `toRegexRange(-10, 10)` | `-[1-9]\|-?10\|[0-9]` | _132μs_ | +| `toRegexRange(-100, -10)` | `-1[0-9]\|-[2-9][0-9]\|-100` | _50μs_ | +| `toRegexRange(-100, 100)` | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]` | _42μs_ | +| `toRegexRange(001, 100)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|100` | _109μs_ | +| `toRegexRange(001, 555)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _51μs_ | +| `toRegexRange(0010, 1000)` | `0{0,2}1[0-9]\|0{0,2}[2-9][0-9]\|0?[1-9][0-9]{2}\|1000` | _31μs_ | +| `toRegexRange(1, 50)` | `[1-9]\|[1-4][0-9]\|50` | _24μs_ | +| `toRegexRange(1, 55)` | `[1-9]\|[1-4][0-9]\|5[0-5]` | _23μs_ | +| `toRegexRange(1, 555)` | `[1-9]\|[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _30μs_ | +| `toRegexRange(1, 5555)` | `[1-9]\|[1-9][0-9]{1,2}\|[1-4][0-9]{3}\|5[0-4][0-9]{2}\|55[0-4][0-9]\|555[0-5]` | _43μ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]` | _38μs_ | +| `toRegexRange(29, 51)` | `29\|[34][0-9]\|5[01]` | _24μs_ | +| `toRegexRange(31, 877)` | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]` | _32μs_ | +| `toRegexRange(5, 5)` | `5` | _8μs_ | +| `toRegexRange(5, 6)` | `5\|6` | _11μs_ | +| `toRegexRange(1, 2)` | `1\|2` | _6μs_ | +| `toRegexRange(1, 5)` | `[1-5]` | _15μs_ | +| `toRegexRange(1, 10)` | `[1-9]\|10` | _22μs_ | +| `toRegexRange(1, 100)` | `[1-9]\|[1-9][0-9]\|100` | _25μs_ | +| `toRegexRange(1, 1000)` | `[1-9]\|[1-9][0-9]{1,2}\|1000` | _31μs_ | +| `toRegexRange(1, 10000)` | `[1-9]\|[1-9][0-9]{1,3}\|10000` | _34μs_ | +| `toRegexRange(1, 100000)` | `[1-9]\|[1-9][0-9]{1,4}\|100000` | _36μs_ | +| `toRegexRange(1, 1000000)` | `[1-9]\|[1-9][0-9]{1,5}\|1000000` | _42μs_ | +| `toRegexRange(1, 10000000)` | `[1-9]\|[1-9][0-9]{1,6}\|10000000` | _42μ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 + +
+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-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used… [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. 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/micromatch/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.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 63 | [jonschlinkert](https://github.com/jonschlinkert) | +| 3 | [doowb](https://github.com/doowb) | +| 2 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! + + + + + +### License + +Copyright © 2019, [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.8.0, on April 07, 2019._ \ 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..77fbaced --- /dev/null +++ b/node_modules/to-regex-range/index.js @@ -0,0 +1,288 @@ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +const isNumber = require('is-number'); + +const toRegexRange = (min, max, options) => { + if (isNumber(min) === false) { + throw new TypeError('toRegexRange: expected the first argument to be a number'); + } + + if (max === void 0 || min === max) { + return String(min); + } + + if (isNumber(max) === false) { + throw new TypeError('toRegexRange: expected the second argument to be a number.'); + } + + let opts = { relaxZeros: true, ...options }; + if (typeof opts.strictZeros === 'boolean') { + opts.relaxZeros = opts.strictZeros === false; + } + + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap = String(opts.wrap); + let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; + + if (toRegexRange.cache.hasOwnProperty(cacheKey)) { + return toRegexRange.cache[cacheKey].result; + } + + let a = Math.min(min, max); + let b = Math.max(min, max); + + if (Math.abs(a - b) === 1) { + let result = min + '|' + max; + if (opts.capture) { + return `(${result})`; + } + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; + } + + let isPadded = hasPadding(min) || hasPadding(max); + let state = { min, max, a, b }; + let positives = []; + let negatives = []; + + if (isPadded) { + state.isPadded = isPadded; + state.maxLen = String(state.max).length; + } + + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } + + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); + } + + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives, opts); + + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { + state.result = `(?:${state.result})`; + } + + toRegexRange.cache[cacheKey] = state; + return state.result; +}; + +function collatePatterns(neg, pos, options) { + let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + let intersected = filterPatterns(neg, pos, '-?', true, options) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} + +function splitToRanges(min, max) { + let nines = 1; + let zeros = 1; + + let stop = countNines(min, nines); + let stops = new Set([max]); + + while (min <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min, nines); + } + + stop = countZeros(max + 1, zeros) - 1; + + while (min < stop && stop <= max) { + stops.add(stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + + stops = [...stops]; + 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: start, count: [], digits: 0 }; + } + + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern = ''; + let count = 0; + + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit, options); + + } else { + count++; + } + } + + if (count) { + pattern += options.shorthand === true ? '\\d' : '[0-9]'; + } + + return { pattern, count: [count], digits }; +} + +function splitToPatterns(min, max, tok, options) { + let ranges = splitToRanges(min, max); + let tokens = []; + let start = min; + let prev; + + for (let i = 0; i < ranges.length; i++) { + let max = ranges[i]; + let obj = rangeToPattern(String(start), String(max), options); + let zeros = ''; + + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); + } + + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(max, tok, options); + } + + obj.string = zeros + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max + 1; + prev = obj; + } + + return tokens; +} + +function filterPatterns(arr, comparison, prefix, intersection, options) { + let result = []; + + for (let ele of arr) { + let { string } = ele; + + // only push if _both_ are negative... + if (!intersection && !contains(comparison, 'string', string)) { + result.push(prefix + string); + } + + // or _both_ are positive + if (intersection && contains(comparison, 'string', string)) { + result.push(prefix + string); + } + } + return result; +} + +/** + * Zip strings + */ + +function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); + return arr; +} + +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} + +function contains(arr, key, val) { + return arr.some(ele => ele[key] === val); +} + +function countNines(min, len) { + return Number(String(min).slice(0, -len) + '9'.repeat(len)); +} + +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} + +function toQuantifier(digits) { + let [start = 0, stop = ''] = digits; + if (stop || start > 1) { + return `{${start + (stop ? ',' + stop : '')}}`; + } + return ''; +} + +function toCharacterClass(a, b, options) { + return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; +} + +function hasPadding(str) { + return /^-?(0+)\d/.test(str); +} + +function padZeros(value, tok, options) { + if (!tok.isPadded) { + return value; + } + + let diff = Math.abs(tok.maxLen - String(value).length); + let relax = options.relaxZeros !== false; + + switch (diff) { + case 0: + return ''; + case 1: + return relax ? '0?' : '0'; + case 2: + return relax ? '0{0,2}' : '00'; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; + } + } +} + +/** + * Cache + */ + +toRegexRange.cache = {}; +toRegexRange.clearCache = () => (toRegexRange.cache = {}); + +/** + * 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..4ef194f3 --- /dev/null +++ b/node_modules/to-regex-range/package.json @@ -0,0 +1,88 @@ +{ + "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": "5.0.1", + "homepage": "https://github.com/micromatch/to-regex-range", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Rouven Weßling (www.rouvenwessling.de)" + ], + "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": ">=8.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-number": "^7.0.0" + }, + "devDependencies": { + "fill-range": "^6.0.0", + "gulp-format-md": "^2.0.0", + "mocha": "^6.0.2", + "text-table": "^0.2.0", + "time-diff": "^0.3.1" + }, + "keywords": [ + "bash", + "date", + "expand", + "expansion", + "expression", + "glob", + "match", + "match date", + "match number", + "match numbers", + "match year", + "matches", + "matching", + "number", + "numbers", + "numerical", + "range", + "ranges", + "regex", + "regexp", + "regular", + "regular expression", + "sequence" + ], + "verb": { + "layout": "default", + "toc": false, + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "helpers": { + "examples": { + "displayName": "examples" + } + }, + "related": { + "list": [ + "expand-range", + "fill-range", + "micromatch", + "repeat-element", + "repeat-string" + ] + } + } +} diff --git a/node_modules/toidentifier/HISTORY.md b/node_modules/toidentifier/HISTORY.md new file mode 100644 index 00000000..cb7cc892 --- /dev/null +++ b/node_modules/toidentifier/HISTORY.md @@ -0,0 +1,9 @@ +1.0.1 / 2021-11-14 +================== + + * pref: enable strict mode + +1.0.0 / 2018-07-09 +================== + + * Initial release diff --git a/node_modules/toidentifier/LICENSE b/node_modules/toidentifier/LICENSE new file mode 100644 index 00000000..de22d159 --- /dev/null +++ b/node_modules/toidentifier/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/toidentifier/README.md b/node_modules/toidentifier/README.md new file mode 100644 index 00000000..57e8a78a --- /dev/null +++ b/node_modules/toidentifier/README.md @@ -0,0 +1,61 @@ +# toidentifier + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][codecov-image]][codecov-url] + +> Convert a string of words to a JavaScript identifier + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```bash +$ npm install toidentifier +``` + +## Example + +```js +var toIdentifier = require('toidentifier') + +console.log(toIdentifier('Bad Request')) +// => "BadRequest" +``` + +## API + +This CommonJS module exports a single default function: `toIdentifier`. + +### toIdentifier(string) + +Given a string as the argument, it will be transformed according to +the following rules and the new string will be returned: + +1. Split into words separated by space characters (`0x20`). +2. Upper case the first character of each word. +3. Join the words together with no separator. +4. Remove all non-word (`[0-9a-z_]`) characters. + +## License + +[MIT](LICENSE) + +[codecov-image]: https://img.shields.io/codecov/c/github/component/toidentifier.svg +[codecov-url]: https://codecov.io/gh/component/toidentifier +[downloads-image]: https://img.shields.io/npm/dm/toidentifier.svg +[downloads-url]: https://npmjs.org/package/toidentifier +[github-actions-ci-image]: https://img.shields.io/github/workflow/status/component/toidentifier/ci/master?label=ci +[github-actions-ci-url]: https://github.com/component/toidentifier?query=workflow%3Aci +[npm-image]: https://img.shields.io/npm/v/toidentifier.svg +[npm-url]: https://npmjs.org/package/toidentifier + + +## + +[npm]: https://www.npmjs.com/ + +[yarn]: https://yarnpkg.com/ diff --git a/node_modules/toidentifier/index.js b/node_modules/toidentifier/index.js new file mode 100644 index 00000000..9295d024 --- /dev/null +++ b/node_modules/toidentifier/index.js @@ -0,0 +1,32 @@ +/*! + * toidentifier + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = toIdentifier + +/** + * Trasform the given string into a JavaScript identifier + * + * @param {string} str + * @returns {string} + * @public + */ + +function toIdentifier (str) { + return str + .split(' ') + .map(function (token) { + return token.slice(0, 1).toUpperCase() + token.slice(1) + }) + .join('') + .replace(/[^ _0-9a-z]/gi, '') +} diff --git a/node_modules/toidentifier/package.json b/node_modules/toidentifier/package.json new file mode 100644 index 00000000..42db1a66 --- /dev/null +++ b/node_modules/toidentifier/package.json @@ -0,0 +1,38 @@ +{ + "name": "toidentifier", + "description": "Convert a string of words to a JavaScript identifier", + "version": "1.0.1", + "author": "Douglas Christopher Wilson ", + "contributors": [ + "Douglas Christopher Wilson ", + "Nick Baugh (http://niftylettuce.com/)" + ], + "repository": "component/toidentifier", + "devDependencies": { + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.3", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.1.3", + "nyc": "15.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "license": "MIT", + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/node_modules/touch/LICENSE b/node_modules/touch/LICENSE new file mode 100644 index 00000000..05eeeb88 --- /dev/null +++ b/node_modules/touch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +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/touch/README.md b/node_modules/touch/README.md new file mode 100644 index 00000000..b5a361e6 --- /dev/null +++ b/node_modules/touch/README.md @@ -0,0 +1,52 @@ +# node-touch + +For all your node touching needs. + +## Installing + +```bash +npm install touch +``` + +## CLI Usage: + +See `man touch` + +This package exports a binary called `nodetouch` that works mostly +like the unix builtin `touch(1)`. + +## API Usage: + +```javascript +var touch = require("touch") +``` + +Gives you the following functions: + +* `touch(filename, options, cb)` +* `touch.sync(filename, options)` +* `touch.ftouch(fd, options, cb)` +* `touch.ftouchSync(fd, options)` + +All the `options` objects are optional. + +All the async functions return a Promise. If a callback function is +provided, then it's attached to the Promise. + +## Options + +* `force` like `touch -f` Boolean +* `time` like `touch -t ` Can be a Date object, or any parseable + Date string, or epoch ms number. +* `atime` like `touch -a` Can be either a Boolean, or a Date. +* `mtime` like `touch -m` Can be either a Boolean, or a Date. +* `ref` like `touch -r ` Must be path to a file. +* `nocreate` like `touch -c` Boolean + +If neither `atime` nor `mtime` are set, then both values are set. If +one of them is set, then the other is not. + +## cli + +This package creates a `nodetouch` command line executable that works +very much like the unix builtin `touch(1)` diff --git a/node_modules/touch/bin/nodetouch.js b/node_modules/touch/bin/nodetouch.js new file mode 100755 index 00000000..f78f0829 --- /dev/null +++ b/node_modules/touch/bin/nodetouch.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node +const touch = require("../index.js") + +const usage = code => { + console[code ? 'error' : 'log']( + 'usage:\n' + + 'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...' + ) + process.exit(code) +} + +const singleFlags = { + a: 'atime', + m: 'mtime', + c: 'nocreate', + f: 'force' +} + +const singleOpts = { + r: 'ref', + t: 'time' +} + +const files = [] +const args = process.argv.slice(2) +const options = {} +for (let i = 0; i < args.length; i++) { + const arg = args[i] + if (!arg.match(/^-/)) { + files.push(arg) + continue + } + + // expand shorthands + if (arg.charAt(1) !== '-') { + const expand = [] + for (let f = 1; f < arg.length; f++) { + const fc = arg.charAt(f) + const sf = singleFlags[fc] + const so = singleOpts[fc] + if (sf) + expand.push('--' + sf) + else if (so) { + const soslice = arg.slice(f + 1) + const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice + expand.push('--' + so + soval) + f = arg.length + } else if (arg !== '-' + fc) + expand.push('-' + fc) + } + if (expand.length) { + args.splice.apply(args, [i, 1].concat(expand)) + i-- + continue + } + } + + const argsplit = arg.split('=') + const key = argsplit.shift().replace(/^\-\-/, '') + const val = argsplit.length ? argsplit.join('=') : null + + switch (key) { + case 'time': + const timestr = val || args[++i] + // [-t [[CC]YY]MMDDhhmm[.SS]] + const parsedtime = timestr.match( + /^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/ + ) + if (!parsedtime) { + console.error('touch: out of range or illegal ' + + 'time specification: ' + + '[[CC]YY]MMDDhhmm[.SS]') + process.exit(1) + } else { + const y = +parsedtime[1] + const year = parsedtime[2] ? y + : y <= 68 ? 2000 + y + : 1900 + y + + const MM = +parsedtime[4] - 1 + const dd = +parsedtime[5] + const hh = +parsedtime[6] + const mm = +parsedtime[7] + const ss = +parsedtime[8] + + options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss)) + } + continue + + case 'ref': + options.ref = val || args[++i] + continue + + case 'mtime': + case 'nocreate': + case 'atime': + case 'force': + options[key] = true + continue + + default: + console.error('touch: illegal option -- ' + arg) + usage(1) + } +} + +if (!files.length) + usage() + +process.exitCode = 0 +Promise.all(files.map(f => touch(f, options))) + .catch(er => process.exitCode = 1) diff --git a/node_modules/touch/index.js b/node_modules/touch/index.js new file mode 100644 index 00000000..f942e42a --- /dev/null +++ b/node_modules/touch/index.js @@ -0,0 +1,224 @@ +'use strict' + +const EE = require('events').EventEmitter +const cons = require('constants') +const fs = require('fs') + +module.exports = (f, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, f, null)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.sync = module.exports.touchSync = (f, options) => + (new TouchSync(validOpts(options, f, null)), undefined) + +module.exports.ftouch = (fd, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, null, fd)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.ftouchSync = (fd, opt) => + (new TouchSync(validOpts(opt, null, fd)), undefined) + +const validOpts = (options, path, fd) => { + options = Object.create(options || {}) + options.fd = fd + options.path = path + + // {mtime: true}, {ctime: true} + // If set to something else, then treat as epoch ms value + const now = parseInt(new Date(options.time || Date.now()).getTime() / 1000) + if (!options.atime && !options.mtime) + options.atime = options.mtime = now + else { + if (true === options.atime) + options.atime = now + + if (true === options.mtime) + options.mtime = now + } + + let oflags = 0 + if (!options.force) + oflags = oflags | cons.O_RDWR + + if (!options.nocreate) + oflags = oflags | cons.O_CREAT + + options.oflags = oflags + return options +} + +class Touch extends EE { + constructor (options) { + super(options) + this.fd = options.fd + this.path = options.path + this.atime = options.atime + this.mtime = options.mtime + this.ref = options.ref + this.nocreate = !!options.nocreate + this.force = !!options.force + this.closeAfter = options.closeAfter + this.oflags = options.oflags + this.options = options + + if (typeof this.fd !== 'number') { + this.closeAfter = true + this.open() + } else + this.onopen(null, this.fd) + } + + emit (ev, data) { + // we only emit when either done or erroring + // in both cases, need to close + this.close() + return super.emit(ev, data) + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + fs.close(this.fd, () => {}) + } + + open () { + fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd)) + } + + onopen (er, fd) { + if (er) { + if (er.code === 'EISDIR') + this.onopen(null, null) + else if (er.code === 'ENOENT' && this.nocreate) + this.emit('done') + else + this.emit('error', er) + } else { + this.fd = fd + if (this.ref) + this.statref() + else if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + } + + statref () { + fs.stat(this.ref, (er, st) => { + if (er) + this.emit('error', er) + else + this.onstatref(st) + }) + } + + onstatref (st) { + this.atime = this.atime && parseInt(st.atime.getTime()/1000, 10) + this.mtime = this.mtime && parseInt(st.mtime.getTime()/1000, 10) + if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + + fstat () { + const stat = this.fd ? 'fstat' : 'stat' + const target = this.fd || this.path + fs[stat](target, (er, st) => { + if (er) + this.emit('error', er) + else + this.onfstat(st) + }) + } + + onfstat (st) { + if (typeof this.atime !== 'number') + this.atime = parseInt(st.atime.getTime()/1000, 10) + + if (typeof this.mtime !== 'number') + this.mtime = parseInt(st.mtime.getTime()/1000, 10) + + this.futimes() + } + + futimes () { + const utimes = this.fd ? 'futimes' : 'utimes' + const target = this.fd || this.path + fs[utimes](target, ''+this.atime, ''+this.mtime, er => { + if (er) + this.emit('error', er) + else + this.emit('done') + }) + } +} + +class TouchSync extends Touch { + open () { + try { + this.onopen(null, fs.openSync(this.path, this.oflags)) + } catch (er) { + this.onopen(er) + } + } + + statref () { + let threw = true + try { + this.onstatref(fs.statSync(this.ref)) + threw = false + } finally { + if (threw) + this.close() + } + } + + fstat () { + let threw = true + const stat = this.fd ? 'fstatSync' : 'statSync' + const target = this.fd || this.path + try { + this.onfstat(fs[stat](target)) + threw = false + } finally { + if (threw) + this.close() + } + } + + futimes () { + let threw = true + const utimes = this.fd ? 'futimesSync' : 'utimesSync' + const target = this.fd || this.path + try { + fs[utimes](target, this.atime, this.mtime) + threw = false + } finally { + if (threw) + this.close() + } + this.emit('done') + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + try { fs.closeSync(this.fd) } catch (er) {} + } +} diff --git a/node_modules/touch/package.json b/node_modules/touch/package.json new file mode 100644 index 00000000..05608de3 --- /dev/null +++ b/node_modules/touch/package.json @@ -0,0 +1,28 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "touch", + "description": "like touch(1) in node", + "version": "3.1.0", + "repository": "git://github.com/isaacs/node-touch.git", + "bin": { + "nodetouch": "./bin/nodetouch.js" + }, + "dependencies": { + "nopt": "~1.0.10" + }, + "license": "ISC", + "scripts": { + "test": "tap test/*.js --100 -J", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "devDependencies": { + "mutate-fs": "^1.1.0", + "tap": "^10.7.0" + }, + "files": [ + "index.js", + "bin/nodetouch.js" + ] +} 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/lib/cookie.js b/node_modules/tough-cookie/lib/cookie.js new file mode 100644 index 00000000..32dc0f8d --- /dev/null +++ b/node_modules/tough-cookie/lib/cookie.js @@ -0,0 +1,1482 @@ +/*! + * 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. + */ +'use strict'; +var net = require('net'); +var urlParse = require('url').parse; +var util = require('util'); +var pubsuffix = require('./pubsuffix-psl'); +var Store = require('./store').Store; +var MemoryCookieStore = require('./memstore').MemoryCookieStore; +var pathMatch = require('./pathMatch').pathMatch; +var VERSION = require('./version'); + +var punycode; +try { + punycode = require('punycode'); +} catch(e) { + console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization"); +} + +// From RFC6265 S4.1.1 +// note that it excludes \x3B ";" +var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; + +var CONTROL_CHARS = /[\x00-\x1F]/; + +// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in +// the "relaxed" mode, see: +// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60 +var TERMINATORS = ['\n', '\r', '\0']; + +// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' +// Note ';' is \x3B +var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; + +// date-time parsing constants (RFC6265 S5.1.1) + +var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; + +var MONTH_TO_NUM = { + jan:0, feb:1, mar:2, apr:3, may:4, jun:5, + jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 +}; +var NUM_TO_MONTH = [ + 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' +]; +var NUM_TO_DAY = [ + 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' +]; + +var MAX_TIME = 2147483647000; // 31-bit max +var MIN_TIME = 0; // 31-bit min + +/* + * Parses a Natural number (i.e., non-negative integer) with either the + * *DIGIT ( non-digit *OCTET ) + * or + * *DIGIT + * grammar (RFC6265 S5.1.1). + * + * The "trailingOK" boolean controls if the grammar accepts a + * "( non-digit *OCTET )" trailer. + */ +function parseDigits(token, minDigits, maxDigits, trailingOK) { + var count = 0; + while (count < token.length) { + var c = token.charCodeAt(count); + // "non-digit = %x00-2F / %x3A-FF" + if (c <= 0x2F || c >= 0x3A) { + break; + } + count++; + } + + // constrain to a minimum and maximum number of digits. + if (count < minDigits || count > maxDigits) { + return null; + } + + if (!trailingOK && count != token.length) { + return null; + } + + return parseInt(token.substr(0,count), 10); +} + +function parseTime(token) { + var parts = token.split(':'); + var result = [0,0,0]; + + /* RF6256 S5.1.1: + * time = hms-time ( non-digit *OCTET ) + * hms-time = time-field ":" time-field ":" time-field + * time-field = 1*2DIGIT + */ + + if (parts.length !== 3) { + return null; + } + + for (var i = 0; i < 3; i++) { + // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be + // followed by "( non-digit *OCTET )" so therefore the last time-field can + // have a trailer + var trailingOK = (i == 2); + var num = parseDigits(parts[i], 1, 2, trailingOK); + if (num === null) { + return null; + } + result[i] = num; + } + + return result; +} + +function parseMonth(token) { + token = String(token).substr(0,3).toLowerCase(); + var num = MONTH_TO_NUM[token]; + return num >= 0 ? num : null; +} + +/* + * RFC6265 S5.1.1 date parser (see RFC for full grammar) + */ +function parseDate(str) { + if (!str) { + return; + } + + /* RFC6265 S5.1.1: + * 2. Process each date-token sequentially in the order the date-tokens + * appear in the cookie-date + */ + var tokens = str.split(DATE_DELIM); + if (!tokens) { + return; + } + + var hour = null; + var minute = null; + var second = null; + var dayOfMonth = null; + var month = null; + var year = null; + + for (var i=0; i= 70 && year <= 99) { + year += 1900; + } else if (year >= 0 && year <= 69) { + year += 2000; + } + } + } + } + + /* RFC 6265 S5.1.1 + * "5. Abort these steps and fail to parse the cookie-date if: + * * at least one of the found-day-of-month, found-month, found- + * year, or found-time flags is not set, + * * the day-of-month-value is less than 1 or greater than 31, + * * the year-value is less than 1601, + * * the hour-value is greater than 23, + * * the minute-value is greater than 59, or + * * the second-value is greater than 59. + * (Note that leap seconds cannot be represented in this syntax.)" + * + * So, in order as above: + */ + if ( + dayOfMonth === null || month === null || year === null || second === null || + dayOfMonth < 1 || dayOfMonth > 31 || + year < 1601 || + hour > 23 || + minute > 59 || + second > 59 + ) { + return; + } + + return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); +} + +function formatDate(date) { + var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; + var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; + var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; + var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; + return NUM_TO_DAY[date.getUTCDay()] + ', ' + + d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ + h+':'+m+':'+s+' GMT'; +} + +// S5.1.2 Canonicalized Host Names +function canonicalDomain(str) { + if (str == null) { + return null; + } + str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . + + // convert to IDN if any non-ASCII characters + if (punycode && /[^\u0001-\u007f]/.test(str)) { + str = punycode.toASCII(str); + } + + return str.toLowerCase(); +} + +// S5.1.3 Domain Matching +function domainMatch(str, domStr, canonicalize) { + if (str == null || domStr == null) { + return null; + } + if (canonicalize !== false) { + str = canonicalDomain(str); + domStr = canonicalDomain(domStr); + } + + /* + * "The domain string and the string are identical. (Note that both the + * domain string and the string will have been canonicalized to lower case at + * this point)" + */ + if (str == domStr) { + return true; + } + + /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ + + /* "* The string is a host name (i.e., not an IP address)." */ + if (net.isIP(str)) { + return false; + } + + /* "* The domain string is a suffix of the string" */ + var idx = str.indexOf(domStr); + if (idx <= 0) { + return false; // it's a non-match (-1) or prefix (0) + } + + // e.g "a.b.c".indexOf("b.c") === 2 + // 5 === 3+2 + if (str.length !== domStr.length + idx) { // it's not a suffix + return false; + } + + /* "* The last character of the string that is not included in the domain + * string is a %x2E (".") character." */ + if (str.substr(idx-1,1) !== '.') { + return false; + } + + return true; +} + + +// RFC6265 S5.1.4 Paths and Path-Match + +/* + * "The user agent MUST use an algorithm equivalent to the following algorithm + * to compute the default-path of a cookie:" + * + * Assumption: the path (and not query part or absolute uri) is passed in. + */ +function defaultPath(path) { + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (!path || path.substr(0,1) !== "/") { + return "/"; + } + + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if (path === "/") { + return path; + } + + var rightSlash = path.lastIndexOf("/"); + if (rightSlash === 0) { + return "/"; + } + + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return path.slice(0, rightSlash); +} + +function trimTerminator(str) { + for (var t = 0; t < TERMINATORS.length; t++) { + var terminatorIdx = str.indexOf(TERMINATORS[t]); + if (terminatorIdx !== -1) { + str = str.substr(0,terminatorIdx); + } + } + + return str; +} + +function parseCookiePair(cookiePair, looseMode) { + cookiePair = trimTerminator(cookiePair); + + var firstEq = cookiePair.indexOf('='); + if (looseMode) { + if (firstEq === 0) { // '=' is immediately at start + cookiePair = cookiePair.substr(1); + firstEq = cookiePair.indexOf('='); // might still need to split on '=' + } + } else { // non-loose mode + if (firstEq <= 0) { // no '=' or is at start + return; // needs to have non-empty "cookie-name" + } + } + + var cookieName, cookieValue; + if (firstEq <= 0) { + cookieName = ""; + cookieValue = cookiePair.trim(); + } else { + cookieName = cookiePair.substr(0, firstEq).trim(); + cookieValue = cookiePair.substr(firstEq+1).trim(); + } + + if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { + return; + } + + var c = new Cookie(); + c.key = cookieName; + c.value = cookieValue; + return c; +} + +function parse(str, options) { + if (!options || typeof options !== 'object') { + options = {}; + } + str = str.trim(); + + // We use a regex to parse the "name-value-pair" part of S5.2 + var firstSemi = str.indexOf(';'); // S5.2 step 1 + var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi); + var c = parseCookiePair(cookiePair, !!options.loose); + if (!c) { + return; + } + + if (firstSemi === -1) { + return c; + } + + // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question)." plus later on in the same section + // "discard the first ";" and trim". + var unparsed = str.slice(firstSemi + 1).trim(); + + // "If the unparsed-attributes string is empty, skip the rest of these + // steps." + if (unparsed.length === 0) { + return c; + } + + /* + * S5.2 says that when looping over the items "[p]rocess the attribute-name + * and attribute-value according to the requirements in the following + * subsections" for every item. Plus, for many of the individual attributes + * in S5.3 it says to use the "attribute-value of the last attribute in the + * cookie-attribute-list". Therefore, in this implementation, we overwrite + * the previous value. + */ + var cookie_avs = unparsed.split(';'); + while (cookie_avs.length) { + var av = cookie_avs.shift().trim(); + if (av.length === 0) { // happens if ";;" appears + continue; + } + var av_sep = av.indexOf('='); + var av_key, av_value; + + if (av_sep === -1) { + av_key = av; + av_value = null; + } else { + av_key = av.substr(0,av_sep); + av_value = av.substr(av_sep+1); + } + + av_key = av_key.trim().toLowerCase(); + + if (av_value) { + av_value = av_value.trim(); + } + + switch(av_key) { + case 'expires': // S5.2.1 + if (av_value) { + var exp = parseDate(av_value); + // "If the attribute-value failed to parse as a cookie date, ignore the + // cookie-av." + if (exp) { + // over and underflow not realistically a concern: V8's getTime() seems to + // store something larger than a 32-bit time_t (even with 32-bit node) + c.expires = exp; + } + } + break; + + case 'max-age': // S5.2.2 + if (av_value) { + // "If the first character of the attribute-value is not a DIGIT or a "-" + // character ...[or]... If the remainder of attribute-value contains a + // non-DIGIT character, ignore the cookie-av." + if (/^-?[0-9]+$/.test(av_value)) { + var delta = parseInt(av_value, 10); + // "If delta-seconds is less than or equal to zero (0), let expiry-time + // be the earliest representable date and time." + c.setMaxAge(delta); + } + } + break; + + case 'domain': // S5.2.3 + // "If the attribute-value is empty, the behavior is undefined. However, + // the user agent SHOULD ignore the cookie-av entirely." + if (av_value) { + // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E + // (".") character." + var domain = av_value.trim().replace(/^\./, ''); + if (domain) { + // "Convert the cookie-domain to lower case." + c.domain = domain.toLowerCase(); + } + } + break; + + case 'path': // S5.2.4 + /* + * "If the attribute-value is empty or if the first character of the + * attribute-value is not %x2F ("/"): + * Let cookie-path be the default-path. + * Otherwise: + * Let cookie-path be the attribute-value." + * + * We'll represent the default-path as null since it depends on the + * context of the parsing. + */ + c.path = av_value && av_value[0] === "/" ? av_value : null; + break; + + case 'secure': // S5.2.5 + /* + * "If the attribute-name case-insensitively matches the string "Secure", + * the user agent MUST append an attribute to the cookie-attribute-list + * with an attribute-name of Secure and an empty attribute-value." + */ + c.secure = true; + break; + + case 'httponly': // S5.2.6 -- effectively the same as 'secure' + c.httpOnly = true; + break; + + default: + c.extensions = c.extensions || []; + c.extensions.push(av); + break; + } + } + + return c; +} + +// avoid the V8 deoptimization monster! +function jsonParse(str) { + var obj; + try { + obj = JSON.parse(str); + } catch (e) { + return e; + } + return obj; +} + +function fromJSON(str) { + if (!str) { + return null; + } + + var obj; + if (typeof str === 'string') { + obj = jsonParse(str); + if (obj instanceof Error) { + return null; + } + } else { + // assume it's an Object + obj = str; + } + + var c = new Cookie(); + for (var i=0; i 1) { + var lindex = path.lastIndexOf('/'); + if (lindex === 0) { + break; + } + path = path.substr(0,lindex); + permutations.push(path); + } + permutations.push('/'); + return permutations; +} + +function getCookieContext(url) { + if (url instanceof Object) { + return url; + } + // NOTE: decodeURI will throw on malformed URIs (see GH-32). + // Therefore, we will just skip decoding for such URIs. + try { + url = decodeURI(url); + } + catch(err) { + // Silently swallow error + } + + return urlParse(url); +} + +function Cookie(options) { + options = options || {}; + + Object.keys(options).forEach(function(prop) { + if (Cookie.prototype.hasOwnProperty(prop) && + Cookie.prototype[prop] !== options[prop] && + prop.substr(0,1) !== '_') + { + this[prop] = options[prop]; + } + }, this); + + this.creation = this.creation || new Date(); + + // used to break creation ties in cookieCompare(): + Object.defineProperty(this, 'creationIndex', { + configurable: false, + enumerable: false, // important for assert.deepEqual checks + writable: true, + value: ++Cookie.cookiesCreated + }); +} + +Cookie.cookiesCreated = 0; // incremented each time a cookie is created + +Cookie.parse = parse; +Cookie.fromJSON = fromJSON; + +Cookie.prototype.key = ""; +Cookie.prototype.value = ""; + +// the order in which the RFC has them: +Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity +Cookie.prototype.maxAge = null; // takes precedence over expires for TTL +Cookie.prototype.domain = null; +Cookie.prototype.path = null; +Cookie.prototype.secure = false; +Cookie.prototype.httpOnly = false; +Cookie.prototype.extensions = null; + +// set by the CookieJar: +Cookie.prototype.hostOnly = null; // boolean when set +Cookie.prototype.pathIsDefault = null; // boolean when set +Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse +Cookie.prototype.lastAccessed = null; // Date when set +Object.defineProperty(Cookie.prototype, 'creationIndex', { + configurable: true, + enumerable: false, + writable: true, + value: 0 +}); + +Cookie.serializableProperties = Object.keys(Cookie.prototype) + .filter(function(prop) { + return !( + Cookie.prototype[prop] instanceof Function || + prop === 'creationIndex' || + prop.substr(0,1) === '_' + ); + }); + +Cookie.prototype.inspect = function inspect() { + var now = Date.now(); + return 'Cookie="'+this.toString() + + '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + + '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + + '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + + '"'; +}; + +// Use the new custom inspection symbol to add the custom inspect function if +// available. +if (util.inspect.custom) { + Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect; +} + +Cookie.prototype.toJSON = function() { + var obj = {}; + + var props = Cookie.serializableProperties; + for (var i=0; i=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/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-is/HISTORY.md b/node_modules/type-is/HISTORY.md new file mode 100644 index 00000000..8de21f7a --- /dev/null +++ b/node_modules/type-is/HISTORY.md @@ -0,0 +1,259 @@ +1.6.18 / 2019-04-26 +=================== + + * Fix regression passing request object to `typeis.is` + +1.6.17 / 2019-04-25 +=================== + + * deps: mime-types@~2.1.24 + - Add Apple file extensions from IANA + - Add extension `.csl` to `application/vnd.citationstyles.style+xml` + - Add extension `.es` to `application/ecmascript` + - Add extension `.nq` to `application/n-quads` + - Add extension `.nt` to `application/n-triples` + - Add extension `.owl` to `application/rdf+xml` + - Add extensions `.siv` and `.sieve` to `application/sieve` + - Add extensions from IANA for `image/*` types + - Add extensions from IANA for `model/*` types + - Add extensions to HEIC image types + - Add new mime types + - Add `text/mdx` with extension `.mdx` + * perf: prevent internal `throw` on invalid type + +1.6.16 / 2018-02-16 +=================== + + * deps: mime-types@~2.1.18 + - Add `application/raml+yaml` with extension `.raml` + - Add `application/wasm` with extension `.wasm` + - Add `text/shex` with extension `.shex` + - Add extensions for JPEG-2000 images + - Add extensions from IANA for `message/*` types + - Add extension `.mjs` to `application/javascript` + - Add extension `.wadl` to `application/vnd.sun.wadl+xml` + - Add extension `.gz` to `application/gzip` + - Add glTF types and extensions + - Add new mime types + - Update extensions `.md` and `.markdown` to be `text/markdown` + - Update font MIME types + - Update `text/hjson` to registered `application/hjson` + +1.6.15 / 2017-03-31 +=================== + + * deps: mime-types@~2.1.15 + - Add new mime types + +1.6.14 / 2016-11-18 +=================== + + * deps: mime-types@~2.1.13 + - Add new mime types + +1.6.13 / 2016-05-18 +=================== + + * deps: mime-types@~2.1.11 + - Add new mime types + +1.6.12 / 2016-02-28 +=================== + + * deps: mime-types@~2.1.10 + - Add new mime types + - Fix extension of `application/dash+xml` + - Update primary extension for `audio/mp4` + +1.6.11 / 2016-01-29 +=================== + + * deps: mime-types@~2.1.9 + - Add new mime types + +1.6.10 / 2015-12-01 +=================== + + * deps: mime-types@~2.1.8 + - Add new mime types + +1.6.9 / 2015-09-27 +================== + + * deps: mime-types@~2.1.7 + - Add new mime types + +1.6.8 / 2015-09-04 +================== + + * deps: mime-types@~2.1.6 + - Add new mime types + +1.6.7 / 2015-08-20 +================== + + * Fix type error when given invalid type to match against + * deps: mime-types@~2.1.5 + - Add new mime types + +1.6.6 / 2015-07-31 +================== + + * deps: mime-types@~2.1.4 + - Add new mime types + +1.6.5 / 2015-07-16 +================== + + * deps: mime-types@~2.1.3 + - Add new mime types + +1.6.4 / 2015-07-01 +================== + + * deps: mime-types@~2.1.2 + - Add new mime types + * perf: enable strict mode + * perf: remove argument reassignment + +1.6.3 / 2015-06-08 +================== + + * deps: mime-types@~2.1.1 + - Add new mime types + * perf: reduce try block size + * perf: remove bitwise operations + +1.6.2 / 2015-05-10 +================== + + * deps: mime-types@~2.0.11 + - Add new mime types + +1.6.1 / 2015-03-13 +================== + + * deps: mime-types@~2.0.10 + - Add new mime types + +1.6.0 / 2015-02-12 +================== + + * fix false-positives in `hasBody` `Transfer-Encoding` check + * support wildcard for both type and subtype (`*/*`) + +1.5.7 / 2015-02-09 +================== + + * fix argument reassignment + * deps: mime-types@~2.0.9 + - Add new mime types + +1.5.6 / 2015-01-29 +================== + + * deps: mime-types@~2.0.8 + - Add new mime types + +1.5.5 / 2014-12-30 +================== + + * deps: mime-types@~2.0.7 + - Add new mime types + - Fix missing extensions + - Fix various invalid MIME type entries + - Remove example template MIME types + - deps: mime-db@~1.5.0 + +1.5.4 / 2014-12-10 +================== + + * deps: mime-types@~2.0.4 + - Add new mime types + - deps: mime-db@~1.3.0 + +1.5.3 / 2014-11-09 +================== + + * deps: mime-types@~2.0.3 + - Add new mime types + - deps: mime-db@~1.2.0 + +1.5.2 / 2014-09-28 +================== + + * deps: mime-types@~2.0.2 + - Add new mime types + - deps: mime-db@~1.1.0 + +1.5.1 / 2014-09-07 +================== + + * Support Node.js 0.6 + * deps: media-typer@0.3.0 + * deps: mime-types@~2.0.1 + - Support Node.js 0.6 + +1.5.0 / 2014-09-05 +================== + + * fix `hasbody` to be true for `content-length: 0` + +1.4.0 / 2014-09-02 +================== + + * update mime-types + +1.3.2 / 2014-06-24 +================== + + * use `~` range on mime-types + +1.3.1 / 2014-06-19 +================== + + * fix global variable leak + +1.3.0 / 2014-06-19 +================== + + * improve type parsing + + - invalid media type never matches + - media type not case-sensitive + - extra LWS does not affect results + +1.2.2 / 2014-06-19 +================== + + * fix behavior on unknown type argument + +1.2.1 / 2014-06-03 +================== + + * switch dependency from `mime` to `mime-types@1.0.0` + +1.2.0 / 2014-05-11 +================== + + * support suffix matching: + + - `+json` matches `application/vnd+json` + - `*/vnd+json` matches `application/vnd+json` + - `application/*+json` matches `application/vnd+json` + +1.1.0 / 2014-04-12 +================== + + * add non-array values support + * expose internal utilities: + + - `.is()` + - `.hasBody()` + - `.normalize()` + - `.match()` + +1.0.1 / 2014-03-30 +================== + + * add `multipart` as a shorthand diff --git a/node_modules/type-is/LICENSE b/node_modules/type-is/LICENSE new file mode 100644 index 00000000..386b7b69 --- /dev/null +++ b/node_modules/type-is/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/type-is/README.md b/node_modules/type-is/README.md new file mode 100644 index 00000000..b85ef8f7 --- /dev/null +++ b/node_modules/type-is/README.md @@ -0,0 +1,170 @@ +# type-is + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Infer the content-type of a request. + +### Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install type-is +``` + +## API + +```js +var http = require('http') +var typeis = require('type-is') + +http.createServer(function (req, res) { + var istext = typeis(req, ['text/*']) + res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') +}) +``` + +### typeis(request, types) + +Checks if the `request` is one of the `types`. If the request has no body, +even if there is a `Content-Type` header, then `null` is returned. If the +`Content-Type` header is invalid or does not matches any of the `types`, then +`false` is returned. Otherwise, a string of the type that matched is returned. + +The `request` argument is expected to be a Node.js HTTP request. The `types` +argument is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +// req.headers.content-type = 'application/json' + +typeis(req, ['json']) // => 'json' +typeis(req, ['html', 'json']) // => 'json' +typeis(req, ['application/*']) // => 'application/json' +typeis(req, ['application/json']) // => 'application/json' + +typeis(req, ['html']) // => false +``` + +### typeis.hasBody(request) + +Returns a Boolean if the given `request` has a body, regardless of the +`Content-Type` header. + +Having a body has no relation to how large the body is (it may be 0 bytes). +This is similar to how file existence works. If a body does exist, then this +indicates that there is data to read from the Node.js request stream. + + + +```js +if (typeis.hasBody(req)) { + // read the body, since there is one + + req.on('data', function (chunk) { + // ... + }) +} +``` + +### typeis.is(mediaType, types) + +Checks if the `mediaType` is one of the `types`. If the `mediaType` is invalid +or does not matches any of the `types`, then `false` is returned. Otherwise, a +string of the type that matched is returned. + +The `mediaType` argument is expected to be a +[media type](https://tools.ietf.org/html/rfc6838) string. The `types` argument +is an array of type strings. + +Each type in the `types` array can be one of the following: + +- A file extension name such as `json`. This name will be returned if matched. +- A mime type such as `application/json`. +- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. + The full mime type will be returned if matched. +- A suffix such as `+json`. This can be combined with a wildcard such as + `*/vnd+json` or `application/*+json`. The full mime type will be returned + if matched. + +Some examples to illustrate the inputs and returned value: + + + +```js +var mediaType = 'application/json' + +typeis.is(mediaType, ['json']) // => 'json' +typeis.is(mediaType, ['html', 'json']) // => 'json' +typeis.is(mediaType, ['application/*']) // => 'application/json' +typeis.is(mediaType, ['application/json']) // => 'application/json' + +typeis.is(mediaType, ['html']) // => false +``` + +## Examples + +### Example body parser + +```js +var express = require('express') +var typeis = require('type-is') + +var app = express() + +app.use(function bodyParser (req, res, next) { + if (!typeis.hasBody(req)) { + return next() + } + + switch (typeis(req, ['urlencoded', 'json', 'multipart'])) { + case 'urlencoded': + // parse urlencoded body + throw new Error('implement urlencoded body parsing') + case 'json': + // parse json body + throw new Error('implement json body parsing') + case 'multipart': + // parse multipart body + throw new Error('implement multipart body parsing') + default: + // 415 error code + res.statusCode = 415 + res.end() + break + } +}) +``` + +## License + +[MIT](LICENSE) + +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/type-is/master +[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master +[node-version-image]: https://badgen.net/npm/node/type-is +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/type-is +[npm-url]: https://npmjs.org/package/type-is +[npm-version-image]: https://badgen.net/npm/v/type-is +[travis-image]: https://badgen.net/travis/jshttp/type-is/master +[travis-url]: https://travis-ci.org/jshttp/type-is diff --git a/node_modules/type-is/index.js b/node_modules/type-is/index.js new file mode 100644 index 00000000..890ad76c --- /dev/null +++ b/node_modules/type-is/index.js @@ -0,0 +1,266 @@ +/*! + * type-is + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var typer = require('media-typer') +var mime = require('mime-types') + +/** + * Module exports. + * @public + */ + +module.exports = typeofrequest +module.exports.is = typeis +module.exports.hasBody = hasbody +module.exports.normalize = normalize +module.exports.match = mimeMatch + +/** + * Compare a `value` content-type with `types`. + * Each `type` can be an extension like `html`, + * a special shortcut like `multipart` or `urlencoded`, + * or a mime type. + * + * If no types match, `false` is returned. + * Otherwise, the first `type` that matches is returned. + * + * @param {String} value + * @param {Array} types + * @public + */ + +function typeis (value, types_) { + var i + var types = types_ + + // remove parameters and normalize + var val = tryNormalizeType(value) + + // no type or invalid + if (!val) { + return false + } + + // support flattened arguments + if (types && !Array.isArray(types)) { + types = new Array(arguments.length - 1) + for (i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // no types, return the content type + if (!types || !types.length) { + return val + } + + var type + for (i = 0; i < types.length; i++) { + if (mimeMatch(normalize(type = types[i]), val)) { + return type[0] === '+' || type.indexOf('*') !== -1 + ? val + : type + } + } + + // no matches + return false +} + +/** + * Check if a request has a request body. + * A request with a body __must__ either have `transfer-encoding` + * or `content-length` headers set. + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 + * + * @param {Object} request + * @return {Boolean} + * @public + */ + +function hasbody (req) { + return req.headers['transfer-encoding'] !== undefined || + !isNaN(req.headers['content-length']) +} + +/** + * Check if the incoming request contains the "Content-Type" + * header field, and it contains any of the give mime `type`s. + * If there is no request body, `null` is returned. + * If there is no content type, `false` is returned. + * Otherwise, it returns the first `type` that matches. + * + * Examples: + * + * // With Content-Type: text/html; charset=utf-8 + * this.is('html'); // => 'html' + * this.is('text/html'); // => 'text/html' + * this.is('text/*', 'application/json'); // => 'text/html' + * + * // When Content-Type is application/json + * this.is('json', 'urlencoded'); // => 'json' + * this.is('application/json'); // => 'application/json' + * this.is('html', 'application/*'); // => 'application/json' + * + * this.is('html'); // => false + * + * @param {String|Array} types... + * @return {String|false|null} + * @public + */ + +function typeofrequest (req, types_) { + var types = types_ + + // no body + if (!hasbody(req)) { + return null + } + + // support flattened arguments + if (arguments.length > 2) { + types = new Array(arguments.length - 1) + for (var i = 0; i < types.length; i++) { + types[i] = arguments[i + 1] + } + } + + // request content type + var value = req.headers['content-type'] + + return typeis(value, types) +} + +/** + * Normalize a mime type. + * If it's a shorthand, expand it to a valid mime type. + * + * In general, you probably want: + * + * var type = is(req, ['urlencoded', 'json', 'multipart']); + * + * Then use the appropriate body parsers. + * These three are the most common request body types + * and are thus ensured to work. + * + * @param {String} type + * @private + */ + +function normalize (type) { + if (typeof type !== 'string') { + // invalid type + return false + } + + switch (type) { + case 'urlencoded': + return 'application/x-www-form-urlencoded' + case 'multipart': + return 'multipart/*' + } + + if (type[0] === '+') { + // "+json" -> "*/*+json" expando + return '*/*' + type + } + + return type.indexOf('/') === -1 + ? mime.lookup(type) + : type +} + +/** + * Check if `expected` mime type + * matches `actual` mime type with + * wildcard and +suffix support. + * + * @param {String} expected + * @param {String} actual + * @return {Boolean} + * @private + */ + +function mimeMatch (expected, actual) { + // invalid type + if (expected === false) { + return false + } + + // split types + var actualParts = actual.split('/') + var expectedParts = expected.split('/') + + // invalid format + if (actualParts.length !== 2 || expectedParts.length !== 2) { + return false + } + + // validate type + if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { + return false + } + + // validate suffix wildcard + if (expectedParts[1].substr(0, 2) === '*+') { + return expectedParts[1].length <= actualParts[1].length + 1 && + expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) + } + + // validate subtype + if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { + return false + } + + return true +} + +/** + * Normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function normalizeType (value) { + // parse the type + var type = typer.parse(value) + + // remove the parameters + type.parameters = undefined + + // reformat it + return typer.format(type) +} + +/** + * Try to normalize a type and remove parameters. + * + * @param {string} value + * @return {string} + * @private + */ + +function tryNormalizeType (value) { + if (!value) { + return null + } + + try { + return normalizeType(value) + } catch (err) { + return null + } +} diff --git a/node_modules/type-is/package.json b/node_modules/type-is/package.json new file mode 100644 index 00000000..97ba5f14 --- /dev/null +++ b/node_modules/type-is/package.json @@ -0,0 +1,45 @@ +{ + "name": "type-is", + "description": "Infer the content-type of a request.", + "version": "1.6.18", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "repository": "jshttp/type-is", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "devDependencies": { + "eslint": "5.16.0", + "eslint-config-standard": "12.0.0", + "eslint-plugin-import": "2.17.2", + "eslint-plugin-markdown": "1.0.0", + "eslint-plugin-node": "8.0.1", + "eslint-plugin-promise": "4.1.1", + "eslint-plugin-standard": "4.0.0", + "mocha": "6.1.4", + "nyc": "14.0.0" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "index.js" + ], + "scripts": { + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-travis": "nyc --reporter=text npm test" + }, + "keywords": [ + "content", + "type", + "checking" + ] +} diff --git a/node_modules/uglify-js/LICENSE b/node_modules/uglify-js/LICENSE new file mode 100644 index 00000000..dd7706f0 --- /dev/null +++ b/node_modules/uglify-js/LICENSE @@ -0,0 +1,29 @@ +UglifyJS is released under the BSD license: + +Copyright 2012-2013 (c) Mihai Bazon + +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. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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/uglify-js/README.md b/node_modules/uglify-js/README.md new file mode 100644 index 00000000..8a34f6e4 --- /dev/null +++ b/node_modules/uglify-js/README.md @@ -0,0 +1,1100 @@ +UglifyJS 3 +========== + +UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit. + +#### Note: +- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS2/tree/v2.x)**. +- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS2/tree/v2.x)**. +- `uglify-js` only supports ECMAScript 5 (ES5). +- Those wishing to minify +ES2015+ (ES6+) should use the `npm` package [**uglify-es**](https://github.com/mishoo/UglifyJS2/tree/harmony). + +Install +------- + +First make sure you have installed the latest version of [node.js](http://nodejs.org/) +(You may need to restart your computer after this step). + +From NPM for use as a command line app: + + npm install uglify-js -g + +From NPM for programmatic use: + + npm install uglify-js + +# Command line usage + + uglifyjs [input files] [options] + +UglifyJS can take multiple input files. It's recommended that you pass the +input files first, then pass the options. UglifyJS will parse input files +in sequence and apply any compression options. The files are parsed in the +same global scope, that is, a reference from a file to some +variable/function declared in another file will be matched properly. + +If no input file is specified, UglifyJS will read from STDIN. + +If you wish to pass your options before the input files, separate the two with +a double dash to prevent input files being used as option arguments: + + uglifyjs --compress --mangle -- input.js + +### Command line options + +``` + -h, --help Print usage information. + `--help options` for details on available options. + -V, --version Print version number. + -p, --parse Specify parser options: + `acorn` Use Acorn for parsing. + `bare_returns` Allow return outside of functions. + Useful when minifying CommonJS + modules and Userscripts that may + be anonymous function wrapped (IIFE) + by the .user.js engine `caller`. + `expression` Parse a single expression, rather than + a program (for parsing JSON). + `spidermonkey` Assume input files are SpiderMonkey + AST format (as JSON). + -c, --compress [options] Enable compressor/specify compressor options: + `pure_funcs` List of functions that can be safely + removed when their return values are + not used. + -m, --mangle [options] Mangle names/specify mangler options: + `reserved` List of names that should not be mangled. + --mangle-props [options] Mangle properties/specify mangler options: + `builtins` Mangle property names that overlaps + with standard JavaScript globals. + `debug` Add debug prefix and suffix. + `domprops` Mangle property names that overlaps + with DOM properties. + `keep_quoted` Only mangle unquoted properies. + `regex` Only mangle matched property names. + `reserved` List of names that should not be mangled. + -b, --beautify [options] Beautify output/specify output options: + `beautify` Enabled with `--beautify` by default. + `preamble` Preamble to prepend to the output. You + can use this to insert a comment, for + example for licensing information. + This will not be parsed, but the source + map will adjust for its presence. + `quote_style` Quote style: + 0 - auto + 1 - single + 2 - double + 3 - original + `wrap_iife` Wrap IIFEs in parenthesis. Note: you may + want to disable `negate_iife` under + compressor options. + -o, --output Output file path (default STDOUT). Specify `ast` or + `spidermonkey` to write UglifyJS or SpiderMonkey AST + as JSON to STDOUT respectively. + --comments [filter] Preserve copyright comments in the output. By + default this works like Google Closure, keeping + JSDoc-style comments that contain "@license" or + "@preserve". You can optionally pass one of the + following arguments to this flag: + - "all" to keep all comments + - a valid JS RegExp like `/foo/` or `/^!/` to + keep only matching comments. + Note that currently not *all* comments can be + kept when compression is on, because of dead + code removal or cascading statements into + sequences. + --config-file Read `minify()` options from JSON file. + -d, --define [=value] Global definitions. + --ie8 Support non-standard Internet Explorer 8. + Equivalent to setting `ie8: true` in `minify()` + for `compress`, `mangle` and `output` options. + By default UglifyJS will not try to be IE-proof. + --keep-fnames Do not mangle/drop function names. Useful for + code relying on Function.prototype.name. + --name-cache File to hold mangled name mappings. + --self Build UglifyJS as a library (implies --wrap UglifyJS) + --source-map [options] Enable source map/specify source map options: + `base` Path to compute relative paths from input files. + `content` Input source map, useful if you're compressing + JS that was generated from some other original + code. Specify "inline" if the source map is + included within the sources. + `filename` Name and/or location of the output source. + `includeSources` Pass this flag if you want to include + the content of source files in the + source map as sourcesContent property. + `root` Path to the original source to be included in + the source map. + `url` If specified, path to the source map to append in + `//# sourceMappingURL`. + --timings Display operations run time on STDERR. + --toplevel Compress and/or mangle variables in top level scope. + --verbose Print diagnostic messages. + --warn Print warning messages. + --wrap Embed everything in a big function, making the + “exports” and “global” variables available. You + need to pass an argument to this option to + specify the name that your module will take + when included in, say, a browser. +``` + +Specify `--output` (`-o`) to declare the output file. Otherwise the output +goes to STDOUT. + +## CLI source map options + +UglifyJS can generate a source map file, which is highly useful for +debugging your compressed JavaScript. To get a source map, pass +`--source-map --output output.js` (source map will be written out to +`output.js.map`). + +Additional options: + +- `--source-map "filename=''"` to specify the name of the source map. + +- `--source-map "root=''"` to pass the URL where the original files can be found. + +- `--source-map "url=''"` to specify the URL where the source map can be found. + Otherwise UglifyJS assumes HTTP `X-SourceMap` is being used and will omit the + `//# sourceMappingURL=` directive. + +For example: + + uglifyjs js/file1.js js/file2.js \ + -o foo.min.js -c -m \ + --source-map "root='http://foo.com/src',url='foo.min.js.map'" + +The above will compress and mangle `file1.js` and `file2.js`, will drop the +output in `foo.min.js` and the source map in `foo.min.js.map`. The source +mapping will refer to `http://foo.com/src/js/file1.js` and +`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src` +as the source map root, and the original files as `js/file1.js` and +`js/file2.js`). + +### Composed source map + +When you're compressing JS code that was output by a compiler such as +CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd +like to map back to the original code (i.e. CoffeeScript). UglifyJS has an +option to take an input source map. Assuming you have a mapping from +CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript → +compressed JS by mapping every token in the compiled JS to its original +location. + +To use this feature pass `--source-map "content='/path/to/input/source.map'"` +or `--source-map "content=inline"` if the source map is included inline with +the sources. + +## CLI compress options + +You need to pass `--compress` (`-c`) to enable the compressor. Optionally +you can pass a comma-separated list of [compress options](#compress-options). + +Options are in the form `foo=bar`, or just `foo` (the latter implies +a boolean option that you want to set `true`; it's effectively a +shortcut for `foo=true`). + +Example: + + uglifyjs file.js -c toplevel,sequences=false + +## CLI mangle options + +To enable the mangler you need to pass `--mangle` (`-m`). The following +(comma-separated) options are supported: + +- `toplevel` (default `false`) -- mangle names declared in the top level scope. + +- `eval` (default `false`) -- mangle names visible in scopes where `eval` or `with` are used. + +When mangling is enabled but you want to prevent certain names from being +mangled, you can declare those names with `--mangle reserved` — pass a +comma-separated list of names. For example: + + uglifyjs ... -m reserved=['$','require','exports'] + +to prevent the `require`, `exports` and `$` names from being changed. + +### CLI mangling property names (`--mangle-props`) + +**Note:** THIS WILL PROBABLY BREAK YOUR CODE. Mangling property names +is a separate step, different from variable name mangling. Pass +`--mangle-props` to enable it. It will mangle all properties in the +input code with the exception of built in DOM properties and properties +in core JavaScript classes. For example: + +```javascript +// example.js +var x = { + baz_: 0, + foo_: 1, + calc: function() { + return this.foo_ + this.baz_; + } +}; +x.bar_ = 2; +x["baz_"] = 3; +console.log(x.calc()); +``` +Mangle all properties (except for JavaScript `builtins`): +```bash +$ uglifyjs example.js -c -m --mangle-props +``` +```javascript +var x={o:0,_:1,l:function(){return this._+this.o}};x.t=2,x.o=3,console.log(x.l()); +``` +Mangle all properties except for `reserved` properties: +```bash +$ uglifyjs example.js -c -m --mangle-props reserved=[foo_,bar_] +``` +```javascript +var x={o:0,foo_:1,_:function(){return this.foo_+this.o}};x.bar_=2,x.o=3,console.log(x._()); +``` +Mangle all properties matching a `regex`: +```bash +$ uglifyjs example.js -c -m --mangle-props regex=/_$/ +``` +```javascript +var x={o:0,_:1,calc:function(){return this._+this.o}};x.l=2,x.o=3,console.log(x.calc()); +``` + +Combining mangle properties options: +```bash +$ uglifyjs example.js -c -m --mangle-props regex=/_$/,reserved=[bar_] +``` +```javascript +var x={o:0,_:1,calc:function(){return this._+this.o}};x.bar_=2,x.o=3,console.log(x.calc()); +``` + +In order for this to be of any use, we avoid mangling standard JS names by +default (`--mangle-props builtins` to override). + +A default exclusion file is provided in `tools/domprops.json` which should +cover most standard JS and DOM properties defined in various browsers. Pass +`--mangle-props domprops` to disable this feature. + +A regular expression can be used to define which property names should be +mangled. For example, `--mangle-props regex=/^_/` will only mangle property +names that start with an underscore. + +When you compress multiple files using this option, in order for them to +work together in the end we need to ensure somehow that one property gets +mangled to the same name in all of them. For this, pass `--name-cache filename.json` +and UglifyJS will maintain these mappings in a file which can then be reused. +It should be initially empty. Example: + +```bash +$ rm -f /tmp/cache.json # start fresh +$ uglifyjs file1.js file2.js --mangle-props --name-cache /tmp/cache.json -o part1.js +$ uglifyjs file3.js file4.js --mangle-props --name-cache /tmp/cache.json -o part2.js +``` + +Now, `part1.js` and `part2.js` will be consistent with each other in terms +of mangled property names. + +Using the name cache is not necessary if you compress all your files in a +single call to UglifyJS. + +### Mangling unquoted names (`--mangle-props keep_quoted`) + +Using quoted property name (`o["foo"]`) reserves the property name (`foo`) +so that it is not mangled throughout the entire script even when used in an +unquoted style (`o.foo`). Example: + +```javascript +// stuff.js +var o = { + "foo": 1, + bar: 3 +}; +o.foo += o.bar; +console.log(o.foo); +``` +```bash +$ uglifyjs stuff.js --mangle-props keep_quoted -c -m +``` +```javascript +var o={foo:1,o:3};o.foo+=o.o,console.log(o.foo); +``` + +### Debugging property name mangling + +You can also pass `--mangle-props debug` in order to mangle property names +without completely obscuring them. For example the property `o.foo` +would mangle to `o._$foo$_` with this option. This allows property mangling +of a large codebase while still being able to debug the code and identify +where mangling is breaking things. + +```bash +$ uglifyjs stuff.js --mangle-props debug -c -m +``` +```javascript +var o={_$foo$_:1,_$bar$_:3};o._$foo$_+=o._$bar$_,console.log(o._$foo$_); +``` + +You can also pass a custom suffix using `--mangle-props debug=XYZ`. This would then +mangle `o.foo` to `o._$foo$XYZ_`. You can change this each time you compile a +script to identify how a property got mangled. One technique is to pass a +random number on every compile to simulate mangling changing with different +inputs (e.g. as you update the input script with new properties), and to help +identify mistakes like writing mangled keys to storage. + + +# API Reference + +Assuming installation via NPM, you can load UglifyJS in your application +like this: +```javascript +var UglifyJS = require("uglify-js"); +``` + +There is a single high level function, **`minify(code, options)`**, +which will perform all minification [phases](#minify-options) in a configurable +manner. By default `minify()` will enable the options [`compress`](#compress-options) +and [`mangle`](#mangle-options). Example: +```javascript +var code = "function add(first, second) { return first + second; }"; +var result = UglifyJS.minify(code); +console.log(result.error); // runtime error, or `undefined` if no error +console.log(result.code); // minified output: function add(n,d){return n+d} +``` + +You can `minify` more than one JavaScript file at a time by using an object +for the first argument where the keys are file names and the values are source +code: +```javascript +var code = { + "file1.js": "function add(first, second) { return first + second; }", + "file2.js": "console.log(add(1 + 2, 3 + 4));" +}; +var result = UglifyJS.minify(code); +console.log(result.code); +// function add(d,n){return d+n}console.log(add(3,7)); +``` + +The `toplevel` option: +```javascript +var code = { + "file1.js": "function add(first, second) { return first + second; }", + "file2.js": "console.log(add(1 + 2, 3 + 4));" +}; +var options = { toplevel: true }; +var result = UglifyJS.minify(code, options); +console.log(result.code); +// console.log(3+7); +``` + +The `nameCache` option: +```javascript +var options = { + mangle: { + toplevel: true, + }, + nameCache: {} +}; +var result1 = UglifyJS.minify({ + "file1.js": "function add(first, second) { return first + second; }" +}, options); +var result2 = UglifyJS.minify({ + "file2.js": "console.log(add(1 + 2, 3 + 4));" +}, options); +console.log(result1.code); +// function n(n,r){return n+r} +console.log(result2.code); +// console.log(n(3,7)); +``` + +You may persist the name cache to the file system in the following way: +```javascript +var cacheFileName = "/tmp/cache.json"; +var options = { + mangle: { + properties: true, + }, + nameCache: JSON.parse(fs.readFileSync(cacheFileName, "utf8")) +}; +fs.writeFileSync("part1.js", UglifyJS.minify({ + "file1.js": fs.readFileSync("file1.js", "utf8"), + "file2.js": fs.readFileSync("file2.js", "utf8") +}, options).code, "utf8"); +fs.writeFileSync("part2.js", UglifyJS.minify({ + "file3.js": fs.readFileSync("file3.js", "utf8"), + "file4.js": fs.readFileSync("file4.js", "utf8") +}, options).code, "utf8"); +fs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), "utf8"); +``` + +An example of a combination of `minify()` options: +```javascript +var code = { + "file1.js": "function add(first, second) { return first + second; }", + "file2.js": "console.log(add(1 + 2, 3 + 4));" +}; +var options = { + toplevel: true, + compress: { + global_defs: { + "@console.log": "alert" + }, + passes: 2 + }, + output: { + beautify: false, + preamble: "/* uglified */" + } +}; +var result = UglifyJS.minify(code, options); +console.log(result.code); +// /* uglified */ +// alert(10);" +``` + +To produce warnings: +```javascript +var code = "function f(){ var u; return 2 + 3; }"; +var options = { warnings: true }; +var result = UglifyJS.minify(code, options); +console.log(result.error); // runtime error, `undefined` in this case +console.log(result.warnings); // [ 'Dropping unused variable u [0:1,18]' ] +console.log(result.code); // function f(){return 5} +``` + +An error example: +```javascript +var result = UglifyJS.minify({"foo.js" : "if (0) else console.log(1);"}); +console.log(JSON.stringify(result.error)); +// {"message":"Unexpected token: keyword (else)","filename":"foo.js","line":1,"col":7,"pos":7} +``` +Note: unlike `uglify-js@2.x`, the `3.x` API does not throw errors. To +achieve a similar effect one could do the following: +```javascript +var result = UglifyJS.minify(code, options); +if (result.error) throw result.error; +``` + +## Minify options + +- `warnings` (default `false`) — pass `true` to return compressor warnings + in `result.warnings`. Use the value `"verbose"` for more detailed warnings. + +- `parse` (default `{}`) — pass an object if you wish to specify some + additional [parse options](#parse-options). + +- `compress` (default `{}`) — pass `false` to skip compressing entirely. + Pass an object to specify custom [compress options](#compress-options). + +- `mangle` (default `true`) — pass `false` to skip mangling names, or pass + an object to specify [mangle options](#mangle-options) (see below). + + - `mangle.properties` (default `false`) — a subcategory of the mangle option. + Pass an object to specify custom [mangle property options](#mangle-properties-options). + +- `output` (default `null`) — pass an object if you wish to specify + additional [output options](#output-options). The defaults are optimized + for best compression. + +- `sourceMap` (default `false`) - pass an object if you wish to specify + [source map options](#source-map-options). + +- `toplevel` (default `false`) - set to `true` if you wish to enable top level + variable and function name mangling and to drop unused variables and functions. + +- `nameCache` (default `null`) - pass an empty object `{}` or a previously + used `nameCache` object if you wish to cache mangled variable and + property names across multiple invocations of `minify()`. Note: this is + a read/write property. `minify()` will read the name cache state of this + object and update it during minification so that it may be + reused or externally persisted by the user. + +- `ie8` (default `false`) - set to `true` to support IE8. + +- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling + of function names. Useful for code relying on `Function.prototype.name`. + +## Minify options structure + +```javascript +{ + parse: { + // parse options + }, + compress: { + // compress options + }, + mangle: { + // mangle options + + properties: { + // mangle property options + } + }, + output: { + // output options + }, + sourceMap: { + // source map options + }, + nameCache: null, // or specify a name cache object + toplevel: false, + ie8: false, + warnings: false, +} +``` + +### Source map options + +To generate a source map: +```javascript +var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, { + sourceMap: { + filename: "out.js", + url: "out.js.map" + } +}); +console.log(result.code); // minified output +console.log(result.map); // source map +``` + +Note that the source map is not saved in a file, it's just returned in +`result.map`. The value passed for `sourceMap.url` is only used to set +`//# sourceMappingURL=out.js.map` in `result.code`. The value of +`filename` is only used to set `file` attribute (see [the spec][sm-spec]) +in source map file. + +You can set option `sourceMap.url` to be `"inline"` and source map will +be appended to code. + +You can also specify sourceRoot property to be included in source map: +```javascript +var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, { + sourceMap: { + root: "http://example.com/src", + url: "out.js.map" + } +}); +``` + +If you're compressing compiled JavaScript and have a source map for it, you +can use `sourceMap.content`: +```javascript +var result = UglifyJS.minify({"compiled.js": "compiled code"}, { + sourceMap: { + content: "content from compiled.js.map", + url: "minified.js.map" + } +}); +// same as before, it returns `code` and `map` +``` + +If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.url`. + +## Parse options + +- `bare_returns` (default `false`) -- support top level `return` statements + +- `html5_comments` (default `true`) + +- `shebang` (default `true`) -- support `#!command` as the first line + +## Compress options + +- `booleans` (default: `true`) -- various optimizations for boolean context, + for example `!!a ? b : c → a ? b : c` + +- `cascade` (default: `true`) -- small optimization for sequences, transform + `x, x` into `x` and `x = something(), x` into `x = something()` + +- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables, + side effects permitting. + +- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes, + e.g. `!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary + nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc. + +- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional + expressions + +- `dead_code` (default: `true`) -- remove unreachable code + +- `drop_console` (default: `false`) -- Pass `true` to discard calls to + `console.*` functions. If you wish to drop a specific function call + such as `console.info` and/or retain side effects from function arguments + after dropping the function call then use `pure_funcs` instead. + +- `drop_debugger` (default: `true`) -- remove `debugger;` statements + +- `evaluate` (default: `true`) -- attempt to evaluate constant expressions + +- `expression` (default: `false`) -- Pass `true` to preserve completion values + from terminal statements without `return`, e.g. in bookmarklets. + +- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation) + +- `hoist_funs` (default: `true`) -- hoist function declarations + +- `hoist_props` (default: `true`) -- hoist properties from constant object and + array literals into regular variables subject to a set of constraints. For example: + `var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props` + works best with `mangle` enabled, the `compress` option `passes` set to `2` or higher, + and the `compress` option `toplevel` enabled. + +- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false` + by default because it seems to increase the size of the output in general) + +- `if_return` (default: `true`) -- optimizations for if/return and if/continue + +- `inline` (default: `true`) -- embed simple functions + +- `join_vars` (default: `true`) -- join consecutive `var` statements + +- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused + function arguments. You need this for code which relies on `Function.length`. + +- `keep_fnames` (default: `false`) -- Pass `true` to prevent the + compressor from discarding function names. Useful for code relying on + `Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle). + +- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from + being compressed into `1/0`, which may cause performance issues on Chrome. + +- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops + when we can statically determine the condition. + +- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions" + where the return value is discarded, to avoid the parens that the + code generator would insert. + +- `passes` (default: `1`) -- The maximum number of times to run compress. + In some cases more than one pass leads to further compressed code. Keep in + mind more passes will take more time. + +- `properties` (default: `true`) -- rewrite property access using the dot notation, for + example `foo["bar"] → foo.bar` + +- `pure_funcs` (default: `null`) -- You can pass an array of names and + UglifyJS will assume that those functions do not produce side + effects. DANGER: will not check if the name is redefined in scope. + An example case here, for instance `var q = Math.floor(a/b)`. If + variable `q` is not used elsewhere, UglifyJS will drop it, but will + still keep the `Math.floor(a/b)`, not knowing what it does. You can + pass `pure_funcs: [ 'Math.floor' ]` to let it know that this + function won't produce any side effect, in which case the whole + statement would get discarded. The current implementation adds some + overhead (compression will be slower). + +- `pure_getters` (default: `"strict"`) -- If you pass `true` for + this, UglifyJS will assume that object property access + (e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects. + Specify `"strict"` to treat `foo.bar` as side-effect-free only when + `foo` is certain to not throw, i.e. not `null` or `undefined`. + +- `reduce_funcs` (default: `true`) -- Allows single-use functions to be + inlined as function expressions when permissible allowing further + optimization. Enabled by default. Option depends on `reduce_vars` + being enabled. Some code runs faster in the Chrome V8 engine if this + option is disabled. Does not negatively impact other major browsers. + +- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and + used as constant values. + +- `sequences` (default: `true`) -- join consecutive simple statements using the + comma operator. May be set to a positive integer to specify the maximum number + of consecutive comma sequences that will be generated. If this option is set to + `true` then the default `sequences` limit is `200`. Set option to `false` or `0` + to disable. The smallest `sequences` length is `2`. A `sequences` value of `1` + is grandfathered to be equivalent to `true` and as such means `200`. On rare + occasions the default sequences limit leads to very slow compress times in which + case a value of `20` or less is recommended. + +- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping + functions marked as "pure". A function call is marked as "pure" if a comment + annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For + example: `/*@__PURE__*/foo();` + +- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches + +- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or + variables (`"vars"`) in the top level scope (`false` by default, `true` to drop + both unreferenced functions and variables) + +- `top_retain` (default: `null`) -- prevent specific toplevel functions and + variables from `unused` removal (can be array, comma-separated, RegExp or + function. Implies `toplevel`) + +- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into + `foo === void 0`. Note: recommend to set this value to `false` for IE10 and + earlier versions due to known issues. + +- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below) + +- `unsafe_comps` (default: `false`) -- Reverse `<` and `<=` to `>` and `>=` to + allow improved compression. This might be unsafe when an at least one of two + operands is an object with computed values due the use of methods like `get`, + or `valueOf`. This could cause change in execution order after operands in the + comparison are switching. Compression only works if both `comparisons` and + `unsafe_comps` are both set to true. + +- `unsafe_Func` (default: `false`) -- compress and mangle `Function(args, code)` + when both `args` and `code` are string literals. + +- `unsafe_math` (default: `false`) -- optimize numerical expressions like + `2 * x * 3` into `6 * x`, which may give imprecise floating point results. + +- `unsafe_proto` (default: `false`) -- optimize expressions like + `Array.prototype.slice.call(a)` into `[].slice.call(a)` + +- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with + `RegExp` values the same way as if they are constants. + +- `unused` (default: `true`) -- drop unreferenced functions and variables (simple + direct variable assignments do not count as references unless set to `"keep_assign"`) + +- `warnings` (default: `false`) -- display warnings when dropping unreachable + code or unused declarations etc. + +## Mangle options + +- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes + where `eval` or `with` are used. + +- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names. + Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames` + [compress option](#compress-options). + +- `reserved` (default `[]`) -- Pass an array of identifiers that should be + excluded from mangling. Example: `["foo", "bar"]`. + +- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the + top level scope. + +Examples: + +```javascript +// test.js +var globalVar; +function funcName(firstLongName, anotherLongName) { + var myVariable = firstLongName + anotherLongName; +} +``` +```javascript +var code = fs.readFileSync("test.js", "utf8"); + +UglifyJS.minify(code).code; +// 'function funcName(a,n){}var globalVar;' + +UglifyJS.minify(code, { mangle: { reserved: ['firstLongName'] } }).code; +// 'function funcName(firstLongName,a){}var globalVar;' + +UglifyJS.minify(code, { mangle: { toplevel: true } }).code; +// 'function n(n,a){}var a;' +``` + +### Mangle properties options + +- `builtins` (default: `false`) -- Use `true` to allow the mangling of builtin + DOM properties. Not recommended to override this setting. + +- `debug` (default: `false`) -— Mangle names with the original name still present. + Pass an empty string `""` to enable, or a non-empty string to set the debug suffix. + +- `keep_quoted` (default: `false`) -— Only mangle unquoted property names. + +- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property + names matching the regular expression. + +- `reserved` (default: `[]`) -- Do not mangle property names listed in the + `reserved` array. + +## Output options + +The code generator tries to output shortest code possible by default. In +case you want beautified output, pass `--beautify` (`-b`). Optionally you +can pass additional arguments that control the code output: + +- `ascii_only` (default `false`) -- escape Unicode characters in strings and + regexps (affects directives with non-ascii characters becoming invalid) + +- `beautify` (default `true`) -- whether to actually beautify the output. + Passing `-b` will set this to true, but you might need to pass `-b` even + when you want to generate minified code, in order to specify additional + arguments, so you can use `-b beautify=false` to override it. + +- `bracketize` (default `false`) -- always insert brackets in `if`, `for`, + `do`, `while` or `with` statements, even if their body is a single + statement. + +- `comments` (default `false`) -- pass `true` or `"all"` to preserve all + comments, `"some"` to preserve some comments, a regular expression string + (e.g. `/^!/`) or a function. + +- `indent_level` (default `4`) + +- `indent_start` (default `0`) -- prefix all lines by that many spaces + +- `inline_script` (default `false`) -- escape the slash in occurrences of + `= 0) program.helpInformation = UglifyJS.describe_ast; +else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() { + var text = []; + var options = UglifyJS.default_options(); + for (var option in options) { + text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:"); + text.push(format_object(options[option])); + text.push(""); + } + return text.join("\n"); +}; +program.option("-p, --parse ", "Specify parser options.", parse_js()); +program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js()); +program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js()); +program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js()); +program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js()); +program.option("-o, --output ", "Output file (default STDOUT)."); +program.option("--comments [filter]", "Preserve copyright comments in the output."); +program.option("--config-file ", "Read minify() options from JSON file."); +program.option("-d, --define [=value]", "Global definitions.", parse_js("define")); +program.option("--ie8", "Support non-standard Internet Explorer 8."); +program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name."); +program.option("--name-cache ", "File to hold mangled name mappings."); +program.option("--no-rename", "Disable symbol expansion."); +program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)"); +program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map()); +program.option("--timings", "Display operations run time on STDERR.") +program.option("--toplevel", "Compress and/or mangle variables in toplevel scope."); +program.option("--verbose", "Print diagnostic messages."); +program.option("--warn", "Print warning messages."); +program.option("--wrap ", "Embed everything as a function with “exports” corresponding to “name” globally."); +program.arguments("[files...]").parseArgv(process.argv); +if (program.configFile) { + options = JSON.parse(read_file(program.configFile)); +} +if (!program.output && program.sourceMap && program.sourceMap.url != "inline") { + fatal("ERROR: cannot write source map to STDOUT"); +} +[ + "compress", + "ie8", + "mangle", + "rename", + "sourceMap", + "toplevel", + "wrap" +].forEach(function(name) { + if (name in program) { + if (name == "rename" && program[name]) return; + options[name] = program[name]; + } +}); +if (program.beautify) { + options.output = typeof program.beautify == "object" ? program.beautify : {}; + if (!("beautify" in options.output)) { + options.output.beautify = true; + } +} +if (program.comments) { + if (typeof options.output != "object") options.output = {}; + options.output.comments = typeof program.comments == "string" ? program.comments : "some"; +} +if (program.define) { + if (typeof options.compress != "object") options.compress = {}; + if (typeof options.compress.global_defs != "object") options.compress.global_defs = {}; + for (var expr in program.define) { + options.compress.global_defs[expr] = program.define[expr]; + } +} +if (program.keepFnames) { + options.keep_fnames = true; +} +if (program.mangleProps) { + if (program.mangleProps.domprops) { + delete program.mangleProps.domprops; + } else { + if (typeof program.mangleProps != "object") program.mangleProps = {}; + if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = []; + require("../tools/domprops").forEach(function(name) { + UglifyJS._push_uniq(program.mangleProps.reserved, name); + }); + } + if (typeof options.mangle != "object") options.mangle = {}; + options.mangle.properties = program.mangleProps; +} +if (program.nameCache) { + options.nameCache = JSON.parse(read_file(program.nameCache, "{}")); +} +if (program.output == "ast") { + options.output = { + ast: true, + code: false + }; +} +if (program.parse) { + if (!program.parse.acorn && !program.parse.spidermonkey) { + options.parse = program.parse; + } else if (program.sourceMap && program.sourceMap.content == "inline") { + fatal("ERROR: inline source map only works with built-in parser"); + } +} +var convert_path = function(name) { + return name; +}; +if (typeof program.sourceMap == "object" && "base" in program.sourceMap) { + convert_path = function() { + var base = program.sourceMap.base; + delete options.sourceMap.base; + return function(name) { + return path.relative(base, name); + }; + }(); +} +if (program.verbose) { + options.warnings = "verbose"; +} else if (program.warn) { + options.warnings = true; +} +if (program.self) { + if (program.args.length) { + print_error("WARN: Ignoring input files since --self was passed"); + } + if (!options.wrap) options.wrap = "UglifyJS"; + simple_glob(UglifyJS.FILES).forEach(function(name) { + files[convert_path(name)] = read_file(name); + }); + run(); +} else if (program.args.length) { + simple_glob(program.args).forEach(function(name) { + files[convert_path(name)] = read_file(name); + }); + run(); +} else { + var chunks = []; + process.stdin.setEncoding("utf8"); + process.stdin.on("data", function(chunk) { + chunks.push(chunk); + }).on("end", function() { + files = [ chunks.join("") ]; + run(); + }); + process.stdin.resume(); +} + +function convert_ast(fn) { + return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null)); +} + +function run() { + UglifyJS.AST_Node.warn_function = function(msg) { + print_error("WARN: " + msg); + }; + if (program.timings) options.timings = true; + try { + if (program.parse) { + if (program.parse.acorn) { + files = convert_ast(function(toplevel, name) { + return require("acorn").parse(files[name], { + locations: true, + program: toplevel, + sourceFile: name + }); + }); + } else if (program.parse.spidermonkey) { + files = convert_ast(function(toplevel, name) { + var obj = JSON.parse(files[name]); + if (!toplevel) return obj; + toplevel.body = toplevel.body.concat(obj.body); + return toplevel; + }); + } + } + } catch (ex) { + fatal(ex); + } + var result = UglifyJS.minify(files, options); + if (result.error) { + var ex = result.error; + if (ex.name == "SyntaxError") { + print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col); + var col = ex.col; + var lines = files[ex.filename].split(/\r?\n/); + var line = lines[ex.line - 1]; + if (!line && !col) { + line = lines[ex.line - 2]; + col = line.length; + } + if (line) { + var limit = 70; + if (col > limit) { + line = line.slice(col - limit); + col = limit; + } + print_error(line.slice(0, 80)); + print_error(line.slice(0, col).replace(/\S/g, " ") + "^"); + } + } + if (ex.defs) { + print_error("Supported options:"); + print_error(format_object(ex.defs)); + } + fatal(ex); + } else if (program.output == "ast") { + print(JSON.stringify(result.ast, function(key, value) { + if (skip_key(key)) return; + if (value instanceof UglifyJS.AST_Token) return; + if (value instanceof UglifyJS.Dictionary) return; + if (value instanceof UglifyJS.AST_Node) { + var result = { + _class: "AST_" + value.TYPE + }; + value.CTOR.PROPS.forEach(function(prop) { + result[prop] = value[prop]; + }); + return result; + } + return value; + }, 2)); + } else if (program.output == "spidermonkey") { + print(JSON.stringify(UglifyJS.minify(result.code, { + compress: false, + mangle: false, + output: { + ast: true, + code: false + } + }).ast.to_mozilla_ast(), null, 2)); + } else if (program.output) { + fs.writeFileSync(program.output, result.code); + if (result.map) { + fs.writeFileSync(program.output + ".map", result.map); + } + } else { + print(result.code); + } + if (program.nameCache) { + fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache)); + } + if (result.timings) for (var phase in result.timings) { + print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s"); + } +} + +function fatal(message) { + if (message instanceof Error) message = message.stack.replace(/^\S*?Error:/, "ERROR:") + print_error(message); + process.exit(1); +} + +// A file glob function that only supports "*" and "?" wildcards in the basename. +// Example: "foo/bar/*baz??.*.js" +// Argument `glob` may be a string or an array of strings. +// Returns an array of strings. Garbage in, garbage out. +function simple_glob(glob) { + if (Array.isArray(glob)) { + return [].concat.apply([], glob.map(simple_glob)); + } + if (glob.match(/\*|\?/)) { + var dir = path.dirname(glob); + try { + var entries = fs.readdirSync(dir); + } catch (ex) {} + if (entries) { + var pattern = "^" + path.basename(glob) + .replace(/[.+^$[\]\\(){}]/g, "\\$&") + .replace(/\*/g, "[^/\\\\]*") + .replace(/\?/g, "[^/\\\\]") + "$"; + var mod = process.platform === "win32" ? "i" : ""; + var rx = new RegExp(pattern, mod); + var results = entries.filter(function(name) { + return rx.test(name); + }).map(function(name) { + return path.join(dir, name); + }); + if (results.length) return results; + } + } + return [ glob ]; +} + +function read_file(path, default_value) { + try { + return fs.readFileSync(path, "utf8"); + } catch (ex) { + if (ex.code == "ENOENT" && default_value != null) return default_value; + fatal(ex); + } +} + +function parse_js(flag) { + return function(value, options) { + options = options || {}; + try { + UglifyJS.minify(value, { + parse: { + expression: true + }, + compress: false, + mangle: false, + output: { + ast: true, + code: false + } + }).ast.walk(new UglifyJS.TreeWalker(function(node) { + if (node instanceof UglifyJS.AST_Assign) { + var name = node.left.print_to_string(); + var value = node.right; + if (flag) { + options[name] = value; + } else if (value instanceof UglifyJS.AST_Array) { + options[name] = value.elements.map(to_string); + } else { + options[name] = to_string(value); + } + return true; + } + if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) { + var name = node.print_to_string(); + options[name] = true; + return true; + } + if (!(node instanceof UglifyJS.AST_Sequence)) throw node; + + function to_string(value) { + return value instanceof UglifyJS.AST_Constant ? value.getValue() : value.print_to_string({ + quote_keys: true + }); + } + })); + } catch(ex) { + if (flag) { + fatal("Error parsing arguments for '" + flag + "': " + value); + } else { + options[value] = null; + } + } + return options; + } +} + +function parse_source_map() { + var parse = parse_js(); + return function(value, options) { + var hasContent = options && "content" in options; + var settings = parse(value, options); + if (!hasContent && settings.content && settings.content != "inline") { + print_error("INFO: Using input source map: " + settings.content); + settings.content = read_file(settings.content, settings.content); + } + return settings; + } +} + +function skip_key(key) { + return skip_keys.indexOf(key) >= 0; +} + +function format_object(obj) { + var lines = []; + var padding = ""; + Object.keys(obj).map(function(name) { + if (padding.length < name.length) padding = Array(name.length + 1).join(" "); + return [ name, JSON.stringify(obj[name]) ]; + }).forEach(function(tokens) { + lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]); + }); + return lines.join("\n"); +} + +function print_error(msg) { + process.stderr.write(msg); + process.stderr.write("\n"); +} + +function print(txt) { + process.stdout.write(txt); + process.stdout.write("\n"); +} diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js new file mode 100644 index 00000000..997486c2 --- /dev/null +++ b/node_modules/uglify-js/lib/ast.js @@ -0,0 +1,914 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +function DEFNODE(type, props, methods, base) { + if (arguments.length < 4) base = AST_Node; + if (!props) props = []; + else props = props.split(/\s+/); + var self_props = props; + if (base && base.PROPS) + props = props.concat(base.PROPS); + var code = "return function AST_" + type + "(props){ if (props) { "; + for (var i = props.length; --i >= 0;) { + code += "this." + props[i] + " = props." + props[i] + ";"; + } + var proto = base && new base; + if (proto && proto.initialize || (methods && methods.initialize)) + code += "this.initialize();"; + code += "}}"; + var ctor = new Function(code)(); + if (proto) { + ctor.prototype = proto; + ctor.BASE = base; + } + if (base) base.SUBCLASSES.push(ctor); + ctor.prototype.CTOR = ctor; + ctor.PROPS = props || null; + ctor.SELF_PROPS = self_props; + ctor.SUBCLASSES = []; + if (type) { + ctor.prototype.TYPE = ctor.TYPE = type; + } + if (methods) for (i in methods) if (HOP(methods, i)) { + if (/^\$/.test(i)) { + ctor[i.substr(1)] = methods[i]; + } else { + ctor.prototype[i] = methods[i]; + } + } + ctor.DEFMETHOD = function(name, method) { + this.prototype[name] = method; + }; + if (typeof exports !== "undefined") { + exports["AST_" + type] = ctor; + } + return ctor; +}; + +var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file raw", { +}, null); + +var AST_Node = DEFNODE("Node", "start end", { + _clone: function(deep) { + if (deep) { + var self = this.clone(); + return self.transform(new TreeTransformer(function(node) { + if (node !== self) { + return node.clone(true); + } + })); + } + return new this.CTOR(this); + }, + clone: function(deep) { + return this._clone(deep); + }, + $documentation: "Base class of all AST nodes", + $propdoc: { + start: "[AST_Token] The first token of this node", + end: "[AST_Token] The last token of this node" + }, + _walk: function(visitor) { + return visitor._visit(this); + }, + walk: function(visitor) { + return this._walk(visitor); // not sure the indirection will be any help + } +}, null); + +AST_Node.warn_function = null; +AST_Node.warn = function(txt, props) { + if (AST_Node.warn_function) + AST_Node.warn_function(string_template(txt, props)); +}; + +/* -----[ statements ]----- */ + +var AST_Statement = DEFNODE("Statement", null, { + $documentation: "Base class of all statements", +}); + +var AST_Debugger = DEFNODE("Debugger", null, { + $documentation: "Represents a debugger statement", +}, AST_Statement); + +var AST_Directive = DEFNODE("Directive", "value quote", { + $documentation: "Represents a directive, like \"use strict\";", + $propdoc: { + value: "[string] The value of this directive as a plain string (it's not an AST_String!)", + quote: "[string] the original quote character" + }, +}, AST_Statement); + +var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", { + $documentation: "A statement consisting of an expression, i.e. a = 1 + 2", + $propdoc: { + body: "[AST_Node] an expression node (should not be instanceof AST_Statement)" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.body._walk(visitor); + }); + } +}, AST_Statement); + +function walk_body(node, visitor) { + var body = node.body; + if (body instanceof AST_Statement) { + body._walk(visitor); + } + else for (var i = 0, len = body.length; i < len; i++) { + body[i]._walk(visitor); + } +}; + +var AST_Block = DEFNODE("Block", "body", { + $documentation: "A body of statements (usually bracketed)", + $propdoc: { + body: "[AST_Statement*] an array of statements" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + walk_body(this, visitor); + }); + } +}, AST_Statement); + +var AST_BlockStatement = DEFNODE("BlockStatement", null, { + $documentation: "A block statement", +}, AST_Block); + +var AST_EmptyStatement = DEFNODE("EmptyStatement", null, { + $documentation: "The empty statement (empty block or simply a semicolon)" +}, AST_Statement); + +var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", { + $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`", + $propdoc: { + body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement" + } +}, AST_Statement); + +var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { + $documentation: "Statement with a label", + $propdoc: { + label: "[AST_Label] a label definition" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.label._walk(visitor); + this.body._walk(visitor); + }); + }, + clone: function(deep) { + var node = this._clone(deep); + if (deep) { + var label = node.label; + var def = this.label; + node.walk(new TreeWalker(function(node) { + if (node instanceof AST_LoopControl + && node.label && node.label.thedef === def) { + node.label.thedef = label; + label.references.push(node); + } + })); + } + return node; + } +}, AST_StatementWithBody); + +var AST_IterationStatement = DEFNODE("IterationStatement", null, { + $documentation: "Internal class. All loops inherit from it." +}, AST_StatementWithBody); + +var AST_DWLoop = DEFNODE("DWLoop", "condition", { + $documentation: "Base class for do/while statements", + $propdoc: { + condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement" + } +}, AST_IterationStatement); + +var AST_Do = DEFNODE("Do", null, { + $documentation: "A `do` statement", + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.body._walk(visitor); + this.condition._walk(visitor); + }); + } +}, AST_DWLoop); + +var AST_While = DEFNODE("While", null, { + $documentation: "A `while` statement", + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.condition._walk(visitor); + this.body._walk(visitor); + }); + } +}, AST_DWLoop); + +var AST_For = DEFNODE("For", "init condition step", { + $documentation: "A `for` statement", + $propdoc: { + init: "[AST_Node?] the `for` initialization code, or null if empty", + condition: "[AST_Node?] the `for` termination clause, or null if empty", + step: "[AST_Node?] the `for` update clause, or null if empty" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + if (this.init) this.init._walk(visitor); + if (this.condition) this.condition._walk(visitor); + if (this.step) this.step._walk(visitor); + this.body._walk(visitor); + }); + } +}, AST_IterationStatement); + +var AST_ForIn = DEFNODE("ForIn", "init name object", { + $documentation: "A `for ... in` statement", + $propdoc: { + init: "[AST_Node] the `for/in` initialization code", + name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var", + object: "[AST_Node] the object that we're looping through" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.init._walk(visitor); + this.object._walk(visitor); + this.body._walk(visitor); + }); + } +}, AST_IterationStatement); + +var AST_With = DEFNODE("With", "expression", { + $documentation: "A `with` statement", + $propdoc: { + expression: "[AST_Node] the `with` expression" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + this.body._walk(visitor); + }); + } +}, AST_StatementWithBody); + +/* -----[ scope and functions ]----- */ + +var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", { + $documentation: "Base class for all statements introducing a lexical scope", + $propdoc: { + variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope", + functions: "[Object/S] like `variables`, but only lists function declarations", + uses_with: "[boolean/S] tells whether this scope uses the `with` statement", + uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`", + parent_scope: "[AST_Scope?/S] link to the parent scope", + enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", + cname: "[integer/S] current index for mangling variables (used internally by the mangler)", + }, +}, AST_Block); + +var AST_Toplevel = DEFNODE("Toplevel", "globals", { + $documentation: "The toplevel scope", + $propdoc: { + globals: "[Object/S] a map of name -> SymbolDef for all undeclared names", + }, + wrap_commonjs: function(name) { + var body = this.body; + var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");"; + wrapped_tl = parse(wrapped_tl); + wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ + if (node instanceof AST_Directive && node.value == "$ORIG") { + return MAP.splice(body); + } + })); + return wrapped_tl; + } +}, AST_Scope); + +var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", { + $documentation: "Base class for functions", + $propdoc: { + name: "[AST_SymbolDeclaration?] the name of this function", + argnames: "[AST_SymbolFunarg*] array of function arguments", + uses_arguments: "[boolean/S] tells whether this function accesses the arguments array" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + if (this.name) this.name._walk(visitor); + var argnames = this.argnames; + for (var i = 0, len = argnames.length; i < len; i++) { + argnames[i]._walk(visitor); + } + walk_body(this, visitor); + }); + } +}, AST_Scope); + +var AST_Accessor = DEFNODE("Accessor", null, { + $documentation: "A setter/getter function. The `name` property is always null." +}, AST_Lambda); + +var AST_Function = DEFNODE("Function", "inlined", { + $documentation: "A function expression" +}, AST_Lambda); + +var AST_Defun = DEFNODE("Defun", "inlined", { + $documentation: "A function definition" +}, AST_Lambda); + +/* -----[ JUMPS ]----- */ + +var AST_Jump = DEFNODE("Jump", null, { + $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)" +}, AST_Statement); + +var AST_Exit = DEFNODE("Exit", "value", { + $documentation: "Base class for “exits” (`return` and `throw`)", + $propdoc: { + value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return" + }, + _walk: function(visitor) { + return visitor._visit(this, this.value && function(){ + this.value._walk(visitor); + }); + } +}, AST_Jump); + +var AST_Return = DEFNODE("Return", null, { + $documentation: "A `return` statement" +}, AST_Exit); + +var AST_Throw = DEFNODE("Throw", null, { + $documentation: "A `throw` statement" +}, AST_Exit); + +var AST_LoopControl = DEFNODE("LoopControl", "label", { + $documentation: "Base class for loop control statements (`break` and `continue`)", + $propdoc: { + label: "[AST_LabelRef?] the label, or null if none", + }, + _walk: function(visitor) { + return visitor._visit(this, this.label && function(){ + this.label._walk(visitor); + }); + } +}, AST_Jump); + +var AST_Break = DEFNODE("Break", null, { + $documentation: "A `break` statement" +}, AST_LoopControl); + +var AST_Continue = DEFNODE("Continue", null, { + $documentation: "A `continue` statement" +}, AST_LoopControl); + +/* -----[ IF ]----- */ + +var AST_If = DEFNODE("If", "condition alternative", { + $documentation: "A `if` statement", + $propdoc: { + condition: "[AST_Node] the `if` condition", + alternative: "[AST_Statement?] the `else` part, or null if not present" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.condition._walk(visitor); + this.body._walk(visitor); + if (this.alternative) this.alternative._walk(visitor); + }); + } +}, AST_StatementWithBody); + +/* -----[ SWITCH ]----- */ + +var AST_Switch = DEFNODE("Switch", "expression", { + $documentation: "A `switch` statement", + $propdoc: { + expression: "[AST_Node] the `switch` “discriminant”" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + walk_body(this, visitor); + }); + } +}, AST_Block); + +var AST_SwitchBranch = DEFNODE("SwitchBranch", null, { + $documentation: "Base class for `switch` branches", +}, AST_Block); + +var AST_Default = DEFNODE("Default", null, { + $documentation: "A `default` switch branch", +}, AST_SwitchBranch); + +var AST_Case = DEFNODE("Case", "expression", { + $documentation: "A `case` switch branch", + $propdoc: { + expression: "[AST_Node] the `case` expression" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + walk_body(this, visitor); + }); + } +}, AST_SwitchBranch); + +/* -----[ EXCEPTIONS ]----- */ + +var AST_Try = DEFNODE("Try", "bcatch bfinally", { + $documentation: "A `try` statement", + $propdoc: { + bcatch: "[AST_Catch?] the catch block, or null if not present", + bfinally: "[AST_Finally?] the finally block, or null if not present" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + walk_body(this, visitor); + if (this.bcatch) this.bcatch._walk(visitor); + if (this.bfinally) this.bfinally._walk(visitor); + }); + } +}, AST_Block); + +var AST_Catch = DEFNODE("Catch", "argname", { + $documentation: "A `catch` node; only makes sense as part of a `try` statement", + $propdoc: { + argname: "[AST_SymbolCatch] symbol for the exception" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.argname._walk(visitor); + walk_body(this, visitor); + }); + } +}, AST_Block); + +var AST_Finally = DEFNODE("Finally", null, { + $documentation: "A `finally` node; only makes sense as part of a `try` statement" +}, AST_Block); + +/* -----[ VAR ]----- */ + +var AST_Definitions = DEFNODE("Definitions", "definitions", { + $documentation: "Base class for `var` nodes (variable declarations/initializations)", + $propdoc: { + definitions: "[AST_VarDef*] array of variable definitions" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + var definitions = this.definitions; + for (var i = 0, len = definitions.length; i < len; i++) { + definitions[i]._walk(visitor); + } + }); + } +}, AST_Statement); + +var AST_Var = DEFNODE("Var", null, { + $documentation: "A `var` statement" +}, AST_Definitions); + +var AST_VarDef = DEFNODE("VarDef", "name value", { + $documentation: "A variable declaration; only appears in a AST_Definitions node", + $propdoc: { + name: "[AST_SymbolVar] name of the variable", + value: "[AST_Node?] initializer, or null of there's no initializer" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.name._walk(visitor); + if (this.value) this.value._walk(visitor); + }); + } +}); + +/* -----[ OTHER ]----- */ + +var AST_Call = DEFNODE("Call", "expression args", { + $documentation: "A function call expression", + $propdoc: { + expression: "[AST_Node] expression to invoke as function", + args: "[AST_Node*] array of arguments" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + var args = this.args; + for (var i = 0, len = args.length; i < len; i++) { + args[i]._walk(visitor); + } + this.expression._walk(visitor); + }); + } +}); + +var AST_New = DEFNODE("New", null, { + $documentation: "An object instantiation. Derives from a function call since it has exactly the same properties" +}, AST_Call); + +var AST_Sequence = DEFNODE("Sequence", "expressions", { + $documentation: "A sequence expression (comma-separated expressions)", + $propdoc: { + expressions: "[AST_Node*] array of expressions (at least two)" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expressions.forEach(function(node) { + node._walk(visitor); + }); + }); + } +}); + +var AST_PropAccess = DEFNODE("PropAccess", "expression property", { + $documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`", + $propdoc: { + expression: "[AST_Node] the “container” expression", + property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node" + } +}); + +var AST_Dot = DEFNODE("Dot", null, { + $documentation: "A dotted property access expression", + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + }); + } +}, AST_PropAccess); + +var AST_Sub = DEFNODE("Sub", null, { + $documentation: "Index-style property access, i.e. `a[\"foo\"]`", + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + this.property._walk(visitor); + }); + } +}, AST_PropAccess); + +var AST_Unary = DEFNODE("Unary", "operator expression", { + $documentation: "Base class for unary expressions", + $propdoc: { + operator: "[string] the operator", + expression: "[AST_Node] expression that this unary operator applies to" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + }); + } +}); + +var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, { + $documentation: "Unary prefix expression, i.e. `typeof i` or `++i`" +}, AST_Unary); + +var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, { + $documentation: "Unary postfix expression, i.e. `i++`" +}, AST_Unary); + +var AST_Binary = DEFNODE("Binary", "operator left right", { + $documentation: "Binary expression, i.e. `a + b`", + $propdoc: { + left: "[AST_Node] left-hand side expression", + operator: "[string] the operator", + right: "[AST_Node] right-hand side expression" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.left._walk(visitor); + this.right._walk(visitor); + }); + } +}); + +var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", { + $documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`", + $propdoc: { + condition: "[AST_Node]", + consequent: "[AST_Node]", + alternative: "[AST_Node]" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.condition._walk(visitor); + this.consequent._walk(visitor); + this.alternative._walk(visitor); + }); + } +}); + +var AST_Assign = DEFNODE("Assign", null, { + $documentation: "An assignment expression — `a = b + 5`", +}, AST_Binary); + +/* -----[ LITERALS ]----- */ + +var AST_Array = DEFNODE("Array", "elements", { + $documentation: "An array literal", + $propdoc: { + elements: "[AST_Node*] array of elements" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + var elements = this.elements; + for (var i = 0, len = elements.length; i < len; i++) { + elements[i]._walk(visitor); + } + }); + } +}); + +var AST_Object = DEFNODE("Object", "properties", { + $documentation: "An object literal", + $propdoc: { + properties: "[AST_ObjectProperty*] array of properties" + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + var properties = this.properties; + for (var i = 0, len = properties.length; i < len; i++) { + properties[i]._walk(visitor); + } + }); + } +}); + +var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", { + $documentation: "Base class for literal object properties", + $propdoc: { + key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.", + value: "[AST_Node] property value. For setters and getters this is an AST_Accessor." + }, + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.value._walk(visitor); + }); + } +}); + +var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", { + $documentation: "A key: value object property", + $propdoc: { + quote: "[string] the original quote character" + } +}, AST_ObjectProperty); + +var AST_ObjectSetter = DEFNODE("ObjectSetter", null, { + $documentation: "An object setter property", +}, AST_ObjectProperty); + +var AST_ObjectGetter = DEFNODE("ObjectGetter", null, { + $documentation: "An object getter property", +}, AST_ObjectProperty); + +var AST_Symbol = DEFNODE("Symbol", "scope name thedef", { + $propdoc: { + name: "[string] name of this symbol", + scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)", + thedef: "[SymbolDef/S] the definition of this symbol" + }, + $documentation: "Base class for all symbols", +}); + +var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, { + $documentation: "The name of a property accessor (setter/getter function)" +}, AST_Symbol); + +var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", { + $documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)", +}, AST_Symbol); + +var AST_SymbolVar = DEFNODE("SymbolVar", null, { + $documentation: "Symbol defining a variable", +}, AST_SymbolDeclaration); + +var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, { + $documentation: "Symbol naming a function argument", +}, AST_SymbolVar); + +var AST_SymbolDefun = DEFNODE("SymbolDefun", null, { + $documentation: "Symbol defining a function", +}, AST_SymbolDeclaration); + +var AST_SymbolLambda = DEFNODE("SymbolLambda", null, { + $documentation: "Symbol naming a function expression", +}, AST_SymbolDeclaration); + +var AST_SymbolCatch = DEFNODE("SymbolCatch", null, { + $documentation: "Symbol naming the exception in catch", +}, AST_SymbolDeclaration); + +var AST_Label = DEFNODE("Label", "references", { + $documentation: "Symbol naming a label (declaration)", + $propdoc: { + references: "[AST_LoopControl*] a list of nodes referring to this label" + }, + initialize: function() { + this.references = []; + this.thedef = this; + } +}, AST_Symbol); + +var AST_SymbolRef = DEFNODE("SymbolRef", null, { + $documentation: "Reference to some symbol (not definition/declaration)", +}, AST_Symbol); + +var AST_LabelRef = DEFNODE("LabelRef", null, { + $documentation: "Reference to a label symbol", +}, AST_Symbol); + +var AST_This = DEFNODE("This", null, { + $documentation: "The `this` symbol", +}, AST_Symbol); + +var AST_Constant = DEFNODE("Constant", null, { + $documentation: "Base class for all constants", + getValue: function() { + return this.value; + } +}); + +var AST_String = DEFNODE("String", "value quote", { + $documentation: "A string literal", + $propdoc: { + value: "[string] the contents of this string", + quote: "[string] the original quote character" + } +}, AST_Constant); + +var AST_Number = DEFNODE("Number", "value literal", { + $documentation: "A number literal", + $propdoc: { + value: "[number] the numeric value", + literal: "[string] numeric value as string (optional)" + } +}, AST_Constant); + +var AST_RegExp = DEFNODE("RegExp", "value", { + $documentation: "A regexp literal", + $propdoc: { + value: "[RegExp] the actual regexp" + } +}, AST_Constant); + +var AST_Atom = DEFNODE("Atom", null, { + $documentation: "Base class for atoms", +}, AST_Constant); + +var AST_Null = DEFNODE("Null", null, { + $documentation: "The `null` atom", + value: null +}, AST_Atom); + +var AST_NaN = DEFNODE("NaN", null, { + $documentation: "The impossible value", + value: 0/0 +}, AST_Atom); + +var AST_Undefined = DEFNODE("Undefined", null, { + $documentation: "The `undefined` value", + value: (function(){}()) +}, AST_Atom); + +var AST_Hole = DEFNODE("Hole", null, { + $documentation: "A hole in an array", + value: (function(){}()) +}, AST_Atom); + +var AST_Infinity = DEFNODE("Infinity", null, { + $documentation: "The `Infinity` value", + value: 1/0 +}, AST_Atom); + +var AST_Boolean = DEFNODE("Boolean", null, { + $documentation: "Base class for booleans", +}, AST_Atom); + +var AST_False = DEFNODE("False", null, { + $documentation: "The `false` atom", + value: false +}, AST_Boolean); + +var AST_True = DEFNODE("True", null, { + $documentation: "The `true` atom", + value: true +}, AST_Boolean); + +/* -----[ TreeWalker ]----- */ + +function TreeWalker(callback) { + this.visit = callback; + this.stack = []; + this.directives = Object.create(null); +}; +TreeWalker.prototype = { + _visit: function(node, descend) { + this.push(node); + var ret = this.visit(node, descend ? function(){ + descend.call(node); + } : noop); + if (!ret && descend) { + descend.call(node); + } + this.pop(); + return ret; + }, + parent: function(n) { + return this.stack[this.stack.length - 2 - (n || 0)]; + }, + push: function(node) { + if (node instanceof AST_Lambda) { + this.directives = Object.create(this.directives); + } else if (node instanceof AST_Directive && !this.directives[node.value]) { + this.directives[node.value] = node; + } + this.stack.push(node); + }, + pop: function() { + if (this.stack.pop() instanceof AST_Lambda) { + this.directives = Object.getPrototypeOf(this.directives); + } + }, + self: function() { + return this.stack[this.stack.length - 1]; + }, + find_parent: function(type) { + var stack = this.stack; + for (var i = stack.length; --i >= 0;) { + var x = stack[i]; + if (x instanceof type) return x; + } + }, + has_directive: function(type) { + var dir = this.directives[type]; + if (dir) return dir; + var node = this.stack[this.stack.length - 1]; + if (node instanceof AST_Scope) { + for (var i = 0; i < node.body.length; ++i) { + var st = node.body[i]; + if (!(st instanceof AST_Directive)) break; + if (st.value == type) return st; + } + } + }, + loopcontrol_target: function(node) { + var stack = this.stack; + if (node.label) for (var i = stack.length; --i >= 0;) { + var x = stack[i]; + if (x instanceof AST_LabeledStatement && x.label.name == node.label.name) + return x.body; + } else for (var i = stack.length; --i >= 0;) { + var x = stack[i]; + if (x instanceof AST_IterationStatement + || node instanceof AST_Break && x instanceof AST_Switch) + return x; + } + } +}; diff --git a/node_modules/uglify-js/lib/compress.js b/node_modules/uglify-js/lib/compress.js new file mode 100644 index 00000000..ce0fbdd5 --- /dev/null +++ b/node_modules/uglify-js/lib/compress.js @@ -0,0 +1,5002 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +function Compressor(options, false_by_default) { + if (!(this instanceof Compressor)) + return new Compressor(options, false_by_default); + TreeTransformer.call(this, this.before, this.after); + this.options = defaults(options, { + booleans : !false_by_default, + cascade : !false_by_default, + collapse_vars : !false_by_default, + comparisons : !false_by_default, + conditionals : !false_by_default, + dead_code : !false_by_default, + drop_console : false, + drop_debugger : !false_by_default, + evaluate : !false_by_default, + expression : false, + global_defs : {}, + hoist_funs : !false_by_default, + hoist_props : !false_by_default, + hoist_vars : false, + ie8 : false, + if_return : !false_by_default, + inline : !false_by_default, + join_vars : !false_by_default, + keep_fargs : true, + keep_fnames : false, + keep_infinity : false, + loops : !false_by_default, + negate_iife : !false_by_default, + passes : 1, + properties : !false_by_default, + pure_getters : !false_by_default && "strict", + pure_funcs : null, + reduce_funcs : !false_by_default, + reduce_vars : !false_by_default, + sequences : !false_by_default, + side_effects : !false_by_default, + switches : !false_by_default, + top_retain : null, + toplevel : !!(options && options["top_retain"]), + typeofs : !false_by_default, + unsafe : false, + unsafe_comps : false, + unsafe_Func : false, + unsafe_math : false, + unsafe_proto : false, + unsafe_regexp : false, + unused : !false_by_default, + warnings : false, + }, true); + var global_defs = this.options["global_defs"]; + if (typeof global_defs == "object") for (var key in global_defs) { + if (/^@/.test(key) && HOP(global_defs, key)) { + global_defs[key.slice(1)] = parse(global_defs[key], { + expression: true + }); + } + } + var pure_funcs = this.options["pure_funcs"]; + if (typeof pure_funcs == "function") { + this.pure_funcs = pure_funcs; + } else { + this.pure_funcs = pure_funcs ? function(node) { + return pure_funcs.indexOf(node.expression.print_to_string()) < 0; + } : return_true; + } + var top_retain = this.options["top_retain"]; + if (top_retain instanceof RegExp) { + this.top_retain = function(def) { + return top_retain.test(def.name); + }; + } else if (typeof top_retain == "function") { + this.top_retain = top_retain; + } else if (top_retain) { + if (typeof top_retain == "string") { + top_retain = top_retain.split(/,/); + } + this.top_retain = function(def) { + return top_retain.indexOf(def.name) >= 0; + }; + } + var toplevel = this.options["toplevel"]; + this.toplevel = typeof toplevel == "string" ? { + funcs: /funcs/.test(toplevel), + vars: /vars/.test(toplevel) + } : { + funcs: toplevel, + vars: toplevel + }; + var sequences = this.options["sequences"]; + this.sequences_limit = sequences == 1 ? 800 : sequences | 0; + this.warnings_produced = {}; +}; + +Compressor.prototype = new TreeTransformer; +merge(Compressor.prototype, { + option: function(key) { return this.options[key] }, + exposed: function(def) { + if (def.global) for (var i = 0, len = def.orig.length; i < len; i++) + if (!this.toplevel[def.orig[i] instanceof AST_SymbolDefun ? "funcs" : "vars"]) + return true; + return false; + }, + in_boolean_context: function() { + if (!this.option("booleans")) return false; + var self = this.self(); + for (var i = 0, p; p = this.parent(i); i++) { + if (p instanceof AST_SimpleStatement + || p instanceof AST_Conditional && p.condition === self + || p instanceof AST_DWLoop && p.condition === self + || p instanceof AST_For && p.condition === self + || p instanceof AST_If && p.condition === self + || p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) { + return true; + } + if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||") + || p instanceof AST_Conditional + || p.tail_node() === self) { + self = p; + } else { + return false; + } + } + }, + compress: function(node) { + if (this.option("expression")) { + node.process_expression(true); + } + var passes = +this.options.passes || 1; + var last_count = 1 / 0; + var mangle = { ie8: this.option("ie8") }; + for (var pass = 0; pass < passes; pass++) { + node.figure_out_scope(mangle); + if (pass > 0 || this.option("reduce_vars")) + node.reset_opt_flags(this); + node = node.transform(this); + if (passes > 1) { + var count = 0; + node.walk(new TreeWalker(function() { + count++; + })); + this.info("pass " + pass + ": last_count: " + last_count + ", count: " + count); + if (count >= last_count) break; + last_count = count; + } + } + if (this.option("expression")) { + node.process_expression(false); + } + return node; + }, + info: function() { + if (this.options.warnings == "verbose") { + AST_Node.warn.apply(AST_Node, arguments); + } + }, + warn: function(text, props) { + if (this.options.warnings) { + // only emit unique warnings + var message = string_template(text, props); + if (!(message in this.warnings_produced)) { + this.warnings_produced[message] = true; + AST_Node.warn.apply(AST_Node, arguments); + } + } + }, + clear_warnings: function() { + this.warnings_produced = {}; + }, + before: function(node, descend, in_list) { + if (node._squeezed) return node; + var was_scope = false; + if (node instanceof AST_Scope) { + node = node.hoist_properties(this); + node = node.hoist_declarations(this); + was_scope = true; + } + // Before https://github.com/mishoo/UglifyJS2/pull/1602 AST_Node.optimize() + // would call AST_Node.transform() if a different instance of AST_Node is + // produced after OPT(). + // This corrupts TreeWalker.stack, which cause AST look-ups to malfunction. + // Migrate and defer all children's AST_Node.transform() to below, which + // will now happen after this parent AST_Node has been properly substituted + // thus gives a consistent AST snapshot. + descend(node, this); + // Existing code relies on how AST_Node.optimize() worked, and omitting the + // following replacement call would result in degraded efficiency of both + // output and performance. + descend(node, this); + var opt = node.optimize(this); + if (was_scope && opt instanceof AST_Scope) { + opt.drop_unused(this); + descend(opt, this); + } + if (opt === node) opt._squeezed = true; + return opt; + } +}); + +(function(){ + + function OPT(node, optimizer) { + node.DEFMETHOD("optimize", function(compressor){ + var self = this; + if (self._optimized) return self; + if (compressor.has_directive("use asm")) return self; + var opt = optimizer(self, compressor); + opt._optimized = true; + return opt; + }); + }; + + OPT(AST_Node, function(self, compressor){ + return self; + }); + + AST_Node.DEFMETHOD("equivalent_to", function(node){ + return this.TYPE == node.TYPE && this.print_to_string() == node.print_to_string(); + }); + + AST_Scope.DEFMETHOD("process_expression", function(insert, compressor) { + var self = this; + var tt = new TreeTransformer(function(node) { + if (insert && node instanceof AST_SimpleStatement) { + return make_node(AST_Return, node, { + value: node.body + }); + } + if (!insert && node instanceof AST_Return) { + if (compressor) { + var value = node.value && node.value.drop_side_effect_free(compressor, true); + return value ? make_node(AST_SimpleStatement, node, { + body: value + }) : make_node(AST_EmptyStatement, node); + } + return make_node(AST_SimpleStatement, node, { + body: node.value || make_node(AST_UnaryPrefix, node, { + operator: "void", + expression: make_node(AST_Number, node, { + value: 0 + }) + }) + }); + } + if (node instanceof AST_Lambda && node !== self) { + return node; + } + if (node instanceof AST_Block) { + var index = node.body.length - 1; + if (index >= 0) { + node.body[index] = node.body[index].transform(tt); + } + } + if (node instanceof AST_If) { + node.body = node.body.transform(tt); + if (node.alternative) { + node.alternative = node.alternative.transform(tt); + } + } + if (node instanceof AST_With) { + node.body = node.body.transform(tt); + } + return node; + }); + self.transform(tt); + }); + + AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) { + var reduce_vars = compressor.option("reduce_vars"); + var unused = compressor.option("unused"); + // Stack of look-up tables to keep track of whether a `SymbolDef` has been + // properly assigned before use: + // - `push()` & `pop()` when visiting conditional branches + // - backup & restore via `save_ids` when visiting out-of-order sections + var safe_ids = Object.create(null); + var suppressor = new TreeWalker(function(node) { + if (!(node instanceof AST_Symbol)) return; + var d = node.definition(); + if (!d) return; + if (node instanceof AST_SymbolRef) d.references.push(node); + d.fixed = false; + }); + var in_loop = null; + var loop_ids = Object.create(null); + var tw = new TreeWalker(function(node, descend) { + node._squeezed = false; + node._optimized = false; + if (reduce_vars) { + if (node instanceof AST_Toplevel) node.globals.each(reset_def); + if (node instanceof AST_Scope) node.variables.each(reset_def); + if (node instanceof AST_SymbolRef) { + var d = node.definition(); + d.references.push(node); + var value; + if (d.fixed === undefined || !safe_to_read(d) || d.single_use == "m") { + d.fixed = false; + } else if (d.fixed) { + value = node.fixed_value(); + if (value && ref_once(d)) { + d.single_use = value instanceof AST_Lambda + || d.scope === node.scope && value.is_constant_expression(); + } else { + d.single_use = false; + } + if (is_modified(node, value, 0, is_immutable(value))) { + if (d.single_use) { + d.single_use = "m"; + } else { + d.fixed = false; + } + } + } + mark_escaped(d, node.scope, node, value, 0); + } + if (node instanceof AST_SymbolCatch) { + node.definition().fixed = false; + } + if (node instanceof AST_VarDef) { + var d = node.name.definition(); + if (d.fixed === undefined || safe_to_assign(d, node.value)) { + if (node.value) { + d.fixed = function() { + return node.value; + }; + loop_ids[d.id] = in_loop; + mark(d, false); + descend(); + } else { + d.fixed = null; + } + mark(d, true); + return true; + } else if (node.value) { + d.fixed = false; + } + } + if (node instanceof AST_Assign + && node.operator == "=" + && node.left instanceof AST_SymbolRef) { + var d = node.left.definition(); + if (safe_to_assign(d, node.right)) { + d.references.push(node.left); + d.fixed = function() { + return node.right; + }; + mark(d, false); + node.right.walk(tw); + mark(d, true); + return true; + } + } + if (node instanceof AST_Defun) { + node.inlined = false; + var d = node.name.definition(); + if (compressor.exposed(d) || safe_to_read(d)) { + d.fixed = false; + } else { + d.fixed = node; + loop_ids[d.id] = in_loop; + mark(d, true); + d.single_use = ref_once(d); + } + var save_ids = safe_ids; + safe_ids = Object.create(null); + descend(); + safe_ids = save_ids; + return true; + } + if (node instanceof AST_Function) { + node.inlined = false; + push(); + var iife; + if (!node.name + && (iife = tw.parent()) instanceof AST_Call + && iife.expression === node) { + // Virtually turn IIFE parameters into variable definitions: + // (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})() + // So existing transformation rules can work on them. + node.argnames.forEach(function(arg, i) { + var d = arg.definition(); + if (!node.uses_arguments && d.fixed === undefined) { + d.fixed = function() { + return iife.args[i] || make_node(AST_Undefined, iife); + }; + loop_ids[d.id] = in_loop; + mark(d, true); + } else { + d.fixed = false; + } + }); + } + descend(); + pop(); + return true; + } + if (node instanceof AST_Accessor) { + push(); + descend(); + pop(); + return true; + } + if (node instanceof AST_Binary && lazy_op(node.operator)) { + node.left.walk(tw); + push(); + node.right.walk(tw); + pop(); + return true; + } + if (node instanceof AST_Conditional) { + node.condition.walk(tw); + push(); + node.consequent.walk(tw); + pop(); + push(); + node.alternative.walk(tw); + pop(); + return true; + } + if (node instanceof AST_If) { + node.condition.walk(tw); + push(); + node.body.walk(tw); + pop(); + if (node.alternative) { + push(); + node.alternative.walk(tw); + pop(); + } + return true; + } + if (node instanceof AST_DWLoop) { + var saved_loop = in_loop; + in_loop = node; + push(); + node.condition.walk(tw); + node.body.walk(tw); + pop(); + in_loop = saved_loop; + return true; + } + if (node instanceof AST_LabeledStatement) { + push(); + node.body.walk(tw); + pop(); + return true; + } + if (node instanceof AST_For) { + if (node.init) node.init.walk(tw); + var saved_loop = in_loop; + in_loop = node; + if (node.condition) { + push(); + node.condition.walk(tw); + pop(); + } + push(); + node.body.walk(tw); + pop(); + if (node.step) { + push(); + node.step.walk(tw); + pop(); + } + in_loop = saved_loop; + return true; + } + if (node instanceof AST_ForIn) { + node.init.walk(suppressor); + node.object.walk(tw); + var saved_loop = in_loop; + in_loop = node; + push(); + node.body.walk(tw); + pop(); + in_loop = saved_loop; + return true; + } + if (node instanceof AST_Try) { + push(); + walk_body(node, tw); + pop(); + if (node.bcatch) { + push(); + node.bcatch.walk(tw); + pop(); + } + if (node.bfinally) node.bfinally.walk(tw); + return true; + } + if (node instanceof AST_SwitchBranch) { + push(); + descend(); + pop(); + return true; + } + } + }); + this.walk(tw); + + function mark(def, safe) { + safe_ids[def.id] = safe; + } + + function safe_to_read(def) { + if (safe_ids[def.id]) { + if (def.fixed == null) { + var orig = def.orig[0]; + if (orig instanceof AST_SymbolFunarg || orig.name == "arguments") return false; + def.fixed = make_node(AST_Undefined, orig); + } + return true; + } + return def.fixed instanceof AST_Defun; + } + + function safe_to_assign(def, value) { + if (!HOP(safe_ids, def.id)) return false; + if (!safe_to_read(def)) return false; + if (def.fixed === false) return false; + if (def.fixed != null && (!value || def.references.length > 0)) return false; + return !def.orig.some(function(sym) { + return sym instanceof AST_SymbolDefun + || sym instanceof AST_SymbolLambda; + }); + } + + function push() { + safe_ids = Object.create(safe_ids); + } + + function pop() { + safe_ids = Object.getPrototypeOf(safe_ids); + } + + function reset_def(def) { + def.direct_access = false; + def.escaped = false; + if (def.scope.uses_eval || def.scope.uses_with) { + def.fixed = false; + } else if (!compressor.exposed(def)) { + def.fixed = undefined; + } else { + def.fixed = false; + } + def.references = []; + def.should_replace = undefined; + def.single_use = undefined; + } + + function ref_once(def) { + return unused + && !def.scope.uses_eval + && !def.scope.uses_with + && def.references.length == 1 + && loop_ids[def.id] === in_loop; + } + + function is_immutable(value) { + if (!value) return false; + return value.is_constant() + || value instanceof AST_Lambda + || value instanceof AST_This; + } + + function read_property(obj, key) { + if (key instanceof AST_Constant) key = key.getValue(); + if (key instanceof AST_Node) return null; + var value; + if (obj instanceof AST_Array) { + var elements = obj.elements; + if (key == "length") return make_node_from_constant(elements.length, obj); + if (typeof key == "number" && key in elements) value = elements[key]; + } else if (obj instanceof AST_Object) { + var props = obj.properties; + for (var i = props.length; --i >= 0;) { + var prop = props[i]; + if (!(prop instanceof AST_ObjectKeyVal)) return; + if (!value && props[i].key === key) value = props[i].value; + } + } + return value instanceof AST_SymbolRef && value.fixed_value() || value; + } + + function is_modified(node, value, level, immutable) { + var parent = tw.parent(level); + if (is_lhs(node, parent) + || !immutable + && parent instanceof AST_Call + && parent.expression === node + && (!(value instanceof AST_Function) + || !(parent instanceof AST_New) && value.contains_this())) { + return true; + } else if (parent instanceof AST_Array) { + return is_modified(parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + return is_modified(obj, obj, level + 2); + } else if (parent instanceof AST_PropAccess && parent.expression === node) { + return !immutable && is_modified(parent, read_property(value, parent.property), level + 1); + } + } + + function mark_escaped(d, scope, node, value, level) { + var parent = tw.parent(level); + if (value) { + if (value.is_constant()) return; + if (level > 0 && value.is_constant_expression(scope)) return; + } + if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right + || parent instanceof AST_Call && node !== parent.expression + || parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope + || parent instanceof AST_VarDef && node === parent.value) { + d.escaped = true; + return; + } else if (parent instanceof AST_Array + || parent instanceof AST_Conditional && node !== parent.condition + || parent instanceof AST_Sequence && node === parent.tail_node()) { + mark_escaped(d, scope, parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + mark_escaped(d, scope, obj, obj, level + 2); + } else if (parent instanceof AST_PropAccess && node === parent.expression) { + value = read_property(value, parent.property); + mark_escaped(d, scope, parent, value, level + 1); + if (value) return; + } + if (level == 0) d.direct_access = true; + } + }); + + AST_Symbol.DEFMETHOD("fixed_value", function() { + var fixed = this.definition().fixed; + if (!fixed || fixed instanceof AST_Node) return fixed; + return fixed(); + }); + + AST_SymbolRef.DEFMETHOD("is_immutable", function() { + var orig = this.definition().orig; + return orig.length == 1 && orig[0] instanceof AST_SymbolLambda; + }); + + function is_lhs_read_only(lhs) { + if (lhs instanceof AST_This) return true; + if (lhs instanceof AST_SymbolRef) return lhs.definition().orig[0] instanceof AST_SymbolLambda; + if (lhs instanceof AST_PropAccess) { + lhs = lhs.expression; + if (lhs instanceof AST_SymbolRef) { + if (lhs.is_immutable()) return false; + lhs = lhs.fixed_value(); + } + if (!lhs) return true; + if (lhs instanceof AST_RegExp) return false; + if (lhs instanceof AST_Constant) return true; + return is_lhs_read_only(lhs); + } + return false; + } + + function find_variable(compressor, name) { + var scope, i = 0; + while (scope = compressor.parent(i++)) { + if (scope instanceof AST_Scope) break; + if (scope instanceof AST_Catch) { + scope = scope.argname.definition().scope; + break; + } + } + return scope.find_variable(name); + } + + function make_node(ctor, orig, props) { + if (!props) props = {}; + if (orig) { + if (!props.start) props.start = orig.start; + if (!props.end) props.end = orig.end; + } + return new ctor(props); + }; + + function make_sequence(orig, expressions) { + if (expressions.length == 1) return expressions[0]; + return make_node(AST_Sequence, orig, { + expressions: expressions.reduce(merge_sequence, []) + }); + } + + function make_node_from_constant(val, orig) { + switch (typeof val) { + case "string": + return make_node(AST_String, orig, { + value: val + }); + case "number": + if (isNaN(val)) return make_node(AST_NaN, orig); + if (isFinite(val)) { + return 1 / val < 0 ? make_node(AST_UnaryPrefix, orig, { + operator: "-", + expression: make_node(AST_Number, orig, { value: -val }) + }) : make_node(AST_Number, orig, { value: val }); + } + return val < 0 ? make_node(AST_UnaryPrefix, orig, { + operator: "-", + expression: make_node(AST_Infinity, orig) + }) : make_node(AST_Infinity, orig); + case "boolean": + return make_node(val ? AST_True : AST_False, orig); + case "undefined": + return make_node(AST_Undefined, orig); + default: + if (val === null) { + return make_node(AST_Null, orig, { value: null }); + } + if (val instanceof RegExp) { + return make_node(AST_RegExp, orig, { value: val }); + } + throw new Error(string_template("Can't handle constant of type: {type}", { + type: typeof val + })); + } + }; + + // we shouldn't compress (1,func)(something) to + // func(something) because that changes the meaning of + // the func (becomes lexical instead of global). + function maintain_this_binding(parent, orig, val) { + if (parent instanceof AST_UnaryPrefix && parent.operator == "delete" + || parent instanceof AST_Call && parent.expression === orig + && (val instanceof AST_PropAccess || val instanceof AST_SymbolRef && val.name == "eval")) { + return make_sequence(orig, [ make_node(AST_Number, orig, { value: 0 }), val ]); + } + return val; + } + + function merge_sequence(array, node) { + if (node instanceof AST_Sequence) { + array.push.apply(array, node.expressions); + } else { + array.push(node); + } + return array; + } + + function as_statement_array(thing) { + if (thing === null) return []; + if (thing instanceof AST_BlockStatement) return thing.body; + if (thing instanceof AST_EmptyStatement) return []; + if (thing instanceof AST_Statement) return [ thing ]; + throw new Error("Can't convert thing to statement array"); + }; + + function is_empty(thing) { + if (thing === null) return true; + if (thing instanceof AST_EmptyStatement) return true; + if (thing instanceof AST_BlockStatement) return thing.body.length == 0; + return false; + }; + + function loop_body(x) { + if (x instanceof AST_Switch) return x; + if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) { + return (x.body instanceof AST_BlockStatement ? x.body : x); + } + return x; + }; + + function is_iife_call(node) { + if (node instanceof AST_Call && !(node instanceof AST_New)) { + return node.expression instanceof AST_Function || is_iife_call(node.expression); + } + return false; + } + + function is_undeclared_ref(node) { + return node instanceof AST_SymbolRef && node.definition().undeclared; + } + + var global_names = makePredicate("Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Math Number parseFloat parseInt RangeError ReferenceError RegExp Object setInterval setTimeout String SyntaxError TypeError unescape URIError"); + AST_SymbolRef.DEFMETHOD("is_declared", function(compressor) { + return !this.definition().undeclared + || compressor.option("unsafe") && global_names(this.name); + }); + + function is_identifier_atom(node) { + return node instanceof AST_Infinity + || node instanceof AST_NaN + || node instanceof AST_Undefined; + } + + function tighten_body(statements, compressor) { + var CHANGED, max_iter = 10; + do { + CHANGED = false; + eliminate_spurious_blocks(statements); + if (compressor.option("dead_code")) { + eliminate_dead_code(statements, compressor); + } + if (compressor.option("if_return")) { + handle_if_return(statements, compressor); + } + if (compressor.sequences_limit > 0) { + sequencesize(statements, compressor); + } + if (compressor.option("join_vars")) { + join_consecutive_vars(statements, compressor); + } + if (compressor.option("collapse_vars")) { + collapse(statements, compressor); + } + } while (CHANGED && max_iter-- > 0); + + // Search from right to left for assignment-like expressions: + // - `var a = x;` + // - `a = x;` + // - `++a` + // For each candidate, scan from left to right for first usage, then try + // to fold assignment into the site for compression. + // Will not attempt to collapse assignments into or past code blocks + // which are not sequentially executed, e.g. loops and conditionals. + function collapse(statements, compressor) { + var scope = compressor.find_parent(AST_Scope); + if (scope.uses_eval || scope.uses_with) return statements; + var args; + var candidates = []; + var stat_index = statements.length; + var scanner = new TreeTransformer(function(node, descend) { + if (abort) return node; + // Skip nodes before `candidate` as quickly as possible + if (!hit) { + if (node === candidate) { + hit = true; + return node; + } + return; + } + // Stop immediately if these node types are encountered + var parent = scanner.parent(); + if (node instanceof AST_Assign && node.operator != "=" && lhs.equivalent_to(node.left) + || node instanceof AST_Call && lhs instanceof AST_PropAccess && lhs.equivalent_to(node.expression) + || node instanceof AST_Debugger + || node instanceof AST_IterationStatement && !(node instanceof AST_For) + || node instanceof AST_SymbolRef && !node.is_declared(compressor) + || node instanceof AST_Try + || node instanceof AST_With + || parent instanceof AST_For && node !== parent.init) { + abort = true; + return node; + } + // Replace variable with assignment when found + if (can_replace + && !(node instanceof AST_SymbolDeclaration) + && lhs.equivalent_to(node)) { + if (is_lhs(node, parent)) { + if (value_def) replaced++; + return node; + } + CHANGED = abort = true; + replaced++; + compressor.info("Collapsing {name} [{file}:{line},{col}]", { + name: node.print_to_string(), + file: node.start.file, + line: node.start.line, + col: node.start.col + }); + if (candidate instanceof AST_UnaryPostfix) { + return make_node(AST_UnaryPrefix, candidate, candidate); + } + if (candidate instanceof AST_VarDef) { + if (value_def) { + abort = false; + return node; + } + var def = candidate.name.definition(); + var value = candidate.value; + if (def.references.length - def.replaced == 1 && !compressor.exposed(def)) { + def.replaced++; + if (funarg && is_identifier_atom(value)) { + return value.transform(compressor); + } else { + return maintain_this_binding(parent, node, value); + } + } + return make_node(AST_Assign, candidate, { + operator: "=", + left: make_node(AST_SymbolRef, candidate.name, candidate.name), + right: value + }); + } + candidate.write_only = false; + return candidate; + } + // These node types have child nodes that execute sequentially, + // but are otherwise not safe to scan into or beyond them. + var sym; + if (node instanceof AST_Call + || node instanceof AST_Exit + || node instanceof AST_PropAccess + && (side_effects || node.expression.may_throw_on_access(compressor)) + || node instanceof AST_SymbolRef + && (lvalues[node.name] + || side_effects && !references_in_scope(node.definition())) + || (sym = lhs_or_def(node)) + && (sym instanceof AST_PropAccess || sym.name in lvalues) + || (side_effects || !replace_all) + && (parent instanceof AST_Binary && lazy_op(parent.operator) + || parent instanceof AST_Case + || parent instanceof AST_Conditional + || parent instanceof AST_If)) { + if (!(node instanceof AST_Scope)) descend(node, scanner); + abort = true; + return node; + } + // Skip (non-executed) functions and (leading) default case in switch statements + if (node instanceof AST_Default || node instanceof AST_Scope) return node; + }); + var multi_replacer = new TreeTransformer(function(node) { + if (abort) return node; + // Skip nodes before `candidate` as quickly as possible + if (!hit) { + if (node === candidate) { + hit = true; + return node; + } + return; + } + // Replace variable when found + if (node instanceof AST_SymbolRef + && node.name == def.name) { + if (!--replaced) abort = true; + if (is_lhs(node, multi_replacer.parent())) return node; + def.replaced++; + value_def.replaced--; + return candidate.value; + } + // Skip (non-executed) functions and (leading) default case in switch statements + if (node instanceof AST_Default || node instanceof AST_Scope) return node; + }); + while (--stat_index >= 0) { + // Treat parameters as collapsible in IIFE, i.e. + // function(a, b){ ... }(x()); + // would be translated into equivalent assignments: + // var a = x(), b = undefined; + if (stat_index == 0 && compressor.option("unused")) extract_args(); + // Find collapsible assignments + extract_candidates(statements[stat_index]); + while (candidates.length > 0) { + var candidate = candidates.pop(); + var value_def = null; + var lhs = get_lhs(candidate); + if (!lhs || is_lhs_read_only(lhs) || lhs.has_side_effects(compressor)) continue; + // Locate symbols which may execute code outside of scanning range + var lvalues = get_lvalues(candidate); + if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false; + var replace_all = value_def; + if (!replace_all && lhs instanceof AST_SymbolRef) { + var def = lhs.definition(); + replace_all = def.references.length - def.replaced == 1; + } + var side_effects = value_has_side_effects(candidate); + var funarg = candidate.name instanceof AST_SymbolFunarg; + var hit = funarg; + var abort = false, replaced = 0, can_replace = !args || !hit; + if (!can_replace) { + for (var j = compressor.self().argnames.lastIndexOf(candidate.name) + 1; !abort && j < args.length; j++) { + args[j].transform(scanner); + } + can_replace = true; + } + for (var i = stat_index; !abort && i < statements.length; i++) { + statements[i].transform(scanner); + } + if (value_def) { + var def = candidate.name.definition(); + if (abort && def.references.length - def.replaced > replaced) replaced = false; + else { + abort = false; + hit = funarg; + for (var i = stat_index; !abort && i < statements.length; i++) { + statements[i].transform(multi_replacer); + } + } + } + if (replaced && !remove_candidate(candidate)) statements.splice(stat_index, 1); + } + } + + function extract_args() { + var iife, fn = compressor.self(); + if (fn instanceof AST_Function + && !fn.name + && !fn.uses_arguments + && !fn.uses_eval + && (iife = compressor.parent()) instanceof AST_Call + && iife.expression === fn) { + var fn_strict = compressor.has_directive("use strict"); + if (fn_strict && !member(fn_strict, fn.body)) fn_strict = false; + var len = fn.argnames.length; + args = iife.args.slice(len); + var names = Object.create(null); + for (var i = len; --i >= 0;) { + var sym = fn.argnames[i]; + var arg = iife.args[i]; + args.unshift(make_node(AST_VarDef, sym, { + name: sym, + value: arg + })); + if (sym.name in names) continue; + names[sym.name] = true; + if (!arg) arg = make_node(AST_Undefined, sym).transform(compressor); + else { + var tw = new TreeWalker(function(node) { + if (!arg) return true; + if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) { + var s = node.definition().scope; + if (s !== scope) while (s = s.parent_scope) { + if (s === scope) return true; + } + arg = null; + } + if (node instanceof AST_This && (fn_strict || !tw.find_parent(AST_Scope))) { + arg = null; + return true; + } + }); + arg.walk(tw); + } + if (arg) candidates.unshift(make_node(AST_VarDef, sym, { + name: sym, + value: arg + })); + } + } + } + + function extract_candidates(expr) { + if (expr instanceof AST_Assign && !expr.left.has_side_effects(compressor) + || expr instanceof AST_Unary && (expr.operator == "++" || expr.operator == "--")) { + candidates.push(expr); + } else if (expr instanceof AST_Sequence) { + expr.expressions.forEach(extract_candidates); + } else if (expr instanceof AST_Definitions) { + expr.definitions.forEach(function(var_def) { + if (var_def.value) candidates.push(var_def); + }); + } else if (expr instanceof AST_SimpleStatement) { + extract_candidates(expr.body); + } else if (expr instanceof AST_For && expr.init) { + extract_candidates(expr.init); + } + } + + function mangleable_var(var_def) { + var value = var_def.value; + if (!(value instanceof AST_SymbolRef)) return; + if (value.name == "arguments") return; + var def = value.definition(); + if (def.undeclared) return; + return value_def = def; + } + + function get_lhs(expr) { + if (expr instanceof AST_VarDef) { + var def = expr.name.definition(); + if (!member(expr.name, def.orig)) return; + var declared = def.orig.length - def.eliminated; + var referenced = def.references.length - def.replaced; + if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg) + || (referenced > 1 ? mangleable_var(expr) : !compressor.exposed(def))) { + return make_node(AST_SymbolRef, expr.name, expr.name); + } + } else { + return expr[expr instanceof AST_Assign ? "left" : "expression"]; + } + } + + function get_rvalue(expr) { + return expr[expr instanceof AST_Assign ? "right" : "value"]; + } + + function get_lvalues(expr) { + var lvalues = Object.create(null); + if (expr instanceof AST_Unary) return lvalues; + var tw = new TreeWalker(function(node, descend) { + var sym = node; + while (sym instanceof AST_PropAccess) sym = sym.expression; + if (sym instanceof AST_SymbolRef || sym instanceof AST_This) { + lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent()); + } + }); + get_rvalue(expr).walk(tw); + return lvalues; + } + + function lhs_or_def(node) { + if (node instanceof AST_VarDef) return node.value && node.name; + return is_lhs(node.left, node); + } + + function remove_candidate(expr) { + if (expr.name instanceof AST_SymbolFunarg) { + var index = compressor.self().argnames.indexOf(expr.name); + var args = compressor.parent().args; + if (args[index]) args[index] = make_node(AST_Number, args[index], { + value: 0 + }); + return true; + } + var found = false; + return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) { + if (found) return node; + if (node === expr || node.body === expr) { + found = true; + if (node instanceof AST_VarDef) { + node.value = null; + return node; + } + return in_list ? MAP.skip : null; + } + }, function(node) { + if (node instanceof AST_Sequence) switch (node.expressions.length) { + case 0: return null; + case 1: return node.expressions[0]; + } + })); + } + + function value_has_side_effects(expr) { + if (expr instanceof AST_Unary) return false; + return get_rvalue(expr).has_side_effects(compressor); + } + + function references_in_scope(def) { + if (def.orig.length == 1 && def.orig[0] instanceof AST_SymbolDefun) return true; + if (def.scope !== scope) return false; + return def.references.every(function(ref) { + return ref.scope === scope; + }); + } + } + + function eliminate_spurious_blocks(statements) { + var seen_dirs = []; + for (var i = 0; i < statements.length;) { + var stat = statements[i]; + if (stat instanceof AST_BlockStatement) { + CHANGED = true; + eliminate_spurious_blocks(stat.body); + [].splice.apply(statements, [i, 1].concat(stat.body)); + i += stat.body.length; + } else if (stat instanceof AST_EmptyStatement) { + CHANGED = true; + statements.splice(i, 1); + } else if (stat instanceof AST_Directive) { + if (seen_dirs.indexOf(stat.value) < 0) { + i++; + seen_dirs.push(stat.value); + } else { + CHANGED = true; + statements.splice(i, 1); + } + } else i++; + } + } + + function handle_if_return(statements, compressor) { + var self = compressor.self(); + var multiple_if_returns = has_multiple_if_returns(statements); + var in_lambda = self instanceof AST_Lambda; + for (var i = statements.length; --i >= 0;) { + var stat = statements[i]; + var next = statements[i + 1]; + + if (in_lambda && !next && stat instanceof AST_Return) { + if (!stat.value) { + CHANGED = true; + statements.length--; + continue; + } + if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == "void") { + CHANGED = true; + statements[i] = make_node(AST_SimpleStatement, stat, { + body: stat.value.expression + }); + continue; + } + } + + if (stat instanceof AST_If) { + var ab = aborts(stat.body); + if (can_merge_flow(ab)) { + if (ab.label) { + remove(ab.label.thedef.references, ab); + } + CHANGED = true; + stat = stat.clone(); + stat.condition = stat.condition.negate(compressor); + var body = as_statement_array_with_return(stat.body, ab); + stat.body = make_node(AST_BlockStatement, stat, { + body: as_statement_array(stat.alternative).concat(extract_functions()) + }); + stat.alternative = make_node(AST_BlockStatement, stat, { + body: body + }); + statements[i] = stat.transform(compressor); + continue; + } + + var ab = aborts(stat.alternative); + if (can_merge_flow(ab)) { + if (ab.label) { + remove(ab.label.thedef.references, ab); + } + CHANGED = true; + stat = stat.clone(); + stat.body = make_node(AST_BlockStatement, stat.body, { + body: as_statement_array(stat.body).concat(extract_functions()) + }); + var body = as_statement_array_with_return(stat.alternative, ab); + stat.alternative = make_node(AST_BlockStatement, stat.alternative, { + body: body + }); + statements[i] = stat.transform(compressor); + continue; + } + } + + if (stat instanceof AST_If && stat.body instanceof AST_Return) { + var value = stat.body.value; + //--- + // pretty silly case, but: + // if (foo()) return; return; ==> foo(); return; + if (!value && !stat.alternative + && (in_lambda && !next || next instanceof AST_Return && !next.value)) { + CHANGED = true; + statements[i] = make_node(AST_SimpleStatement, stat.condition, { + body: stat.condition + }); + continue; + } + //--- + // if (foo()) return x; return y; ==> return foo() ? x : y; + if (value && !stat.alternative && next instanceof AST_Return && next.value) { + CHANGED = true; + stat = stat.clone(); + stat.alternative = next; + statements.splice(i, 2, stat.transform(compressor)); + continue; + } + //--- + // if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined; + if (multiple_if_returns && in_lambda && value && !stat.alternative + && (!next || next instanceof AST_Return)) { + CHANGED = true; + stat = stat.clone(); + stat.alternative = next || make_node(AST_Return, stat, { + value: null + }); + statements.splice(i, next ? 2 : 1, stat.transform(compressor)); + continue; + } + //--- + // if (a) return b; if (c) return d; e; ==> return a ? b : c ? d : void e; + // + // if sequences is not enabled, this can lead to an endless loop (issue #866). + // however, with sequences on this helps producing slightly better output for + // the example code. + var prev = statements[i - 1]; + if (compressor.option("sequences") && in_lambda && !stat.alternative + && prev instanceof AST_If && prev.body instanceof AST_Return + && i + 2 == statements.length && next instanceof AST_SimpleStatement) { + CHANGED = true; + stat = stat.clone(); + stat.alternative = make_node(AST_BlockStatement, next, { + body: [ + next, + make_node(AST_Return, next, { + value: null + }) + ] + }); + statements.splice(i, 2, stat.transform(compressor)); + continue; + } + } + } + + function has_multiple_if_returns(statements) { + var n = 0; + for (var i = statements.length; --i >= 0;) { + var stat = statements[i]; + if (stat instanceof AST_If && stat.body instanceof AST_Return) { + if (++n > 1) return true; + } + } + return false; + } + + function is_return_void(value) { + return !value || value instanceof AST_UnaryPrefix && value.operator == "void"; + } + + function can_merge_flow(ab) { + if (!ab) return false; + var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab) : null; + return ab instanceof AST_Return && in_lambda && is_return_void(ab.value) + || ab instanceof AST_Continue && self === loop_body(lct) + || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct; + } + + function extract_functions() { + var tail = statements.slice(i + 1); + statements.length = i + 1; + return tail.filter(function(stat) { + if (stat instanceof AST_Defun) { + statements.push(stat); + return false; + } + return true; + }); + } + + function as_statement_array_with_return(node, ab) { + var body = as_statement_array(node).slice(0, -1); + if (ab.value) { + body.push(make_node(AST_SimpleStatement, ab.value, { + body: ab.value.expression + })); + } + return body; + } + } + + function eliminate_dead_code(statements, compressor) { + var has_quit; + var self = compressor.self(); + for (var i = 0, n = 0, len = statements.length; i < len; i++) { + var stat = statements[i]; + if (stat instanceof AST_LoopControl) { + var lct = compressor.loopcontrol_target(stat); + if (stat instanceof AST_Break + && !(lct instanceof AST_IterationStatement) + && loop_body(lct) === self + || stat instanceof AST_Continue + && loop_body(lct) === self) { + if (stat.label) { + remove(stat.label.thedef.references, stat); + } + } else { + statements[n++] = stat; + } + } else { + statements[n++] = stat; + } + if (aborts(stat)) { + has_quit = statements.slice(i + 1); + break; + } + } + statements.length = n; + CHANGED = n != len; + if (has_quit) has_quit.forEach(function(stat) { + extract_declarations_from_unreachable_code(compressor, stat, statements); + }); + } + + function sequencesize(statements, compressor) { + if (statements.length < 2) return; + var seq = [], n = 0; + function push_seq() { + if (!seq.length) return; + var body = make_sequence(seq[0], seq); + statements[n++] = make_node(AST_SimpleStatement, body, { body: body }); + seq = []; + } + for (var i = 0, len = statements.length; i < len; i++) { + var stat = statements[i]; + if (stat instanceof AST_SimpleStatement) { + if (seq.length >= compressor.sequences_limit) push_seq(); + var body = stat.body; + if (seq.length > 0) body = body.drop_side_effect_free(compressor); + if (body) merge_sequence(seq, body); + } else { + push_seq(); + statements[n++] = stat; + } + } + push_seq(); + statements.length = n; + sequencesize_2(statements, compressor); + CHANGED = statements.length != len; + } + + function sequencesize_2(statements, compressor) { + function cons_seq(right) { + n--; + var left = prev.body; + return make_sequence(left, [ left, right ]).transform(compressor); + }; + var n = 0, prev; + for (var i = 0, len = statements.length; i < len; i++) { + var stat = statements[i]; + if (prev) { + if (stat instanceof AST_For && !(stat.init instanceof AST_Definitions)) { + var abort = false; + prev.body.walk(new TreeWalker(function(node) { + if (abort || node instanceof AST_Scope) return true; + if (node instanceof AST_Binary && node.operator == "in") { + abort = true; + return true; + } + })); + if (!abort) { + if (stat.init) stat.init = cons_seq(stat.init); + else { + stat.init = prev.body; + n--; + } + } + } + else if (stat instanceof AST_If) { + stat.condition = cons_seq(stat.condition); + } + else if (stat instanceof AST_With) { + stat.expression = cons_seq(stat.expression); + } + else if (stat instanceof AST_Exit && stat.value) { + stat.value = cons_seq(stat.value); + } + else if (stat instanceof AST_Exit) { + stat.value = cons_seq(make_node(AST_Undefined, stat).transform(compressor)); + } + else if (stat instanceof AST_Switch) { + stat.expression = cons_seq(stat.expression); + } + } + statements[n++] = stat; + prev = stat instanceof AST_SimpleStatement ? stat : null; + } + statements.length = n; + } + + function join_consecutive_vars(statements, compressor) { + for (var i = 0, j = -1, len = statements.length; i < len; i++) { + var stat = statements[i]; + var prev = statements[j]; + if (stat instanceof AST_Definitions && prev && prev.TYPE == stat.TYPE) { + prev.definitions = prev.definitions.concat(stat.definitions); + CHANGED = true; + } + else if (stat instanceof AST_For + && prev instanceof AST_Var + && (!stat.init || stat.init.TYPE == prev.TYPE)) { + CHANGED = true; + if (stat.init) { + stat.init.definitions = prev.definitions.concat(stat.init.definitions); + } else { + stat.init = prev; + } + statements[j] = stat; + } + else { + statements[++j] = stat; + } + } + statements.length = j + 1; + }; + } + + function extract_declarations_from_unreachable_code(compressor, stat, target) { + if (!(stat instanceof AST_Defun)) { + compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); + } + stat.walk(new TreeWalker(function(node){ + if (node instanceof AST_Definitions) { + compressor.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start); + node.remove_initializers(); + target.push(node); + return true; + } + if (node instanceof AST_Defun && (node === stat || !compressor.has_directive("use strict"))) { + target.push(node); + return true; + } + if (node instanceof AST_Scope) { + return true; + } + })); + }; + + function is_undefined(node, compressor) { + return node.is_undefined + || node instanceof AST_Undefined + || node instanceof AST_UnaryPrefix + && node.operator == "void" + && !node.expression.has_side_effects(compressor); + } + + // may_throw_on_access() + // returns true if this node may be null, undefined or contain `AST_Accessor` + (function(def) { + AST_Node.DEFMETHOD("may_throw_on_access", function(compressor) { + return !compressor.option("pure_getters") + || this._dot_throw(compressor); + }); + + function is_strict(compressor) { + return /strict/.test(compressor.option("pure_getters")); + } + + def(AST_Node, is_strict); + def(AST_Null, return_true); + def(AST_Undefined, return_true); + def(AST_Constant, return_false); + def(AST_Array, return_false); + def(AST_Object, function(compressor) { + if (!is_strict(compressor)) return false; + for (var i = this.properties.length; --i >=0;) + if (this.properties[i].value instanceof AST_Accessor) return true; + return false; + }); + def(AST_Function, return_false); + def(AST_UnaryPostfix, return_false); + def(AST_UnaryPrefix, function() { + return this.operator == "void"; + }); + def(AST_Binary, function(compressor) { + switch (this.operator) { + case "&&": + return this.left._dot_throw(compressor); + case "||": + return this.left._dot_throw(compressor) + && this.right._dot_throw(compressor); + default: + return false; + } + }) + def(AST_Assign, function(compressor) { + return this.operator == "=" + && this.right._dot_throw(compressor); + }) + def(AST_Conditional, function(compressor) { + return this.consequent._dot_throw(compressor) + || this.alternative._dot_throw(compressor); + }) + def(AST_Sequence, function(compressor) { + return this.tail_node()._dot_throw(compressor); + }); + def(AST_SymbolRef, function(compressor) { + if (this.is_undefined) return true; + if (!is_strict(compressor)) return false; + if (is_undeclared_ref(this) && this.is_declared(compressor)) return false; + if (this.is_immutable()) return false; + var fixed = this.fixed_value(); + return !fixed || fixed._dot_throw(compressor); + }); + })(function(node, func) { + node.DEFMETHOD("_dot_throw", func); + }); + + /* -----[ boolean/negation helpers ]----- */ + + // methods to determine whether an expression has a boolean result type + (function(def){ + var unary_bool = [ "!", "delete" ]; + var binary_bool = [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ]; + def(AST_Node, return_false); + def(AST_UnaryPrefix, function(){ + return member(this.operator, unary_bool); + }); + def(AST_Binary, function(){ + return member(this.operator, binary_bool) + || lazy_op(this.operator) + && this.left.is_boolean() + && this.right.is_boolean(); + }); + def(AST_Conditional, function(){ + return this.consequent.is_boolean() && this.alternative.is_boolean(); + }); + def(AST_Assign, function(){ + return this.operator == "=" && this.right.is_boolean(); + }); + def(AST_Sequence, function(){ + return this.tail_node().is_boolean(); + }); + def(AST_True, return_true); + def(AST_False, return_true); + })(function(node, func){ + node.DEFMETHOD("is_boolean", func); + }); + + // methods to determine if an expression has a numeric result type + (function(def){ + def(AST_Node, return_false); + def(AST_Number, return_true); + var unary = makePredicate("+ - ~ ++ --"); + def(AST_Unary, function(){ + return unary(this.operator); + }); + var binary = makePredicate("- * / % & | ^ << >> >>>"); + def(AST_Binary, function(compressor){ + return binary(this.operator) || this.operator == "+" + && this.left.is_number(compressor) + && this.right.is_number(compressor); + }); + def(AST_Assign, function(compressor){ + return binary(this.operator.slice(0, -1)) + || this.operator == "=" && this.right.is_number(compressor); + }); + def(AST_Sequence, function(compressor){ + return this.tail_node().is_number(compressor); + }); + def(AST_Conditional, function(compressor){ + return this.consequent.is_number(compressor) && this.alternative.is_number(compressor); + }); + })(function(node, func){ + node.DEFMETHOD("is_number", func); + }); + + // methods to determine if an expression has a string result type + (function(def){ + def(AST_Node, return_false); + def(AST_String, return_true); + def(AST_UnaryPrefix, function(){ + return this.operator == "typeof"; + }); + def(AST_Binary, function(compressor){ + return this.operator == "+" && + (this.left.is_string(compressor) || this.right.is_string(compressor)); + }); + def(AST_Assign, function(compressor){ + return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor); + }); + def(AST_Sequence, function(compressor){ + return this.tail_node().is_string(compressor); + }); + def(AST_Conditional, function(compressor){ + return this.consequent.is_string(compressor) && this.alternative.is_string(compressor); + }); + })(function(node, func){ + node.DEFMETHOD("is_string", func); + }); + + var lazy_op = makePredicate("&& ||"); + var unary_side_effects = makePredicate("delete ++ --"); + + function is_lhs(node, parent) { + if (parent instanceof AST_Unary && unary_side_effects(parent.operator)) return parent.expression; + if (parent instanceof AST_Assign && parent.left === node) return node; + } + + (function(def){ + AST_Node.DEFMETHOD("resolve_defines", function(compressor) { + if (!compressor.option("global_defs")) return; + var def = this._find_defs(compressor, ""); + if (def) { + var node, parent = this, level = 0; + do { + node = parent; + parent = compressor.parent(level++); + } while (parent instanceof AST_PropAccess && parent.expression === node); + if (is_lhs(node, parent)) { + compressor.warn('global_defs ' + this.print_to_string() + ' redefined [{file}:{line},{col}]', this.start); + } else { + return def; + } + } + }); + function to_node(value, orig) { + if (value instanceof AST_Node) return make_node(value.CTOR, orig, value); + if (Array.isArray(value)) return make_node(AST_Array, orig, { + elements: value.map(function(value) { + return to_node(value, orig); + }) + }); + if (value && typeof value == "object") { + var props = []; + for (var key in value) if (HOP(value, key)) { + props.push(make_node(AST_ObjectKeyVal, orig, { + key: key, + value: to_node(value[key], orig) + })); + } + return make_node(AST_Object, orig, { + properties: props + }); + } + return make_node_from_constant(value, orig); + } + def(AST_Node, noop); + def(AST_Dot, function(compressor, suffix){ + return this.expression._find_defs(compressor, "." + this.property + suffix); + }); + def(AST_SymbolRef, function(compressor, suffix){ + if (!this.global()) return; + var name; + var defines = compressor.option("global_defs"); + if (defines && HOP(defines, (name = this.name + suffix))) { + var node = to_node(defines[name], this); + var top = compressor.find_parent(AST_Toplevel); + node.walk(new TreeWalker(function(node) { + if (node instanceof AST_SymbolRef) { + node.scope = top; + node.thedef = top.def_global(node); + } + })); + return node; + } + }); + })(function(node, func){ + node.DEFMETHOD("_find_defs", func); + }); + + function best_of_expression(ast1, ast2) { + return ast1.print_to_string().length > + ast2.print_to_string().length + ? ast2 : ast1; + } + + function best_of_statement(ast1, ast2) { + return best_of_expression(make_node(AST_SimpleStatement, ast1, { + body: ast1 + }), make_node(AST_SimpleStatement, ast2, { + body: ast2 + })).body; + } + + function best_of(compressor, ast1, ast2) { + return (first_in_statement(compressor) ? best_of_statement : best_of_expression)(ast1, ast2); + } + + // methods to evaluate a constant expression + (function(def){ + // If the node has been successfully reduced to a constant, + // then its value is returned; otherwise the element itself + // is returned. + // They can be distinguished as constant value is never a + // descendant of AST_Node. + AST_Node.DEFMETHOD("evaluate", function(compressor){ + if (!compressor.option("evaluate")) return this; + var val = this._eval(compressor); + return !val || val instanceof RegExp || typeof val != "object" ? val : this; + }); + var unaryPrefix = makePredicate("! ~ - + void"); + AST_Node.DEFMETHOD("is_constant", function(){ + // Accomodate when compress option evaluate=false + // as well as the common constant expressions !0 and -1 + if (this instanceof AST_Constant) { + return !(this instanceof AST_RegExp); + } else { + return this instanceof AST_UnaryPrefix + && this.expression instanceof AST_Constant + && unaryPrefix(this.operator); + } + }); + def(AST_Statement, function(){ + throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); + }); + def(AST_Lambda, return_this); + function ev(node, compressor) { + if (!compressor) throw new Error("Compressor must be passed"); + + return node._eval(compressor); + }; + def(AST_Node, return_this); + def(AST_Constant, function(){ + return this.getValue(); + }); + def(AST_Array, function(compressor){ + if (compressor.option("unsafe")) { + var elements = []; + for (var i = 0, len = this.elements.length; i < len; i++) { + var element = this.elements[i]; + if (element instanceof AST_Function) continue; + var value = ev(element, compressor); + if (element === value) return this; + elements.push(value); + } + return elements; + } + return this; + }); + def(AST_Object, function(compressor){ + if (compressor.option("unsafe")) { + var val = {}; + for (var i = 0, len = this.properties.length; i < len; i++) { + var prop = this.properties[i]; + var key = prop.key; + if (key instanceof AST_Symbol) { + key = key.name; + } else if (key instanceof AST_Node) { + key = ev(key, compressor); + if (key === prop.key) return this; + } + if (typeof Object.prototype[key] === 'function') { + return this; + } + if (prop.value instanceof AST_Function) continue; + val[key] = ev(prop.value, compressor); + if (val[key] === prop.value) return this; + } + return val; + } + return this; + }); + def(AST_UnaryPrefix, function(compressor){ + var e = this.expression; + // Function would be evaluated to an array and so typeof would + // incorrectly return 'object'. Hence making is a special case. + if (compressor.option("typeofs") + && this.operator == "typeof" + && (e instanceof AST_Lambda + || e instanceof AST_SymbolRef + && e.fixed_value() instanceof AST_Lambda)) { + return typeof function(){}; + } + e = ev(e, compressor); + if (e === this.expression) return this; + switch (this.operator) { + case "!": return !e; + case "typeof": + // typeof returns "object" or "function" on different platforms + // so cannot evaluate reliably + if (e instanceof RegExp) return this; + return typeof e; + case "void": return void e; + case "~": return ~e; + case "-": return -e; + case "+": return +e; + } + return this; + }); + def(AST_Binary, function(compressor){ + var left = ev(this.left, compressor); + if (left === this.left) return this; + var right = ev(this.right, compressor); + if (right === this.right) return this; + var result; + switch (this.operator) { + case "&&" : result = left && right; break; + case "||" : result = left || right; break; + case "|" : result = left | right; break; + case "&" : result = left & right; break; + case "^" : result = left ^ right; break; + case "+" : result = left + right; break; + case "*" : result = left * right; break; + case "/" : result = left / right; break; + case "%" : result = left % right; break; + case "-" : result = left - right; break; + case "<<" : result = left << right; break; + case ">>" : result = left >> right; break; + case ">>>" : result = left >>> right; break; + case "==" : result = left == right; break; + case "===" : result = left === right; break; + case "!=" : result = left != right; break; + case "!==" : result = left !== right; break; + case "<" : result = left < right; break; + case "<=" : result = left <= right; break; + case ">" : result = left > right; break; + case ">=" : result = left >= right; break; + default: + return this; + } + if (isNaN(result) && compressor.find_parent(AST_With)) { + // leave original expression as is + return this; + } + return result; + }); + def(AST_Conditional, function(compressor){ + var condition = ev(this.condition, compressor); + if (condition === this.condition) return this; + var node = condition ? this.consequent : this.alternative; + var value = ev(node, compressor); + return value === node ? this : value; + }); + def(AST_SymbolRef, function(compressor){ + var fixed = this.fixed_value(); + if (!fixed) return this; + this._eval = return_this; + var value = ev(fixed, compressor); + if (value === fixed) { + delete this._eval; + return this; + } + if (!HOP(fixed, "_eval")) fixed._eval = function() { + return value; + }; + if (value && typeof value == "object" && this.definition().escaped) { + delete this._eval; + return this; + } + this._eval = fixed._eval; + return value; + }); + var global_objs = { + Array: Array, + Math: Math, + Number: Number, + String: String, + }; + function convert_to_predicate(obj) { + for (var key in obj) { + obj[key] = makePredicate(obj[key]); + } + } + var static_values = { + Math: [ + "E", + "LN10", + "LN2", + "LOG2E", + "LOG10E", + "PI", + "SQRT1_2", + "SQRT2", + ], + Number: [ + "MAX_VALUE", + "MIN_VALUE", + "NaN", + "NEGATIVE_INFINITY", + "POSITIVE_INFINITY", + ], + }; + convert_to_predicate(static_values); + def(AST_PropAccess, function(compressor){ + if (compressor.option("unsafe")) { + var key = this.property; + if (key instanceof AST_Node) { + key = ev(key, compressor); + if (key === this.property) return this; + } + var exp = this.expression; + var val; + if (is_undeclared_ref(exp)) { + if (!(static_values[exp.name] || return_false)(key)) return this; + val = global_objs[exp.name]; + } else { + val = ev(exp, compressor); + if (!val || val === exp || !HOP(val, key)) return this; + } + return val[key]; + } + return this; + }); + var object_fns = [ + "constructor", + "toString", + "valueOf", + ]; + var native_fns = { + Array: [ + "indexOf", + "join", + "lastIndexOf", + "slice", + ].concat(object_fns), + Boolean: object_fns, + Number: [ + "toExponential", + "toFixed", + "toPrecision", + ].concat(object_fns), + RegExp: [ + "test", + ].concat(object_fns), + String: [ + "charAt", + "charCodeAt", + "concat", + "indexOf", + "italics", + "lastIndexOf", + "match", + "replace", + "search", + "slice", + "split", + "substr", + "substring", + "trim", + ].concat(object_fns), + }; + convert_to_predicate(native_fns); + var static_fns = { + Array: [ + "isArray", + ], + Math: [ + "abs", + "acos", + "asin", + "atan", + "ceil", + "cos", + "exp", + "floor", + "log", + "round", + "sin", + "sqrt", + "tan", + "atan2", + "pow", + "max", + "min" + ], + Number: [ + "isFinite", + "isNaN", + ], + String: [ + "fromCharCode", + ], + }; + convert_to_predicate(static_fns); + def(AST_Call, function(compressor){ + var exp = this.expression; + if (compressor.option("unsafe") && exp instanceof AST_PropAccess) { + var key = exp.property; + if (key instanceof AST_Node) { + key = ev(key, compressor); + if (key === exp.property) return this; + } + var val; + var e = exp.expression; + if (is_undeclared_ref(e)) { + if (!(static_fns[e.name] || return_false)(key)) return this; + val = global_objs[e.name]; + } else { + val = ev(e, compressor); + if (val === e || !(val && native_fns[val.constructor.name] || return_false)(key)) return this; + } + var args = []; + for (var i = 0, len = this.args.length; i < len; i++) { + var arg = this.args[i]; + var value = ev(arg, compressor); + if (arg === value) return this; + args.push(value); + } + return val[key].apply(val, args); + } + return this; + }); + def(AST_New, return_this); + })(function(node, func){ + node.DEFMETHOD("_eval", func); + }); + + // method to negate an expression + (function(def){ + function basic_negation(exp) { + return make_node(AST_UnaryPrefix, exp, { + operator: "!", + expression: exp + }); + } + function best(orig, alt, first_in_statement) { + var negated = basic_negation(orig); + if (first_in_statement) { + var stat = make_node(AST_SimpleStatement, alt, { + body: alt + }); + return best_of_expression(negated, stat) === stat ? alt : negated; + } + return best_of_expression(negated, alt); + } + def(AST_Node, function(){ + return basic_negation(this); + }); + def(AST_Statement, function(){ + throw new Error("Cannot negate a statement"); + }); + def(AST_Function, function(){ + return basic_negation(this); + }); + def(AST_UnaryPrefix, function(){ + if (this.operator == "!") + return this.expression; + return basic_negation(this); + }); + def(AST_Sequence, function(compressor){ + var expressions = this.expressions.slice(); + expressions.push(expressions.pop().negate(compressor)); + return make_sequence(this, expressions); + }); + def(AST_Conditional, function(compressor, first_in_statement){ + var self = this.clone(); + self.consequent = self.consequent.negate(compressor); + self.alternative = self.alternative.negate(compressor); + return best(this, self, first_in_statement); + }); + def(AST_Binary, function(compressor, first_in_statement){ + var self = this.clone(), op = this.operator; + if (compressor.option("unsafe_comps")) { + switch (op) { + case "<=" : self.operator = ">" ; return self; + case "<" : self.operator = ">=" ; return self; + case ">=" : self.operator = "<" ; return self; + case ">" : self.operator = "<=" ; return self; + } + } + switch (op) { + case "==" : self.operator = "!="; return self; + case "!=" : self.operator = "=="; return self; + case "===": self.operator = "!=="; return self; + case "!==": self.operator = "==="; return self; + case "&&": + self.operator = "||"; + self.left = self.left.negate(compressor, first_in_statement); + self.right = self.right.negate(compressor); + return best(this, self, first_in_statement); + case "||": + self.operator = "&&"; + self.left = self.left.negate(compressor, first_in_statement); + self.right = self.right.negate(compressor); + return best(this, self, first_in_statement); + } + return basic_negation(this); + }); + })(function(node, func){ + node.DEFMETHOD("negate", function(compressor, first_in_statement){ + return func.call(this, compressor, first_in_statement); + }); + }); + + AST_Call.DEFMETHOD("has_pure_annotation", function(compressor) { + if (!compressor.option("side_effects")) return false; + if (this.pure !== undefined) return this.pure; + var pure = false; + var comments, pure_comment; + if (this.start + && (comments = this.start.comments_before) + && comments.length + && (pure_comment = find_if(function (comment) { + return /[@#]__PURE__/.test(comment.value); + }, comments))) { + pure = pure_comment; + } + return this.pure = pure; + }); + + var global_pure_fns = makePredicate("Boolean decodeURI decodeURIComponent Date encodeURI encodeURIComponent Error escape EvalError isFinite isNaN Number Object parseFloat parseInt RangeError ReferenceError String SyntaxError TypeError unescape URIError"); + AST_Call.DEFMETHOD("is_expr_pure", function(compressor) { + if (compressor.option("unsafe")) { + var expr = this.expression; + if (is_undeclared_ref(expr) && global_pure_fns(expr.name)) return true; + } + return this.has_pure_annotation(compressor) || !compressor.pure_funcs(this); + }); + + // determine if expression has side effects + (function(def){ + def(AST_Node, return_true); + + def(AST_EmptyStatement, return_false); + def(AST_Constant, return_false); + def(AST_This, return_false); + + def(AST_Call, function(compressor){ + if (!this.is_expr_pure(compressor)) return true; + for (var i = this.args.length; --i >= 0;) { + if (this.args[i].has_side_effects(compressor)) + return true; + } + return false; + }); + + function any(list, compressor) { + for (var i = list.length; --i >= 0;) + if (list[i].has_side_effects(compressor)) + return true; + return false; + } + + def(AST_Block, function(compressor){ + return any(this.body, compressor); + }); + def(AST_Switch, function(compressor){ + return this.expression.has_side_effects(compressor) + || any(this.body, compressor); + }); + def(AST_Case, function(compressor){ + return this.expression.has_side_effects(compressor) + || any(this.body, compressor); + }); + def(AST_Try, function(compressor){ + return any(this.body, compressor) + || this.bcatch && this.bcatch.has_side_effects(compressor) + || this.bfinally && this.bfinally.has_side_effects(compressor); + }); + def(AST_If, function(compressor){ + return this.condition.has_side_effects(compressor) + || this.body && this.body.has_side_effects(compressor) + || this.alternative && this.alternative.has_side_effects(compressor); + }); + def(AST_LabeledStatement, function(compressor){ + return this.body.has_side_effects(compressor); + }); + def(AST_SimpleStatement, function(compressor){ + return this.body.has_side_effects(compressor); + }); + def(AST_Defun, return_true); + def(AST_Function, return_false); + def(AST_Binary, function(compressor){ + return this.left.has_side_effects(compressor) + || this.right.has_side_effects(compressor); + }); + def(AST_Assign, return_true); + def(AST_Conditional, function(compressor){ + return this.condition.has_side_effects(compressor) + || this.consequent.has_side_effects(compressor) + || this.alternative.has_side_effects(compressor); + }); + def(AST_Unary, function(compressor){ + return unary_side_effects(this.operator) + || this.expression.has_side_effects(compressor); + }); + def(AST_SymbolRef, function(compressor){ + return !this.is_declared(compressor); + }); + def(AST_SymbolDeclaration, return_false); + def(AST_Object, function(compressor){ + return any(this.properties, compressor); + }); + def(AST_ObjectProperty, function(compressor){ + return this.value.has_side_effects(compressor); + }); + def(AST_Array, function(compressor){ + return any(this.elements, compressor); + }); + def(AST_Dot, function(compressor){ + return this.expression.may_throw_on_access(compressor) + || this.expression.has_side_effects(compressor); + }); + def(AST_Sub, function(compressor){ + return this.expression.may_throw_on_access(compressor) + || this.expression.has_side_effects(compressor) + || this.property.has_side_effects(compressor); + }); + def(AST_Sequence, function(compressor){ + return this.expressions.some(function(expression, index) { + return expression.has_side_effects(compressor); + }); + }); + })(function(node, func){ + node.DEFMETHOD("has_side_effects", func); + }); + + // determine if expression is constant + (function(def){ + function all(list) { + for (var i = list.length; --i >= 0;) + if (!list[i].is_constant_expression()) + return false; + return true; + } + def(AST_Node, return_false); + def(AST_Constant, return_true); + def(AST_Lambda, function(scope){ + var self = this; + var result = true; + self.walk(new TreeWalker(function(node) { + if (!result) return true; + if (node instanceof AST_SymbolRef) { + if (self.inlined) { + result = false; + return true; + } + var def = node.definition(); + if (member(def, self.enclosed) + && !self.variables.has(def.name)) { + if (scope) { + var scope_def = scope.find_variable(node); + if (def.undeclared ? !scope_def : scope_def === def) { + result = "f"; + return true; + } + } + result = false; + } + return true; + } + })); + return result; + }); + def(AST_Unary, function(){ + return this.expression.is_constant_expression(); + }); + def(AST_Binary, function(){ + return this.left.is_constant_expression() && this.right.is_constant_expression(); + }); + def(AST_Array, function(){ + return all(this.elements); + }); + def(AST_Object, function(){ + return all(this.properties); + }); + def(AST_ObjectProperty, function(){ + return this.value.is_constant_expression(); + }); + })(function(node, func){ + node.DEFMETHOD("is_constant_expression", func); + }); + + // tell me if a statement aborts + function aborts(thing) { + return thing && thing.aborts(); + }; + (function(def){ + def(AST_Statement, return_null); + def(AST_Jump, return_this); + function block_aborts(){ + var n = this.body.length; + return n > 0 && aborts(this.body[n - 1]); + }; + def(AST_BlockStatement, block_aborts); + def(AST_SwitchBranch, block_aborts); + def(AST_If, function(){ + return this.alternative && aborts(this.body) && aborts(this.alternative) && this; + }); + })(function(node, func){ + node.DEFMETHOD("aborts", func); + }); + + /* -----[ optimizers ]----- */ + + OPT(AST_Directive, function(self, compressor){ + if (compressor.has_directive(self.value) !== self) { + return make_node(AST_EmptyStatement, self); + } + return self; + }); + + OPT(AST_Debugger, function(self, compressor){ + if (compressor.option("drop_debugger")) + return make_node(AST_EmptyStatement, self); + return self; + }); + + OPT(AST_LabeledStatement, function(self, compressor){ + if (self.body instanceof AST_Break + && compressor.loopcontrol_target(self.body) === self.body) { + return make_node(AST_EmptyStatement, self); + } + return self.label.references.length == 0 ? self.body : self; + }); + + OPT(AST_Block, function(self, compressor){ + tighten_body(self.body, compressor); + return self; + }); + + OPT(AST_BlockStatement, function(self, compressor){ + tighten_body(self.body, compressor); + switch (self.body.length) { + case 1: return self.body[0]; + case 0: return make_node(AST_EmptyStatement, self); + } + return self; + }); + + AST_Scope.DEFMETHOD("drop_unused", function(compressor){ + if (!compressor.option("unused")) return; + if (compressor.has_directive("use asm")) return; + var self = this; + if (self.uses_eval || self.uses_with) return; + var drop_funcs = !(self instanceof AST_Toplevel) || compressor.toplevel.funcs; + var drop_vars = !(self instanceof AST_Toplevel) || compressor.toplevel.vars; + var assign_as_unused = /keep_assign/.test(compressor.option("unused")) ? return_false : function(node) { + if (node instanceof AST_Assign && (node.write_only || node.operator == "=")) { + return node.left; + } + if (node instanceof AST_Unary && node.write_only) return node.expression; + }; + var in_use = []; + var in_use_ids = Object.create(null); // avoid expensive linear scans of in_use + if (self instanceof AST_Toplevel && compressor.top_retain) { + self.variables.each(function(def) { + if (compressor.top_retain(def) && !(def.id in in_use_ids)) { + in_use_ids[def.id] = true; + in_use.push(def); + } + }); + } + var var_defs_by_id = new Dictionary(); + var initializations = new Dictionary(); + // pass 1: find out which symbols are directly used in + // this scope (not in nested scopes). + var scope = this; + var tw = new TreeWalker(function(node, descend){ + if (node === self) return; + if (node instanceof AST_Defun) { + if (!drop_funcs && scope === self) { + var node_def = node.name.definition(); + if (!(node_def.id in in_use_ids)) { + in_use_ids[node_def.id] = true; + in_use.push(node_def); + } + } + initializations.add(node.name.name, node); + return true; // don't go in nested scopes + } + if (node instanceof AST_SymbolFunarg && scope === self) { + var_defs_by_id.add(node.definition().id, node); + } + if (node instanceof AST_Definitions && scope === self) { + node.definitions.forEach(function(def){ + var node_def = def.name.definition(); + if (def.name instanceof AST_SymbolVar) { + var_defs_by_id.add(node_def.id, def); + } + if (!drop_vars) { + if (!(node_def.id in in_use_ids)) { + in_use_ids[node_def.id] = true; + in_use.push(node_def); + } + } + if (def.value) { + initializations.add(def.name.name, def.value); + if (def.value.has_side_effects(compressor)) { + def.value.walk(tw); + } + } + }); + return true; + } + return scan_ref_scoped(node, descend); + }); + self.walk(tw); + // pass 2: for every used symbol we need to walk its + // initialization code to figure out if it uses other + // symbols (that may not be in_use). + tw = new TreeWalker(scan_ref_scoped); + for (var i = 0; i < in_use.length; ++i) { + in_use[i].orig.forEach(function(decl){ + // undeclared globals will be instanceof AST_SymbolRef + var init = initializations.get(decl.name); + if (init) init.forEach(function(init){ + init.walk(tw); + }); + }); + } + // pass 3: we should drop declarations not in_use + var tt = new TreeTransformer( + function before(node, descend, in_list) { + var parent = tt.parent(); + if (drop_vars) { + var sym = assign_as_unused(node); + if (sym instanceof AST_SymbolRef + && !(sym.definition().id in in_use_ids)) { + if (node instanceof AST_Assign) { + return maintain_this_binding(parent, node, node.right.transform(tt)); + } + return make_node(AST_Number, node, { + value: 0 + }); + } + } + if (scope !== self) return; + if (node instanceof AST_Function + && node.name + && !compressor.option("keep_fnames")) { + var def = node.name.definition(); + // any declarations with same name will overshadow + // name of this anonymous function and can therefore + // never be used anywhere + if (!(def.id in in_use_ids) || def.orig.length > 1) + node.name = null; + } + if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) { + var trim = !compressor.option("keep_fargs"); + for (var a = node.argnames, i = a.length; --i >= 0;) { + var sym = a[i]; + if (!(sym.definition().id in in_use_ids)) { + sym.__unused = true; + if (trim) { + a.pop(); + compressor[sym.unreferenced() ? "warn" : "info"]("Dropping unused function argument {name} [{file}:{line},{col}]", template(sym)); + } + } + else { + trim = false; + } + } + } + if (drop_funcs && node instanceof AST_Defun && node !== self) { + var def = node.name.definition(); + if (!(def.id in in_use_ids)) { + compressor[node.name.unreferenced() ? "warn" : "info"]("Dropping unused function {name} [{file}:{line},{col}]", template(node.name)); + def.eliminated++; + return make_node(AST_EmptyStatement, node); + } + } + if (node instanceof AST_Definitions && !(parent instanceof AST_ForIn && parent.init === node)) { + // place uninitialized names at the start + var body = [], head = [], tail = []; + // for unused names whose initialization has + // side effects, we can cascade the init. code + // into the next one, or next statement. + var side_effects = []; + node.definitions.forEach(function(def) { + if (def.value) def.value = def.value.transform(tt); + var sym = def.name.definition(); + if (!drop_vars || sym.id in in_use_ids) { + if (def.name instanceof AST_SymbolVar) { + var var_defs = var_defs_by_id.get(sym.id); + if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) { + compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); + if (def.value) { + side_effects.push(make_node(AST_Assign, def, { + operator: "=", + left: make_node(AST_SymbolRef, def.name, def.name), + right: def.value + })); + } + remove(var_defs, def); + sym.eliminated++; + return; + } + } + if (def.value) { + if (side_effects.length > 0) { + if (tail.length > 0) { + side_effects.push(def.value); + def.value = make_sequence(def.value, side_effects); + } else { + body.push(make_node(AST_SimpleStatement, node, { + body: make_sequence(node, side_effects) + })); + } + side_effects = []; + } + tail.push(def); + } else { + head.push(def); + } + } else if (sym.orig[0] instanceof AST_SymbolCatch) { + var value = def.value && def.value.drop_side_effect_free(compressor); + if (value) side_effects.push(value); + def.value = null; + head.push(def); + } else { + var value = def.value && def.value.drop_side_effect_free(compressor); + if (value) { + compressor.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]", template(def.name)); + side_effects.push(value); + } else { + compressor[def.name.unreferenced() ? "warn" : "info"]("Dropping unused variable {name} [{file}:{line},{col}]", template(def.name)); + } + sym.eliminated++; + } + }); + if (head.length > 0 || tail.length > 0) { + node.definitions = head.concat(tail); + body.push(node); + } + if (side_effects.length > 0) { + body.push(make_node(AST_SimpleStatement, node, { + body: make_sequence(node, side_effects) + })); + } + switch (body.length) { + case 0: + return in_list ? MAP.skip : make_node(AST_EmptyStatement, node); + case 1: + return body[0]; + default: + return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, { + body: body + }); + } + } + // certain combination of unused name + side effect leads to: + // https://github.com/mishoo/UglifyJS2/issues/44 + // https://github.com/mishoo/UglifyJS2/issues/1830 + // https://github.com/mishoo/UglifyJS2/issues/1838 + // that's an invalid AST. + // We fix it at this stage by moving the `var` outside the `for`. + if (node instanceof AST_For) { + descend(node, this); + var block; + if (node.init instanceof AST_BlockStatement) { + block = node.init; + node.init = block.body.pop(); + block.body.push(node); + } + if (node.init instanceof AST_SimpleStatement) { + node.init = node.init.body; + } else if (is_empty(node.init)) { + node.init = null; + } + return !block ? node : in_list ? MAP.splice(block.body) : block; + } + if (node instanceof AST_LabeledStatement && node.body instanceof AST_For) { + descend(node, this); + if (node.body instanceof AST_BlockStatement) { + var block = node.body; + node.body = block.body.pop(); + block.body.push(node); + return in_list ? MAP.splice(block.body) : block; + } + return node; + } + if (node instanceof AST_Scope) { + var save_scope = scope; + scope = node; + descend(node, this); + scope = save_scope; + return node; + } + + function template(sym) { + return { + name : sym.name, + file : sym.start.file, + line : sym.start.line, + col : sym.start.col + }; + } + } + ); + self.transform(tt); + + function scan_ref_scoped(node, descend) { + var sym; + if ((sym = assign_as_unused(node)) instanceof AST_SymbolRef + && self.variables.get(sym.name) === sym.definition()) { + if (node instanceof AST_Assign) node.right.walk(tw); + return true; + } + if (node instanceof AST_SymbolRef) { + var node_def = node.definition(); + if (!(node_def.id in in_use_ids)) { + in_use_ids[node_def.id] = true; + in_use.push(node_def); + } + return true; + } + if (node instanceof AST_Scope) { + var save_scope = scope; + scope = node; + descend(); + scope = save_scope; + return true; + } + } + }); + + AST_Scope.DEFMETHOD("hoist_declarations", function(compressor){ + var self = this; + if (compressor.has_directive("use asm")) return self; + var hoist_funs = compressor.option("hoist_funs"); + var hoist_vars = compressor.option("hoist_vars"); + if (hoist_funs || hoist_vars) { + var dirs = []; + var hoisted = []; + var vars = new Dictionary(), vars_found = 0, var_decl = 0; + // let's count var_decl first, we seem to waste a lot of + // space if we hoist `var` when there's only one. + self.walk(new TreeWalker(function(node){ + if (node instanceof AST_Scope && node !== self) + return true; + if (node instanceof AST_Var) { + ++var_decl; + return true; + } + })); + hoist_vars = hoist_vars && var_decl > 1; + var tt = new TreeTransformer( + function before(node) { + if (node !== self) { + if (node instanceof AST_Directive) { + dirs.push(node); + return make_node(AST_EmptyStatement, node); + } + if (hoist_funs && node instanceof AST_Defun + && (tt.parent() === self || !compressor.has_directive("use strict"))) { + hoisted.push(node); + return make_node(AST_EmptyStatement, node); + } + if (hoist_vars && node instanceof AST_Var) { + node.definitions.forEach(function(def){ + vars.set(def.name.name, def); + ++vars_found; + }); + var seq = node.to_assignments(compressor); + var p = tt.parent(); + if (p instanceof AST_ForIn && p.init === node) { + if (seq == null) { + var def = node.definitions[0].name; + return make_node(AST_SymbolRef, def, def); + } + return seq; + } + if (p instanceof AST_For && p.init === node) { + return seq; + } + if (!seq) return make_node(AST_EmptyStatement, node); + return make_node(AST_SimpleStatement, node, { + body: seq + }); + } + if (node instanceof AST_Scope) + return node; // to avoid descending in nested scopes + } + } + ); + self = self.transform(tt); + if (vars_found > 0) { + // collect only vars which don't show up in self's arguments list + var defs = []; + vars.each(function(def, name){ + if (self instanceof AST_Lambda + && find_if(function(x){ return x.name == def.name.name }, + self.argnames)) { + vars.del(name); + } else { + def = def.clone(); + def.value = null; + defs.push(def); + vars.set(name, def); + } + }); + if (defs.length > 0) { + // try to merge in assignments + for (var i = 0; i < self.body.length;) { + if (self.body[i] instanceof AST_SimpleStatement) { + var expr = self.body[i].body, sym, assign; + if (expr instanceof AST_Assign + && expr.operator == "=" + && (sym = expr.left) instanceof AST_Symbol + && vars.has(sym.name)) + { + var def = vars.get(sym.name); + if (def.value) break; + def.value = expr.right; + remove(defs, def); + defs.push(def); + self.body.splice(i, 1); + continue; + } + if (expr instanceof AST_Sequence + && (assign = expr.expressions[0]) instanceof AST_Assign + && assign.operator == "=" + && (sym = assign.left) instanceof AST_Symbol + && vars.has(sym.name)) + { + var def = vars.get(sym.name); + if (def.value) break; + def.value = assign.right; + remove(defs, def); + defs.push(def); + self.body[i].body = make_sequence(expr, expr.expressions.slice(1)); + continue; + } + } + if (self.body[i] instanceof AST_EmptyStatement) { + self.body.splice(i, 1); + continue; + } + if (self.body[i] instanceof AST_BlockStatement) { + var tmp = [ i, 1 ].concat(self.body[i].body); + self.body.splice.apply(self.body, tmp); + continue; + } + break; + } + defs = make_node(AST_Var, self, { + definitions: defs + }); + hoisted.push(defs); + }; + } + self.body = dirs.concat(hoisted, self.body); + } + return self; + }); + + AST_Scope.DEFMETHOD("make_var_name", function(prefix) { + var var_names = this.var_names; + if (!var_names) { + this.var_names = var_names = Object.create(null); + this.enclosed.forEach(function(def) { + var_names[def.name] = true; + }); + this.variables.each(function(def, name) { + var_names[name] = true; + }); + } + prefix = prefix.replace(/[^a-z_$]+/ig, "_"); + var name = prefix; + for (var i = 0; var_names[name]; i++) name = prefix + "$" + i; + var_names[name] = true; + return name; + }); + + AST_Scope.DEFMETHOD("hoist_properties", function(compressor){ + var self = this; + if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return self; + var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false; + var defs_by_id = Object.create(null); + return self.transform(new TreeTransformer(function(node, descend) { + if (node instanceof AST_VarDef) { + var sym = node.name, def, value; + if (sym.scope === self + && !(def = sym.definition()).escaped + && !def.single_use + && !def.direct_access + && !top_retain(def) + && (value = sym.fixed_value()) === node.value + && value instanceof AST_Object) { + descend(node, this); + var defs = new Dictionary(); + var assignments = []; + value.properties.forEach(function(prop) { + assignments.push(make_node(AST_VarDef, node, { + name: make_sym(prop.key), + value: prop.value + })); + }); + defs_by_id[def.id] = defs; + return MAP.splice(assignments); + } + } + if (node instanceof AST_PropAccess && node.expression instanceof AST_SymbolRef) { + var defs = defs_by_id[node.expression.definition().id]; + if (defs) { + var key = node.property; + if (key instanceof AST_Node) key = key.getValue(); + var def = defs.get(key); + var sym = make_node(AST_SymbolRef, node, { + name: def.name, + scope: node.expression.scope, + thedef: def + }); + sym.reference({}); + return sym; + } + } + + function make_sym(key) { + var new_var = make_node(sym.CTOR, sym, { + name: self.make_var_name(sym.name + "_" + key), + scope: self + }); + var def = self.def_variable(new_var); + defs.set(key, def); + self.enclosed.push(def); + return new_var; + } + })); + }); + + // drop_side_effect_free() + // remove side-effect-free parts which only affects return value + (function(def){ + // Drop side-effect-free elements from an array of expressions. + // Returns an array of expressions with side-effects or null + // if all elements were dropped. Note: original array may be + // returned if nothing changed. + function trim(nodes, compressor, first_in_statement) { + var len = nodes.length; + if (!len) return null; + var ret = [], changed = false; + for (var i = 0; i < len; i++) { + var node = nodes[i].drop_side_effect_free(compressor, first_in_statement); + changed |= node !== nodes[i]; + if (node) { + ret.push(node); + first_in_statement = false; + } + } + return changed ? ret.length ? ret : null : nodes; + } + + def(AST_Node, return_this); + def(AST_Constant, return_null); + def(AST_This, return_null); + def(AST_Call, function(compressor, first_in_statement){ + if (!this.is_expr_pure(compressor)) { + if (this.expression instanceof AST_Function + && (!this.expression.name || !this.expression.name.definition().references.length)) { + var node = this.clone(); + node.expression.process_expression(false, compressor); + return node; + } + return this; + } + if (this.pure) { + compressor.warn("Dropping __PURE__ call [{file}:{line},{col}]", this.start); + this.pure.value = this.pure.value.replace(/[@#]__PURE__/g, ' '); + } + var args = trim(this.args, compressor, first_in_statement); + return args && make_sequence(this, args); + }); + def(AST_Accessor, return_null); + def(AST_Function, return_null); + def(AST_Binary, function(compressor, first_in_statement){ + var right = this.right.drop_side_effect_free(compressor); + if (!right) return this.left.drop_side_effect_free(compressor, first_in_statement); + if (lazy_op(this.operator)) { + if (right === this.right) return this; + var node = this.clone(); + node.right = right; + return node; + } else { + var left = this.left.drop_side_effect_free(compressor, first_in_statement); + if (!left) return this.right.drop_side_effect_free(compressor, first_in_statement); + return make_sequence(this, [ left, right ]); + } + }); + def(AST_Assign, function(compressor){ + this.write_only = !this.left.has_side_effects(compressor); + return this; + }); + def(AST_Conditional, function(compressor){ + var consequent = this.consequent.drop_side_effect_free(compressor); + var alternative = this.alternative.drop_side_effect_free(compressor); + if (consequent === this.consequent && alternative === this.alternative) return this; + if (!consequent) return alternative ? make_node(AST_Binary, this, { + operator: "||", + left: this.condition, + right: alternative + }) : this.condition.drop_side_effect_free(compressor); + if (!alternative) return make_node(AST_Binary, this, { + operator: "&&", + left: this.condition, + right: consequent + }); + var node = this.clone(); + node.consequent = consequent; + node.alternative = alternative; + return node; + }); + def(AST_Unary, function(compressor, first_in_statement){ + if (unary_side_effects(this.operator)) { + this.write_only = !this.expression.has_side_effects(compressor); + return this; + } + if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null; + var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); + if (first_in_statement + && this instanceof AST_UnaryPrefix + && is_iife_call(expression)) { + if (expression === this.expression && this.operator.length === 1) return this; + return make_node(AST_UnaryPrefix, this, { + operator: this.operator.length === 1 ? this.operator : "!", + expression: expression + }); + } + return expression; + }); + def(AST_SymbolRef, function(compressor) { + return this.is_declared(compressor) ? null : this; + }); + def(AST_Object, function(compressor, first_in_statement){ + var values = trim(this.properties, compressor, first_in_statement); + return values && make_sequence(this, values); + }); + def(AST_ObjectProperty, function(compressor, first_in_statement){ + return this.value.drop_side_effect_free(compressor, first_in_statement); + }); + def(AST_Array, function(compressor, first_in_statement){ + var values = trim(this.elements, compressor, first_in_statement); + return values && make_sequence(this, values); + }); + def(AST_Dot, function(compressor, first_in_statement){ + if (this.expression.may_throw_on_access(compressor)) return this; + return this.expression.drop_side_effect_free(compressor, first_in_statement); + }); + def(AST_Sub, function(compressor, first_in_statement){ + if (this.expression.may_throw_on_access(compressor)) return this; + var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); + if (!expression) return this.property.drop_side_effect_free(compressor, first_in_statement); + var property = this.property.drop_side_effect_free(compressor); + if (!property) return expression; + return make_sequence(this, [ expression, property ]); + }); + def(AST_Sequence, function(compressor){ + var last = this.tail_node(); + var expr = last.drop_side_effect_free(compressor); + if (expr === last) return this; + var expressions = this.expressions.slice(0, -1); + if (expr) expressions.push(expr); + return make_sequence(this, expressions); + }); + })(function(node, func){ + node.DEFMETHOD("drop_side_effect_free", func); + }); + + OPT(AST_SimpleStatement, function(self, compressor){ + if (compressor.option("side_effects")) { + var body = self.body; + var node = body.drop_side_effect_free(compressor, true); + if (!node) { + compressor.warn("Dropping side-effect-free statement [{file}:{line},{col}]", self.start); + return make_node(AST_EmptyStatement, self); + } + if (node !== body) { + return make_node(AST_SimpleStatement, self, { body: node }); + } + } + return self; + }); + + OPT(AST_While, function(self, compressor){ + return compressor.option("loops") ? make_node(AST_For, self, self).optimize(compressor) : self; + }); + + OPT(AST_Do, function(self, compressor){ + if (!compressor.option("loops")) return self; + var cond = self.condition.tail_node().evaluate(compressor); + if (!(cond instanceof AST_Node)) { + if (cond) return make_node(AST_For, self, { + body: make_node(AST_BlockStatement, self.body, { + body: [ + self.body, + make_node(AST_SimpleStatement, self.condition, { + body: self.condition + }) + ] + }) + }).optimize(compressor); + var has_loop_control = false; + var tw = new TreeWalker(function(node) { + if (node instanceof AST_Scope || has_loop_control) return true; + if (node instanceof AST_LoopControl && tw.loopcontrol_target(node) === self) + return has_loop_control = true; + }); + var parent = compressor.parent(); + (parent instanceof AST_LabeledStatement ? parent : self).walk(tw); + if (!has_loop_control) return make_node(AST_BlockStatement, self.body, { + body: [ + self.body, + make_node(AST_SimpleStatement, self.condition, { + body: self.condition + }) + ] + }).optimize(compressor); + } + return self; + }); + + function if_break_in_loop(self, compressor) { + function drop_it(rest) { + rest = as_statement_array(rest); + if (self.body instanceof AST_BlockStatement) { + self.body = self.body.clone(); + self.body.body = rest.concat(self.body.body.slice(1)); + self.body = self.body.transform(compressor); + } else { + self.body = make_node(AST_BlockStatement, self.body, { + body: rest + }).transform(compressor); + } + if_break_in_loop(self, compressor); + } + var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body; + if (first instanceof AST_If) { + if (first.body instanceof AST_Break + && compressor.loopcontrol_target(first.body) === compressor.self()) { + if (self.condition) { + self.condition = make_node(AST_Binary, self.condition, { + left: self.condition, + operator: "&&", + right: first.condition.negate(compressor), + }); + } else { + self.condition = first.condition.negate(compressor); + } + drop_it(first.alternative); + } + else if (first.alternative instanceof AST_Break + && compressor.loopcontrol_target(first.alternative) === compressor.self()) { + if (self.condition) { + self.condition = make_node(AST_Binary, self.condition, { + left: self.condition, + operator: "&&", + right: first.condition, + }); + } else { + self.condition = first.condition; + } + drop_it(first.body); + } + } + }; + + OPT(AST_For, function(self, compressor){ + if (!compressor.option("loops")) return self; + if (compressor.option("side_effects") && self.init) { + self.init = self.init.drop_side_effect_free(compressor); + } + if (self.condition) { + var cond = self.condition.evaluate(compressor); + if (!(cond instanceof AST_Node)) { + if (cond) self.condition = null; + else if (!compressor.option("dead_code")) { + var orig = self.condition; + self.condition = make_node_from_constant(cond, self.condition); + self.condition = best_of_expression(self.condition.transform(compressor), orig); + } + } + if (compressor.option("dead_code")) { + if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor); + if (!cond) { + var body = []; + extract_declarations_from_unreachable_code(compressor, self.body, body); + if (self.init instanceof AST_Statement) { + body.push(self.init); + } else if (self.init) { + body.push(make_node(AST_SimpleStatement, self.init, { + body: self.init + })); + } + body.push(make_node(AST_SimpleStatement, self.condition, { + body: self.condition + })); + return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); + } + } + } + if_break_in_loop(self, compressor); + return self; + }); + + OPT(AST_If, function(self, compressor){ + if (is_empty(self.alternative)) self.alternative = null; + + if (!compressor.option("conditionals")) return self; + // if condition can be statically determined, warn and drop + // one of the blocks. note, statically determined implies + // “has no side effects”; also it doesn't work for cases like + // `x && true`, though it probably should. + var cond = self.condition.evaluate(compressor); + if (!compressor.option("dead_code") && !(cond instanceof AST_Node)) { + var orig = self.condition; + self.condition = make_node_from_constant(cond, orig); + self.condition = best_of_expression(self.condition.transform(compressor), orig); + } + if (compressor.option("dead_code")) { + if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor); + if (!cond) { + compressor.warn("Condition always false [{file}:{line},{col}]", self.condition.start); + var body = []; + extract_declarations_from_unreachable_code(compressor, self.body, body); + body.push(make_node(AST_SimpleStatement, self.condition, { + body: self.condition + })); + if (self.alternative) body.push(self.alternative); + return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); + } else if (!(cond instanceof AST_Node)) { + compressor.warn("Condition always true [{file}:{line},{col}]", self.condition.start); + var body = []; + if (self.alternative) { + extract_declarations_from_unreachable_code(compressor, self.alternative, body); + } + body.push(make_node(AST_SimpleStatement, self.condition, { + body: self.condition + })); + body.push(self.body); + return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); + } + } + var negated = self.condition.negate(compressor); + var self_condition_length = self.condition.print_to_string().length; + var negated_length = negated.print_to_string().length; + var negated_is_best = negated_length < self_condition_length; + if (self.alternative && negated_is_best) { + negated_is_best = false; // because we already do the switch here. + // no need to swap values of self_condition_length and negated_length + // here because they are only used in an equality comparison later on. + self.condition = negated; + var tmp = self.body; + self.body = self.alternative || make_node(AST_EmptyStatement, self); + self.alternative = tmp; + } + if (is_empty(self.body) && is_empty(self.alternative)) { + return make_node(AST_SimpleStatement, self.condition, { + body: self.condition.clone() + }).optimize(compressor); + } + if (self.body instanceof AST_SimpleStatement + && self.alternative instanceof AST_SimpleStatement) { + return make_node(AST_SimpleStatement, self, { + body: make_node(AST_Conditional, self, { + condition : self.condition, + consequent : self.body.body, + alternative : self.alternative.body + }) + }).optimize(compressor); + } + if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) { + if (self_condition_length === negated_length && !negated_is_best + && self.condition instanceof AST_Binary && self.condition.operator == "||") { + // although the code length of self.condition and negated are the same, + // negated does not require additional surrounding parentheses. + // see https://github.com/mishoo/UglifyJS2/issues/979 + negated_is_best = true; + } + if (negated_is_best) return make_node(AST_SimpleStatement, self, { + body: make_node(AST_Binary, self, { + operator : "||", + left : negated, + right : self.body.body + }) + }).optimize(compressor); + return make_node(AST_SimpleStatement, self, { + body: make_node(AST_Binary, self, { + operator : "&&", + left : self.condition, + right : self.body.body + }) + }).optimize(compressor); + } + if (self.body instanceof AST_EmptyStatement + && self.alternative instanceof AST_SimpleStatement) { + return make_node(AST_SimpleStatement, self, { + body: make_node(AST_Binary, self, { + operator : "||", + left : self.condition, + right : self.alternative.body + }) + }).optimize(compressor); + } + if (self.body instanceof AST_Exit + && self.alternative instanceof AST_Exit + && self.body.TYPE == self.alternative.TYPE) { + return make_node(self.body.CTOR, self, { + value: make_node(AST_Conditional, self, { + condition : self.condition, + consequent : self.body.value || make_node(AST_Undefined, self.body), + alternative : self.alternative.value || make_node(AST_Undefined, self.alternative) + }).transform(compressor) + }).optimize(compressor); + } + if (self.body instanceof AST_If + && !self.body.alternative + && !self.alternative) { + self = make_node(AST_If, self, { + condition: make_node(AST_Binary, self.condition, { + operator: "&&", + left: self.condition, + right: self.body.condition + }), + body: self.body.body, + alternative: null + }); + } + if (aborts(self.body)) { + if (self.alternative) { + var alt = self.alternative; + self.alternative = null; + return make_node(AST_BlockStatement, self, { + body: [ self, alt ] + }).optimize(compressor); + } + } + if (aborts(self.alternative)) { + var body = self.body; + self.body = self.alternative; + self.condition = negated_is_best ? negated : self.condition.negate(compressor); + self.alternative = null; + return make_node(AST_BlockStatement, self, { + body: [ self, body ] + }).optimize(compressor); + } + return self; + }); + + OPT(AST_Switch, function(self, compressor){ + if (!compressor.option("switches")) return self; + var branch; + var value = self.expression.evaluate(compressor); + if (!(value instanceof AST_Node)) { + var orig = self.expression; + self.expression = make_node_from_constant(value, orig); + self.expression = best_of_expression(self.expression.transform(compressor), orig); + } + if (!compressor.option("dead_code")) return self; + if (value instanceof AST_Node) { + value = self.expression.tail_node().evaluate(compressor); + } + var decl = []; + var body = []; + var default_branch; + var exact_match; + for (var i = 0, len = self.body.length; i < len && !exact_match; i++) { + branch = self.body[i]; + if (branch instanceof AST_Default) { + if (!default_branch) { + default_branch = branch; + } else { + eliminate_branch(branch, body[body.length - 1]); + } + } else if (!(value instanceof AST_Node)) { + var exp = branch.expression.evaluate(compressor); + if (!(exp instanceof AST_Node) && exp !== value) { + eliminate_branch(branch, body[body.length - 1]); + continue; + } + if (exp instanceof AST_Node) exp = branch.expression.tail_node().evaluate(compressor); + if (exp === value) { + exact_match = branch; + if (default_branch) { + var default_index = body.indexOf(default_branch); + body.splice(default_index, 1); + eliminate_branch(default_branch, body[default_index - 1]); + default_branch = null; + } + } + } + if (aborts(branch)) { + var prev = body[body.length - 1]; + if (aborts(prev) && prev.body.length == branch.body.length + && make_node(AST_BlockStatement, prev, prev).equivalent_to(make_node(AST_BlockStatement, branch, branch))) { + prev.body = []; + } + } + body.push(branch); + } + while (i < len) eliminate_branch(self.body[i++], body[body.length - 1]); + if (body.length > 0) { + body[0].body = decl.concat(body[0].body); + } + self.body = body; + while (branch = body[body.length - 1]) { + var stat = branch.body[branch.body.length - 1]; + if (stat instanceof AST_Break && compressor.loopcontrol_target(stat) === self) + branch.body.pop(); + if (branch.body.length || branch instanceof AST_Case + && (default_branch || branch.expression.has_side_effects(compressor))) break; + if (body.pop() === default_branch) default_branch = null; + } + if (body.length == 0) { + return make_node(AST_BlockStatement, self, { + body: decl.concat(make_node(AST_SimpleStatement, self.expression, { + body: self.expression + })) + }).optimize(compressor); + } + if (body.length == 1 && (body[0] === exact_match || body[0] === default_branch)) { + var has_break = false; + var tw = new TreeWalker(function(node) { + if (has_break + || node instanceof AST_Lambda + || node instanceof AST_SimpleStatement) return true; + if (node instanceof AST_Break && tw.loopcontrol_target(node) === self) + has_break = true; + }); + self.walk(tw); + if (!has_break) { + var statements = body[0].body.slice(); + var exp = body[0].expression; + if (exp) statements.unshift(make_node(AST_SimpleStatement, exp, { + body: exp + })); + statements.unshift(make_node(AST_SimpleStatement, self.expression, { + body:self.expression + })); + return make_node(AST_BlockStatement, self, { + body: statements + }).optimize(compressor); + } + } + return self; + + function eliminate_branch(branch, prev) { + if (prev && !aborts(prev)) { + prev.body = prev.body.concat(branch.body); + } else { + extract_declarations_from_unreachable_code(compressor, branch, decl); + } + } + }); + + OPT(AST_Try, function(self, compressor){ + tighten_body(self.body, compressor); + if (self.bcatch && self.bfinally && all(self.bfinally.body, is_empty)) self.bfinally = null; + if (all(self.body, is_empty)) { + var body = []; + if (self.bcatch) extract_declarations_from_unreachable_code(compressor, self.bcatch, body); + if (self.bfinally) body = body.concat(self.bfinally.body); + return make_node(AST_BlockStatement, self, { + body: body + }).optimize(compressor); + } + return self; + }); + + AST_Definitions.DEFMETHOD("remove_initializers", function(){ + this.definitions.forEach(function(def){ def.value = null }); + }); + + AST_Definitions.DEFMETHOD("to_assignments", function(compressor){ + var reduce_vars = compressor.option("reduce_vars"); + var assignments = this.definitions.reduce(function(a, def){ + if (def.value) { + var name = make_node(AST_SymbolRef, def.name, def.name); + a.push(make_node(AST_Assign, def, { + operator : "=", + left : name, + right : def.value + })); + if (reduce_vars) name.definition().fixed = false; + } + def = def.name.definition(); + def.eliminated++; + def.replaced--; + return a; + }, []); + if (assignments.length == 0) return null; + return make_sequence(this, assignments); + }); + + OPT(AST_Definitions, function(self, compressor){ + if (self.definitions.length == 0) + return make_node(AST_EmptyStatement, self); + return self; + }); + + OPT(AST_Call, function(self, compressor){ + var exp = self.expression; + var fn = exp; + if (compressor.option("reduce_vars") && fn instanceof AST_SymbolRef) { + fn = fn.fixed_value(); + } + if (compressor.option("unused") + && fn instanceof AST_Function + && !fn.uses_arguments + && !fn.uses_eval) { + var pos = 0, last = 0; + for (var i = 0, len = self.args.length; i < len; i++) { + var trim = i >= fn.argnames.length; + if (trim || fn.argnames[i].__unused) { + var node = self.args[i].drop_side_effect_free(compressor); + if (node) { + self.args[pos++] = node; + } else if (!trim) { + self.args[pos++] = make_node(AST_Number, self.args[i], { + value: 0 + }); + continue; + } + } else { + self.args[pos++] = self.args[i]; + } + last = pos; + } + self.args.length = last; + } + if (compressor.option("unsafe")) { + if (is_undeclared_ref(exp)) switch (exp.name) { + case "Array": + if (self.args.length != 1) { + return make_node(AST_Array, self, { + elements: self.args + }).optimize(compressor); + } + break; + case "Object": + if (self.args.length == 0) { + return make_node(AST_Object, self, { + properties: [] + }); + } + break; + case "String": + if (self.args.length == 0) return make_node(AST_String, self, { + value: "" + }); + if (self.args.length <= 1) return make_node(AST_Binary, self, { + left: self.args[0], + operator: "+", + right: make_node(AST_String, self, { value: "" }) + }).optimize(compressor); + break; + case "Number": + if (self.args.length == 0) return make_node(AST_Number, self, { + value: 0 + }); + if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { + expression: self.args[0], + operator: "+" + }).optimize(compressor); + case "Boolean": + if (self.args.length == 0) return make_node(AST_False, self); + if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { + expression: make_node(AST_UnaryPrefix, self, { + expression: self.args[0], + operator: "!" + }), + operator: "!" + }).optimize(compressor); + break; + } else if (exp instanceof AST_Dot) switch(exp.property) { + case "toString": + if (self.args.length == 0) return make_node(AST_Binary, self, { + left: make_node(AST_String, self, { value: "" }), + operator: "+", + right: exp.expression + }).optimize(compressor); + break; + case "join": + if (exp.expression instanceof AST_Array) EXIT: { + var separator; + if (self.args.length > 0) { + separator = self.args[0].evaluate(compressor); + if (separator === self.args[0]) break EXIT; // not a constant + } + var elements = []; + var consts = []; + exp.expression.elements.forEach(function(el) { + var value = el.evaluate(compressor); + if (value !== el) { + consts.push(value); + } else { + if (consts.length > 0) { + elements.push(make_node(AST_String, self, { + value: consts.join(separator) + })); + consts.length = 0; + } + elements.push(el); + } + }); + if (consts.length > 0) { + elements.push(make_node(AST_String, self, { + value: consts.join(separator) + })); + } + if (elements.length == 0) return make_node(AST_String, self, { value: "" }); + if (elements.length == 1) { + if (elements[0].is_string(compressor)) { + return elements[0]; + } + return make_node(AST_Binary, elements[0], { + operator : "+", + left : make_node(AST_String, self, { value: "" }), + right : elements[0] + }); + } + if (separator == "") { + var first; + if (elements[0].is_string(compressor) + || elements[1].is_string(compressor)) { + first = elements.shift(); + } else { + first = make_node(AST_String, self, { value: "" }); + } + return elements.reduce(function(prev, el){ + return make_node(AST_Binary, el, { + operator : "+", + left : prev, + right : el + }); + }, first).optimize(compressor); + } + // need this awkward cloning to not affect original element + // best_of will decide which one to get through. + var node = self.clone(); + node.expression = node.expression.clone(); + node.expression.expression = node.expression.expression.clone(); + node.expression.expression.elements = elements; + return best_of(compressor, self, node); + } + break; + case "charAt": + if (exp.expression.is_string(compressor)) { + var arg = self.args[0]; + var index = arg ? arg.evaluate(compressor) : 0; + if (index !== arg) { + return make_node(AST_Sub, exp, { + expression: exp.expression, + property: make_node_from_constant(index | 0, arg || exp) + }).optimize(compressor); + } + } + break; + } + } + if (compressor.option("unsafe_Func") + && is_undeclared_ref(exp) + && exp.name == "Function") { + // new Function() => function(){} + if (self.args.length == 0) return make_node(AST_Function, self, { + argnames: [], + body: [] + }); + if (all(self.args, function(x) { + return x instanceof AST_String; + })) { + // quite a corner-case, but we can handle it: + // https://github.com/mishoo/UglifyJS2/issues/203 + // if the code argument is a constant, then we can minify it. + try { + var code = "n(function(" + self.args.slice(0, -1).map(function(arg) { + return arg.value; + }).join(",") + "){" + self.args[self.args.length - 1].value + "})"; + var ast = parse(code); + var mangle = { ie8: compressor.option("ie8") }; + ast.figure_out_scope(mangle); + var comp = new Compressor(compressor.options); + ast = ast.transform(comp); + ast.figure_out_scope(mangle); + base54.reset(); + ast.compute_char_frequency(mangle); + ast.mangle_names(mangle); + var fun; + ast.walk(new TreeWalker(function(node) { + if (fun) return true; + if (node instanceof AST_Lambda) { + fun = node; + return true; + } + })); + var code = OutputStream(); + AST_BlockStatement.prototype._codegen.call(fun, fun, code); + self.args = [ + make_node(AST_String, self, { + value: fun.argnames.map(function(arg) { + return arg.print_to_string(); + }).join(",") + }), + make_node(AST_String, self.args[self.args.length - 1], { + value: code.get().replace(/^\{|\}$/g, "") + }) + ]; + return self; + } catch (ex) { + if (ex instanceof JS_Parse_Error) { + compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]", self.args[self.args.length - 1].start); + compressor.warn(ex.toString()); + } else { + throw ex; + } + } + } + } + var stat = fn instanceof AST_Function && fn.body[0]; + if (compressor.option("inline") && stat instanceof AST_Return) { + var value = stat.value; + if (!value || value.is_constant_expression()) { + var args = self.args.concat(value || make_node(AST_Undefined, self)); + return make_sequence(self, args).optimize(compressor); + } + } + if (fn instanceof AST_Function) { + if (compressor.option("inline") + && exp === fn + && !fn.name + && !fn.uses_arguments + && !fn.uses_eval + && fn.body.length == 1 + && !fn.contains_this() + && all(fn.argnames, function(arg) { + return arg.__unused; + }) + && !self.has_pure_annotation(compressor)) { + var value; + if (stat instanceof AST_Return) { + value = stat.value; + } else if (stat instanceof AST_SimpleStatement) { + value = make_node(AST_UnaryPrefix, stat, { + operator: "void", + expression: stat.body + }); + } + if (value) { + var args = self.args.concat(value); + return make_sequence(self, args).optimize(compressor); + } + } + if (compressor.option("side_effects") && all(fn.body, is_empty)) { + var args = self.args.concat(make_node(AST_Undefined, self)); + return make_sequence(self, args).optimize(compressor); + } + } + if (compressor.option("drop_console")) { + if (exp instanceof AST_PropAccess) { + var name = exp.expression; + while (name.expression) { + name = name.expression; + } + if (is_undeclared_ref(name) && name.name == "console") { + return make_node(AST_Undefined, self).optimize(compressor); + } + } + } + if (compressor.option("negate_iife") + && compressor.parent() instanceof AST_SimpleStatement + && is_iife_call(self)) { + return self.negate(compressor, true); + } + var ev = self.evaluate(compressor); + if (ev !== self) { + ev = make_node_from_constant(ev, self).optimize(compressor); + return best_of(compressor, ev, self); + } + return self; + }); + + OPT(AST_New, function(self, compressor){ + if (compressor.option("unsafe")) { + var exp = self.expression; + if (is_undeclared_ref(exp)) { + switch (exp.name) { + case "Object": + case "RegExp": + case "Function": + case "Error": + case "Array": + return make_node(AST_Call, self, self).transform(compressor); + } + } + } + return self; + }); + + OPT(AST_Sequence, function(self, compressor){ + if (!compressor.option("side_effects")) return self; + var expressions = []; + filter_for_side_effects(); + var end = expressions.length - 1; + trim_right_for_undefined(); + if (end > 0 && compressor.option("cascade")) trim_left_for_assignment(); + if (end == 0) { + self = maintain_this_binding(compressor.parent(), compressor.self(), expressions[0]); + if (!(self instanceof AST_Sequence)) self = self.optimize(compressor); + return self; + } + self.expressions = expressions; + return self; + + function filter_for_side_effects() { + var first = first_in_statement(compressor); + var last = self.expressions.length - 1; + self.expressions.forEach(function(expr, index) { + if (index < last) expr = expr.drop_side_effect_free(compressor, first); + if (expr) { + merge_sequence(expressions, expr); + first = false; + } + }); + } + + function trim_right_for_undefined() { + while (end > 0 && is_undefined(expressions[end], compressor)) end--; + if (end < expressions.length - 1) { + expressions[end] = make_node(AST_UnaryPrefix, self, { + operator : "void", + expression : expressions[end] + }); + expressions.length = end + 1; + } + } + + function trim_left_for_assignment() { + for (var i = 0, j = 1; j <= end; j++) { + var left = expressions[i]; + var cdr = expressions[j]; + if (left instanceof AST_Assign + && !left.left.has_side_effects(compressor)) { + left = left.left; + } else if (left instanceof AST_Unary + && (left.operator == "++" || left.operator == "--")) { + left = left.expression; + } else left = null; + if (!left || is_lhs_read_only(left) || left.has_side_effects(compressor)) { + expressions[++i] = cdr; + continue; + } + var parent = null, field; + expressions[j] = cdr = cdr.clone(); + while (true) { + if (cdr.equivalent_to(left)) { + var car = expressions[i]; + if (car instanceof AST_UnaryPostfix) { + car = make_node(AST_UnaryPrefix, car, { + operator: car.operator, + expression: left + }); + } else { + car.write_only = false; + } + if (parent) { + parent[field] = car; + expressions[i] = expressions[j]; + } else { + expressions[i] = car; + } + break; + } + if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) { + if (cdr.left.is_constant()) { + if (lazy_op(cdr.operator)) { + expressions[++i] = expressions[j]; + break; + } + field = "right"; + } else { + field = "left"; + } + } else if (cdr instanceof AST_Call + && !(left instanceof AST_PropAccess && cdr.expression.equivalent_to(left)) + || cdr instanceof AST_PropAccess + || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) { + field = "expression"; + } else if (cdr instanceof AST_Conditional) { + field = "condition"; + } else { + expressions[++i] = expressions[j]; + break; + } + parent = cdr; + cdr = cdr[field] = cdr[field].clone(); + } + } + end = i; + expressions.length = end + 1; + } + }); + + AST_Unary.DEFMETHOD("lift_sequences", function(compressor){ + if (compressor.option("sequences")) { + if (this.expression instanceof AST_Sequence) { + var x = this.expression.expressions.slice(); + var e = this.clone(); + e.expression = x.pop(); + x.push(e); + return make_sequence(this, x).optimize(compressor); + } + } + return this; + }); + + OPT(AST_UnaryPostfix, function(self, compressor){ + return self.lift_sequences(compressor); + }); + + OPT(AST_UnaryPrefix, function(self, compressor){ + var e = self.expression; + if (self.operator == "delete" + && !(e instanceof AST_SymbolRef + || e instanceof AST_PropAccess + || is_identifier_atom(e))) { + if (e instanceof AST_Sequence) { + e = e.expressions.slice(); + e.push(make_node(AST_True, self)); + return make_sequence(self, e).optimize(compressor); + } + return make_sequence(self, [ e, make_node(AST_True, self) ]).optimize(compressor); + } + var seq = self.lift_sequences(compressor); + if (seq !== self) { + return seq; + } + if (compressor.option("side_effects") && self.operator == "void") { + e = e.drop_side_effect_free(compressor); + if (e) { + self.expression = e; + return self; + } else { + return make_node(AST_Undefined, self).optimize(compressor); + } + } + if (compressor.in_boolean_context()) { + switch (self.operator) { + case "!": + if (e instanceof AST_UnaryPrefix && e.operator == "!") { + // !!foo ==> foo, if we're in boolean context + return e.expression; + } + if (e instanceof AST_Binary) { + self = best_of(compressor, self, e.negate(compressor, first_in_statement(compressor))); + } + break; + case "typeof": + // typeof always returns a non-empty string, thus it's + // always true in booleans + compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start); + return (e instanceof AST_SymbolRef ? make_node(AST_True, self) : make_sequence(self, [ + e, + make_node(AST_True, self) + ])).optimize(compressor); + } + } + if (self.operator == "-" && e instanceof AST_Infinity) { + e = e.transform(compressor); + } + if (e instanceof AST_Binary + && (self.operator == "+" || self.operator == "-") + && (e.operator == "*" || e.operator == "/" || e.operator == "%")) { + return make_node(AST_Binary, self, { + operator: e.operator, + left: make_node(AST_UnaryPrefix, e.left, { + operator: self.operator, + expression: e.left + }), + right: e.right + }); + } + // avoids infinite recursion of numerals + if (self.operator != "-" + || !(e instanceof AST_Number || e instanceof AST_Infinity)) { + var ev = self.evaluate(compressor); + if (ev !== self) { + ev = make_node_from_constant(ev, self).optimize(compressor); + return best_of(compressor, ev, self); + } + } + return self; + }); + + AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ + if (compressor.option("sequences")) { + if (this.left instanceof AST_Sequence) { + var x = this.left.expressions.slice(); + var e = this.clone(); + e.left = x.pop(); + x.push(e); + return make_sequence(this, x).optimize(compressor); + } + if (this.right instanceof AST_Sequence && !this.left.has_side_effects(compressor)) { + var assign = this.operator == "=" && this.left instanceof AST_SymbolRef; + var x = this.right.expressions; + var last = x.length - 1; + for (var i = 0; i < last; i++) { + if (!assign && x[i].has_side_effects(compressor)) break; + } + if (i == last) { + x = x.slice(); + var e = this.clone(); + e.right = x.pop(); + x.push(e); + return make_sequence(this, x).optimize(compressor); + } else if (i > 0) { + var e = this.clone(); + e.right = make_sequence(this.right, x.slice(i)); + x = x.slice(0, i); + x.push(e); + return make_sequence(this, x).optimize(compressor); + } + } + } + return this; + }); + + var commutativeOperators = makePredicate("== === != !== * & | ^"); + function is_object(node) { + return node instanceof AST_Array + || node instanceof AST_Lambda + || node instanceof AST_Object; + } + + OPT(AST_Binary, function(self, compressor){ + function reversible() { + return self.left.is_constant() + || self.right.is_constant() + || !self.left.has_side_effects(compressor) + && !self.right.has_side_effects(compressor); + } + function reverse(op) { + if (reversible()) { + if (op) self.operator = op; + var tmp = self.left; + self.left = self.right; + self.right = tmp; + } + } + if (commutativeOperators(self.operator)) { + if (self.right.is_constant() + && !self.left.is_constant()) { + // if right is a constant, whatever side effects the + // left side might have could not influence the + // result. hence, force switch. + + if (!(self.left instanceof AST_Binary + && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) { + reverse(); + } + } + } + self = self.lift_sequences(compressor); + if (compressor.option("comparisons")) switch (self.operator) { + case "===": + case "!==": + if ((self.left.is_string(compressor) && self.right.is_string(compressor)) || + (self.left.is_number(compressor) && self.right.is_number(compressor)) || + (self.left.is_boolean() && self.right.is_boolean()) || + self.left.equivalent_to(self.right)) { + self.operator = self.operator.substr(0, 2); + } + // XXX: intentionally falling down to the next case + case "==": + case "!=": + // "undefined" == typeof x => undefined === x + if (compressor.option("typeofs") + && self.left instanceof AST_String + && self.left.value == "undefined" + && self.right instanceof AST_UnaryPrefix + && self.right.operator == "typeof") { + var expr = self.right.expression; + if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor) + : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) { + self.right = expr; + self.left = make_node(AST_Undefined, self.left).optimize(compressor); + if (self.operator.length == 2) self.operator += "="; + } + } + // obj !== obj => false + else if (self.left instanceof AST_SymbolRef + && self.right instanceof AST_SymbolRef + && self.left.definition() === self.right.definition() + && is_object(self.left.fixed_value())) { + return make_node(self.operator[0] == "=" ? AST_True : AST_False, self); + } + break; + } + if (self.operator == "+" && compressor.in_boolean_context()) { + var ll = self.left.evaluate(compressor); + var rr = self.right.evaluate(compressor); + if (ll && typeof ll == "string") { + compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); + return make_sequence(self, [ + self.right, + make_node(AST_True, self) + ]).optimize(compressor); + } + if (rr && typeof rr == "string") { + compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); + return make_sequence(self, [ + self.left, + make_node(AST_True, self) + ]).optimize(compressor); + } + } + if (compressor.option("comparisons") && self.is_boolean()) { + if (!(compressor.parent() instanceof AST_Binary) + || compressor.parent() instanceof AST_Assign) { + var negated = make_node(AST_UnaryPrefix, self, { + operator: "!", + expression: self.negate(compressor, first_in_statement(compressor)) + }); + self = best_of(compressor, self, negated); + } + if (compressor.option("unsafe_comps")) { + switch (self.operator) { + case "<": reverse(">"); break; + case "<=": reverse(">="); break; + } + } + } + if (self.operator == "+") { + if (self.right instanceof AST_String + && self.right.getValue() == "" + && self.left.is_string(compressor)) { + return self.left; + } + if (self.left instanceof AST_String + && self.left.getValue() == "" + && self.right.is_string(compressor)) { + return self.right; + } + if (self.left instanceof AST_Binary + && self.left.operator == "+" + && self.left.left instanceof AST_String + && self.left.left.getValue() == "" + && self.right.is_string(compressor)) { + self.left = self.left.right; + return self.transform(compressor); + } + } + if (compressor.option("evaluate")) { + switch (self.operator) { + case "&&": + var ll = self.left.truthy ? true : self.left.falsy ? false : self.left.evaluate(compressor); + if (!ll) { + compressor.warn("Condition left of && always false [{file}:{line},{col}]", self.start); + return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor); + } else if (!(ll instanceof AST_Node)) { + compressor.warn("Condition left of && always true [{file}:{line},{col}]", self.start); + return make_sequence(self, [ self.left, self.right ]).optimize(compressor); + } + var rr = self.right.evaluate(compressor); + if (!rr) { + if (compressor.in_boolean_context()) { + compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start); + return make_sequence(self, [ + self.left, + make_node(AST_False, self) + ]).optimize(compressor); + } else self.falsy = true; + } else if (!(rr instanceof AST_Node)) { + var parent = compressor.parent(); + if (parent.operator == "&&" && parent.left === compressor.self() || compressor.in_boolean_context()) { + compressor.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start); + return self.left.optimize(compressor); + } + } + // x || false && y ---> x ? y : false + if (self.left.operator == "||") { + var lr = self.left.right.evaluate(compressor); + if (!lr) return make_node(AST_Conditional, self, { + condition: self.left.left, + consequent: self.right, + alternative: self.left.right + }).optimize(compressor); + } + break; + case "||": + var ll = self.left.truthy ? true : self.left.falsy ? false : self.left.evaluate(compressor); + if (!ll) { + compressor.warn("Condition left of || always false [{file}:{line},{col}]", self.start); + return make_sequence(self, [ self.left, self.right ]).optimize(compressor); + } else if (!(ll instanceof AST_Node)) { + compressor.warn("Condition left of || always true [{file}:{line},{col}]", self.start); + return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor); + } + var rr = self.right.evaluate(compressor); + if (!rr) { + var parent = compressor.parent(); + if (parent.operator == "||" && parent.left === compressor.self() || compressor.in_boolean_context()) { + compressor.warn("Dropping side-effect-free || [{file}:{line},{col}]", self.start); + return self.left.optimize(compressor); + } + } else if (!(rr instanceof AST_Node)) { + if (compressor.in_boolean_context()) { + compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start); + return make_sequence(self, [ + self.left, + make_node(AST_True, self) + ]).optimize(compressor); + } else self.truthy = true; + } + if (self.left.operator == "&&") { + var lr = self.left.right.evaluate(compressor); + if (lr && !(lr instanceof AST_Node)) return make_node(AST_Conditional, self, { + condition: self.left.left, + consequent: self.left.right, + alternative: self.right + }).optimize(compressor); + } + break; + } + var associative = true; + switch (self.operator) { + case "+": + // "foo" + ("bar" + x) => "foobar" + x + if (self.left instanceof AST_Constant + && self.right instanceof AST_Binary + && self.right.operator == "+" + && self.right.left instanceof AST_Constant + && self.right.is_string(compressor)) { + self = make_node(AST_Binary, self, { + operator: "+", + left: make_node(AST_String, self.left, { + value: "" + self.left.getValue() + self.right.left.getValue(), + start: self.left.start, + end: self.right.left.end + }), + right: self.right.right + }); + } + // (x + "foo") + "bar" => x + "foobar" + if (self.right instanceof AST_Constant + && self.left instanceof AST_Binary + && self.left.operator == "+" + && self.left.right instanceof AST_Constant + && self.left.is_string(compressor)) { + self = make_node(AST_Binary, self, { + operator: "+", + left: self.left.left, + right: make_node(AST_String, self.right, { + value: "" + self.left.right.getValue() + self.right.getValue(), + start: self.left.right.start, + end: self.right.end + }) + }); + } + // (x + "foo") + ("bar" + y) => (x + "foobar") + y + if (self.left instanceof AST_Binary + && self.left.operator == "+" + && self.left.is_string(compressor) + && self.left.right instanceof AST_Constant + && self.right instanceof AST_Binary + && self.right.operator == "+" + && self.right.left instanceof AST_Constant + && self.right.is_string(compressor)) { + self = make_node(AST_Binary, self, { + operator: "+", + left: make_node(AST_Binary, self.left, { + operator: "+", + left: self.left.left, + right: make_node(AST_String, self.left.right, { + value: "" + self.left.right.getValue() + self.right.left.getValue(), + start: self.left.right.start, + end: self.right.left.end + }) + }), + right: self.right.right + }); + } + // a + -b => a - b + if (self.right instanceof AST_UnaryPrefix + && self.right.operator == "-" + && self.left.is_number(compressor)) { + self = make_node(AST_Binary, self, { + operator: "-", + left: self.left, + right: self.right.expression + }); + break; + } + // -a + b => b - a + if (self.left instanceof AST_UnaryPrefix + && self.left.operator == "-" + && reversible() + && self.right.is_number(compressor)) { + self = make_node(AST_Binary, self, { + operator: "-", + left: self.right, + right: self.left.expression + }); + break; + } + case "*": + associative = compressor.option("unsafe_math"); + case "&": + case "|": + case "^": + // a + +b => +b + a + if (self.left.is_number(compressor) + && self.right.is_number(compressor) + && reversible() + && !(self.left instanceof AST_Binary + && self.left.operator != self.operator + && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) { + var reversed = make_node(AST_Binary, self, { + operator: self.operator, + left: self.right, + right: self.left + }); + if (self.right instanceof AST_Constant + && !(self.left instanceof AST_Constant)) { + self = best_of(compressor, reversed, self); + } else { + self = best_of(compressor, self, reversed); + } + } + if (associative && self.is_number(compressor)) { + // a + (b + c) => (a + b) + c + if (self.right instanceof AST_Binary + && self.right.operator == self.operator) { + self = make_node(AST_Binary, self, { + operator: self.operator, + left: make_node(AST_Binary, self.left, { + operator: self.operator, + left: self.left, + right: self.right.left, + start: self.left.start, + end: self.right.left.end + }), + right: self.right.right + }); + } + // (n + 2) + 3 => 5 + n + // (2 * n) * 3 => 6 + n + if (self.right instanceof AST_Constant + && self.left instanceof AST_Binary + && self.left.operator == self.operator) { + if (self.left.left instanceof AST_Constant) { + self = make_node(AST_Binary, self, { + operator: self.operator, + left: make_node(AST_Binary, self.left, { + operator: self.operator, + left: self.left.left, + right: self.right, + start: self.left.left.start, + end: self.right.end + }), + right: self.left.right + }); + } else if (self.left.right instanceof AST_Constant) { + self = make_node(AST_Binary, self, { + operator: self.operator, + left: make_node(AST_Binary, self.left, { + operator: self.operator, + left: self.left.right, + right: self.right, + start: self.left.right.start, + end: self.right.end + }), + right: self.left.left + }); + } + } + // (a | 1) | (2 | d) => (3 | a) | b + if (self.left instanceof AST_Binary + && self.left.operator == self.operator + && self.left.right instanceof AST_Constant + && self.right instanceof AST_Binary + && self.right.operator == self.operator + && self.right.left instanceof AST_Constant) { + self = make_node(AST_Binary, self, { + operator: self.operator, + left: make_node(AST_Binary, self.left, { + operator: self.operator, + left: make_node(AST_Binary, self.left.left, { + operator: self.operator, + left: self.left.right, + right: self.right.left, + start: self.left.right.start, + end: self.right.left.end + }), + right: self.left.left + }), + right: self.right.right + }); + } + } + } + } + // x && (y && z) ==> x && y && z + // x || (y || z) ==> x || y || z + // x + ("y" + z) ==> x + "y" + z + // "x" + (y + "z")==> "x" + y + "z" + if (self.right instanceof AST_Binary + && self.right.operator == self.operator + && (lazy_op(self.operator) + || (self.operator == "+" + && (self.right.left.is_string(compressor) + || (self.left.is_string(compressor) + && self.right.right.is_string(compressor)))))) + { + self.left = make_node(AST_Binary, self.left, { + operator : self.operator, + left : self.left, + right : self.right.left + }); + self.right = self.right.right; + return self.transform(compressor); + } + var ev = self.evaluate(compressor); + if (ev !== self) { + ev = make_node_from_constant(ev, self).optimize(compressor); + return best_of(compressor, ev, self); + } + return self; + }); + + function recursive_ref(compressor, def) { + var node; + for (var i = 0; node = compressor.parent(i); i++) { + if (node instanceof AST_Lambda) { + var name = node.name; + if (name && name.definition() === def) break; + } + } + return node; + } + + OPT(AST_SymbolRef, function(self, compressor){ + var def = self.resolve_defines(compressor); + if (def) { + return def.optimize(compressor); + } + // testing against !self.scope.uses_with first is an optimization + if (!compressor.option("ie8") + && is_undeclared_ref(self) + && (!self.scope.uses_with || !compressor.find_parent(AST_With))) { + switch (self.name) { + case "undefined": + return make_node(AST_Undefined, self).optimize(compressor); + case "NaN": + return make_node(AST_NaN, self).optimize(compressor); + case "Infinity": + return make_node(AST_Infinity, self).optimize(compressor); + } + } + if (compressor.option("reduce_vars") + && is_lhs(self, compressor.parent()) !== self) { + var d = self.definition(); + var fixed = self.fixed_value(); + if (fixed instanceof AST_Defun) { + d.fixed = fixed = make_node(AST_Function, fixed, fixed); + } + if (d.single_use && fixed instanceof AST_Function) { + if (d.scope !== self.scope + && (!compressor.option("reduce_funcs") + || d.escaped + || fixed.inlined)) { + d.single_use = false; + } else if (recursive_ref(compressor, d)) { + d.single_use = false; + } else if (d.scope !== self.scope || d.orig[0] instanceof AST_SymbolFunarg) { + d.single_use = fixed.is_constant_expression(self.scope); + if (d.single_use == "f") { + var scope = self.scope; + do { + if (scope instanceof AST_Defun || scope instanceof AST_Function) { + scope.inlined = true; + } + } while (scope = scope.parent_scope); + } + } + } + if (d.single_use && fixed) { + var value = fixed.optimize(compressor); + return value === fixed ? fixed.clone(true) : value; + } + if (fixed && d.should_replace === undefined) { + var init; + if (fixed instanceof AST_This) { + if (!(d.orig[0] instanceof AST_SymbolFunarg) + && all(d.references, function(ref) { + return d.scope === ref.scope; + })) { + init = fixed; + } + } else { + var ev = fixed.evaluate(compressor); + if (ev !== fixed && (compressor.option("unsafe_regexp") || !(ev instanceof RegExp))) { + init = make_node_from_constant(ev, fixed); + } + } + if (init) { + var value_length = init.optimize(compressor).print_to_string().length; + var fn; + if (has_symbol_ref(fixed)) { + fn = function() { + var result = init.optimize(compressor); + return result === init ? result.clone(true) : result; + }; + } else { + value_length = Math.min(value_length, fixed.print_to_string().length); + fn = function() { + var result = best_of_expression(init.optimize(compressor), fixed); + return result === init || result === fixed ? result.clone(true) : result; + }; + } + var name_length = d.name.length; + var overhead = 0; + if (compressor.option("unused") && !compressor.exposed(d)) { + overhead = (name_length + 2 + value_length) / d.references.length; + } + d.should_replace = value_length <= name_length + overhead ? fn : false; + } else { + d.should_replace = false; + } + } + if (d.should_replace) { + return d.should_replace(); + } + } + return self; + + function has_symbol_ref(value) { + var found; + value.walk(new TreeWalker(function(node) { + if (node instanceof AST_SymbolRef) found = true; + if (found) return true; + })); + return found; + } + }); + + function is_atomic(lhs, self) { + return lhs instanceof AST_SymbolRef || lhs.TYPE === self.TYPE; + } + + OPT(AST_Undefined, function(self, compressor){ + if (compressor.option("unsafe")) { + var undef = find_variable(compressor, "undefined"); + if (undef) { + var ref = make_node(AST_SymbolRef, self, { + name : "undefined", + scope : undef.scope, + thedef : undef + }); + ref.is_undefined = true; + return ref; + } + } + var lhs = is_lhs(compressor.self(), compressor.parent()); + if (lhs && is_atomic(lhs, self)) return self; + return make_node(AST_UnaryPrefix, self, { + operator: "void", + expression: make_node(AST_Number, self, { + value: 0 + }) + }); + }); + + OPT(AST_Infinity, function(self, compressor){ + var lhs = is_lhs(compressor.self(), compressor.parent()); + if (lhs && is_atomic(lhs, self)) return self; + if (compressor.option("keep_infinity") + && !(lhs && !is_atomic(lhs, self)) + && !find_variable(compressor, "Infinity")) + return self; + return make_node(AST_Binary, self, { + operator: "/", + left: make_node(AST_Number, self, { + value: 1 + }), + right: make_node(AST_Number, self, { + value: 0 + }) + }); + }); + + OPT(AST_NaN, function(self, compressor){ + var lhs = is_lhs(compressor.self(), compressor.parent()); + if (lhs && !is_atomic(lhs, self) + || find_variable(compressor, "NaN")) { + return make_node(AST_Binary, self, { + operator: "/", + left: make_node(AST_Number, self, { + value: 0 + }), + right: make_node(AST_Number, self, { + value: 0 + }) + }); + } + return self; + }); + + var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; + var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ]; + OPT(AST_Assign, function(self, compressor){ + self = self.lift_sequences(compressor); + if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) { + // x = expr1 OP expr2 + if (self.right.left instanceof AST_SymbolRef + && self.right.left.name == self.left.name + && member(self.right.operator, ASSIGN_OPS)) { + // x = x - 2 ---> x -= 2 + self.operator = self.right.operator + "="; + self.right = self.right.right; + } + else if (self.right.right instanceof AST_SymbolRef + && self.right.right.name == self.left.name + && member(self.right.operator, ASSIGN_OPS_COMMUTATIVE) + && !self.right.left.has_side_effects(compressor)) { + // x = 2 & x ---> x &= 2 + self.operator = self.right.operator + "="; + self.right = self.right.left; + } + } + return self; + }); + + OPT(AST_Conditional, function(self, compressor){ + if (!compressor.option("conditionals")) return self; + // This looks like lift_sequences(), should probably be under "sequences" + if (self.condition instanceof AST_Sequence) { + var expressions = self.condition.expressions.slice(); + self.condition = expressions.pop(); + expressions.push(self); + return make_sequence(self, expressions); + } + var cond = self.condition.evaluate(compressor); + if (cond !== self.condition) { + if (cond) { + compressor.warn("Condition always true [{file}:{line},{col}]", self.start); + return maintain_this_binding(compressor.parent(), compressor.self(), self.consequent); + } else { + compressor.warn("Condition always false [{file}:{line},{col}]", self.start); + return maintain_this_binding(compressor.parent(), compressor.self(), self.alternative); + } + } + var negated = cond.negate(compressor, first_in_statement(compressor)); + if (best_of(compressor, cond, negated) === negated) { + self = make_node(AST_Conditional, self, { + condition: negated, + consequent: self.alternative, + alternative: self.consequent + }); + } + var condition = self.condition; + var consequent = self.consequent; + var alternative = self.alternative; + // x?x:y --> x||y + if (condition instanceof AST_SymbolRef + && consequent instanceof AST_SymbolRef + && condition.definition() === consequent.definition()) { + return make_node(AST_Binary, self, { + operator: "||", + left: condition, + right: alternative + }); + } + // if (foo) exp = something; else exp = something_else; + // | + // v + // exp = foo ? something : something_else; + if (consequent instanceof AST_Assign + && alternative instanceof AST_Assign + && consequent.operator == alternative.operator + && consequent.left.equivalent_to(alternative.left) + && (!self.condition.has_side_effects(compressor) + || consequent.operator == "=" + && !consequent.left.has_side_effects(compressor))) { + return make_node(AST_Assign, self, { + operator: consequent.operator, + left: consequent.left, + right: make_node(AST_Conditional, self, { + condition: self.condition, + consequent: consequent.right, + alternative: alternative.right + }) + }); + } + // x ? y(a) : y(b) --> y(x ? a : b) + var arg_index; + if (consequent instanceof AST_Call + && alternative.TYPE === consequent.TYPE + && consequent.args.length > 0 + && consequent.args.length == alternative.args.length + && consequent.expression.equivalent_to(alternative.expression) + && !self.condition.has_side_effects(compressor) + && !consequent.expression.has_side_effects(compressor) + && typeof (arg_index = single_arg_diff()) == "number") { + var node = consequent.clone(); + node.args[arg_index] = make_node(AST_Conditional, self, { + condition: self.condition, + consequent: consequent.args[arg_index], + alternative: alternative.args[arg_index] + }); + return node; + } + // x?y?z:a:a --> x&&y?z:a + if (consequent instanceof AST_Conditional + && consequent.alternative.equivalent_to(alternative)) { + return make_node(AST_Conditional, self, { + condition: make_node(AST_Binary, self, { + left: self.condition, + operator: "&&", + right: consequent.condition + }), + consequent: consequent.consequent, + alternative: alternative + }); + } + // x ? y : y --> x, y + if (consequent.equivalent_to(alternative)) { + return make_sequence(self, [ + self.condition, + consequent + ]).optimize(compressor); + } + var in_bool = compressor.in_boolean_context(); + if (is_true(self.consequent)) { + if (is_false(self.alternative)) { + // c ? true : false ---> !!c + return booleanize(self.condition); + } + // c ? true : x ---> !!c || x + return make_node(AST_Binary, self, { + operator: "||", + left: booleanize(self.condition), + right: self.alternative + }); + } + if (is_false(self.consequent)) { + if (is_true(self.alternative)) { + // c ? false : true ---> !c + return booleanize(self.condition.negate(compressor)); + } + // c ? false : x ---> !c && x + return make_node(AST_Binary, self, { + operator: "&&", + left: booleanize(self.condition.negate(compressor)), + right: self.alternative + }); + } + if (is_true(self.alternative)) { + // c ? x : true ---> !c || x + return make_node(AST_Binary, self, { + operator: "||", + left: booleanize(self.condition.negate(compressor)), + right: self.consequent + }); + } + if (is_false(self.alternative)) { + // c ? x : false ---> !!c && x + return make_node(AST_Binary, self, { + operator: "&&", + left: booleanize(self.condition), + right: self.consequent + }); + } + + return self; + + function booleanize(node) { + if (node.is_boolean()) return node; + // !!expression + return make_node(AST_UnaryPrefix, node, { + operator: "!", + expression: node.negate(compressor) + }); + } + + // AST_True or !0 + function is_true(node) { + return node instanceof AST_True + || in_bool + && node instanceof AST_Constant + && node.getValue() + || (node instanceof AST_UnaryPrefix + && node.operator == "!" + && node.expression instanceof AST_Constant + && !node.expression.getValue()); + } + // AST_False or !1 + function is_false(node) { + return node instanceof AST_False + || in_bool + && node instanceof AST_Constant + && !node.getValue() + || (node instanceof AST_UnaryPrefix + && node.operator == "!" + && node.expression instanceof AST_Constant + && node.expression.getValue()); + } + + function single_arg_diff() { + var a = consequent.args; + var b = alternative.args; + for (var i = 0, len = a.length; i < len; i++) { + if (!a[i].equivalent_to(b[i])) { + for (var j = i + 1; j < len; j++) { + if (!a[j].equivalent_to(b[j])) return; + } + return i; + } + } + } + }); + + OPT(AST_Boolean, function(self, compressor){ + if (compressor.in_boolean_context()) return make_node(AST_Number, self, { + value: +self.value + }); + if (compressor.option("booleans")) { + var p = compressor.parent(); + if (p instanceof AST_Binary && (p.operator == "==" + || p.operator == "!=")) { + compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]", { + operator : p.operator, + value : self.value, + file : p.start.file, + line : p.start.line, + col : p.start.col, + }); + return make_node(AST_Number, self, { + value: +self.value + }); + } + return make_node(AST_UnaryPrefix, self, { + operator: "!", + expression: make_node(AST_Number, self, { + value: 1 - self.value + }) + }); + } + return self; + }); + + OPT(AST_Sub, function(self, compressor){ + var expr = self.expression; + var prop = self.property; + if (compressor.option("properties")) { + var key = prop.evaluate(compressor); + if (key !== prop) { + if (typeof key == "string") { + if (key == "undefined") { + key = undefined; + } else { + var value = parseFloat(key); + if (value.toString() == key) { + key = value; + } + } + } + prop = self.property = best_of_expression(prop, make_node_from_constant(key, prop).transform(compressor)); + var property = "" + key; + if (is_identifier_string(property) + && property.length <= prop.print_to_string().length + 1) { + return make_node(AST_Dot, self, { + expression: expr, + property: property + }).optimize(compressor); + } + } + } + if (is_lhs(self, compressor.parent())) return self; + if (key !== prop) { + var sub = self.flatten_object(property, compressor); + if (sub) { + expr = self.expression = sub.expression; + prop = self.property = sub.property; + } + } + if (compressor.option("properties") && compressor.option("side_effects") + && prop instanceof AST_Number && expr instanceof AST_Array) { + var index = prop.getValue(); + var elements = expr.elements; + if (index in elements) { + var flatten = true; + var values = []; + for (var i = elements.length; --i > index;) { + var value = elements[i].drop_side_effect_free(compressor); + if (value) { + values.unshift(value); + if (flatten && value.has_side_effects(compressor)) flatten = false; + } + } + var retValue = elements[index]; + retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue; + if (!flatten) values.unshift(retValue); + while (--i >= 0) { + var value = elements[i].drop_side_effect_free(compressor); + if (value) values.unshift(value); + else index--; + } + if (flatten) { + values.push(retValue); + return make_sequence(self, values).optimize(compressor); + } else return make_node(AST_Sub, self, { + expression: make_node(AST_Array, expr, { + elements: values + }), + property: make_node(AST_Number, prop, { + value: index + }) + }); + } + } + var ev = self.evaluate(compressor); + if (ev !== self) { + ev = make_node_from_constant(ev, self).optimize(compressor); + return best_of(compressor, ev, self); + } + return self; + }); + + AST_Lambda.DEFMETHOD("contains_this", function() { + var result; + var self = this; + self.walk(new TreeWalker(function(node) { + if (result) return true; + if (node instanceof AST_This) return result = true; + if (node !== self && node instanceof AST_Scope) return true; + })); + return result; + }); + + AST_PropAccess.DEFMETHOD("flatten_object", function(key, compressor) { + if (!compressor.option("properties")) return; + var expr = this.expression; + if (expr instanceof AST_Object) { + var props = expr.properties; + for (var i = props.length; --i >= 0;) { + var prop = props[i]; + if ("" + prop.key == key) { + if (!all(props, function(prop) { + return prop instanceof AST_ObjectKeyVal; + })) break; + var value = prop.value; + if (value instanceof AST_Function + && !(compressor.parent() instanceof AST_New) + && value.contains_this()) break; + return make_node(AST_Sub, this, { + expression: make_node(AST_Array, expr, { + elements: props.map(function(prop) { + return prop.value; + }) + }), + property: make_node(AST_Number, this, { + value: i + }) + }); + } + } + } + }); + + OPT(AST_Dot, function(self, compressor){ + var def = self.resolve_defines(compressor); + if (def) { + return def.optimize(compressor); + } + if (compressor.option("unsafe_proto") + && self.expression instanceof AST_Dot + && self.expression.property == "prototype") { + var exp = self.expression.expression; + if (is_undeclared_ref(exp)) switch (exp.name) { + case "Array": + self.expression = make_node(AST_Array, self.expression, { + elements: [] + }); + break; + case "Object": + self.expression = make_node(AST_Object, self.expression, { + properties: [] + }); + break; + case "String": + self.expression = make_node(AST_String, self.expression, { + value: "" + }); + break; + } + } + if (is_lhs(self, compressor.parent())) return self; + var sub = self.flatten_object(self.property, compressor); + if (sub) return sub.optimize(compressor); + var ev = self.evaluate(compressor); + if (ev !== self) { + ev = make_node_from_constant(ev, self).optimize(compressor); + return best_of(compressor, ev, self); + } + return self; + }); + + function literals_in_boolean_context(self, compressor) { + if (compressor.in_boolean_context()) { + return best_of(compressor, self, make_sequence(self, [ + self, + make_node(AST_True, self) + ]).optimize(compressor)); + } + return self; + }; + OPT(AST_Array, literals_in_boolean_context); + OPT(AST_Object, literals_in_boolean_context); + OPT(AST_RegExp, literals_in_boolean_context); + + OPT(AST_Return, function(self, compressor){ + if (self.value && is_undefined(self.value, compressor)) { + self.value = null; + } + return self; + }); + + OPT(AST_VarDef, function(self, compressor){ + var defines = compressor.option("global_defs"); + if (defines && HOP(defines, self.name.name)) { + compressor.warn('global_defs ' + self.name.name + ' redefined [{file}:{line},{col}]', self.start); + } + return self; + }); + +})(); diff --git a/node_modules/uglify-js/lib/minify.js b/node_modules/uglify-js/lib/minify.js new file mode 100644 index 00000000..806c3aeb --- /dev/null +++ b/node_modules/uglify-js/lib/minify.js @@ -0,0 +1,228 @@ +"use strict"; + +var to_ascii = typeof atob == "undefined" ? function(b64) { + return new Buffer(b64, "base64").toString(); +} : atob; +var to_base64 = typeof btoa == "undefined" ? function(str) { + return new Buffer(str).toString("base64"); +} : btoa; + +function read_source_map(code) { + var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code); + if (!match) { + AST_Node.warn("inline source map not found"); + return null; + } + return to_ascii(match[2]); +} + +function set_shorthand(name, options, keys) { + if (options[name]) { + keys.forEach(function(key) { + if (options[key]) { + if (typeof options[key] != "object") options[key] = {}; + if (!(name in options[key])) options[key][name] = options[name]; + } + }); + } +} + +function init_cache(cache) { + if (!cache) return; + if (!("cname" in cache)) cache.cname = -1; + if (!("props" in cache)) { + cache.props = new Dictionary(); + } else if (!(cache.props instanceof Dictionary)) { + cache.props = Dictionary.fromObject(cache.props); + } +} + +function to_json(cache) { + return { + cname: cache.cname, + props: cache.props.toObject() + }; +} + +function minify(files, options) { + var warn_function = AST_Node.warn_function; + try { + options = defaults(options, { + compress: {}, + ie8: false, + keep_fnames: false, + mangle: {}, + nameCache: null, + output: {}, + parse: {}, + rename: undefined, + sourceMap: false, + timings: false, + toplevel: false, + warnings: false, + wrap: false, + }, true); + var timings = options.timings && { + start: Date.now() + }; + if (options.rename === undefined) { + options.rename = options.compress && options.mangle; + } + set_shorthand("ie8", options, [ "compress", "mangle", "output" ]); + set_shorthand("keep_fnames", options, [ "compress", "mangle" ]); + set_shorthand("toplevel", options, [ "compress", "mangle" ]); + set_shorthand("warnings", options, [ "compress" ]); + var quoted_props; + if (options.mangle) { + options.mangle = defaults(options.mangle, { + cache: options.nameCache && (options.nameCache.vars || {}), + eval: false, + ie8: false, + keep_fnames: false, + properties: false, + reserved: [], + toplevel: false, + }, true); + if (options.mangle.properties) { + if (typeof options.mangle.properties != "object") { + options.mangle.properties = {}; + } + if (options.mangle.properties.keep_quoted) { + quoted_props = options.mangle.properties.reserved; + if (!Array.isArray(quoted_props)) quoted_props = []; + options.mangle.properties.reserved = quoted_props; + } + if (options.nameCache && !("cache" in options.mangle.properties)) { + options.mangle.properties.cache = options.nameCache.props || {}; + } + } + init_cache(options.mangle.cache); + init_cache(options.mangle.properties.cache); + } + if (options.sourceMap) { + options.sourceMap = defaults(options.sourceMap, { + content: null, + filename: null, + includeSources: false, + root: null, + url: null, + }, true); + } + var warnings = []; + if (options.warnings && !AST_Node.warn_function) { + AST_Node.warn_function = function(warning) { + warnings.push(warning); + }; + } + if (timings) timings.parse = Date.now(); + var toplevel; + if (files instanceof AST_Toplevel) { + toplevel = files; + } else { + if (typeof files == "string") { + files = [ files ]; + } + options.parse = options.parse || {}; + options.parse.toplevel = null; + for (var name in files) if (HOP(files, name)) { + options.parse.filename = name; + options.parse.toplevel = parse(files[name], options.parse); + if (options.sourceMap && options.sourceMap.content == "inline") { + if (Object.keys(files).length > 1) + throw new Error("inline source map only works with singular input"); + options.sourceMap.content = read_source_map(files[name]); + } + } + toplevel = options.parse.toplevel; + } + if (quoted_props) { + reserve_quoted_keys(toplevel, quoted_props); + } + if (options.wrap) { + toplevel = toplevel.wrap_commonjs(options.wrap); + } + if (timings) timings.rename = Date.now(); + if (options.rename) { + toplevel.figure_out_scope(options.mangle); + toplevel.expand_names(options.mangle); + } + if (timings) timings.compress = Date.now(); + if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel); + if (timings) timings.scope = Date.now(); + if (options.mangle) toplevel.figure_out_scope(options.mangle); + if (timings) timings.mangle = Date.now(); + if (options.mangle) { + base54.reset(); + toplevel.compute_char_frequency(options.mangle); + toplevel.mangle_names(options.mangle); + } + if (timings) timings.properties = Date.now(); + if (options.mangle && options.mangle.properties) { + toplevel = mangle_properties(toplevel, options.mangle.properties); + } + if (timings) timings.output = Date.now(); + var result = {}; + if (options.output.ast) { + result.ast = toplevel; + } + if (!HOP(options.output, "code") || options.output.code) { + if (options.sourceMap) { + if (typeof options.sourceMap.content == "string") { + options.sourceMap.content = JSON.parse(options.sourceMap.content); + } + options.output.source_map = SourceMap({ + file: options.sourceMap.filename, + orig: options.sourceMap.content, + root: options.sourceMap.root + }); + if (options.sourceMap.includeSources) { + if (files instanceof AST_Toplevel) { + throw new Error("original source content unavailable"); + } else for (var name in files) if (HOP(files, name)) { + options.output.source_map.get().setSourceContent(name, files[name]); + } + } + } + delete options.output.ast; + delete options.output.code; + var stream = OutputStream(options.output); + toplevel.print(stream); + result.code = stream.get(); + if (options.sourceMap) { + result.map = options.output.source_map.toString(); + if (options.sourceMap.url == "inline") { + result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map); + } else if (options.sourceMap.url) { + result.code += "\n//# sourceMappingURL=" + options.sourceMap.url; + } + } + } + if (options.nameCache && options.mangle) { + if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache); + if (options.mangle.properties && options.mangle.properties.cache) { + options.nameCache.props = to_json(options.mangle.properties.cache); + } + } + if (timings) { + timings.end = Date.now(); + result.timings = { + parse: 1e-3 * (timings.rename - timings.parse), + rename: 1e-3 * (timings.compress - timings.rename), + compress: 1e-3 * (timings.scope - timings.compress), + scope: 1e-3 * (timings.mangle - timings.scope), + mangle: 1e-3 * (timings.properties - timings.mangle), + properties: 1e-3 * (timings.output - timings.properties), + output: 1e-3 * (timings.end - timings.output), + total: 1e-3 * (timings.end - timings.start) + } + } + if (warnings.length) { + result.warnings = warnings; + } + return result; + } catch (ex) { + return { error: ex }; + } finally { + AST_Node.warn_function = warn_function; + } +} diff --git a/node_modules/uglify-js/lib/mozilla-ast.js b/node_modules/uglify-js/lib/mozilla-ast.js new file mode 100644 index 00000000..8d7ee4b8 --- /dev/null +++ b/node_modules/uglify-js/lib/mozilla-ast.js @@ -0,0 +1,615 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +(function(){ + + var normalize_directives = function(body) { + var in_directive = true; + + for (var i = 0; i < body.length; i++) { + if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) { + body[i] = new AST_Directive({ + start: body[i].start, + end: body[i].end, + value: body[i].body.value + }); + } else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) { + in_directive = false; + } + } + + return body; + }; + + var MOZ_TO_ME = { + Program: function(M) { + return new AST_Toplevel({ + start: my_start_token(M), + end: my_end_token(M), + body: normalize_directives(M.body.map(from_moz)) + }); + }, + FunctionDeclaration: function(M) { + return new AST_Defun({ + start: my_start_token(M), + end: my_end_token(M), + name: from_moz(M.id), + argnames: M.params.map(from_moz), + body: normalize_directives(from_moz(M.body).body) + }); + }, + FunctionExpression: function(M) { + return new AST_Function({ + start: my_start_token(M), + end: my_end_token(M), + name: from_moz(M.id), + argnames: M.params.map(from_moz), + body: normalize_directives(from_moz(M.body).body) + }); + }, + ExpressionStatement: function(M) { + return new AST_SimpleStatement({ + start: my_start_token(M), + end: my_end_token(M), + body: from_moz(M.expression) + }); + }, + TryStatement: function(M) { + var handlers = M.handlers || [M.handler]; + if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) { + throw new Error("Multiple catch clauses are not supported."); + } + return new AST_Try({ + start : my_start_token(M), + end : my_end_token(M), + body : from_moz(M.block).body, + bcatch : from_moz(handlers[0]), + bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null + }); + }, + Property: function(M) { + var key = M.key; + var args = { + start : my_start_token(key), + end : my_end_token(M.value), + key : key.type == "Identifier" ? key.name : key.value, + value : from_moz(M.value) + }; + if (M.kind == "init") return new AST_ObjectKeyVal(args); + args.key = new AST_SymbolAccessor({ + name: args.key + }); + args.value = new AST_Accessor(args.value); + if (M.kind == "get") return new AST_ObjectGetter(args); + if (M.kind == "set") return new AST_ObjectSetter(args); + }, + ArrayExpression: function(M) { + return new AST_Array({ + start : my_start_token(M), + end : my_end_token(M), + elements : M.elements.map(function(elem){ + return elem === null ? new AST_Hole() : from_moz(elem); + }) + }); + }, + ObjectExpression: function(M) { + return new AST_Object({ + start : my_start_token(M), + end : my_end_token(M), + properties : M.properties.map(function(prop){ + prop.type = "Property"; + return from_moz(prop) + }) + }); + }, + SequenceExpression: function(M) { + return new AST_Sequence({ + start : my_start_token(M), + end : my_end_token(M), + expressions: M.expressions.map(from_moz) + }); + }, + MemberExpression: function(M) { + return new (M.computed ? AST_Sub : AST_Dot)({ + start : my_start_token(M), + end : my_end_token(M), + property : M.computed ? from_moz(M.property) : M.property.name, + expression : from_moz(M.object) + }); + }, + SwitchCase: function(M) { + return new (M.test ? AST_Case : AST_Default)({ + start : my_start_token(M), + end : my_end_token(M), + expression : from_moz(M.test), + body : M.consequent.map(from_moz) + }); + }, + VariableDeclaration: function(M) { + return new AST_Var({ + start : my_start_token(M), + end : my_end_token(M), + definitions : M.declarations.map(from_moz) + }); + }, + Literal: function(M) { + var val = M.value, args = { + start : my_start_token(M), + end : my_end_token(M) + }; + if (val === null) return new AST_Null(args); + switch (typeof val) { + case "string": + args.value = val; + return new AST_String(args); + case "number": + args.value = val; + return new AST_Number(args); + case "boolean": + return new (val ? AST_True : AST_False)(args); + default: + var rx = M.regex; + if (rx && rx.pattern) { + // RegExpLiteral as per ESTree AST spec + args.value = new RegExp(rx.pattern, rx.flags).toString(); + } else { + // support legacy RegExp + args.value = M.regex && M.raw ? M.raw : val; + } + return new AST_RegExp(args); + } + }, + Identifier: function(M) { + var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2]; + return new ( p.type == "LabeledStatement" ? AST_Label + : p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar + : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg) + : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg) + : p.type == "CatchClause" ? AST_SymbolCatch + : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef + : AST_SymbolRef)({ + start : my_start_token(M), + end : my_end_token(M), + name : M.name + }); + } + }; + + MOZ_TO_ME.UpdateExpression = + MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) { + var prefix = "prefix" in M ? M.prefix + : M.type == "UnaryExpression" ? true : false; + return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({ + start : my_start_token(M), + end : my_end_token(M), + operator : M.operator, + expression : from_moz(M.argument) + }); + }; + + map("EmptyStatement", AST_EmptyStatement); + map("BlockStatement", AST_BlockStatement, "body@body"); + map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative"); + map("LabeledStatement", AST_LabeledStatement, "label>label, body>body"); + map("BreakStatement", AST_Break, "label>label"); + map("ContinueStatement", AST_Continue, "label>label"); + map("WithStatement", AST_With, "object>expression, body>body"); + map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body"); + map("ReturnStatement", AST_Return, "argument>value"); + map("ThrowStatement", AST_Throw, "argument>value"); + map("WhileStatement", AST_While, "test>condition, body>body"); + map("DoWhileStatement", AST_Do, "test>condition, body>body"); + map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body"); + map("ForInStatement", AST_ForIn, "left>init, right>object, body>body"); + map("DebuggerStatement", AST_Debugger); + map("VariableDeclarator", AST_VarDef, "id>name, init>value"); + map("CatchClause", AST_Catch, "param>argname, body%body"); + + map("ThisExpression", AST_This); + map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right"); + map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right"); + map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right"); + map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative"); + map("NewExpression", AST_New, "callee>expression, arguments@args"); + map("CallExpression", AST_Call, "callee>expression, arguments@args"); + + def_to_moz(AST_Toplevel, function To_Moz_Program(M) { + return to_moz_scope("Program", M); + }); + + def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) { + return { + type: "FunctionDeclaration", + id: to_moz(M.name), + params: M.argnames.map(to_moz), + body: to_moz_scope("BlockStatement", M) + } + }); + + def_to_moz(AST_Function, function To_Moz_FunctionExpression(M) { + return { + type: "FunctionExpression", + id: to_moz(M.name), + params: M.argnames.map(to_moz), + body: to_moz_scope("BlockStatement", M) + } + }); + + def_to_moz(AST_Directive, function To_Moz_Directive(M) { + return { + type: "ExpressionStatement", + expression: { + type: "Literal", + value: M.value + } + }; + }); + + def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) { + return { + type: "ExpressionStatement", + expression: to_moz(M.body) + }; + }); + + def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) { + return { + type: "SwitchCase", + test: to_moz(M.expression), + consequent: M.body.map(to_moz) + }; + }); + + def_to_moz(AST_Try, function To_Moz_TryStatement(M) { + return { + type: "TryStatement", + block: to_moz_block(M), + handler: to_moz(M.bcatch), + guardedHandlers: [], + finalizer: to_moz(M.bfinally) + }; + }); + + def_to_moz(AST_Catch, function To_Moz_CatchClause(M) { + return { + type: "CatchClause", + param: to_moz(M.argname), + guard: null, + body: to_moz_block(M) + }; + }); + + def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) { + return { + type: "VariableDeclaration", + kind: "var", + declarations: M.definitions.map(to_moz) + }; + }); + + def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) { + return { + type: "SequenceExpression", + expressions: M.expressions.map(to_moz) + }; + }); + + def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) { + var isComputed = M instanceof AST_Sub; + return { + type: "MemberExpression", + object: to_moz(M.expression), + computed: isComputed, + property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property} + }; + }); + + def_to_moz(AST_Unary, function To_Moz_Unary(M) { + return { + type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression", + operator: M.operator, + prefix: M instanceof AST_UnaryPrefix, + argument: to_moz(M.expression) + }; + }); + + def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) { + return { + type: M.operator == "&&" || M.operator == "||" ? "LogicalExpression" : "BinaryExpression", + left: to_moz(M.left), + operator: M.operator, + right: to_moz(M.right) + }; + }); + + def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) { + return { + type: "ArrayExpression", + elements: M.elements.map(to_moz) + }; + }); + + def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) { + return { + type: "ObjectExpression", + properties: M.properties.map(to_moz) + }; + }); + + def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) { + var key = { + type: "Literal", + value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key + }; + var kind; + if (M instanceof AST_ObjectKeyVal) { + kind = "init"; + } else + if (M instanceof AST_ObjectGetter) { + kind = "get"; + } else + if (M instanceof AST_ObjectSetter) { + kind = "set"; + } + return { + type: "Property", + kind: kind, + key: key, + value: to_moz(M.value) + }; + }); + + def_to_moz(AST_Symbol, function To_Moz_Identifier(M) { + var def = M.definition(); + return { + type: "Identifier", + name: def ? def.mangled_name || def.name : M.name + }; + }); + + def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) { + var value = M.value; + return { + type: "Literal", + value: value, + raw: value.toString(), + regex: { + pattern: value.source, + flags: value.toString().match(/[gimuy]*$/)[0] + } + }; + }); + + def_to_moz(AST_Constant, function To_Moz_Literal(M) { + var value = M.value; + if (typeof value === 'number' && (value < 0 || (value === 0 && 1 / value < 0))) { + return { + type: "UnaryExpression", + operator: "-", + prefix: true, + argument: { + type: "Literal", + value: -value, + raw: M.start.raw + } + }; + } + return { + type: "Literal", + value: value, + raw: M.start.raw + }; + }); + + def_to_moz(AST_Atom, function To_Moz_Atom(M) { + return { + type: "Identifier", + name: String(M.value) + }; + }); + + AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast); + AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast); + AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null }); + + AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast); + AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast); + + /* -----[ tools ]----- */ + + function raw_token(moznode) { + if (moznode.type == "Literal") { + return moznode.raw != null ? moznode.raw : moznode.value + ""; + } + } + + function my_start_token(moznode) { + var loc = moznode.loc, start = loc && loc.start; + var range = moznode.range; + return new AST_Token({ + file : loc && loc.source, + line : start && start.line, + col : start && start.column, + pos : range ? range[0] : moznode.start, + endline : start && start.line, + endcol : start && start.column, + endpos : range ? range[0] : moznode.start, + raw : raw_token(moznode), + }); + }; + + function my_end_token(moznode) { + var loc = moznode.loc, end = loc && loc.end; + var range = moznode.range; + return new AST_Token({ + file : loc && loc.source, + line : end && end.line, + col : end && end.column, + pos : range ? range[1] : moznode.end, + endline : end && end.line, + endcol : end && end.column, + endpos : range ? range[1] : moznode.end, + raw : raw_token(moznode), + }); + }; + + function map(moztype, mytype, propmap) { + var moz_to_me = "function From_Moz_" + moztype + "(M){\n"; + moz_to_me += "return new U2." + mytype.name + "({\n" + + "start: my_start_token(M),\n" + + "end: my_end_token(M)"; + + var me_to_moz = "function To_Moz_" + moztype + "(M){\n"; + me_to_moz += "return {\n" + + "type: " + JSON.stringify(moztype); + + if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){ + var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop); + if (!m) throw new Error("Can't understand property map: " + prop); + var moz = m[1], how = m[2], my = m[3]; + moz_to_me += ",\n" + my + ": "; + me_to_moz += ",\n" + moz + ": "; + switch (how) { + case "@": + moz_to_me += "M." + moz + ".map(from_moz)"; + me_to_moz += "M." + my + ".map(to_moz)"; + break; + case ">": + moz_to_me += "from_moz(M." + moz + ")"; + me_to_moz += "to_moz(M." + my + ")"; + break; + case "=": + moz_to_me += "M." + moz; + me_to_moz += "M." + my; + break; + case "%": + moz_to_me += "from_moz(M." + moz + ").body"; + me_to_moz += "to_moz_block(M)"; + break; + default: + throw new Error("Can't understand operator in propmap: " + prop); + } + }); + + moz_to_me += "\n})\n}"; + me_to_moz += "\n}\n}"; + + //moz_to_me = parse(moz_to_me).print_to_string({ beautify: true }); + //me_to_moz = parse(me_to_moz).print_to_string({ beautify: true }); + //console.log(moz_to_me); + + moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")( + exports, my_start_token, my_end_token, from_moz + ); + me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")( + to_moz, to_moz_block, to_moz_scope + ); + MOZ_TO_ME[moztype] = moz_to_me; + def_to_moz(mytype, me_to_moz); + }; + + var FROM_MOZ_STACK = null; + + function from_moz(node) { + FROM_MOZ_STACK.push(node); + var ret = node != null ? MOZ_TO_ME[node.type](node) : null; + FROM_MOZ_STACK.pop(); + return ret; + }; + + AST_Node.from_mozilla_ast = function(node){ + var save_stack = FROM_MOZ_STACK; + FROM_MOZ_STACK = []; + var ast = from_moz(node); + FROM_MOZ_STACK = save_stack; + return ast; + }; + + function set_moz_loc(mynode, moznode, myparent) { + var start = mynode.start; + var end = mynode.end; + if (start.pos != null && end.endpos != null) { + moznode.range = [start.pos, end.endpos]; + } + if (start.line) { + moznode.loc = { + start: {line: start.line, column: start.col}, + end: end.endline ? {line: end.endline, column: end.endcol} : null + }; + if (start.file) { + moznode.loc.source = start.file; + } + } + return moznode; + }; + + function def_to_moz(mytype, handler) { + mytype.DEFMETHOD("to_mozilla_ast", function() { + return set_moz_loc(this, handler(this)); + }); + }; + + function to_moz(node) { + return node != null ? node.to_mozilla_ast() : null; + }; + + function to_moz_block(node) { + return { + type: "BlockStatement", + body: node.body.map(to_moz) + }; + }; + + function to_moz_scope(type, node) { + var body = node.body.map(to_moz); + if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) { + body.unshift(to_moz(new AST_EmptyStatement(node.body[0]))); + } + return { + type: type, + body: body + }; + }; +})(); diff --git a/node_modules/uglify-js/lib/output.js b/node_modules/uglify-js/lib/output.js new file mode 100644 index 00000000..1aa63450 --- /dev/null +++ b/node_modules/uglify-js/lib/output.js @@ -0,0 +1,1445 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +var EXPECT_DIRECTIVE = /^$|[;{][\s\n]*$/; + +function is_some_comments(comment) { + // multiline comment + return comment.type == "comment2" && /@preserve|@license|@cc_on/i.test(comment.value); +} + +function OutputStream(options) { + + options = defaults(options, { + ascii_only : false, + beautify : false, + bracketize : false, + comments : false, + ie8 : false, + indent_level : 4, + indent_start : 0, + inline_script : true, + keep_quoted_props: false, + max_line_len : false, + preamble : null, + preserve_line : false, + quote_keys : false, + quote_style : 0, + semicolons : true, + shebang : true, + source_map : null, + webkit : false, + width : 80, + wrap_iife : false, + }, true); + + // Convert comment option to RegExp if neccessary and set up comments filter + var comment_filter = return_false; // Default case, throw all comments away + if (options.comments) { + var comments = options.comments; + if (typeof options.comments === "string" && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) { + var regex_pos = options.comments.lastIndexOf("/"); + comments = new RegExp( + options.comments.substr(1, regex_pos - 1), + options.comments.substr(regex_pos + 1) + ); + } + if (comments instanceof RegExp) { + comment_filter = function(comment) { + return comment.type != "comment5" && comments.test(comment.value); + }; + } + else if (typeof comments === "function") { + comment_filter = function(comment) { + return comment.type != "comment5" && comments(this, comment); + }; + } + else if (comments === "some") { + comment_filter = is_some_comments; + } else { // NOTE includes "all" option + comment_filter = return_true; + } + } + + var indentation = 0; + var current_col = 0; + var current_line = 1; + var current_pos = 0; + var OUTPUT = ""; + + var to_utf8 = options.ascii_only ? function(str, identifier) { + return str.replace(/[\u0000-\u001f\u007f-\uffff]/g, function(ch) { + var code = ch.charCodeAt(0).toString(16); + if (code.length <= 2 && !identifier) { + while (code.length < 2) code = "0" + code; + return "\\x" + code; + } else { + while (code.length < 4) code = "0" + code; + return "\\u" + code; + } + }); + } : function(str) { + return str.replace(/[\ud800-\udbff](?![\udc00-\udfff])/g, function(ch) { + return "\\u" + ch.charCodeAt(0).toString(16); + }).replace(/(^|[^\ud800-\udbff])([\udc00-\udfff])/g, function(match, prefix, ch) { + return prefix + "\\u" + ch.charCodeAt(0).toString(16); + }); + }; + + function make_string(str, quote) { + var dq = 0, sq = 0; + str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g, + function(s, i){ + switch (s) { + case '"': ++dq; return '"'; + case "'": ++sq; return "'"; + case "\\": return "\\\\"; + case "\n": return "\\n"; + case "\r": return "\\r"; + case "\t": return "\\t"; + case "\b": return "\\b"; + case "\f": return "\\f"; + case "\x0B": return options.ie8 ? "\\x0B" : "\\v"; + case "\u2028": return "\\u2028"; + case "\u2029": return "\\u2029"; + case "\ufeff": return "\\ufeff"; + case "\0": + return /[0-9]/.test(str.charAt(i+1)) ? "\\x00" : "\\0"; + } + return s; + }); + function quote_single() { + return "'" + str.replace(/\x27/g, "\\'") + "'"; + } + function quote_double() { + return '"' + str.replace(/\x22/g, '\\"') + '"'; + } + str = to_utf8(str); + switch (options.quote_style) { + case 1: + return quote_single(); + case 2: + return quote_double(); + case 3: + return quote == "'" ? quote_single() : quote_double(); + default: + return dq > sq ? quote_single() : quote_double(); + } + }; + + function encode_string(str, quote) { + var ret = make_string(str, quote); + if (options.inline_script) { + ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1"); + ret = ret.replace(/\x3c!--/g, "\\x3c!--"); + ret = ret.replace(/--\x3e/g, "--\\x3e"); + } + return ret; + }; + + function make_name(name) { + name = name.toString(); + name = to_utf8(name, true); + return name; + }; + + function make_indent(back) { + return repeat_string(" ", options.indent_start + indentation - back * options.indent_level); + }; + + /* -----[ beautification/minification ]----- */ + + var might_need_space = false; + var might_need_semicolon = false; + var might_add_newline = 0; + var last = ""; + var mapping_token, mapping_name, mappings = options.source_map && []; + + var do_add_mapping = mappings ? function() { + mappings.forEach(function(mapping) { + try { + options.source_map.add( + mapping.token.file, + mapping.line, mapping.col, + mapping.token.line, mapping.token.col, + !mapping.name && mapping.token.type == "name" ? mapping.token.value : mapping.name + ); + } catch(ex) { + AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", { + file: mapping.token.file, + line: mapping.token.line, + col: mapping.token.col, + cline: mapping.line, + ccol: mapping.col, + name: mapping.name || "" + }) + } + }); + mappings = []; + } : noop; + + var ensure_line_len = options.max_line_len ? function() { + if (current_col > options.max_line_len) { + if (might_add_newline) { + var left = OUTPUT.slice(0, might_add_newline); + var right = OUTPUT.slice(might_add_newline); + if (mappings) { + var delta = right.length - current_col; + mappings.forEach(function(mapping) { + mapping.line++; + mapping.col += delta; + }); + } + OUTPUT = left + "\n" + right; + current_line++; + current_pos++; + current_col = right.length; + } + if (current_col > options.max_line_len) { + AST_Node.warn("Output exceeds {max_line_len} characters", options); + } + } + if (might_add_newline) { + might_add_newline = 0; + do_add_mapping(); + } + } : noop; + + var requireSemicolonChars = makePredicate("( [ + * / - , ."); + + function print(str) { + str = String(str); + var ch = str.charAt(0); + var prev = last.charAt(last.length - 1); + if (might_need_semicolon) { + might_need_semicolon = false; + + if (prev == ":" && ch == "}" || (!ch || ";}".indexOf(ch) < 0) && prev != ";") { + if (options.semicolons || requireSemicolonChars(ch)) { + OUTPUT += ";"; + current_col++; + current_pos++; + } else { + ensure_line_len(); + OUTPUT += "\n"; + current_pos++; + current_line++; + current_col = 0; + + if (/^\s+$/.test(str)) { + // reset the semicolon flag, since we didn't print one + // now and might still have to later + might_need_semicolon = true; + } + } + + if (!options.beautify) + might_need_space = false; + } + } + + if (!options.beautify && options.preserve_line && stack[stack.length - 1]) { + var target_line = stack[stack.length - 1].start.line; + while (current_line < target_line) { + ensure_line_len(); + OUTPUT += "\n"; + current_pos++; + current_line++; + current_col = 0; + might_need_space = false; + } + } + + if (might_need_space) { + if ((is_identifier_char(prev) + && (is_identifier_char(ch) || ch == "\\")) + || (ch == "/" && ch == prev) + || ((ch == "+" || ch == "-") && ch == last)) + { + OUTPUT += " "; + current_col++; + current_pos++; + } + might_need_space = false; + } + + if (mapping_token) { + mappings.push({ + token: mapping_token, + name: mapping_name, + line: current_line, + col: current_col + }); + mapping_token = false; + if (!might_add_newline) do_add_mapping(); + } + + OUTPUT += str; + current_pos += str.length; + var a = str.split(/\r?\n/), n = a.length - 1; + current_line += n; + current_col += a[0].length; + if (n > 0) { + ensure_line_len(); + current_col = a[n].length; + } + last = str; + }; + + var space = options.beautify ? function() { + print(" "); + } : function() { + might_need_space = true; + }; + + var indent = options.beautify ? function(half) { + if (options.beautify) { + print(make_indent(half ? 0.5 : 0)); + } + } : noop; + + var with_indent = options.beautify ? function(col, cont) { + if (col === true) col = next_indent(); + var save_indentation = indentation; + indentation = col; + var ret = cont(); + indentation = save_indentation; + return ret; + } : function(col, cont) { return cont() }; + + var newline = options.beautify ? function() { + print("\n"); + } : options.max_line_len ? function() { + ensure_line_len(); + might_add_newline = OUTPUT.length; + } : noop; + + var semicolon = options.beautify ? function() { + print(";"); + } : function() { + might_need_semicolon = true; + }; + + function force_semicolon() { + might_need_semicolon = false; + print(";"); + }; + + function next_indent() { + return indentation + options.indent_level; + }; + + function with_block(cont) { + var ret; + print("{"); + newline(); + with_indent(next_indent(), function(){ + ret = cont(); + }); + indent(); + print("}"); + return ret; + }; + + function with_parens(cont) { + print("("); + //XXX: still nice to have that for argument lists + //var ret = with_indent(current_col, cont); + var ret = cont(); + print(")"); + return ret; + }; + + function with_square(cont) { + print("["); + //var ret = with_indent(current_col, cont); + var ret = cont(); + print("]"); + return ret; + }; + + function comma() { + print(","); + space(); + }; + + function colon() { + print(":"); + space(); + }; + + var add_mapping = mappings ? function(token, name) { + mapping_token = token; + mapping_name = name; + } : noop; + + function get() { + if (might_add_newline) { + ensure_line_len(); + } + return OUTPUT; + }; + + var stack = []; + return { + get : get, + toString : get, + indent : indent, + indentation : function() { return indentation }, + current_width : function() { return current_col - indentation }, + should_break : function() { return options.width && this.current_width() >= options.width }, + newline : newline, + print : print, + space : space, + comma : comma, + colon : colon, + last : function() { return last }, + semicolon : semicolon, + force_semicolon : force_semicolon, + to_utf8 : to_utf8, + print_name : function(name) { print(make_name(name)) }, + print_string : function(str, quote, escape_directive) { + var encoded = encode_string(str, quote); + if (escape_directive === true && encoded.indexOf("\\") === -1) { + // Insert semicolons to break directive prologue + if (!EXPECT_DIRECTIVE.test(OUTPUT)) { + force_semicolon(); + } + force_semicolon(); + } + print(encoded); + }, + encode_string : encode_string, + next_indent : next_indent, + with_indent : with_indent, + with_block : with_block, + with_parens : with_parens, + with_square : with_square, + add_mapping : add_mapping, + option : function(opt) { return options[opt] }, + comment_filter : comment_filter, + line : function() { return current_line }, + col : function() { return current_col }, + pos : function() { return current_pos }, + push_node : function(node) { stack.push(node) }, + pop_node : function() { return stack.pop() }, + parent : function(n) { + return stack[stack.length - 2 - (n || 0)]; + } + }; + +}; + +/* -----[ code generators ]----- */ + +(function(){ + + /* -----[ utils ]----- */ + + function DEFPRINT(nodetype, generator) { + nodetype.DEFMETHOD("_codegen", generator); + }; + + var in_directive = false; + var active_scope = null; + var use_asm = null; + + AST_Node.DEFMETHOD("print", function(stream, force_parens){ + var self = this, generator = self._codegen; + if (self instanceof AST_Scope) { + active_scope = self; + } + else if (!use_asm && self instanceof AST_Directive && self.value == "use asm") { + use_asm = active_scope; + } + function doit() { + self.add_comments(stream); + self.add_source_map(stream); + generator(self, stream); + } + stream.push_node(self); + if (force_parens || self.needs_parens(stream)) { + stream.with_parens(doit); + } else { + doit(); + } + stream.pop_node(); + if (self === use_asm) { + use_asm = null; + } + }); + AST_Node.DEFMETHOD("_print", AST_Node.prototype.print); + + AST_Node.DEFMETHOD("print_to_string", function(options){ + var s = OutputStream(options); + if (!options) s._readonly = true; + this.print(s); + return s.get(); + }); + + /* -----[ comments ]----- */ + + AST_Node.DEFMETHOD("add_comments", function(output){ + if (output._readonly) return; + var self = this; + var start = self.start; + if (start && !start._comments_dumped) { + start._comments_dumped = true; + var comments = start.comments_before || []; + + // XXX: ugly fix for https://github.com/mishoo/UglifyJS2/issues/112 + // and https://github.com/mishoo/UglifyJS2/issues/372 + if (self instanceof AST_Exit && self.value) { + self.value.walk(new TreeWalker(function(node){ + if (node.start && node.start.comments_before) { + comments = comments.concat(node.start.comments_before); + node.start.comments_before = []; + } + if (node instanceof AST_Function || + node instanceof AST_Array || + node instanceof AST_Object) + { + return true; // don't go inside. + } + })); + } + + if (output.pos() == 0) { + if (comments.length > 0 && output.option("shebang") && comments[0].type == "comment5") { + output.print("#!" + comments.shift().value + "\n"); + output.indent(); + } + var preamble = output.option("preamble"); + if (preamble) { + output.print(preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g, "\n")); + } + } + + comments = comments.filter(output.comment_filter, self); + + // Keep single line comments after nlb, after nlb + if (!output.option("beautify") && comments.length > 0 && + /comment[134]/.test(comments[0].type) && + output.col() !== 0 && comments[0].nlb) + { + output.print("\n"); + } + + comments.forEach(function(c){ + if (/comment[134]/.test(c.type)) { + output.print("//" + c.value + "\n"); + output.indent(); + } + else if (c.type == "comment2") { + output.print("/*" + c.value + "*/"); + if (start.nlb) { + output.print("\n"); + output.indent(); + } else { + output.space(); + } + } + }); + } + }); + + /* -----[ PARENTHESES ]----- */ + + function PARENS(nodetype, func) { + if (Array.isArray(nodetype)) { + nodetype.forEach(function(nodetype){ + PARENS(nodetype, func); + }); + } else { + nodetype.DEFMETHOD("needs_parens", func); + } + }; + + PARENS(AST_Node, function(){ + return false; + }); + + // a function expression needs parens around it when it's provably + // the first token to appear in a statement. + PARENS(AST_Function, function(output){ + if (first_in_statement(output)) { + return true; + } + + if (output.option('webkit')) { + var p = output.parent(); + if (p instanceof AST_PropAccess && p.expression === this) { + return true; + } + } + + if (output.option('wrap_iife')) { + var p = output.parent(); + return p instanceof AST_Call && p.expression === this; + } + + return false; + }); + + // same goes for an object literal, because otherwise it would be + // interpreted as a block of code. + PARENS(AST_Object, function(output){ + return first_in_statement(output); + }); + + PARENS(AST_Unary, function(output){ + var p = output.parent(); + return p instanceof AST_PropAccess && p.expression === this + || p instanceof AST_Call && p.expression === this; + }); + + PARENS(AST_Sequence, function(output){ + var p = output.parent(); + return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4) + || p instanceof AST_Unary // !(foo, bar, baz) + || p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8 + || p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4 + || p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2 + || p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ] + || p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2 + || p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30) + * ==> 20 (side effect, set a := 10 and b := 20) */ + ; + }); + + PARENS(AST_Binary, function(output){ + var p = output.parent(); + // (foo && bar)() + if (p instanceof AST_Call && p.expression === this) + return true; + // typeof (foo && bar) + if (p instanceof AST_Unary) + return true; + // (foo && bar)["prop"], (foo && bar).prop + if (p instanceof AST_PropAccess && p.expression === this) + return true; + // this deals with precedence: 3 * (2 + 1) + if (p instanceof AST_Binary) { + var po = p.operator, pp = PRECEDENCE[po]; + var so = this.operator, sp = PRECEDENCE[so]; + if (pp > sp + || (pp == sp + && this === p.right)) { + return true; + } + } + }); + + PARENS(AST_PropAccess, function(output){ + var p = output.parent(); + if (p instanceof AST_New && p.expression === this) { + // i.e. new (foo.bar().baz) + // + // if there's one call into this subtree, then we need + // parens around it too, otherwise the call will be + // interpreted as passing the arguments to the upper New + // expression. + var parens = false; + this.walk(new TreeWalker(function(node) { + if (parens || node instanceof AST_Scope) return true; + if (node instanceof AST_Call) { + parens = true; + return true; + } + })); + return parens; + } + }); + + PARENS(AST_Call, function(output){ + var p = output.parent(), p1; + if (p instanceof AST_New && p.expression === this) + return true; + + // workaround for Safari bug. + // https://bugs.webkit.org/show_bug.cgi?id=123506 + return this.expression instanceof AST_Function + && p instanceof AST_PropAccess + && p.expression === this + && (p1 = output.parent(1)) instanceof AST_Assign + && p1.left === p; + }); + + PARENS(AST_New, function(output){ + var p = output.parent(); + if (!need_constructor_parens(this, output) + && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]() + || p instanceof AST_Call && p.expression === this)) // (new foo)(bar) + return true; + }); + + PARENS(AST_Number, function(output){ + var p = output.parent(); + if (p instanceof AST_PropAccess && p.expression === this) { + var value = this.getValue(); + if (value < 0 || /^0/.test(make_num(value))) { + return true; + } + } + }); + + PARENS([ AST_Assign, AST_Conditional ], function(output){ + var p = output.parent(); + // !(a = false) → true + if (p instanceof AST_Unary) + return true; + // 1 + (a = 2) + 3 → 6, side effect setting a = 2 + if (p instanceof AST_Binary && !(p instanceof AST_Assign)) + return true; + // (a = func)() —or— new (a = Object)() + if (p instanceof AST_Call && p.expression === this) + return true; + // (a = foo) ? bar : baz + if (p instanceof AST_Conditional && p.condition === this) + return true; + // (a = foo)["prop"] —or— (a = foo).prop + if (p instanceof AST_PropAccess && p.expression === this) + return true; + }); + + /* -----[ PRINTERS ]----- */ + + DEFPRINT(AST_Directive, function(self, output){ + output.print_string(self.value, self.quote); + output.semicolon(); + }); + DEFPRINT(AST_Debugger, function(self, output){ + output.print("debugger"); + output.semicolon(); + }); + + /* -----[ statements ]----- */ + + function display_body(body, is_toplevel, output, allow_directives) { + var last = body.length - 1; + in_directive = allow_directives; + body.forEach(function(stmt, i){ + if (in_directive === true && !(stmt instanceof AST_Directive || + stmt instanceof AST_EmptyStatement || + (stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String) + )) { + in_directive = false; + } + if (!(stmt instanceof AST_EmptyStatement)) { + output.indent(); + stmt.print(output); + if (!(i == last && is_toplevel)) { + output.newline(); + if (is_toplevel) output.newline(); + } + } + if (in_directive === true && + stmt instanceof AST_SimpleStatement && + stmt.body instanceof AST_String + ) { + in_directive = false; + } + }); + in_directive = false; + }; + + AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output){ + force_statement(this.body, output); + }); + + DEFPRINT(AST_Statement, function(self, output){ + self.body.print(output); + output.semicolon(); + }); + DEFPRINT(AST_Toplevel, function(self, output){ + display_body(self.body, true, output, true); + output.print(""); + }); + DEFPRINT(AST_LabeledStatement, function(self, output){ + self.label.print(output); + output.colon(); + self.body.print(output); + }); + DEFPRINT(AST_SimpleStatement, function(self, output){ + self.body.print(output); + output.semicolon(); + }); + function print_bracketed(body, output, allow_directives) { + if (body.length > 0) output.with_block(function(){ + display_body(body, false, output, allow_directives); + }); + else output.print("{}"); + }; + DEFPRINT(AST_BlockStatement, function(self, output){ + print_bracketed(self.body, output); + }); + DEFPRINT(AST_EmptyStatement, function(self, output){ + output.semicolon(); + }); + DEFPRINT(AST_Do, function(self, output){ + output.print("do"); + output.space(); + make_block(self.body, output); + output.space(); + output.print("while"); + output.space(); + output.with_parens(function(){ + self.condition.print(output); + }); + output.semicolon(); + }); + DEFPRINT(AST_While, function(self, output){ + output.print("while"); + output.space(); + output.with_parens(function(){ + self.condition.print(output); + }); + output.space(); + self._do_print_body(output); + }); + DEFPRINT(AST_For, function(self, output){ + output.print("for"); + output.space(); + output.with_parens(function(){ + if (self.init) { + if (self.init instanceof AST_Definitions) { + self.init.print(output); + } else { + parenthesize_for_noin(self.init, output, true); + } + output.print(";"); + output.space(); + } else { + output.print(";"); + } + if (self.condition) { + self.condition.print(output); + output.print(";"); + output.space(); + } else { + output.print(";"); + } + if (self.step) { + self.step.print(output); + } + }); + output.space(); + self._do_print_body(output); + }); + DEFPRINT(AST_ForIn, function(self, output){ + output.print("for"); + output.space(); + output.with_parens(function(){ + self.init.print(output); + output.space(); + output.print("in"); + output.space(); + self.object.print(output); + }); + output.space(); + self._do_print_body(output); + }); + DEFPRINT(AST_With, function(self, output){ + output.print("with"); + output.space(); + output.with_parens(function(){ + self.expression.print(output); + }); + output.space(); + self._do_print_body(output); + }); + + /* -----[ functions ]----- */ + AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){ + var self = this; + if (!nokeyword) { + output.print("function"); + } + if (self.name) { + output.space(); + self.name.print(output); + } + output.with_parens(function(){ + self.argnames.forEach(function(arg, i){ + if (i) output.comma(); + arg.print(output); + }); + }); + output.space(); + print_bracketed(self.body, output, true); + }); + DEFPRINT(AST_Lambda, function(self, output){ + self._do_print(output); + }); + + /* -----[ exits ]----- */ + AST_Exit.DEFMETHOD("_do_print", function(output, kind){ + output.print(kind); + if (this.value) { + output.space(); + this.value.print(output); + } + output.semicolon(); + }); + DEFPRINT(AST_Return, function(self, output){ + self._do_print(output, "return"); + }); + DEFPRINT(AST_Throw, function(self, output){ + self._do_print(output, "throw"); + }); + + /* -----[ loop control ]----- */ + AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){ + output.print(kind); + if (this.label) { + output.space(); + this.label.print(output); + } + output.semicolon(); + }); + DEFPRINT(AST_Break, function(self, output){ + self._do_print(output, "break"); + }); + DEFPRINT(AST_Continue, function(self, output){ + self._do_print(output, "continue"); + }); + + /* -----[ if ]----- */ + function make_then(self, output) { + var b = self.body; + if (output.option("bracketize") + || output.option("ie8") && b instanceof AST_Do) + return make_block(b, output); + // The squeezer replaces "block"-s that contain only a single + // statement with the statement itself; technically, the AST + // is correct, but this can create problems when we output an + // IF having an ELSE clause where the THEN clause ends in an + // IF *without* an ELSE block (then the outer ELSE would refer + // to the inner IF). This function checks for this case and + // adds the block brackets if needed. + if (!b) return output.force_semicolon(); + while (true) { + if (b instanceof AST_If) { + if (!b.alternative) { + make_block(self.body, output); + return; + } + b = b.alternative; + } + else if (b instanceof AST_StatementWithBody) { + b = b.body; + } + else break; + } + force_statement(self.body, output); + }; + DEFPRINT(AST_If, function(self, output){ + output.print("if"); + output.space(); + output.with_parens(function(){ + self.condition.print(output); + }); + output.space(); + if (self.alternative) { + make_then(self, output); + output.space(); + output.print("else"); + output.space(); + if (self.alternative instanceof AST_If) + self.alternative.print(output); + else + force_statement(self.alternative, output); + } else { + self._do_print_body(output); + } + }); + + /* -----[ switch ]----- */ + DEFPRINT(AST_Switch, function(self, output){ + output.print("switch"); + output.space(); + output.with_parens(function(){ + self.expression.print(output); + }); + output.space(); + var last = self.body.length - 1; + if (last < 0) output.print("{}"); + else output.with_block(function(){ + self.body.forEach(function(branch, i){ + output.indent(true); + branch.print(output); + if (i < last && branch.body.length > 0) + output.newline(); + }); + }); + }); + AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){ + output.newline(); + this.body.forEach(function(stmt){ + output.indent(); + stmt.print(output); + output.newline(); + }); + }); + DEFPRINT(AST_Default, function(self, output){ + output.print("default:"); + self._do_print_body(output); + }); + DEFPRINT(AST_Case, function(self, output){ + output.print("case"); + output.space(); + self.expression.print(output); + output.print(":"); + self._do_print_body(output); + }); + + /* -----[ exceptions ]----- */ + DEFPRINT(AST_Try, function(self, output){ + output.print("try"); + output.space(); + print_bracketed(self.body, output); + if (self.bcatch) { + output.space(); + self.bcatch.print(output); + } + if (self.bfinally) { + output.space(); + self.bfinally.print(output); + } + }); + DEFPRINT(AST_Catch, function(self, output){ + output.print("catch"); + output.space(); + output.with_parens(function(){ + self.argname.print(output); + }); + output.space(); + print_bracketed(self.body, output); + }); + DEFPRINT(AST_Finally, function(self, output){ + output.print("finally"); + output.space(); + print_bracketed(self.body, output); + }); + + /* -----[ var/const ]----- */ + AST_Definitions.DEFMETHOD("_do_print", function(output, kind){ + output.print(kind); + output.space(); + this.definitions.forEach(function(def, i){ + if (i) output.comma(); + def.print(output); + }); + var p = output.parent(); + var in_for = p instanceof AST_For || p instanceof AST_ForIn; + var avoid_semicolon = in_for && p.init === this; + if (!avoid_semicolon) + output.semicolon(); + }); + DEFPRINT(AST_Var, function(self, output){ + self._do_print(output, "var"); + }); + + function parenthesize_for_noin(node, output, noin) { + var parens = false; + // need to take some precautions here: + // https://github.com/mishoo/UglifyJS2/issues/60 + if (noin) node.walk(new TreeWalker(function(node) { + if (parens || node instanceof AST_Scope) return true; + if (node instanceof AST_Binary && node.operator == "in") { + parens = true; + return true; + } + })); + node.print(output, parens); + }; + + DEFPRINT(AST_VarDef, function(self, output){ + self.name.print(output); + if (self.value) { + output.space(); + output.print("="); + output.space(); + var p = output.parent(1); + var noin = p instanceof AST_For || p instanceof AST_ForIn; + parenthesize_for_noin(self.value, output, noin); + } + }); + + /* -----[ other expressions ]----- */ + DEFPRINT(AST_Call, function(self, output){ + self.expression.print(output); + if (self instanceof AST_New && !need_constructor_parens(self, output)) + return; + if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) { + output.add_mapping(self.start); + } + output.with_parens(function(){ + self.args.forEach(function(expr, i){ + if (i) output.comma(); + expr.print(output); + }); + }); + }); + DEFPRINT(AST_New, function(self, output){ + output.print("new"); + output.space(); + AST_Call.prototype._codegen(self, output); + }); + + AST_Sequence.DEFMETHOD("_do_print", function(output){ + this.expressions.forEach(function(node, index) { + if (index > 0) { + output.comma(); + if (output.should_break()) { + output.newline(); + output.indent(); + } + } + node.print(output); + }); + }); + DEFPRINT(AST_Sequence, function(self, output){ + self._do_print(output); + // var p = output.parent(); + // if (p instanceof AST_Statement) { + // output.with_indent(output.next_indent(), function(){ + // self._do_print(output); + // }); + // } else { + // self._do_print(output); + // } + }); + DEFPRINT(AST_Dot, function(self, output){ + var expr = self.expression; + expr.print(output); + var prop = self.property; + if (output.option("ie8") && RESERVED_WORDS(prop)) { + output.print("["); + output.add_mapping(self.end); + output.print_string(prop); + output.print("]"); + } else { + if (expr instanceof AST_Number && expr.getValue() >= 0) { + if (!/[xa-f.)]/i.test(output.last())) { + output.print("."); + } + } + output.print("."); + // the name after dot would be mapped about here. + output.add_mapping(self.end); + output.print_name(prop); + } + }); + DEFPRINT(AST_Sub, function(self, output){ + self.expression.print(output); + output.print("["); + self.property.print(output); + output.print("]"); + }); + DEFPRINT(AST_UnaryPrefix, function(self, output){ + var op = self.operator; + output.print(op); + if (/^[a-z]/i.test(op) + || (/[+-]$/.test(op) + && self.expression instanceof AST_UnaryPrefix + && /^[+-]/.test(self.expression.operator))) { + output.space(); + } + self.expression.print(output); + }); + DEFPRINT(AST_UnaryPostfix, function(self, output){ + self.expression.print(output); + output.print(self.operator); + }); + DEFPRINT(AST_Binary, function(self, output){ + var op = self.operator; + self.left.print(output); + if (op[0] == ">" /* ">>" ">>>" ">" ">=" */ + && self.left instanceof AST_UnaryPostfix + && self.left.operator == "--") { + // space is mandatory to avoid outputting --> + output.print(" "); + } else { + // the space is optional depending on "beautify" + output.space(); + } + output.print(op); + if ((op == "<" || op == "<<") + && self.right instanceof AST_UnaryPrefix + && self.right.operator == "!" + && self.right.expression instanceof AST_UnaryPrefix + && self.right.expression.operator == "--") { + // space is mandatory to avoid outputting ") && S.newline_before) { + forward(3); + skip_line_comment("comment4"); + continue; + } + } + var ch = peek(); + if (!ch) return token("eof"); + var code = ch.charCodeAt(0); + switch (code) { + case 34: case 39: return read_string(ch); + case 46: return handle_dot(); + case 47: { + var tok = handle_slash(); + if (tok === next_token) continue; + return tok; + } + } + if (is_digit(code)) return read_num(); + if (PUNC_CHARS(ch)) return token("punc", next()); + if (OPERATOR_CHARS(ch)) return read_operator(); + if (code == 92 || is_identifier_start(code)) return read_word(); + break; + } + parse_error("Unexpected character '" + ch + "'"); + }; + + next_token.context = function(nc) { + if (nc) S = nc; + return S; + }; + + next_token.add_directive = function(directive) { + S.directive_stack[S.directive_stack.length - 1].push(directive); + + if (S.directives[directive] === undefined) { + S.directives[directive] = 1; + } else { + S.directives[directive]++; + } + } + + next_token.push_directives_stack = function() { + S.directive_stack.push([]); + } + + next_token.pop_directives_stack = function() { + var directives = S.directive_stack[S.directive_stack.length - 1]; + + for (var i = 0; i < directives.length; i++) { + S.directives[directives[i]]--; + } + + S.directive_stack.pop(); + } + + next_token.has_directive = function(directive) { + return S.directives[directive] > 0; + } + + return next_token; + +}; + +/* -----[ Parser (constants) ]----- */ + +var UNARY_PREFIX = makePredicate([ + "typeof", + "void", + "delete", + "--", + "++", + "!", + "~", + "-", + "+" +]); + +var UNARY_POSTFIX = makePredicate([ "--", "++" ]); + +var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]); + +var PRECEDENCE = (function(a, ret){ + for (var i = 0; i < a.length; ++i) { + var b = a[i]; + for (var j = 0; j < b.length; ++j) { + ret[b[j]] = i + 1; + } + } + return ret; +})( + [ + ["||"], + ["&&"], + ["|"], + ["^"], + ["&"], + ["==", "===", "!=", "!=="], + ["<", ">", "<=", ">=", "in", "instanceof"], + [">>", "<<", ">>>"], + ["+", "-"], + ["*", "/", "%"] + ], + {} +); + +var ATOMIC_START_TOKEN = makePredicate([ "atom", "num", "string", "regexp", "name" ]); + +/* -----[ Parser ]----- */ + +function parse($TEXT, options) { + + options = defaults(options, { + bare_returns : false, + expression : false, + filename : null, + html5_comments : true, + shebang : true, + strict : false, + toplevel : null, + }, true); + + var S = { + input : (typeof $TEXT == "string" + ? tokenizer($TEXT, options.filename, + options.html5_comments, options.shebang) + : $TEXT), + token : null, + prev : null, + peeked : null, + in_function : 0, + in_directives : true, + in_loop : 0, + labels : [] + }; + + S.token = next(); + + function is(type, value) { + return is_token(S.token, type, value); + }; + + function peek() { return S.peeked || (S.peeked = S.input()); }; + + function next() { + S.prev = S.token; + if (S.peeked) { + S.token = S.peeked; + S.peeked = null; + } else { + S.token = S.input(); + } + S.in_directives = S.in_directives && ( + S.token.type == "string" || is("punc", ";") + ); + return S.token; + }; + + function prev() { + return S.prev; + }; + + function croak(msg, line, col, pos) { + var ctx = S.input.context(); + js_error(msg, + ctx.filename, + line != null ? line : ctx.tokline, + col != null ? col : ctx.tokcol, + pos != null ? pos : ctx.tokpos); + }; + + function token_error(token, msg) { + croak(msg, token.line, token.col); + }; + + function unexpected(token) { + if (token == null) + token = S.token; + token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); + }; + + function expect_token(type, val) { + if (is(type, val)) { + return next(); + } + token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); + }; + + function expect(punc) { return expect_token("punc", punc); }; + + function can_insert_semicolon() { + return !options.strict && ( + S.token.nlb || is("eof") || is("punc", "}") + ); + }; + + function semicolon(optional) { + if (is("punc", ";")) next(); + else if (!optional && !can_insert_semicolon()) unexpected(); + }; + + function parenthesised() { + expect("("); + var exp = expression(true); + expect(")"); + return exp; + }; + + function embed_tokens(parser) { + return function() { + var start = S.token; + var expr = parser(); + var end = prev(); + expr.start = start; + expr.end = end; + return expr; + }; + }; + + function handle_regexp() { + if (is("operator", "/") || is("operator", "/=")) { + S.peeked = null; + S.token = S.input(S.token.value.substr(1)); // force regexp + } + }; + + var statement = embed_tokens(function() { + handle_regexp(); + switch (S.token.type) { + case "string": + if (S.in_directives) { + var token = peek(); + if (S.token.raw.indexOf("\\") == -1 + && (token.nlb + || is_token(token, "eof") + || is_token(token, "punc", ";") + || is_token(token, "punc", "}"))) { + S.input.add_directive(S.token.value); + } else { + S.in_directives = false; + } + } + var dir = S.in_directives, stat = simple_statement(); + return dir ? new AST_Directive(stat.body) : stat; + case "num": + case "regexp": + case "operator": + case "atom": + return simple_statement(); + + case "name": + return is_token(peek(), "punc", ":") + ? labeled_statement() + : simple_statement(); + + case "punc": + switch (S.token.value) { + case "{": + return new AST_BlockStatement({ + start : S.token, + body : block_(), + end : prev() + }); + case "[": + case "(": + return simple_statement(); + case ";": + S.in_directives = false; + next(); + return new AST_EmptyStatement(); + default: + unexpected(); + } + + case "keyword": + switch (S.token.value) { + case "break": + next(); + return break_cont(AST_Break); + + case "continue": + next(); + return break_cont(AST_Continue); + + case "debugger": + next(); + semicolon(); + return new AST_Debugger(); + + case "do": + next(); + var body = in_loop(statement); + expect_token("keyword", "while"); + var condition = parenthesised(); + semicolon(true); + return new AST_Do({ + body : body, + condition : condition + }); + + case "while": + next(); + return new AST_While({ + condition : parenthesised(), + body : in_loop(statement) + }); + + case "for": + next(); + return for_(); + + case "function": + next(); + return function_(AST_Defun); + + case "if": + next(); + return if_(); + + case "return": + if (S.in_function == 0 && !options.bare_returns) + croak("'return' outside of function"); + next(); + var value = null; + if (is("punc", ";")) { + next(); + } else if (!can_insert_semicolon()) { + value = expression(true); + semicolon(); + } + return new AST_Return({ + value: value + }); + + case "switch": + next(); + return new AST_Switch({ + expression : parenthesised(), + body : in_loop(switch_body_) + }); + + case "throw": + next(); + if (S.token.nlb) + croak("Illegal newline after 'throw'"); + var value = expression(true); + semicolon(); + return new AST_Throw({ + value: value + }); + + case "try": + next(); + return try_(); + + case "var": + next(); + var node = var_(); + semicolon(); + return node; + + case "with": + if (S.input.has_directive("use strict")) { + croak("Strict mode may not include a with statement"); + } + next(); + return new AST_With({ + expression : parenthesised(), + body : statement() + }); + } + } + unexpected(); + }); + + function labeled_statement() { + var label = as_symbol(AST_Label); + if (find_if(function(l){ return l.name == label.name }, S.labels)) { + // ECMA-262, 12.12: An ECMAScript program is considered + // syntactically incorrect if it contains a + // LabelledStatement that is enclosed by a + // LabelledStatement with the same Identifier as label. + croak("Label " + label.name + " defined twice"); + } + expect(":"); + S.labels.push(label); + var stat = statement(); + S.labels.pop(); + if (!(stat instanceof AST_IterationStatement)) { + // check for `continue` that refers to this label. + // those should be reported as syntax errors. + // https://github.com/mishoo/UglifyJS2/issues/287 + label.references.forEach(function(ref){ + if (ref instanceof AST_Continue) { + ref = ref.label.start; + croak("Continue label `" + label.name + "` refers to non-IterationStatement.", + ref.line, ref.col, ref.pos); + } + }); + } + return new AST_LabeledStatement({ body: stat, label: label }); + }; + + function simple_statement(tmp) { + return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) }); + }; + + function break_cont(type) { + var label = null, ldef; + if (!can_insert_semicolon()) { + label = as_symbol(AST_LabelRef, true); + } + if (label != null) { + ldef = find_if(function(l){ return l.name == label.name }, S.labels); + if (!ldef) + croak("Undefined label " + label.name); + label.thedef = ldef; + } + else if (S.in_loop == 0) + croak(type.TYPE + " not inside a loop or switch"); + semicolon(); + var stat = new type({ label: label }); + if (ldef) ldef.references.push(stat); + return stat; + }; + + function for_() { + expect("("); + var init = null; + if (!is("punc", ";")) { + init = is("keyword", "var") + ? (next(), var_(true)) + : expression(true, true); + if (is("operator", "in")) { + if (init instanceof AST_Var) { + if (init.definitions.length > 1) + croak("Only one variable declaration allowed in for..in loop", init.start.line, init.start.col, init.start.pos); + } else if (!is_assignable(init)) { + croak("Invalid left-hand side in for..in loop", init.start.line, init.start.col, init.start.pos); + } + next(); + return for_in(init); + } + } + return regular_for(init); + }; + + function regular_for(init) { + expect(";"); + var test = is("punc", ";") ? null : expression(true); + expect(";"); + var step = is("punc", ")") ? null : expression(true); + expect(")"); + return new AST_For({ + init : init, + condition : test, + step : step, + body : in_loop(statement) + }); + }; + + function for_in(init) { + var lhs = init instanceof AST_Var ? init.definitions[0].name : null; + var obj = expression(true); + expect(")"); + return new AST_ForIn({ + init : init, + name : lhs, + object : obj, + body : in_loop(statement) + }); + }; + + var function_ = function(ctor) { + var in_statement = ctor === AST_Defun; + var name = is("name") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null; + if (in_statement && !name) + unexpected(); + if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration)) + unexpected(prev()); + expect("("); + var argnames = []; + for (var first = true; !is("punc", ")");) { + if (first) first = false; else expect(","); + argnames.push(as_symbol(AST_SymbolFunarg)); + } + next(); + var loop = S.in_loop; + var labels = S.labels; + ++S.in_function; + S.in_directives = true; + S.input.push_directives_stack(); + S.in_loop = 0; + S.labels = []; + var body = block_(); + if (S.input.has_directive("use strict")) { + if (name) strict_verify_symbol(name); + argnames.forEach(strict_verify_symbol); + } + S.input.pop_directives_stack(); + --S.in_function; + S.in_loop = loop; + S.labels = labels; + return new ctor({ + name: name, + argnames: argnames, + body: body + }); + }; + + function if_() { + var cond = parenthesised(), body = statement(), belse = null; + if (is("keyword", "else")) { + next(); + belse = statement(); + } + return new AST_If({ + condition : cond, + body : body, + alternative : belse + }); + }; + + function block_() { + expect("{"); + var a = []; + while (!is("punc", "}")) { + if (is("eof")) unexpected(); + a.push(statement()); + } + next(); + return a; + }; + + function switch_body_() { + expect("{"); + var a = [], cur = null, branch = null, tmp; + while (!is("punc", "}")) { + if (is("eof")) unexpected(); + if (is("keyword", "case")) { + if (branch) branch.end = prev(); + cur = []; + branch = new AST_Case({ + start : (tmp = S.token, next(), tmp), + expression : expression(true), + body : cur + }); + a.push(branch); + expect(":"); + } + else if (is("keyword", "default")) { + if (branch) branch.end = prev(); + cur = []; + branch = new AST_Default({ + start : (tmp = S.token, next(), expect(":"), tmp), + body : cur + }); + a.push(branch); + } + else { + if (!cur) unexpected(); + cur.push(statement()); + } + } + if (branch) branch.end = prev(); + next(); + return a; + }; + + function try_() { + var body = block_(), bcatch = null, bfinally = null; + if (is("keyword", "catch")) { + var start = S.token; + next(); + expect("("); + var name = as_symbol(AST_SymbolCatch); + expect(")"); + bcatch = new AST_Catch({ + start : start, + argname : name, + body : block_(), + end : prev() + }); + } + if (is("keyword", "finally")) { + var start = S.token; + next(); + bfinally = new AST_Finally({ + start : start, + body : block_(), + end : prev() + }); + } + if (!bcatch && !bfinally) + croak("Missing catch/finally blocks"); + return new AST_Try({ + body : body, + bcatch : bcatch, + bfinally : bfinally + }); + }; + + function vardefs(no_in) { + var a = []; + for (;;) { + a.push(new AST_VarDef({ + start : S.token, + name : as_symbol(AST_SymbolVar), + value : is("operator", "=") ? (next(), expression(false, no_in)) : null, + end : prev() + })); + if (!is("punc", ",")) + break; + next(); + } + return a; + }; + + var var_ = function(no_in) { + return new AST_Var({ + start : prev(), + definitions : vardefs(no_in), + end : prev() + }); + }; + + var new_ = function(allow_calls) { + var start = S.token; + expect_token("operator", "new"); + var newexp = expr_atom(false), args; + if (is("punc", "(")) { + next(); + args = expr_list(")"); + } else { + args = []; + } + return subscripts(new AST_New({ + start : start, + expression : newexp, + args : args, + end : prev() + }), allow_calls); + }; + + function as_atom_node() { + var tok = S.token, ret; + switch (tok.type) { + case "name": + ret = _make_symbol(AST_SymbolRef); + break; + case "num": + ret = new AST_Number({ start: tok, end: tok, value: tok.value }); + break; + case "string": + ret = new AST_String({ + start : tok, + end : tok, + value : tok.value, + quote : tok.quote + }); + break; + case "regexp": + ret = new AST_RegExp({ start: tok, end: tok, value: tok.value }); + break; + case "atom": + switch (tok.value) { + case "false": + ret = new AST_False({ start: tok, end: tok }); + break; + case "true": + ret = new AST_True({ start: tok, end: tok }); + break; + case "null": + ret = new AST_Null({ start: tok, end: tok }); + break; + } + break; + } + next(); + return ret; + }; + + var expr_atom = function(allow_calls) { + if (is("operator", "new")) { + return new_(allow_calls); + } + var start = S.token; + if (is("punc")) { + switch (start.value) { + case "(": + next(); + var ex = expression(true); + ex.start = start; + ex.end = S.token; + expect(")"); + return subscripts(ex, allow_calls); + case "[": + return subscripts(array_(), allow_calls); + case "{": + return subscripts(object_(), allow_calls); + } + unexpected(); + } + if (is("keyword", "function")) { + next(); + var func = function_(AST_Function); + func.start = start; + func.end = prev(); + return subscripts(func, allow_calls); + } + if (ATOMIC_START_TOKEN(S.token.type)) { + return subscripts(as_atom_node(), allow_calls); + } + unexpected(); + }; + + function expr_list(closing, allow_trailing_comma, allow_empty) { + var first = true, a = []; + while (!is("punc", closing)) { + if (first) first = false; else expect(","); + if (allow_trailing_comma && is("punc", closing)) break; + if (is("punc", ",") && allow_empty) { + a.push(new AST_Hole({ start: S.token, end: S.token })); + } else { + a.push(expression(false)); + } + } + next(); + return a; + }; + + var array_ = embed_tokens(function() { + expect("["); + return new AST_Array({ + elements: expr_list("]", !options.strict, true) + }); + }); + + var create_accessor = embed_tokens(function() { + return function_(AST_Accessor); + }); + + var object_ = embed_tokens(function() { + expect("{"); + var first = true, a = []; + while (!is("punc", "}")) { + if (first) first = false; else expect(","); + if (!options.strict && is("punc", "}")) + // allow trailing comma + break; + var start = S.token; + var type = start.type; + var name = as_property_name(); + if (type == "name" && !is("punc", ":")) { + var key = new AST_SymbolAccessor({ + start: S.token, + name: as_property_name(), + end: prev() + }); + if (name == "get") { + a.push(new AST_ObjectGetter({ + start : start, + key : key, + value : create_accessor(), + end : prev() + })); + continue; + } + if (name == "set") { + a.push(new AST_ObjectSetter({ + start : start, + key : key, + value : create_accessor(), + end : prev() + })); + continue; + } + } + expect(":"); + a.push(new AST_ObjectKeyVal({ + start : start, + quote : start.quote, + key : name, + value : expression(false), + end : prev() + })); + } + next(); + return new AST_Object({ properties: a }); + }); + + function as_property_name() { + var tmp = S.token; + switch (tmp.type) { + case "operator": + if (!KEYWORDS(tmp.value)) unexpected(); + case "num": + case "string": + case "name": + case "keyword": + case "atom": + next(); + return tmp.value; + default: + unexpected(); + } + }; + + function as_name() { + var tmp = S.token; + if (tmp.type != "name") unexpected(); + next(); + return tmp.value; + }; + + function _make_symbol(type) { + var name = S.token.value; + return new (name == "this" ? AST_This : type)({ + name : String(name), + start : S.token, + end : S.token + }); + }; + + function strict_verify_symbol(sym) { + if (sym.name == "arguments" || sym.name == "eval") + croak("Unexpected " + sym.name + " in strict mode", sym.start.line, sym.start.col, sym.start.pos); + } + + function as_symbol(type, noerror) { + if (!is("name")) { + if (!noerror) croak("Name expected"); + return null; + } + var sym = _make_symbol(type); + if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) { + strict_verify_symbol(sym); + } + next(); + return sym; + }; + + var subscripts = function(expr, allow_calls) { + var start = expr.start; + if (is("punc", ".")) { + next(); + return subscripts(new AST_Dot({ + start : start, + expression : expr, + property : as_name(), + end : prev() + }), allow_calls); + } + if (is("punc", "[")) { + next(); + var prop = expression(true); + expect("]"); + return subscripts(new AST_Sub({ + start : start, + expression : expr, + property : prop, + end : prev() + }), allow_calls); + } + if (allow_calls && is("punc", "(")) { + next(); + return subscripts(new AST_Call({ + start : start, + expression : expr, + args : expr_list(")"), + end : prev() + }), true); + } + return expr; + }; + + var maybe_unary = function(allow_calls) { + var start = S.token; + if (is("operator") && UNARY_PREFIX(start.value)) { + next(); + handle_regexp(); + var ex = make_unary(AST_UnaryPrefix, start, maybe_unary(allow_calls)); + ex.start = start; + ex.end = prev(); + return ex; + } + var val = expr_atom(allow_calls); + while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) { + val = make_unary(AST_UnaryPostfix, S.token, val); + val.start = start; + val.end = S.token; + next(); + } + return val; + }; + + function make_unary(ctor, token, expr) { + var op = token.value; + switch (op) { + case "++": + case "--": + if (!is_assignable(expr)) + croak("Invalid use of " + op + " operator", token.line, token.col, token.pos); + break; + case "delete": + if (expr instanceof AST_SymbolRef && S.input.has_directive("use strict")) + croak("Calling delete on expression not allowed in strict mode", expr.start.line, expr.start.col, expr.start.pos); + break; + } + return new ctor({ operator: op, expression: expr }); + }; + + var expr_op = function(left, min_prec, no_in) { + var op = is("operator") ? S.token.value : null; + if (op == "in" && no_in) op = null; + var prec = op != null ? PRECEDENCE[op] : null; + if (prec != null && prec > min_prec) { + next(); + var right = expr_op(maybe_unary(true), prec, no_in); + return expr_op(new AST_Binary({ + start : left.start, + left : left, + operator : op, + right : right, + end : right.end + }), min_prec, no_in); + } + return left; + }; + + function expr_ops(no_in) { + return expr_op(maybe_unary(true), 0, no_in); + }; + + var maybe_conditional = function(no_in) { + var start = S.token; + var expr = expr_ops(no_in); + if (is("operator", "?")) { + next(); + var yes = expression(false); + expect(":"); + return new AST_Conditional({ + start : start, + condition : expr, + consequent : yes, + alternative : expression(false, no_in), + end : prev() + }); + } + return expr; + }; + + function is_assignable(expr) { + return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef; + }; + + var maybe_assign = function(no_in) { + var start = S.token; + var left = maybe_conditional(no_in), val = S.token.value; + if (is("operator") && ASSIGNMENT(val)) { + if (is_assignable(left)) { + next(); + return new AST_Assign({ + start : start, + left : left, + operator : val, + right : maybe_assign(no_in), + end : prev() + }); + } + croak("Invalid assignment"); + } + return left; + }; + + var expression = function(commas, no_in) { + var start = S.token; + var exprs = []; + while (true) { + exprs.push(maybe_assign(no_in)); + if (!commas || !is("punc", ",")) break; + next(); + commas = true; + } + return exprs.length == 1 ? exprs[0] : new AST_Sequence({ + start : start, + expressions : exprs, + end : peek() + }); + }; + + function in_loop(cont) { + ++S.in_loop; + var ret = cont(); + --S.in_loop; + return ret; + }; + + if (options.expression) { + return expression(true); + } + + return (function(){ + var start = S.token; + var body = []; + S.input.push_directives_stack(); + while (!is("eof")) + body.push(statement()); + S.input.pop_directives_stack(); + var end = prev(); + var toplevel = options.toplevel; + if (toplevel) { + toplevel.body = toplevel.body.concat(body); + toplevel.end = end; + } else { + toplevel = new AST_Toplevel({ start: start, body: body, end: end }); + } + return toplevel; + })(); + +}; diff --git a/node_modules/uglify-js/lib/propmangle.js b/node_modules/uglify-js/lib/propmangle.js new file mode 100644 index 00000000..c2f27c42 --- /dev/null +++ b/node_modules/uglify-js/lib/propmangle.js @@ -0,0 +1,241 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +function find_builtins(reserved) { + // NaN will be included due to Number.NaN + [ + "null", + "true", + "false", + "Infinity", + "-Infinity", + "undefined", + ].forEach(add); + [ Object, Array, Function, Number, + String, Boolean, Error, Math, + Date, RegExp + ].forEach(function(ctor){ + Object.getOwnPropertyNames(ctor).map(add); + if (ctor.prototype) { + Object.getOwnPropertyNames(ctor.prototype).map(add); + } + }); + function add(name) { + push_uniq(reserved, name); + } +} + +function reserve_quoted_keys(ast, reserved) { + function add(name) { + push_uniq(reserved, name); + } + + ast.walk(new TreeWalker(function(node) { + if (node instanceof AST_ObjectKeyVal && node.quote) { + add(node.key); + } else if (node instanceof AST_Sub) { + addStrings(node.property, add); + } + })); +} + +function addStrings(node, add) { + node.walk(new TreeWalker(function(node) { + if (node instanceof AST_Sequence) { + addStrings(node.tail_node(), add); + } else if (node instanceof AST_String) { + add(node.value); + } else if (node instanceof AST_Conditional) { + addStrings(node.consequent, add); + addStrings(node.alternative, add); + } + return true; + })); +} + +function mangle_properties(ast, options) { + options = defaults(options, { + builtins: false, + cache: null, + debug: false, + keep_quoted: false, + only_cache: false, + regex: null, + reserved: null, + }, true); + + var reserved = options.reserved; + if (!Array.isArray(reserved)) reserved = []; + if (!options.builtins) find_builtins(reserved); + + var cache = options.cache; + if (cache == null) { + cache = { + cname: -1, + props: new Dictionary() + }; + } + + var regex = options.regex; + + // note debug is either false (disabled), or a string of the debug suffix to use (enabled). + // note debug may be enabled as an empty string, which is falsey. Also treat passing 'true' + // the same as passing an empty string. + var debug = options.debug !== false; + var debug_name_suffix; + if (debug) { + debug_name_suffix = (options.debug === true ? "" : options.debug); + } + + var names_to_mangle = []; + var unmangleable = []; + + // step 1: find candidates to mangle + ast.walk(new TreeWalker(function(node){ + if (node instanceof AST_ObjectKeyVal) { + add(node.key); + } + else if (node instanceof AST_ObjectProperty) { + // setter or getter, since KeyVal is handled above + add(node.key.name); + } + else if (node instanceof AST_Dot) { + add(node.property); + } + else if (node instanceof AST_Sub) { + addStrings(node.property, add); + } + })); + + // step 2: transform the tree, renaming properties + return ast.transform(new TreeTransformer(function(node){ + if (node instanceof AST_ObjectKeyVal) { + node.key = mangle(node.key); + } + else if (node instanceof AST_ObjectProperty) { + // setter or getter + node.key.name = mangle(node.key.name); + } + else if (node instanceof AST_Dot) { + node.property = mangle(node.property); + } + else if (!options.keep_quoted && node instanceof AST_Sub) { + node.property = mangleStrings(node.property); + } + })); + + // only function declarations after this line + + function can_mangle(name) { + if (unmangleable.indexOf(name) >= 0) return false; + if (reserved.indexOf(name) >= 0) return false; + if (options.only_cache) { + return cache.props.has(name); + } + if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false; + return true; + } + + function should_mangle(name) { + if (regex && !regex.test(name)) return false; + if (reserved.indexOf(name) >= 0) return false; + return cache.props.has(name) + || names_to_mangle.indexOf(name) >= 0; + } + + function add(name) { + if (can_mangle(name)) + push_uniq(names_to_mangle, name); + + if (!should_mangle(name)) { + push_uniq(unmangleable, name); + } + } + + function mangle(name) { + if (!should_mangle(name)) { + return name; + } + + var mangled = cache.props.get(name); + if (!mangled) { + if (debug) { + // debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_. + var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_"; + + if (can_mangle(debug_mangled)) { + mangled = debug_mangled; + } + } + + // either debug mode is off, or it is on and we could not use the mangled name + if (!mangled) { + do { + mangled = base54(++cache.cname); + } while (!can_mangle(mangled)); + } + + cache.props.set(name, mangled); + } + return mangled; + } + + function mangleStrings(node) { + return node.transform(new TreeTransformer(function(node){ + if (node instanceof AST_Sequence) { + var last = node.expressions.length - 1; + node.expressions[last] = mangleStrings(node.expressions[last]); + } + else if (node instanceof AST_String) { + node.value = mangle(node.value); + } + else if (node instanceof AST_Conditional) { + node.consequent = mangleStrings(node.consequent); + node.alternative = mangleStrings(node.alternative); + } + return node; + })); + } +} diff --git a/node_modules/uglify-js/lib/scope.js b/node_modules/uglify-js/lib/scope.js new file mode 100644 index 00000000..bbfa037c --- /dev/null +++ b/node_modules/uglify-js/lib/scope.js @@ -0,0 +1,589 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +function SymbolDef(scope, orig) { + this.name = orig.name; + this.orig = [ orig ]; + this.eliminated = 0; + this.scope = scope; + this.references = []; + this.replaced = 0; + this.global = false; + this.mangled_name = null; + this.undeclared = false; + this.id = SymbolDef.next_id++; +}; + +SymbolDef.next_id = 1; + +SymbolDef.prototype = { + unmangleable: function(options) { + if (!options) options = {}; + + return (this.global && !options.toplevel) + || this.undeclared + || (!options.eval && (this.scope.uses_eval || this.scope.uses_with)) + || (options.keep_fnames + && (this.orig[0] instanceof AST_SymbolLambda + || this.orig[0] instanceof AST_SymbolDefun)); + }, + mangle: function(options) { + var cache = options.cache && options.cache.props; + if (this.global && cache && cache.has(this.name)) { + this.mangled_name = cache.get(this.name); + } + else if (!this.mangled_name && !this.unmangleable(options)) { + var s = this.scope; + var sym = this.orig[0]; + if (options.ie8 && sym instanceof AST_SymbolLambda) + s = s.parent_scope; + var def; + if (def = this.redefined()) { + this.mangled_name = def.mangled_name || def.name; + } else + this.mangled_name = s.next_mangled(options, this); + if (this.global && cache) { + cache.set(this.name, this.mangled_name); + } + } + }, + redefined: function() { + return this.defun && this.defun.variables.get(this.name); + } +}; + +AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ + options = defaults(options, { + cache: null, + ie8: false, + }); + + // pass 1: setup scope chaining and handle definitions + var self = this; + var scope = self.parent_scope = null; + var labels = new Dictionary(); + var defun = null; + var tw = new TreeWalker(function(node, descend){ + if (node instanceof AST_Catch) { + var save_scope = scope; + scope = new AST_Scope(node); + scope.init_scope_vars(save_scope); + descend(); + scope = save_scope; + return true; + } + if (node instanceof AST_Scope) { + node.init_scope_vars(scope); + var save_scope = scope; + var save_defun = defun; + var save_labels = labels; + defun = scope = node; + labels = new Dictionary(); + descend(); + scope = save_scope; + defun = save_defun; + labels = save_labels; + return true; // don't descend again in TreeWalker + } + if (node instanceof AST_LabeledStatement) { + var l = node.label; + if (labels.has(l.name)) { + throw new Error(string_template("Label {name} defined twice", l)); + } + labels.set(l.name, l); + descend(); + labels.del(l.name); + return true; // no descend again + } + if (node instanceof AST_With) { + for (var s = scope; s; s = s.parent_scope) + s.uses_with = true; + return; + } + if (node instanceof AST_Symbol) { + node.scope = scope; + } + if (node instanceof AST_Label) { + node.thedef = node; + node.references = []; + } + if (node instanceof AST_SymbolLambda) { + defun.def_function(node); + } + else if (node instanceof AST_SymbolDefun) { + // Careful here, the scope where this should be defined is + // the parent scope. The reason is that we enter a new + // scope when we encounter the AST_Defun node (which is + // instanceof AST_Scope) but we get to the symbol a bit + // later. + (node.scope = defun.parent_scope).def_function(node); + } + else if (node instanceof AST_SymbolVar) { + defun.def_variable(node); + if (defun !== scope) { + node.mark_enclosed(options); + var def = scope.find_variable(node); + if (node.thedef !== def) { + node.thedef = def; + node.reference(options); + } + } + } + else if (node instanceof AST_SymbolCatch) { + scope.def_variable(node).defun = defun; + } + else if (node instanceof AST_LabelRef) { + var sym = labels.get(node.name); + if (!sym) throw new Error(string_template("Undefined label {name} [{line},{col}]", { + name: node.name, + line: node.start.line, + col: node.start.col + })); + node.thedef = sym; + } + }); + self.walk(tw); + + // pass 2: find back references and eval + self.globals = new Dictionary(); + var tw = new TreeWalker(function(node, descend){ + if (node instanceof AST_LoopControl && node.label) { + node.label.thedef.references.push(node); + return true; + } + if (node instanceof AST_SymbolRef) { + var name = node.name; + if (name == "eval" && tw.parent() instanceof AST_Call) { + for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) { + s.uses_eval = true; + } + } + var sym = node.scope.find_variable(name); + if (!sym) { + sym = self.def_global(node); + } else if (sym.scope instanceof AST_Lambda && name == "arguments") { + sym.scope.uses_arguments = true; + } + node.thedef = sym; + node.reference(options); + return true; + } + // ensure mangling works if catch reuses a scope variable + var def; + if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) { + var s = node.scope; + while (s) { + push_uniq(s.enclosed, def); + if (s === def.scope) break; + s = s.parent_scope; + } + } + }); + self.walk(tw); + + // pass 3: fix up any scoping issue with IE8 + if (options.ie8) { + self.walk(new TreeWalker(function(node, descend) { + if (node instanceof AST_SymbolCatch) { + var name = node.name; + var refs = node.thedef.references; + var scope = node.thedef.defun; + var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node); + refs.forEach(function(ref) { + ref.thedef = def; + ref.reference(options); + }); + node.thedef = def; + node.reference(options); + return true; + } + })); + } + + if (options.cache) { + this.cname = options.cache.cname; + } +}); + +AST_Toplevel.DEFMETHOD("def_global", function(node){ + var globals = this.globals, name = node.name; + if (globals.has(name)) { + return globals.get(name); + } else { + var g = new SymbolDef(this, node); + g.undeclared = true; + g.global = true; + globals.set(name, g); + return g; + } +}); + +AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){ + this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions) + this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope) + this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement + this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval` + this.parent_scope = parent_scope; // the parent scope + this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes + this.cname = -1; // the current index for mangling functions/variables +}); + +AST_Lambda.DEFMETHOD("init_scope_vars", function(){ + AST_Scope.prototype.init_scope_vars.apply(this, arguments); + this.uses_arguments = false; + this.def_variable(new AST_SymbolFunarg({ + name: "arguments", + start: this.start, + end: this.end + })); +}); + +AST_Symbol.DEFMETHOD("mark_enclosed", function(options) { + var def = this.definition(); + var s = this.scope; + while (s) { + push_uniq(s.enclosed, def); + if (options.keep_fnames) { + s.functions.each(function(d) { + push_uniq(def.scope.enclosed, d); + }); + } + if (s === def.scope) break; + s = s.parent_scope; + } +}); + +AST_Symbol.DEFMETHOD("reference", function(options) { + this.definition().references.push(this); + this.mark_enclosed(options); +}); + +AST_Scope.DEFMETHOD("find_variable", function(name){ + if (name instanceof AST_Symbol) name = name.name; + return this.variables.get(name) + || (this.parent_scope && this.parent_scope.find_variable(name)); +}); + +AST_Scope.DEFMETHOD("def_function", function(symbol){ + this.functions.set(symbol.name, this.def_variable(symbol)); +}); + +AST_Scope.DEFMETHOD("def_variable", function(symbol){ + var def; + if (!this.variables.has(symbol.name)) { + def = new SymbolDef(this, symbol); + this.variables.set(symbol.name, def); + def.global = !this.parent_scope; + } else { + def = this.variables.get(symbol.name); + def.orig.push(symbol); + } + return symbol.thedef = def; +}); + +AST_Scope.DEFMETHOD("next_mangled", function(options){ + var ext = this.enclosed; + out: while (true) { + var m = base54(++this.cname); + if (!is_identifier(m)) continue; // skip over "do" + + // https://github.com/mishoo/UglifyJS2/issues/242 -- do not + // shadow a name reserved from mangling. + if (member(m, options.reserved)) continue; + + // we must ensure that the mangled name does not shadow a name + // from some parent scope that is referenced in this or in + // inner scopes. + for (var i = ext.length; --i >= 0;) { + var sym = ext[i]; + var name = sym.mangled_name || (sym.unmangleable(options) && sym.name); + if (m == name) continue out; + } + return m; + } +}); + +AST_Function.DEFMETHOD("next_mangled", function(options, def){ + // #179, #326 + // in Safari strict mode, something like (function x(x){...}) is a syntax error; + // a function expression's argument cannot shadow the function expression's name + + var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition(); + + // the function's mangled_name is null when keep_fnames is true + var tricky_name = tricky_def ? tricky_def.mangled_name || tricky_def.name : null; + + while (true) { + var name = AST_Lambda.prototype.next_mangled.call(this, options, def); + if (!tricky_name || tricky_name != name) + return name; + } +}); + +AST_Symbol.DEFMETHOD("unmangleable", function(options){ + var def = this.definition(); + return !def || def.unmangleable(options); +}); + +// labels are always mangleable +AST_Label.DEFMETHOD("unmangleable", return_false); + +AST_Symbol.DEFMETHOD("unreferenced", function(){ + return this.definition().references.length == 0 + && !(this.scope.uses_eval || this.scope.uses_with); +}); + +AST_Symbol.DEFMETHOD("definition", function(){ + return this.thedef; +}); + +AST_Symbol.DEFMETHOD("global", function(){ + return this.definition().global; +}); + +AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) { + options = defaults(options, { + eval : false, + ie8 : false, + keep_fnames : false, + reserved : [], + toplevel : false, + }); + if (!Array.isArray(options.reserved)) options.reserved = []; + // Never mangle arguments + push_uniq(options.reserved, "arguments"); + return options; +}); + +AST_Toplevel.DEFMETHOD("mangle_names", function(options){ + options = this._default_mangler_options(options); + + // We only need to mangle declaration nodes. Special logic wired + // into the code generator will display the mangled name if it's + // present (and for AST_SymbolRef-s it'll use the mangled name of + // the AST_SymbolDeclaration that it points to). + var lname = -1; + var to_mangle = []; + + if (options.cache) { + this.globals.each(collect); + } + + var tw = new TreeWalker(function(node, descend){ + if (node instanceof AST_LabeledStatement) { + // lname is incremented when we get to the AST_Label + var save_nesting = lname; + descend(); + lname = save_nesting; + return true; // don't descend again in TreeWalker + } + if (node instanceof AST_Scope) { + node.variables.each(collect); + return; + } + if (node instanceof AST_Label) { + var name; + do name = base54(++lname); while (!is_identifier(name)); + node.mangled_name = name; + return true; + } + if (!options.ie8 && node instanceof AST_SymbolCatch) { + to_mangle.push(node.definition()); + return; + } + }); + this.walk(tw); + to_mangle.forEach(function(def){ def.mangle(options) }); + + if (options.cache) { + options.cache.cname = this.cname; + } + + function collect(symbol) { + if (!member(symbol.name, options.reserved)) { + to_mangle.push(symbol); + } + } +}); + +AST_Toplevel.DEFMETHOD("find_unique_prefix", function(options) { + var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"; + var cache = options.cache && options.cache.props; + var prefixes = Object.create(null); + options.reserved.forEach(add_prefix); + this.globals.each(add_def); + this.walk(new TreeWalker(function(node) { + if (node instanceof AST_Scope) node.variables.each(add_def); + if (node instanceof AST_SymbolCatch) add_def(node.definition()); + })); + var prefix, i = 0; + do { + prefix = create_name(i++); + } while (prefixes[prefix]); + return prefix; + + function add_prefix(name) { + if (/[0-9]$/.test(name)) { + prefixes[name.replace(/[0-9]+$/, "")] = true; + } + } + + function add_def(def) { + var name = def.name; + if (def.global && cache && cache.has(name)) name = cache.get(name); + else if (!def.unmangleable(options)) return; + add_prefix(name); + } + + function create_name(num) { + var name = ""; + do { + name += letters[num % letters.length]; + num = Math.floor(num / letters.length); + } while (num); + return name; + } +}); + +AST_Toplevel.DEFMETHOD("expand_names", function(options) { + options = this._default_mangler_options(options); + var prefix = this.find_unique_prefix(options); + this.globals.each(rename); + this.walk(new TreeWalker(function(node) { + if (node instanceof AST_Scope) node.variables.each(rename); + if (node instanceof AST_SymbolCatch) rename(node.definition()); + })); + + function rename(def) { + if (def.global || def.unmangleable(options)) return; + if (member(def.name, options.reserved)) return; + var d = def.redefined(); + def.name = d ? d.name : prefix + def.id; + def.orig.forEach(function(sym) { + sym.name = def.name; + }); + def.references.forEach(function(sym) { + sym.name = def.name; + }); + } +}); + +AST_Node.DEFMETHOD("tail_node", return_this); +AST_Sequence.DEFMETHOD("tail_node", function() { + return this.expressions[this.expressions.length - 1]; +}); + +AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){ + options = this._default_mangler_options(options); + try { + AST_Node.prototype.print = function(stream, force_parens) { + this._print(stream, force_parens); + if (this instanceof AST_Symbol && !this.unmangleable(options)) { + base54.consider(this.name, -1); + } else if (options.properties) { + if (this instanceof AST_Dot) { + base54.consider(this.property, -1); + } else if (this instanceof AST_Sub) { + skip_string(this.property); + } + } + }; + base54.consider(this.print_to_string(), 1); + } finally { + AST_Node.prototype.print = AST_Node.prototype._print; + } + base54.sort(); + + function skip_string(node) { + if (node instanceof AST_String) { + base54.consider(node.value, -1); + } else if (node instanceof AST_Conditional) { + skip_string(node.consequent); + skip_string(node.alternative); + } else if (node instanceof AST_Sequence) { + skip_string(node.tail_node()); + } + } +}); + +var base54 = (function() { + var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split(""); + var digits = "0123456789".split(""); + var chars, frequency; + function reset() { + frequency = Object.create(null); + leading.forEach(function(ch) { + frequency[ch] = 0; + }); + digits.forEach(function(ch) { + frequency[ch] = 0; + }); + } + base54.consider = function(str, delta) { + for (var i = str.length; --i >= 0;) { + frequency[str[i]] += delta; + } + }; + function compare(a, b) { + return frequency[b] - frequency[a]; + } + base54.sort = function() { + chars = mergeSort(leading, compare).concat(mergeSort(digits, compare)); + }; + base54.reset = reset; + reset(); + function base54(num) { + var ret = "", base = 54; + num++; + do { + num--; + ret += chars[num % base]; + num = Math.floor(num / base); + base = 64; + } while (num > 0); + return ret; + }; + return base54; +})(); diff --git a/node_modules/uglify-js/lib/sourcemap.js b/node_modules/uglify-js/lib/sourcemap.js new file mode 100644 index 00000000..0be16bfc --- /dev/null +++ b/node_modules/uglify-js/lib/sourcemap.js @@ -0,0 +1,97 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +// a small wrapper around fitzgen's source-map library +function SourceMap(options) { + options = defaults(options, { + file : null, + root : null, + orig : null, + + orig_line_diff : 0, + dest_line_diff : 0, + }); + var generator = new MOZ_SourceMap.SourceMapGenerator({ + file : options.file, + sourceRoot : options.root + }); + var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig); + + if (orig_map && Array.isArray(options.orig.sources)) { + orig_map._sources.toArray().forEach(function(source) { + var sourceContent = orig_map.sourceContentFor(source, true); + if (sourceContent) { + generator.setSourceContent(source, sourceContent); + } + }); + } + + function add(source, gen_line, gen_col, orig_line, orig_col, name) { + if (orig_map) { + var info = orig_map.originalPositionFor({ + line: orig_line, + column: orig_col + }); + if (info.source === null) { + return; + } + source = info.source; + orig_line = info.line; + orig_col = info.column; + name = info.name || name; + } + generator.addMapping({ + generated : { line: gen_line + options.dest_line_diff, column: gen_col }, + original : { line: orig_line + options.orig_line_diff, column: orig_col }, + source : source, + name : name + }); + }; + return { + add : add, + get : function() { return generator }, + toString : function() { return JSON.stringify(generator.toJSON()); } + }; +}; diff --git a/node_modules/uglify-js/lib/transform.js b/node_modules/uglify-js/lib/transform.js new file mode 100644 index 00000000..8008e571 --- /dev/null +++ b/node_modules/uglify-js/lib/transform.js @@ -0,0 +1,217 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +// Tree transformer helpers. + +function TreeTransformer(before, after) { + TreeWalker.call(this); + this.before = before; + this.after = after; +} +TreeTransformer.prototype = new TreeWalker; + +(function(undefined){ + + function _(node, descend) { + node.DEFMETHOD("transform", function(tw, in_list){ + var x, y; + tw.push(this); + if (tw.before) x = tw.before(this, descend, in_list); + if (x === undefined) { + if (!tw.after) { + x = this; + descend(x, tw); + } else { + tw.stack[tw.stack.length - 1] = x = this; + descend(x, tw); + y = tw.after(x, in_list); + if (y !== undefined) x = y; + } + } + tw.pop(); + return x; + }); + }; + + function do_list(list, tw) { + return MAP(list, function(node){ + return node.transform(tw, true); + }); + }; + + _(AST_Node, noop); + + _(AST_LabeledStatement, function(self, tw){ + self.label = self.label.transform(tw); + self.body = self.body.transform(tw); + }); + + _(AST_SimpleStatement, function(self, tw){ + self.body = self.body.transform(tw); + }); + + _(AST_Block, function(self, tw){ + self.body = do_list(self.body, tw); + }); + + _(AST_DWLoop, function(self, tw){ + self.condition = self.condition.transform(tw); + self.body = self.body.transform(tw); + }); + + _(AST_For, function(self, tw){ + if (self.init) self.init = self.init.transform(tw); + if (self.condition) self.condition = self.condition.transform(tw); + if (self.step) self.step = self.step.transform(tw); + self.body = self.body.transform(tw); + }); + + _(AST_ForIn, function(self, tw){ + self.init = self.init.transform(tw); + self.object = self.object.transform(tw); + self.body = self.body.transform(tw); + }); + + _(AST_With, function(self, tw){ + self.expression = self.expression.transform(tw); + self.body = self.body.transform(tw); + }); + + _(AST_Exit, function(self, tw){ + if (self.value) self.value = self.value.transform(tw); + }); + + _(AST_LoopControl, function(self, tw){ + if (self.label) self.label = self.label.transform(tw); + }); + + _(AST_If, function(self, tw){ + self.condition = self.condition.transform(tw); + self.body = self.body.transform(tw); + if (self.alternative) self.alternative = self.alternative.transform(tw); + }); + + _(AST_Switch, function(self, tw){ + self.expression = self.expression.transform(tw); + self.body = do_list(self.body, tw); + }); + + _(AST_Case, function(self, tw){ + self.expression = self.expression.transform(tw); + self.body = do_list(self.body, tw); + }); + + _(AST_Try, function(self, tw){ + self.body = do_list(self.body, tw); + if (self.bcatch) self.bcatch = self.bcatch.transform(tw); + if (self.bfinally) self.bfinally = self.bfinally.transform(tw); + }); + + _(AST_Catch, function(self, tw){ + self.argname = self.argname.transform(tw); + self.body = do_list(self.body, tw); + }); + + _(AST_Definitions, function(self, tw){ + self.definitions = do_list(self.definitions, tw); + }); + + _(AST_VarDef, function(self, tw){ + self.name = self.name.transform(tw); + if (self.value) self.value = self.value.transform(tw); + }); + + _(AST_Lambda, function(self, tw){ + if (self.name) self.name = self.name.transform(tw); + self.argnames = do_list(self.argnames, tw); + self.body = do_list(self.body, tw); + }); + + _(AST_Call, function(self, tw){ + self.expression = self.expression.transform(tw); + self.args = do_list(self.args, tw); + }); + + _(AST_Sequence, function(self, tw){ + self.expressions = do_list(self.expressions, tw); + }); + + _(AST_Dot, function(self, tw){ + self.expression = self.expression.transform(tw); + }); + + _(AST_Sub, function(self, tw){ + self.expression = self.expression.transform(tw); + self.property = self.property.transform(tw); + }); + + _(AST_Unary, function(self, tw){ + self.expression = self.expression.transform(tw); + }); + + _(AST_Binary, function(self, tw){ + self.left = self.left.transform(tw); + self.right = self.right.transform(tw); + }); + + _(AST_Conditional, function(self, tw){ + self.condition = self.condition.transform(tw); + self.consequent = self.consequent.transform(tw); + self.alternative = self.alternative.transform(tw); + }); + + _(AST_Array, function(self, tw){ + self.elements = do_list(self.elements, tw); + }); + + _(AST_Object, function(self, tw){ + self.properties = do_list(self.properties, tw); + }); + + _(AST_ObjectProperty, function(self, tw){ + self.value = self.value.transform(tw); + }); + +})(); diff --git a/node_modules/uglify-js/lib/utils.js b/node_modules/uglify-js/lib/utils.js new file mode 100644 index 00000000..76306919 --- /dev/null +++ b/node_modules/uglify-js/lib/utils.js @@ -0,0 +1,355 @@ +/*********************************************************************** + + A JavaScript tokenizer / parser / beautifier / compressor. + https://github.com/mishoo/UglifyJS2 + + -------------------------------- (C) --------------------------------- + + Author: Mihai Bazon + + http://mihai.bazon.net/blog + + Distributed under the BSD license: + + Copyright 2012 (c) Mihai Bazon + + 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. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. + + ***********************************************************************/ + +"use strict"; + +function slice(a, start) { + return Array.prototype.slice.call(a, start || 0); +}; + +function characters(str) { + return str.split(""); +}; + +function member(name, array) { + return array.indexOf(name) >= 0; +}; + +function find_if(func, array) { + for (var i = 0, n = array.length; i < n; ++i) { + if (func(array[i])) + return array[i]; + } +}; + +function repeat_string(str, i) { + if (i <= 0) return ""; + if (i == 1) return str; + var d = repeat_string(str, i >> 1); + d += d; + if (i & 1) d += str; + return d; +}; + +function configure_error_stack(fn) { + Object.defineProperty(fn.prototype, "stack", { + get: function() { + var err = new Error(this.message); + err.name = this.name; + try { + throw err; + } catch(e) { + return e.stack; + } + } + }); +} + +function DefaultsError(msg, defs) { + this.message = msg; + this.defs = defs; +}; +DefaultsError.prototype = Object.create(Error.prototype); +DefaultsError.prototype.constructor = DefaultsError; +DefaultsError.prototype.name = "DefaultsError"; +configure_error_stack(DefaultsError); + +DefaultsError.croak = function(msg, defs) { + throw new DefaultsError(msg, defs); +}; + +function defaults(args, defs, croak) { + if (args === true) + args = {}; + var ret = args || {}; + if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i)) + DefaultsError.croak("`" + i + "` is not a supported option", defs); + for (var i in defs) if (HOP(defs, i)) { + ret[i] = (args && HOP(args, i)) ? args[i] : defs[i]; + } + return ret; +}; + +function merge(obj, ext) { + var count = 0; + for (var i in ext) if (HOP(ext, i)) { + obj[i] = ext[i]; + count++; + } + return count; +}; + +function noop() {} +function return_false() { return false; } +function return_true() { return true; } +function return_this() { return this; } +function return_null() { return null; } + +var MAP = (function(){ + function MAP(a, f, backwards) { + var ret = [], top = [], i; + function doit() { + var val = f(a[i], i); + var is_last = val instanceof Last; + if (is_last) val = val.v; + if (val instanceof AtTop) { + val = val.v; + if (val instanceof Splice) { + top.push.apply(top, backwards ? val.v.slice().reverse() : val.v); + } else { + top.push(val); + } + } + else if (val !== skip) { + if (val instanceof Splice) { + ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v); + } else { + ret.push(val); + } + } + return is_last; + }; + if (a instanceof Array) { + if (backwards) { + for (i = a.length; --i >= 0;) if (doit()) break; + ret.reverse(); + top.reverse(); + } else { + for (i = 0; i < a.length; ++i) if (doit()) break; + } + } + else { + for (i in a) if (HOP(a, i)) if (doit()) break; + } + return top.concat(ret); + }; + MAP.at_top = function(val) { return new AtTop(val) }; + MAP.splice = function(val) { return new Splice(val) }; + MAP.last = function(val) { return new Last(val) }; + var skip = MAP.skip = {}; + function AtTop(val) { this.v = val }; + function Splice(val) { this.v = val }; + function Last(val) { this.v = val }; + return MAP; +})(); + +function push_uniq(array, el) { + if (array.indexOf(el) < 0) + array.push(el); +}; + +function string_template(text, props) { + return text.replace(/\{(.+?)\}/g, function(str, p){ + return props && props[p]; + }); +}; + +function remove(array, el) { + for (var i = array.length; --i >= 0;) { + if (array[i] === el) array.splice(i, 1); + } +}; + +function mergeSort(array, cmp) { + if (array.length < 2) return array.slice(); + function merge(a, b) { + var r = [], ai = 0, bi = 0, i = 0; + while (ai < a.length && bi < b.length) { + cmp(a[ai], b[bi]) <= 0 + ? r[i++] = a[ai++] + : r[i++] = b[bi++]; + } + if (ai < a.length) r.push.apply(r, a.slice(ai)); + if (bi < b.length) r.push.apply(r, b.slice(bi)); + return r; + }; + function _ms(a) { + if (a.length <= 1) + return a; + var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m); + left = _ms(left); + right = _ms(right); + return merge(left, right); + }; + return _ms(array); +}; + +function set_difference(a, b) { + return a.filter(function(el){ + return b.indexOf(el) < 0; + }); +}; + +function set_intersection(a, b) { + return a.filter(function(el){ + return b.indexOf(el) >= 0; + }); +}; + +// this function is taken from Acorn [1], written by Marijn Haverbeke +// [1] https://github.com/marijnh/acorn +function makePredicate(words) { + if (!(words instanceof Array)) words = words.split(" "); + var f = "", cats = []; + out: for (var i = 0; i < words.length; ++i) { + for (var j = 0; j < cats.length; ++j) + if (cats[j][0].length == words[i].length) { + cats[j].push(words[i]); + continue out; + } + cats.push([words[i]]); + } + function quote(word) { + return JSON.stringify(word).replace(/[\u2028\u2029]/g, function(s) { + switch (s) { + case "\u2028": return "\\u2028"; + case "\u2029": return "\\u2029"; + } + return s; + }); + } + function compareTo(arr) { + if (arr.length == 1) return f += "return str === " + quote(arr[0]) + ";"; + f += "switch(str){"; + for (var i = 0; i < arr.length; ++i) f += "case " + quote(arr[i]) + ":"; + f += "return true}return false;"; + } + // When there are more than three length categories, an outer + // switch first dispatches on the lengths, to save on comparisons. + if (cats.length > 3) { + cats.sort(function(a, b) {return b.length - a.length;}); + f += "switch(str.length){"; + for (var i = 0; i < cats.length; ++i) { + var cat = cats[i]; + f += "case " + cat[0].length + ":"; + compareTo(cat); + } + f += "}"; + // Otherwise, simply generate a flat `switch` statement. + } else { + compareTo(words); + } + return new Function("str", f); +}; + +function all(array, predicate) { + for (var i = array.length; --i >= 0;) + if (!predicate(array[i])) + return false; + return true; +}; + +function Dictionary() { + this._values = Object.create(null); + this._size = 0; +}; +Dictionary.prototype = { + set: function(key, val) { + if (!this.has(key)) ++this._size; + this._values["$" + key] = val; + return this; + }, + add: function(key, val) { + if (this.has(key)) { + this.get(key).push(val); + } else { + this.set(key, [ val ]); + } + return this; + }, + get: function(key) { return this._values["$" + key] }, + del: function(key) { + if (this.has(key)) { + --this._size; + delete this._values["$" + key]; + } + return this; + }, + has: function(key) { return ("$" + key) in this._values }, + each: function(f) { + for (var i in this._values) + f(this._values[i], i.substr(1)); + }, + size: function() { + return this._size; + }, + map: function(f) { + var ret = []; + for (var i in this._values) + ret.push(f(this._values[i], i.substr(1))); + return ret; + }, + toObject: function() { return this._values } +}; +Dictionary.fromObject = function(obj) { + var dict = new Dictionary(); + dict._size = merge(dict._values, obj); + return dict; +}; + +function HOP(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +// return true if the node at the top of the stack (that means the +// innermost node in the current output) is lexically the first in +// a statement. +function first_in_statement(stack) { + var node = stack.parent(-1); + for (var i = 0, p; p = stack.parent(i); i++) { + if (p instanceof AST_Statement && p.body === node) + return true; + if ((p instanceof AST_Sequence && p.expressions[0] === node) || + (p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) || + (p instanceof AST_Dot && p.expression === node ) || + (p instanceof AST_Sub && p.expression === node ) || + (p instanceof AST_Conditional && p.condition === node ) || + (p instanceof AST_Binary && p.left === node ) || + (p instanceof AST_UnaryPostfix && p.expression === node )) + { + node = p; + } else { + return false; + } + } +} diff --git a/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md b/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md new file mode 100644 index 00000000..3a8c066c --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/LICENSE b/node_modules/uglify-js/node_modules/source-map/LICENSE new file mode 100644 index 00000000..ed1b7cf2 --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/README.md b/node_modules/uglify-js/node_modules/source-map/README.md new file mode 100644 index 00000000..fea4beb1 --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/dist/source-map.debug.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.debug.js new file mode 100644 index 00000000..aad0620d --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/dist/source-map.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.js new file mode 100644 index 00000000..b4eb0874 --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/dist/source-map.min.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js new file mode 100644 index 00000000..c7c72dad --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/lib/array-set.js b/node_modules/uglify-js/node_modules/source-map/lib/array-set.js new file mode 100644 index 00000000..fbd5c81c --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/array-set.js @@ -0,0 +1,121 @@ +/* -*- 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 = require('./util'); +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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js b/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js new file mode 100644 index 00000000..612b4040 --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js @@ -0,0 +1,140 @@ +/* -*- 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 = require('./base64'); + +// 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; +}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/base64.js b/node_modules/uglify-js/node_modules/source-map/lib/base64.js new file mode 100644 index 00000000..8aa86b30 --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/base64.js @@ -0,0 +1,67 @@ +/* -*- 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; +}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js b/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js new file mode 100644 index 00000000..010ac941 --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js @@ -0,0 +1,111 @@ +/* -*- 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; +}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js b/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js new file mode 100644 index 00000000..06d1274a --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js @@ -0,0 +1,79 @@ +/* -*- 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 = require('./util'); + +/** + * 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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js b/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js new file mode 100644 index 00000000..6a7caadb --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js @@ -0,0 +1,114 @@ +/* -*- 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); +}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js b/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js new file mode 100644 index 00000000..7b99d1da --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js @@ -0,0 +1,1145 @@ +/* -*- 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 = require('./util'); +var binarySearch = require('./binary-search'); +var ArraySet = require('./array-set').ArraySet; +var base64VLQ = require('./base64-vlq'); +var quickSort = require('./quick-sort').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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js b/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js new file mode 100644 index 00000000..508bcfbb --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js @@ -0,0 +1,425 @@ +/* -*- 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 = require('./base64-vlq'); +var util = require('./util'); +var ArraySet = require('./array-set').ArraySet; +var MappingList = require('./mapping-list').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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-node.js b/node_modules/uglify-js/node_modules/source-map/lib/source-node.js new file mode 100644 index 00000000..8bcdbe38 --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/source-node.js @@ -0,0 +1,413 @@ +/* -*- 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 = require('./source-map-generator').SourceMapGenerator; +var util = require('./util'); + +// 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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/util.js b/node_modules/uglify-js/node_modules/source-map/lib/util.js new file mode 100644 index 00000000..3ca92e56 --- /dev/null +++ b/node_modules/uglify-js/node_modules/source-map/lib/util.js @@ -0,0 +1,488 @@ +/* -*- 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; diff --git a/node_modules/uglify-js/node_modules/source-map/package.json b/node_modules/uglify-js/node_modules/source-map/package.json new file mode 100644 index 00000000..24663417 --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/source-map.d.ts b/node_modules/uglify-js/node_modules/source-map/source-map.d.ts new file mode 100644 index 00000000..8f972b0c --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/node_modules/source-map/source-map.js b/node_modules/uglify-js/node_modules/source-map/source-map.js new file mode 100644 index 00000000..bc88fe82 --- /dev/null +++ b/node_modules/uglify-js/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/uglify-js/package.json b/node_modules/uglify-js/package.json new file mode 100644 index 00000000..e3f21d63 --- /dev/null +++ b/node_modules/uglify-js/package.json @@ -0,0 +1,44 @@ +{ + "name": "uglify-js", + "description": "JavaScript parser, mangler/compressor and beautifier toolkit", + "homepage": "http://lisperator.net/uglifyjs", + "author": "Mihai Bazon (http://lisperator.net/)", + "license": "BSD-2-Clause", + "version": "3.2.2", + "engines": { + "node": ">=0.8.0" + }, + "maintainers": [ + "Mihai Bazon (http://lisperator.net/)" + ], + "repository": { + "type": "git", + "url": "https://github.com/mishoo/UglifyJS2.git" + }, + "bugs": { + "url": "https://github.com/mishoo/UglifyJS2/issues" + }, + "main": "tools/node.js", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "files": [ + "bin", + "lib", + "tools", + "LICENSE" + ], + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "devDependencies": { + "acorn": "~5.2.1", + "mocha": "~3.5.1", + "semver": "~5.4.1" + }, + "scripts": { + "test": "node test/run-tests.js" + }, + "keywords": ["uglify", "uglify-js", "minify", "minifier", "es5"] +} diff --git a/node_modules/uglify-js/tools/domprops.json b/node_modules/uglify-js/tools/domprops.json new file mode 100644 index 00000000..481e8018 --- /dev/null +++ b/node_modules/uglify-js/tools/domprops.json @@ -0,0 +1,5601 @@ +[ + "$&", + "$'", + "$*", + "$+", + "$1", + "$2", + "$3", + "$4", + "$5", + "$6", + "$7", + "$8", + "$9", + "$_", + "$`", + "$input", + "@@iterator", + "ABORT_ERR", + "ACTIVE", + "ACTIVE_ATTRIBUTES", + "ACTIVE_TEXTURE", + "ACTIVE_UNIFORMS", + "ADDITION", + "ALIASED_LINE_WIDTH_RANGE", + "ALIASED_POINT_SIZE_RANGE", + "ALLOW_KEYBOARD_INPUT", + "ALLPASS", + "ALPHA", + "ALPHA_BITS", + "ALT_MASK", + "ALWAYS", + "ANY_TYPE", + "ANY_UNORDERED_NODE_TYPE", + "ARRAY_BUFFER", + "ARRAY_BUFFER_BINDING", + "ATTACHED_SHADERS", + "ATTRIBUTE_NODE", + "AT_TARGET", + "AddSearchProvider", + "AnalyserNode", + "AnimationEvent", + "AnonXMLHttpRequest", + "ApplicationCache", + "ApplicationCacheErrorEvent", + "Array", + "ArrayBuffer", + "Attr", + "Audio", + "AudioBuffer", + "AudioBufferSourceNode", + "AudioContext", + "AudioDestinationNode", + "AudioListener", + "AudioNode", + "AudioParam", + "AudioProcessingEvent", + "AudioStreamTrack", + "AutocompleteErrorEvent", + "BACK", + "BAD_BOUNDARYPOINTS_ERR", + "BANDPASS", + "BLEND", + "BLEND_COLOR", + "BLEND_DST_ALPHA", + "BLEND_DST_RGB", + "BLEND_EQUATION", + "BLEND_EQUATION_ALPHA", + "BLEND_EQUATION_RGB", + "BLEND_SRC_ALPHA", + "BLEND_SRC_RGB", + "BLUE_BITS", + "BLUR", + "BOOL", + "BOOLEAN_TYPE", + "BOOL_VEC2", + "BOOL_VEC3", + "BOOL_VEC4", + "BOTH", + "BROWSER_DEFAULT_WEBGL", + "BUBBLING_PHASE", + "BUFFER_SIZE", + "BUFFER_USAGE", + "BYTE", + "BYTES_PER_ELEMENT", + "BarProp", + "BaseHref", + "BatteryManager", + "BeforeLoadEvent", + "BeforeUnloadEvent", + "BiquadFilterNode", + "Blob", + "BlobEvent", + "Boolean", + "CAPTURING_PHASE", + "CCW", + "CDATASection", + "CDATA_SECTION_NODE", + "CHANGE", + "CHARSET_RULE", + "CHECKING", + "CLAMP_TO_EDGE", + "CLICK", + "CLOSED", + "CLOSING", + "COLOR_ATTACHMENT0", + "COLOR_BUFFER_BIT", + "COLOR_CLEAR_VALUE", + "COLOR_WRITEMASK", + "COMMENT_NODE", + "COMPILE_STATUS", + "COMPRESSED_RGBA_S3TC_DXT1_EXT", + "COMPRESSED_RGBA_S3TC_DXT3_EXT", + "COMPRESSED_RGBA_S3TC_DXT5_EXT", + "COMPRESSED_RGB_S3TC_DXT1_EXT", + "COMPRESSED_TEXTURE_FORMATS", + "CONNECTING", + "CONSTANT_ALPHA", + "CONSTANT_COLOR", + "CONSTRAINT_ERR", + "CONTEXT_LOST_WEBGL", + "CONTROL_MASK", + "COUNTER_STYLE_RULE", + "CSS", + "CSS2Properties", + "CSSCharsetRule", + "CSSConditionRule", + "CSSCounterStyleRule", + "CSSFontFaceRule", + "CSSFontFeatureValuesRule", + "CSSGroupingRule", + "CSSImportRule", + "CSSKeyframeRule", + "CSSKeyframesRule", + "CSSMediaRule", + "CSSMozDocumentRule", + "CSSNameSpaceRule", + "CSSPageRule", + "CSSPrimitiveValue", + "CSSRule", + "CSSRuleList", + "CSSStyleDeclaration", + "CSSStyleRule", + "CSSStyleSheet", + "CSSSupportsRule", + "CSSUnknownRule", + "CSSValue", + "CSSValueList", + "CSSVariablesDeclaration", + "CSSVariablesRule", + "CSSViewportRule", + "CSS_ATTR", + "CSS_CM", + "CSS_COUNTER", + "CSS_CUSTOM", + "CSS_DEG", + "CSS_DIMENSION", + "CSS_EMS", + "CSS_EXS", + "CSS_FILTER_BLUR", + "CSS_FILTER_BRIGHTNESS", + "CSS_FILTER_CONTRAST", + "CSS_FILTER_CUSTOM", + "CSS_FILTER_DROP_SHADOW", + "CSS_FILTER_GRAYSCALE", + "CSS_FILTER_HUE_ROTATE", + "CSS_FILTER_INVERT", + "CSS_FILTER_OPACITY", + "CSS_FILTER_REFERENCE", + "CSS_FILTER_SATURATE", + "CSS_FILTER_SEPIA", + "CSS_GRAD", + "CSS_HZ", + "CSS_IDENT", + "CSS_IN", + "CSS_INHERIT", + "CSS_KHZ", + "CSS_MATRIX", + "CSS_MATRIX3D", + "CSS_MM", + "CSS_MS", + "CSS_NUMBER", + "CSS_PC", + "CSS_PERCENTAGE", + "CSS_PERSPECTIVE", + "CSS_PRIMITIVE_VALUE", + "CSS_PT", + "CSS_PX", + "CSS_RAD", + "CSS_RECT", + "CSS_RGBCOLOR", + "CSS_ROTATE", + "CSS_ROTATE3D", + "CSS_ROTATEX", + "CSS_ROTATEY", + "CSS_ROTATEZ", + "CSS_S", + "CSS_SCALE", + "CSS_SCALE3D", + "CSS_SCALEX", + "CSS_SCALEY", + "CSS_SCALEZ", + "CSS_SKEW", + "CSS_SKEWX", + "CSS_SKEWY", + "CSS_STRING", + "CSS_TRANSLATE", + "CSS_TRANSLATE3D", + "CSS_TRANSLATEX", + "CSS_TRANSLATEY", + "CSS_TRANSLATEZ", + "CSS_UNKNOWN", + "CSS_URI", + "CSS_VALUE_LIST", + "CSS_VH", + "CSS_VMAX", + "CSS_VMIN", + "CSS_VW", + "CULL_FACE", + "CULL_FACE_MODE", + "CURRENT_PROGRAM", + "CURRENT_VERTEX_ATTRIB", + "CUSTOM", + "CW", + "CanvasGradient", + "CanvasPattern", + "CanvasRenderingContext2D", + "CaretPosition", + "ChannelMergerNode", + "ChannelSplitterNode", + "CharacterData", + "ClientRect", + "ClientRectList", + "Clipboard", + "ClipboardEvent", + "CloseEvent", + "Collator", + "CommandEvent", + "Comment", + "CompositionEvent", + "Console", + "Controllers", + "ConvolverNode", + "Counter", + "Crypto", + "CryptoKey", + "CustomEvent", + "DATABASE_ERR", + "DATA_CLONE_ERR", + "DATA_ERR", + "DBLCLICK", + "DECR", + "DECR_WRAP", + "DELETE_STATUS", + "DEPTH_ATTACHMENT", + "DEPTH_BITS", + "DEPTH_BUFFER_BIT", + "DEPTH_CLEAR_VALUE", + "DEPTH_COMPONENT", + "DEPTH_COMPONENT16", + "DEPTH_FUNC", + "DEPTH_RANGE", + "DEPTH_STENCIL", + "DEPTH_STENCIL_ATTACHMENT", + "DEPTH_TEST", + "DEPTH_WRITEMASK", + "DIRECTION_DOWN", + "DIRECTION_LEFT", + "DIRECTION_RIGHT", + "DIRECTION_UP", + "DISABLED", + "DISPATCH_REQUEST_ERR", + "DITHER", + "DOCUMENT_FRAGMENT_NODE", + "DOCUMENT_NODE", + "DOCUMENT_POSITION_CONTAINED_BY", + "DOCUMENT_POSITION_CONTAINS", + "DOCUMENT_POSITION_DISCONNECTED", + "DOCUMENT_POSITION_FOLLOWING", + "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", + "DOCUMENT_POSITION_PRECEDING", + "DOCUMENT_TYPE_NODE", + "DOMCursor", + "DOMError", + "DOMException", + "DOMImplementation", + "DOMImplementationLS", + "DOMMatrix", + "DOMMatrixReadOnly", + "DOMParser", + "DOMPoint", + "DOMPointReadOnly", + "DOMQuad", + "DOMRect", + "DOMRectList", + "DOMRectReadOnly", + "DOMRequest", + "DOMSTRING_SIZE_ERR", + "DOMSettableTokenList", + "DOMStringList", + "DOMStringMap", + "DOMTokenList", + "DOMTransactionEvent", + "DOM_DELTA_LINE", + "DOM_DELTA_PAGE", + "DOM_DELTA_PIXEL", + "DOM_INPUT_METHOD_DROP", + "DOM_INPUT_METHOD_HANDWRITING", + "DOM_INPUT_METHOD_IME", + "DOM_INPUT_METHOD_KEYBOARD", + "DOM_INPUT_METHOD_MULTIMODAL", + "DOM_INPUT_METHOD_OPTION", + "DOM_INPUT_METHOD_PASTE", + "DOM_INPUT_METHOD_SCRIPT", + "DOM_INPUT_METHOD_UNKNOWN", + "DOM_INPUT_METHOD_VOICE", + "DOM_KEY_LOCATION_JOYSTICK", + "DOM_KEY_LOCATION_LEFT", + "DOM_KEY_LOCATION_MOBILE", + "DOM_KEY_LOCATION_NUMPAD", + "DOM_KEY_LOCATION_RIGHT", + "DOM_KEY_LOCATION_STANDARD", + "DOM_VK_0", + "DOM_VK_1", + "DOM_VK_2", + "DOM_VK_3", + "DOM_VK_4", + "DOM_VK_5", + "DOM_VK_6", + "DOM_VK_7", + "DOM_VK_8", + "DOM_VK_9", + "DOM_VK_A", + "DOM_VK_ACCEPT", + "DOM_VK_ADD", + "DOM_VK_ALT", + "DOM_VK_ALTGR", + "DOM_VK_AMPERSAND", + "DOM_VK_ASTERISK", + "DOM_VK_AT", + "DOM_VK_ATTN", + "DOM_VK_B", + "DOM_VK_BACKSPACE", + "DOM_VK_BACK_QUOTE", + "DOM_VK_BACK_SLASH", + "DOM_VK_BACK_SPACE", + "DOM_VK_C", + "DOM_VK_CANCEL", + "DOM_VK_CAPS_LOCK", + "DOM_VK_CIRCUMFLEX", + "DOM_VK_CLEAR", + "DOM_VK_CLOSE_BRACKET", + "DOM_VK_CLOSE_CURLY_BRACKET", + "DOM_VK_CLOSE_PAREN", + "DOM_VK_COLON", + "DOM_VK_COMMA", + "DOM_VK_CONTEXT_MENU", + "DOM_VK_CONTROL", + "DOM_VK_CONVERT", + "DOM_VK_CRSEL", + "DOM_VK_CTRL", + "DOM_VK_D", + "DOM_VK_DECIMAL", + "DOM_VK_DELETE", + "DOM_VK_DIVIDE", + "DOM_VK_DOLLAR", + "DOM_VK_DOUBLE_QUOTE", + "DOM_VK_DOWN", + "DOM_VK_E", + "DOM_VK_EISU", + "DOM_VK_END", + "DOM_VK_ENTER", + "DOM_VK_EQUALS", + "DOM_VK_EREOF", + "DOM_VK_ESCAPE", + "DOM_VK_EXCLAMATION", + "DOM_VK_EXECUTE", + "DOM_VK_EXSEL", + "DOM_VK_F", + "DOM_VK_F1", + "DOM_VK_F10", + "DOM_VK_F11", + "DOM_VK_F12", + "DOM_VK_F13", + "DOM_VK_F14", + "DOM_VK_F15", + "DOM_VK_F16", + "DOM_VK_F17", + "DOM_VK_F18", + "DOM_VK_F19", + "DOM_VK_F2", + "DOM_VK_F20", + "DOM_VK_F21", + "DOM_VK_F22", + "DOM_VK_F23", + "DOM_VK_F24", + "DOM_VK_F25", + "DOM_VK_F26", + "DOM_VK_F27", + "DOM_VK_F28", + "DOM_VK_F29", + "DOM_VK_F3", + "DOM_VK_F30", + "DOM_VK_F31", + "DOM_VK_F32", + "DOM_VK_F33", + "DOM_VK_F34", + "DOM_VK_F35", + "DOM_VK_F36", + "DOM_VK_F4", + "DOM_VK_F5", + "DOM_VK_F6", + "DOM_VK_F7", + "DOM_VK_F8", + "DOM_VK_F9", + "DOM_VK_FINAL", + "DOM_VK_FRONT", + "DOM_VK_G", + "DOM_VK_GREATER_THAN", + "DOM_VK_H", + "DOM_VK_HANGUL", + "DOM_VK_HANJA", + "DOM_VK_HASH", + "DOM_VK_HELP", + "DOM_VK_HK_TOGGLE", + "DOM_VK_HOME", + "DOM_VK_HYPHEN_MINUS", + "DOM_VK_I", + "DOM_VK_INSERT", + "DOM_VK_J", + "DOM_VK_JUNJA", + "DOM_VK_K", + "DOM_VK_KANA", + "DOM_VK_KANJI", + "DOM_VK_L", + "DOM_VK_LEFT", + "DOM_VK_LEFT_TAB", + "DOM_VK_LESS_THAN", + "DOM_VK_M", + "DOM_VK_META", + "DOM_VK_MODECHANGE", + "DOM_VK_MULTIPLY", + "DOM_VK_N", + "DOM_VK_NONCONVERT", + "DOM_VK_NUMPAD0", + "DOM_VK_NUMPAD1", + "DOM_VK_NUMPAD2", + "DOM_VK_NUMPAD3", + "DOM_VK_NUMPAD4", + "DOM_VK_NUMPAD5", + "DOM_VK_NUMPAD6", + "DOM_VK_NUMPAD7", + "DOM_VK_NUMPAD8", + "DOM_VK_NUMPAD9", + "DOM_VK_NUM_LOCK", + "DOM_VK_O", + "DOM_VK_OEM_1", + "DOM_VK_OEM_102", + "DOM_VK_OEM_2", + "DOM_VK_OEM_3", + "DOM_VK_OEM_4", + "DOM_VK_OEM_5", + "DOM_VK_OEM_6", + "DOM_VK_OEM_7", + "DOM_VK_OEM_8", + "DOM_VK_OEM_COMMA", + "DOM_VK_OEM_MINUS", + "DOM_VK_OEM_PERIOD", + "DOM_VK_OEM_PLUS", + "DOM_VK_OPEN_BRACKET", + "DOM_VK_OPEN_CURLY_BRACKET", + "DOM_VK_OPEN_PAREN", + "DOM_VK_P", + "DOM_VK_PA1", + "DOM_VK_PAGEDOWN", + "DOM_VK_PAGEUP", + "DOM_VK_PAGE_DOWN", + "DOM_VK_PAGE_UP", + "DOM_VK_PAUSE", + "DOM_VK_PERCENT", + "DOM_VK_PERIOD", + "DOM_VK_PIPE", + "DOM_VK_PLAY", + "DOM_VK_PLUS", + "DOM_VK_PRINT", + "DOM_VK_PRINTSCREEN", + "DOM_VK_PROCESSKEY", + "DOM_VK_PROPERITES", + "DOM_VK_Q", + "DOM_VK_QUESTION_MARK", + "DOM_VK_QUOTE", + "DOM_VK_R", + "DOM_VK_REDO", + "DOM_VK_RETURN", + "DOM_VK_RIGHT", + "DOM_VK_S", + "DOM_VK_SCROLL_LOCK", + "DOM_VK_SELECT", + "DOM_VK_SEMICOLON", + "DOM_VK_SEPARATOR", + "DOM_VK_SHIFT", + "DOM_VK_SLASH", + "DOM_VK_SLEEP", + "DOM_VK_SPACE", + "DOM_VK_SUBTRACT", + "DOM_VK_T", + "DOM_VK_TAB", + "DOM_VK_TILDE", + "DOM_VK_U", + "DOM_VK_UNDERSCORE", + "DOM_VK_UNDO", + "DOM_VK_UNICODE", + "DOM_VK_UP", + "DOM_VK_V", + "DOM_VK_VOLUME_DOWN", + "DOM_VK_VOLUME_MUTE", + "DOM_VK_VOLUME_UP", + "DOM_VK_W", + "DOM_VK_WIN", + "DOM_VK_WINDOW", + "DOM_VK_WIN_ICO_00", + "DOM_VK_WIN_ICO_CLEAR", + "DOM_VK_WIN_ICO_HELP", + "DOM_VK_WIN_OEM_ATTN", + "DOM_VK_WIN_OEM_AUTO", + "DOM_VK_WIN_OEM_BACKTAB", + "DOM_VK_WIN_OEM_CLEAR", + "DOM_VK_WIN_OEM_COPY", + "DOM_VK_WIN_OEM_CUSEL", + "DOM_VK_WIN_OEM_ENLW", + "DOM_VK_WIN_OEM_FINISH", + "DOM_VK_WIN_OEM_FJ_JISHO", + "DOM_VK_WIN_OEM_FJ_LOYA", + "DOM_VK_WIN_OEM_FJ_MASSHOU", + "DOM_VK_WIN_OEM_FJ_ROYA", + "DOM_VK_WIN_OEM_FJ_TOUROKU", + "DOM_VK_WIN_OEM_JUMP", + "DOM_VK_WIN_OEM_PA1", + "DOM_VK_WIN_OEM_PA2", + "DOM_VK_WIN_OEM_PA3", + "DOM_VK_WIN_OEM_RESET", + "DOM_VK_WIN_OEM_WSCTRL", + "DOM_VK_X", + "DOM_VK_XF86XK_ADD_FAVORITE", + "DOM_VK_XF86XK_APPLICATION_LEFT", + "DOM_VK_XF86XK_APPLICATION_RIGHT", + "DOM_VK_XF86XK_AUDIO_CYCLE_TRACK", + "DOM_VK_XF86XK_AUDIO_FORWARD", + "DOM_VK_XF86XK_AUDIO_LOWER_VOLUME", + "DOM_VK_XF86XK_AUDIO_MEDIA", + "DOM_VK_XF86XK_AUDIO_MUTE", + "DOM_VK_XF86XK_AUDIO_NEXT", + "DOM_VK_XF86XK_AUDIO_PAUSE", + "DOM_VK_XF86XK_AUDIO_PLAY", + "DOM_VK_XF86XK_AUDIO_PREV", + "DOM_VK_XF86XK_AUDIO_RAISE_VOLUME", + "DOM_VK_XF86XK_AUDIO_RANDOM_PLAY", + "DOM_VK_XF86XK_AUDIO_RECORD", + "DOM_VK_XF86XK_AUDIO_REPEAT", + "DOM_VK_XF86XK_AUDIO_REWIND", + "DOM_VK_XF86XK_AUDIO_STOP", + "DOM_VK_XF86XK_AWAY", + "DOM_VK_XF86XK_BACK", + "DOM_VK_XF86XK_BACK_FORWARD", + "DOM_VK_XF86XK_BATTERY", + "DOM_VK_XF86XK_BLUE", + "DOM_VK_XF86XK_BLUETOOTH", + "DOM_VK_XF86XK_BOOK", + "DOM_VK_XF86XK_BRIGHTNESS_ADJUST", + "DOM_VK_XF86XK_CALCULATOR", + "DOM_VK_XF86XK_CALENDAR", + "DOM_VK_XF86XK_CD", + "DOM_VK_XF86XK_CLOSE", + "DOM_VK_XF86XK_COMMUNITY", + "DOM_VK_XF86XK_CONTRAST_ADJUST", + "DOM_VK_XF86XK_COPY", + "DOM_VK_XF86XK_CUT", + "DOM_VK_XF86XK_CYCLE_ANGLE", + "DOM_VK_XF86XK_DISPLAY", + "DOM_VK_XF86XK_DOCUMENTS", + "DOM_VK_XF86XK_DOS", + "DOM_VK_XF86XK_EJECT", + "DOM_VK_XF86XK_EXCEL", + "DOM_VK_XF86XK_EXPLORER", + "DOM_VK_XF86XK_FAVORITES", + "DOM_VK_XF86XK_FINANCE", + "DOM_VK_XF86XK_FORWARD", + "DOM_VK_XF86XK_FRAME_BACK", + "DOM_VK_XF86XK_FRAME_FORWARD", + "DOM_VK_XF86XK_GAME", + "DOM_VK_XF86XK_GO", + "DOM_VK_XF86XK_GREEN", + "DOM_VK_XF86XK_HIBERNATE", + "DOM_VK_XF86XK_HISTORY", + "DOM_VK_XF86XK_HOME_PAGE", + "DOM_VK_XF86XK_HOT_LINKS", + "DOM_VK_XF86XK_I_TOUCH", + "DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN", + "DOM_VK_XF86XK_KBD_BRIGHTNESS_UP", + "DOM_VK_XF86XK_KBD_LIGHT_ON_OFF", + "DOM_VK_XF86XK_LAUNCH0", + "DOM_VK_XF86XK_LAUNCH1", + "DOM_VK_XF86XK_LAUNCH2", + "DOM_VK_XF86XK_LAUNCH3", + "DOM_VK_XF86XK_LAUNCH4", + "DOM_VK_XF86XK_LAUNCH5", + "DOM_VK_XF86XK_LAUNCH6", + "DOM_VK_XF86XK_LAUNCH7", + "DOM_VK_XF86XK_LAUNCH8", + "DOM_VK_XF86XK_LAUNCH9", + "DOM_VK_XF86XK_LAUNCH_A", + "DOM_VK_XF86XK_LAUNCH_B", + "DOM_VK_XF86XK_LAUNCH_C", + "DOM_VK_XF86XK_LAUNCH_D", + "DOM_VK_XF86XK_LAUNCH_E", + "DOM_VK_XF86XK_LAUNCH_F", + "DOM_VK_XF86XK_LIGHT_BULB", + "DOM_VK_XF86XK_LOG_OFF", + "DOM_VK_XF86XK_MAIL", + "DOM_VK_XF86XK_MAIL_FORWARD", + "DOM_VK_XF86XK_MARKET", + "DOM_VK_XF86XK_MEETING", + "DOM_VK_XF86XK_MEMO", + "DOM_VK_XF86XK_MENU_KB", + "DOM_VK_XF86XK_MENU_PB", + "DOM_VK_XF86XK_MESSENGER", + "DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN", + "DOM_VK_XF86XK_MON_BRIGHTNESS_UP", + "DOM_VK_XF86XK_MUSIC", + "DOM_VK_XF86XK_MY_COMPUTER", + "DOM_VK_XF86XK_MY_SITES", + "DOM_VK_XF86XK_NEW", + "DOM_VK_XF86XK_NEWS", + "DOM_VK_XF86XK_OFFICE_HOME", + "DOM_VK_XF86XK_OPEN", + "DOM_VK_XF86XK_OPEN_URL", + "DOM_VK_XF86XK_OPTION", + "DOM_VK_XF86XK_PASTE", + "DOM_VK_XF86XK_PHONE", + "DOM_VK_XF86XK_PICTURES", + "DOM_VK_XF86XK_POWER_DOWN", + "DOM_VK_XF86XK_POWER_OFF", + "DOM_VK_XF86XK_RED", + "DOM_VK_XF86XK_REFRESH", + "DOM_VK_XF86XK_RELOAD", + "DOM_VK_XF86XK_REPLY", + "DOM_VK_XF86XK_ROCKER_DOWN", + "DOM_VK_XF86XK_ROCKER_ENTER", + "DOM_VK_XF86XK_ROCKER_UP", + "DOM_VK_XF86XK_ROTATE_WINDOWS", + "DOM_VK_XF86XK_ROTATION_KB", + "DOM_VK_XF86XK_ROTATION_PB", + "DOM_VK_XF86XK_SAVE", + "DOM_VK_XF86XK_SCREEN_SAVER", + "DOM_VK_XF86XK_SCROLL_CLICK", + "DOM_VK_XF86XK_SCROLL_DOWN", + "DOM_VK_XF86XK_SCROLL_UP", + "DOM_VK_XF86XK_SEARCH", + "DOM_VK_XF86XK_SEND", + "DOM_VK_XF86XK_SHOP", + "DOM_VK_XF86XK_SPELL", + "DOM_VK_XF86XK_SPLIT_SCREEN", + "DOM_VK_XF86XK_STANDBY", + "DOM_VK_XF86XK_START", + "DOM_VK_XF86XK_STOP", + "DOM_VK_XF86XK_SUBTITLE", + "DOM_VK_XF86XK_SUPPORT", + "DOM_VK_XF86XK_SUSPEND", + "DOM_VK_XF86XK_TASK_PANE", + "DOM_VK_XF86XK_TERMINAL", + "DOM_VK_XF86XK_TIME", + "DOM_VK_XF86XK_TOOLS", + "DOM_VK_XF86XK_TOP_MENU", + "DOM_VK_XF86XK_TO_DO_LIST", + "DOM_VK_XF86XK_TRAVEL", + "DOM_VK_XF86XK_USER1KB", + "DOM_VK_XF86XK_USER2KB", + "DOM_VK_XF86XK_USER_PB", + "DOM_VK_XF86XK_UWB", + "DOM_VK_XF86XK_VENDOR_HOME", + "DOM_VK_XF86XK_VIDEO", + "DOM_VK_XF86XK_VIEW", + "DOM_VK_XF86XK_WAKE_UP", + "DOM_VK_XF86XK_WEB_CAM", + "DOM_VK_XF86XK_WHEEL_BUTTON", + "DOM_VK_XF86XK_WLAN", + "DOM_VK_XF86XK_WORD", + "DOM_VK_XF86XK_WWW", + "DOM_VK_XF86XK_XFER", + "DOM_VK_XF86XK_YELLOW", + "DOM_VK_XF86XK_ZOOM_IN", + "DOM_VK_XF86XK_ZOOM_OUT", + "DOM_VK_Y", + "DOM_VK_Z", + "DOM_VK_ZOOM", + "DONE", + "DONT_CARE", + "DOWNLOADING", + "DRAGDROP", + "DST_ALPHA", + "DST_COLOR", + "DYNAMIC_DRAW", + "DataChannel", + "DataTransfer", + "DataTransferItem", + "DataTransferItemList", + "DataView", + "Date", + "DateTimeFormat", + "DelayNode", + "DesktopNotification", + "DesktopNotificationCenter", + "DeviceLightEvent", + "DeviceMotionEvent", + "DeviceOrientationEvent", + "DeviceProximityEvent", + "DeviceStorage", + "DeviceStorageChangeEvent", + "Document", + "DocumentFragment", + "DocumentType", + "DragEvent", + "DynamicsCompressorNode", + "E", + "ELEMENT_ARRAY_BUFFER", + "ELEMENT_ARRAY_BUFFER_BINDING", + "ELEMENT_NODE", + "EMPTY", + "ENCODING_ERR", + "ENDED", + "END_TO_END", + "END_TO_START", + "ENTITY_NODE", + "ENTITY_REFERENCE_NODE", + "EPSILON", + "EQUAL", + "EQUALPOWER", + "ERROR", + "EXPONENTIAL_DISTANCE", + "Element", + "ElementQuery", + "Entity", + "EntityReference", + "Error", + "ErrorEvent", + "EvalError", + "Event", + "EventException", + "EventSource", + "EventTarget", + "External", + "FASTEST", + "FIDOSDK", + "FILTER_ACCEPT", + "FILTER_INTERRUPT", + "FILTER_REJECT", + "FILTER_SKIP", + "FINISHED_STATE", + "FIRST_ORDERED_NODE_TYPE", + "FLOAT", + "FLOAT_MAT2", + "FLOAT_MAT3", + "FLOAT_MAT4", + "FLOAT_VEC2", + "FLOAT_VEC3", + "FLOAT_VEC4", + "FOCUS", + "FONT_FACE_RULE", + "FONT_FEATURE_VALUES_RULE", + "FRAGMENT_SHADER", + "FRAGMENT_SHADER_DERIVATIVE_HINT_OES", + "FRAMEBUFFER", + "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", + "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", + "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", + "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", + "FRAMEBUFFER_BINDING", + "FRAMEBUFFER_COMPLETE", + "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", + "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", + "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", + "FRAMEBUFFER_UNSUPPORTED", + "FRONT", + "FRONT_AND_BACK", + "FRONT_FACE", + "FUNC_ADD", + "FUNC_REVERSE_SUBTRACT", + "FUNC_SUBTRACT", + "Feed", + "FeedEntry", + "File", + "FileError", + "FileList", + "FileReader", + "FindInPage", + "Float32Array", + "Float64Array", + "FocusEvent", + "FontFace", + "FormData", + "Function", + "GENERATE_MIPMAP_HINT", + "GEQUAL", + "GREATER", + "GREEN_BITS", + "GainNode", + "Gamepad", + "GamepadButton", + "GamepadEvent", + "GestureEvent", + "HAVE_CURRENT_DATA", + "HAVE_ENOUGH_DATA", + "HAVE_FUTURE_DATA", + "HAVE_METADATA", + "HAVE_NOTHING", + "HEADERS_RECEIVED", + "HIDDEN", + "HIERARCHY_REQUEST_ERR", + "HIGHPASS", + "HIGHSHELF", + "HIGH_FLOAT", + "HIGH_INT", + "HORIZONTAL", + "HORIZONTAL_AXIS", + "HRTF", + "HTMLAllCollection", + "HTMLAnchorElement", + "HTMLAppletElement", + "HTMLAreaElement", + "HTMLAudioElement", + "HTMLBRElement", + "HTMLBaseElement", + "HTMLBaseFontElement", + "HTMLBlockquoteElement", + "HTMLBodyElement", + "HTMLButtonElement", + "HTMLCanvasElement", + "HTMLCollection", + "HTMLCommandElement", + "HTMLContentElement", + "HTMLDListElement", + "HTMLDataElement", + "HTMLDataListElement", + "HTMLDetailsElement", + "HTMLDialogElement", + "HTMLDirectoryElement", + "HTMLDivElement", + "HTMLDocument", + "HTMLElement", + "HTMLEmbedElement", + "HTMLFieldSetElement", + "HTMLFontElement", + "HTMLFormControlsCollection", + "HTMLFormElement", + "HTMLFrameElement", + "HTMLFrameSetElement", + "HTMLHRElement", + "HTMLHeadElement", + "HTMLHeadingElement", + "HTMLHtmlElement", + "HTMLIFrameElement", + "HTMLImageElement", + "HTMLInputElement", + "HTMLIsIndexElement", + "HTMLKeygenElement", + "HTMLLIElement", + "HTMLLabelElement", + "HTMLLegendElement", + "HTMLLinkElement", + "HTMLMapElement", + "HTMLMarqueeElement", + "HTMLMediaElement", + "HTMLMenuElement", + "HTMLMenuItemElement", + "HTMLMetaElement", + "HTMLMeterElement", + "HTMLModElement", + "HTMLOListElement", + "HTMLObjectElement", + "HTMLOptGroupElement", + "HTMLOptionElement", + "HTMLOptionsCollection", + "HTMLOutputElement", + "HTMLParagraphElement", + "HTMLParamElement", + "HTMLPictureElement", + "HTMLPreElement", + "HTMLProgressElement", + "HTMLPropertiesCollection", + "HTMLQuoteElement", + "HTMLScriptElement", + "HTMLSelectElement", + "HTMLShadowElement", + "HTMLSourceElement", + "HTMLSpanElement", + "HTMLStyleElement", + "HTMLTableCaptionElement", + "HTMLTableCellElement", + "HTMLTableColElement", + "HTMLTableElement", + "HTMLTableRowElement", + "HTMLTableSectionElement", + "HTMLTemplateElement", + "HTMLTextAreaElement", + "HTMLTimeElement", + "HTMLTitleElement", + "HTMLTrackElement", + "HTMLUListElement", + "HTMLUnknownElement", + "HTMLVideoElement", + "HashChangeEvent", + "Headers", + "History", + "ICE_CHECKING", + "ICE_CLOSED", + "ICE_COMPLETED", + "ICE_CONNECTED", + "ICE_FAILED", + "ICE_GATHERING", + "ICE_WAITING", + "IDBCursor", + "IDBCursorWithValue", + "IDBDatabase", + "IDBDatabaseException", + "IDBFactory", + "IDBFileHandle", + "IDBFileRequest", + "IDBIndex", + "IDBKeyRange", + "IDBMutableFile", + "IDBObjectStore", + "IDBOpenDBRequest", + "IDBRequest", + "IDBTransaction", + "IDBVersionChangeEvent", + "IDLE", + "IMPLEMENTATION_COLOR_READ_FORMAT", + "IMPLEMENTATION_COLOR_READ_TYPE", + "IMPORT_RULE", + "INCR", + "INCR_WRAP", + "INDEX_SIZE_ERR", + "INT", + "INT_VEC2", + "INT_VEC3", + "INT_VEC4", + "INUSE_ATTRIBUTE_ERR", + "INVALID_ACCESS_ERR", + "INVALID_CHARACTER_ERR", + "INVALID_ENUM", + "INVALID_EXPRESSION_ERR", + "INVALID_FRAMEBUFFER_OPERATION", + "INVALID_MODIFICATION_ERR", + "INVALID_NODE_TYPE_ERR", + "INVALID_OPERATION", + "INVALID_STATE_ERR", + "INVALID_VALUE", + "INVERSE_DISTANCE", + "INVERT", + "IceCandidate", + "Image", + "ImageBitmap", + "ImageData", + "Infinity", + "InputEvent", + "InputMethodContext", + "InstallTrigger", + "Int16Array", + "Int32Array", + "Int8Array", + "Intent", + "InternalError", + "Intl", + "IsSearchProviderInstalled", + "Iterator", + "JSON", + "KEEP", + "KEYDOWN", + "KEYFRAMES_RULE", + "KEYFRAME_RULE", + "KEYPRESS", + "KEYUP", + "KeyEvent", + "KeyboardEvent", + "LENGTHADJUST_SPACING", + "LENGTHADJUST_SPACINGANDGLYPHS", + "LENGTHADJUST_UNKNOWN", + "LEQUAL", + "LESS", + "LINEAR", + "LINEAR_DISTANCE", + "LINEAR_MIPMAP_LINEAR", + "LINEAR_MIPMAP_NEAREST", + "LINES", + "LINE_LOOP", + "LINE_STRIP", + "LINE_WIDTH", + "LINK_STATUS", + "LIVE", + "LN10", + "LN2", + "LOADED", + "LOADING", + "LOG10E", + "LOG2E", + "LOWPASS", + "LOWSHELF", + "LOW_FLOAT", + "LOW_INT", + "LSException", + "LSParserFilter", + "LUMINANCE", + "LUMINANCE_ALPHA", + "LocalMediaStream", + "Location", + "MAX_COMBINED_TEXTURE_IMAGE_UNITS", + "MAX_CUBE_MAP_TEXTURE_SIZE", + "MAX_FRAGMENT_UNIFORM_VECTORS", + "MAX_RENDERBUFFER_SIZE", + "MAX_SAFE_INTEGER", + "MAX_TEXTURE_IMAGE_UNITS", + "MAX_TEXTURE_MAX_ANISOTROPY_EXT", + "MAX_TEXTURE_SIZE", + "MAX_VALUE", + "MAX_VARYING_VECTORS", + "MAX_VERTEX_ATTRIBS", + "MAX_VERTEX_TEXTURE_IMAGE_UNITS", + "MAX_VERTEX_UNIFORM_VECTORS", + "MAX_VIEWPORT_DIMS", + "MEDIA_ERR_ABORTED", + "MEDIA_ERR_DECODE", + "MEDIA_ERR_ENCRYPTED", + "MEDIA_ERR_NETWORK", + "MEDIA_ERR_SRC_NOT_SUPPORTED", + "MEDIA_KEYERR_CLIENT", + "MEDIA_KEYERR_DOMAIN", + "MEDIA_KEYERR_HARDWARECHANGE", + "MEDIA_KEYERR_OUTPUT", + "MEDIA_KEYERR_SERVICE", + "MEDIA_KEYERR_UNKNOWN", + "MEDIA_RULE", + "MEDIUM_FLOAT", + "MEDIUM_INT", + "META_MASK", + "MIN_SAFE_INTEGER", + "MIN_VALUE", + "MIRRORED_REPEAT", + "MODE_ASYNCHRONOUS", + "MODE_SYNCHRONOUS", + "MODIFICATION", + "MOUSEDOWN", + "MOUSEDRAG", + "MOUSEMOVE", + "MOUSEOUT", + "MOUSEOVER", + "MOUSEUP", + "MOZ_KEYFRAMES_RULE", + "MOZ_KEYFRAME_RULE", + "MOZ_SOURCE_CURSOR", + "MOZ_SOURCE_ERASER", + "MOZ_SOURCE_KEYBOARD", + "MOZ_SOURCE_MOUSE", + "MOZ_SOURCE_PEN", + "MOZ_SOURCE_TOUCH", + "MOZ_SOURCE_UNKNOWN", + "MSGESTURE_FLAG_BEGIN", + "MSGESTURE_FLAG_CANCEL", + "MSGESTURE_FLAG_END", + "MSGESTURE_FLAG_INERTIA", + "MSGESTURE_FLAG_NONE", + "MSPOINTER_TYPE_MOUSE", + "MSPOINTER_TYPE_PEN", + "MSPOINTER_TYPE_TOUCH", + "MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE", + "MS_ASYNC_CALLBACK_STATUS_CANCEL", + "MS_ASYNC_CALLBACK_STATUS_CHOOSEANY", + "MS_ASYNC_CALLBACK_STATUS_ERROR", + "MS_ASYNC_CALLBACK_STATUS_JOIN", + "MS_ASYNC_OP_STATUS_CANCELED", + "MS_ASYNC_OP_STATUS_ERROR", + "MS_ASYNC_OP_STATUS_SUCCESS", + "MS_MANIPULATION_STATE_ACTIVE", + "MS_MANIPULATION_STATE_CANCELLED", + "MS_MANIPULATION_STATE_COMMITTED", + "MS_MANIPULATION_STATE_DRAGGING", + "MS_MANIPULATION_STATE_INERTIA", + "MS_MANIPULATION_STATE_PRESELECT", + "MS_MANIPULATION_STATE_SELECTING", + "MS_MANIPULATION_STATE_STOPPED", + "MS_MEDIA_ERR_ENCRYPTED", + "MS_MEDIA_KEYERR_CLIENT", + "MS_MEDIA_KEYERR_DOMAIN", + "MS_MEDIA_KEYERR_HARDWARECHANGE", + "MS_MEDIA_KEYERR_OUTPUT", + "MS_MEDIA_KEYERR_SERVICE", + "MS_MEDIA_KEYERR_UNKNOWN", + "Map", + "Math", + "MediaController", + "MediaDevices", + "MediaElementAudioSourceNode", + "MediaEncryptedEvent", + "MediaError", + "MediaKeyError", + "MediaKeyEvent", + "MediaKeyMessageEvent", + "MediaKeyNeededEvent", + "MediaKeySession", + "MediaKeyStatusMap", + "MediaKeySystemAccess", + "MediaKeys", + "MediaList", + "MediaQueryList", + "MediaQueryListEvent", + "MediaRecorder", + "MediaSource", + "MediaStream", + "MediaStreamAudioDestinationNode", + "MediaStreamAudioSourceNode", + "MediaStreamEvent", + "MediaStreamTrack", + "MediaStreamTrackEvent", + "MessageChannel", + "MessageEvent", + "MessagePort", + "Methods", + "MimeType", + "MimeTypeArray", + "MouseEvent", + "MouseScrollEvent", + "MozAnimation", + "MozAnimationDelay", + "MozAnimationDirection", + "MozAnimationDuration", + "MozAnimationFillMode", + "MozAnimationIterationCount", + "MozAnimationName", + "MozAnimationPlayState", + "MozAnimationTimingFunction", + "MozAppearance", + "MozBackfaceVisibility", + "MozBinding", + "MozBorderBottomColors", + "MozBorderEnd", + "MozBorderEndColor", + "MozBorderEndStyle", + "MozBorderEndWidth", + "MozBorderImage", + "MozBorderLeftColors", + "MozBorderRightColors", + "MozBorderStart", + "MozBorderStartColor", + "MozBorderStartStyle", + "MozBorderStartWidth", + "MozBorderTopColors", + "MozBoxAlign", + "MozBoxDirection", + "MozBoxFlex", + "MozBoxOrdinalGroup", + "MozBoxOrient", + "MozBoxPack", + "MozBoxSizing", + "MozCSSKeyframeRule", + "MozCSSKeyframesRule", + "MozColumnCount", + "MozColumnFill", + "MozColumnGap", + "MozColumnRule", + "MozColumnRuleColor", + "MozColumnRuleStyle", + "MozColumnRuleWidth", + "MozColumnWidth", + "MozColumns", + "MozContactChangeEvent", + "MozFloatEdge", + "MozFontFeatureSettings", + "MozFontLanguageOverride", + "MozForceBrokenImageIcon", + "MozHyphens", + "MozImageRegion", + "MozMarginEnd", + "MozMarginStart", + "MozMmsEvent", + "MozMmsMessage", + "MozMobileMessageThread", + "MozOSXFontSmoothing", + "MozOrient", + "MozOutlineRadius", + "MozOutlineRadiusBottomleft", + "MozOutlineRadiusBottomright", + "MozOutlineRadiusTopleft", + "MozOutlineRadiusTopright", + "MozPaddingEnd", + "MozPaddingStart", + "MozPerspective", + "MozPerspectiveOrigin", + "MozPowerManager", + "MozSettingsEvent", + "MozSmsEvent", + "MozSmsMessage", + "MozStackSizing", + "MozTabSize", + "MozTextAlignLast", + "MozTextDecorationColor", + "MozTextDecorationLine", + "MozTextDecorationStyle", + "MozTextSizeAdjust", + "MozTransform", + "MozTransformOrigin", + "MozTransformStyle", + "MozTransition", + "MozTransitionDelay", + "MozTransitionDuration", + "MozTransitionProperty", + "MozTransitionTimingFunction", + "MozUserFocus", + "MozUserInput", + "MozUserModify", + "MozUserSelect", + "MozWindowDragging", + "MozWindowShadow", + "MutationEvent", + "MutationObserver", + "MutationRecord", + "NAMESPACE_ERR", + "NAMESPACE_RULE", + "NEAREST", + "NEAREST_MIPMAP_LINEAR", + "NEAREST_MIPMAP_NEAREST", + "NEGATIVE_INFINITY", + "NETWORK_EMPTY", + "NETWORK_ERR", + "NETWORK_IDLE", + "NETWORK_LOADED", + "NETWORK_LOADING", + "NETWORK_NO_SOURCE", + "NEVER", + "NEW", + "NEXT", + "NEXT_NO_DUPLICATE", + "NICEST", + "NODE_AFTER", + "NODE_BEFORE", + "NODE_BEFORE_AND_AFTER", + "NODE_INSIDE", + "NONE", + "NON_TRANSIENT_ERR", + "NOTATION_NODE", + "NOTCH", + "NOTEQUAL", + "NOT_ALLOWED_ERR", + "NOT_FOUND_ERR", + "NOT_READABLE_ERR", + "NOT_SUPPORTED_ERR", + "NO_DATA_ALLOWED_ERR", + "NO_ERR", + "NO_ERROR", + "NO_MODIFICATION_ALLOWED_ERR", + "NUMBER_TYPE", + "NUM_COMPRESSED_TEXTURE_FORMATS", + "NaN", + "NamedNodeMap", + "Navigator", + "NearbyLinks", + "NetworkInformation", + "Node", + "NodeFilter", + "NodeIterator", + "NodeList", + "Notation", + "Notification", + "NotifyPaintEvent", + "Number", + "NumberFormat", + "OBSOLETE", + "ONE", + "ONE_MINUS_CONSTANT_ALPHA", + "ONE_MINUS_CONSTANT_COLOR", + "ONE_MINUS_DST_ALPHA", + "ONE_MINUS_DST_COLOR", + "ONE_MINUS_SRC_ALPHA", + "ONE_MINUS_SRC_COLOR", + "OPEN", + "OPENED", + "OPENING", + "ORDERED_NODE_ITERATOR_TYPE", + "ORDERED_NODE_SNAPSHOT_TYPE", + "OUT_OF_MEMORY", + "Object", + "OfflineAudioCompletionEvent", + "OfflineAudioContext", + "OfflineResourceList", + "Option", + "OscillatorNode", + "OverflowEvent", + "PACK_ALIGNMENT", + "PAGE_RULE", + "PARSE_ERR", + "PATHSEG_ARC_ABS", + "PATHSEG_ARC_REL", + "PATHSEG_CLOSEPATH", + "PATHSEG_CURVETO_CUBIC_ABS", + "PATHSEG_CURVETO_CUBIC_REL", + "PATHSEG_CURVETO_CUBIC_SMOOTH_ABS", + "PATHSEG_CURVETO_CUBIC_SMOOTH_REL", + "PATHSEG_CURVETO_QUADRATIC_ABS", + "PATHSEG_CURVETO_QUADRATIC_REL", + "PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS", + "PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL", + "PATHSEG_LINETO_ABS", + "PATHSEG_LINETO_HORIZONTAL_ABS", + "PATHSEG_LINETO_HORIZONTAL_REL", + "PATHSEG_LINETO_REL", + "PATHSEG_LINETO_VERTICAL_ABS", + "PATHSEG_LINETO_VERTICAL_REL", + "PATHSEG_MOVETO_ABS", + "PATHSEG_MOVETO_REL", + "PATHSEG_UNKNOWN", + "PATH_EXISTS_ERR", + "PEAKING", + "PERMISSION_DENIED", + "PERSISTENT", + "PI", + "PLAYING_STATE", + "POINTS", + "POLYGON_OFFSET_FACTOR", + "POLYGON_OFFSET_FILL", + "POLYGON_OFFSET_UNITS", + "POSITION_UNAVAILABLE", + "POSITIVE_INFINITY", + "PREV", + "PREV_NO_DUPLICATE", + "PROCESSING_INSTRUCTION_NODE", + "PageChangeEvent", + "PageTransitionEvent", + "PaintRequest", + "PaintRequestList", + "PannerNode", + "Path2D", + "Performance", + "PerformanceEntry", + "PerformanceMark", + "PerformanceMeasure", + "PerformanceNavigation", + "PerformanceResourceTiming", + "PerformanceTiming", + "PeriodicWave", + "Plugin", + "PluginArray", + "PopStateEvent", + "PopupBlockedEvent", + "ProcessingInstruction", + "ProgressEvent", + "Promise", + "PropertyNodeList", + "Proxy", + "PushManager", + "PushSubscription", + "Q", + "QUOTA_ERR", + "QUOTA_EXCEEDED_ERR", + "QueryInterface", + "READ_ONLY", + "READ_ONLY_ERR", + "READ_WRITE", + "RED_BITS", + "REMOVAL", + "RENDERBUFFER", + "RENDERBUFFER_ALPHA_SIZE", + "RENDERBUFFER_BINDING", + "RENDERBUFFER_BLUE_SIZE", + "RENDERBUFFER_DEPTH_SIZE", + "RENDERBUFFER_GREEN_SIZE", + "RENDERBUFFER_HEIGHT", + "RENDERBUFFER_INTERNAL_FORMAT", + "RENDERBUFFER_RED_SIZE", + "RENDERBUFFER_STENCIL_SIZE", + "RENDERBUFFER_WIDTH", + "RENDERER", + "RENDERING_INTENT_ABSOLUTE_COLORIMETRIC", + "RENDERING_INTENT_AUTO", + "RENDERING_INTENT_PERCEPTUAL", + "RENDERING_INTENT_RELATIVE_COLORIMETRIC", + "RENDERING_INTENT_SATURATION", + "RENDERING_INTENT_UNKNOWN", + "REPEAT", + "REPLACE", + "RGB", + "RGB565", + "RGB5_A1", + "RGBA", + "RGBA4", + "RGBColor", + "ROTATION_CLOCKWISE", + "ROTATION_COUNTERCLOCKWISE", + "RTCDataChannelEvent", + "RTCIceCandidate", + "RTCPeerConnectionIceEvent", + "RTCRtpReceiver", + "RTCRtpSender", + "RTCSessionDescription", + "RTCStatsReport", + "RadioNodeList", + "Range", + "RangeError", + "RangeException", + "RecordErrorEvent", + "Rect", + "ReferenceError", + "RegExp", + "Request", + "Response", + "SAMPLER_2D", + "SAMPLER_CUBE", + "SAMPLES", + "SAMPLE_ALPHA_TO_COVERAGE", + "SAMPLE_BUFFERS", + "SAMPLE_COVERAGE", + "SAMPLE_COVERAGE_INVERT", + "SAMPLE_COVERAGE_VALUE", + "SAWTOOTH", + "SCHEDULED_STATE", + "SCISSOR_BOX", + "SCISSOR_TEST", + "SCROLL_PAGE_DOWN", + "SCROLL_PAGE_UP", + "SDP_ANSWER", + "SDP_OFFER", + "SDP_PRANSWER", + "SECURITY_ERR", + "SELECT", + "SERIALIZE_ERR", + "SEVERITY_ERROR", + "SEVERITY_FATAL_ERROR", + "SEVERITY_WARNING", + "SHADER_COMPILER", + "SHADER_TYPE", + "SHADING_LANGUAGE_VERSION", + "SHIFT_MASK", + "SHORT", + "SHOWING", + "SHOW_ALL", + "SHOW_ATTRIBUTE", + "SHOW_CDATA_SECTION", + "SHOW_COMMENT", + "SHOW_DOCUMENT", + "SHOW_DOCUMENT_FRAGMENT", + "SHOW_DOCUMENT_TYPE", + "SHOW_ELEMENT", + "SHOW_ENTITY", + "SHOW_ENTITY_REFERENCE", + "SHOW_NOTATION", + "SHOW_PROCESSING_INSTRUCTION", + "SHOW_TEXT", + "SINE", + "SOUNDFIELD", + "SQLException", + "SQRT1_2", + "SQRT2", + "SQUARE", + "SRC_ALPHA", + "SRC_ALPHA_SATURATE", + "SRC_COLOR", + "START_TO_END", + "START_TO_START", + "STATIC_DRAW", + "STENCIL_ATTACHMENT", + "STENCIL_BACK_FAIL", + "STENCIL_BACK_FUNC", + "STENCIL_BACK_PASS_DEPTH_FAIL", + "STENCIL_BACK_PASS_DEPTH_PASS", + "STENCIL_BACK_REF", + "STENCIL_BACK_VALUE_MASK", + "STENCIL_BACK_WRITEMASK", + "STENCIL_BITS", + "STENCIL_BUFFER_BIT", + "STENCIL_CLEAR_VALUE", + "STENCIL_FAIL", + "STENCIL_FUNC", + "STENCIL_INDEX", + "STENCIL_INDEX8", + "STENCIL_PASS_DEPTH_FAIL", + "STENCIL_PASS_DEPTH_PASS", + "STENCIL_REF", + "STENCIL_TEST", + "STENCIL_VALUE_MASK", + "STENCIL_WRITEMASK", + "STREAM_DRAW", + "STRING_TYPE", + "STYLE_RULE", + "SUBPIXEL_BITS", + "SUPPORTS_RULE", + "SVGAElement", + "SVGAltGlyphDefElement", + "SVGAltGlyphElement", + "SVGAltGlyphItemElement", + "SVGAngle", + "SVGAnimateColorElement", + "SVGAnimateElement", + "SVGAnimateMotionElement", + "SVGAnimateTransformElement", + "SVGAnimatedAngle", + "SVGAnimatedBoolean", + "SVGAnimatedEnumeration", + "SVGAnimatedInteger", + "SVGAnimatedLength", + "SVGAnimatedLengthList", + "SVGAnimatedNumber", + "SVGAnimatedNumberList", + "SVGAnimatedPreserveAspectRatio", + "SVGAnimatedRect", + "SVGAnimatedString", + "SVGAnimatedTransformList", + "SVGAnimationElement", + "SVGCircleElement", + "SVGClipPathElement", + "SVGColor", + "SVGComponentTransferFunctionElement", + "SVGCursorElement", + "SVGDefsElement", + "SVGDescElement", + "SVGDiscardElement", + "SVGDocument", + "SVGElement", + "SVGElementInstance", + "SVGElementInstanceList", + "SVGEllipseElement", + "SVGException", + "SVGFEBlendElement", + "SVGFEColorMatrixElement", + "SVGFEComponentTransferElement", + "SVGFECompositeElement", + "SVGFEConvolveMatrixElement", + "SVGFEDiffuseLightingElement", + "SVGFEDisplacementMapElement", + "SVGFEDistantLightElement", + "SVGFEDropShadowElement", + "SVGFEFloodElement", + "SVGFEFuncAElement", + "SVGFEFuncBElement", + "SVGFEFuncGElement", + "SVGFEFuncRElement", + "SVGFEGaussianBlurElement", + "SVGFEImageElement", + "SVGFEMergeElement", + "SVGFEMergeNodeElement", + "SVGFEMorphologyElement", + "SVGFEOffsetElement", + "SVGFEPointLightElement", + "SVGFESpecularLightingElement", + "SVGFESpotLightElement", + "SVGFETileElement", + "SVGFETurbulenceElement", + "SVGFilterElement", + "SVGFontElement", + "SVGFontFaceElement", + "SVGFontFaceFormatElement", + "SVGFontFaceNameElement", + "SVGFontFaceSrcElement", + "SVGFontFaceUriElement", + "SVGForeignObjectElement", + "SVGGElement", + "SVGGeometryElement", + "SVGGlyphElement", + "SVGGlyphRefElement", + "SVGGradientElement", + "SVGGraphicsElement", + "SVGHKernElement", + "SVGImageElement", + "SVGLength", + "SVGLengthList", + "SVGLineElement", + "SVGLinearGradientElement", + "SVGMPathElement", + "SVGMarkerElement", + "SVGMaskElement", + "SVGMatrix", + "SVGMetadataElement", + "SVGMissingGlyphElement", + "SVGNumber", + "SVGNumberList", + "SVGPaint", + "SVGPathElement", + "SVGPathSeg", + "SVGPathSegArcAbs", + "SVGPathSegArcRel", + "SVGPathSegClosePath", + "SVGPathSegCurvetoCubicAbs", + "SVGPathSegCurvetoCubicRel", + "SVGPathSegCurvetoCubicSmoothAbs", + "SVGPathSegCurvetoCubicSmoothRel", + "SVGPathSegCurvetoQuadraticAbs", + "SVGPathSegCurvetoQuadraticRel", + "SVGPathSegCurvetoQuadraticSmoothAbs", + "SVGPathSegCurvetoQuadraticSmoothRel", + "SVGPathSegLinetoAbs", + "SVGPathSegLinetoHorizontalAbs", + "SVGPathSegLinetoHorizontalRel", + "SVGPathSegLinetoRel", + "SVGPathSegLinetoVerticalAbs", + "SVGPathSegLinetoVerticalRel", + "SVGPathSegList", + "SVGPathSegMovetoAbs", + "SVGPathSegMovetoRel", + "SVGPatternElement", + "SVGPoint", + "SVGPointList", + "SVGPolygonElement", + "SVGPolylineElement", + "SVGPreserveAspectRatio", + "SVGRadialGradientElement", + "SVGRect", + "SVGRectElement", + "SVGRenderingIntent", + "SVGSVGElement", + "SVGScriptElement", + "SVGSetElement", + "SVGStopElement", + "SVGStringList", + "SVGStyleElement", + "SVGSwitchElement", + "SVGSymbolElement", + "SVGTRefElement", + "SVGTSpanElement", + "SVGTextContentElement", + "SVGTextElement", + "SVGTextPathElement", + "SVGTextPositioningElement", + "SVGTitleElement", + "SVGTransform", + "SVGTransformList", + "SVGUnitTypes", + "SVGUseElement", + "SVGVKernElement", + "SVGViewElement", + "SVGViewSpec", + "SVGZoomAndPan", + "SVGZoomEvent", + "SVG_ANGLETYPE_DEG", + "SVG_ANGLETYPE_GRAD", + "SVG_ANGLETYPE_RAD", + "SVG_ANGLETYPE_UNKNOWN", + "SVG_ANGLETYPE_UNSPECIFIED", + "SVG_CHANNEL_A", + "SVG_CHANNEL_B", + "SVG_CHANNEL_G", + "SVG_CHANNEL_R", + "SVG_CHANNEL_UNKNOWN", + "SVG_COLORTYPE_CURRENTCOLOR", + "SVG_COLORTYPE_RGBCOLOR", + "SVG_COLORTYPE_RGBCOLOR_ICCCOLOR", + "SVG_COLORTYPE_UNKNOWN", + "SVG_EDGEMODE_DUPLICATE", + "SVG_EDGEMODE_NONE", + "SVG_EDGEMODE_UNKNOWN", + "SVG_EDGEMODE_WRAP", + "SVG_FEBLEND_MODE_COLOR", + "SVG_FEBLEND_MODE_COLOR_BURN", + "SVG_FEBLEND_MODE_COLOR_DODGE", + "SVG_FEBLEND_MODE_DARKEN", + "SVG_FEBLEND_MODE_DIFFERENCE", + "SVG_FEBLEND_MODE_EXCLUSION", + "SVG_FEBLEND_MODE_HARD_LIGHT", + "SVG_FEBLEND_MODE_HUE", + "SVG_FEBLEND_MODE_LIGHTEN", + "SVG_FEBLEND_MODE_LUMINOSITY", + "SVG_FEBLEND_MODE_MULTIPLY", + "SVG_FEBLEND_MODE_NORMAL", + "SVG_FEBLEND_MODE_OVERLAY", + "SVG_FEBLEND_MODE_SATURATION", + "SVG_FEBLEND_MODE_SCREEN", + "SVG_FEBLEND_MODE_SOFT_LIGHT", + "SVG_FEBLEND_MODE_UNKNOWN", + "SVG_FECOLORMATRIX_TYPE_HUEROTATE", + "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA", + "SVG_FECOLORMATRIX_TYPE_MATRIX", + "SVG_FECOLORMATRIX_TYPE_SATURATE", + "SVG_FECOLORMATRIX_TYPE_UNKNOWN", + "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE", + "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA", + "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY", + "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR", + "SVG_FECOMPONENTTRANSFER_TYPE_TABLE", + "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN", + "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC", + "SVG_FECOMPOSITE_OPERATOR_ATOP", + "SVG_FECOMPOSITE_OPERATOR_IN", + "SVG_FECOMPOSITE_OPERATOR_OUT", + "SVG_FECOMPOSITE_OPERATOR_OVER", + "SVG_FECOMPOSITE_OPERATOR_UNKNOWN", + "SVG_FECOMPOSITE_OPERATOR_XOR", + "SVG_INVALID_VALUE_ERR", + "SVG_LENGTHTYPE_CM", + "SVG_LENGTHTYPE_EMS", + "SVG_LENGTHTYPE_EXS", + "SVG_LENGTHTYPE_IN", + "SVG_LENGTHTYPE_MM", + "SVG_LENGTHTYPE_NUMBER", + "SVG_LENGTHTYPE_PC", + "SVG_LENGTHTYPE_PERCENTAGE", + "SVG_LENGTHTYPE_PT", + "SVG_LENGTHTYPE_PX", + "SVG_LENGTHTYPE_UNKNOWN", + "SVG_MARKERUNITS_STROKEWIDTH", + "SVG_MARKERUNITS_UNKNOWN", + "SVG_MARKERUNITS_USERSPACEONUSE", + "SVG_MARKER_ORIENT_ANGLE", + "SVG_MARKER_ORIENT_AUTO", + "SVG_MARKER_ORIENT_UNKNOWN", + "SVG_MASKTYPE_ALPHA", + "SVG_MASKTYPE_LUMINANCE", + "SVG_MATRIX_NOT_INVERTABLE", + "SVG_MEETORSLICE_MEET", + "SVG_MEETORSLICE_SLICE", + "SVG_MEETORSLICE_UNKNOWN", + "SVG_MORPHOLOGY_OPERATOR_DILATE", + "SVG_MORPHOLOGY_OPERATOR_ERODE", + "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", + "SVG_PAINTTYPE_CURRENTCOLOR", + "SVG_PAINTTYPE_NONE", + "SVG_PAINTTYPE_RGBCOLOR", + "SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR", + "SVG_PAINTTYPE_UNKNOWN", + "SVG_PAINTTYPE_URI", + "SVG_PAINTTYPE_URI_CURRENTCOLOR", + "SVG_PAINTTYPE_URI_NONE", + "SVG_PAINTTYPE_URI_RGBCOLOR", + "SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR", + "SVG_PRESERVEASPECTRATIO_NONE", + "SVG_PRESERVEASPECTRATIO_UNKNOWN", + "SVG_PRESERVEASPECTRATIO_XMAXYMAX", + "SVG_PRESERVEASPECTRATIO_XMAXYMID", + "SVG_PRESERVEASPECTRATIO_XMAXYMIN", + "SVG_PRESERVEASPECTRATIO_XMIDYMAX", + "SVG_PRESERVEASPECTRATIO_XMIDYMID", + "SVG_PRESERVEASPECTRATIO_XMIDYMIN", + "SVG_PRESERVEASPECTRATIO_XMINYMAX", + "SVG_PRESERVEASPECTRATIO_XMINYMID", + "SVG_PRESERVEASPECTRATIO_XMINYMIN", + "SVG_SPREADMETHOD_PAD", + "SVG_SPREADMETHOD_REFLECT", + "SVG_SPREADMETHOD_REPEAT", + "SVG_SPREADMETHOD_UNKNOWN", + "SVG_STITCHTYPE_NOSTITCH", + "SVG_STITCHTYPE_STITCH", + "SVG_STITCHTYPE_UNKNOWN", + "SVG_TRANSFORM_MATRIX", + "SVG_TRANSFORM_ROTATE", + "SVG_TRANSFORM_SCALE", + "SVG_TRANSFORM_SKEWX", + "SVG_TRANSFORM_SKEWY", + "SVG_TRANSFORM_TRANSLATE", + "SVG_TRANSFORM_UNKNOWN", + "SVG_TURBULENCE_TYPE_FRACTALNOISE", + "SVG_TURBULENCE_TYPE_TURBULENCE", + "SVG_TURBULENCE_TYPE_UNKNOWN", + "SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", + "SVG_UNIT_TYPE_UNKNOWN", + "SVG_UNIT_TYPE_USERSPACEONUSE", + "SVG_WRONG_TYPE_ERR", + "SVG_ZOOMANDPAN_DISABLE", + "SVG_ZOOMANDPAN_MAGNIFY", + "SVG_ZOOMANDPAN_UNKNOWN", + "SYNTAX_ERR", + "SavedPages", + "Screen", + "ScreenOrientation", + "Script", + "ScriptProcessorNode", + "ScrollAreaEvent", + "SecurityPolicyViolationEvent", + "Selection", + "ServiceWorker", + "ServiceWorkerContainer", + "ServiceWorkerRegistration", + "SessionDescription", + "Set", + "ShadowRoot", + "SharedWorker", + "SimpleGestureEvent", + "SpeechSynthesisEvent", + "SpeechSynthesisUtterance", + "StopIteration", + "Storage", + "StorageEvent", + "String", + "StyleSheet", + "StyleSheetList", + "SubtleCrypto", + "Symbol", + "SyntaxError", + "TEMPORARY", + "TEXTPATH_METHODTYPE_ALIGN", + "TEXTPATH_METHODTYPE_STRETCH", + "TEXTPATH_METHODTYPE_UNKNOWN", + "TEXTPATH_SPACINGTYPE_AUTO", + "TEXTPATH_SPACINGTYPE_EXACT", + "TEXTPATH_SPACINGTYPE_UNKNOWN", + "TEXTURE", + "TEXTURE0", + "TEXTURE1", + "TEXTURE10", + "TEXTURE11", + "TEXTURE12", + "TEXTURE13", + "TEXTURE14", + "TEXTURE15", + "TEXTURE16", + "TEXTURE17", + "TEXTURE18", + "TEXTURE19", + "TEXTURE2", + "TEXTURE20", + "TEXTURE21", + "TEXTURE22", + "TEXTURE23", + "TEXTURE24", + "TEXTURE25", + "TEXTURE26", + "TEXTURE27", + "TEXTURE28", + "TEXTURE29", + "TEXTURE3", + "TEXTURE30", + "TEXTURE31", + "TEXTURE4", + "TEXTURE5", + "TEXTURE6", + "TEXTURE7", + "TEXTURE8", + "TEXTURE9", + "TEXTURE_2D", + "TEXTURE_BINDING_2D", + "TEXTURE_BINDING_CUBE_MAP", + "TEXTURE_CUBE_MAP", + "TEXTURE_CUBE_MAP_NEGATIVE_X", + "TEXTURE_CUBE_MAP_NEGATIVE_Y", + "TEXTURE_CUBE_MAP_NEGATIVE_Z", + "TEXTURE_CUBE_MAP_POSITIVE_X", + "TEXTURE_CUBE_MAP_POSITIVE_Y", + "TEXTURE_CUBE_MAP_POSITIVE_Z", + "TEXTURE_MAG_FILTER", + "TEXTURE_MAX_ANISOTROPY_EXT", + "TEXTURE_MIN_FILTER", + "TEXTURE_WRAP_S", + "TEXTURE_WRAP_T", + "TEXT_NODE", + "TIMEOUT", + "TIMEOUT_ERR", + "TOO_LARGE_ERR", + "TRANSACTION_INACTIVE_ERR", + "TRIANGLE", + "TRIANGLES", + "TRIANGLE_FAN", + "TRIANGLE_STRIP", + "TYPE_BACK_FORWARD", + "TYPE_ERR", + "TYPE_MISMATCH_ERR", + "TYPE_NAVIGATE", + "TYPE_RELOAD", + "TYPE_RESERVED", + "Text", + "TextDecoder", + "TextEncoder", + "TextEvent", + "TextMetrics", + "TextTrack", + "TextTrackCue", + "TextTrackCueList", + "TextTrackList", + "TimeEvent", + "TimeRanges", + "Touch", + "TouchEvent", + "TouchList", + "TrackEvent", + "TransitionEvent", + "TreeWalker", + "TypeError", + "UIEvent", + "UNCACHED", + "UNKNOWN_ERR", + "UNKNOWN_RULE", + "UNMASKED_RENDERER_WEBGL", + "UNMASKED_VENDOR_WEBGL", + "UNORDERED_NODE_ITERATOR_TYPE", + "UNORDERED_NODE_SNAPSHOT_TYPE", + "UNPACK_ALIGNMENT", + "UNPACK_COLORSPACE_CONVERSION_WEBGL", + "UNPACK_FLIP_Y_WEBGL", + "UNPACK_PREMULTIPLY_ALPHA_WEBGL", + "UNSCHEDULED_STATE", + "UNSENT", + "UNSIGNED_BYTE", + "UNSIGNED_INT", + "UNSIGNED_SHORT", + "UNSIGNED_SHORT_4_4_4_4", + "UNSIGNED_SHORT_5_5_5_1", + "UNSIGNED_SHORT_5_6_5", + "UNSPECIFIED_EVENT_TYPE_ERR", + "UPDATEREADY", + "URIError", + "URL", + "URLSearchParams", + "URLUnencoded", + "URL_MISMATCH_ERR", + "UTC", + "Uint16Array", + "Uint32Array", + "Uint8Array", + "Uint8ClampedArray", + "UserMessageHandler", + "UserMessageHandlersNamespace", + "UserProximityEvent", + "VALIDATE_STATUS", + "VALIDATION_ERR", + "VARIABLES_RULE", + "VENDOR", + "VERSION", + "VERSION_CHANGE", + "VERSION_ERR", + "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", + "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", + "VERTEX_ATTRIB_ARRAY_ENABLED", + "VERTEX_ATTRIB_ARRAY_NORMALIZED", + "VERTEX_ATTRIB_ARRAY_POINTER", + "VERTEX_ATTRIB_ARRAY_SIZE", + "VERTEX_ATTRIB_ARRAY_STRIDE", + "VERTEX_ATTRIB_ARRAY_TYPE", + "VERTEX_SHADER", + "VERTICAL", + "VERTICAL_AXIS", + "VER_ERR", + "VIEWPORT", + "VIEWPORT_RULE", + "VTTCue", + "VTTRegion", + "ValidityState", + "VideoStreamTrack", + "WEBKIT_FILTER_RULE", + "WEBKIT_KEYFRAMES_RULE", + "WEBKIT_KEYFRAME_RULE", + "WEBKIT_REGION_RULE", + "WRONG_DOCUMENT_ERR", + "WaveShaperNode", + "WeakMap", + "WeakSet", + "WebGLActiveInfo", + "WebGLBuffer", + "WebGLContextEvent", + "WebGLFramebuffer", + "WebGLProgram", + "WebGLRenderbuffer", + "WebGLRenderingContext", + "WebGLShader", + "WebGLShaderPrecisionFormat", + "WebGLTexture", + "WebGLUniformLocation", + "WebGLVertexArray", + "WebKitAnimationEvent", + "WebKitBlobBuilder", + "WebKitCSSFilterRule", + "WebKitCSSFilterValue", + "WebKitCSSKeyframeRule", + "WebKitCSSKeyframesRule", + "WebKitCSSMatrix", + "WebKitCSSRegionRule", + "WebKitCSSTransformValue", + "WebKitDataCue", + "WebKitGamepad", + "WebKitMediaKeyError", + "WebKitMediaKeyMessageEvent", + "WebKitMediaKeySession", + "WebKitMediaKeys", + "WebKitMediaSource", + "WebKitMutationObserver", + "WebKitNamespace", + "WebKitPlaybackTargetAvailabilityEvent", + "WebKitPoint", + "WebKitShadowRoot", + "WebKitSourceBuffer", + "WebKitSourceBufferList", + "WebKitTransitionEvent", + "WebSocket", + "WheelEvent", + "Window", + "Worker", + "XMLDocument", + "XMLHttpRequest", + "XMLHttpRequestEventTarget", + "XMLHttpRequestException", + "XMLHttpRequestProgressEvent", + "XMLHttpRequestUpload", + "XMLSerializer", + "XMLStylesheetProcessingInstruction", + "XPathEvaluator", + "XPathException", + "XPathExpression", + "XPathNSResolver", + "XPathResult", + "XSLTProcessor", + "ZERO", + "_XD0M_", + "_YD0M_", + "__defineGetter__", + "__defineSetter__", + "__lookupGetter__", + "__lookupSetter__", + "__opera", + "__proto__", + "_browserjsran", + "a", + "aLink", + "abbr", + "abort", + "abs", + "absolute", + "acceleration", + "accelerationIncludingGravity", + "accelerator", + "accept", + "acceptCharset", + "acceptNode", + "accessKey", + "accessKeyLabel", + "accuracy", + "acos", + "acosh", + "action", + "actionURL", + "active", + "activeCues", + "activeElement", + "activeSourceBuffers", + "activeSourceCount", + "activeTexture", + "add", + "addBehavior", + "addCandidate", + "addColorStop", + "addCue", + "addElement", + "addEventListener", + "addFilter", + "addFromString", + "addFromUri", + "addIceCandidate", + "addImport", + "addListener", + "addNamed", + "addPageRule", + "addPath", + "addPointer", + "addRange", + "addRegion", + "addRule", + "addSearchEngine", + "addSourceBuffer", + "addStream", + "addTextTrack", + "addTrack", + "addWakeLockListener", + "addedNodes", + "additionalName", + "additiveSymbols", + "addons", + "adoptNode", + "adr", + "advance", + "alert", + "algorithm", + "align", + "align-content", + "align-items", + "align-self", + "alignContent", + "alignItems", + "alignSelf", + "alignmentBaseline", + "alinkColor", + "all", + "allowFullscreen", + "allowedDirections", + "alpha", + "alt", + "altGraphKey", + "altHtml", + "altKey", + "altLeft", + "altitude", + "altitudeAccuracy", + "amplitude", + "ancestorOrigins", + "anchor", + "anchorNode", + "anchorOffset", + "anchors", + "angle", + "animVal", + "animate", + "animatedInstanceRoot", + "animatedNormalizedPathSegList", + "animatedPathSegList", + "animatedPoints", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "animationDelay", + "animationDirection", + "animationDuration", + "animationFillMode", + "animationIterationCount", + "animationName", + "animationPlayState", + "animationStartTime", + "animationTimingFunction", + "animationsPaused", + "anniversary", + "app", + "appCodeName", + "appMinorVersion", + "appName", + "appNotifications", + "appVersion", + "append", + "appendBuffer", + "appendChild", + "appendData", + "appendItem", + "appendMedium", + "appendNamed", + "appendRule", + "appendStream", + "appendWindowEnd", + "appendWindowStart", + "applets", + "applicationCache", + "apply", + "applyElement", + "arc", + "arcTo", + "archive", + "areas", + "arguments", + "arrayBuffer", + "asin", + "asinh", + "assert", + "assign", + "async", + "atEnd", + "atan", + "atan2", + "atanh", + "atob", + "attachEvent", + "attachShader", + "attachments", + "attack", + "attrChange", + "attrName", + "attributeName", + "attributeNamespace", + "attributes", + "audioTracks", + "autoIncrement", + "autobuffer", + "autocapitalize", + "autocomplete", + "autocorrect", + "autofocus", + "autoplay", + "availHeight", + "availLeft", + "availTop", + "availWidth", + "availability", + "available", + "aversion", + "axes", + "axis", + "azimuth", + "b", + "back", + "backface-visibility", + "backfaceVisibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-repeat", + "background-size", + "backgroundAttachment", + "backgroundBlendMode", + "backgroundClip", + "backgroundColor", + "backgroundImage", + "backgroundOrigin", + "backgroundPosition", + "backgroundPositionX", + "backgroundPositionY", + "backgroundRepeat", + "backgroundSize", + "badInput", + "balance", + "baseFrequencyX", + "baseFrequencyY", + "baseNode", + "baseOffset", + "baseURI", + "baseVal", + "baselineShift", + "battery", + "bday", + "beginElement", + "beginElementAt", + "beginPath", + "behavior", + "behaviorCookie", + "behaviorPart", + "behaviorUrns", + "beta", + "bezierCurveTo", + "bgColor", + "bgProperties", + "bias", + "big", + "binaryType", + "bind", + "bindAttribLocation", + "bindBuffer", + "bindFramebuffer", + "bindRenderbuffer", + "bindTexture", + "blendColor", + "blendEquation", + "blendEquationSeparate", + "blendFunc", + "blendFuncSeparate", + "blink", + "blob", + "blockDirection", + "blue", + "blur", + "body", + "bodyUsed", + "bold", + "bookmarks", + "booleanValue", + "border", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "borderBottom", + "borderBottomColor", + "borderBottomLeftRadius", + "borderBottomRightRadius", + "borderBottomStyle", + "borderBottomWidth", + "borderCollapse", + "borderColor", + "borderColorDark", + "borderColorLight", + "borderImage", + "borderImageOutset", + "borderImageRepeat", + "borderImageSlice", + "borderImageSource", + "borderImageWidth", + "borderLeft", + "borderLeftColor", + "borderLeftStyle", + "borderLeftWidth", + "borderRadius", + "borderRight", + "borderRightColor", + "borderRightStyle", + "borderRightWidth", + "borderSpacing", + "borderStyle", + "borderTop", + "borderTopColor", + "borderTopLeftRadius", + "borderTopRightRadius", + "borderTopStyle", + "borderTopWidth", + "borderWidth", + "bottom", + "bottomMargin", + "bound", + "boundElements", + "boundingClientRect", + "boundingHeight", + "boundingLeft", + "boundingTop", + "boundingWidth", + "bounds", + "box-decoration-break", + "box-shadow", + "box-sizing", + "boxDecorationBreak", + "boxShadow", + "boxSizing", + "breakAfter", + "breakBefore", + "breakInside", + "browserLanguage", + "btoa", + "bubbles", + "buffer", + "bufferData", + "bufferDepth", + "bufferSize", + "bufferSubData", + "buffered", + "bufferedAmount", + "buildID", + "buildNumber", + "button", + "buttonID", + "buttons", + "byteLength", + "byteOffset", + "c", + "call", + "caller", + "canBeFormatted", + "canBeMounted", + "canBeShared", + "canHaveChildren", + "canHaveHTML", + "canPlayType", + "cancel", + "cancelAnimationFrame", + "cancelBubble", + "cancelScheduledValues", + "cancelable", + "candidate", + "canvas", + "caption", + "caption-side", + "captionSide", + "captureEvents", + "captureStackTrace", + "caretPositionFromPoint", + "caretRangeFromPoint", + "cast", + "catch", + "category", + "cbrt", + "cd", + "ceil", + "cellIndex", + "cellPadding", + "cellSpacing", + "cells", + "ch", + "chOff", + "chain", + "challenge", + "changedTouches", + "channel", + "channelCount", + "channelCountMode", + "channelInterpretation", + "char", + "charAt", + "charCode", + "charCodeAt", + "charIndex", + "characterSet", + "charging", + "chargingTime", + "charset", + "checkEnclosure", + "checkFramebufferStatus", + "checkIntersection", + "checkValidity", + "checked", + "childElementCount", + "childNodes", + "children", + "chrome", + "ciphertext", + "cite", + "classList", + "className", + "classid", + "clear", + "clearAttributes", + "clearColor", + "clearData", + "clearDepth", + "clearImmediate", + "clearInterval", + "clearMarks", + "clearMeasures", + "clearParameters", + "clearRect", + "clearResourceTimings", + "clearShadow", + "clearStencil", + "clearTimeout", + "clearWatch", + "click", + "clickCount", + "clientHeight", + "clientInformation", + "clientLeft", + "clientRect", + "clientRects", + "clientTop", + "clientWidth", + "clientX", + "clientY", + "clip", + "clip-path", + "clip-rule", + "clipBottom", + "clipLeft", + "clipPath", + "clipPathUnits", + "clipRight", + "clipRule", + "clipTop", + "clipboardData", + "clone", + "cloneContents", + "cloneNode", + "cloneRange", + "close", + "closePath", + "closed", + "closest", + "clz", + "clz32", + "cmp", + "code", + "codeBase", + "codePointAt", + "codeType", + "colSpan", + "collapse", + "collapseToEnd", + "collapseToStart", + "collapsed", + "collect", + "colno", + "color", + "color-interpolation", + "color-interpolation-filters", + "colorDepth", + "colorInterpolation", + "colorInterpolationFilters", + "colorMask", + "colorType", + "cols", + "columnCount", + "columnFill", + "columnGap", + "columnNumber", + "columnRule", + "columnRuleColor", + "columnRuleStyle", + "columnRuleWidth", + "columnSpan", + "columnWidth", + "columns", + "command", + "commitPreferences", + "commonAncestorContainer", + "compact", + "compareBoundaryPoints", + "compareDocumentPosition", + "compareEndPoints", + "compareNode", + "comparePoint", + "compatMode", + "compatible", + "compile", + "compileShader", + "complete", + "componentFromPoint", + "compositionEndOffset", + "compositionStartOffset", + "compressedTexImage2D", + "compressedTexSubImage2D", + "concat", + "conditionText", + "coneInnerAngle", + "coneOuterAngle", + "coneOuterGain", + "confirm", + "confirmComposition", + "confirmSiteSpecificTrackingException", + "confirmWebWideTrackingException", + "connect", + "connectEnd", + "connectStart", + "connected", + "connection", + "connectionSpeed", + "console", + "consolidate", + "constrictionActive", + "constructor", + "contactID", + "contains", + "containsNode", + "content", + "contentDocument", + "contentEditable", + "contentOverflow", + "contentScriptType", + "contentStyleType", + "contentType", + "contentWindow", + "context", + "contextMenu", + "contextmenu", + "continue", + "continuous", + "control", + "controller", + "controls", + "convertToSpecifiedUnits", + "cookie", + "cookieEnabled", + "coords", + "copyFromChannel", + "copyTexImage2D", + "copyTexSubImage2D", + "copyToChannel", + "copyWithin", + "correspondingElement", + "correspondingUseElement", + "cos", + "cosh", + "count", + "counter-increment", + "counter-reset", + "counterIncrement", + "counterReset", + "cpuClass", + "cpuSleepAllowed", + "create", + "createAnalyser", + "createAnswer", + "createAttribute", + "createAttributeNS", + "createBiquadFilter", + "createBuffer", + "createBufferSource", + "createCDATASection", + "createCSSStyleSheet", + "createCaption", + "createChannelMerger", + "createChannelSplitter", + "createComment", + "createContextualFragment", + "createControlRange", + "createConvolver", + "createDTMFSender", + "createDataChannel", + "createDelay", + "createDelayNode", + "createDocument", + "createDocumentFragment", + "createDocumentType", + "createDynamicsCompressor", + "createElement", + "createElementNS", + "createEntityReference", + "createEvent", + "createEventObject", + "createExpression", + "createFramebuffer", + "createFunction", + "createGain", + "createGainNode", + "createHTMLDocument", + "createImageBitmap", + "createImageData", + "createIndex", + "createJavaScriptNode", + "createLinearGradient", + "createMediaElementSource", + "createMediaKeys", + "createMediaStreamDestination", + "createMediaStreamSource", + "createMutableFile", + "createNSResolver", + "createNodeIterator", + "createNotification", + "createObjectStore", + "createObjectURL", + "createOffer", + "createOscillator", + "createPanner", + "createPattern", + "createPeriodicWave", + "createPopup", + "createProcessingInstruction", + "createProgram", + "createRadialGradient", + "createRange", + "createRangeCollection", + "createRenderbuffer", + "createSVGAngle", + "createSVGLength", + "createSVGMatrix", + "createSVGNumber", + "createSVGPathSegArcAbs", + "createSVGPathSegArcRel", + "createSVGPathSegClosePath", + "createSVGPathSegCurvetoCubicAbs", + "createSVGPathSegCurvetoCubicRel", + "createSVGPathSegCurvetoCubicSmoothAbs", + "createSVGPathSegCurvetoCubicSmoothRel", + "createSVGPathSegCurvetoQuadraticAbs", + "createSVGPathSegCurvetoQuadraticRel", + "createSVGPathSegCurvetoQuadraticSmoothAbs", + "createSVGPathSegCurvetoQuadraticSmoothRel", + "createSVGPathSegLinetoAbs", + "createSVGPathSegLinetoHorizontalAbs", + "createSVGPathSegLinetoHorizontalRel", + "createSVGPathSegLinetoRel", + "createSVGPathSegLinetoVerticalAbs", + "createSVGPathSegLinetoVerticalRel", + "createSVGPathSegMovetoAbs", + "createSVGPathSegMovetoRel", + "createSVGPoint", + "createSVGRect", + "createSVGTransform", + "createSVGTransformFromMatrix", + "createScriptProcessor", + "createSession", + "createShader", + "createShadowRoot", + "createStereoPanner", + "createStyleSheet", + "createTBody", + "createTFoot", + "createTHead", + "createTextNode", + "createTextRange", + "createTexture", + "createTouch", + "createTouchList", + "createTreeWalker", + "createWaveShaper", + "creationTime", + "crossOrigin", + "crypto", + "csi", + "cssFloat", + "cssRules", + "cssText", + "cssValueType", + "ctrlKey", + "ctrlLeft", + "cues", + "cullFace", + "currentNode", + "currentPage", + "currentScale", + "currentScript", + "currentSrc", + "currentState", + "currentStyle", + "currentTarget", + "currentTime", + "currentTranslate", + "currentView", + "cursor", + "curve", + "customError", + "cx", + "cy", + "d", + "data", + "dataFld", + "dataFormatAs", + "dataPageSize", + "dataSrc", + "dataTransfer", + "database", + "dataset", + "dateTime", + "db", + "debug", + "debuggerEnabled", + "declare", + "decode", + "decodeAudioData", + "decodeURI", + "decodeURIComponent", + "decrypt", + "default", + "defaultCharset", + "defaultChecked", + "defaultMuted", + "defaultPlaybackRate", + "defaultPrevented", + "defaultSelected", + "defaultStatus", + "defaultURL", + "defaultValue", + "defaultView", + "defaultstatus", + "defer", + "defineMagicFunction", + "defineMagicVariable", + "defineProperties", + "defineProperty", + "delayTime", + "delete", + "deleteBuffer", + "deleteCaption", + "deleteCell", + "deleteContents", + "deleteData", + "deleteDatabase", + "deleteFramebuffer", + "deleteFromDocument", + "deleteIndex", + "deleteMedium", + "deleteObjectStore", + "deleteProgram", + "deleteRenderbuffer", + "deleteRow", + "deleteRule", + "deleteShader", + "deleteTFoot", + "deleteTHead", + "deleteTexture", + "deliverChangeRecords", + "delivery", + "deliveryInfo", + "deliveryStatus", + "deliveryTimestamp", + "delta", + "deltaMode", + "deltaX", + "deltaY", + "deltaZ", + "depthFunc", + "depthMask", + "depthRange", + "deriveBits", + "deriveKey", + "description", + "deselectAll", + "designMode", + "destination", + "destinationURL", + "detach", + "detachEvent", + "detachShader", + "detail", + "detune", + "devicePixelRatio", + "deviceXDPI", + "deviceYDPI", + "diffuseConstant", + "digest", + "dimensions", + "dir", + "dirName", + "direction", + "dirxml", + "disable", + "disableVertexAttribArray", + "disabled", + "dischargingTime", + "disconnect", + "dispatchEvent", + "display", + "distanceModel", + "divisor", + "djsapi", + "djsproxy", + "doImport", + "doNotTrack", + "doScroll", + "doctype", + "document", + "documentElement", + "documentMode", + "documentURI", + "dolphin", + "dolphinGameCenter", + "dolphininfo", + "dolphinmeta", + "domComplete", + "domContentLoadedEventEnd", + "domContentLoadedEventStart", + "domInteractive", + "domLoading", + "domain", + "domainLookupEnd", + "domainLookupStart", + "dominant-baseline", + "dominantBaseline", + "done", + "dopplerFactor", + "download", + "dragDrop", + "draggable", + "drawArrays", + "drawArraysInstancedANGLE", + "drawCustomFocusRing", + "drawElements", + "drawElementsInstancedANGLE", + "drawFocusIfNeeded", + "drawImage", + "drawImageFromRect", + "drawSystemFocusRing", + "drawingBufferHeight", + "drawingBufferWidth", + "dropEffect", + "droppedVideoFrames", + "dropzone", + "dump", + "duplicate", + "duration", + "dvname", + "dvnum", + "dx", + "dy", + "dynsrc", + "e", + "edgeMode", + "effectAllowed", + "elapsedTime", + "elementFromPoint", + "elements", + "elevation", + "ellipse", + "email", + "embeds", + "empty", + "empty-cells", + "emptyCells", + "enable", + "enableBackground", + "enableStyleSheetsForSet", + "enableVertexAttribArray", + "enabled", + "enabledPlugin", + "encode", + "encodeURI", + "encodeURIComponent", + "encoding", + "encrypt", + "enctype", + "end", + "endContainer", + "endElement", + "endElementAt", + "endOfStream", + "endOffset", + "endTime", + "ended", + "endsWith", + "entities", + "entries", + "entryType", + "enumerate", + "enumerateEditable", + "error", + "errorCode", + "escape", + "eval", + "evaluate", + "event", + "eventPhase", + "every", + "exception", + "exec", + "execCommand", + "execCommandShowHelp", + "execScript", + "exitFullscreen", + "exitPointerLock", + "exp", + "expand", + "expandEntityReferences", + "expando", + "expansion", + "expiryDate", + "explicitOriginalTarget", + "expm1", + "exponent", + "exponentialRampToValueAtTime", + "exportKey", + "extend", + "extensions", + "extentNode", + "extentOffset", + "external", + "externalResourcesRequired", + "extractContents", + "extractable", + "f", + "face", + "factoryReset", + "fallback", + "familyName", + "farthestViewportElement", + "fastSeek", + "fatal", + "fetch", + "fetchStart", + "fftSize", + "fgColor", + "fileCreatedDate", + "fileHandle", + "fileModifiedDate", + "fileName", + "fileSize", + "fileUpdatedDate", + "filename", + "files", + "fill", + "fill-opacity", + "fill-rule", + "fillOpacity", + "fillRect", + "fillRule", + "fillStyle", + "fillText", + "filter", + "filterResX", + "filterResY", + "filterUnits", + "filters", + "find", + "findIndex", + "findRule", + "findText", + "finish", + "fireEvent", + "firstChild", + "firstElementChild", + "firstPage", + "fixed", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "flexBasis", + "flexDirection", + "flexFlow", + "flexGrow", + "flexShrink", + "flexWrap", + "flipX", + "flipY", + "float", + "flood-color", + "flood-opacity", + "floodColor", + "floodOpacity", + "floor", + "flush", + "focus", + "focusNode", + "focusOffset", + "font", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-weight", + "fontFamily", + "fontFeatureSettings", + "fontKerning", + "fontLanguageOverride", + "fontSize", + "fontSizeAdjust", + "fontSmoothingEnabled", + "fontStretch", + "fontStyle", + "fontSynthesis", + "fontVariant", + "fontVariantAlternates", + "fontVariantCaps", + "fontVariantEastAsian", + "fontVariantLigatures", + "fontVariantNumeric", + "fontVariantPosition", + "fontWeight", + "fontcolor", + "fonts", + "fontsize", + "for", + "forEach", + "forceRedraw", + "form", + "formAction", + "formEnctype", + "formMethod", + "formNoValidate", + "formTarget", + "format", + "forms", + "forward", + "fr", + "frame", + "frameBorder", + "frameElement", + "frameSpacing", + "framebufferRenderbuffer", + "framebufferTexture2D", + "frames", + "freeSpace", + "freeze", + "frequency", + "frequencyBinCount", + "from", + "fromCharCode", + "fromCodePoint", + "fromElement", + "frontFace", + "fround", + "fullScreen", + "fullscreenElement", + "fullscreenEnabled", + "fx", + "fy", + "gain", + "gamepad", + "gamma", + "genderIdentity", + "generateKey", + "generateMipmap", + "generateRequest", + "geolocation", + "gestureObject", + "get", + "getActiveAttrib", + "getActiveUniform", + "getAdjacentText", + "getAll", + "getAllResponseHeaders", + "getAsFile", + "getAsString", + "getAttachedShaders", + "getAttribLocation", + "getAttribute", + "getAttributeNS", + "getAttributeNode", + "getAttributeNodeNS", + "getAudioTracks", + "getBBox", + "getBattery", + "getBlob", + "getBookmark", + "getBoundingClientRect", + "getBufferParameter", + "getByteFrequencyData", + "getByteTimeDomainData", + "getCSSCanvasContext", + "getCTM", + "getCandidateWindowClientRect", + "getChannelData", + "getCharNumAtPosition", + "getClientRect", + "getClientRects", + "getCompositionAlternatives", + "getComputedStyle", + "getComputedTextLength", + "getConfiguration", + "getContext", + "getContextAttributes", + "getCounterValue", + "getCueAsHTML", + "getCueById", + "getCurrentPosition", + "getCurrentTime", + "getData", + "getDatabaseNames", + "getDate", + "getDay", + "getDefaultComputedStyle", + "getDestinationInsertionPoints", + "getDistributedNodes", + "getEditable", + "getElementById", + "getElementsByClassName", + "getElementsByName", + "getElementsByTagName", + "getElementsByTagNameNS", + "getEnclosureList", + "getEndPositionOfChar", + "getEntries", + "getEntriesByName", + "getEntriesByType", + "getError", + "getExtension", + "getExtentOfChar", + "getFeature", + "getFile", + "getFloat32", + "getFloat64", + "getFloatFrequencyData", + "getFloatTimeDomainData", + "getFloatValue", + "getFramebufferAttachmentParameter", + "getFrequencyResponse", + "getFullYear", + "getGamepads", + "getHours", + "getImageData", + "getInt16", + "getInt32", + "getInt8", + "getIntersectionList", + "getItem", + "getItems", + "getKey", + "getLineDash", + "getLocalStreams", + "getMarks", + "getMatchedCSSRules", + "getMeasures", + "getMetadata", + "getMilliseconds", + "getMinutes", + "getModifierState", + "getMonth", + "getNamedItem", + "getNamedItemNS", + "getNotifier", + "getNumberOfChars", + "getOverrideHistoryNavigationMode", + "getOverrideStyle", + "getOwnPropertyDescriptor", + "getOwnPropertyNames", + "getOwnPropertySymbols", + "getParameter", + "getPathSegAtLength", + "getPointAtLength", + "getPreference", + "getPreferenceDefault", + "getPresentationAttribute", + "getPreventDefault", + "getProgramInfoLog", + "getProgramParameter", + "getPropertyCSSValue", + "getPropertyPriority", + "getPropertyShorthand", + "getPropertyValue", + "getPrototypeOf", + "getRGBColorValue", + "getRandomValues", + "getRangeAt", + "getReceivers", + "getRectValue", + "getRegistration", + "getRemoteStreams", + "getRenderbufferParameter", + "getResponseHeader", + "getRoot", + "getRotationOfChar", + "getSVGDocument", + "getScreenCTM", + "getSeconds", + "getSelection", + "getSenders", + "getShaderInfoLog", + "getShaderParameter", + "getShaderPrecisionFormat", + "getShaderSource", + "getSimpleDuration", + "getSiteIcons", + "getSources", + "getSpeculativeParserUrls", + "getStartPositionOfChar", + "getStartTime", + "getStats", + "getStorageUpdates", + "getStreamById", + "getStringValue", + "getSubStringLength", + "getSubscription", + "getSupportedExtensions", + "getTexParameter", + "getTime", + "getTimezoneOffset", + "getTotalLength", + "getTrackById", + "getTracks", + "getTransformToElement", + "getUTCDate", + "getUTCDay", + "getUTCFullYear", + "getUTCHours", + "getUTCMilliseconds", + "getUTCMinutes", + "getUTCMonth", + "getUTCSeconds", + "getUint16", + "getUint32", + "getUint8", + "getUniform", + "getUniformLocation", + "getUserMedia", + "getValues", + "getVarDate", + "getVariableValue", + "getVertexAttrib", + "getVertexAttribOffset", + "getVideoPlaybackQuality", + "getVideoTracks", + "getWakeLockState", + "getYear", + "givenName", + "global", + "globalAlpha", + "globalCompositeOperation", + "glyphOrientationHorizontal", + "glyphOrientationVertical", + "glyphRef", + "go", + "gradientTransform", + "gradientUnits", + "grammars", + "green", + "group", + "groupCollapsed", + "groupEnd", + "hardwareConcurrency", + "has", + "hasAttribute", + "hasAttributeNS", + "hasAttributes", + "hasChildNodes", + "hasComposition", + "hasExtension", + "hasFeature", + "hasFocus", + "hasLayout", + "hasOwnProperty", + "hash", + "head", + "headers", + "heading", + "height", + "hidden", + "hide", + "hideFocus", + "high", + "hint", + "history", + "honorificPrefix", + "honorificSuffix", + "horizontalOverflow", + "host", + "hostname", + "href", + "hreflang", + "hspace", + "html5TagCheckInerface", + "htmlFor", + "htmlText", + "httpEquiv", + "hwTimestamp", + "hypot", + "iccId", + "iceConnectionState", + "iceGatheringState", + "icon", + "id", + "identifier", + "identity", + "ignoreBOM", + "ignoreCase", + "image-orientation", + "image-rendering", + "imageOrientation", + "imageRendering", + "images", + "ime-mode", + "imeMode", + "implementation", + "importKey", + "importNode", + "importStylesheet", + "imports", + "impp", + "imul", + "in1", + "in2", + "inBandMetadataTrackDispatchType", + "inRange", + "includes", + "incremental", + "indeterminate", + "index", + "indexNames", + "indexOf", + "indexedDB", + "inertiaDestinationX", + "inertiaDestinationY", + "info", + "init", + "initAnimationEvent", + "initBeforeLoadEvent", + "initClipboardEvent", + "initCloseEvent", + "initCommandEvent", + "initCompositionEvent", + "initCustomEvent", + "initData", + "initDeviceMotionEvent", + "initDeviceOrientationEvent", + "initDragEvent", + "initErrorEvent", + "initEvent", + "initFocusEvent", + "initGestureEvent", + "initHashChangeEvent", + "initKeyEvent", + "initKeyboardEvent", + "initMSManipulationEvent", + "initMessageEvent", + "initMouseEvent", + "initMouseScrollEvent", + "initMouseWheelEvent", + "initMutationEvent", + "initNSMouseEvent", + "initOverflowEvent", + "initPageEvent", + "initPageTransitionEvent", + "initPointerEvent", + "initPopStateEvent", + "initProgressEvent", + "initScrollAreaEvent", + "initSimpleGestureEvent", + "initStorageEvent", + "initTextEvent", + "initTimeEvent", + "initTouchEvent", + "initTransitionEvent", + "initUIEvent", + "initWebKitAnimationEvent", + "initWebKitTransitionEvent", + "initWebKitWheelEvent", + "initWheelEvent", + "initialTime", + "initialize", + "initiatorType", + "inner", + "innerHTML", + "innerHeight", + "innerText", + "innerWidth", + "input", + "inputBuffer", + "inputEncoding", + "inputMethod", + "insertAdjacentElement", + "insertAdjacentHTML", + "insertAdjacentText", + "insertBefore", + "insertCell", + "insertData", + "insertItemBefore", + "insertNode", + "insertRow", + "insertRule", + "instanceRoot", + "intercept", + "interimResults", + "internalSubset", + "intersectsNode", + "interval", + "invalidIteratorState", + "inverse", + "invertSelf", + "is", + "is2D", + "isAlternate", + "isArray", + "isBingCurrentSearchDefault", + "isBuffer", + "isCandidateWindowVisible", + "isChar", + "isCollapsed", + "isComposing", + "isContentEditable", + "isContentHandlerRegistered", + "isContextLost", + "isDefaultNamespace", + "isDisabled", + "isEnabled", + "isEqual", + "isEqualNode", + "isExtensible", + "isFinite", + "isFramebuffer", + "isFrozen", + "isGenerator", + "isId", + "isInjected", + "isInteger", + "isMap", + "isMultiLine", + "isNaN", + "isOpen", + "isPointInFill", + "isPointInPath", + "isPointInRange", + "isPointInStroke", + "isPrefAlternate", + "isPrimary", + "isProgram", + "isPropertyImplicit", + "isProtocolHandlerRegistered", + "isPrototypeOf", + "isRenderbuffer", + "isSafeInteger", + "isSameNode", + "isSealed", + "isShader", + "isSupported", + "isTextEdit", + "isTexture", + "isTrusted", + "isTypeSupported", + "isView", + "isolation", + "italics", + "item", + "itemId", + "itemProp", + "itemRef", + "itemScope", + "itemType", + "itemValue", + "iterateNext", + "iterator", + "javaEnabled", + "jobTitle", + "join", + "json", + "justify-content", + "justifyContent", + "k1", + "k2", + "k3", + "k4", + "kernelMatrix", + "kernelUnitLengthX", + "kernelUnitLengthY", + "kerning", + "key", + "keyCode", + "keyFor", + "keyIdentifier", + "keyLightEnabled", + "keyLocation", + "keyPath", + "keySystem", + "keyText", + "keyUsage", + "keys", + "keytype", + "kind", + "knee", + "label", + "labels", + "lang", + "language", + "languages", + "largeArcFlag", + "lastChild", + "lastElementChild", + "lastEventId", + "lastIndex", + "lastIndexOf", + "lastMatch", + "lastMessageSubject", + "lastMessageType", + "lastModified", + "lastModifiedDate", + "lastPage", + "lastParen", + "lastState", + "lastStyleSheetSet", + "latitude", + "layerX", + "layerY", + "layoutFlow", + "layoutGrid", + "layoutGridChar", + "layoutGridLine", + "layoutGridMode", + "layoutGridType", + "lbound", + "left", + "leftContext", + "leftMargin", + "length", + "lengthAdjust", + "lengthComputable", + "letter-spacing", + "letterSpacing", + "level", + "lighting-color", + "lightingColor", + "limitingConeAngle", + "line", + "line-height", + "lineAlign", + "lineBreak", + "lineCap", + "lineDashOffset", + "lineHeight", + "lineJoin", + "lineNumber", + "lineTo", + "lineWidth", + "linearRampToValueAtTime", + "lineno", + "link", + "linkColor", + "linkProgram", + "links", + "list", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "listStyle", + "listStyleImage", + "listStylePosition", + "listStyleType", + "listener", + "load", + "loadEventEnd", + "loadEventStart", + "loadTimes", + "loaded", + "localDescription", + "localName", + "localStorage", + "locale", + "localeCompare", + "location", + "locationbar", + "lock", + "lockedFile", + "log", + "log10", + "log1p", + "log2", + "logicalXDPI", + "logicalYDPI", + "longDesc", + "longitude", + "lookupNamespaceURI", + "lookupPrefix", + "loop", + "loopEnd", + "loopStart", + "looping", + "low", + "lower", + "lowerBound", + "lowerOpen", + "lowsrc", + "m11", + "m12", + "m13", + "m14", + "m21", + "m22", + "m23", + "m24", + "m31", + "m32", + "m33", + "m34", + "m41", + "m42", + "m43", + "m44", + "manifest", + "map", + "mapping", + "margin", + "margin-bottom", + "margin-left", + "margin-right", + "margin-top", + "marginBottom", + "marginHeight", + "marginLeft", + "marginRight", + "marginTop", + "marginWidth", + "mark", + "marker", + "marker-end", + "marker-mid", + "marker-offset", + "marker-start", + "markerEnd", + "markerHeight", + "markerMid", + "markerOffset", + "markerStart", + "markerUnits", + "markerWidth", + "marks", + "mask", + "mask-type", + "maskContentUnits", + "maskType", + "maskUnits", + "match", + "matchMedia", + "matchMedium", + "matches", + "matrix", + "matrixTransform", + "max", + "max-height", + "max-width", + "maxAlternatives", + "maxChannelCount", + "maxConnectionsPerServer", + "maxDecibels", + "maxDistance", + "maxHeight", + "maxLength", + "maxTouchPoints", + "maxValue", + "maxWidth", + "measure", + "measureText", + "media", + "mediaDevices", + "mediaElement", + "mediaGroup", + "mediaKeys", + "mediaText", + "meetOrSlice", + "memory", + "menubar", + "mergeAttributes", + "message", + "messageClass", + "messageHandlers", + "metaKey", + "method", + "mimeType", + "mimeTypes", + "min", + "min-height", + "min-width", + "minDecibels", + "minHeight", + "minValue", + "minWidth", + "miterLimit", + "mix-blend-mode", + "mixBlendMode", + "mode", + "modify", + "mount", + "move", + "moveBy", + "moveEnd", + "moveFirst", + "moveFocusDown", + "moveFocusLeft", + "moveFocusRight", + "moveFocusUp", + "moveNext", + "moveRow", + "moveStart", + "moveTo", + "moveToBookmark", + "moveToElementText", + "moveToPoint", + "mozAdd", + "mozAnimationStartTime", + "mozAnon", + "mozApps", + "mozAudioCaptured", + "mozAudioChannelType", + "mozAutoplayEnabled", + "mozCancelAnimationFrame", + "mozCancelFullScreen", + "mozCancelRequestAnimationFrame", + "mozCaptureStream", + "mozCaptureStreamUntilEnded", + "mozClearDataAt", + "mozContact", + "mozContacts", + "mozCreateFileHandle", + "mozCurrentTransform", + "mozCurrentTransformInverse", + "mozCursor", + "mozDash", + "mozDashOffset", + "mozDecodedFrames", + "mozExitPointerLock", + "mozFillRule", + "mozFragmentEnd", + "mozFrameDelay", + "mozFullScreen", + "mozFullScreenElement", + "mozFullScreenEnabled", + "mozGetAll", + "mozGetAllKeys", + "mozGetAsFile", + "mozGetDataAt", + "mozGetMetadata", + "mozGetUserMedia", + "mozHasAudio", + "mozHasItem", + "mozHidden", + "mozImageSmoothingEnabled", + "mozIndexedDB", + "mozInnerScreenX", + "mozInnerScreenY", + "mozInputSource", + "mozIsTextField", + "mozItem", + "mozItemCount", + "mozItems", + "mozLength", + "mozLockOrientation", + "mozMatchesSelector", + "mozMovementX", + "mozMovementY", + "mozOpaque", + "mozOrientation", + "mozPaintCount", + "mozPaintedFrames", + "mozParsedFrames", + "mozPay", + "mozPointerLockElement", + "mozPresentedFrames", + "mozPreservesPitch", + "mozPressure", + "mozPrintCallback", + "mozRTCIceCandidate", + "mozRTCPeerConnection", + "mozRTCSessionDescription", + "mozRemove", + "mozRequestAnimationFrame", + "mozRequestFullScreen", + "mozRequestPointerLock", + "mozSetDataAt", + "mozSetImageElement", + "mozSourceNode", + "mozSrcObject", + "mozSystem", + "mozTCPSocket", + "mozTextStyle", + "mozTypesAt", + "mozUnlockOrientation", + "mozUserCancelled", + "mozVisibilityState", + "msAnimation", + "msAnimationDelay", + "msAnimationDirection", + "msAnimationDuration", + "msAnimationFillMode", + "msAnimationIterationCount", + "msAnimationName", + "msAnimationPlayState", + "msAnimationStartTime", + "msAnimationTimingFunction", + "msBackfaceVisibility", + "msBlockProgression", + "msCSSOMElementFloatMetrics", + "msCaching", + "msCachingEnabled", + "msCancelRequestAnimationFrame", + "msCapsLockWarningOff", + "msClearImmediate", + "msClose", + "msContentZoomChaining", + "msContentZoomFactor", + "msContentZoomLimit", + "msContentZoomLimitMax", + "msContentZoomLimitMin", + "msContentZoomSnap", + "msContentZoomSnapPoints", + "msContentZoomSnapType", + "msContentZooming", + "msConvertURL", + "msCrypto", + "msDoNotTrack", + "msElementsFromPoint", + "msElementsFromRect", + "msExitFullscreen", + "msExtendedCode", + "msFillRule", + "msFirstPaint", + "msFlex", + "msFlexAlign", + "msFlexDirection", + "msFlexFlow", + "msFlexItemAlign", + "msFlexLinePack", + "msFlexNegative", + "msFlexOrder", + "msFlexPack", + "msFlexPositive", + "msFlexPreferredSize", + "msFlexWrap", + "msFlowFrom", + "msFlowInto", + "msFontFeatureSettings", + "msFullscreenElement", + "msFullscreenEnabled", + "msGetInputContext", + "msGetRegionContent", + "msGetUntransformedBounds", + "msGraphicsTrustStatus", + "msGridColumn", + "msGridColumnAlign", + "msGridColumnSpan", + "msGridColumns", + "msGridRow", + "msGridRowAlign", + "msGridRowSpan", + "msGridRows", + "msHidden", + "msHighContrastAdjust", + "msHyphenateLimitChars", + "msHyphenateLimitLines", + "msHyphenateLimitZone", + "msHyphens", + "msImageSmoothingEnabled", + "msImeAlign", + "msIndexedDB", + "msInterpolationMode", + "msIsStaticHTML", + "msKeySystem", + "msKeys", + "msLaunchUri", + "msLockOrientation", + "msManipulationViewsEnabled", + "msMatchMedia", + "msMatchesSelector", + "msMaxTouchPoints", + "msOrientation", + "msOverflowStyle", + "msPerspective", + "msPerspectiveOrigin", + "msPlayToDisabled", + "msPlayToPreferredSourceUri", + "msPlayToPrimary", + "msPointerEnabled", + "msRegionOverflow", + "msReleasePointerCapture", + "msRequestAnimationFrame", + "msRequestFullscreen", + "msSaveBlob", + "msSaveOrOpenBlob", + "msScrollChaining", + "msScrollLimit", + "msScrollLimitXMax", + "msScrollLimitXMin", + "msScrollLimitYMax", + "msScrollLimitYMin", + "msScrollRails", + "msScrollSnapPointsX", + "msScrollSnapPointsY", + "msScrollSnapType", + "msScrollSnapX", + "msScrollSnapY", + "msScrollTranslation", + "msSetImmediate", + "msSetMediaKeys", + "msSetPointerCapture", + "msTextCombineHorizontal", + "msTextSizeAdjust", + "msToBlob", + "msTouchAction", + "msTouchSelect", + "msTraceAsyncCallbackCompleted", + "msTraceAsyncCallbackStarting", + "msTraceAsyncOperationCompleted", + "msTraceAsyncOperationStarting", + "msTransform", + "msTransformOrigin", + "msTransformStyle", + "msTransition", + "msTransitionDelay", + "msTransitionDuration", + "msTransitionProperty", + "msTransitionTimingFunction", + "msUnlockOrientation", + "msUpdateAsyncCallbackRelation", + "msUserSelect", + "msVisibilityState", + "msWrapFlow", + "msWrapMargin", + "msWrapThrough", + "msWriteProfilerMark", + "msZoom", + "msZoomTo", + "mt", + "multiEntry", + "multiSelectionObj", + "multiline", + "multiple", + "multiply", + "multiplySelf", + "mutableFile", + "muted", + "n", + "name", + "nameProp", + "namedItem", + "namedRecordset", + "names", + "namespaceURI", + "namespaces", + "naturalHeight", + "naturalWidth", + "navigate", + "navigation", + "navigationMode", + "navigationStart", + "navigator", + "near", + "nearestViewportElement", + "negative", + "netscape", + "networkState", + "newScale", + "newTranslate", + "newURL", + "newValue", + "newValueSpecifiedUnits", + "newVersion", + "newhome", + "next", + "nextElementSibling", + "nextNode", + "nextPage", + "nextSibling", + "nickname", + "noHref", + "noResize", + "noShade", + "noValidate", + "noWrap", + "nodeName", + "nodeType", + "nodeValue", + "normalize", + "normalizedPathSegList", + "notationName", + "notations", + "note", + "noteGrainOn", + "noteOff", + "noteOn", + "now", + "numOctaves", + "number", + "numberOfChannels", + "numberOfInputs", + "numberOfItems", + "numberOfOutputs", + "numberValue", + "oMatchesSelector", + "object", + "object-fit", + "object-position", + "objectFit", + "objectPosition", + "objectStore", + "objectStoreNames", + "observe", + "of", + "offscreenBuffering", + "offset", + "offsetHeight", + "offsetLeft", + "offsetNode", + "offsetParent", + "offsetTop", + "offsetWidth", + "offsetX", + "offsetY", + "ok", + "oldURL", + "oldValue", + "oldVersion", + "olderShadowRoot", + "onLine", + "onabort", + "onactivate", + "onactive", + "onaddstream", + "onaddtrack", + "onafterprint", + "onafterscriptexecute", + "onafterupdate", + "onaudioend", + "onaudioprocess", + "onaudiostart", + "onautocomplete", + "onautocompleteerror", + "onbeforeactivate", + "onbeforecopy", + "onbeforecut", + "onbeforedeactivate", + "onbeforeeditfocus", + "onbeforepaste", + "onbeforeprint", + "onbeforescriptexecute", + "onbeforeunload", + "onbeforeupdate", + "onblocked", + "onblur", + "onbounce", + "onboundary", + "oncached", + "oncancel", + "oncandidatewindowhide", + "oncandidatewindowshow", + "oncandidatewindowupdate", + "oncanplay", + "oncanplaythrough", + "oncellchange", + "onchange", + "onchargingchange", + "onchargingtimechange", + "onchecking", + "onclick", + "onclose", + "oncompassneedscalibration", + "oncomplete", + "oncontextmenu", + "oncontrolselect", + "oncopy", + "oncuechange", + "oncut", + "ondataavailable", + "ondatachannel", + "ondatasetchanged", + "ondatasetcomplete", + "ondblclick", + "ondeactivate", + "ondevicelight", + "ondevicemotion", + "ondeviceorientation", + "ondeviceproximity", + "ondischargingtimechange", + "ondisplay", + "ondownloading", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onencrypted", + "onend", + "onended", + "onenter", + "onerror", + "onerrorupdate", + "onexit", + "onfilterchange", + "onfinish", + "onfocus", + "onfocusin", + "onfocusout", + "onfullscreenchange", + "onfullscreenerror", + "ongesturechange", + "ongestureend", + "ongesturestart", + "ongotpointercapture", + "onhashchange", + "onhelp", + "onicecandidate", + "oniceconnectionstatechange", + "oninactive", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onlanguagechange", + "onlayoutcomplete", + "onlevelchange", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadend", + "onloadstart", + "onlosecapture", + "onlostpointercapture", + "only", + "onmark", + "onmessage", + "onmousedown", + "onmouseenter", + "onmouseleave", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onmove", + "onmoveend", + "onmovestart", + "onmozfullscreenchange", + "onmozfullscreenerror", + "onmozorientationchange", + "onmozpointerlockchange", + "onmozpointerlockerror", + "onmscontentzoom", + "onmsfullscreenchange", + "onmsfullscreenerror", + "onmsgesturechange", + "onmsgesturedoubletap", + "onmsgestureend", + "onmsgesturehold", + "onmsgesturestart", + "onmsgesturetap", + "onmsgotpointercapture", + "onmsinertiastart", + "onmslostpointercapture", + "onmsmanipulationstatechanged", + "onmsneedkey", + "onmsorientationchange", + "onmspointercancel", + "onmspointerdown", + "onmspointerenter", + "onmspointerhover", + "onmspointerleave", + "onmspointermove", + "onmspointerout", + "onmspointerover", + "onmspointerup", + "onmssitemodejumplistitemremoved", + "onmsthumbnailclick", + "onnegotiationneeded", + "onnomatch", + "onnoupdate", + "onobsolete", + "onoffline", + "ononline", + "onopen", + "onorientationchange", + "onpagechange", + "onpagehide", + "onpageshow", + "onpaste", + "onpause", + "onplay", + "onplaying", + "onpluginstreamstart", + "onpointercancel", + "onpointerdown", + "onpointerenter", + "onpointerleave", + "onpointerlockchange", + "onpointerlockerror", + "onpointermove", + "onpointerout", + "onpointerover", + "onpointerup", + "onpopstate", + "onprogress", + "onpropertychange", + "onratechange", + "onreadystatechange", + "onremovestream", + "onremovetrack", + "onreset", + "onresize", + "onresizeend", + "onresizestart", + "onresourcetimingbufferfull", + "onresult", + "onresume", + "onrowenter", + "onrowexit", + "onrowsdelete", + "onrowsinserted", + "onscroll", + "onsearch", + "onseeked", + "onseeking", + "onselect", + "onselectionchange", + "onselectstart", + "onshow", + "onsignalingstatechange", + "onsoundend", + "onsoundstart", + "onspeechend", + "onspeechstart", + "onstalled", + "onstart", + "onstatechange", + "onstop", + "onstorage", + "onstoragecommit", + "onsubmit", + "onsuccess", + "onsuspend", + "ontextinput", + "ontimeout", + "ontimeupdate", + "ontoggle", + "ontouchcancel", + "ontouchend", + "ontouchmove", + "ontouchstart", + "ontransitionend", + "onunload", + "onupdateready", + "onupgradeneeded", + "onuserproximity", + "onversionchange", + "onvoiceschanged", + "onvolumechange", + "onwaiting", + "onwarning", + "onwebkitanimationend", + "onwebkitanimationiteration", + "onwebkitanimationstart", + "onwebkitcurrentplaybacktargetiswirelesschanged", + "onwebkitfullscreenchange", + "onwebkitfullscreenerror", + "onwebkitkeyadded", + "onwebkitkeyerror", + "onwebkitkeymessage", + "onwebkitneedkey", + "onwebkitorientationchange", + "onwebkitplaybacktargetavailabilitychanged", + "onwebkitpointerlockchange", + "onwebkitpointerlockerror", + "onwebkitresourcetimingbufferfull", + "onwebkittransitionend", + "onwheel", + "onzoom", + "opacity", + "open", + "openCursor", + "openDatabase", + "openKeyCursor", + "opener", + "opera", + "operationType", + "operator", + "opr", + "optimum", + "options", + "order", + "orderX", + "orderY", + "ordered", + "org", + "orient", + "orientAngle", + "orientType", + "orientation", + "origin", + "originalTarget", + "orphans", + "oscpu", + "outerHTML", + "outerHeight", + "outerText", + "outerWidth", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "outlineColor", + "outlineOffset", + "outlineStyle", + "outlineWidth", + "outputBuffer", + "overflow", + "overflow-x", + "overflow-y", + "overflowX", + "overflowY", + "overrideMimeType", + "oversample", + "ownerDocument", + "ownerElement", + "ownerNode", + "ownerRule", + "ownerSVGElement", + "owningElement", + "p1", + "p2", + "p3", + "p4", + "pad", + "padding", + "padding-bottom", + "padding-left", + "padding-right", + "padding-top", + "paddingBottom", + "paddingLeft", + "paddingRight", + "paddingTop", + "page", + "page-break-after", + "page-break-before", + "page-break-inside", + "pageBreakAfter", + "pageBreakBefore", + "pageBreakInside", + "pageCount", + "pageX", + "pageXOffset", + "pageY", + "pageYOffset", + "pages", + "paint-order", + "paintOrder", + "paintRequests", + "paintType", + "palette", + "panningModel", + "parent", + "parentElement", + "parentNode", + "parentRule", + "parentStyleSheet", + "parentTextEdit", + "parentWindow", + "parse", + "parseFloat", + "parseFromString", + "parseInt", + "participants", + "password", + "pasteHTML", + "path", + "pathLength", + "pathSegList", + "pathSegType", + "pathSegTypeAsLetter", + "pathname", + "pattern", + "patternContentUnits", + "patternMismatch", + "patternTransform", + "patternUnits", + "pause", + "pauseAnimations", + "pauseOnExit", + "paused", + "pending", + "performance", + "permission", + "persisted", + "personalbar", + "perspective", + "perspective-origin", + "perspectiveOrigin", + "phoneticFamilyName", + "phoneticGivenName", + "photo", + "ping", + "pitch", + "pixelBottom", + "pixelDepth", + "pixelHeight", + "pixelLeft", + "pixelRight", + "pixelStorei", + "pixelTop", + "pixelUnitToMillimeterX", + "pixelUnitToMillimeterY", + "pixelWidth", + "placeholder", + "platform", + "play", + "playbackRate", + "playbackState", + "playbackTime", + "played", + "plugins", + "pluginspage", + "pname", + "pointer-events", + "pointerBeforeReferenceNode", + "pointerEnabled", + "pointerEvents", + "pointerId", + "pointerLockElement", + "pointerType", + "points", + "pointsAtX", + "pointsAtY", + "pointsAtZ", + "polygonOffset", + "pop", + "popupWindowFeatures", + "popupWindowName", + "popupWindowURI", + "port", + "port1", + "port2", + "ports", + "posBottom", + "posHeight", + "posLeft", + "posRight", + "posTop", + "posWidth", + "position", + "positionAlign", + "postError", + "postMessage", + "poster", + "pow", + "powerOff", + "preMultiplySelf", + "precision", + "preferredStyleSheetSet", + "preferredStylesheetSet", + "prefix", + "preload", + "preserveAlpha", + "preserveAspectRatio", + "preserveAspectRatioString", + "pressed", + "pressure", + "prevValue", + "preventDefault", + "preventExtensions", + "previousElementSibling", + "previousNode", + "previousPage", + "previousScale", + "previousSibling", + "previousTranslate", + "primaryKey", + "primitiveType", + "primitiveUnits", + "principals", + "print", + "privateKey", + "probablySupportsContext", + "process", + "processIceMessage", + "product", + "productSub", + "profile", + "profileEnd", + "profiles", + "prompt", + "properties", + "propertyIsEnumerable", + "propertyName", + "protocol", + "protocolLong", + "prototype", + "pseudoClass", + "pseudoElement", + "publicId", + "publicKey", + "published", + "push", + "pushNotification", + "pushState", + "put", + "putImageData", + "quadraticCurveTo", + "qualifier", + "queryCommandEnabled", + "queryCommandIndeterm", + "queryCommandState", + "queryCommandSupported", + "queryCommandText", + "queryCommandValue", + "querySelector", + "querySelectorAll", + "quote", + "quotes", + "r", + "r1", + "r2", + "race", + "radiogroup", + "radiusX", + "radiusY", + "random", + "range", + "rangeCount", + "rangeMax", + "rangeMin", + "rangeOffset", + "rangeOverflow", + "rangeParent", + "rangeUnderflow", + "rate", + "ratio", + "raw", + "read", + "readAsArrayBuffer", + "readAsBinaryString", + "readAsBlob", + "readAsDataURL", + "readAsText", + "readOnly", + "readPixels", + "readReportRequested", + "readyState", + "reason", + "reboot", + "receiver", + "receivers", + "recordNumber", + "recordset", + "rect", + "red", + "redirectCount", + "redirectEnd", + "redirectStart", + "reduce", + "reduceRight", + "reduction", + "refDistance", + "refX", + "refY", + "referenceNode", + "referrer", + "refresh", + "region", + "regionAnchorX", + "regionAnchorY", + "regionId", + "regions", + "register", + "registerContentHandler", + "registerElement", + "registerProtocolHandler", + "reject", + "rel", + "relList", + "relatedNode", + "relatedTarget", + "release", + "releaseCapture", + "releaseEvents", + "releasePointerCapture", + "releaseShaderCompiler", + "reliable", + "reload", + "remainingSpace", + "remoteDescription", + "remove", + "removeAllRanges", + "removeAttribute", + "removeAttributeNS", + "removeAttributeNode", + "removeBehavior", + "removeChild", + "removeCue", + "removeEventListener", + "removeFilter", + "removeImport", + "removeItem", + "removeListener", + "removeNamedItem", + "removeNamedItemNS", + "removeNode", + "removeParameter", + "removeProperty", + "removeRange", + "removeRegion", + "removeRule", + "removeSiteSpecificTrackingException", + "removeSourceBuffer", + "removeStream", + "removeTrack", + "removeVariable", + "removeWakeLockListener", + "removeWebWideTrackingException", + "removedNodes", + "renderbufferStorage", + "renderedBuffer", + "renderingMode", + "repeat", + "replace", + "replaceAdjacentText", + "replaceChild", + "replaceData", + "replaceId", + "replaceItem", + "replaceNode", + "replaceState", + "replaceTrack", + "replaceWholeText", + "reportValidity", + "requestAnimationFrame", + "requestAutocomplete", + "requestData", + "requestFullscreen", + "requestMediaKeySystemAccess", + "requestPermission", + "requestPointerLock", + "requestStart", + "requestingWindow", + "required", + "requiredExtensions", + "requiredFeatures", + "reset", + "resetTransform", + "resize", + "resizeBy", + "resizeTo", + "resolve", + "response", + "responseBody", + "responseEnd", + "responseStart", + "responseText", + "responseType", + "responseURL", + "responseXML", + "restore", + "result", + "resultType", + "resume", + "returnValue", + "rev", + "reverse", + "reversed", + "revocable", + "revokeObjectURL", + "rgbColor", + "right", + "rightContext", + "rightMargin", + "rolloffFactor", + "root", + "rootElement", + "rotate", + "rotateAxisAngle", + "rotateAxisAngleSelf", + "rotateFromVector", + "rotateFromVectorSelf", + "rotateSelf", + "rotation", + "rotationRate", + "round", + "rowIndex", + "rowSpan", + "rows", + "rubyAlign", + "rubyOverhang", + "rubyPosition", + "rules", + "runtime", + "runtimeStyle", + "rx", + "ry", + "safari", + "sampleCoverage", + "sampleRate", + "sandbox", + "save", + "scale", + "scale3d", + "scale3dSelf", + "scaleNonUniform", + "scaleNonUniformSelf", + "scaleSelf", + "scheme", + "scissor", + "scope", + "scopeName", + "scoped", + "screen", + "screenBrightness", + "screenEnabled", + "screenLeft", + "screenPixelToMillimeterX", + "screenPixelToMillimeterY", + "screenTop", + "screenX", + "screenY", + "scripts", + "scroll", + "scroll-behavior", + "scrollAmount", + "scrollBehavior", + "scrollBy", + "scrollByLines", + "scrollByPages", + "scrollDelay", + "scrollHeight", + "scrollIntoView", + "scrollIntoViewIfNeeded", + "scrollLeft", + "scrollLeftMax", + "scrollMaxX", + "scrollMaxY", + "scrollTo", + "scrollTop", + "scrollTopMax", + "scrollWidth", + "scrollX", + "scrollY", + "scrollbar3dLightColor", + "scrollbarArrowColor", + "scrollbarBaseColor", + "scrollbarDarkShadowColor", + "scrollbarFaceColor", + "scrollbarHighlightColor", + "scrollbarShadowColor", + "scrollbarTrackColor", + "scrollbars", + "scrolling", + "sdp", + "sdpMLineIndex", + "sdpMid", + "seal", + "search", + "searchBox", + "searchBoxJavaBridge_", + "searchParams", + "sectionRowIndex", + "secureConnectionStart", + "security", + "seed", + "seekable", + "seeking", + "select", + "selectAllChildren", + "selectNode", + "selectNodeContents", + "selectNodes", + "selectSingleNode", + "selectSubString", + "selected", + "selectedIndex", + "selectedOptions", + "selectedStyleSheetSet", + "selectedStylesheetSet", + "selection", + "selectionDirection", + "selectionEnd", + "selectionStart", + "selector", + "selectorText", + "self", + "send", + "sendAsBinary", + "sendBeacon", + "sender", + "sentTimestamp", + "separator", + "serializeToString", + "serviceWorker", + "sessionId", + "sessionStorage", + "set", + "setActive", + "setAlpha", + "setAttribute", + "setAttributeNS", + "setAttributeNode", + "setAttributeNodeNS", + "setBaseAndExtent", + "setBingCurrentSearchDefault", + "setCapture", + "setColor", + "setCompositeOperation", + "setCurrentTime", + "setCustomValidity", + "setData", + "setDate", + "setDragImage", + "setEnd", + "setEndAfter", + "setEndBefore", + "setEndPoint", + "setFillColor", + "setFilterRes", + "setFloat32", + "setFloat64", + "setFloatValue", + "setFullYear", + "setHours", + "setImmediate", + "setInt16", + "setInt32", + "setInt8", + "setInterval", + "setItem", + "setLineCap", + "setLineDash", + "setLineJoin", + "setLineWidth", + "setLocalDescription", + "setMatrix", + "setMatrixValue", + "setMediaKeys", + "setMilliseconds", + "setMinutes", + "setMiterLimit", + "setMonth", + "setNamedItem", + "setNamedItemNS", + "setNonUserCodeExceptions", + "setOrientToAngle", + "setOrientToAuto", + "setOrientation", + "setOverrideHistoryNavigationMode", + "setPaint", + "setParameter", + "setPeriodicWave", + "setPointerCapture", + "setPosition", + "setPreference", + "setProperty", + "setPrototypeOf", + "setRGBColor", + "setRGBColorICCColor", + "setRadius", + "setRangeText", + "setRemoteDescription", + "setRequestHeader", + "setResizable", + "setResourceTimingBufferSize", + "setRotate", + "setScale", + "setSeconds", + "setSelectionRange", + "setServerCertificate", + "setShadow", + "setSkewX", + "setSkewY", + "setStart", + "setStartAfter", + "setStartBefore", + "setStdDeviation", + "setStringValue", + "setStrokeColor", + "setSuggestResult", + "setTargetAtTime", + "setTargetValueAtTime", + "setTime", + "setTimeout", + "setTransform", + "setTranslate", + "setUTCDate", + "setUTCFullYear", + "setUTCHours", + "setUTCMilliseconds", + "setUTCMinutes", + "setUTCMonth", + "setUTCSeconds", + "setUint16", + "setUint32", + "setUint8", + "setUri", + "setValueAtTime", + "setValueCurveAtTime", + "setVariable", + "setVelocity", + "setVersion", + "setYear", + "settingName", + "settingValue", + "sex", + "shaderSource", + "shadowBlur", + "shadowColor", + "shadowOffsetX", + "shadowOffsetY", + "shadowRoot", + "shape", + "shape-rendering", + "shapeRendering", + "sheet", + "shift", + "shiftKey", + "shiftLeft", + "show", + "showHelp", + "showModal", + "showModalDialog", + "showModelessDialog", + "showNotification", + "sidebar", + "sign", + "signalingState", + "sin", + "singleNodeValue", + "sinh", + "size", + "sizeToContent", + "sizes", + "skewX", + "skewXSelf", + "skewY", + "skewYSelf", + "slice", + "slope", + "small", + "smil", + "smoothingTimeConstant", + "snapToLines", + "snapshotItem", + "snapshotLength", + "some", + "sort", + "source", + "sourceBuffer", + "sourceBuffers", + "sourceIndex", + "spacing", + "span", + "speakAs", + "speaking", + "specified", + "specularConstant", + "specularExponent", + "speechSynthesis", + "speed", + "speedOfSound", + "spellcheck", + "splice", + "split", + "splitText", + "spreadMethod", + "sqrt", + "src", + "srcElement", + "srcFilter", + "srcUrn", + "srcdoc", + "srclang", + "srcset", + "stack", + "stackTraceLimit", + "stacktrace", + "standalone", + "standby", + "start", + "startContainer", + "startIce", + "startOffset", + "startRendering", + "startTime", + "startsWith", + "state", + "status", + "statusMessage", + "statusText", + "statusbar", + "stdDeviationX", + "stdDeviationY", + "stencilFunc", + "stencilFuncSeparate", + "stencilMask", + "stencilMaskSeparate", + "stencilOp", + "stencilOpSeparate", + "step", + "stepDown", + "stepMismatch", + "stepUp", + "sticky", + "stitchTiles", + "stop", + "stop-color", + "stop-opacity", + "stopColor", + "stopImmediatePropagation", + "stopOpacity", + "stopPropagation", + "storageArea", + "storageName", + "storageStatus", + "storeSiteSpecificTrackingException", + "storeWebWideTrackingException", + "stpVersion", + "stream", + "strike", + "stringValue", + "stringify", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "strokeDasharray", + "strokeDashoffset", + "strokeLinecap", + "strokeLinejoin", + "strokeMiterlimit", + "strokeOpacity", + "strokeRect", + "strokeStyle", + "strokeText", + "strokeWidth", + "style", + "styleFloat", + "styleMedia", + "styleSheet", + "styleSheetSets", + "styleSheets", + "sub", + "subarray", + "subject", + "submit", + "subscribe", + "substr", + "substring", + "substringData", + "subtle", + "suffix", + "suffixes", + "summary", + "sup", + "supports", + "surfaceScale", + "surroundContents", + "suspend", + "suspendRedraw", + "swapCache", + "swapNode", + "sweepFlag", + "symbols", + "system", + "systemCode", + "systemId", + "systemLanguage", + "systemXDPI", + "systemYDPI", + "tBodies", + "tFoot", + "tHead", + "tabIndex", + "table", + "table-layout", + "tableLayout", + "tableValues", + "tag", + "tagName", + "tagUrn", + "tags", + "taintEnabled", + "takeRecords", + "tan", + "tanh", + "target", + "targetElement", + "targetTouches", + "targetX", + "targetY", + "tel", + "terminate", + "test", + "texImage2D", + "texParameterf", + "texParameteri", + "texSubImage2D", + "text", + "text-align", + "text-anchor", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-style", + "text-indent", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "textAlign", + "textAlignLast", + "textAnchor", + "textAutospace", + "textBaseline", + "textContent", + "textDecoration", + "textDecorationBlink", + "textDecorationColor", + "textDecorationLine", + "textDecorationLineThrough", + "textDecorationNone", + "textDecorationOverline", + "textDecorationStyle", + "textDecorationUnderline", + "textIndent", + "textJustify", + "textJustifyTrim", + "textKashida", + "textKashidaSpace", + "textLength", + "textOverflow", + "textRendering", + "textShadow", + "textTracks", + "textTransform", + "textUnderlinePosition", + "then", + "threadId", + "threshold", + "tiltX", + "tiltY", + "time", + "timeEnd", + "timeStamp", + "timeout", + "timestamp", + "timestampOffset", + "timing", + "title", + "toArray", + "toBlob", + "toDataURL", + "toDateString", + "toElement", + "toExponential", + "toFixed", + "toFloat32Array", + "toFloat64Array", + "toGMTString", + "toISOString", + "toJSON", + "toLocaleDateString", + "toLocaleFormat", + "toLocaleLowerCase", + "toLocaleString", + "toLocaleTimeString", + "toLocaleUpperCase", + "toLowerCase", + "toMethod", + "toPrecision", + "toSdp", + "toSource", + "toStaticHTML", + "toString", + "toStringTag", + "toTimeString", + "toUTCString", + "toUpperCase", + "toggle", + "toggleLongPressEnabled", + "tooLong", + "toolbar", + "top", + "topMargin", + "total", + "totalFrameDelay", + "totalVideoFrames", + "touchAction", + "touches", + "trace", + "track", + "transaction", + "transactions", + "transform", + "transform-origin", + "transform-style", + "transformOrigin", + "transformPoint", + "transformString", + "transformStyle", + "transformToDocument", + "transformToFragment", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "transitionDelay", + "transitionDuration", + "transitionProperty", + "transitionTimingFunction", + "translate", + "translateSelf", + "translationX", + "translationY", + "trim", + "trimLeft", + "trimRight", + "trueSpeed", + "trunc", + "truncate", + "type", + "typeDetail", + "typeMismatch", + "typeMustMatch", + "types", + "ubound", + "undefined", + "unescape", + "uneval", + "unicode-bidi", + "unicodeBidi", + "uniform1f", + "uniform1fv", + "uniform1i", + "uniform1iv", + "uniform2f", + "uniform2fv", + "uniform2i", + "uniform2iv", + "uniform3f", + "uniform3fv", + "uniform3i", + "uniform3iv", + "uniform4f", + "uniform4fv", + "uniform4i", + "uniform4iv", + "uniformMatrix2fv", + "uniformMatrix3fv", + "uniformMatrix4fv", + "unique", + "uniqueID", + "uniqueNumber", + "unitType", + "units", + "unloadEventEnd", + "unloadEventStart", + "unlock", + "unmount", + "unobserve", + "unpause", + "unpauseAnimations", + "unreadCount", + "unregister", + "unregisterContentHandler", + "unregisterProtocolHandler", + "unscopables", + "unselectable", + "unshift", + "unsubscribe", + "unsuspendRedraw", + "unsuspendRedrawAll", + "unwatch", + "unwrapKey", + "update", + "updateCommands", + "updateIce", + "updateInterval", + "updateSettings", + "updated", + "updating", + "upload", + "upper", + "upperBound", + "upperOpen", + "uri", + "url", + "urn", + "urns", + "usages", + "useCurrentView", + "useMap", + "useProgram", + "usedSpace", + "userAgent", + "userLanguage", + "username", + "v8BreakIterator", + "vAlign", + "vLink", + "valid", + "validateProgram", + "validationMessage", + "validity", + "value", + "valueAsDate", + "valueAsNumber", + "valueAsString", + "valueInSpecifiedUnits", + "valueMissing", + "valueOf", + "valueText", + "valueType", + "values", + "vector-effect", + "vectorEffect", + "velocityAngular", + "velocityExpansion", + "velocityX", + "velocityY", + "vendor", + "vendorSub", + "verify", + "version", + "vertexAttrib1f", + "vertexAttrib1fv", + "vertexAttrib2f", + "vertexAttrib2fv", + "vertexAttrib3f", + "vertexAttrib3fv", + "vertexAttrib4f", + "vertexAttrib4fv", + "vertexAttribDivisorANGLE", + "vertexAttribPointer", + "vertical", + "vertical-align", + "verticalAlign", + "verticalOverflow", + "vibrate", + "videoHeight", + "videoTracks", + "videoWidth", + "view", + "viewBox", + "viewBoxString", + "viewTarget", + "viewTargetString", + "viewport", + "viewportAnchorX", + "viewportAnchorY", + "viewportElement", + "visibility", + "visibilityState", + "visible", + "vlinkColor", + "voice", + "volume", + "vrml", + "vspace", + "w", + "wand", + "warn", + "wasClean", + "watch", + "watchPosition", + "webdriver", + "webkitAddKey", + "webkitAnimation", + "webkitAnimationDelay", + "webkitAnimationDirection", + "webkitAnimationDuration", + "webkitAnimationFillMode", + "webkitAnimationIterationCount", + "webkitAnimationName", + "webkitAnimationPlayState", + "webkitAnimationTimingFunction", + "webkitAppearance", + "webkitAudioContext", + "webkitAudioDecodedByteCount", + "webkitAudioPannerNode", + "webkitBackfaceVisibility", + "webkitBackground", + "webkitBackgroundAttachment", + "webkitBackgroundClip", + "webkitBackgroundColor", + "webkitBackgroundImage", + "webkitBackgroundOrigin", + "webkitBackgroundPosition", + "webkitBackgroundPositionX", + "webkitBackgroundPositionY", + "webkitBackgroundRepeat", + "webkitBackgroundSize", + "webkitBackingStorePixelRatio", + "webkitBorderImage", + "webkitBorderImageOutset", + "webkitBorderImageRepeat", + "webkitBorderImageSlice", + "webkitBorderImageSource", + "webkitBorderImageWidth", + "webkitBoxAlign", + "webkitBoxDirection", + "webkitBoxFlex", + "webkitBoxOrdinalGroup", + "webkitBoxOrient", + "webkitBoxPack", + "webkitBoxSizing", + "webkitCancelAnimationFrame", + "webkitCancelFullScreen", + "webkitCancelKeyRequest", + "webkitCancelRequestAnimationFrame", + "webkitClearResourceTimings", + "webkitClosedCaptionsVisible", + "webkitConvertPointFromNodeToPage", + "webkitConvertPointFromPageToNode", + "webkitCreateShadowRoot", + "webkitCurrentFullScreenElement", + "webkitCurrentPlaybackTargetIsWireless", + "webkitDirectionInvertedFromDevice", + "webkitDisplayingFullscreen", + "webkitEnterFullScreen", + "webkitEnterFullscreen", + "webkitExitFullScreen", + "webkitExitFullscreen", + "webkitExitPointerLock", + "webkitFullScreenKeyboardInputAllowed", + "webkitFullscreenElement", + "webkitFullscreenEnabled", + "webkitGenerateKeyRequest", + "webkitGetAsEntry", + "webkitGetDatabaseNames", + "webkitGetEntries", + "webkitGetEntriesByName", + "webkitGetEntriesByType", + "webkitGetFlowByName", + "webkitGetGamepads", + "webkitGetImageDataHD", + "webkitGetNamedFlows", + "webkitGetRegionFlowRanges", + "webkitGetUserMedia", + "webkitHasClosedCaptions", + "webkitHidden", + "webkitIDBCursor", + "webkitIDBDatabase", + "webkitIDBDatabaseError", + "webkitIDBDatabaseException", + "webkitIDBFactory", + "webkitIDBIndex", + "webkitIDBKeyRange", + "webkitIDBObjectStore", + "webkitIDBRequest", + "webkitIDBTransaction", + "webkitImageSmoothingEnabled", + "webkitIndexedDB", + "webkitInitMessageEvent", + "webkitIsFullScreen", + "webkitKeys", + "webkitLineDashOffset", + "webkitLockOrientation", + "webkitMatchesSelector", + "webkitMediaStream", + "webkitNotifications", + "webkitOfflineAudioContext", + "webkitOrientation", + "webkitPeerConnection00", + "webkitPersistentStorage", + "webkitPointerLockElement", + "webkitPostMessage", + "webkitPreservesPitch", + "webkitPutImageDataHD", + "webkitRTCPeerConnection", + "webkitRegionOverset", + "webkitRequestAnimationFrame", + "webkitRequestFileSystem", + "webkitRequestFullScreen", + "webkitRequestFullscreen", + "webkitRequestPointerLock", + "webkitResolveLocalFileSystemURL", + "webkitSetMediaKeys", + "webkitSetResourceTimingBufferSize", + "webkitShadowRoot", + "webkitShowPlaybackTargetPicker", + "webkitSlice", + "webkitSpeechGrammar", + "webkitSpeechGrammarList", + "webkitSpeechRecognition", + "webkitSpeechRecognitionError", + "webkitSpeechRecognitionEvent", + "webkitStorageInfo", + "webkitSupportsFullscreen", + "webkitTemporaryStorage", + "webkitTextSizeAdjust", + "webkitTransform", + "webkitTransformOrigin", + "webkitTransition", + "webkitTransitionDelay", + "webkitTransitionDuration", + "webkitTransitionProperty", + "webkitTransitionTimingFunction", + "webkitURL", + "webkitUnlockOrientation", + "webkitUserSelect", + "webkitVideoDecodedByteCount", + "webkitVisibilityState", + "webkitWirelessVideoPlaybackDisabled", + "webkitdropzone", + "webstore", + "weight", + "whatToShow", + "wheelDelta", + "wheelDeltaX", + "wheelDeltaY", + "which", + "white-space", + "whiteSpace", + "wholeText", + "widows", + "width", + "will-change", + "willChange", + "willValidate", + "window", + "withCredentials", + "word-break", + "word-spacing", + "word-wrap", + "wordBreak", + "wordSpacing", + "wordWrap", + "wrap", + "wrapKey", + "write", + "writeln", + "writingMode", + "x", + "x1", + "x2", + "xChannelSelector", + "xmlEncoding", + "xmlStandalone", + "xmlVersion", + "xmlbase", + "xmllang", + "xmlspace", + "y", + "y1", + "y2", + "yChannelSelector", + "yandex", + "z", + "z-index", + "zIndex", + "zoom", + "zoomAndPan", + "zoomRectScreen" +] diff --git a/node_modules/uglify-js/tools/exports.js b/node_modules/uglify-js/tools/exports.js new file mode 100644 index 00000000..e08296f3 --- /dev/null +++ b/node_modules/uglify-js/tools/exports.js @@ -0,0 +1,5 @@ +exports["Dictionary"] = Dictionary; +exports["TreeWalker"] = TreeWalker; +exports["TreeTransformer"] = TreeTransformer; +exports["minify"] = minify; +exports["_push_uniq"] = push_uniq; diff --git a/node_modules/uglify-js/tools/node.js b/node_modules/uglify-js/tools/node.js new file mode 100644 index 00000000..dc270106 --- /dev/null +++ b/node_modules/uglify-js/tools/node.js @@ -0,0 +1,82 @@ +var fs = require("fs"); + +var UglifyJS = exports; +var FILES = UglifyJS.FILES = [ + "../lib/utils.js", + "../lib/ast.js", + "../lib/parse.js", + "../lib/transform.js", + "../lib/scope.js", + "../lib/output.js", + "../lib/compress.js", + "../lib/sourcemap.js", + "../lib/mozilla-ast.js", + "../lib/propmangle.js", + "../lib/minify.js", + "./exports.js", +].map(function(file){ + return require.resolve(file); +}); + +new Function("MOZ_SourceMap", "exports", function() { + var code = FILES.map(function(file) { + return fs.readFileSync(file, "utf8"); + }); + code.push("exports.describe_ast = " + describe_ast.toString()); + return code.join("\n\n"); +}())( + require("source-map"), + UglifyJS +); + +function describe_ast() { + var out = OutputStream({ beautify: true }); + function doitem(ctor) { + out.print("AST_" + ctor.TYPE); + var props = ctor.SELF_PROPS.filter(function(prop){ + return !/^\$/.test(prop); + }); + if (props.length > 0) { + out.space(); + out.with_parens(function(){ + props.forEach(function(prop, i){ + if (i) out.space(); + out.print(prop); + }); + }); + } + if (ctor.documentation) { + out.space(); + out.print_string(ctor.documentation); + } + if (ctor.SUBCLASSES.length > 0) { + out.space(); + out.with_block(function(){ + ctor.SUBCLASSES.forEach(function(ctor, i){ + out.indent(); + doitem(ctor); + out.newline(); + }); + }); + } + }; + doitem(AST_Node); + return out + "\n"; +} + +function infer_options(options) { + var result = UglifyJS.minify("", options); + return result.error && result.error.defs; +} + +UglifyJS.default_options = function() { + var defs = {}; + Object.keys(infer_options({ 0: 0 })).forEach(function(component) { + var options = {}; + options[component] = { 0: 0 }; + if (options = infer_options(options)) { + defs[component] = options; + } + }); + return defs; +}; diff --git a/node_modules/uglify-js/tools/props.html b/node_modules/uglify-js/tools/props.html new file mode 100644 index 00000000..f7c777aa --- /dev/null +++ b/node_modules/uglify-js/tools/props.html @@ -0,0 +1,61 @@ + + + + + + + diff --git a/node_modules/undefsafe/.github/workflows/release.yml b/node_modules/undefsafe/.github/workflows/release.yml new file mode 100644 index 00000000..e6ee8866 --- /dev/null +++ b/node_modules/undefsafe/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release +on: + push: + branches: + - master +jobs: + release: + name: Release + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setup Node.js + uses: actions/setup-node@v1 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Test + run: npm run test + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npx semantic-release diff --git a/node_modules/undefsafe/.jscsrc b/node_modules/undefsafe/.jscsrc new file mode 100644 index 00000000..9e01c9be --- /dev/null +++ b/node_modules/undefsafe/.jscsrc @@ -0,0 +1,13 @@ +{ + "preset": "node-style-guide", + "requireCapitalizedComments": null, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningCurlyBrace": true, + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "excludeFiles": ["node_modules/**"], + "disallowSpacesInFunction": null +} diff --git a/node_modules/undefsafe/.jshintrc b/node_modules/undefsafe/.jshintrc new file mode 100644 index 00000000..b47f672f --- /dev/null +++ b/node_modules/undefsafe/.jshintrc @@ -0,0 +1,16 @@ +{ + "browser": false, + "camelcase": true, + "curly": true, + "devel": true, + "eqeqeq": true, + "forin": true, + "indent": 2, + "noarg": true, + "node": true, + "quotmark": "single", + "undef": true, + "strict": false, + "unused": true +} + diff --git a/node_modules/undefsafe/.travis.yml b/node_modules/undefsafe/.travis.yml new file mode 100644 index 00000000..a1ace24a --- /dev/null +++ b/node_modules/undefsafe/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: node_js +cache: + directories: + - node_modules +notifications: + email: false +node_js: + - '4' +before_install: + - npm i -g npm@^2.0.0 +before_script: + - npm prune +after_success: + - npm run semantic-release +branches: + except: + - "/^v\\d+\\.\\d+\\.\\d+$/" diff --git a/node_modules/undefsafe/LICENSE b/node_modules/undefsafe/LICENSE new file mode 100644 index 00000000..caaf03ae --- /dev/null +++ b/node_modules/undefsafe/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright © 2016 Remy Sharp, http://remysharp.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/undefsafe/README.md b/node_modules/undefsafe/README.md new file mode 100644 index 00000000..46a706bc --- /dev/null +++ b/node_modules/undefsafe/README.md @@ -0,0 +1,63 @@ +# undefsafe + +Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined" + +Can also be used to safely set deep values. + +## Usage + +```js +var object = { + a: { + b: { + c: 1, + d: [1,2,3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined +``` + +Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console) + +## Setting + +```js +var object = { + a: { + b: [1,2,3] + } +}; + +// modified object +var res = undefsafe(object, 'a.b.0', 10); + +console.log(object); // { a: { b: [10, 2, 3] } } +console.log(res); // 1 - previous value +``` + +## Star rules in paths + +As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element. + +The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data: + +```js +const githubData = { + commits: [{ + modified: [ + "one", + "two" + ] + }, /* ... */ ] + }; + +// first modified file found in the first commit +console.log(undefsafe(githubData, 'commits.*.modified.0')); + +// returns `two` or undefined if not found +console.log(undefsafe(githubData, 'commits.*.modified.*', 'two')); +``` diff --git a/node_modules/undefsafe/example.js b/node_modules/undefsafe/example.js new file mode 100644 index 00000000..ed93c23b --- /dev/null +++ b/node_modules/undefsafe/example.js @@ -0,0 +1,14 @@ +var undefsafe = require('undefsafe'); + +var object = { + a: { + b: { + c: 1, + d: [1, 2, 3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined diff --git a/node_modules/undefsafe/lib/undefsafe.js b/node_modules/undefsafe/lib/undefsafe.js new file mode 100644 index 00000000..74468780 --- /dev/null +++ b/node_modules/undefsafe/lib/undefsafe.js @@ -0,0 +1,125 @@ +'use strict'; + +function undefsafe(obj, path, value, __res) { + // I'm not super keen on this private function, but it's because + // it'll also be use in the browser and I wont *one* function exposed + function split(path) { + var res = []; + var level = 0; + var key = ''; + + for (var i = 0; i < path.length; i++) { + var c = path.substr(i, 1); + + if (level === 0 && (c === '.' || c === '[')) { + if (c === '[') { + level++; + i++; + c = path.substr(i, 1); + } + + if (key) { + // the first value could be a string + res.push(key); + } + key = ''; + continue; + } + + if (c === ']') { + level--; + key = key.slice(0, -1); + continue; + } + + key += c; + } + + res.push(key); + + return res; + } + + // bail if there's nothing + if (obj === undefined || obj === null) { + return undefined; + } + + var parts = split(path); + var key = null; + var type = typeof obj; + var root = obj; + var parent = obj; + + var star = + parts.filter(function(_) { + return _ === '*'; + }).length > 0; + + // we're dealing with a primitive + if (type !== 'object' && type !== 'function') { + return obj; + } else if (path.trim() === '') { + return obj; + } + + key = parts[0]; + var i = 0; + for (; i < parts.length; i++) { + key = parts[i]; + parent = obj; + + if (key === '*') { + // loop through each property + var prop = ''; + var res = __res || []; + + for (prop in parent) { + var shallowObj = undefsafe( + obj[prop], + parts.slice(i + 1).join('.'), + value, + res + ); + if (shallowObj && shallowObj !== res) { + if ((value && shallowObj === value) || value === undefined) { + if (value !== undefined) { + return shallowObj; + } + + res.push(shallowObj); + } + } + } + + if (res.length === 0) { + return undefined; + } + + return res; + } + + if (Object.getOwnPropertyNames(obj).indexOf(key) == -1) { + return undefined; + } + + obj = obj[key]; + if (obj === undefined || obj === null) { + break; + } + } + + // if we have a null object, make sure it's the one the user was after, + // if it's not (i.e. parts has a length) then give undefined back. + if (obj === null && i !== parts.length - 1) { + obj = undefined; + } else if (!star && value) { + key = path.split('.').pop(); + parent[key] = value; + } + return obj; +} + +if (typeof module !== 'undefined') { + module.exports = undefsafe; +} diff --git a/node_modules/undefsafe/package.json b/node_modules/undefsafe/package.json new file mode 100644 index 00000000..a4542332 --- /dev/null +++ b/node_modules/undefsafe/package.json @@ -0,0 +1,34 @@ +{ + "name": "undefsafe", + "description": "Undefined safe way of extracting object properties", + "main": "lib/undefsafe.js", + "tonicExampleFilename": "example.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/**/*.test.js -R spec", + "cover": "tap test/*.test.js --cov --coverage-report=lcov", + "semantic-release": "semantic-release" + }, + "prettier": { + "trailingComma": "none", + "singleQuote": true + }, + "repository": { + "type": "git", + "url": "https://github.com/remy/undefsafe.git" + }, + "keywords": [ + "undefined" + ], + "author": "Remy Sharp", + "license": "MIT", + "devDependencies": { + "semantic-release": "^18.0.0", + "tap": "^5.7.1", + "tap-only": "0.0.5" + }, + "dependencies": {}, + "version": "2.0.5" +} diff --git a/node_modules/unpipe/HISTORY.md b/node_modules/unpipe/HISTORY.md new file mode 100644 index 00000000..85e0f8d7 --- /dev/null +++ b/node_modules/unpipe/HISTORY.md @@ -0,0 +1,4 @@ +1.0.0 / 2015-06-14 +================== + + * Initial release diff --git a/node_modules/unpipe/LICENSE b/node_modules/unpipe/LICENSE new file mode 100644 index 00000000..aed01382 --- /dev/null +++ b/node_modules/unpipe/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/unpipe/README.md b/node_modules/unpipe/README.md new file mode 100644 index 00000000..e536ad2c --- /dev/null +++ b/node_modules/unpipe/README.md @@ -0,0 +1,43 @@ +# unpipe + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Unpipe a stream from all destinations. + +## Installation + +```sh +$ npm install unpipe +``` + +## API + +```js +var unpipe = require('unpipe') +``` + +### unpipe(stream) + +Unpipes all destinations from a given stream. With stream 2+, this is +equivalent to `stream.unpipe()`. When used with streams 1 style streams +(typically Node.js 0.8 and below), this module attempts to undo the +actions done in `stream.pipe(dest)`. + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/unpipe.svg +[npm-url]: https://npmjs.org/package/unpipe +[node-image]: https://img.shields.io/node/v/unpipe.svg +[node-url]: http://nodejs.org/download/ +[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg +[travis-url]: https://travis-ci.org/stream-utils/unpipe +[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg +[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master +[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg +[downloads-url]: https://npmjs.org/package/unpipe diff --git a/node_modules/unpipe/index.js b/node_modules/unpipe/index.js new file mode 100644 index 00000000..15c3d97a --- /dev/null +++ b/node_modules/unpipe/index.js @@ -0,0 +1,69 @@ +/*! + * unpipe + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = unpipe + +/** + * Determine if there are Node.js pipe-like data listeners. + * @private + */ + +function hasPipeDataListeners(stream) { + var listeners = stream.listeners('data') + + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].name === 'ondata') { + return true + } + } + + return false +} + +/** + * Unpipe a stream from all destinations. + * + * @param {object} stream + * @public + */ + +function unpipe(stream) { + if (!stream) { + throw new TypeError('argument stream is required') + } + + if (typeof stream.unpipe === 'function') { + // new-style + stream.unpipe() + return + } + + // Node.js 0.8 hack + if (!hasPipeDataListeners(stream)) { + return + } + + var listener + var listeners = stream.listeners('close') + + for (var i = 0; i < listeners.length; i++) { + listener = listeners[i] + + if (listener.name !== 'cleanup' && listener.name !== 'onclose') { + continue + } + + // invoke the listener + listener.call(stream) + } +} diff --git a/node_modules/unpipe/package.json b/node_modules/unpipe/package.json new file mode 100644 index 00000000..a2b73583 --- /dev/null +++ b/node_modules/unpipe/package.json @@ -0,0 +1,27 @@ +{ + "name": "unpipe", + "description": "Unpipe a stream from all destinations", + "version": "1.0.0", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "repository": "stream-utils/unpipe", + "devDependencies": { + "istanbul": "0.3.15", + "mocha": "2.2.5", + "readable-stream": "1.1.13" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + } +} diff --git a/node_modules/upper-case/LICENSE b/node_modules/upper-case/LICENSE new file mode 100644 index 00000000..983fbe8a --- /dev/null +++ b/node_modules/upper-case/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/upper-case/README.md b/node_modules/upper-case/README.md new file mode 100644 index 00000000..7e23978c --- /dev/null +++ b/node_modules/upper-case/README.md @@ -0,0 +1,45 @@ +# Upper Case + +[![NPM version][npm-image]][npm-url] +[![NPM downloads][downloads-image]][downloads-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] + +Upper case a string. + +Supports Unicode (non-ASCII characters) and non-string entities, such as objects with a `toString` property, numbers and booleans. Empty values (`null` and `undefined`) will result in an empty string. + +## Installation + +``` +npm install upper-case --save +``` + +## Usage + +```js +var upperCase = require('upper-case') + +upperCase(null) //=> "" +upperCase('string') //=> "STRING" +upperCase('string', 'tr') //=> "STRİNG" + +upperCase({ toString: function () { return 'test' } }) //=> "TEST" +``` + +## Typings + +Includes a [TypeScript definition](upper-case.d.ts). + +## License + +MIT + +[npm-image]: https://img.shields.io/npm/v/upper-case.svg?style=flat +[npm-url]: https://npmjs.org/package/upper-case +[downloads-image]: https://img.shields.io/npm/dm/upper-case.svg?style=flat +[downloads-url]: https://npmjs.org/package/upper-case +[travis-image]: https://img.shields.io/travis/blakeembrey/upper-case.svg?style=flat +[travis-url]: https://travis-ci.org/blakeembrey/upper-case +[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/upper-case.svg?style=flat +[coveralls-url]: https://coveralls.io/r/blakeembrey/upper-case?branch=master diff --git a/node_modules/upper-case/package.json b/node_modules/upper-case/package.json new file mode 100644 index 00000000..d21476ff --- /dev/null +++ b/node_modules/upper-case/package.json @@ -0,0 +1,51 @@ +{ + "name": "upper-case", + "version": "1.1.3", + "description": "Upper case a string", + "main": "upper-case.js", + "typings": "upper-case.d.ts", + "files": [ + "upper-case.js", + "upper-case.d.ts", + "LICENSE" + ], + "scripts": { + "lint": "standard", + "test-std": "mocha -- -R spec --bail", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -R spec --bail", + "test": "npm run lint && npm run test-cov" + }, + "standard": { + "ignore": [ + "coverage/**", + "node_modules/**", + "bower_components/**" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/blakeembrey/upper-case.git" + }, + "keywords": [ + "cases", + "upper", + "uppercase", + "case" + ], + "author": { + "name": "Blake Embrey", + "email": "hello@blakeembrey.com", + "url": "http://blakeembrey.me" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/blakeembrey/upper-case/issues" + }, + "homepage": "https://github.com/blakeembrey/upper-case", + "devDependencies": { + "istanbul": "^0.3.5", + "mocha": "^2.1.0", + "pre-commit": "^1.0.2", + "standard": "^2.4.5" + } +} diff --git a/node_modules/upper-case/upper-case.d.ts b/node_modules/upper-case/upper-case.d.ts new file mode 100644 index 00000000..a3e83b3c --- /dev/null +++ b/node_modules/upper-case/upper-case.d.ts @@ -0,0 +1,3 @@ +declare function upperCase (value: string, locale?: string): string; + +export = upperCase; diff --git a/node_modules/upper-case/upper-case.js b/node_modules/upper-case/upper-case.js new file mode 100644 index 00000000..768a3875 --- /dev/null +++ b/node_modules/upper-case/upper-case.js @@ -0,0 +1,50 @@ +/** + * Special language-specific overrides. + * + * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt + * + * @type {Object} + */ +var LANGUAGES = { + tr: { + regexp: /[\u0069]/g, + map: { + '\u0069': '\u0130' + } + }, + az: { + regexp: /[\u0069]/g, + map: { + '\u0069': '\u0130' + } + }, + lt: { + regexp: /[\u0069\u006A\u012F]\u0307|\u0069\u0307[\u0300\u0301\u0303]/g, + map: { + '\u0069\u0307': '\u0049', + '\u006A\u0307': '\u004A', + '\u012F\u0307': '\u012E', + '\u0069\u0307\u0300': '\u00CC', + '\u0069\u0307\u0301': '\u00CD', + '\u0069\u0307\u0303': '\u0128' + } + } +} + +/** + * Upper case a string. + * + * @param {String} str + * @return {String} + */ +module.exports = function (str, locale) { + var lang = LANGUAGES[locale] + + str = str == null ? '' : String(str) + + if (lang) { + str = str.replace(lang.regexp, function (m) { return lang.map[m] }) + } + + return str.toUpperCase() +} 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/utils-merge/.npmignore b/node_modules/utils-merge/.npmignore new file mode 100644 index 00000000..3e538441 --- /dev/null +++ b/node_modules/utils-merge/.npmignore @@ -0,0 +1,9 @@ +CONTRIBUTING.md +Makefile +docs/ +examples/ +reports/ +test/ + +.jshintrc +.travis.yml diff --git a/node_modules/utils-merge/LICENSE b/node_modules/utils-merge/LICENSE new file mode 100644 index 00000000..76f6d083 --- /dev/null +++ b/node_modules/utils-merge/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Jared Hanson + +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/utils-merge/README.md b/node_modules/utils-merge/README.md new file mode 100644 index 00000000..0cb71171 --- /dev/null +++ b/node_modules/utils-merge/README.md @@ -0,0 +1,34 @@ +# utils-merge + +[![Version](https://img.shields.io/npm/v/utils-merge.svg?label=version)](https://www.npmjs.com/package/utils-merge) +[![Build](https://img.shields.io/travis/jaredhanson/utils-merge.svg)](https://travis-ci.org/jaredhanson/utils-merge) +[![Quality](https://img.shields.io/codeclimate/github/jaredhanson/utils-merge.svg?label=quality)](https://codeclimate.com/github/jaredhanson/utils-merge) +[![Coverage](https://img.shields.io/coveralls/jaredhanson/utils-merge.svg)](https://coveralls.io/r/jaredhanson/utils-merge) +[![Dependencies](https://img.shields.io/david/jaredhanson/utils-merge.svg)](https://david-dm.org/jaredhanson/utils-merge) + + +Merges the properties from a source object into a destination object. + +## Install + +```bash +$ npm install utils-merge +``` + +## Usage + +```javascript +var a = { foo: 'bar' } + , b = { bar: 'baz' }; + +merge(a, b); +// => { foo: 'bar', bar: 'baz' } +``` + +## License + +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2017 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> + + Sponsor diff --git a/node_modules/utils-merge/index.js b/node_modules/utils-merge/index.js new file mode 100644 index 00000000..4265c694 --- /dev/null +++ b/node_modules/utils-merge/index.js @@ -0,0 +1,23 @@ +/** + * Merge object b with object a. + * + * var a = { foo: 'bar' } + * , b = { bar: 'baz' }; + * + * merge(a, b); + * // => { foo: 'bar', bar: 'baz' } + * + * @param {Object} a + * @param {Object} b + * @return {Object} + * @api public + */ + +exports = module.exports = function(a, b){ + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; +}; diff --git a/node_modules/utils-merge/package.json b/node_modules/utils-merge/package.json new file mode 100644 index 00000000..e36b0781 --- /dev/null +++ b/node_modules/utils-merge/package.json @@ -0,0 +1,40 @@ +{ + "name": "utils-merge", + "version": "1.0.1", + "description": "merge() utility function", + "keywords": [ + "util" + ], + "author": { + "name": "Jared Hanson", + "email": "jaredhanson@gmail.com", + "url": "http://www.jaredhanson.net/" + }, + "repository": { + "type": "git", + "url": "git://github.com/jaredhanson/utils-merge.git" + }, + "bugs": { + "url": "http://github.com/jaredhanson/utils-merge/issues" + }, + "license": "MIT", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "main": "./index", + "dependencies": {}, + "devDependencies": { + "make-node": "0.3.x", + "mocha": "1.x.x", + "chai": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "scripts": { + "test": "node_modules/.bin/mocha --reporter spec --require test/bootstrap/node test/*.test.js" + } +} 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/bin/uuid b/node_modules/uuid/bin/uuid new file mode 100755 index 00000000..502626e6 --- /dev/null +++ b/node_modules/uuid/bin/uuid @@ -0,0 +1,65 @@ +#!/usr/bin/env node +var assert = require('assert'); + +function usage() { + console.log('Usage:'); + console.log(' uuid'); + console.log(' uuid v1'); + console.log(' uuid v3 '); + console.log(' uuid v4'); + console.log(' uuid v5 '); + console.log(' uuid --help'); + console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122'); +} + +var args = process.argv.slice(2); + +if (args.indexOf('--help') >= 0) { + usage(); + process.exit(0); +} +var version = args.shift() || 'v4'; + +switch (version) { + case 'v1': + var uuidV1 = require('../v1'); + console.log(uuidV1()); + break; + + case 'v3': + var uuidV3 = require('../v3'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v3 name not specified'); + assert(namespace != null, 'v3 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV3.URL; + if (namespace == 'DNS') namespace = uuidV3.DNS; + + console.log(uuidV3(name, namespace)); + break; + + case 'v4': + var uuidV4 = require('../v4'); + console.log(uuidV4()); + break; + + case 'v5': + var uuidV5 = require('../v5'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v5 name not specified'); + assert(namespace != null, 'v5 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV5.URL; + if (namespace == 'DNS') namespace = uuidV5.DNS; + + console.log(uuidV5(name, namespace)); + break; + + default: + usage(); + process.exit(1); +} 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/lib/bytesToUuid.js b/node_modules/uuid/lib/bytesToUuid.js new file mode 100644 index 00000000..24b60412 --- /dev/null +++ b/node_modules/uuid/lib/bytesToUuid.js @@ -0,0 +1,26 @@ +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +var byteToHex = []; +for (var i = 0; i < 256; ++i) { + byteToHex[i] = (i + 0x100).toString(16).substr(1); +} + +function bytesToUuid(buf, offset) { + var i = offset || 0; + var bth = byteToHex; + // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4 + return ([ + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]] + ]).join(''); +} + +module.exports = bytesToUuid; diff --git a/node_modules/uuid/lib/md5-browser.js b/node_modules/uuid/lib/md5-browser.js new file mode 100644 index 00000000..9b3b6c7e --- /dev/null +++ b/node_modules/uuid/lib/md5-browser.js @@ -0,0 +1,216 @@ +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +'use strict'; + +function md5(bytes) { + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + return md5ToHexEncodedArray( + wordsToMd5( + bytesToWords(bytes) + , bytes.length * 8) + ); +} + + +/* +* Convert an array of little-endian words to an array of bytes +*/ +function md5ToHexEncodedArray(input) { + var i; + var x; + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + var hex; + + for (i = 0; i < length32; i += 8) { + x = (input[i >> 5] >>> (i % 32)) & 0xFF; + + hex = parseInt(hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F), 16); + + output.push(hex); + } + return output; +} + +/* +* Calculate the MD5 of an array of little-endian words, and a bit length. +*/ +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return [a, b, c, d]; +} + +/* +* Convert an array bytes to an array of little-endian words +* Characters >255 have their high-byte silently ignored. +*/ +function bytesToWords(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[(i / 8)] & 0xFF) << (i % 32); + } + + return output; +} + +/* +* Add integers, wrapping at 2^32. This uses 16-bit operations internally +* to work around bugs in some JS interpreters. +*/ +function safeAdd(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* +* Bitwise rotate a 32-bit number to the left. +*/ +function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* +* These functions implement the four basic operations the algorithm uses. +*/ +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} +function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +module.exports = md5; diff --git a/node_modules/uuid/lib/md5.js b/node_modules/uuid/lib/md5.js new file mode 100644 index 00000000..7044b872 --- /dev/null +++ b/node_modules/uuid/lib/md5.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function md5(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('md5').update(bytes).digest(); +} + +module.exports = md5; diff --git a/node_modules/uuid/lib/rng-browser.js b/node_modules/uuid/lib/rng-browser.js new file mode 100644 index 00000000..6361fb81 --- /dev/null +++ b/node_modules/uuid/lib/rng-browser.js @@ -0,0 +1,34 @@ +// Unique ID creation requires a high quality random # generator. In the +// browser this is a little complicated due to unknown quality of Math.random() +// and inconsistent support for the `crypto` API. We do the best we can via +// feature-detection + +// getRandomValues needs to be invoked in a context where "this" is a Crypto +// implementation. Also, find the complete implementation of crypto on IE11. +var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) || + (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto)); + +if (getRandomValues) { + // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto + var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef + + module.exports = function whatwgRNG() { + getRandomValues(rnds8); + return rnds8; + }; +} else { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var rnds = new Array(16); + + module.exports = function mathRNG() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return rnds; + }; +} diff --git a/node_modules/uuid/lib/rng.js b/node_modules/uuid/lib/rng.js new file mode 100644 index 00000000..58f0dc9c --- /dev/null +++ b/node_modules/uuid/lib/rng.js @@ -0,0 +1,8 @@ +// Unique ID creation requires a high quality random # generator. In node.js +// this is pretty straight-forward - we use the crypto API. + +var crypto = require('crypto'); + +module.exports = function nodeRNG() { + return crypto.randomBytes(16); +}; diff --git a/node_modules/uuid/lib/sha1-browser.js b/node_modules/uuid/lib/sha1-browser.js new file mode 100644 index 00000000..5758ed75 --- /dev/null +++ b/node_modules/uuid/lib/sha1-browser.js @@ -0,0 +1,89 @@ +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +'use strict'; + +function f(s, x, y, z) { + switch (s) { + case 0: return (x & y) ^ (~x & z); + case 1: return x ^ y ^ z; + case 2: return (x & y) ^ (x & z) ^ (y & z); + case 3: return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return (x << n) | (x>>> (32 - n)); +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + bytes.push(0x80); + + var l = bytes.length/4 + 2; + var N = Math.ceil(l/16); + var M = new Array(N); + + for (var i=0; i>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = (H[0] + a) >>> 0; + H[1] = (H[1] + b) >>> 0; + H[2] = (H[2] + c) >>> 0; + H[3] = (H[3] + d) >>> 0; + H[4] = (H[4] + e) >>> 0; + } + + return [ + H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, + H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, + H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, + H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, + H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff + ]; +} + +module.exports = sha1; diff --git a/node_modules/uuid/lib/sha1.js b/node_modules/uuid/lib/sha1.js new file mode 100644 index 00000000..0b54b250 --- /dev/null +++ b/node_modules/uuid/lib/sha1.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function sha1(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('sha1').update(bytes).digest(); +} + +module.exports = sha1; diff --git a/node_modules/uuid/lib/v35.js b/node_modules/uuid/lib/v35.js new file mode 100644 index 00000000..8b066cc5 --- /dev/null +++ b/node_modules/uuid/lib/v35.js @@ -0,0 +1,57 @@ +var bytesToUuid = require('./bytesToUuid'); + +function uuidToBytes(uuid) { + // Note: We assume we're being passed a valid uuid string + var bytes = []; + uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) { + bytes.push(parseInt(hex, 16)); + }); + + return bytes; +} + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + var bytes = new Array(str.length); + for (var i = 0; i < str.length; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +module.exports = function(name, version, hashfunc) { + var generateUUID = function(value, namespace, buf, offset) { + var off = buf && offset || 0; + + if (typeof(value) == 'string') value = stringToBytes(value); + if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace); + + if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); + if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); + + // Per 4.3 + var bytes = hashfunc(namespace.concat(value)); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + if (buf) { + for (var idx = 0; idx < 16; ++idx) { + buf[off+idx] = bytes[idx]; + } + } + + return buf || bytesToUuid(bytes); + }; + + // Function#name is not settable on some platforms (#270) + try { + generateUUID.name = name; + } catch (err) { + } + + // Pre-defined namespaces, per Appendix C + generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; + generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; + + return generateUUID; +}; 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/vary/HISTORY.md b/node_modules/vary/HISTORY.md new file mode 100644 index 00000000..f6cbcf7f --- /dev/null +++ b/node_modules/vary/HISTORY.md @@ -0,0 +1,39 @@ +1.1.2 / 2017-09-23 +================== + + * perf: improve header token parsing speed + +1.1.1 / 2017-03-20 +================== + + * perf: hoist regular expression + +1.1.0 / 2015-09-29 +================== + + * Only accept valid field names in the `field` argument + - Ensures the resulting string is a valid HTTP header value + +1.0.1 / 2015-07-08 +================== + + * Fix setting empty header from empty `field` + * perf: enable strict mode + * perf: remove argument reassignments + +1.0.0 / 2014-08-10 +================== + + * Accept valid `Vary` header string as `field` + * Add `vary.append` for low-level string manipulation + * Move to `jshttp` orgainzation + +0.1.0 / 2014-06-05 +================== + + * Support array of fields to set + +0.0.0 / 2014-06-04 +================== + + * Initial release diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE new file mode 100644 index 00000000..84441fbb --- /dev/null +++ b/node_modules/vary/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vary/README.md b/node_modules/vary/README.md new file mode 100644 index 00000000..cc000b34 --- /dev/null +++ b/node_modules/vary/README.md @@ -0,0 +1,101 @@ +# vary + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][travis-image]][travis-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Manipulate the HTTP Vary header + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install vary +``` + +## API + + + +```js +var vary = require('vary') +``` + +### vary(res, field) + +Adds the given header `field` to the `Vary` response header of `res`. +This can be a string of a single field, a string of a valid `Vary` +header, or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. + + + +```js +// Append "Origin" to the Vary header of the response +vary(res, 'Origin') +``` + +### vary.append(header, field) + +Adds the given header `field` to the `Vary` response header string `header`. +This can be a string of a single field, a string of a valid `Vary` header, +or an array of multiple fields. + +This will append the header if not already listed, otherwise leaves +it listed in the current location. The new header string is returned. + + + +```js +// Get header string appending "Origin" to "Accept, User-Agent" +vary.append('Accept, User-Agent', 'Origin') +``` + +## Examples + +### Updating the Vary header when content is based on it + +```js +var http = require('http') +var vary = require('vary') + +http.createServer(function onRequest (req, res) { + // about to user-agent sniff + vary(res, 'User-Agent') + + var ua = req.headers['user-agent'] || '' + var isMobile = /mobi|android|touch|mini/i.test(ua) + + // serve site, depending on isMobile + res.setHeader('Content-Type', 'text/html') + res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') +}) +``` + +## Testing + +```sh +$ npm test +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/vary.svg +[npm-url]: https://npmjs.org/package/vary +[node-version-image]: https://img.shields.io/node/v/vary.svg +[node-version-url]: https://nodejs.org/en/download +[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg +[travis-url]: https://travis-ci.org/jshttp/vary +[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/vary +[downloads-image]: https://img.shields.io/npm/dm/vary.svg +[downloads-url]: https://npmjs.org/package/vary diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js new file mode 100644 index 00000000..5b5e7412 --- /dev/null +++ b/node_modules/vary/index.js @@ -0,0 +1,149 @@ +/*! + * vary + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + */ + +module.exports = vary +module.exports.append = append + +/** + * RegExp to match field-name in RFC 7230 sec 3.2 + * + * field-name = token + * token = 1*tchar + * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + * / DIGIT / ALPHA + * ; any VCHAR, except delimiters + */ + +var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ + +/** + * Append a field to a vary header. + * + * @param {String} header + * @param {String|Array} field + * @return {String} + * @public + */ + +function append (header, field) { + if (typeof header !== 'string') { + throw new TypeError('header argument is required') + } + + if (!field) { + throw new TypeError('field argument is required') + } + + // get fields array + var fields = !Array.isArray(field) + ? parse(String(field)) + : field + + // assert on invalid field names + for (var j = 0; j < fields.length; j++) { + if (!FIELD_NAME_REGEXP.test(fields[j])) { + throw new TypeError('field argument contains an invalid header name') + } + } + + // existing, unspecified vary + if (header === '*') { + return header + } + + // enumerate current values + var val = header + var vals = parse(header.toLowerCase()) + + // unspecified vary + if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { + return '*' + } + + for (var i = 0; i < fields.length; i++) { + var fld = fields[i].toLowerCase() + + // append value (case-preserving) + if (vals.indexOf(fld) === -1) { + vals.push(fld) + val = val + ? val + ', ' + fields[i] + : fields[i] + } + } + + return val +} + +/** + * Parse a vary header into an array. + * + * @param {String} header + * @return {Array} + * @private + */ + +function parse (header) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = header.length; i < len; i++) { + switch (header.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(header.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(header.substring(start, end)) + + return list +} + +/** + * Mark that a request is varied on a header field. + * + * @param {Object} res + * @param {String|Array} field + * @public + */ + +function vary (res, field) { + if (!res || !res.getHeader || !res.setHeader) { + // quack quack + throw new TypeError('res argument is required') + } + + // get existing header + var val = res.getHeader('Vary') || '' + var header = Array.isArray(val) + ? val.join(', ') + : String(val) + + // set new header + if ((val = append(header, field))) { + res.setHeader('Vary', val) + } +} diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json new file mode 100644 index 00000000..028f72a9 --- /dev/null +++ b/node_modules/vary/package.json @@ -0,0 +1,43 @@ +{ + "name": "vary", + "description": "Manipulate the HTTP Vary header", + "version": "1.1.2", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "keywords": [ + "http", + "res", + "vary" + ], + "repository": "jshttp/vary", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "2.5.3", + "supertest": "1.1.0" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + } +} 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/lib/verror.js b/node_modules/verror/lib/verror.js new file mode 100644 index 00000000..8663ddea --- /dev/null +++ b/node_modules/verror/lib/verror.js @@ -0,0 +1,451 @@ +/* + * verror.js: richer JavaScript errors + */ + +var mod_assertplus = require('assert-plus'); +var mod_util = require('util'); + +var mod_extsprintf = require('extsprintf'); +var mod_isError = require('core-util-is').isError; +var sprintf = mod_extsprintf.sprintf; + +/* + * Public interface + */ + +/* So you can 'var VError = require('verror')' */ +module.exports = VError; +/* For compatibility */ +VError.VError = VError; +/* Other exported classes */ +VError.SError = SError; +VError.WError = WError; +VError.MultiError = MultiError; + +/* + * Common function used to parse constructor arguments for VError, WError, and + * SError. Named arguments to this function: + * + * strict force strict interpretation of sprintf arguments, even + * if the options in "argv" don't say so + * + * argv error's constructor arguments, which are to be + * interpreted as described in README.md. For quick + * reference, "argv" has one of the following forms: + * + * [ sprintf_args... ] (argv[0] is a string) + * [ cause, sprintf_args... ] (argv[0] is an Error) + * [ options, sprintf_args... ] (argv[0] is an object) + * + * This function normalizes these forms, producing an object with the following + * properties: + * + * options equivalent to "options" in third form. This will never + * be a direct reference to what the caller passed in + * (i.e., it may be a shallow copy), so it can be freely + * modified. + * + * shortmessage result of sprintf(sprintf_args), taking options.strict + * into account as described in README.md. + */ +function parseConstructorArguments(args) +{ + var argv, options, sprintf_args, shortmessage, k; + + mod_assertplus.object(args, 'args'); + mod_assertplus.bool(args.strict, 'args.strict'); + mod_assertplus.array(args.argv, 'args.argv'); + argv = args.argv; + + /* + * First, figure out which form of invocation we've been given. + */ + if (argv.length === 0) { + options = {}; + sprintf_args = []; + } else if (mod_isError(argv[0])) { + options = { 'cause': argv[0] }; + sprintf_args = argv.slice(1); + } else if (typeof (argv[0]) === 'object') { + options = {}; + for (k in argv[0]) { + options[k] = argv[0][k]; + } + sprintf_args = argv.slice(1); + } else { + mod_assertplus.string(argv[0], + 'first argument to VError, SError, or WError ' + + 'constructor must be a string, object, or Error'); + options = {}; + sprintf_args = argv; + } + + /* + * Now construct the error's message. + * + * extsprintf (which we invoke here with our caller's arguments in order + * to construct this Error's message) is strict in its interpretation of + * values to be processed by the "%s" specifier. The value passed to + * extsprintf must actually be a string or something convertible to a + * String using .toString(). Passing other values (notably "null" and + * "undefined") is considered a programmer error. The assumption is + * that if you actually want to print the string "null" or "undefined", + * then that's easy to do that when you're calling extsprintf; on the + * other hand, if you did NOT want that (i.e., there's actually a bug + * where the program assumes some variable is non-null and tries to + * print it, which might happen when constructing a packet or file in + * some specific format), then it's better to stop immediately than + * produce bogus output. + * + * However, sometimes the bug is only in the code calling VError, and a + * programmer might prefer to have the error message contain "null" or + * "undefined" rather than have the bug in the error path crash the + * program (making the first bug harder to identify). For that reason, + * by default VError converts "null" or "undefined" arguments to their + * string representations and passes those to extsprintf. Programmers + * desiring the strict behavior can use the SError class or pass the + * "strict" option to the VError constructor. + */ + mod_assertplus.object(options); + if (!options.strict && !args.strict) { + sprintf_args = sprintf_args.map(function (a) { + return (a === null ? 'null' : + a === undefined ? 'undefined' : a); + }); + } + + if (sprintf_args.length === 0) { + shortmessage = ''; + } else { + shortmessage = sprintf.apply(null, sprintf_args); + } + + return ({ + 'options': options, + 'shortmessage': shortmessage + }); +} + +/* + * See README.md for reference documentation. + */ +function VError() +{ + var args, obj, parsed, cause, ctor, message, k; + + args = Array.prototype.slice.call(arguments, 0); + + /* + * This is a regrettable pattern, but JavaScript's built-in Error class + * is defined to work this way, so we allow the constructor to be called + * without "new". + */ + if (!(this instanceof VError)) { + obj = Object.create(VError.prototype); + VError.apply(obj, arguments); + return (obj); + } + + /* + * For convenience and backwards compatibility, we support several + * different calling forms. Normalize them here. + */ + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + /* + * If we've been given a name, apply it now. + */ + if (parsed.options.name) { + mod_assertplus.string(parsed.options.name, + 'error\'s "name" must be a string'); + this.name = parsed.options.name; + } + + /* + * For debugging, we keep track of the original short message (attached + * this Error particularly) separately from the complete message (which + * includes the messages of our cause chain). + */ + this.jse_shortmsg = parsed.shortmessage; + message = parsed.shortmessage; + + /* + * If we've been given a cause, record a reference to it and update our + * message appropriately. + */ + cause = parsed.options.cause; + if (cause) { + mod_assertplus.ok(mod_isError(cause), 'cause is not an Error'); + this.jse_cause = cause; + + if (!parsed.options.skipCauseMessage) { + message += ': ' + cause.message; + } + } + + /* + * If we've been given an object with properties, shallow-copy that + * here. We don't want to use a deep copy in case there are non-plain + * objects here, but we don't want to use the original object in case + * the caller modifies it later. + */ + this.jse_info = {}; + if (parsed.options.info) { + for (k in parsed.options.info) { + this.jse_info[k] = parsed.options.info[k]; + } + } + + this.message = message; + Error.call(this, message); + + if (Error.captureStackTrace) { + ctor = parsed.options.constructorOpt || this.constructor; + Error.captureStackTrace(this, ctor); + } + + return (this); +} + +mod_util.inherits(VError, Error); +VError.prototype.name = 'VError'; + +VError.prototype.toString = function ve_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + + return (str); +}; + +/* + * This method is provided for compatibility. New callers should use + * VError.cause() instead. That method also uses the saner `null` return value + * when there is no cause. + */ +VError.prototype.cause = function ve_cause() +{ + var cause = VError.cause(this); + return (cause === null ? undefined : cause); +}; + +/* + * Static methods + * + * These class-level methods are provided so that callers can use them on + * instances of Errors that are not VErrors. New interfaces should be provided + * only using static methods to eliminate the class of programming mistake where + * people fail to check whether the Error object has the corresponding methods. + */ + +VError.cause = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + return (mod_isError(err.jse_cause) ? err.jse_cause : null); +}; + +VError.info = function (err) +{ + var rv, cause, k; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + cause = VError.cause(err); + if (cause !== null) { + rv = VError.info(cause); + } else { + rv = {}; + } + + if (typeof (err.jse_info) == 'object' && err.jse_info !== null) { + for (k in err.jse_info) { + rv[k] = err.jse_info[k]; + } + } + + return (rv); +}; + +VError.findCauseByName = function (err, name) +{ + var cause; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.string(name, 'name'); + mod_assertplus.ok(name.length > 0, 'name cannot be empty'); + + for (cause = err; cause !== null; cause = VError.cause(cause)) { + mod_assertplus.ok(mod_isError(cause)); + if (cause.name == name) { + return (cause); + } + } + + return (null); +}; + +VError.hasCauseWithName = function (err, name) +{ + return (VError.findCauseByName(err, name) !== null); +}; + +VError.fullStack = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + + var cause = VError.cause(err); + + if (cause) { + return (err.stack + '\ncaused by: ' + VError.fullStack(cause)); + } + + return (err.stack); +}; + +VError.errorFromList = function (errors) +{ + mod_assertplus.arrayOfObject(errors, 'errors'); + + if (errors.length === 0) { + return (null); + } + + errors.forEach(function (e) { + mod_assertplus.ok(mod_isError(e)); + }); + + if (errors.length == 1) { + return (errors[0]); + } + + return (new MultiError(errors)); +}; + +VError.errorForEach = function (err, func) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.func(func, 'func'); + + if (err instanceof MultiError) { + err.errors().forEach(function iterError(e) { func(e); }); + } else { + func(err); + } +}; + + +/* + * SError is like VError, but stricter about types. You cannot pass "null" or + * "undefined" as string arguments to the formatter. + */ +function SError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof SError)) { + obj = Object.create(SError.prototype); + SError.apply(obj, arguments); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': true + }); + + options = parsed.options; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +/* + * We don't bother setting SError.prototype.name because once constructed, + * SErrors are just like VErrors. + */ +mod_util.inherits(SError, VError); + + +/* + * Represents a collection of errors for the purpose of consumers that generally + * only deal with one error. Callers can extract the individual errors + * contained in this object, but may also just treat it as a normal single + * error, in which case a summary message will be printed. + */ +function MultiError(errors) +{ + mod_assertplus.array(errors, 'list of errors'); + mod_assertplus.ok(errors.length > 0, 'must be at least one error'); + this.ase_errors = errors; + + VError.call(this, { + 'cause': errors[0] + }, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's'); +} + +mod_util.inherits(MultiError, VError); +MultiError.prototype.name = 'MultiError'; + +MultiError.prototype.errors = function me_errors() +{ + return (this.ase_errors.slice(0)); +}; + + +/* + * See README.md for reference details. + */ +function WError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof WError)) { + obj = Object.create(WError.prototype); + WError.apply(obj, args); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + options = parsed.options; + options['skipCauseMessage'] = true; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +mod_util.inherits(WError, VError); +WError.prototype.name = 'WError'; + +WError.prototype.toString = function we_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + if (this.jse_cause && this.jse_cause.message) + str += '; caused by ' + this.jse_cause.toString(); + + return (str); +}; + +/* + * For purely historical reasons, WError's cause() function allows you to set + * the cause. + */ +WError.prototype.cause = function we_cause(c) +{ + if (mod_isError(c)) + this.jse_cause = c; + + return (this.jse_cause); +}; 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/xml-char-classes/index.js b/node_modules/xml-char-classes/index.js new file mode 100644 index 00000000..8a21138b --- /dev/null +++ b/node_modules/xml-char-classes/index.js @@ -0,0 +1,11 @@ +exports.baseChar = /[A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B36-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60\u0D61\u0E01-\u0E2E\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102\u1103\u1105-\u1107\u1109\u110B\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D\u116E\u1172\u1173\u1175\u119E\u11A8\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\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\u2126\u212A\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3]/; + +exports.ideographic = /[\u3007\u3021-\u3029\u4E00-\u9FA5]/; + +exports.letter = /[A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B36-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60\u0D61\u0E01-\u0E2E\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102\u1103\u1105-\u1107\u1109\u110B\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D\u116E\u1172\u1173\u1175\u119E\u11A8\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\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\u2126\u212A\u212B\u212E\u2180-\u2182\u3007\u3021-\u3029\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\u4E00-\u9FA5\uAC00-\uD7A3]/; + +exports.combiningChar = /[\u0300-\u0345\u0360\u0361\u0483-\u0486\u0591-\u05A1\u05A3-\u05B9\u05BB-\u05BD\u05BF\u05C1\u05C2\u05C4\u064B-\u0652\u0670\u06D6-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0901-\u0903\u093C\u093E-\u094D\u0951-\u0954\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A02\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A70\u0A71\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0B01-\u0B03\u0B3C\u0B3E-\u0B43\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B82\u0B83\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C82\u0C83\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F95\u0F97\u0F99-\u0FAD\u0FB1-\u0FB7\u0FB9\u20D0-\u20DC\u20E1\u302A-\u302F\u3099\u309A]/; + +exports.digit = /[0-9\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]/; + +exports.extender = /[\xB7\u02D0\u02D1\u0387\u0640\u0E46\u0EC6\u3005\u3031-\u3035\u309D\u309E\u30FC-\u30FE]/; \ No newline at end of file diff --git a/node_modules/xml-char-classes/package.json b/node_modules/xml-char-classes/package.json new file mode 100644 index 00000000..91530f27 --- /dev/null +++ b/node_modules/xml-char-classes/package.json @@ -0,0 +1,39 @@ +{ + "name": "xml-char-classes", + "version": "1.0.0", + "description": "Regular expressions for matching against the XML Character Classes", + "license": "MIT", + "repository": "sindresorhus/xml-char-classes", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha", + "prepublish": "node generate.js" + }, + "files": [ + "index.js" + ], + "keywords": [ + "xml", + "re", + "regex", + "name", + "element", + "tag", + "match", + "unicode", + "char", + "character", + "classes" + ], + "devDependencies": { + "mocha": "*", + "regenerate": "^0.6.2" + } +} diff --git a/node_modules/xml-char-classes/readme.md b/node_modules/xml-char-classes/readme.md new file mode 100644 index 00000000..c10ed3e4 --- /dev/null +++ b/node_modules/xml-char-classes/readme.md @@ -0,0 +1,45 @@ +# xml-char-classes [![Build Status](https://travis-ci.org/sindresorhus/xml-char-classes.svg?branch=master)](https://travis-ci.org/sindresorhus/xml-char-classes) + +> Regular expressions for matching against the [XML Character Classes](http://www.w3.org/TR/2006/REC-xml-20060816/#CharClasses) + + +## Install + +```sh +$ npm install --save xml-char-classes +``` + + +## Usage + +```js +var xmlCharClasses = require('xml-char-classes'); + +console.log(xmlCharClasses.digit); +//=> /[0-9\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]/ + +xmlCharClasses.letter.test('unicorn'); +//=> true + +xmlCharClasses.letter.test('#'); +//=> false +``` + + +## API + +### xmlCharClasses + +Contains the following regular expressions for matching the different [character classes](http://www.w3.org/TR/2006/REC-xml-20060816/#CharClasses) in the XML spec. + +- letter +- baseChar +- ideographic +- combiningChar +- digit +- extender + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..36f60336 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1622 @@ +{ + "name": "dicho-hackaton", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dicho-hackaton", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ejs": "^3.1.9", + "express": "^4.18.2", + "express-minify-html": "^0.12.0", + "request": "^2.88.2" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "dependencies": { + "source-map": "0.5.x" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-minify-html": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", + "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", + "dependencies": { + "html-minifier": "3.5.7", + "lodash.merge": "4.6.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", + "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.12.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.2.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", + "dependencies": { + "xml-char-classes": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", + "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", + "engines": { + "node": ">=0.10.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..0f98715d --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "dicho-hackaton", + "version": "1.0.0", + "description": "Welcome to the world of poetry with a twist of AI", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/RainbowJM/dicho-hackaton.git" + }, + "keywords": [ + "Hackaton", + "AI", + "Poetry" + ], + "author": "Keïsha Alexander & Jevona Magdalena", + "license": "MIT", + "bugs": { + "url": "https://github.com/RainbowJM/dicho-hackaton/issues" + }, + "homepage": "https://github.com/RainbowJM/dicho-hackaton#readme", + "dependencies": { + "ejs": "^3.1.9", + "express": "^4.18.2", + "express-minify-html": "^0.12.0", + "request": "^2.88.2" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } +} diff --git a/public/styles/styles.css b/public/styles/styles.css new file mode 100644 index 00000000..e69de29b diff --git a/views/index.html b/views/index.html new file mode 100644 index 00000000..e69de29b From 7aa64a05716dc66d9b06c93ea787e51cb0441606 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:41:10 +0200 Subject: [PATCH 04/90] init ejs --- views/{index.html => index.ejs} | 0 views/offline.ejs | 0 views/partials/footer.ejs | 0 views/partials/head.ejs | 0 views/partials/header.ejs | 0 views/poemas.ejs | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename views/{index.html => index.ejs} (100%) create mode 100644 views/offline.ejs create mode 100644 views/partials/footer.ejs create mode 100644 views/partials/head.ejs create mode 100644 views/partials/header.ejs create mode 100644 views/poemas.ejs diff --git a/views/index.html b/views/index.ejs similarity index 100% rename from views/index.html rename to views/index.ejs diff --git a/views/offline.ejs b/views/offline.ejs new file mode 100644 index 00000000..e69de29b diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs new file mode 100644 index 00000000..e69de29b diff --git a/views/partials/head.ejs b/views/partials/head.ejs new file mode 100644 index 00000000..e69de29b diff --git a/views/partials/header.ejs b/views/partials/header.ejs new file mode 100644 index 00000000..e69de29b diff --git a/views/poemas.ejs b/views/poemas.ejs new file mode 100644 index 00000000..e69de29b From f2babdb3b035f8b4f12e6d452d1167d9c700a4bd Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:56:19 +0200 Subject: [PATCH 05/90] remove node_modules --- node_modules/.bin/ejs | 1 - node_modules/.bin/he | 1 - node_modules/.bin/html-minifier | 1 - node_modules/.bin/jake | 1 - node_modules/.bin/mime | 1 - node_modules/.bin/nodemon | 1 - node_modules/.bin/nodetouch | 1 - node_modules/.bin/nopt | 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/uglifyjs | 1 - node_modules/.bin/uuid | 1 - node_modules/.package-lock.json | 1608 --- 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/accepts/HISTORY.md | 243 - node_modules/accepts/LICENSE | 23 - node_modules/accepts/README.md | 140 - node_modules/accepts/index.js | 238 - node_modules/accepts/package.json | 47 - 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/lib/ajv.d.ts | 397 - node_modules/ajv/lib/ajv.js | 506 - node_modules/ajv/lib/cache.js | 26 - node_modules/ajv/lib/compile/async.js | 90 - node_modules/ajv/lib/compile/equal.js | 5 - node_modules/ajv/lib/compile/error_classes.js | 34 - node_modules/ajv/lib/compile/formats.js | 142 - node_modules/ajv/lib/compile/index.js | 387 - node_modules/ajv/lib/compile/resolve.js | 270 - node_modules/ajv/lib/compile/rules.js | 66 - node_modules/ajv/lib/compile/schema_obj.js | 9 - node_modules/ajv/lib/compile/ucs2length.js | 20 - node_modules/ajv/lib/compile/util.js | 239 - node_modules/ajv/lib/data.js | 49 - node_modules/ajv/lib/definition_schema.js | 37 - node_modules/ajv/lib/dot/_limit.jst | 113 - node_modules/ajv/lib/dot/_limitItems.jst | 12 - node_modules/ajv/lib/dot/_limitLength.jst | 12 - node_modules/ajv/lib/dot/_limitProperties.jst | 12 - node_modules/ajv/lib/dot/allOf.jst | 32 - node_modules/ajv/lib/dot/anyOf.jst | 46 - node_modules/ajv/lib/dot/coerce.def | 51 - node_modules/ajv/lib/dot/comment.jst | 9 - node_modules/ajv/lib/dot/const.jst | 11 - node_modules/ajv/lib/dot/contains.jst | 55 - node_modules/ajv/lib/dot/custom.jst | 191 - node_modules/ajv/lib/dot/defaults.def | 47 - node_modules/ajv/lib/dot/definitions.def | 203 - node_modules/ajv/lib/dot/dependencies.jst | 79 - node_modules/ajv/lib/dot/enum.jst | 30 - node_modules/ajv/lib/dot/errors.def | 194 - node_modules/ajv/lib/dot/format.jst | 106 - node_modules/ajv/lib/dot/if.jst | 73 - node_modules/ajv/lib/dot/items.jst | 98 - node_modules/ajv/lib/dot/missing.def | 39 - node_modules/ajv/lib/dot/multipleOf.jst | 22 - node_modules/ajv/lib/dot/not.jst | 43 - node_modules/ajv/lib/dot/oneOf.jst | 54 - node_modules/ajv/lib/dot/pattern.jst | 14 - node_modules/ajv/lib/dot/properties.jst | 245 - node_modules/ajv/lib/dot/propertyNames.jst | 52 - node_modules/ajv/lib/dot/ref.jst | 85 - node_modules/ajv/lib/dot/required.jst | 108 - node_modules/ajv/lib/dot/uniqueItems.jst | 62 - node_modules/ajv/lib/dot/validate.jst | 276 - node_modules/ajv/lib/dotjs/README.md | 3 - node_modules/ajv/lib/dotjs/_limit.js | 163 - node_modules/ajv/lib/dotjs/_limitItems.js | 80 - node_modules/ajv/lib/dotjs/_limitLength.js | 85 - .../ajv/lib/dotjs/_limitProperties.js | 80 - node_modules/ajv/lib/dotjs/allOf.js | 42 - node_modules/ajv/lib/dotjs/anyOf.js | 73 - node_modules/ajv/lib/dotjs/comment.js | 14 - node_modules/ajv/lib/dotjs/const.js | 56 - node_modules/ajv/lib/dotjs/contains.js | 81 - node_modules/ajv/lib/dotjs/custom.js | 228 - node_modules/ajv/lib/dotjs/dependencies.js | 168 - node_modules/ajv/lib/dotjs/enum.js | 66 - node_modules/ajv/lib/dotjs/format.js | 150 - node_modules/ajv/lib/dotjs/if.js | 103 - node_modules/ajv/lib/dotjs/index.js | 33 - node_modules/ajv/lib/dotjs/items.js | 140 - node_modules/ajv/lib/dotjs/multipleOf.js | 80 - node_modules/ajv/lib/dotjs/not.js | 84 - node_modules/ajv/lib/dotjs/oneOf.js | 73 - node_modules/ajv/lib/dotjs/pattern.js | 75 - node_modules/ajv/lib/dotjs/properties.js | 335 - node_modules/ajv/lib/dotjs/propertyNames.js | 81 - node_modules/ajv/lib/dotjs/ref.js | 124 - node_modules/ajv/lib/dotjs/required.js | 270 - node_modules/ajv/lib/dotjs/uniqueItems.js | 86 - node_modules/ajv/lib/dotjs/validate.js | 482 - node_modules/ajv/lib/keyword.js | 146 - node_modules/ajv/lib/refs/data.json | 17 - .../ajv/lib/refs/json-schema-draft-04.json | 149 - .../ajv/lib/refs/json-schema-draft-06.json | 154 - .../ajv/lib/refs/json-schema-draft-07.json | 168 - .../ajv/lib/refs/json-schema-secure.json | 94 - 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/ansi-styles/index.d.ts | 345 - node_modules/ansi-styles/index.js | 163 - node_modules/ansi-styles/license | 9 - node_modules/ansi-styles/package.json | 56 - node_modules/ansi-styles/readme.md | 152 - node_modules/anymatch/LICENSE | 15 - node_modules/anymatch/README.md | 87 - node_modules/anymatch/index.d.ts | 20 - node_modules/anymatch/index.js | 104 - node_modules/anymatch/package.json | 48 - node_modules/array-flatten/LICENSE | 21 - node_modules/array-flatten/README.md | 43 - node_modules/array-flatten/array-flatten.js | 64 - node_modules/array-flatten/package.json | 39 - node_modules/asn1/Jenkinsfile | 65 - node_modules/asn1/LICENSE | 19 - node_modules/asn1/README.md | 50 - node_modules/asn1/lib/ber/errors.js | 13 - node_modules/asn1/lib/ber/index.js | 27 - node_modules/asn1/lib/ber/reader.js | 262 - node_modules/asn1/lib/ber/types.js | 36 - node_modules/asn1/lib/ber/writer.js | 317 - node_modules/asn1/lib/index.js | 20 - 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/async/CHANGELOG.md | 348 - node_modules/async/LICENSE | 19 - node_modules/async/README.md | 59 - node_modules/async/all.js | 119 - node_modules/async/allLimit.js | 46 - node_modules/async/allSeries.js | 45 - node_modules/async/any.js | 122 - node_modules/async/anyLimit.js | 47 - node_modules/async/anySeries.js | 46 - node_modules/async/apply.js | 55 - node_modules/async/applyEach.js | 57 - node_modules/async/applyEachSeries.js | 37 - node_modules/async/asyncify.js | 118 - node_modules/async/auto.js | 333 - node_modules/async/autoInject.js | 182 - node_modules/async/bower.json | 17 - node_modules/async/cargo.js | 63 - node_modules/async/cargoQueue.js | 71 - node_modules/async/compose.js | 55 - node_modules/async/concat.js | 115 - node_modules/async/concatLimit.js | 60 - node_modules/async/concatSeries.js | 41 - node_modules/async/constant.js | 55 - node_modules/async/detect.js | 96 - node_modules/async/detectLimit.js | 48 - node_modules/async/detectSeries.js | 47 - node_modules/async/dir.js | 43 - node_modules/async/dist/async.js | 6059 --------- node_modules/async/dist/async.min.js | 1 - node_modules/async/dist/async.mjs | 5947 --------- node_modules/async/doDuring.js | 68 - node_modules/async/doUntil.js | 46 - node_modules/async/doWhilst.js | 68 - node_modules/async/during.js | 78 - node_modules/async/each.js | 129 - node_modules/async/eachLimit.js | 50 - node_modules/async/eachOf.js | 185 - node_modules/async/eachOfLimit.js | 47 - node_modules/async/eachOfSeries.js | 39 - node_modules/async/eachSeries.js | 44 - node_modules/async/ensureAsync.js | 67 - node_modules/async/every.js | 119 - node_modules/async/everyLimit.js | 46 - node_modules/async/everySeries.js | 45 - node_modules/async/filter.js | 93 - node_modules/async/filterLimit.js | 45 - node_modules/async/filterSeries.js | 43 - node_modules/async/find.js | 96 - node_modules/async/findLimit.js | 48 - node_modules/async/findSeries.js | 47 - node_modules/async/flatMap.js | 115 - node_modules/async/flatMapLimit.js | 60 - node_modules/async/flatMapSeries.js | 41 - node_modules/async/foldl.js | 153 - node_modules/async/foldr.js | 41 - node_modules/async/forEach.js | 129 - node_modules/async/forEachLimit.js | 50 - node_modules/async/forEachOf.js | 185 - node_modules/async/forEachOfLimit.js | 47 - node_modules/async/forEachOfSeries.js | 39 - node_modules/async/forEachSeries.js | 44 - node_modules/async/forever.js | 68 - node_modules/async/groupBy.js | 108 - node_modules/async/groupByLimit.js | 71 - node_modules/async/groupBySeries.js | 36 - node_modules/async/index.js | 588 - node_modules/async/inject.js | 153 - .../async/internal/DoublyLinkedList.js | 92 - node_modules/async/internal/Heap.js | 120 - node_modules/async/internal/applyEach.js | 29 - .../async/internal/asyncEachOfLimit.js | 75 - node_modules/async/internal/awaitify.js | 27 - node_modules/async/internal/breakLoop.js | 10 - node_modules/async/internal/consoleFunc.js | 31 - node_modules/async/internal/createTester.js | 40 - node_modules/async/internal/eachOfLimit.js | 90 - node_modules/async/internal/filter.js | 55 - node_modules/async/internal/getIterator.js | 11 - node_modules/async/internal/initialParams.js | 14 - node_modules/async/internal/isArrayLike.js | 10 - node_modules/async/internal/iterator.js | 57 - node_modules/async/internal/map.js | 30 - node_modules/async/internal/once.js | 17 - node_modules/async/internal/onlyOnce.js | 15 - node_modules/async/internal/parallel.js | 34 - .../async/internal/promiseCallback.js | 23 - node_modules/async/internal/queue.js | 294 - node_modules/async/internal/range.js | 14 - node_modules/async/internal/reject.js | 26 - node_modules/async/internal/setImmediate.js | 34 - node_modules/async/internal/withoutIndex.js | 10 - node_modules/async/internal/wrapAsync.js | 34 - node_modules/async/log.js | 41 - node_modules/async/map.js | 142 - node_modules/async/mapLimit.js | 45 - node_modules/async/mapSeries.js | 44 - node_modules/async/mapValues.js | 152 - node_modules/async/mapValuesLimit.js | 61 - node_modules/async/mapValuesSeries.js | 37 - node_modules/async/memoize.js | 91 - node_modules/async/nextTick.js | 52 - node_modules/async/package.json | 75 - node_modules/async/parallel.js | 180 - node_modules/async/parallelLimit.js | 41 - node_modules/async/priorityQueue.js | 86 - node_modules/async/queue.js | 167 - node_modules/async/race.js | 67 - node_modules/async/reduce.js | 153 - node_modules/async/reduceRight.js | 41 - node_modules/async/reflect.js | 78 - node_modules/async/reflectAll.js | 93 - node_modules/async/reject.js | 87 - node_modules/async/rejectLimit.js | 45 - node_modules/async/rejectSeries.js | 43 - node_modules/async/retry.js | 159 - node_modules/async/retryable.js | 77 - node_modules/async/select.js | 93 - node_modules/async/selectLimit.js | 45 - node_modules/async/selectSeries.js | 43 - node_modules/async/seq.js | 79 - node_modules/async/series.js | 186 - node_modules/async/setImmediate.js | 45 - node_modules/async/some.js | 122 - node_modules/async/someLimit.js | 47 - node_modules/async/someSeries.js | 46 - node_modules/async/sortBy.js | 190 - node_modules/async/timeout.js | 89 - node_modules/async/times.js | 50 - node_modules/async/timesLimit.js | 43 - node_modules/async/timesSeries.js | 32 - node_modules/async/transform.js | 173 - node_modules/async/tryEach.js | 78 - node_modules/async/unmemoize.js | 25 - node_modules/async/until.js | 61 - node_modules/async/waterfall.js | 105 - node_modules/async/whilst.js | 78 - node_modules/async/wrapSync.js | 118 - 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/lib/abort.js | 29 - node_modules/asynckit/lib/async.js | 34 - node_modules/asynckit/lib/defer.js | 26 - node_modules/asynckit/lib/iterate.js | 75 - .../asynckit/lib/readable_asynckit.js | 91 - .../asynckit/lib/readable_parallel.js | 25 - node_modules/asynckit/lib/readable_serial.js | 25 - .../asynckit/lib/readable_serial_ordered.js | 29 - node_modules/asynckit/lib/state.js | 37 - node_modules/asynckit/lib/streamify.js | 141 - node_modules/asynckit/lib/terminator.js | 29 - 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/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 | 213 - node_modules/aws4/aws4.js | 381 - node_modules/aws4/lru.js | 96 - node_modules/aws4/package.json | 17 - .../balanced-match/.github/FUNDING.yml | 2 - node_modules/balanced-match/LICENSE.md | 21 - node_modules/balanced-match/README.md | 97 - node_modules/balanced-match/index.js | 62 - node_modules/balanced-match/package.json | 48 - 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 | 260 - .../binary-extensions.json.d.ts | 3 - node_modules/binary-extensions/index.d.ts | 14 - node_modules/binary-extensions/index.js | 1 - node_modules/binary-extensions/license | 9 - node_modules/binary-extensions/package.json | 38 - node_modules/binary-extensions/readme.md | 41 - node_modules/body-parser/HISTORY.md | 657 - node_modules/body-parser/LICENSE | 23 - node_modules/body-parser/README.md | 464 - node_modules/body-parser/SECURITY.md | 25 - node_modules/body-parser/index.js | 156 - node_modules/body-parser/lib/read.js | 205 - node_modules/body-parser/lib/types/json.js | 236 - node_modules/body-parser/lib/types/raw.js | 101 - node_modules/body-parser/lib/types/text.js | 121 - .../body-parser/lib/types/urlencoded.js | 284 - node_modules/body-parser/package.json | 56 - 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/CHANGELOG.md | 184 - node_modules/braces/LICENSE | 21 - node_modules/braces/README.md | 593 - node_modules/braces/index.js | 170 - node_modules/braces/lib/compile.js | 57 - node_modules/braces/lib/constants.js | 57 - node_modules/braces/lib/expand.js | 113 - node_modules/braces/lib/parse.js | 333 - node_modules/braces/lib/stringify.js | 32 - node_modules/braces/lib/utils.js | 112 - node_modules/braces/package.json | 77 - node_modules/bytes/History.md | 97 - node_modules/bytes/LICENSE | 23 - node_modules/bytes/Readme.md | 152 - node_modules/bytes/index.js | 170 - node_modules/bytes/package.json | 42 - 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 | 42 - 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 | 47 - 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/camel-case/LICENSE | 21 - node_modules/camel-case/camel-case.d.ts | 3 - node_modules/camel-case/camel-case.js | 23 - node_modules/camel-case/package.json | 56 - 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.d.ts | 415 - node_modules/chalk/license | 9 - .../chalk/node_modules/has-flag/index.d.ts | 39 - .../chalk/node_modules/has-flag/index.js | 8 - .../chalk/node_modules/has-flag/license | 9 - .../chalk/node_modules/has-flag/package.json | 46 - .../chalk/node_modules/has-flag/readme.md | 89 - .../node_modules/supports-color/browser.js | 5 - .../node_modules/supports-color/index.js | 135 - .../chalk/node_modules/supports-color/license | 9 - .../node_modules/supports-color/package.json | 53 - .../node_modules/supports-color/readme.md | 76 - node_modules/chalk/package.json | 68 - node_modules/chalk/readme.md | 341 - node_modules/chalk/source/index.js | 229 - node_modules/chalk/source/templates.js | 134 - node_modules/chalk/source/util.js | 39 - node_modules/chokidar/LICENSE | 21 - node_modules/chokidar/README.md | 308 - node_modules/chokidar/index.js | 973 -- node_modules/chokidar/lib/constants.js | 65 - node_modules/chokidar/lib/fsevents-handler.js | 524 - node_modules/chokidar/lib/nodefs-handler.js | 654 - node_modules/chokidar/package.json | 85 - node_modules/chokidar/types/index.d.ts | 188 - node_modules/clean-css/History.md | 1330 -- node_modules/clean-css/LICENSE | 19 - node_modules/clean-css/README.md | 720 -- node_modules/clean-css/index.js | 1 - node_modules/clean-css/lib/clean.js | 156 - node_modules/clean-css/lib/optimizer/hack.js | 8 - .../lib/optimizer/level-0/optimize.js | 6 - .../lib/optimizer/level-1/optimize.js | 673 - .../lib/optimizer/level-1/shorten-hex.js | 189 - .../lib/optimizer/level-1/shorten-hsl.js | 61 - .../lib/optimizer/level-1/shorten-rgb.js | 10 - .../lib/optimizer/level-1/sort-selectors.js | 23 - .../lib/optimizer/level-1/tidy-at-rule.js | 9 - .../lib/optimizer/level-1/tidy-block.js | 23 - .../lib/optimizer/level-1/tidy-rules.js | 213 - .../lib/optimizer/level-2/break-up.js | 596 - .../lib/optimizer/level-2/can-override.js | 274 - .../clean-css/lib/optimizer/level-2/clone.js | 33 - .../lib/optimizer/level-2/compactable.js | 987 -- .../optimizer/level-2/extract-properties.js | 73 - .../level-2/invalid-property-error.js | 10 - .../lib/optimizer/level-2/is-mergeable.js | 259 - .../lib/optimizer/level-2/merge-adjacent.js | 50 - .../optimizer/level-2/merge-media-queries.js | 103 - .../level-2/merge-non-adjacent-by-body.js | 80 - .../level-2/merge-non-adjacent-by-selector.js | 78 - .../lib/optimizer/level-2/optimize.js | 134 - .../level-2/properties/every-values-pair.js | 28 - .../level-2/properties/find-component-in.js | 40 - .../level-2/properties/has-inherit.js | 10 - .../level-2/properties/is-component-of.js | 22 - .../properties/is-mergeable-shorthand.js | 11 - .../properties/merge-into-shorthands.js | 445 - .../optimizer/level-2/properties/optimize.js | 40 - .../level-2/properties/override-properties.js | 484 - .../overrides-non-component-shorthand.js | 9 - .../level-2/properties/populate-components.js | 42 - .../level-2/properties/understandable.js | 15 - .../level-2/properties/vendor-prefixes.js | 23 - .../optimizer/level-2/reduce-non-adjacent.js | 180 - .../level-2/remove-duplicate-font-at-rules.js | 30 - .../level-2/remove-duplicate-media-queries.js | 30 - .../optimizer/level-2/remove-duplicates.js | 43 - .../level-2/remove-unused-at-rules.js | 249 - .../lib/optimizer/level-2/reorderable.js | 93 - .../level-2/restore-with-components.js | 13 - .../lib/optimizer/level-2/restore.js | 303 - .../lib/optimizer/level-2/restructure.js | 389 - .../lib/optimizer/level-2/rules-overlap.js | 32 - .../level-2/specificities-overlap.js | 34 - .../lib/optimizer/level-2/specificity.js | 77 - .../optimizer/level-2/tidy-rule-duplicates.js | 21 - .../clean-css/lib/optimizer/remove-unused.js | 11 - .../lib/optimizer/restore-from-optimizing.js | 69 - .../clean-css/lib/optimizer/validator.js | 526 - .../lib/optimizer/wrap-for-optimizing.js | 191 - .../clean-css/lib/options/compatibility.js | 183 - node_modules/clean-css/lib/options/fetch.js | 7 - node_modules/clean-css/lib/options/format.js | 185 - .../clean-css/lib/options/inline-request.js | 22 - .../clean-css/lib/options/inline-timeout.js | 7 - node_modules/clean-css/lib/options/inline.js | 15 - .../lib/options/optimization-level.js | 221 - .../clean-css/lib/options/rebase-to.js | 7 - node_modules/clean-css/lib/options/rebase.js | 5 - .../lib/options/rounding-precision.js | 88 - .../clean-css/lib/reader/apply-source-maps.js | 245 - .../reader/extract-import-url-and-media.js | 35 - .../lib/reader/input-source-map-tracker.js | 58 - .../lib/reader/is-allowed-resource.js | 77 - .../lib/reader/load-original-sources.js | 126 - .../lib/reader/load-remote-resource.js | 74 - .../clean-css/lib/reader/match-data-uri.js | 7 - .../clean-css/lib/reader/normalize-path.js | 8 - .../clean-css/lib/reader/read-sources.js | 341 - .../clean-css/lib/reader/rebase-local-map.js | 15 - .../clean-css/lib/reader/rebase-remote-map.js | 14 - node_modules/clean-css/lib/reader/rebase.js | 101 - .../clean-css/lib/reader/restore-import.js | 5 - .../clean-css/lib/reader/rewrite-url.js | 118 - .../clean-css/lib/tokenizer/marker.js | 26 - node_modules/clean-css/lib/tokenizer/token.js | 16 - .../clean-css/lib/tokenizer/tokenize.js | 526 - .../clean-css/lib/utils/clone-array.js | 12 - .../clean-css/lib/utils/format-position.js | 11 - .../clean-css/lib/utils/has-protocol.js | 7 - .../lib/utils/is-data-uri-resource.js | 7 - .../clean-css/lib/utils/is-http-resource.js | 7 - .../clean-css/lib/utils/is-https-resource.js | 7 - node_modules/clean-css/lib/utils/is-import.js | 7 - .../clean-css/lib/utils/is-remote-resource.js | 7 - .../clean-css/lib/utils/natural-compare.js | 31 - node_modules/clean-css/lib/utils/override.js | 34 - node_modules/clean-css/lib/utils/split.js | 50 - node_modules/clean-css/lib/writer/helpers.js | 225 - node_modules/clean-css/lib/writer/one-time.js | 52 - node_modules/clean-css/lib/writer/simple.js | 52 - .../clean-css/lib/writer/source-maps.js | 102 - node_modules/clean-css/package.json | 48 - 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 | 839 -- node_modules/color-convert/index.js | 81 - node_modules/color-convert/package.json | 48 - node_modules/color-convert/route.js | 97 - 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 | 28 - node_modules/combined-stream/License | 19 - node_modules/combined-stream/Readme.md | 138 - .../combined-stream/lib/combined_stream.js | 208 - node_modules/combined-stream/package.json | 25 - node_modules/combined-stream/yarn.lock | 17 - node_modules/commander/CHANGELOG.md | 326 - node_modules/commander/LICENSE | 22 - node_modules/commander/Readme.md | 370 - node_modules/commander/index.js | 1158 -- node_modules/commander/package.json | 34 - node_modules/commander/typings/index.d.ts | 295 - 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/content-disposition/HISTORY.md | 60 - node_modules/content-disposition/LICENSE | 22 - node_modules/content-disposition/README.md | 142 - node_modules/content-disposition/index.js | 458 - node_modules/content-disposition/package.json | 44 - node_modules/content-type/HISTORY.md | 29 - node_modules/content-type/LICENSE | 22 - node_modules/content-type/README.md | 94 - node_modules/content-type/index.js | 225 - node_modules/content-type/package.json | 42 - node_modules/cookie-signature/.npmignore | 4 - node_modules/cookie-signature/History.md | 38 - node_modules/cookie-signature/Readme.md | 42 - node_modules/cookie-signature/index.js | 51 - node_modules/cookie-signature/package.json | 18 - node_modules/cookie/HISTORY.md | 142 - node_modules/cookie/LICENSE | 24 - node_modules/cookie/README.md | 302 - node_modules/cookie/SECURITY.md | 25 - node_modules/cookie/index.js | 270 - node_modules/cookie/package.json | 44 - 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/lib/util.js | 107 - node_modules/core-util-is/package.json | 32 - node_modules/core-util-is/test.js | 68 - 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/lib/dashdash.js | 1055 -- node_modules/dashdash/package.json | 26 - 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/delayed-stream/.npmignore | 1 - node_modules/delayed-stream/License | 19 - node_modules/delayed-stream/Makefile | 7 - node_modules/delayed-stream/Readme.md | 141 - .../delayed-stream/lib/delayed_stream.js | 107 - node_modules/delayed-stream/package.json | 27 - node_modules/depd/History.md | 103 - node_modules/depd/LICENSE | 22 - node_modules/depd/Readme.md | 280 - node_modules/depd/index.js | 538 - node_modules/depd/lib/browser/index.js | 77 - node_modules/depd/package.json | 45 - node_modules/destroy/LICENSE | 23 - node_modules/destroy/README.md | 63 - node_modules/destroy/index.js | 209 - node_modules/destroy/package.json | 48 - node_modules/ecc-jsbn/LICENSE | 21 - node_modules/ecc-jsbn/README.md | 8 - node_modules/ecc-jsbn/index.js | 58 - node_modules/ecc-jsbn/lib/LICENSE-jsbn | 40 - node_modules/ecc-jsbn/lib/ec.js | 561 - node_modules/ecc-jsbn/lib/sec.js | 170 - node_modules/ecc-jsbn/package.json | 40 - node_modules/ecc-jsbn/test.js | 14 - node_modules/ee-first/LICENSE | 22 - node_modules/ee-first/README.md | 80 - node_modules/ee-first/index.js | 95 - node_modules/ee-first/package.json | 29 - node_modules/ejs/LICENSE | 202 - node_modules/ejs/README.md | 344 - node_modules/ejs/bin/cli.js | 211 - node_modules/ejs/ejs.js | 1736 --- node_modules/ejs/ejs.min.js | 1 - node_modules/ejs/jakefile.js | 88 - node_modules/ejs/lib/ejs.js | 951 -- node_modules/ejs/lib/utils.js | 241 - node_modules/ejs/package.json | 42 - node_modules/ejs/usage.txt | 24 - node_modules/encodeurl/HISTORY.md | 14 - node_modules/encodeurl/LICENSE | 22 - node_modules/encodeurl/README.md | 128 - node_modules/encodeurl/index.js | 60 - node_modules/encodeurl/package.json | 40 - node_modules/escape-html/LICENSE | 24 - node_modules/escape-html/Readme.md | 43 - node_modules/escape-html/index.js | 78 - node_modules/escape-html/package.json | 24 - node_modules/etag/HISTORY.md | 83 - node_modules/etag/LICENSE | 22 - node_modules/etag/README.md | 159 - node_modules/etag/index.js | 131 - node_modules/etag/package.json | 47 - node_modules/express-minify-html/LICENSE | 21 - node_modules/express-minify-html/README.md | 73 - node_modules/express-minify-html/minifier.js | 91 - node_modules/express-minify-html/package.json | 40 - node_modules/express/History.md | 3588 ------ node_modules/express/LICENSE | 24 - node_modules/express/Readme.md | 166 - node_modules/express/index.js | 11 - node_modules/express/lib/application.js | 661 - node_modules/express/lib/express.js | 116 - node_modules/express/lib/middleware/init.js | 43 - node_modules/express/lib/middleware/query.js | 47 - node_modules/express/lib/request.js | 525 - node_modules/express/lib/response.js | 1169 -- node_modules/express/lib/router/index.js | 673 - node_modules/express/lib/router/layer.js | 181 - node_modules/express/lib/router/route.js | 225 - node_modules/express/lib/utils.js | 304 - node_modules/express/lib/view.js | 182 - node_modules/express/package.json | 99 - 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/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/lib/extsprintf.js | 183 - node_modules/extsprintf/package.json | 14 - 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/filelist/README.md | 84 - node_modules/filelist/index.d.ts | 110 - node_modules/filelist/index.js | 495 - node_modules/filelist/jakefile.js | 15 - .../brace-expansion/.github/FUNDING.yml | 2 - .../node_modules/brace-expansion/LICENSE | 21 - .../node_modules/brace-expansion/README.md | 135 - .../node_modules/brace-expansion/index.js | 203 - .../node_modules/brace-expansion/package.json | 46 - .../filelist/node_modules/minimatch/LICENSE | 15 - .../filelist/node_modules/minimatch/README.md | 259 - .../node_modules/minimatch/lib/path.js | 4 - .../node_modules/minimatch/minimatch.js | 944 -- .../node_modules/minimatch/package.json | 35 - node_modules/filelist/package.json | 28 - node_modules/fill-range/LICENSE | 21 - node_modules/fill-range/README.md | 237 - node_modules/fill-range/index.js | 249 - node_modules/fill-range/package.json | 69 - node_modules/finalhandler/HISTORY.md | 195 - node_modules/finalhandler/LICENSE | 22 - node_modules/finalhandler/README.md | 147 - node_modules/finalhandler/SECURITY.md | 25 - node_modules/finalhandler/index.js | 336 - node_modules/finalhandler/package.json | 46 - 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/lib/browser.js | 2 - node_modules/form-data/lib/form_data.js | 457 - node_modules/form-data/lib/populate.js | 10 - node_modules/form-data/package.json | 65 - node_modules/form-data/yarn.lock | 2662 ---- node_modules/forwarded/HISTORY.md | 21 - node_modules/forwarded/LICENSE | 22 - node_modules/forwarded/README.md | 57 - node_modules/forwarded/index.js | 90 - node_modules/forwarded/package.json | 45 - node_modules/fresh/HISTORY.md | 70 - node_modules/fresh/LICENSE | 23 - node_modules/fresh/README.md | 119 - node_modules/fresh/index.js | 137 - node_modules/fresh/package.json | 46 - node_modules/fsevents/LICENSE | 22 - node_modules/fsevents/README.md | 83 - node_modules/fsevents/fsevents.d.ts | 46 - node_modules/fsevents/fsevents.js | 82 - node_modules/fsevents/fsevents.node | Bin 147128 -> 0 bytes node_modules/fsevents/package.json | 62 - 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/get-intrinsic/.eslintrc | 38 - .../get-intrinsic/.github/FUNDING.yml | 12 - node_modules/get-intrinsic/.nycrc | 9 - node_modules/get-intrinsic/CHANGELOG.md | 110 - node_modules/get-intrinsic/LICENSE | 21 - node_modules/get-intrinsic/README.md | 71 - node_modules/get-intrinsic/index.js | 344 - node_modules/get-intrinsic/package.json | 92 - .../get-intrinsic/test/GetIntrinsic.js | 274 - 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/lib/index.js | 123 - node_modules/getpass/package.json | 18 - node_modules/glob-parent/CHANGELOG.md | 110 - node_modules/glob-parent/LICENSE | 15 - node_modules/glob-parent/README.md | 137 - node_modules/glob-parent/index.js | 42 - node_modules/glob-parent/package.json | 48 - node_modules/har-schema/LICENSE | 13 - node_modules/har-schema/README.md | 49 - node_modules/har-schema/lib/afterRequest.json | 30 - .../har-schema/lib/beforeRequest.json | 30 - node_modules/har-schema/lib/browser.json | 20 - node_modules/har-schema/lib/cache.json | 21 - node_modules/har-schema/lib/content.json | 29 - node_modules/har-schema/lib/cookie.json | 36 - node_modules/har-schema/lib/creator.json | 20 - node_modules/har-schema/lib/entry.json | 53 - node_modules/har-schema/lib/har.json | 13 - node_modules/har-schema/lib/header.json | 20 - node_modules/har-schema/lib/index.js | 22 - node_modules/har-schema/lib/log.json | 36 - node_modules/har-schema/lib/page.json | 32 - node_modules/har-schema/lib/pageTimings.json | 18 - node_modules/har-schema/lib/postData.json | 43 - node_modules/har-schema/lib/query.json | 20 - node_modules/har-schema/lib/request.json | 57 - node_modules/har-schema/lib/response.json | 54 - node_modules/har-schema/lib/timings.json | 42 - node_modules/har-schema/package.json | 54 - node_modules/har-validator/LICENSE | 9 - node_modules/har-validator/README.md | 43 - node_modules/har-validator/lib/async.js | 105 - node_modules/har-validator/lib/error.js | 17 - node_modules/har-validator/lib/promise.js | 102 - node_modules/har-validator/package.json | 43 - 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 - node_modules/has-symbols/.nycrc | 9 - node_modules/has-symbols/CHANGELOG.md | 75 - node_modules/has-symbols/LICENSE | 21 - node_modules/has-symbols/README.md | 46 - node_modules/has-symbols/index.js | 13 - node_modules/has-symbols/package.json | 101 - 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 | 56 - 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/he/LICENSE-MIT.txt | 20 - node_modules/he/README.md | 379 - node_modules/he/bin/he | 148 - node_modules/he/he.js | 342 - node_modules/he/man/he.1 | 78 - node_modules/he/package.json | 56 - node_modules/html-minifier/LICENSE | 22 - node_modules/html-minifier/README.md | 159 - node_modules/html-minifier/cli.js | 307 - node_modules/html-minifier/package.json | 87 - .../html-minifier/sample-cli-config-file.conf | 39 - .../html-minifier/src/htmlminifier.js | 1298 -- node_modules/html-minifier/src/htmlparser.js | 528 - node_modules/html-minifier/src/tokenchain.js | 71 - node_modules/html-minifier/src/utils.js | 18 - node_modules/http-errors/HISTORY.md | 180 - node_modules/http-errors/LICENSE | 23 - node_modules/http-errors/README.md | 169 - node_modules/http-errors/index.js | 289 - node_modules/http-errors/package.json | 50 - 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/http-signature/lib/index.js | 29 - node_modules/http-signature/lib/parser.js | 315 - node_modules/http-signature/lib/signer.js | 401 - node_modules/http-signature/lib/utils.js | 112 - node_modules/http-signature/lib/verify.js | 88 - node_modules/http-signature/package.json | 39 - node_modules/iconv-lite/Changelog.md | 162 - node_modules/iconv-lite/LICENSE | 21 - node_modules/iconv-lite/README.md | 156 - .../iconv-lite/encodings/dbcs-codec.js | 555 - .../iconv-lite/encodings/dbcs-data.js | 176 - node_modules/iconv-lite/encodings/index.js | 22 - node_modules/iconv-lite/encodings/internal.js | 188 - .../iconv-lite/encodings/sbcs-codec.js | 72 - .../encodings/sbcs-data-generated.js | 451 - .../iconv-lite/encodings/sbcs-data.js | 174 - .../encodings/tables/big5-added.json | 122 - .../iconv-lite/encodings/tables/cp936.json | 264 - .../iconv-lite/encodings/tables/cp949.json | 273 - .../iconv-lite/encodings/tables/cp950.json | 177 - .../iconv-lite/encodings/tables/eucjp.json | 182 - .../encodings/tables/gb18030-ranges.json | 1 - .../encodings/tables/gbk-added.json | 55 - .../iconv-lite/encodings/tables/shiftjis.json | 125 - node_modules/iconv-lite/encodings/utf16.js | 177 - node_modules/iconv-lite/encodings/utf7.js | 290 - node_modules/iconv-lite/lib/bom-handling.js | 52 - node_modules/iconv-lite/lib/extend-node.js | 217 - node_modules/iconv-lite/lib/index.d.ts | 24 - node_modules/iconv-lite/lib/index.js | 153 - node_modules/iconv-lite/lib/streams.js | 121 - node_modules/iconv-lite/package.json | 46 - node_modules/ignore-by-default/LICENSE | 14 - node_modules/ignore-by-default/README.md | 26 - node_modules/ignore-by-default/index.js | 12 - node_modules/ignore-by-default/package.json | 34 - 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/ipaddr.js/LICENSE | 19 - node_modules/ipaddr.js/README.md | 233 - node_modules/ipaddr.js/ipaddr.min.js | 1 - node_modules/ipaddr.js/lib/ipaddr.js | 673 - node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 - node_modules/ipaddr.js/package.json | 35 - node_modules/is-binary-path/index.d.ts | 17 - node_modules/is-binary-path/index.js | 7 - node_modules/is-binary-path/license | 9 - node_modules/is-binary-path/package.json | 40 - node_modules/is-binary-path/readme.md | 34 - 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-glob/LICENSE | 21 - node_modules/is-glob/README.md | 206 - node_modules/is-glob/index.js | 150 - node_modules/is-glob/package.json | 81 - node_modules/is-number/LICENSE | 21 - node_modules/is-number/README.md | 187 - node_modules/is-number/index.js | 18 - node_modules/is-number/package.json | 82 - 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/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/jake/Makefile | 44 - node_modules/jake/README.md | 17 - node_modules/jake/bin/bash_completion.sh | 41 - node_modules/jake/bin/cli.js | 31 - node_modules/jake/jakefile.js | 94 - node_modules/jake/lib/api.js | 409 - node_modules/jake/lib/jake.js | 330 - node_modules/jake/lib/loader.js | 173 - node_modules/jake/lib/namespace.js | 115 - node_modules/jake/lib/package_task.js | 406 - node_modules/jake/lib/parseargs.js | 134 - node_modules/jake/lib/program.js | 282 - node_modules/jake/lib/publish_task.js | 290 - node_modules/jake/lib/rule.js | 311 - node_modules/jake/lib/task/directory_task.js | 30 - node_modules/jake/lib/task/file_task.js | 124 - node_modules/jake/lib/task/index.js | 9 - node_modules/jake/lib/task/task.js | 449 - node_modules/jake/lib/test_task.js | 270 - node_modules/jake/lib/utils/file.js | 286 - node_modules/jake/lib/utils/index.js | 297 - node_modules/jake/lib/utils/logger.js | 24 - node_modules/jake/package.json | 42 - .../jake/test/integration/concurrent.js | 45 - node_modules/jake/test/integration/file.js | 228 - .../jake/test/integration/file_task.js | 126 - node_modules/jake/test/integration/helpers.js | 80 - .../jake/test/integration/jakefile.js | 337 - .../integration/jakelib/concurrent.jake.js | 113 - .../test/integration/jakelib/publish.jake.js | 49 - .../jakelib/required_module.jake.js | 10 - .../test/integration/jakelib/rule.jake.js | 222 - .../jake/test/integration/publish_task.js | 27 - node_modules/jake/test/integration/rule.js | 217 - node_modules/jake/test/integration/selfdep.js | 42 - .../jake/test/integration/task_base.js | 167 - node_modules/jake/test/unit/jakefile.js | 36 - node_modules/jake/test/unit/namespace.js | 77 - node_modules/jake/test/unit/parseargs.js | 169 - node_modules/jake/usage.txt | 16 - 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/LICENSE | 195 - node_modules/json-schema/README.md | 3 - node_modules/json-schema/lib/links.js | 65 - node_modules/json-schema/lib/validate.js | 271 - node_modules/json-schema/package.json | 24 - 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 | 53 - node_modules/jsprim/CONTRIBUTING.md | 19 - node_modules/jsprim/LICENSE | 19 - node_modules/jsprim/README.md | 287 - node_modules/jsprim/lib/jsprim.js | 735 -- node_modules/jsprim/package.json | 20 - node_modules/lodash.merge/LICENSE | 47 - node_modules/lodash.merge/README.md | 18 - node_modules/lodash.merge/index.js | 2207 ---- node_modules/lodash.merge/package.json | 17 - node_modules/lower-case/LICENSE | 21 - node_modules/lower-case/README.md | 45 - node_modules/lower-case/lower-case.d.ts | 3 - node_modules/lower-case/lower-case.js | 54 - node_modules/lower-case/package.json | 52 - node_modules/media-typer/HISTORY.md | 22 - node_modules/media-typer/LICENSE | 22 - node_modules/media-typer/README.md | 81 - node_modules/media-typer/index.js | 270 - node_modules/media-typer/package.json | 26 - node_modules/merge-descriptors/HISTORY.md | 21 - node_modules/merge-descriptors/LICENSE | 23 - node_modules/merge-descriptors/README.md | 48 - node_modules/merge-descriptors/index.js | 60 - node_modules/merge-descriptors/package.json | 32 - node_modules/methods/HISTORY.md | 29 - node_modules/methods/LICENSE | 24 - node_modules/methods/README.md | 51 - node_modules/methods/index.js | 69 - node_modules/methods/package.json | 36 - node_modules/mime-db/HISTORY.md | 507 - node_modules/mime-db/LICENSE | 23 - node_modules/mime-db/README.md | 100 - node_modules/mime-db/db.json | 8519 ------------- node_modules/mime-db/index.js | 12 - node_modules/mime-db/package.json | 60 - node_modules/mime-types/HISTORY.md | 397 - node_modules/mime-types/LICENSE | 23 - node_modules/mime-types/README.md | 113 - node_modules/mime-types/index.js | 188 - node_modules/mime-types/package.json | 44 - node_modules/mime/.npmignore | 0 node_modules/mime/CHANGELOG.md | 164 - node_modules/mime/LICENSE | 21 - node_modules/mime/README.md | 90 - node_modules/mime/cli.js | 8 - node_modules/mime/mime.js | 108 - node_modules/mime/package.json | 44 - node_modules/mime/src/build.js | 53 - node_modules/mime/src/test.js | 60 - node_modules/mime/types.json | 1 - node_modules/minimatch/LICENSE | 15 - node_modules/minimatch/README.md | 230 - node_modules/minimatch/minimatch.js | 947 -- node_modules/minimatch/package.json | 33 - 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/ncname/index.js | 9 - node_modules/ncname/package.json | 39 - node_modules/ncname/readme.md | 28 - node_modules/negotiator/HISTORY.md | 108 - node_modules/negotiator/LICENSE | 24 - node_modules/negotiator/README.md | 203 - node_modules/negotiator/index.js | 82 - node_modules/negotiator/lib/charset.js | 169 - node_modules/negotiator/lib/encoding.js | 184 - node_modules/negotiator/lib/language.js | 179 - node_modules/negotiator/lib/mediaType.js | 294 - node_modules/negotiator/package.json | 42 - node_modules/no-case/LICENSE | 21 - node_modules/no-case/README.md | 50 - node_modules/no-case/no-case.d.ts | 3 - node_modules/no-case/no-case.js | 40 - node_modules/no-case/package.json | 56 - .../no-case/vendor/camel-case-regexp.js | 1 - .../no-case/vendor/camel-case-upper-regexp.js | 1 - .../no-case/vendor/non-word-regexp.js | 1 - node_modules/nodemon/LICENSE | 21 - node_modules/nodemon/README.md | 434 - node_modules/nodemon/bin/nodemon.js | 16 - node_modules/nodemon/bin/windows-kill.exe | Bin 80384 -> 0 bytes node_modules/nodemon/doc/cli/authors.txt | 8 - node_modules/nodemon/doc/cli/config.txt | 44 - node_modules/nodemon/doc/cli/help.txt | 29 - node_modules/nodemon/doc/cli/logo.txt | 20 - node_modules/nodemon/doc/cli/options.txt | 36 - node_modules/nodemon/doc/cli/topics.txt | 8 - node_modules/nodemon/doc/cli/usage.txt | 3 - node_modules/nodemon/doc/cli/whoami.txt | 9 - node_modules/nodemon/lib/cli/index.js | 49 - node_modules/nodemon/lib/cli/parse.js | 230 - node_modules/nodemon/lib/config/command.js | 43 - node_modules/nodemon/lib/config/defaults.js | 32 - node_modules/nodemon/lib/config/exec.js | 225 - node_modules/nodemon/lib/config/index.js | 93 - node_modules/nodemon/lib/config/load.js | 256 - node_modules/nodemon/lib/help/index.js | 27 - node_modules/nodemon/lib/index.js | 1 - node_modules/nodemon/lib/monitor/index.js | 4 - node_modules/nodemon/lib/monitor/match.js | 276 - node_modules/nodemon/lib/monitor/run.js | 546 - node_modules/nodemon/lib/monitor/signals.js | 34 - node_modules/nodemon/lib/monitor/watch.js | 239 - node_modules/nodemon/lib/nodemon.js | 311 - node_modules/nodemon/lib/rules/add.js | 89 - node_modules/nodemon/lib/rules/index.js | 53 - node_modules/nodemon/lib/rules/parse.js | 43 - node_modules/nodemon/lib/spawn.js | 74 - node_modules/nodemon/lib/utils/bus.js | 44 - node_modules/nodemon/lib/utils/clone.js | 40 - node_modules/nodemon/lib/utils/colour.js | 26 - node_modules/nodemon/lib/utils/index.js | 102 - node_modules/nodemon/lib/utils/log.js | 82 - node_modules/nodemon/lib/utils/merge.js | 47 - node_modules/nodemon/lib/version.js | 100 - .../nodemon/node_modules/debug/CHANGELOG.md | 395 - .../nodemon/node_modules/debug/LICENSE | 19 - .../nodemon/node_modules/debug/README.md | 437 - .../nodemon/node_modules/debug/node.js | 1 - .../nodemon/node_modules/debug/package.json | 51 - .../nodemon/node_modules/debug/src/browser.js | 180 - .../nodemon/node_modules/debug/src/common.js | 249 - .../nodemon/node_modules/debug/src/index.js | 12 - .../nodemon/node_modules/debug/src/node.js | 177 - node_modules/nodemon/node_modules/ms/index.js | 162 - .../nodemon/node_modules/ms/license.md | 21 - .../nodemon/node_modules/ms/package.json | 38 - .../nodemon/node_modules/ms/readme.md | 59 - node_modules/nodemon/package.json | 74 - node_modules/nopt/.npmignore | 0 node_modules/nopt/LICENSE | 23 - node_modules/nopt/README.md | 208 - node_modules/nopt/bin/nopt.js | 44 - node_modules/nopt/examples/my-program.js | 30 - node_modules/nopt/lib/nopt.js | 552 - node_modules/nopt/package.json | 12 - 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/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-inspect/.eslintrc | 53 - .../object-inspect/.github/FUNDING.yml | 12 - node_modules/object-inspect/.nycrc | 13 - node_modules/object-inspect/CHANGELOG.md | 370 - node_modules/object-inspect/LICENSE | 21 - node_modules/object-inspect/example/all.js | 23 - .../object-inspect/example/circular.js | 6 - node_modules/object-inspect/example/fn.js | 5 - .../object-inspect/example/inspect.js | 10 - node_modules/object-inspect/index.js | 516 - .../object-inspect/package-support.json | 20 - node_modules/object-inspect/package.json | 97 - node_modules/object-inspect/readme.markdown | 86 - node_modules/object-inspect/test-core-js.js | 26 - node_modules/object-inspect/test/bigint.js | 58 - .../object-inspect/test/browser/dom.js | 15 - node_modules/object-inspect/test/circular.js | 16 - node_modules/object-inspect/test/deep.js | 12 - node_modules/object-inspect/test/element.js | 53 - node_modules/object-inspect/test/err.js | 48 - node_modules/object-inspect/test/fakes.js | 29 - node_modules/object-inspect/test/fn.js | 76 - node_modules/object-inspect/test/has.js | 15 - node_modules/object-inspect/test/holes.js | 15 - .../object-inspect/test/indent-option.js | 271 - node_modules/object-inspect/test/inspect.js | 139 - node_modules/object-inspect/test/lowbyte.js | 12 - node_modules/object-inspect/test/number.js | 58 - .../object-inspect/test/quoteStyle.js | 17 - .../object-inspect/test/toStringTag.js | 40 - node_modules/object-inspect/test/undef.js | 12 - node_modules/object-inspect/test/values.js | 211 - node_modules/object-inspect/util.inspect.js | 1 - node_modules/on-finished/HISTORY.md | 98 - node_modules/on-finished/LICENSE | 23 - node_modules/on-finished/README.md | 162 - node_modules/on-finished/index.js | 234 - node_modules/on-finished/package.json | 39 - node_modules/param-case/LICENSE | 21 - node_modules/param-case/README.md | 45 - node_modules/param-case/package.json | 46 - node_modules/param-case/param-case.d.ts | 3 - node_modules/param-case/param-case.js | 12 - node_modules/parseurl/HISTORY.md | 58 - node_modules/parseurl/LICENSE | 24 - node_modules/parseurl/README.md | 133 - node_modules/parseurl/index.js | 158 - node_modules/parseurl/package.json | 40 - node_modules/path-to-regexp/History.md | 36 - node_modules/path-to-regexp/LICENSE | 21 - node_modules/path-to-regexp/Readme.md | 35 - node_modules/path-to-regexp/index.js | 129 - node_modules/path-to-regexp/package.json | 30 - 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 - .../performance-now/lib/performance-now.js | 36 - .../lib/performance-now.js.map | 10 - 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/picomatch/CHANGELOG.md | 136 - node_modules/picomatch/LICENSE | 21 - node_modules/picomatch/README.md | 708 -- node_modules/picomatch/index.js | 3 - node_modules/picomatch/lib/constants.js | 179 - node_modules/picomatch/lib/parse.js | 1091 -- node_modules/picomatch/lib/picomatch.js | 342 - node_modules/picomatch/lib/scan.js | 391 - node_modules/picomatch/lib/utils.js | 64 - node_modules/picomatch/package.json | 81 - node_modules/proxy-addr/HISTORY.md | 161 - node_modules/proxy-addr/LICENSE | 22 - node_modules/proxy-addr/README.md | 139 - node_modules/proxy-addr/index.js | 327 - node_modules/proxy-addr/package.json | 47 - node_modules/psl/.env | 0 node_modules/psl/LICENSE | 9 - node_modules/psl/README.md | 211 - node_modules/psl/browserstack-logo.svg | 90 - node_modules/psl/data/rules.json | 9376 -------------- node_modules/psl/dist/psl.js | 10187 ---------------- node_modules/psl/dist/psl.min.js | 1 - node_modules/psl/index.js | 269 - node_modules/psl/package.json | 43 - node_modules/pstree.remy/.travis.yml | 8 - node_modules/pstree.remy/LICENSE | 7 - node_modules/pstree.remy/README.md | 26 - node_modules/pstree.remy/lib/index.js | 37 - node_modules/pstree.remy/lib/tree.js | 37 - node_modules/pstree.remy/lib/utils.js | 53 - node_modules/pstree.remy/package.json | 33 - .../pstree.remy/tests/fixtures/index.js | 13 - node_modules/pstree.remy/tests/fixtures/out1 | 10 - node_modules/pstree.remy/tests/fixtures/out2 | 29 - node_modules/pstree.remy/tests/index.test.js | 51 - node_modules/punycode/LICENSE-MIT.txt | 20 - node_modules/punycode/README.md | 126 - node_modules/punycode/package.json | 58 - node_modules/punycode/punycode.es6.js | 444 - node_modules/punycode/punycode.js | 443 - node_modules/qs/.editorconfig | 43 - node_modules/qs/.eslintrc | 38 - node_modules/qs/.github/FUNDING.yml | 12 - node_modules/qs/.nycrc | 13 - node_modules/qs/CHANGELOG.md | 546 - node_modules/qs/LICENSE.md | 29 - node_modules/qs/README.md | 625 - node_modules/qs/dist/qs.js | 2054 ---- node_modules/qs/lib/formats.js | 23 - node_modules/qs/lib/index.js | 11 - node_modules/qs/lib/parse.js | 263 - node_modules/qs/lib/stringify.js | 326 - node_modules/qs/lib/utils.js | 252 - node_modules/qs/package.json | 77 - node_modules/qs/test/parse.js | 855 -- node_modules/qs/test/stringify.js | 909 -- node_modules/qs/test/utils.js | 136 - node_modules/range-parser/HISTORY.md | 56 - node_modules/range-parser/LICENSE | 23 - node_modules/range-parser/README.md | 84 - node_modules/range-parser/index.js | 162 - node_modules/range-parser/package.json | 44 - node_modules/raw-body/HISTORY.md | 303 - node_modules/raw-body/LICENSE | 22 - node_modules/raw-body/README.md | 223 - node_modules/raw-body/SECURITY.md | 24 - node_modules/raw-body/index.d.ts | 87 - node_modules/raw-body/index.js | 329 - node_modules/raw-body/package.json | 49 - node_modules/readdirp/LICENSE | 21 - node_modules/readdirp/README.md | 122 - node_modules/readdirp/index.d.ts | 43 - node_modules/readdirp/index.js | 287 - node_modules/readdirp/package.json | 122 - node_modules/relateurl/README.md | 159 - node_modules/relateurl/lib/constants.js | 10 - node_modules/relateurl/lib/format.js | 174 - node_modules/relateurl/lib/index.js | 94 - node_modules/relateurl/lib/options.js | 57 - node_modules/relateurl/lib/parse/host.js | 26 - node_modules/relateurl/lib/parse/hrefInfo.js | 20 - node_modules/relateurl/lib/parse/index.js | 58 - node_modules/relateurl/lib/parse/path.js | 100 - node_modules/relateurl/lib/parse/port.js | 32 - node_modules/relateurl/lib/parse/query.js | 53 - node_modules/relateurl/lib/parse/urlstring.js | 146 - .../relateurl/lib/relate/absolutize.js | 89 - .../relateurl/lib/relate/findRelation.js | 79 - node_modules/relateurl/lib/relate/index.js | 18 - .../relateurl/lib/relate/relativize.js | 67 - node_modules/relateurl/lib/util/devlog.js | 25 - node_modules/relateurl/lib/util/object.js | 64 - node_modules/relateurl/lib/util/path.js | 49 - node_modules/relateurl/license | 21 - node_modules/relateurl/package.json | 46 - 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/lib/auth.js | 167 - node_modules/request/lib/cookies.js | 38 - node_modules/request/lib/getProxyFromURI.js | 79 - node_modules/request/lib/har.js | 205 - node_modules/request/lib/hawk.js | 89 - node_modules/request/lib/helpers.js | 66 - node_modules/request/lib/multipart.js | 112 - node_modules/request/lib/oauth.js | 148 - node_modules/request/lib/querystring.js | 50 - node_modules/request/lib/redirect.js | 154 - node_modules/request/lib/tunnel.js | 175 - .../request/node_modules/qs/.editorconfig | 43 - .../request/node_modules/qs/.eslintrc | 37 - .../node_modules/qs/.github/FUNDING.yml | 12 - node_modules/request/node_modules/qs/.nycrc | 13 - .../request/node_modules/qs/CHANGELOG.md | 250 - .../request/node_modules/qs/LICENSE.md | 29 - .../request/node_modules/qs/README.md | 510 - .../request/node_modules/qs/bower.json | 21 - .../request/node_modules/qs/component.json | 15 - .../request/node_modules/qs/dist/qs.js | 648 - .../request/node_modules/qs/lib/formats.js | 18 - .../request/node_modules/qs/lib/index.js | 11 - .../request/node_modules/qs/lib/parse.js | 175 - .../request/node_modules/qs/lib/stringify.js | 217 - .../request/node_modules/qs/lib/utils.js | 215 - .../request/node_modules/qs/package.json | 54 - .../request/node_modules/qs/test/index.js | 7 - .../request/node_modules/qs/test/parse.js | 649 - .../request/node_modules/qs/test/stringify.js | 642 - .../request/node_modules/qs/test/utils.js | 65 - node_modules/request/package.json | 86 - node_modules/request/request.js | 1553 --- 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/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/semver/CHANGELOG.md | 39 - node_modules/semver/LICENSE | 15 - node_modules/semver/README.md | 412 - node_modules/semver/bin/semver | 160 - node_modules/semver/package.json | 28 - node_modules/semver/range.bnf | 16 - node_modules/semver/semver.js | 1483 --- node_modules/send/HISTORY.md | 521 - node_modules/send/LICENSE | 23 - node_modules/send/README.md | 327 - node_modules/send/SECURITY.md | 24 - node_modules/send/index.js | 1143 -- node_modules/send/node_modules/ms/index.js | 162 - node_modules/send/node_modules/ms/license.md | 21 - .../send/node_modules/ms/package.json | 38 - node_modules/send/node_modules/ms/readme.md | 59 - node_modules/send/package.json | 62 - node_modules/serve-static/HISTORY.md | 471 - node_modules/serve-static/LICENSE | 25 - node_modules/serve-static/README.md | 257 - node_modules/serve-static/index.js | 210 - node_modules/serve-static/package.json | 42 - node_modules/setprototypeof/LICENSE | 13 - node_modules/setprototypeof/README.md | 31 - node_modules/setprototypeof/index.d.ts | 2 - node_modules/setprototypeof/index.js | 17 - node_modules/setprototypeof/package.json | 38 - node_modules/setprototypeof/test/index.js | 24 - node_modules/side-channel/.eslintignore | 1 - node_modules/side-channel/.eslintrc | 11 - node_modules/side-channel/.github/FUNDING.yml | 12 - node_modules/side-channel/.nycrc | 13 - node_modules/side-channel/CHANGELOG.md | 65 - node_modules/side-channel/LICENSE | 21 - node_modules/side-channel/README.md | 2 - node_modules/side-channel/index.js | 124 - node_modules/side-channel/package.json | 67 - node_modules/side-channel/test/index.js | 78 - node_modules/simple-update-notifier/LICENSE | 21 - node_modules/simple-update-notifier/README.md | 82 - .../simple-update-notifier/build/index.d.ts | 13 - .../simple-update-notifier/build/index.js | 217 - .../node_modules/.bin/semver | 1 - .../node_modules/semver/CHANGELOG.md | 74 - .../node_modules/semver/LICENSE | 15 - .../node_modules/semver/README.md | 499 - .../node_modules/semver/bin/semver.js | 173 - .../node_modules/semver/classes/comparator.js | 139 - .../node_modules/semver/classes/index.js | 5 - .../node_modules/semver/classes/range.js | 448 - .../node_modules/semver/classes/semver.js | 290 - .../node_modules/semver/functions/clean.js | 6 - .../node_modules/semver/functions/cmp.js | 48 - .../node_modules/semver/functions/coerce.js | 51 - .../semver/functions/compare-build.js | 7 - .../semver/functions/compare-loose.js | 3 - .../node_modules/semver/functions/compare.js | 5 - .../node_modules/semver/functions/diff.js | 25 - .../node_modules/semver/functions/eq.js | 3 - .../node_modules/semver/functions/gt.js | 3 - .../node_modules/semver/functions/gte.js | 3 - .../node_modules/semver/functions/inc.js | 15 - .../node_modules/semver/functions/lt.js | 3 - .../node_modules/semver/functions/lte.js | 3 - .../node_modules/semver/functions/major.js | 3 - .../node_modules/semver/functions/minor.js | 3 - .../node_modules/semver/functions/neq.js | 3 - .../node_modules/semver/functions/parse.js | 37 - .../node_modules/semver/functions/patch.js | 3 - .../semver/functions/prerelease.js | 6 - .../node_modules/semver/functions/rcompare.js | 3 - .../node_modules/semver/functions/rsort.js | 3 - .../semver/functions/satisfies.js | 10 - .../node_modules/semver/functions/sort.js | 3 - .../node_modules/semver/functions/valid.js | 6 - .../node_modules/semver/index.js | 64 - .../node_modules/semver/internal/constants.js | 17 - .../node_modules/semver/internal/debug.js | 9 - .../semver/internal/identifiers.js | 23 - .../node_modules/semver/internal/re.js | 179 - .../node_modules/semver/package.json | 34 - .../node_modules/semver/range.bnf | 16 - .../node_modules/semver/ranges/gtr.js | 4 - .../node_modules/semver/ranges/intersects.js | 7 - .../node_modules/semver/ranges/ltr.js | 4 - .../semver/ranges/max-satisfying.js | 25 - .../semver/ranges/min-satisfying.js | 24 - .../node_modules/semver/ranges/min-version.js | 57 - .../node_modules/semver/ranges/outside.js | 80 - .../semver/ranges/to-comparators.js | 8 - .../node_modules/semver/ranges/valid.js | 11 - .../simple-update-notifier/package.json | 97 - .../src/borderedText.ts | 12 - .../simple-update-notifier/src/cache.spec.ts | 17 - .../simple-update-notifier/src/cache.ts | 44 - .../src/getDistVersion.spec.ts | 35 - .../src/getDistVersion.ts | 29 - .../src/hasNewVersion.spec.ts | 82 - .../src/hasNewVersion.ts | 40 - .../simple-update-notifier/src/index.spec.ts | 27 - .../simple-update-notifier/src/index.ts | 34 - .../simple-update-notifier/src/isNpmOrYarn.ts | 12 - .../simple-update-notifier/src/types.ts | 8 - 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 ----- node_modules/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/lib/array-set.js | 121 - node_modules/source-map/lib/base64-vlq.js | 140 - node_modules/source-map/lib/base64.js | 67 - node_modules/source-map/lib/binary-search.js | 111 - node_modules/source-map/lib/mapping-list.js | 79 - node_modules/source-map/lib/quick-sort.js | 114 - .../source-map/lib/source-map-consumer.js | 1082 -- .../source-map/lib/source-map-generator.js | 416 - node_modules/source-map/lib/source-node.js | 413 - node_modules/source-map/lib/util.js | 417 - node_modules/source-map/package.json | 72 - node_modules/source-map/source-map.js | 8 - node_modules/sshpk/.travis.yml | 11 - node_modules/sshpk/Jenkinsfile | 86 - node_modules/sshpk/LICENSE | 18 - node_modules/sshpk/README.md | 804 -- node_modules/sshpk/bin/sshpk-conv | 243 - node_modules/sshpk/bin/sshpk-sign | 191 - node_modules/sshpk/bin/sshpk-verify | 167 - node_modules/sshpk/lib/algs.js | 168 - node_modules/sshpk/lib/certificate.js | 410 - node_modules/sshpk/lib/dhe.js | 397 - node_modules/sshpk/lib/ed-compat.js | 92 - node_modules/sshpk/lib/errors.js | 84 - node_modules/sshpk/lib/fingerprint.js | 220 - node_modules/sshpk/lib/formats/auto.js | 124 - node_modules/sshpk/lib/formats/dnssec.js | 287 - .../sshpk/lib/formats/openssh-cert.js | 352 - node_modules/sshpk/lib/formats/pem.js | 290 - node_modules/sshpk/lib/formats/pkcs1.js | 373 - node_modules/sshpk/lib/formats/pkcs8.js | 631 - node_modules/sshpk/lib/formats/putty.js | 194 - node_modules/sshpk/lib/formats/rfc4253.js | 166 - node_modules/sshpk/lib/formats/ssh-private.js | 262 - node_modules/sshpk/lib/formats/ssh.js | 115 - node_modules/sshpk/lib/formats/x509-pem.js | 88 - node_modules/sshpk/lib/formats/x509.js | 752 -- node_modules/sshpk/lib/identity.js | 373 - node_modules/sshpk/lib/index.js | 40 - node_modules/sshpk/lib/key.js | 294 - node_modules/sshpk/lib/private-key.js | 247 - node_modules/sshpk/lib/signature.js | 314 - node_modules/sshpk/lib/ssh-buffer.js | 149 - node_modules/sshpk/lib/utils.js | 404 - 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/statuses/HISTORY.md | 82 - node_modules/statuses/LICENSE | 23 - node_modules/statuses/README.md | 136 - node_modules/statuses/codes.json | 65 - node_modules/statuses/index.js | 146 - node_modules/statuses/package.json | 49 - 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/to-regex-range/LICENSE | 21 - node_modules/to-regex-range/README.md | 305 - node_modules/to-regex-range/index.js | 288 - node_modules/to-regex-range/package.json | 88 - node_modules/toidentifier/HISTORY.md | 9 - node_modules/toidentifier/LICENSE | 21 - node_modules/toidentifier/README.md | 61 - node_modules/toidentifier/index.js | 32 - node_modules/toidentifier/package.json | 38 - node_modules/touch/LICENSE | 15 - node_modules/touch/README.md | 52 - node_modules/touch/bin/nodetouch.js | 112 - node_modules/touch/index.js | 224 - node_modules/touch/package.json | 28 - node_modules/tough-cookie/LICENSE | 12 - node_modules/tough-cookie/README.md | 527 - node_modules/tough-cookie/lib/cookie.js | 1482 --- node_modules/tough-cookie/lib/memstore.js | 181 - node_modules/tough-cookie/lib/pathMatch.js | 61 - .../tough-cookie/lib/permuteDomain.js | 56 - .../tough-cookie/lib/pubsuffix-psl.js | 38 - node_modules/tough-cookie/lib/store.js | 75 - node_modules/tough-cookie/lib/version.js | 2 - node_modules/tough-cookie/package.json | 78 - 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-is/HISTORY.md | 259 - node_modules/type-is/LICENSE | 23 - node_modules/type-is/README.md | 170 - node_modules/type-is/index.js | 266 - node_modules/type-is/package.json | 45 - node_modules/uglify-js/LICENSE | 29 - node_modules/uglify-js/README.md | 1100 -- node_modules/uglify-js/bin/uglifyjs | 404 - node_modules/uglify-js/lib/ast.js | 914 -- node_modules/uglify-js/lib/compress.js | 5002 -------- node_modules/uglify-js/lib/minify.js | 228 - node_modules/uglify-js/lib/mozilla-ast.js | 615 - node_modules/uglify-js/lib/output.js | 1445 --- node_modules/uglify-js/lib/parse.js | 1599 --- node_modules/uglify-js/lib/propmangle.js | 241 - node_modules/uglify-js/lib/scope.js | 589 - node_modules/uglify-js/lib/sourcemap.js | 97 - node_modules/uglify-js/lib/transform.js | 217 - node_modules/uglify-js/lib/utils.js | 355 - .../node_modules/source-map/CHANGELOG.md | 301 - .../uglify-js/node_modules/source-map/LICENSE | 28 - .../node_modules/source-map/README.md | 742 -- .../source-map/dist/source-map.debug.js | 3234 ----- .../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/lib/array-set.js | 121 - .../node_modules/source-map/lib/base64-vlq.js | 140 - .../node_modules/source-map/lib/base64.js | 67 - .../source-map/lib/binary-search.js | 111 - .../source-map/lib/mapping-list.js | 79 - .../node_modules/source-map/lib/quick-sort.js | 114 - .../source-map/lib/source-map-consumer.js | 1145 -- .../source-map/lib/source-map-generator.js | 425 - .../source-map/lib/source-node.js | 413 - .../node_modules/source-map/lib/util.js | 488 - .../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/uglify-js/package.json | 44 - node_modules/uglify-js/tools/domprops.json | 5601 --------- node_modules/uglify-js/tools/exports.js | 5 - node_modules/uglify-js/tools/node.js | 82 - node_modules/uglify-js/tools/props.html | 61 - .../undefsafe/.github/workflows/release.yml | 25 - node_modules/undefsafe/.jscsrc | 13 - node_modules/undefsafe/.jshintrc | 16 - node_modules/undefsafe/.travis.yml | 18 - node_modules/undefsafe/LICENSE | 22 - node_modules/undefsafe/README.md | 63 - node_modules/undefsafe/example.js | 14 - node_modules/undefsafe/lib/undefsafe.js | 125 - node_modules/undefsafe/package.json | 34 - node_modules/unpipe/HISTORY.md | 4 - node_modules/unpipe/LICENSE | 22 - node_modules/unpipe/README.md | 43 - node_modules/unpipe/index.js | 69 - node_modules/unpipe/package.json | 27 - node_modules/upper-case/LICENSE | 21 - node_modules/upper-case/README.md | 45 - node_modules/upper-case/package.json | 51 - node_modules/upper-case/upper-case.d.ts | 3 - node_modules/upper-case/upper-case.js | 50 - 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/utils-merge/.npmignore | 9 - node_modules/utils-merge/LICENSE | 20 - node_modules/utils-merge/README.md | 34 - node_modules/utils-merge/index.js | 23 - node_modules/utils-merge/package.json | 40 - 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/bin/uuid | 65 - node_modules/uuid/index.js | 8 - node_modules/uuid/lib/bytesToUuid.js | 26 - node_modules/uuid/lib/md5-browser.js | 216 - node_modules/uuid/lib/md5.js | 25 - node_modules/uuid/lib/rng-browser.js | 34 - node_modules/uuid/lib/rng.js | 8 - node_modules/uuid/lib/sha1-browser.js | 89 - node_modules/uuid/lib/sha1.js | 25 - node_modules/uuid/lib/v35.js | 57 - 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/vary/HISTORY.md | 39 - node_modules/vary/LICENSE | 22 - node_modules/vary/README.md | 101 - node_modules/vary/index.js | 149 - node_modules/vary/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/verror/lib/verror.js | 451 - node_modules/verror/package.json | 22 - node_modules/xml-char-classes/index.js | 11 - node_modules/xml-char-classes/package.json | 39 - node_modules/xml-char-classes/readme.md | 45 - 1730 files changed, 287092 deletions(-) delete mode 120000 node_modules/.bin/ejs delete mode 120000 node_modules/.bin/he delete mode 120000 node_modules/.bin/html-minifier delete mode 120000 node_modules/.bin/jake delete mode 120000 node_modules/.bin/mime delete mode 120000 node_modules/.bin/nodemon delete mode 120000 node_modules/.bin/nodetouch delete mode 120000 node_modules/.bin/nopt delete mode 120000 node_modules/.bin/semver delete mode 120000 node_modules/.bin/sshpk-conv delete mode 120000 node_modules/.bin/sshpk-sign delete mode 120000 node_modules/.bin/sshpk-verify delete mode 120000 node_modules/.bin/uglifyjs delete mode 120000 node_modules/.bin/uuid delete mode 100644 node_modules/.package-lock.json delete mode 100644 node_modules/abbrev/LICENSE delete mode 100644 node_modules/abbrev/README.md delete mode 100644 node_modules/abbrev/abbrev.js delete mode 100644 node_modules/abbrev/package.json delete mode 100644 node_modules/accepts/HISTORY.md delete mode 100644 node_modules/accepts/LICENSE delete mode 100644 node_modules/accepts/README.md delete mode 100644 node_modules/accepts/index.js delete mode 100644 node_modules/accepts/package.json delete mode 100644 node_modules/ajv/.tonic_example.js delete mode 100644 node_modules/ajv/LICENSE delete mode 100644 node_modules/ajv/README.md delete mode 100644 node_modules/ajv/dist/ajv.bundle.js delete mode 100644 node_modules/ajv/dist/ajv.min.js delete mode 100644 node_modules/ajv/dist/ajv.min.js.map delete mode 100644 node_modules/ajv/lib/ajv.d.ts delete mode 100644 node_modules/ajv/lib/ajv.js delete mode 100644 node_modules/ajv/lib/cache.js delete mode 100644 node_modules/ajv/lib/compile/async.js delete mode 100644 node_modules/ajv/lib/compile/equal.js delete mode 100644 node_modules/ajv/lib/compile/error_classes.js delete mode 100644 node_modules/ajv/lib/compile/formats.js delete mode 100644 node_modules/ajv/lib/compile/index.js delete mode 100644 node_modules/ajv/lib/compile/resolve.js delete mode 100644 node_modules/ajv/lib/compile/rules.js delete mode 100644 node_modules/ajv/lib/compile/schema_obj.js delete mode 100644 node_modules/ajv/lib/compile/ucs2length.js delete mode 100644 node_modules/ajv/lib/compile/util.js delete mode 100644 node_modules/ajv/lib/data.js delete mode 100644 node_modules/ajv/lib/definition_schema.js delete mode 100644 node_modules/ajv/lib/dot/_limit.jst delete mode 100644 node_modules/ajv/lib/dot/_limitItems.jst delete mode 100644 node_modules/ajv/lib/dot/_limitLength.jst delete mode 100644 node_modules/ajv/lib/dot/_limitProperties.jst delete mode 100644 node_modules/ajv/lib/dot/allOf.jst delete mode 100644 node_modules/ajv/lib/dot/anyOf.jst delete mode 100644 node_modules/ajv/lib/dot/coerce.def delete mode 100644 node_modules/ajv/lib/dot/comment.jst delete mode 100644 node_modules/ajv/lib/dot/const.jst delete mode 100644 node_modules/ajv/lib/dot/contains.jst delete mode 100644 node_modules/ajv/lib/dot/custom.jst delete mode 100644 node_modules/ajv/lib/dot/defaults.def delete mode 100644 node_modules/ajv/lib/dot/definitions.def delete mode 100644 node_modules/ajv/lib/dot/dependencies.jst delete mode 100644 node_modules/ajv/lib/dot/enum.jst delete mode 100644 node_modules/ajv/lib/dot/errors.def delete mode 100644 node_modules/ajv/lib/dot/format.jst delete mode 100644 node_modules/ajv/lib/dot/if.jst delete mode 100644 node_modules/ajv/lib/dot/items.jst delete mode 100644 node_modules/ajv/lib/dot/missing.def delete mode 100644 node_modules/ajv/lib/dot/multipleOf.jst delete mode 100644 node_modules/ajv/lib/dot/not.jst delete mode 100644 node_modules/ajv/lib/dot/oneOf.jst delete mode 100644 node_modules/ajv/lib/dot/pattern.jst delete mode 100644 node_modules/ajv/lib/dot/properties.jst delete mode 100644 node_modules/ajv/lib/dot/propertyNames.jst delete mode 100644 node_modules/ajv/lib/dot/ref.jst delete mode 100644 node_modules/ajv/lib/dot/required.jst delete mode 100644 node_modules/ajv/lib/dot/uniqueItems.jst delete mode 100644 node_modules/ajv/lib/dot/validate.jst delete mode 100644 node_modules/ajv/lib/dotjs/README.md delete mode 100644 node_modules/ajv/lib/dotjs/_limit.js delete mode 100644 node_modules/ajv/lib/dotjs/_limitItems.js delete mode 100644 node_modules/ajv/lib/dotjs/_limitLength.js delete mode 100644 node_modules/ajv/lib/dotjs/_limitProperties.js delete mode 100644 node_modules/ajv/lib/dotjs/allOf.js delete mode 100644 node_modules/ajv/lib/dotjs/anyOf.js delete mode 100644 node_modules/ajv/lib/dotjs/comment.js delete mode 100644 node_modules/ajv/lib/dotjs/const.js delete mode 100644 node_modules/ajv/lib/dotjs/contains.js delete mode 100644 node_modules/ajv/lib/dotjs/custom.js delete mode 100644 node_modules/ajv/lib/dotjs/dependencies.js delete mode 100644 node_modules/ajv/lib/dotjs/enum.js delete mode 100644 node_modules/ajv/lib/dotjs/format.js delete mode 100644 node_modules/ajv/lib/dotjs/if.js delete mode 100644 node_modules/ajv/lib/dotjs/index.js delete mode 100644 node_modules/ajv/lib/dotjs/items.js delete mode 100644 node_modules/ajv/lib/dotjs/multipleOf.js delete mode 100644 node_modules/ajv/lib/dotjs/not.js delete mode 100644 node_modules/ajv/lib/dotjs/oneOf.js delete mode 100644 node_modules/ajv/lib/dotjs/pattern.js delete mode 100644 node_modules/ajv/lib/dotjs/properties.js delete mode 100644 node_modules/ajv/lib/dotjs/propertyNames.js delete mode 100644 node_modules/ajv/lib/dotjs/ref.js delete mode 100644 node_modules/ajv/lib/dotjs/required.js delete mode 100644 node_modules/ajv/lib/dotjs/uniqueItems.js delete mode 100644 node_modules/ajv/lib/dotjs/validate.js delete mode 100644 node_modules/ajv/lib/keyword.js delete mode 100644 node_modules/ajv/lib/refs/data.json delete mode 100644 node_modules/ajv/lib/refs/json-schema-draft-04.json delete mode 100644 node_modules/ajv/lib/refs/json-schema-draft-06.json delete mode 100644 node_modules/ajv/lib/refs/json-schema-draft-07.json delete mode 100644 node_modules/ajv/lib/refs/json-schema-secure.json delete mode 100644 node_modules/ajv/package.json delete mode 100644 node_modules/ajv/scripts/.eslintrc.yml delete mode 100644 node_modules/ajv/scripts/bundle.js delete mode 100644 node_modules/ajv/scripts/compile-dots.js delete mode 100644 node_modules/ajv/scripts/info delete mode 100644 node_modules/ajv/scripts/prepare-tests delete mode 100644 node_modules/ajv/scripts/publish-built-version delete mode 100644 node_modules/ajv/scripts/travis-gh-pages delete mode 100644 node_modules/ansi-styles/index.d.ts delete mode 100644 node_modules/ansi-styles/index.js delete mode 100644 node_modules/ansi-styles/license delete mode 100644 node_modules/ansi-styles/package.json delete mode 100644 node_modules/ansi-styles/readme.md delete mode 100644 node_modules/anymatch/LICENSE delete mode 100644 node_modules/anymatch/README.md delete mode 100644 node_modules/anymatch/index.d.ts delete mode 100644 node_modules/anymatch/index.js delete mode 100644 node_modules/anymatch/package.json delete mode 100644 node_modules/array-flatten/LICENSE delete mode 100644 node_modules/array-flatten/README.md delete mode 100644 node_modules/array-flatten/array-flatten.js delete mode 100644 node_modules/array-flatten/package.json delete mode 100644 node_modules/asn1/Jenkinsfile delete mode 100644 node_modules/asn1/LICENSE delete mode 100644 node_modules/asn1/README.md delete mode 100644 node_modules/asn1/lib/ber/errors.js delete mode 100644 node_modules/asn1/lib/ber/index.js delete mode 100644 node_modules/asn1/lib/ber/reader.js delete mode 100644 node_modules/asn1/lib/ber/types.js delete mode 100644 node_modules/asn1/lib/ber/writer.js delete mode 100644 node_modules/asn1/lib/index.js delete mode 100644 node_modules/asn1/package.json delete mode 100644 node_modules/assert-plus/AUTHORS delete mode 100644 node_modules/assert-plus/CHANGES.md delete mode 100644 node_modules/assert-plus/README.md delete mode 100644 node_modules/assert-plus/assert.js delete mode 100644 node_modules/assert-plus/package.json delete mode 100644 node_modules/async/CHANGELOG.md delete mode 100644 node_modules/async/LICENSE delete mode 100644 node_modules/async/README.md delete mode 100644 node_modules/async/all.js delete mode 100644 node_modules/async/allLimit.js delete mode 100644 node_modules/async/allSeries.js delete mode 100644 node_modules/async/any.js delete mode 100644 node_modules/async/anyLimit.js delete mode 100644 node_modules/async/anySeries.js delete mode 100644 node_modules/async/apply.js delete mode 100644 node_modules/async/applyEach.js delete mode 100644 node_modules/async/applyEachSeries.js delete mode 100644 node_modules/async/asyncify.js delete mode 100644 node_modules/async/auto.js delete mode 100644 node_modules/async/autoInject.js delete mode 100644 node_modules/async/bower.json delete mode 100644 node_modules/async/cargo.js delete mode 100644 node_modules/async/cargoQueue.js delete mode 100644 node_modules/async/compose.js delete mode 100644 node_modules/async/concat.js delete mode 100644 node_modules/async/concatLimit.js delete mode 100644 node_modules/async/concatSeries.js delete mode 100644 node_modules/async/constant.js delete mode 100644 node_modules/async/detect.js delete mode 100644 node_modules/async/detectLimit.js delete mode 100644 node_modules/async/detectSeries.js delete mode 100644 node_modules/async/dir.js delete mode 100644 node_modules/async/dist/async.js delete mode 100644 node_modules/async/dist/async.min.js delete mode 100644 node_modules/async/dist/async.mjs delete mode 100644 node_modules/async/doDuring.js delete mode 100644 node_modules/async/doUntil.js delete mode 100644 node_modules/async/doWhilst.js delete mode 100644 node_modules/async/during.js delete mode 100644 node_modules/async/each.js delete mode 100644 node_modules/async/eachLimit.js delete mode 100644 node_modules/async/eachOf.js delete mode 100644 node_modules/async/eachOfLimit.js delete mode 100644 node_modules/async/eachOfSeries.js delete mode 100644 node_modules/async/eachSeries.js delete mode 100644 node_modules/async/ensureAsync.js delete mode 100644 node_modules/async/every.js delete mode 100644 node_modules/async/everyLimit.js delete mode 100644 node_modules/async/everySeries.js delete mode 100644 node_modules/async/filter.js delete mode 100644 node_modules/async/filterLimit.js delete mode 100644 node_modules/async/filterSeries.js delete mode 100644 node_modules/async/find.js delete mode 100644 node_modules/async/findLimit.js delete mode 100644 node_modules/async/findSeries.js delete mode 100644 node_modules/async/flatMap.js delete mode 100644 node_modules/async/flatMapLimit.js delete mode 100644 node_modules/async/flatMapSeries.js delete mode 100644 node_modules/async/foldl.js delete mode 100644 node_modules/async/foldr.js delete mode 100644 node_modules/async/forEach.js delete mode 100644 node_modules/async/forEachLimit.js delete mode 100644 node_modules/async/forEachOf.js delete mode 100644 node_modules/async/forEachOfLimit.js delete mode 100644 node_modules/async/forEachOfSeries.js delete mode 100644 node_modules/async/forEachSeries.js delete mode 100644 node_modules/async/forever.js delete mode 100644 node_modules/async/groupBy.js delete mode 100644 node_modules/async/groupByLimit.js delete mode 100644 node_modules/async/groupBySeries.js delete mode 100644 node_modules/async/index.js delete mode 100644 node_modules/async/inject.js delete mode 100644 node_modules/async/internal/DoublyLinkedList.js delete mode 100644 node_modules/async/internal/Heap.js delete mode 100644 node_modules/async/internal/applyEach.js delete mode 100644 node_modules/async/internal/asyncEachOfLimit.js delete mode 100644 node_modules/async/internal/awaitify.js delete mode 100644 node_modules/async/internal/breakLoop.js delete mode 100644 node_modules/async/internal/consoleFunc.js delete mode 100644 node_modules/async/internal/createTester.js delete mode 100644 node_modules/async/internal/eachOfLimit.js delete mode 100644 node_modules/async/internal/filter.js delete mode 100644 node_modules/async/internal/getIterator.js delete mode 100644 node_modules/async/internal/initialParams.js delete mode 100644 node_modules/async/internal/isArrayLike.js delete mode 100644 node_modules/async/internal/iterator.js delete mode 100644 node_modules/async/internal/map.js delete mode 100644 node_modules/async/internal/once.js delete mode 100644 node_modules/async/internal/onlyOnce.js delete mode 100644 node_modules/async/internal/parallel.js delete mode 100644 node_modules/async/internal/promiseCallback.js delete mode 100644 node_modules/async/internal/queue.js delete mode 100644 node_modules/async/internal/range.js delete mode 100644 node_modules/async/internal/reject.js delete mode 100644 node_modules/async/internal/setImmediate.js delete mode 100644 node_modules/async/internal/withoutIndex.js delete mode 100644 node_modules/async/internal/wrapAsync.js delete mode 100644 node_modules/async/log.js delete mode 100644 node_modules/async/map.js delete mode 100644 node_modules/async/mapLimit.js delete mode 100644 node_modules/async/mapSeries.js delete mode 100644 node_modules/async/mapValues.js delete mode 100644 node_modules/async/mapValuesLimit.js delete mode 100644 node_modules/async/mapValuesSeries.js delete mode 100644 node_modules/async/memoize.js delete mode 100644 node_modules/async/nextTick.js delete mode 100644 node_modules/async/package.json delete mode 100644 node_modules/async/parallel.js delete mode 100644 node_modules/async/parallelLimit.js delete mode 100644 node_modules/async/priorityQueue.js delete mode 100644 node_modules/async/queue.js delete mode 100644 node_modules/async/race.js delete mode 100644 node_modules/async/reduce.js delete mode 100644 node_modules/async/reduceRight.js delete mode 100644 node_modules/async/reflect.js delete mode 100644 node_modules/async/reflectAll.js delete mode 100644 node_modules/async/reject.js delete mode 100644 node_modules/async/rejectLimit.js delete mode 100644 node_modules/async/rejectSeries.js delete mode 100644 node_modules/async/retry.js delete mode 100644 node_modules/async/retryable.js delete mode 100644 node_modules/async/select.js delete mode 100644 node_modules/async/selectLimit.js delete mode 100644 node_modules/async/selectSeries.js delete mode 100644 node_modules/async/seq.js delete mode 100644 node_modules/async/series.js delete mode 100644 node_modules/async/setImmediate.js delete mode 100644 node_modules/async/some.js delete mode 100644 node_modules/async/someLimit.js delete mode 100644 node_modules/async/someSeries.js delete mode 100644 node_modules/async/sortBy.js delete mode 100644 node_modules/async/timeout.js delete mode 100644 node_modules/async/times.js delete mode 100644 node_modules/async/timesLimit.js delete mode 100644 node_modules/async/timesSeries.js delete mode 100644 node_modules/async/transform.js delete mode 100644 node_modules/async/tryEach.js delete mode 100644 node_modules/async/unmemoize.js delete mode 100644 node_modules/async/until.js delete mode 100644 node_modules/async/waterfall.js delete mode 100644 node_modules/async/whilst.js delete mode 100644 node_modules/async/wrapSync.js delete mode 100644 node_modules/asynckit/LICENSE delete mode 100644 node_modules/asynckit/README.md delete mode 100644 node_modules/asynckit/bench.js delete mode 100644 node_modules/asynckit/index.js delete mode 100644 node_modules/asynckit/lib/abort.js delete mode 100644 node_modules/asynckit/lib/async.js delete mode 100644 node_modules/asynckit/lib/defer.js delete mode 100644 node_modules/asynckit/lib/iterate.js delete mode 100644 node_modules/asynckit/lib/readable_asynckit.js delete mode 100644 node_modules/asynckit/lib/readable_parallel.js delete mode 100644 node_modules/asynckit/lib/readable_serial.js delete mode 100644 node_modules/asynckit/lib/readable_serial_ordered.js delete mode 100644 node_modules/asynckit/lib/state.js delete mode 100644 node_modules/asynckit/lib/streamify.js delete mode 100644 node_modules/asynckit/lib/terminator.js delete mode 100644 node_modules/asynckit/package.json delete mode 100644 node_modules/asynckit/parallel.js delete mode 100644 node_modules/asynckit/serial.js delete mode 100644 node_modules/asynckit/serialOrdered.js delete mode 100644 node_modules/asynckit/stream.js delete mode 100644 node_modules/aws-sign2/LICENSE delete mode 100644 node_modules/aws-sign2/README.md delete mode 100644 node_modules/aws-sign2/index.js delete mode 100644 node_modules/aws-sign2/package.json delete mode 100644 node_modules/aws4/.github/FUNDING.yml delete mode 100644 node_modules/aws4/.travis.yml delete mode 100644 node_modules/aws4/LICENSE delete mode 100644 node_modules/aws4/README.md delete mode 100644 node_modules/aws4/aws4.js delete mode 100644 node_modules/aws4/lru.js delete mode 100644 node_modules/aws4/package.json delete mode 100644 node_modules/balanced-match/.github/FUNDING.yml delete mode 100644 node_modules/balanced-match/LICENSE.md delete mode 100644 node_modules/balanced-match/README.md delete mode 100644 node_modules/balanced-match/index.js delete mode 100644 node_modules/balanced-match/package.json delete mode 100644 node_modules/bcrypt-pbkdf/CONTRIBUTING.md delete mode 100644 node_modules/bcrypt-pbkdf/LICENSE delete mode 100644 node_modules/bcrypt-pbkdf/README.md delete mode 100644 node_modules/bcrypt-pbkdf/index.js delete mode 100644 node_modules/bcrypt-pbkdf/package.json delete mode 100644 node_modules/binary-extensions/binary-extensions.json delete mode 100644 node_modules/binary-extensions/binary-extensions.json.d.ts delete mode 100644 node_modules/binary-extensions/index.d.ts delete mode 100644 node_modules/binary-extensions/index.js delete mode 100644 node_modules/binary-extensions/license delete mode 100644 node_modules/binary-extensions/package.json delete mode 100644 node_modules/binary-extensions/readme.md delete mode 100644 node_modules/body-parser/HISTORY.md delete mode 100644 node_modules/body-parser/LICENSE delete mode 100644 node_modules/body-parser/README.md delete mode 100644 node_modules/body-parser/SECURITY.md delete mode 100644 node_modules/body-parser/index.js delete mode 100644 node_modules/body-parser/lib/read.js delete mode 100644 node_modules/body-parser/lib/types/json.js delete mode 100644 node_modules/body-parser/lib/types/raw.js delete mode 100644 node_modules/body-parser/lib/types/text.js delete mode 100644 node_modules/body-parser/lib/types/urlencoded.js delete mode 100644 node_modules/body-parser/package.json delete mode 100644 node_modules/brace-expansion/LICENSE delete mode 100644 node_modules/brace-expansion/README.md delete mode 100644 node_modules/brace-expansion/index.js delete mode 100644 node_modules/brace-expansion/package.json delete mode 100644 node_modules/braces/CHANGELOG.md delete mode 100644 node_modules/braces/LICENSE delete mode 100644 node_modules/braces/README.md delete mode 100644 node_modules/braces/index.js delete mode 100644 node_modules/braces/lib/compile.js delete mode 100644 node_modules/braces/lib/constants.js delete mode 100644 node_modules/braces/lib/expand.js delete mode 100644 node_modules/braces/lib/parse.js delete mode 100644 node_modules/braces/lib/stringify.js delete mode 100644 node_modules/braces/lib/utils.js delete mode 100644 node_modules/braces/package.json delete mode 100644 node_modules/bytes/History.md delete mode 100644 node_modules/bytes/LICENSE delete mode 100644 node_modules/bytes/Readme.md delete mode 100644 node_modules/bytes/index.js delete mode 100644 node_modules/bytes/package.json delete mode 100644 node_modules/call-bind/.eslintignore delete mode 100644 node_modules/call-bind/.eslintrc delete mode 100644 node_modules/call-bind/.github/FUNDING.yml delete mode 100644 node_modules/call-bind/.nycrc delete mode 100644 node_modules/call-bind/CHANGELOG.md delete mode 100644 node_modules/call-bind/LICENSE delete mode 100644 node_modules/call-bind/README.md delete mode 100644 node_modules/call-bind/callBound.js delete mode 100644 node_modules/call-bind/index.js delete mode 100644 node_modules/call-bind/package.json delete mode 100644 node_modules/call-bind/test/callBound.js delete mode 100644 node_modules/call-bind/test/index.js delete mode 100644 node_modules/camel-case/LICENSE delete mode 100644 node_modules/camel-case/camel-case.d.ts delete mode 100644 node_modules/camel-case/camel-case.js delete mode 100644 node_modules/camel-case/package.json delete mode 100644 node_modules/caseless/LICENSE delete mode 100644 node_modules/caseless/README.md delete mode 100644 node_modules/caseless/index.js delete mode 100644 node_modules/caseless/package.json delete mode 100644 node_modules/caseless/test.js delete mode 100644 node_modules/chalk/index.d.ts delete mode 100644 node_modules/chalk/license delete mode 100644 node_modules/chalk/node_modules/has-flag/index.d.ts delete mode 100644 node_modules/chalk/node_modules/has-flag/index.js delete mode 100644 node_modules/chalk/node_modules/has-flag/license delete mode 100644 node_modules/chalk/node_modules/has-flag/package.json delete mode 100644 node_modules/chalk/node_modules/has-flag/readme.md delete mode 100644 node_modules/chalk/node_modules/supports-color/browser.js delete mode 100644 node_modules/chalk/node_modules/supports-color/index.js delete mode 100644 node_modules/chalk/node_modules/supports-color/license delete mode 100644 node_modules/chalk/node_modules/supports-color/package.json delete mode 100644 node_modules/chalk/node_modules/supports-color/readme.md delete mode 100644 node_modules/chalk/package.json delete mode 100644 node_modules/chalk/readme.md delete mode 100644 node_modules/chalk/source/index.js delete mode 100644 node_modules/chalk/source/templates.js delete mode 100644 node_modules/chalk/source/util.js delete mode 100644 node_modules/chokidar/LICENSE delete mode 100644 node_modules/chokidar/README.md delete mode 100644 node_modules/chokidar/index.js delete mode 100644 node_modules/chokidar/lib/constants.js delete mode 100644 node_modules/chokidar/lib/fsevents-handler.js delete mode 100644 node_modules/chokidar/lib/nodefs-handler.js delete mode 100644 node_modules/chokidar/package.json delete mode 100644 node_modules/chokidar/types/index.d.ts delete mode 100644 node_modules/clean-css/History.md delete mode 100644 node_modules/clean-css/LICENSE delete mode 100644 node_modules/clean-css/README.md delete mode 100644 node_modules/clean-css/index.js delete mode 100644 node_modules/clean-css/lib/clean.js delete mode 100644 node_modules/clean-css/lib/optimizer/hack.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-0/optimize.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/optimize.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-hex.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-hsl.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/shorten-rgb.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-block.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/break-up.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/can-override.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/clone.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/compactable.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/extract-properties.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/invalid-property-error.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/optimize.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/understandable.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/vendor-prefixes.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/reorderable.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/restore.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/restructure.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificity.js delete mode 100644 node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js delete mode 100644 node_modules/clean-css/lib/optimizer/remove-unused.js delete mode 100644 node_modules/clean-css/lib/optimizer/restore-from-optimizing.js delete mode 100644 node_modules/clean-css/lib/optimizer/validator.js delete mode 100644 node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js delete mode 100644 node_modules/clean-css/lib/options/compatibility.js delete mode 100644 node_modules/clean-css/lib/options/fetch.js delete mode 100644 node_modules/clean-css/lib/options/format.js delete mode 100644 node_modules/clean-css/lib/options/inline-request.js delete mode 100644 node_modules/clean-css/lib/options/inline-timeout.js delete mode 100644 node_modules/clean-css/lib/options/inline.js delete mode 100644 node_modules/clean-css/lib/options/optimization-level.js delete mode 100644 node_modules/clean-css/lib/options/rebase-to.js delete mode 100644 node_modules/clean-css/lib/options/rebase.js delete mode 100644 node_modules/clean-css/lib/options/rounding-precision.js delete mode 100644 node_modules/clean-css/lib/reader/apply-source-maps.js delete mode 100644 node_modules/clean-css/lib/reader/extract-import-url-and-media.js delete mode 100644 node_modules/clean-css/lib/reader/input-source-map-tracker.js delete mode 100644 node_modules/clean-css/lib/reader/is-allowed-resource.js delete mode 100644 node_modules/clean-css/lib/reader/load-original-sources.js delete mode 100644 node_modules/clean-css/lib/reader/load-remote-resource.js delete mode 100644 node_modules/clean-css/lib/reader/match-data-uri.js delete mode 100644 node_modules/clean-css/lib/reader/normalize-path.js delete mode 100644 node_modules/clean-css/lib/reader/read-sources.js delete mode 100644 node_modules/clean-css/lib/reader/rebase-local-map.js delete mode 100644 node_modules/clean-css/lib/reader/rebase-remote-map.js delete mode 100644 node_modules/clean-css/lib/reader/rebase.js delete mode 100644 node_modules/clean-css/lib/reader/restore-import.js delete mode 100644 node_modules/clean-css/lib/reader/rewrite-url.js delete mode 100644 node_modules/clean-css/lib/tokenizer/marker.js delete mode 100644 node_modules/clean-css/lib/tokenizer/token.js delete mode 100644 node_modules/clean-css/lib/tokenizer/tokenize.js delete mode 100644 node_modules/clean-css/lib/utils/clone-array.js delete mode 100644 node_modules/clean-css/lib/utils/format-position.js delete mode 100644 node_modules/clean-css/lib/utils/has-protocol.js delete mode 100644 node_modules/clean-css/lib/utils/is-data-uri-resource.js delete mode 100644 node_modules/clean-css/lib/utils/is-http-resource.js delete mode 100644 node_modules/clean-css/lib/utils/is-https-resource.js delete mode 100644 node_modules/clean-css/lib/utils/is-import.js delete mode 100644 node_modules/clean-css/lib/utils/is-remote-resource.js delete mode 100644 node_modules/clean-css/lib/utils/natural-compare.js delete mode 100644 node_modules/clean-css/lib/utils/override.js delete mode 100644 node_modules/clean-css/lib/utils/split.js delete mode 100644 node_modules/clean-css/lib/writer/helpers.js delete mode 100644 node_modules/clean-css/lib/writer/one-time.js delete mode 100644 node_modules/clean-css/lib/writer/simple.js delete mode 100644 node_modules/clean-css/lib/writer/source-maps.js delete mode 100644 node_modules/clean-css/package.json delete mode 100644 node_modules/color-convert/CHANGELOG.md delete mode 100644 node_modules/color-convert/LICENSE delete mode 100644 node_modules/color-convert/README.md delete mode 100644 node_modules/color-convert/conversions.js delete mode 100644 node_modules/color-convert/index.js delete mode 100644 node_modules/color-convert/package.json delete mode 100644 node_modules/color-convert/route.js delete mode 100644 node_modules/color-name/LICENSE delete mode 100644 node_modules/color-name/README.md delete mode 100644 node_modules/color-name/index.js delete mode 100644 node_modules/color-name/package.json delete mode 100644 node_modules/combined-stream/License delete mode 100644 node_modules/combined-stream/Readme.md delete mode 100644 node_modules/combined-stream/lib/combined_stream.js delete mode 100644 node_modules/combined-stream/package.json delete mode 100644 node_modules/combined-stream/yarn.lock delete mode 100644 node_modules/commander/CHANGELOG.md delete mode 100644 node_modules/commander/LICENSE delete mode 100644 node_modules/commander/Readme.md delete mode 100644 node_modules/commander/index.js delete mode 100644 node_modules/commander/package.json delete mode 100644 node_modules/commander/typings/index.d.ts delete mode 100644 node_modules/concat-map/.travis.yml delete mode 100644 node_modules/concat-map/LICENSE delete mode 100644 node_modules/concat-map/README.markdown delete mode 100644 node_modules/concat-map/example/map.js delete mode 100644 node_modules/concat-map/index.js delete mode 100644 node_modules/concat-map/package.json delete mode 100644 node_modules/concat-map/test/map.js delete mode 100644 node_modules/content-disposition/HISTORY.md delete mode 100644 node_modules/content-disposition/LICENSE delete mode 100644 node_modules/content-disposition/README.md delete mode 100644 node_modules/content-disposition/index.js delete mode 100644 node_modules/content-disposition/package.json delete mode 100644 node_modules/content-type/HISTORY.md delete mode 100644 node_modules/content-type/LICENSE delete mode 100644 node_modules/content-type/README.md delete mode 100644 node_modules/content-type/index.js delete mode 100644 node_modules/content-type/package.json delete mode 100644 node_modules/cookie-signature/.npmignore delete mode 100644 node_modules/cookie-signature/History.md delete mode 100644 node_modules/cookie-signature/Readme.md delete mode 100644 node_modules/cookie-signature/index.js delete mode 100644 node_modules/cookie-signature/package.json delete mode 100644 node_modules/cookie/HISTORY.md delete mode 100644 node_modules/cookie/LICENSE delete mode 100644 node_modules/cookie/README.md delete mode 100644 node_modules/cookie/SECURITY.md delete mode 100644 node_modules/cookie/index.js delete mode 100644 node_modules/cookie/package.json delete mode 100644 node_modules/core-util-is/LICENSE delete mode 100644 node_modules/core-util-is/README.md delete mode 100644 node_modules/core-util-is/float.patch delete mode 100644 node_modules/core-util-is/lib/util.js delete mode 100644 node_modules/core-util-is/package.json delete mode 100644 node_modules/core-util-is/test.js delete mode 100644 node_modules/dashdash/CHANGES.md delete mode 100644 node_modules/dashdash/LICENSE.txt delete mode 100644 node_modules/dashdash/README.md delete mode 100644 node_modules/dashdash/etc/dashdash.bash_completion.in delete mode 100644 node_modules/dashdash/lib/dashdash.js delete mode 100644 node_modules/dashdash/package.json delete mode 100644 node_modules/debug/.coveralls.yml delete mode 100644 node_modules/debug/.eslintrc delete mode 100644 node_modules/debug/.npmignore delete mode 100644 node_modules/debug/.travis.yml delete mode 100644 node_modules/debug/CHANGELOG.md delete mode 100644 node_modules/debug/LICENSE delete mode 100644 node_modules/debug/Makefile delete mode 100644 node_modules/debug/README.md delete mode 100644 node_modules/debug/component.json delete mode 100644 node_modules/debug/karma.conf.js delete mode 100644 node_modules/debug/node.js delete mode 100644 node_modules/debug/package.json delete mode 100644 node_modules/debug/src/browser.js delete mode 100644 node_modules/debug/src/debug.js delete mode 100644 node_modules/debug/src/index.js delete mode 100644 node_modules/debug/src/inspector-log.js delete mode 100644 node_modules/debug/src/node.js delete mode 100644 node_modules/delayed-stream/.npmignore delete mode 100644 node_modules/delayed-stream/License delete mode 100644 node_modules/delayed-stream/Makefile delete mode 100644 node_modules/delayed-stream/Readme.md delete mode 100644 node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 node_modules/delayed-stream/package.json delete mode 100644 node_modules/depd/History.md delete mode 100644 node_modules/depd/LICENSE delete mode 100644 node_modules/depd/Readme.md delete mode 100644 node_modules/depd/index.js delete mode 100644 node_modules/depd/lib/browser/index.js delete mode 100644 node_modules/depd/package.json delete mode 100644 node_modules/destroy/LICENSE delete mode 100644 node_modules/destroy/README.md delete mode 100644 node_modules/destroy/index.js delete mode 100644 node_modules/destroy/package.json delete mode 100755 node_modules/ecc-jsbn/LICENSE delete mode 100755 node_modules/ecc-jsbn/README.md delete mode 100755 node_modules/ecc-jsbn/index.js delete mode 100755 node_modules/ecc-jsbn/lib/LICENSE-jsbn delete mode 100755 node_modules/ecc-jsbn/lib/ec.js delete mode 100755 node_modules/ecc-jsbn/lib/sec.js delete mode 100755 node_modules/ecc-jsbn/package.json delete mode 100755 node_modules/ecc-jsbn/test.js delete mode 100644 node_modules/ee-first/LICENSE delete mode 100644 node_modules/ee-first/README.md delete mode 100644 node_modules/ee-first/index.js delete mode 100644 node_modules/ee-first/package.json delete mode 100644 node_modules/ejs/LICENSE delete mode 100644 node_modules/ejs/README.md delete mode 100755 node_modules/ejs/bin/cli.js delete mode 100644 node_modules/ejs/ejs.js delete mode 100644 node_modules/ejs/ejs.min.js delete mode 100644 node_modules/ejs/jakefile.js delete mode 100755 node_modules/ejs/lib/ejs.js delete mode 100644 node_modules/ejs/lib/utils.js delete mode 100644 node_modules/ejs/package.json delete mode 100644 node_modules/ejs/usage.txt delete mode 100644 node_modules/encodeurl/HISTORY.md delete mode 100644 node_modules/encodeurl/LICENSE delete mode 100644 node_modules/encodeurl/README.md delete mode 100644 node_modules/encodeurl/index.js delete mode 100644 node_modules/encodeurl/package.json delete mode 100644 node_modules/escape-html/LICENSE delete mode 100644 node_modules/escape-html/Readme.md delete mode 100644 node_modules/escape-html/index.js delete mode 100644 node_modules/escape-html/package.json delete mode 100644 node_modules/etag/HISTORY.md delete mode 100644 node_modules/etag/LICENSE delete mode 100644 node_modules/etag/README.md delete mode 100644 node_modules/etag/index.js delete mode 100644 node_modules/etag/package.json delete mode 100644 node_modules/express-minify-html/LICENSE delete mode 100644 node_modules/express-minify-html/README.md delete mode 100644 node_modules/express-minify-html/minifier.js delete mode 100644 node_modules/express-minify-html/package.json delete mode 100644 node_modules/express/History.md delete mode 100644 node_modules/express/LICENSE delete mode 100644 node_modules/express/Readme.md delete mode 100644 node_modules/express/index.js delete mode 100644 node_modules/express/lib/application.js delete mode 100644 node_modules/express/lib/express.js delete mode 100644 node_modules/express/lib/middleware/init.js delete mode 100644 node_modules/express/lib/middleware/query.js delete mode 100644 node_modules/express/lib/request.js delete mode 100644 node_modules/express/lib/response.js delete mode 100644 node_modules/express/lib/router/index.js delete mode 100644 node_modules/express/lib/router/layer.js delete mode 100644 node_modules/express/lib/router/route.js delete mode 100644 node_modules/express/lib/utils.js delete mode 100644 node_modules/express/lib/view.js delete mode 100644 node_modules/express/package.json delete mode 100644 node_modules/extend/.editorconfig delete mode 100644 node_modules/extend/.eslintrc delete mode 100644 node_modules/extend/.jscs.json delete mode 100644 node_modules/extend/.travis.yml delete mode 100644 node_modules/extend/CHANGELOG.md delete mode 100644 node_modules/extend/LICENSE delete mode 100644 node_modules/extend/README.md delete mode 100644 node_modules/extend/component.json delete mode 100644 node_modules/extend/index.js delete mode 100644 node_modules/extend/package.json delete mode 100644 node_modules/extsprintf/.gitmodules delete mode 100644 node_modules/extsprintf/.npmignore delete mode 100644 node_modules/extsprintf/LICENSE delete mode 100644 node_modules/extsprintf/Makefile delete mode 100644 node_modules/extsprintf/Makefile.targ delete mode 100644 node_modules/extsprintf/README.md delete mode 100644 node_modules/extsprintf/jsl.node.conf delete mode 100644 node_modules/extsprintf/lib/extsprintf.js delete mode 100644 node_modules/extsprintf/package.json delete mode 100644 node_modules/fast-deep-equal/LICENSE delete mode 100644 node_modules/fast-deep-equal/README.md delete mode 100644 node_modules/fast-deep-equal/es6/index.d.ts delete mode 100644 node_modules/fast-deep-equal/es6/index.js delete mode 100644 node_modules/fast-deep-equal/es6/react.d.ts delete mode 100644 node_modules/fast-deep-equal/es6/react.js delete mode 100644 node_modules/fast-deep-equal/index.d.ts delete mode 100644 node_modules/fast-deep-equal/index.js delete mode 100644 node_modules/fast-deep-equal/package.json delete mode 100644 node_modules/fast-deep-equal/react.d.ts delete mode 100644 node_modules/fast-deep-equal/react.js delete mode 100644 node_modules/fast-json-stable-stringify/.eslintrc.yml delete mode 100644 node_modules/fast-json-stable-stringify/.github/FUNDING.yml delete mode 100644 node_modules/fast-json-stable-stringify/.travis.yml delete mode 100644 node_modules/fast-json-stable-stringify/LICENSE delete mode 100644 node_modules/fast-json-stable-stringify/README.md delete mode 100644 node_modules/fast-json-stable-stringify/benchmark/index.js delete mode 100644 node_modules/fast-json-stable-stringify/benchmark/test.json delete mode 100644 node_modules/fast-json-stable-stringify/example/key_cmp.js delete mode 100644 node_modules/fast-json-stable-stringify/example/nested.js delete mode 100644 node_modules/fast-json-stable-stringify/example/str.js delete mode 100644 node_modules/fast-json-stable-stringify/example/value_cmp.js delete mode 100644 node_modules/fast-json-stable-stringify/index.d.ts delete mode 100644 node_modules/fast-json-stable-stringify/index.js delete mode 100644 node_modules/fast-json-stable-stringify/package.json delete mode 100644 node_modules/fast-json-stable-stringify/test/cmp.js delete mode 100644 node_modules/fast-json-stable-stringify/test/nested.js delete mode 100644 node_modules/fast-json-stable-stringify/test/str.js delete mode 100644 node_modules/fast-json-stable-stringify/test/to-json.js delete mode 100644 node_modules/filelist/README.md delete mode 100644 node_modules/filelist/index.d.ts delete mode 100644 node_modules/filelist/index.js delete mode 100644 node_modules/filelist/jakefile.js delete mode 100644 node_modules/filelist/node_modules/brace-expansion/.github/FUNDING.yml delete mode 100644 node_modules/filelist/node_modules/brace-expansion/LICENSE delete mode 100644 node_modules/filelist/node_modules/brace-expansion/README.md delete mode 100644 node_modules/filelist/node_modules/brace-expansion/index.js delete mode 100644 node_modules/filelist/node_modules/brace-expansion/package.json delete mode 100644 node_modules/filelist/node_modules/minimatch/LICENSE delete mode 100644 node_modules/filelist/node_modules/minimatch/README.md delete mode 100644 node_modules/filelist/node_modules/minimatch/lib/path.js delete mode 100644 node_modules/filelist/node_modules/minimatch/minimatch.js delete mode 100644 node_modules/filelist/node_modules/minimatch/package.json delete mode 100644 node_modules/filelist/package.json delete mode 100644 node_modules/fill-range/LICENSE delete mode 100644 node_modules/fill-range/README.md delete mode 100644 node_modules/fill-range/index.js delete mode 100644 node_modules/fill-range/package.json delete mode 100644 node_modules/finalhandler/HISTORY.md delete mode 100644 node_modules/finalhandler/LICENSE delete mode 100644 node_modules/finalhandler/README.md delete mode 100644 node_modules/finalhandler/SECURITY.md delete mode 100644 node_modules/finalhandler/index.js delete mode 100644 node_modules/finalhandler/package.json delete mode 100644 node_modules/forever-agent/LICENSE delete mode 100644 node_modules/forever-agent/README.md delete mode 100644 node_modules/forever-agent/index.js delete mode 100644 node_modules/forever-agent/package.json delete mode 100644 node_modules/form-data/License delete mode 100644 node_modules/form-data/README.md delete mode 100644 node_modules/form-data/README.md.bak delete mode 100644 node_modules/form-data/lib/browser.js delete mode 100644 node_modules/form-data/lib/form_data.js delete mode 100644 node_modules/form-data/lib/populate.js delete mode 100644 node_modules/form-data/package.json delete mode 100644 node_modules/form-data/yarn.lock delete mode 100644 node_modules/forwarded/HISTORY.md delete mode 100644 node_modules/forwarded/LICENSE delete mode 100644 node_modules/forwarded/README.md delete mode 100644 node_modules/forwarded/index.js delete mode 100644 node_modules/forwarded/package.json delete mode 100644 node_modules/fresh/HISTORY.md delete mode 100644 node_modules/fresh/LICENSE delete mode 100644 node_modules/fresh/README.md delete mode 100644 node_modules/fresh/index.js delete mode 100644 node_modules/fresh/package.json delete mode 100644 node_modules/fsevents/LICENSE delete mode 100644 node_modules/fsevents/README.md delete mode 100644 node_modules/fsevents/fsevents.d.ts delete mode 100644 node_modules/fsevents/fsevents.js delete mode 100755 node_modules/fsevents/fsevents.node delete mode 100644 node_modules/fsevents/package.json delete mode 100644 node_modules/function-bind/.editorconfig delete mode 100644 node_modules/function-bind/.eslintrc delete mode 100644 node_modules/function-bind/.jscs.json delete mode 100644 node_modules/function-bind/.npmignore delete mode 100644 node_modules/function-bind/.travis.yml delete mode 100644 node_modules/function-bind/LICENSE delete mode 100644 node_modules/function-bind/README.md delete mode 100644 node_modules/function-bind/implementation.js delete mode 100644 node_modules/function-bind/index.js delete mode 100644 node_modules/function-bind/package.json delete mode 100644 node_modules/function-bind/test/.eslintrc delete mode 100644 node_modules/function-bind/test/index.js delete mode 100644 node_modules/get-intrinsic/.eslintrc delete mode 100644 node_modules/get-intrinsic/.github/FUNDING.yml delete mode 100644 node_modules/get-intrinsic/.nycrc delete mode 100644 node_modules/get-intrinsic/CHANGELOG.md delete mode 100644 node_modules/get-intrinsic/LICENSE delete mode 100644 node_modules/get-intrinsic/README.md delete mode 100644 node_modules/get-intrinsic/index.js delete mode 100644 node_modules/get-intrinsic/package.json delete mode 100644 node_modules/get-intrinsic/test/GetIntrinsic.js delete mode 100644 node_modules/getpass/.npmignore delete mode 100644 node_modules/getpass/.travis.yml delete mode 100644 node_modules/getpass/LICENSE delete mode 100644 node_modules/getpass/README.md delete mode 100644 node_modules/getpass/lib/index.js delete mode 100644 node_modules/getpass/package.json delete mode 100644 node_modules/glob-parent/CHANGELOG.md delete mode 100644 node_modules/glob-parent/LICENSE delete mode 100644 node_modules/glob-parent/README.md delete mode 100644 node_modules/glob-parent/index.js delete mode 100644 node_modules/glob-parent/package.json delete mode 100644 node_modules/har-schema/LICENSE delete mode 100644 node_modules/har-schema/README.md delete mode 100644 node_modules/har-schema/lib/afterRequest.json delete mode 100644 node_modules/har-schema/lib/beforeRequest.json delete mode 100644 node_modules/har-schema/lib/browser.json delete mode 100644 node_modules/har-schema/lib/cache.json delete mode 100644 node_modules/har-schema/lib/content.json delete mode 100644 node_modules/har-schema/lib/cookie.json delete mode 100644 node_modules/har-schema/lib/creator.json delete mode 100644 node_modules/har-schema/lib/entry.json delete mode 100644 node_modules/har-schema/lib/har.json delete mode 100644 node_modules/har-schema/lib/header.json delete mode 100644 node_modules/har-schema/lib/index.js delete mode 100644 node_modules/har-schema/lib/log.json delete mode 100644 node_modules/har-schema/lib/page.json delete mode 100644 node_modules/har-schema/lib/pageTimings.json delete mode 100644 node_modules/har-schema/lib/postData.json delete mode 100644 node_modules/har-schema/lib/query.json delete mode 100644 node_modules/har-schema/lib/request.json delete mode 100644 node_modules/har-schema/lib/response.json delete mode 100644 node_modules/har-schema/lib/timings.json delete mode 100644 node_modules/har-schema/package.json delete mode 100644 node_modules/har-validator/LICENSE delete mode 100644 node_modules/har-validator/README.md delete mode 100644 node_modules/har-validator/lib/async.js delete mode 100644 node_modules/har-validator/lib/error.js delete mode 100644 node_modules/har-validator/lib/promise.js delete mode 100644 node_modules/har-validator/package.json delete mode 100644 node_modules/has-flag/index.js delete mode 100644 node_modules/has-flag/license delete mode 100644 node_modules/has-flag/package.json delete mode 100644 node_modules/has-flag/readme.md delete mode 100644 node_modules/has-symbols/.eslintrc delete mode 100644 node_modules/has-symbols/.github/FUNDING.yml delete mode 100644 node_modules/has-symbols/.nycrc delete mode 100644 node_modules/has-symbols/CHANGELOG.md delete mode 100644 node_modules/has-symbols/LICENSE delete mode 100644 node_modules/has-symbols/README.md delete mode 100644 node_modules/has-symbols/index.js delete mode 100644 node_modules/has-symbols/package.json delete mode 100644 node_modules/has-symbols/shams.js delete mode 100644 node_modules/has-symbols/test/index.js delete mode 100644 node_modules/has-symbols/test/shams/core-js.js delete mode 100644 node_modules/has-symbols/test/shams/get-own-property-symbols.js delete mode 100644 node_modules/has-symbols/test/tests.js delete mode 100644 node_modules/has/LICENSE-MIT delete mode 100644 node_modules/has/README.md delete mode 100644 node_modules/has/package.json delete mode 100644 node_modules/has/src/index.js delete mode 100644 node_modules/has/test/index.js delete mode 100644 node_modules/he/LICENSE-MIT.txt delete mode 100644 node_modules/he/README.md delete mode 100755 node_modules/he/bin/he delete mode 100644 node_modules/he/he.js delete mode 100644 node_modules/he/man/he.1 delete mode 100644 node_modules/he/package.json delete mode 100644 node_modules/html-minifier/LICENSE delete mode 100644 node_modules/html-minifier/README.md delete mode 100755 node_modules/html-minifier/cli.js delete mode 100644 node_modules/html-minifier/package.json delete mode 100644 node_modules/html-minifier/sample-cli-config-file.conf delete mode 100644 node_modules/html-minifier/src/htmlminifier.js delete mode 100644 node_modules/html-minifier/src/htmlparser.js delete mode 100644 node_modules/html-minifier/src/tokenchain.js delete mode 100644 node_modules/html-minifier/src/utils.js delete mode 100644 node_modules/http-errors/HISTORY.md delete mode 100644 node_modules/http-errors/LICENSE delete mode 100644 node_modules/http-errors/README.md delete mode 100644 node_modules/http-errors/index.js delete mode 100644 node_modules/http-errors/package.json delete mode 100644 node_modules/http-signature/.dir-locals.el delete mode 100644 node_modules/http-signature/.npmignore delete mode 100644 node_modules/http-signature/CHANGES.md delete mode 100644 node_modules/http-signature/LICENSE delete mode 100644 node_modules/http-signature/README.md delete mode 100644 node_modules/http-signature/http_signing.md delete mode 100644 node_modules/http-signature/lib/index.js delete mode 100644 node_modules/http-signature/lib/parser.js delete mode 100644 node_modules/http-signature/lib/signer.js delete mode 100644 node_modules/http-signature/lib/utils.js delete mode 100644 node_modules/http-signature/lib/verify.js delete mode 100644 node_modules/http-signature/package.json delete mode 100644 node_modules/iconv-lite/Changelog.md delete mode 100644 node_modules/iconv-lite/LICENSE delete mode 100644 node_modules/iconv-lite/README.md delete mode 100644 node_modules/iconv-lite/encodings/dbcs-codec.js delete mode 100644 node_modules/iconv-lite/encodings/dbcs-data.js delete mode 100644 node_modules/iconv-lite/encodings/index.js delete mode 100644 node_modules/iconv-lite/encodings/internal.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-codec.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-data-generated.js delete mode 100644 node_modules/iconv-lite/encodings/sbcs-data.js delete mode 100644 node_modules/iconv-lite/encodings/tables/big5-added.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp936.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp949.json delete mode 100644 node_modules/iconv-lite/encodings/tables/cp950.json delete mode 100644 node_modules/iconv-lite/encodings/tables/eucjp.json delete mode 100644 node_modules/iconv-lite/encodings/tables/gb18030-ranges.json delete mode 100644 node_modules/iconv-lite/encodings/tables/gbk-added.json delete mode 100644 node_modules/iconv-lite/encodings/tables/shiftjis.json delete mode 100644 node_modules/iconv-lite/encodings/utf16.js delete mode 100644 node_modules/iconv-lite/encodings/utf7.js delete mode 100644 node_modules/iconv-lite/lib/bom-handling.js delete mode 100644 node_modules/iconv-lite/lib/extend-node.js delete mode 100644 node_modules/iconv-lite/lib/index.d.ts delete mode 100644 node_modules/iconv-lite/lib/index.js delete mode 100644 node_modules/iconv-lite/lib/streams.js delete mode 100644 node_modules/iconv-lite/package.json delete mode 100644 node_modules/ignore-by-default/LICENSE delete mode 100644 node_modules/ignore-by-default/README.md delete mode 100644 node_modules/ignore-by-default/index.js delete mode 100644 node_modules/ignore-by-default/package.json delete mode 100644 node_modules/inherits/LICENSE delete mode 100644 node_modules/inherits/README.md delete mode 100644 node_modules/inherits/inherits.js delete mode 100644 node_modules/inherits/inherits_browser.js delete mode 100644 node_modules/inherits/package.json delete mode 100644 node_modules/ipaddr.js/LICENSE delete mode 100644 node_modules/ipaddr.js/README.md delete mode 100644 node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 node_modules/ipaddr.js/lib/ipaddr.js.d.ts delete mode 100644 node_modules/ipaddr.js/package.json delete mode 100644 node_modules/is-binary-path/index.d.ts delete mode 100644 node_modules/is-binary-path/index.js delete mode 100644 node_modules/is-binary-path/license delete mode 100644 node_modules/is-binary-path/package.json delete mode 100644 node_modules/is-binary-path/readme.md delete mode 100644 node_modules/is-extglob/LICENSE delete mode 100644 node_modules/is-extglob/README.md delete mode 100644 node_modules/is-extglob/index.js delete mode 100644 node_modules/is-extglob/package.json delete mode 100644 node_modules/is-glob/LICENSE delete mode 100644 node_modules/is-glob/README.md delete mode 100644 node_modules/is-glob/index.js delete mode 100644 node_modules/is-glob/package.json delete mode 100644 node_modules/is-number/LICENSE delete mode 100644 node_modules/is-number/README.md delete mode 100644 node_modules/is-number/index.js delete mode 100644 node_modules/is-number/package.json delete mode 100644 node_modules/is-typedarray/LICENSE.md delete mode 100644 node_modules/is-typedarray/README.md delete mode 100644 node_modules/is-typedarray/index.js delete mode 100644 node_modules/is-typedarray/package.json delete mode 100644 node_modules/is-typedarray/test.js delete mode 100644 node_modules/isstream/.jshintrc delete mode 100644 node_modules/isstream/.npmignore delete mode 100644 node_modules/isstream/.travis.yml delete mode 100644 node_modules/isstream/LICENSE.md delete mode 100644 node_modules/isstream/README.md delete mode 100644 node_modules/isstream/isstream.js delete mode 100644 node_modules/isstream/package.json delete mode 100644 node_modules/isstream/test.js delete mode 100644 node_modules/jake/Makefile delete mode 100644 node_modules/jake/README.md delete mode 100755 node_modules/jake/bin/bash_completion.sh delete mode 100755 node_modules/jake/bin/cli.js delete mode 100644 node_modules/jake/jakefile.js delete mode 100644 node_modules/jake/lib/api.js delete mode 100644 node_modules/jake/lib/jake.js delete mode 100644 node_modules/jake/lib/loader.js delete mode 100644 node_modules/jake/lib/namespace.js delete mode 100644 node_modules/jake/lib/package_task.js delete mode 100644 node_modules/jake/lib/parseargs.js delete mode 100644 node_modules/jake/lib/program.js delete mode 100644 node_modules/jake/lib/publish_task.js delete mode 100644 node_modules/jake/lib/rule.js delete mode 100644 node_modules/jake/lib/task/directory_task.js delete mode 100644 node_modules/jake/lib/task/file_task.js delete mode 100644 node_modules/jake/lib/task/index.js delete mode 100644 node_modules/jake/lib/task/task.js delete mode 100644 node_modules/jake/lib/test_task.js delete mode 100644 node_modules/jake/lib/utils/file.js delete mode 100644 node_modules/jake/lib/utils/index.js delete mode 100644 node_modules/jake/lib/utils/logger.js delete mode 100644 node_modules/jake/package.json delete mode 100644 node_modules/jake/test/integration/concurrent.js delete mode 100644 node_modules/jake/test/integration/file.js delete mode 100644 node_modules/jake/test/integration/file_task.js delete mode 100644 node_modules/jake/test/integration/helpers.js delete mode 100644 node_modules/jake/test/integration/jakefile.js delete mode 100644 node_modules/jake/test/integration/jakelib/concurrent.jake.js delete mode 100644 node_modules/jake/test/integration/jakelib/publish.jake.js delete mode 100644 node_modules/jake/test/integration/jakelib/required_module.jake.js delete mode 100644 node_modules/jake/test/integration/jakelib/rule.jake.js delete mode 100644 node_modules/jake/test/integration/publish_task.js delete mode 100644 node_modules/jake/test/integration/rule.js delete mode 100644 node_modules/jake/test/integration/selfdep.js delete mode 100644 node_modules/jake/test/integration/task_base.js delete mode 100644 node_modules/jake/test/unit/jakefile.js delete mode 100644 node_modules/jake/test/unit/namespace.js delete mode 100644 node_modules/jake/test/unit/parseargs.js delete mode 100644 node_modules/jake/usage.txt delete mode 100644 node_modules/jsbn/.npmignore delete mode 100644 node_modules/jsbn/LICENSE delete mode 100644 node_modules/jsbn/README.md delete mode 100644 node_modules/jsbn/example.html delete mode 100644 node_modules/jsbn/example.js delete mode 100644 node_modules/jsbn/index.js delete mode 100644 node_modules/jsbn/package.json delete mode 100644 node_modules/json-schema-traverse/.eslintrc.yml delete mode 100644 node_modules/json-schema-traverse/.travis.yml delete mode 100644 node_modules/json-schema-traverse/LICENSE delete mode 100644 node_modules/json-schema-traverse/README.md delete mode 100644 node_modules/json-schema-traverse/index.js delete mode 100644 node_modules/json-schema-traverse/package.json delete mode 100644 node_modules/json-schema-traverse/spec/.eslintrc.yml delete mode 100644 node_modules/json-schema-traverse/spec/fixtures/schema.js delete mode 100644 node_modules/json-schema-traverse/spec/index.spec.js delete mode 100644 node_modules/json-schema/LICENSE delete mode 100644 node_modules/json-schema/README.md delete mode 100644 node_modules/json-schema/lib/links.js delete mode 100644 node_modules/json-schema/lib/validate.js delete mode 100644 node_modules/json-schema/package.json delete mode 100644 node_modules/json-stringify-safe/.npmignore delete mode 100644 node_modules/json-stringify-safe/CHANGELOG.md delete mode 100644 node_modules/json-stringify-safe/LICENSE delete mode 100644 node_modules/json-stringify-safe/Makefile delete mode 100644 node_modules/json-stringify-safe/README.md delete mode 100644 node_modules/json-stringify-safe/package.json delete mode 100644 node_modules/json-stringify-safe/stringify.js delete mode 100644 node_modules/json-stringify-safe/test/mocha.opts delete mode 100644 node_modules/json-stringify-safe/test/stringify_test.js delete mode 100644 node_modules/jsprim/CHANGES.md delete mode 100644 node_modules/jsprim/CONTRIBUTING.md delete mode 100644 node_modules/jsprim/LICENSE delete mode 100644 node_modules/jsprim/README.md delete mode 100644 node_modules/jsprim/lib/jsprim.js delete mode 100644 node_modules/jsprim/package.json delete mode 100644 node_modules/lodash.merge/LICENSE delete mode 100644 node_modules/lodash.merge/README.md delete mode 100644 node_modules/lodash.merge/index.js delete mode 100644 node_modules/lodash.merge/package.json delete mode 100644 node_modules/lower-case/LICENSE delete mode 100644 node_modules/lower-case/README.md delete mode 100644 node_modules/lower-case/lower-case.d.ts delete mode 100644 node_modules/lower-case/lower-case.js delete mode 100644 node_modules/lower-case/package.json delete mode 100644 node_modules/media-typer/HISTORY.md delete mode 100644 node_modules/media-typer/LICENSE delete mode 100644 node_modules/media-typer/README.md delete mode 100644 node_modules/media-typer/index.js delete mode 100644 node_modules/media-typer/package.json delete mode 100644 node_modules/merge-descriptors/HISTORY.md delete mode 100644 node_modules/merge-descriptors/LICENSE delete mode 100644 node_modules/merge-descriptors/README.md delete mode 100644 node_modules/merge-descriptors/index.js delete mode 100644 node_modules/merge-descriptors/package.json delete mode 100644 node_modules/methods/HISTORY.md delete mode 100644 node_modules/methods/LICENSE delete mode 100644 node_modules/methods/README.md delete mode 100644 node_modules/methods/index.js delete mode 100644 node_modules/methods/package.json delete mode 100644 node_modules/mime-db/HISTORY.md delete mode 100644 node_modules/mime-db/LICENSE delete mode 100644 node_modules/mime-db/README.md delete mode 100644 node_modules/mime-db/db.json delete mode 100644 node_modules/mime-db/index.js delete mode 100644 node_modules/mime-db/package.json delete mode 100644 node_modules/mime-types/HISTORY.md delete mode 100644 node_modules/mime-types/LICENSE delete mode 100644 node_modules/mime-types/README.md delete mode 100644 node_modules/mime-types/index.js delete mode 100644 node_modules/mime-types/package.json delete mode 100644 node_modules/mime/.npmignore delete mode 100644 node_modules/mime/CHANGELOG.md delete mode 100644 node_modules/mime/LICENSE delete mode 100644 node_modules/mime/README.md delete mode 100755 node_modules/mime/cli.js delete mode 100644 node_modules/mime/mime.js delete mode 100644 node_modules/mime/package.json delete mode 100755 node_modules/mime/src/build.js delete mode 100644 node_modules/mime/src/test.js delete mode 100644 node_modules/mime/types.json delete mode 100644 node_modules/minimatch/LICENSE delete mode 100644 node_modules/minimatch/README.md delete mode 100644 node_modules/minimatch/minimatch.js delete mode 100644 node_modules/minimatch/package.json delete mode 100644 node_modules/ms/index.js delete mode 100644 node_modules/ms/license.md delete mode 100644 node_modules/ms/package.json delete mode 100644 node_modules/ms/readme.md delete mode 100644 node_modules/ncname/index.js delete mode 100644 node_modules/ncname/package.json delete mode 100644 node_modules/ncname/readme.md delete mode 100644 node_modules/negotiator/HISTORY.md delete mode 100644 node_modules/negotiator/LICENSE delete mode 100644 node_modules/negotiator/README.md delete mode 100644 node_modules/negotiator/index.js delete mode 100644 node_modules/negotiator/lib/charset.js delete mode 100644 node_modules/negotiator/lib/encoding.js delete mode 100644 node_modules/negotiator/lib/language.js delete mode 100644 node_modules/negotiator/lib/mediaType.js delete mode 100644 node_modules/negotiator/package.json delete mode 100644 node_modules/no-case/LICENSE delete mode 100644 node_modules/no-case/README.md delete mode 100644 node_modules/no-case/no-case.d.ts delete mode 100644 node_modules/no-case/no-case.js delete mode 100644 node_modules/no-case/package.json delete mode 100644 node_modules/no-case/vendor/camel-case-regexp.js delete mode 100644 node_modules/no-case/vendor/camel-case-upper-regexp.js delete mode 100644 node_modules/no-case/vendor/non-word-regexp.js delete mode 100644 node_modules/nodemon/LICENSE delete mode 100644 node_modules/nodemon/README.md delete mode 100755 node_modules/nodemon/bin/nodemon.js delete mode 100644 node_modules/nodemon/bin/windows-kill.exe delete mode 100644 node_modules/nodemon/doc/cli/authors.txt delete mode 100644 node_modules/nodemon/doc/cli/config.txt delete mode 100644 node_modules/nodemon/doc/cli/help.txt delete mode 100644 node_modules/nodemon/doc/cli/logo.txt delete mode 100644 node_modules/nodemon/doc/cli/options.txt delete mode 100644 node_modules/nodemon/doc/cli/topics.txt delete mode 100644 node_modules/nodemon/doc/cli/usage.txt delete mode 100644 node_modules/nodemon/doc/cli/whoami.txt delete mode 100644 node_modules/nodemon/lib/cli/index.js delete mode 100644 node_modules/nodemon/lib/cli/parse.js delete mode 100644 node_modules/nodemon/lib/config/command.js delete mode 100644 node_modules/nodemon/lib/config/defaults.js delete mode 100644 node_modules/nodemon/lib/config/exec.js delete mode 100644 node_modules/nodemon/lib/config/index.js delete mode 100644 node_modules/nodemon/lib/config/load.js delete mode 100644 node_modules/nodemon/lib/help/index.js delete mode 100644 node_modules/nodemon/lib/index.js delete mode 100644 node_modules/nodemon/lib/monitor/index.js delete mode 100644 node_modules/nodemon/lib/monitor/match.js delete mode 100644 node_modules/nodemon/lib/monitor/run.js delete mode 100644 node_modules/nodemon/lib/monitor/signals.js delete mode 100644 node_modules/nodemon/lib/monitor/watch.js delete mode 100644 node_modules/nodemon/lib/nodemon.js delete mode 100644 node_modules/nodemon/lib/rules/add.js delete mode 100644 node_modules/nodemon/lib/rules/index.js delete mode 100644 node_modules/nodemon/lib/rules/parse.js delete mode 100644 node_modules/nodemon/lib/spawn.js delete mode 100644 node_modules/nodemon/lib/utils/bus.js delete mode 100644 node_modules/nodemon/lib/utils/clone.js delete mode 100644 node_modules/nodemon/lib/utils/colour.js delete mode 100644 node_modules/nodemon/lib/utils/index.js delete mode 100644 node_modules/nodemon/lib/utils/log.js delete mode 100644 node_modules/nodemon/lib/utils/merge.js delete mode 100644 node_modules/nodemon/lib/version.js delete mode 100644 node_modules/nodemon/node_modules/debug/CHANGELOG.md delete mode 100644 node_modules/nodemon/node_modules/debug/LICENSE delete mode 100644 node_modules/nodemon/node_modules/debug/README.md delete mode 100644 node_modules/nodemon/node_modules/debug/node.js delete mode 100644 node_modules/nodemon/node_modules/debug/package.json delete mode 100644 node_modules/nodemon/node_modules/debug/src/browser.js delete mode 100644 node_modules/nodemon/node_modules/debug/src/common.js delete mode 100644 node_modules/nodemon/node_modules/debug/src/index.js delete mode 100644 node_modules/nodemon/node_modules/debug/src/node.js delete mode 100644 node_modules/nodemon/node_modules/ms/index.js delete mode 100644 node_modules/nodemon/node_modules/ms/license.md delete mode 100644 node_modules/nodemon/node_modules/ms/package.json delete mode 100644 node_modules/nodemon/node_modules/ms/readme.md delete mode 100644 node_modules/nodemon/package.json delete mode 100644 node_modules/nopt/.npmignore delete mode 100644 node_modules/nopt/LICENSE delete mode 100644 node_modules/nopt/README.md delete mode 100755 node_modules/nopt/bin/nopt.js delete mode 100755 node_modules/nopt/examples/my-program.js delete mode 100644 node_modules/nopt/lib/nopt.js delete mode 100644 node_modules/nopt/package.json delete mode 100644 node_modules/normalize-path/LICENSE delete mode 100644 node_modules/normalize-path/README.md delete mode 100644 node_modules/normalize-path/index.js delete mode 100644 node_modules/normalize-path/package.json delete mode 100644 node_modules/oauth-sign/LICENSE delete mode 100644 node_modules/oauth-sign/README.md delete mode 100644 node_modules/oauth-sign/index.js delete mode 100644 node_modules/oauth-sign/package.json delete mode 100644 node_modules/object-inspect/.eslintrc delete mode 100644 node_modules/object-inspect/.github/FUNDING.yml delete mode 100644 node_modules/object-inspect/.nycrc delete mode 100644 node_modules/object-inspect/CHANGELOG.md delete mode 100644 node_modules/object-inspect/LICENSE delete mode 100644 node_modules/object-inspect/example/all.js delete mode 100644 node_modules/object-inspect/example/circular.js delete mode 100644 node_modules/object-inspect/example/fn.js delete mode 100644 node_modules/object-inspect/example/inspect.js delete mode 100644 node_modules/object-inspect/index.js delete mode 100644 node_modules/object-inspect/package-support.json delete mode 100644 node_modules/object-inspect/package.json delete mode 100644 node_modules/object-inspect/readme.markdown delete mode 100644 node_modules/object-inspect/test-core-js.js delete mode 100644 node_modules/object-inspect/test/bigint.js delete mode 100644 node_modules/object-inspect/test/browser/dom.js delete mode 100644 node_modules/object-inspect/test/circular.js delete mode 100644 node_modules/object-inspect/test/deep.js delete mode 100644 node_modules/object-inspect/test/element.js delete mode 100644 node_modules/object-inspect/test/err.js delete mode 100644 node_modules/object-inspect/test/fakes.js delete mode 100644 node_modules/object-inspect/test/fn.js delete mode 100644 node_modules/object-inspect/test/has.js delete mode 100644 node_modules/object-inspect/test/holes.js delete mode 100644 node_modules/object-inspect/test/indent-option.js delete mode 100644 node_modules/object-inspect/test/inspect.js delete mode 100644 node_modules/object-inspect/test/lowbyte.js delete mode 100644 node_modules/object-inspect/test/number.js delete mode 100644 node_modules/object-inspect/test/quoteStyle.js delete mode 100644 node_modules/object-inspect/test/toStringTag.js delete mode 100644 node_modules/object-inspect/test/undef.js delete mode 100644 node_modules/object-inspect/test/values.js delete mode 100644 node_modules/object-inspect/util.inspect.js delete mode 100644 node_modules/on-finished/HISTORY.md delete mode 100644 node_modules/on-finished/LICENSE delete mode 100644 node_modules/on-finished/README.md delete mode 100644 node_modules/on-finished/index.js delete mode 100644 node_modules/on-finished/package.json delete mode 100644 node_modules/param-case/LICENSE delete mode 100644 node_modules/param-case/README.md delete mode 100644 node_modules/param-case/package.json delete mode 100644 node_modules/param-case/param-case.d.ts delete mode 100644 node_modules/param-case/param-case.js delete mode 100644 node_modules/parseurl/HISTORY.md delete mode 100644 node_modules/parseurl/LICENSE delete mode 100644 node_modules/parseurl/README.md delete mode 100644 node_modules/parseurl/index.js delete mode 100644 node_modules/parseurl/package.json delete mode 100644 node_modules/path-to-regexp/History.md delete mode 100644 node_modules/path-to-regexp/LICENSE delete mode 100644 node_modules/path-to-regexp/Readme.md delete mode 100644 node_modules/path-to-regexp/index.js delete mode 100644 node_modules/path-to-regexp/package.json delete mode 100644 node_modules/performance-now/.npmignore delete mode 100644 node_modules/performance-now/.tm_properties delete mode 100644 node_modules/performance-now/.travis.yml delete mode 100644 node_modules/performance-now/README.md delete mode 100644 node_modules/performance-now/lib/performance-now.js delete mode 100644 node_modules/performance-now/lib/performance-now.js.map delete mode 100644 node_modules/performance-now/license.txt delete mode 100644 node_modules/performance-now/package.json delete mode 100644 node_modules/performance-now/src/index.d.ts delete mode 100644 node_modules/performance-now/src/performance-now.coffee delete mode 100644 node_modules/performance-now/test/mocha.opts delete mode 100644 node_modules/performance-now/test/performance-now.coffee delete mode 100644 node_modules/performance-now/test/scripts.coffee delete mode 100755 node_modules/performance-now/test/scripts/delayed-call.coffee delete mode 100755 node_modules/performance-now/test/scripts/delayed-require.coffee delete mode 100755 node_modules/performance-now/test/scripts/difference.coffee delete mode 100755 node_modules/performance-now/test/scripts/initial-value.coffee delete mode 100644 node_modules/picomatch/CHANGELOG.md delete mode 100644 node_modules/picomatch/LICENSE delete mode 100644 node_modules/picomatch/README.md delete mode 100644 node_modules/picomatch/index.js delete mode 100644 node_modules/picomatch/lib/constants.js delete mode 100644 node_modules/picomatch/lib/parse.js delete mode 100644 node_modules/picomatch/lib/picomatch.js delete mode 100644 node_modules/picomatch/lib/scan.js delete mode 100644 node_modules/picomatch/lib/utils.js delete mode 100644 node_modules/picomatch/package.json delete mode 100644 node_modules/proxy-addr/HISTORY.md delete mode 100644 node_modules/proxy-addr/LICENSE delete mode 100644 node_modules/proxy-addr/README.md delete mode 100644 node_modules/proxy-addr/index.js delete mode 100644 node_modules/proxy-addr/package.json delete mode 100644 node_modules/psl/.env delete mode 100644 node_modules/psl/LICENSE delete mode 100644 node_modules/psl/README.md delete mode 100644 node_modules/psl/browserstack-logo.svg delete mode 100644 node_modules/psl/data/rules.json delete mode 100644 node_modules/psl/dist/psl.js delete mode 100644 node_modules/psl/dist/psl.min.js delete mode 100644 node_modules/psl/index.js delete mode 100644 node_modules/psl/package.json delete mode 100644 node_modules/pstree.remy/.travis.yml delete mode 100644 node_modules/pstree.remy/LICENSE delete mode 100644 node_modules/pstree.remy/README.md delete mode 100644 node_modules/pstree.remy/lib/index.js delete mode 100644 node_modules/pstree.remy/lib/tree.js delete mode 100644 node_modules/pstree.remy/lib/utils.js delete mode 100644 node_modules/pstree.remy/package.json delete mode 100644 node_modules/pstree.remy/tests/fixtures/index.js delete mode 100644 node_modules/pstree.remy/tests/fixtures/out1 delete mode 100644 node_modules/pstree.remy/tests/fixtures/out2 delete mode 100644 node_modules/pstree.remy/tests/index.test.js delete mode 100644 node_modules/punycode/LICENSE-MIT.txt delete mode 100644 node_modules/punycode/README.md delete mode 100644 node_modules/punycode/package.json delete mode 100644 node_modules/punycode/punycode.es6.js delete mode 100644 node_modules/punycode/punycode.js delete mode 100644 node_modules/qs/.editorconfig delete mode 100644 node_modules/qs/.eslintrc delete mode 100644 node_modules/qs/.github/FUNDING.yml delete mode 100644 node_modules/qs/.nycrc delete mode 100644 node_modules/qs/CHANGELOG.md delete mode 100644 node_modules/qs/LICENSE.md delete mode 100644 node_modules/qs/README.md delete mode 100644 node_modules/qs/dist/qs.js delete mode 100644 node_modules/qs/lib/formats.js delete mode 100644 node_modules/qs/lib/index.js delete mode 100644 node_modules/qs/lib/parse.js delete mode 100644 node_modules/qs/lib/stringify.js delete mode 100644 node_modules/qs/lib/utils.js delete mode 100644 node_modules/qs/package.json delete mode 100644 node_modules/qs/test/parse.js delete mode 100644 node_modules/qs/test/stringify.js delete mode 100644 node_modules/qs/test/utils.js delete mode 100644 node_modules/range-parser/HISTORY.md delete mode 100644 node_modules/range-parser/LICENSE delete mode 100644 node_modules/range-parser/README.md delete mode 100644 node_modules/range-parser/index.js delete mode 100644 node_modules/range-parser/package.json delete mode 100644 node_modules/raw-body/HISTORY.md delete mode 100644 node_modules/raw-body/LICENSE delete mode 100644 node_modules/raw-body/README.md delete mode 100644 node_modules/raw-body/SECURITY.md delete mode 100644 node_modules/raw-body/index.d.ts delete mode 100644 node_modules/raw-body/index.js delete mode 100644 node_modules/raw-body/package.json delete mode 100644 node_modules/readdirp/LICENSE delete mode 100644 node_modules/readdirp/README.md delete mode 100644 node_modules/readdirp/index.d.ts delete mode 100644 node_modules/readdirp/index.js delete mode 100644 node_modules/readdirp/package.json delete mode 100644 node_modules/relateurl/README.md delete mode 100644 node_modules/relateurl/lib/constants.js delete mode 100644 node_modules/relateurl/lib/format.js delete mode 100644 node_modules/relateurl/lib/index.js delete mode 100644 node_modules/relateurl/lib/options.js delete mode 100644 node_modules/relateurl/lib/parse/host.js delete mode 100644 node_modules/relateurl/lib/parse/hrefInfo.js delete mode 100644 node_modules/relateurl/lib/parse/index.js delete mode 100644 node_modules/relateurl/lib/parse/path.js delete mode 100644 node_modules/relateurl/lib/parse/port.js delete mode 100644 node_modules/relateurl/lib/parse/query.js delete mode 100644 node_modules/relateurl/lib/parse/urlstring.js delete mode 100644 node_modules/relateurl/lib/relate/absolutize.js delete mode 100644 node_modules/relateurl/lib/relate/findRelation.js delete mode 100644 node_modules/relateurl/lib/relate/index.js delete mode 100644 node_modules/relateurl/lib/relate/relativize.js delete mode 100644 node_modules/relateurl/lib/util/devlog.js delete mode 100644 node_modules/relateurl/lib/util/object.js delete mode 100644 node_modules/relateurl/lib/util/path.js delete mode 100644 node_modules/relateurl/license delete mode 100644 node_modules/relateurl/package.json delete mode 100644 node_modules/request/CHANGELOG.md delete mode 100644 node_modules/request/LICENSE delete mode 100644 node_modules/request/README.md delete mode 100755 node_modules/request/index.js delete mode 100644 node_modules/request/lib/auth.js delete mode 100644 node_modules/request/lib/cookies.js delete mode 100644 node_modules/request/lib/getProxyFromURI.js delete mode 100644 node_modules/request/lib/har.js delete mode 100644 node_modules/request/lib/hawk.js delete mode 100644 node_modules/request/lib/helpers.js delete mode 100644 node_modules/request/lib/multipart.js delete mode 100644 node_modules/request/lib/oauth.js delete mode 100644 node_modules/request/lib/querystring.js delete mode 100644 node_modules/request/lib/redirect.js delete mode 100644 node_modules/request/lib/tunnel.js delete mode 100644 node_modules/request/node_modules/qs/.editorconfig delete mode 100644 node_modules/request/node_modules/qs/.eslintrc delete mode 100644 node_modules/request/node_modules/qs/.github/FUNDING.yml delete mode 100644 node_modules/request/node_modules/qs/.nycrc delete mode 100644 node_modules/request/node_modules/qs/CHANGELOG.md delete mode 100644 node_modules/request/node_modules/qs/LICENSE.md delete mode 100644 node_modules/request/node_modules/qs/README.md delete mode 100644 node_modules/request/node_modules/qs/bower.json delete mode 100644 node_modules/request/node_modules/qs/component.json delete mode 100644 node_modules/request/node_modules/qs/dist/qs.js delete mode 100644 node_modules/request/node_modules/qs/lib/formats.js delete mode 100644 node_modules/request/node_modules/qs/lib/index.js delete mode 100644 node_modules/request/node_modules/qs/lib/parse.js delete mode 100644 node_modules/request/node_modules/qs/lib/stringify.js delete mode 100644 node_modules/request/node_modules/qs/lib/utils.js delete mode 100644 node_modules/request/node_modules/qs/package.json delete mode 100644 node_modules/request/node_modules/qs/test/index.js delete mode 100644 node_modules/request/node_modules/qs/test/parse.js delete mode 100644 node_modules/request/node_modules/qs/test/stringify.js delete mode 100644 node_modules/request/node_modules/qs/test/utils.js delete mode 100644 node_modules/request/package.json delete mode 100644 node_modules/request/request.js delete mode 100644 node_modules/safe-buffer/LICENSE delete mode 100644 node_modules/safe-buffer/README.md delete mode 100644 node_modules/safe-buffer/index.d.ts delete mode 100644 node_modules/safe-buffer/index.js delete mode 100644 node_modules/safe-buffer/package.json delete mode 100644 node_modules/safer-buffer/LICENSE delete mode 100644 node_modules/safer-buffer/Porting-Buffer.md delete mode 100644 node_modules/safer-buffer/Readme.md delete mode 100644 node_modules/safer-buffer/dangerous.js delete mode 100644 node_modules/safer-buffer/package.json delete mode 100644 node_modules/safer-buffer/safer.js delete mode 100644 node_modules/safer-buffer/tests.js delete mode 100644 node_modules/semver/CHANGELOG.md delete mode 100644 node_modules/semver/LICENSE delete mode 100644 node_modules/semver/README.md delete mode 100755 node_modules/semver/bin/semver delete mode 100644 node_modules/semver/package.json delete mode 100644 node_modules/semver/range.bnf delete mode 100644 node_modules/semver/semver.js delete mode 100644 node_modules/send/HISTORY.md delete mode 100644 node_modules/send/LICENSE delete mode 100644 node_modules/send/README.md delete mode 100644 node_modules/send/SECURITY.md delete mode 100644 node_modules/send/index.js delete mode 100644 node_modules/send/node_modules/ms/index.js delete mode 100644 node_modules/send/node_modules/ms/license.md delete mode 100644 node_modules/send/node_modules/ms/package.json delete mode 100644 node_modules/send/node_modules/ms/readme.md delete mode 100644 node_modules/send/package.json delete mode 100644 node_modules/serve-static/HISTORY.md delete mode 100644 node_modules/serve-static/LICENSE delete mode 100644 node_modules/serve-static/README.md delete mode 100644 node_modules/serve-static/index.js delete mode 100644 node_modules/serve-static/package.json delete mode 100644 node_modules/setprototypeof/LICENSE delete mode 100644 node_modules/setprototypeof/README.md delete mode 100644 node_modules/setprototypeof/index.d.ts delete mode 100644 node_modules/setprototypeof/index.js delete mode 100644 node_modules/setprototypeof/package.json delete mode 100644 node_modules/setprototypeof/test/index.js delete mode 100644 node_modules/side-channel/.eslintignore delete mode 100644 node_modules/side-channel/.eslintrc delete mode 100644 node_modules/side-channel/.github/FUNDING.yml delete mode 100644 node_modules/side-channel/.nycrc delete mode 100644 node_modules/side-channel/CHANGELOG.md delete mode 100644 node_modules/side-channel/LICENSE delete mode 100644 node_modules/side-channel/README.md delete mode 100644 node_modules/side-channel/index.js delete mode 100644 node_modules/side-channel/package.json delete mode 100644 node_modules/side-channel/test/index.js delete mode 100644 node_modules/simple-update-notifier/LICENSE delete mode 100644 node_modules/simple-update-notifier/README.md delete mode 100644 node_modules/simple-update-notifier/build/index.d.ts delete mode 100644 node_modules/simple-update-notifier/build/index.js delete mode 120000 node_modules/simple-update-notifier/node_modules/.bin/semver delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/LICENSE delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/README.md delete mode 100755 node_modules/simple-update-notifier/node_modules/semver/bin/semver.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/index.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/range.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/classes/semver.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/clean.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/compare.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/diff.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/eq.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/gt.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/gte.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/inc.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/lt.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/lte.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/major.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/minor.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/neq.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/parse.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/patch.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/sort.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/functions/valid.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/index.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/constants.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/debug.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/internal/re.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/package.json delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/range.bnf delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js delete mode 100644 node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js delete mode 100644 node_modules/simple-update-notifier/package.json delete mode 100644 node_modules/simple-update-notifier/src/borderedText.ts delete mode 100644 node_modules/simple-update-notifier/src/cache.spec.ts delete mode 100644 node_modules/simple-update-notifier/src/cache.ts delete mode 100644 node_modules/simple-update-notifier/src/getDistVersion.spec.ts delete mode 100644 node_modules/simple-update-notifier/src/getDistVersion.ts delete mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.spec.ts delete mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.ts delete mode 100644 node_modules/simple-update-notifier/src/index.spec.ts delete mode 100644 node_modules/simple-update-notifier/src/index.ts delete mode 100644 node_modules/simple-update-notifier/src/isNpmOrYarn.ts delete mode 100644 node_modules/simple-update-notifier/src/types.ts delete mode 100644 node_modules/source-map/CHANGELOG.md delete mode 100644 node_modules/source-map/LICENSE delete mode 100644 node_modules/source-map/README.md delete mode 100644 node_modules/source-map/dist/source-map.debug.js delete mode 100644 node_modules/source-map/dist/source-map.js delete mode 100644 node_modules/source-map/dist/source-map.min.js delete mode 100644 node_modules/source-map/dist/source-map.min.js.map delete mode 100644 node_modules/source-map/lib/array-set.js delete mode 100644 node_modules/source-map/lib/base64-vlq.js delete mode 100644 node_modules/source-map/lib/base64.js delete mode 100644 node_modules/source-map/lib/binary-search.js delete mode 100644 node_modules/source-map/lib/mapping-list.js delete mode 100644 node_modules/source-map/lib/quick-sort.js delete mode 100644 node_modules/source-map/lib/source-map-consumer.js delete mode 100644 node_modules/source-map/lib/source-map-generator.js delete mode 100644 node_modules/source-map/lib/source-node.js delete mode 100644 node_modules/source-map/lib/util.js delete mode 100644 node_modules/source-map/package.json delete mode 100644 node_modules/source-map/source-map.js delete mode 100644 node_modules/sshpk/.travis.yml delete mode 100644 node_modules/sshpk/Jenkinsfile delete mode 100644 node_modules/sshpk/LICENSE delete mode 100644 node_modules/sshpk/README.md delete mode 100755 node_modules/sshpk/bin/sshpk-conv delete mode 100755 node_modules/sshpk/bin/sshpk-sign delete mode 100755 node_modules/sshpk/bin/sshpk-verify delete mode 100644 node_modules/sshpk/lib/algs.js delete mode 100644 node_modules/sshpk/lib/certificate.js delete mode 100644 node_modules/sshpk/lib/dhe.js delete mode 100644 node_modules/sshpk/lib/ed-compat.js delete mode 100644 node_modules/sshpk/lib/errors.js delete mode 100644 node_modules/sshpk/lib/fingerprint.js delete mode 100644 node_modules/sshpk/lib/formats/auto.js delete mode 100644 node_modules/sshpk/lib/formats/dnssec.js delete mode 100644 node_modules/sshpk/lib/formats/openssh-cert.js delete mode 100644 node_modules/sshpk/lib/formats/pem.js delete mode 100644 node_modules/sshpk/lib/formats/pkcs1.js delete mode 100644 node_modules/sshpk/lib/formats/pkcs8.js delete mode 100644 node_modules/sshpk/lib/formats/putty.js delete mode 100644 node_modules/sshpk/lib/formats/rfc4253.js delete mode 100644 node_modules/sshpk/lib/formats/ssh-private.js delete mode 100644 node_modules/sshpk/lib/formats/ssh.js delete mode 100644 node_modules/sshpk/lib/formats/x509-pem.js delete mode 100644 node_modules/sshpk/lib/formats/x509.js delete mode 100644 node_modules/sshpk/lib/identity.js delete mode 100644 node_modules/sshpk/lib/index.js delete mode 100644 node_modules/sshpk/lib/key.js delete mode 100644 node_modules/sshpk/lib/private-key.js delete mode 100644 node_modules/sshpk/lib/signature.js delete mode 100644 node_modules/sshpk/lib/ssh-buffer.js delete mode 100644 node_modules/sshpk/lib/utils.js delete mode 100644 node_modules/sshpk/man/man1/sshpk-conv.1 delete mode 100644 node_modules/sshpk/man/man1/sshpk-sign.1 delete mode 100644 node_modules/sshpk/man/man1/sshpk-verify.1 delete mode 100644 node_modules/sshpk/package.json delete mode 100644 node_modules/statuses/HISTORY.md delete mode 100644 node_modules/statuses/LICENSE delete mode 100644 node_modules/statuses/README.md delete mode 100644 node_modules/statuses/codes.json delete mode 100644 node_modules/statuses/index.js delete mode 100644 node_modules/statuses/package.json delete mode 100644 node_modules/supports-color/browser.js delete mode 100644 node_modules/supports-color/index.js delete mode 100644 node_modules/supports-color/license delete mode 100644 node_modules/supports-color/package.json delete mode 100644 node_modules/supports-color/readme.md delete mode 100644 node_modules/to-regex-range/LICENSE delete mode 100644 node_modules/to-regex-range/README.md delete mode 100644 node_modules/to-regex-range/index.js delete mode 100644 node_modules/to-regex-range/package.json delete mode 100644 node_modules/toidentifier/HISTORY.md delete mode 100644 node_modules/toidentifier/LICENSE delete mode 100644 node_modules/toidentifier/README.md delete mode 100644 node_modules/toidentifier/index.js delete mode 100644 node_modules/toidentifier/package.json delete mode 100644 node_modules/touch/LICENSE delete mode 100644 node_modules/touch/README.md delete mode 100755 node_modules/touch/bin/nodetouch.js delete mode 100644 node_modules/touch/index.js delete mode 100644 node_modules/touch/package.json delete mode 100644 node_modules/tough-cookie/LICENSE delete mode 100644 node_modules/tough-cookie/README.md delete mode 100644 node_modules/tough-cookie/lib/cookie.js delete mode 100644 node_modules/tough-cookie/lib/memstore.js delete mode 100644 node_modules/tough-cookie/lib/pathMatch.js delete mode 100644 node_modules/tough-cookie/lib/permuteDomain.js delete mode 100644 node_modules/tough-cookie/lib/pubsuffix-psl.js delete mode 100644 node_modules/tough-cookie/lib/store.js delete mode 100644 node_modules/tough-cookie/lib/version.js delete mode 100644 node_modules/tough-cookie/package.json delete mode 100644 node_modules/tunnel-agent/LICENSE delete mode 100644 node_modules/tunnel-agent/README.md delete mode 100644 node_modules/tunnel-agent/index.js delete mode 100644 node_modules/tunnel-agent/package.json delete mode 100644 node_modules/tweetnacl/.npmignore delete mode 100644 node_modules/tweetnacl/AUTHORS.md delete mode 100644 node_modules/tweetnacl/CHANGELOG.md delete mode 100644 node_modules/tweetnacl/LICENSE delete mode 100644 node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md delete mode 100644 node_modules/tweetnacl/README.md delete mode 100644 node_modules/tweetnacl/nacl-fast.js delete mode 100644 node_modules/tweetnacl/nacl-fast.min.js delete mode 100644 node_modules/tweetnacl/nacl.d.ts delete mode 100644 node_modules/tweetnacl/nacl.js delete mode 100644 node_modules/tweetnacl/nacl.min.js delete mode 100644 node_modules/tweetnacl/package.json delete mode 100644 node_modules/type-is/HISTORY.md delete mode 100644 node_modules/type-is/LICENSE delete mode 100644 node_modules/type-is/README.md delete mode 100644 node_modules/type-is/index.js delete mode 100644 node_modules/type-is/package.json delete mode 100644 node_modules/uglify-js/LICENSE delete mode 100644 node_modules/uglify-js/README.md delete mode 100755 node_modules/uglify-js/bin/uglifyjs delete mode 100644 node_modules/uglify-js/lib/ast.js delete mode 100644 node_modules/uglify-js/lib/compress.js delete mode 100644 node_modules/uglify-js/lib/minify.js delete mode 100644 node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 node_modules/uglify-js/lib/output.js delete mode 100644 node_modules/uglify-js/lib/parse.js delete mode 100644 node_modules/uglify-js/lib/propmangle.js delete mode 100644 node_modules/uglify-js/lib/scope.js delete mode 100644 node_modules/uglify-js/lib/sourcemap.js delete mode 100644 node_modules/uglify-js/lib/transform.js delete mode 100644 node_modules/uglify-js/lib/utils.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/CHANGELOG.md delete mode 100644 node_modules/uglify-js/node_modules/source-map/LICENSE delete mode 100644 node_modules/uglify-js/node_modules/source-map/README.md delete mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.debug.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js.map delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/array-set.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/base64.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/binary-search.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/source-node.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/lib/util.js delete mode 100644 node_modules/uglify-js/node_modules/source-map/package.json delete mode 100644 node_modules/uglify-js/node_modules/source-map/source-map.d.ts delete mode 100644 node_modules/uglify-js/node_modules/source-map/source-map.js delete mode 100644 node_modules/uglify-js/package.json delete mode 100644 node_modules/uglify-js/tools/domprops.json delete mode 100644 node_modules/uglify-js/tools/exports.js delete mode 100644 node_modules/uglify-js/tools/node.js delete mode 100644 node_modules/uglify-js/tools/props.html delete mode 100644 node_modules/undefsafe/.github/workflows/release.yml delete mode 100644 node_modules/undefsafe/.jscsrc delete mode 100644 node_modules/undefsafe/.jshintrc delete mode 100644 node_modules/undefsafe/.travis.yml delete mode 100644 node_modules/undefsafe/LICENSE delete mode 100644 node_modules/undefsafe/README.md delete mode 100644 node_modules/undefsafe/example.js delete mode 100644 node_modules/undefsafe/lib/undefsafe.js delete mode 100644 node_modules/undefsafe/package.json delete mode 100644 node_modules/unpipe/HISTORY.md delete mode 100644 node_modules/unpipe/LICENSE delete mode 100644 node_modules/unpipe/README.md delete mode 100644 node_modules/unpipe/index.js delete mode 100644 node_modules/unpipe/package.json delete mode 100644 node_modules/upper-case/LICENSE delete mode 100644 node_modules/upper-case/README.md delete mode 100644 node_modules/upper-case/package.json delete mode 100644 node_modules/upper-case/upper-case.d.ts delete mode 100644 node_modules/upper-case/upper-case.js delete mode 100755 node_modules/uri-js/LICENSE delete mode 100755 node_modules/uri-js/README.md delete mode 100755 node_modules/uri-js/dist/es5/uri.all.d.ts delete mode 100755 node_modules/uri-js/dist/es5/uri.all.js delete mode 100755 node_modules/uri-js/dist/es5/uri.all.js.map delete mode 100755 node_modules/uri-js/dist/es5/uri.all.min.d.ts delete mode 100755 node_modules/uri-js/dist/es5/uri.all.min.js delete mode 100755 node_modules/uri-js/dist/es5/uri.all.min.js.map delete mode 100755 node_modules/uri-js/dist/esnext/index.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/index.js delete mode 100755 node_modules/uri-js/dist/esnext/index.js.map delete mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.js delete mode 100755 node_modules/uri-js/dist/esnext/regexps-iri.js.map delete mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.js delete mode 100755 node_modules/uri-js/dist/esnext/regexps-uri.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/http.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/http.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/http.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/https.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/https.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/https.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/mailto.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/urn.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/ws.js.map delete mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.js delete mode 100755 node_modules/uri-js/dist/esnext/schemes/wss.js.map delete mode 100755 node_modules/uri-js/dist/esnext/uri.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/uri.js delete mode 100755 node_modules/uri-js/dist/esnext/uri.js.map delete mode 100755 node_modules/uri-js/dist/esnext/util.d.ts delete mode 100755 node_modules/uri-js/dist/esnext/util.js delete mode 100755 node_modules/uri-js/dist/esnext/util.js.map delete mode 100755 node_modules/uri-js/package.json delete mode 100755 node_modules/uri-js/yarn.lock delete mode 100644 node_modules/utils-merge/.npmignore delete mode 100644 node_modules/utils-merge/LICENSE delete mode 100644 node_modules/utils-merge/README.md delete mode 100644 node_modules/utils-merge/index.js delete mode 100644 node_modules/utils-merge/package.json delete mode 100644 node_modules/uuid/AUTHORS delete mode 100644 node_modules/uuid/CHANGELOG.md delete mode 100644 node_modules/uuid/LICENSE.md delete mode 100644 node_modules/uuid/README.md delete mode 100755 node_modules/uuid/bin/uuid delete mode 100644 node_modules/uuid/index.js delete mode 100644 node_modules/uuid/lib/bytesToUuid.js delete mode 100644 node_modules/uuid/lib/md5-browser.js delete mode 100644 node_modules/uuid/lib/md5.js delete mode 100644 node_modules/uuid/lib/rng-browser.js delete mode 100644 node_modules/uuid/lib/rng.js delete mode 100644 node_modules/uuid/lib/sha1-browser.js delete mode 100644 node_modules/uuid/lib/sha1.js delete mode 100644 node_modules/uuid/lib/v35.js delete mode 100644 node_modules/uuid/package.json delete mode 100644 node_modules/uuid/v1.js delete mode 100644 node_modules/uuid/v3.js delete mode 100644 node_modules/uuid/v4.js delete mode 100644 node_modules/uuid/v5.js delete mode 100644 node_modules/vary/HISTORY.md delete mode 100644 node_modules/vary/LICENSE delete mode 100644 node_modules/vary/README.md delete mode 100644 node_modules/vary/index.js delete mode 100644 node_modules/vary/package.json delete mode 100644 node_modules/verror/.npmignore delete mode 100644 node_modules/verror/CHANGES.md delete mode 100644 node_modules/verror/CONTRIBUTING.md delete mode 100644 node_modules/verror/LICENSE delete mode 100644 node_modules/verror/README.md delete mode 100644 node_modules/verror/lib/verror.js delete mode 100644 node_modules/verror/package.json delete mode 100644 node_modules/xml-char-classes/index.js delete mode 100644 node_modules/xml-char-classes/package.json delete mode 100644 node_modules/xml-char-classes/readme.md diff --git a/node_modules/.bin/ejs b/node_modules/.bin/ejs deleted file mode 120000 index 88e80d01..00000000 --- a/node_modules/.bin/ejs +++ /dev/null @@ -1 +0,0 @@ -../ejs/bin/cli.js \ No newline at end of file diff --git a/node_modules/.bin/he b/node_modules/.bin/he deleted file mode 120000 index 2a8eb5e0..00000000 --- a/node_modules/.bin/he +++ /dev/null @@ -1 +0,0 @@ -../he/bin/he \ No newline at end of file diff --git a/node_modules/.bin/html-minifier b/node_modules/.bin/html-minifier deleted file mode 120000 index fdff5987..00000000 --- a/node_modules/.bin/html-minifier +++ /dev/null @@ -1 +0,0 @@ -../html-minifier/cli.js \ No newline at end of file diff --git a/node_modules/.bin/jake b/node_modules/.bin/jake deleted file mode 120000 index 36267456..00000000 --- a/node_modules/.bin/jake +++ /dev/null @@ -1 +0,0 @@ -../jake/bin/cli.js \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime deleted file mode 120000 index fbb7ee0e..00000000 --- a/node_modules/.bin/mime +++ /dev/null @@ -1 +0,0 @@ -../mime/cli.js \ No newline at end of file diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon deleted file mode 120000 index 1056ddc1..00000000 --- a/node_modules/.bin/nodemon +++ /dev/null @@ -1 +0,0 @@ -../nodemon/bin/nodemon.js \ No newline at end of file diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch deleted file mode 120000 index 3409fdb7..00000000 --- a/node_modules/.bin/nodetouch +++ /dev/null @@ -1 +0,0 @@ -../touch/bin/nodetouch.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt deleted file mode 120000 index 6b6566ea..00000000 --- a/node_modules/.bin/nopt +++ /dev/null @@ -1 +0,0 @@ -../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver deleted file mode 120000 index 317eb293..00000000 --- a/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/node_modules/.bin/sshpk-conv b/node_modules/.bin/sshpk-conv deleted file mode 120000 index a2a295c8..00000000 --- a/node_modules/.bin/sshpk-conv +++ /dev/null @@ -1 +0,0 @@ -../sshpk/bin/sshpk-conv \ No newline at end of file diff --git a/node_modules/.bin/sshpk-sign b/node_modules/.bin/sshpk-sign deleted file mode 120000 index 766b9b3a..00000000 --- a/node_modules/.bin/sshpk-sign +++ /dev/null @@ -1 +0,0 @@ -../sshpk/bin/sshpk-sign \ No newline at end of file diff --git a/node_modules/.bin/sshpk-verify b/node_modules/.bin/sshpk-verify deleted file mode 120000 index bfd7e3ad..00000000 --- a/node_modules/.bin/sshpk-verify +++ /dev/null @@ -1 +0,0 @@ -../sshpk/bin/sshpk-verify \ No newline at end of file diff --git a/node_modules/.bin/uglifyjs b/node_modules/.bin/uglifyjs deleted file mode 120000 index fef3468b..00000000 --- a/node_modules/.bin/uglifyjs +++ /dev/null @@ -1 +0,0 @@ -../uglify-js/bin/uglifyjs \ No newline at end of file diff --git a/node_modules/.bin/uuid b/node_modules/.bin/uuid deleted file mode 120000 index b3e45bc5..00000000 --- a/node_modules/.bin/uuid +++ /dev/null @@ -1 +0,0 @@ -../uuid/bin/uuid \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json deleted file mode 100644 index 09de45d5..00000000 --- a/node_modules/.package-lock.json +++ /dev/null @@ -1,1608 +0,0 @@ -{ - "name": "dicho-hackaton", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", - "dependencies": { - "source-map": "0.5.x" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-minify-html": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", - "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", - "dependencies": { - "html-minifier": "3.5.7", - "lodash.merge": "4.6.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-minifier": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", - "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.12.x", - "he": "1.1.x", - "ncname": "1.0.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.2.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", - "dependencies": { - "xml-char-classes": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uglify-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", - "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", - "dependencies": { - "commander": "~2.12.1", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", - "engines": { - "node": ">=0.10.0" - } - } - } -} diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE deleted file mode 100644 index 9bcfa9d7..00000000 --- a/node_modules/abbrev/LICENSE +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index 99746fe6..00000000 --- a/node_modules/abbrev/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# 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 deleted file mode 100644 index 7b1dc5d6..00000000 --- a/node_modules/abbrev/abbrev.js +++ /dev/null @@ -1,61 +0,0 @@ -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 deleted file mode 100644 index bf4e8015..00000000 --- a/node_modules/abbrev/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "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/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md deleted file mode 100644 index cb5990c7..00000000 --- a/node_modules/accepts/HISTORY.md +++ /dev/null @@ -1,243 +0,0 @@ -1.3.8 / 2022-02-02 -================== - - * deps: mime-types@~2.1.34 - - deps: mime-db@~1.51.0 - * deps: negotiator@0.6.3 - -1.3.7 / 2019-04-29 -================== - - * deps: negotiator@0.6.2 - - Fix sorting charset, encoding, and language with extra parameters - -1.3.6 / 2019-04-28 -================== - - * deps: mime-types@~2.1.24 - - deps: mime-db@~1.40.0 - -1.3.5 / 2018-02-28 -================== - - * deps: mime-types@~2.1.18 - - deps: mime-db@~1.33.0 - -1.3.4 / 2017-08-22 -================== - - * deps: mime-types@~2.1.16 - - deps: mime-db@~1.29.0 - -1.3.3 / 2016-05-02 -================== - - * deps: mime-types@~2.1.11 - - deps: mime-db@~1.23.0 - * deps: negotiator@0.6.1 - - perf: improve `Accept` parsing speed - - perf: improve `Accept-Charset` parsing speed - - perf: improve `Accept-Encoding` parsing speed - - perf: improve `Accept-Language` parsing speed - -1.3.2 / 2016-03-08 -================== - - * deps: mime-types@~2.1.10 - - Fix extension of `application/dash+xml` - - Update primary extension for `audio/mp4` - - deps: mime-db@~1.22.0 - -1.3.1 / 2016-01-19 -================== - - * deps: mime-types@~2.1.9 - - deps: mime-db@~1.21.0 - -1.3.0 / 2015-09-29 -================== - - * deps: mime-types@~2.1.7 - - deps: mime-db@~1.19.0 - * deps: negotiator@0.6.0 - - Fix including type extensions in parameters in `Accept` parsing - - Fix parsing `Accept` parameters with quoted equals - - Fix parsing `Accept` parameters with quoted semicolons - - Lazy-load modules from main entry point - - perf: delay type concatenation until needed - - perf: enable strict mode - - perf: hoist regular expressions - - perf: remove closures getting spec properties - - perf: remove a closure from media type parsing - - perf: remove property delete from media type parsing - -1.2.13 / 2015-09-06 -=================== - - * deps: mime-types@~2.1.6 - - deps: mime-db@~1.18.0 - -1.2.12 / 2015-07-30 -=================== - - * deps: mime-types@~2.1.4 - - deps: mime-db@~1.16.0 - -1.2.11 / 2015-07-16 -=================== - - * deps: mime-types@~2.1.3 - - deps: mime-db@~1.15.0 - -1.2.10 / 2015-07-01 -=================== - - * deps: mime-types@~2.1.2 - - deps: mime-db@~1.14.0 - -1.2.9 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - perf: fix deopt during mapping - -1.2.8 / 2015-06-07 -================== - - * deps: mime-types@~2.1.0 - - deps: mime-db@~1.13.0 - * perf: avoid argument reassignment & argument slice - * perf: avoid negotiator recursive construction - * perf: enable strict mode - * perf: remove unnecessary bitwise operator - -1.2.7 / 2015-05-10 -================== - - * deps: negotiator@0.5.3 - - Fix media type parameter matching to be case-insensitive - -1.2.6 / 2015-05-07 -================== - - * deps: mime-types@~2.0.11 - - deps: mime-db@~1.9.1 - * deps: negotiator@0.5.2 - - Fix comparing media types with quoted values - - Fix splitting media types with quoted commas - -1.2.5 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - deps: mime-db@~1.8.0 - -1.2.4 / 2015-02-14 -================== - - * Support Node.js 0.6 - * deps: mime-types@~2.0.9 - - deps: mime-db@~1.7.0 - * deps: negotiator@0.5.1 - - Fix preference sorting to be stable for long acceptable lists - -1.2.3 / 2015-01-31 -================== - - * deps: mime-types@~2.0.8 - - deps: mime-db@~1.6.0 - -1.2.2 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - deps: mime-db@~1.5.0 - -1.2.1 / 2014-12-30 -================== - - * deps: mime-types@~2.0.5 - - deps: mime-db@~1.3.1 - -1.2.0 / 2014-12-19 -================== - - * deps: negotiator@0.5.0 - - Fix list return order when large accepted list - - Fix missing identity encoding when q=0 exists - - Remove dynamic building of Negotiator class - -1.1.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - deps: mime-db@~1.3.0 - -1.1.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - deps: mime-db@~1.2.0 - -1.1.2 / 2014-10-14 -================== - - * deps: negotiator@0.4.9 - - Fix error when media type has invalid parameter - -1.1.1 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - deps: mime-db@~1.1.0 - * deps: negotiator@0.4.8 - - Fix all negotiations to be case-insensitive - - Stable sort preferences of same quality according to client order - -1.1.0 / 2014-09-02 -================== - - * update `mime-types` - -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE deleted file mode 100644 index 06166077..00000000 --- a/node_modules/accepts/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/accepts/README.md b/node_modules/accepts/README.md deleted file mode 100644 index 82680c53..00000000 --- a/node_modules/accepts/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# accepts - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][github-actions-ci-image]][github-actions-ci-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). -Extracted from [koa](https://www.npmjs.com/package/koa) for general use. - -In addition to negotiator, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` - as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install accepts -``` - -## API - -```js -var accepts = require('accepts') -``` - -### accepts(req) - -Create a new `Accepts` object for the given `req`. - -#### .charset(charsets) - -Return the first accepted charset. If nothing in `charsets` is accepted, -then `false` is returned. - -#### .charsets() - -Return the charsets that the request accepts, in the order of the client's -preference (most preferred first). - -#### .encoding(encodings) - -Return the first accepted encoding. If nothing in `encodings` is accepted, -then `false` is returned. - -#### .encodings() - -Return the encodings that the request accepts, in the order of the client's -preference (most preferred first). - -#### .language(languages) - -Return the first accepted language. If nothing in `languages` is accepted, -then `false` is returned. - -#### .languages() - -Return the languages that the request accepts, in the order of the client's -preference (most preferred first). - -#### .type(types) - -Return the first accepted type (and it is returned as the same text as what -appears in the `types` array). If nothing in `types` is accepted, then `false` -is returned. - -The `types` array can contain full MIME types or file extensions. Any value -that is not a full MIME types is passed to `require('mime-types').lookup`. - -#### .types() - -Return the types that the request accepts, in the order of the client's -preference (most preferred first). - -## Examples - -### Simple type negotiation - -This simple example shows how to use `accepts` to return a different typed -respond body based on what the client wants to accept. The server lists it's -preferences in order and will get back the best match between the client and -server. - -```js -var accepts = require('accepts') -var http = require('http') - -function app (req, res) { - var accept = accepts(req) - - // the order of this list is significant; should be server preferred order - switch (accept.type(['json', 'html'])) { - case 'json': - res.setHeader('Content-Type', 'application/json') - res.write('{"hello":"world!"}') - break - case 'html': - res.setHeader('Content-Type', 'text/html') - res.write('hello, world!') - break - default: - // the fallback is text/plain, so no need to specify it above - res.setHeader('Content-Type', 'text/plain') - res.write('hello, world!') - break - } - - res.end() -} - -http.createServer(app).listen(3000) -``` - -You can test this out with the cURL program: -```sh -curl -I -H'Accept: text/html' http://localhost:3000/ -``` - -## License - -[MIT](LICENSE) - -[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master -[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master -[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci -[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml -[node-version-image]: https://badgen.net/npm/node/accepts -[node-version-url]: https://nodejs.org/en/download -[npm-downloads-image]: https://badgen.net/npm/dm/accepts -[npm-url]: https://npmjs.org/package/accepts -[npm-version-image]: https://badgen.net/npm/v/accepts diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js deleted file mode 100644 index e9b2f63f..00000000 --- a/node_modules/accepts/index.js +++ /dev/null @@ -1,238 +0,0 @@ -/*! - * accepts - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var Negotiator = require('negotiator') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = Accepts - -/** - * Create a new Accepts object for the given req. - * - * @param {object} req - * @public - */ - -function Accepts (req) { - if (!(this instanceof Accepts)) { - return new Accepts(req) - } - - this.headers = req.headers - this.negotiator = new Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} types... - * @return {String|Array|Boolean} - * @public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types_) { - var types = types_ - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i] - } - } - - // no types, return all requested types - if (!types || types.length === 0) { - return this.negotiator.mediaTypes() - } - - // no accept header, return first given type - if (!this.headers.accept) { - return types[0] - } - - var mimes = types.map(extToMime) - var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) - var first = accepts[0] - - return first - ? types[mimes.indexOf(first)] - : false -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encodings... - * @return {String|Array} - * @public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings_) { - var encodings = encodings_ - - // support flattened arguments - if (encodings && !Array.isArray(encodings)) { - encodings = new Array(arguments.length) - for (var i = 0; i < encodings.length; i++) { - encodings[i] = arguments[i] - } - } - - // no encodings, return all requested encodings - if (!encodings || encodings.length === 0) { - return this.negotiator.encodings() - } - - return this.negotiator.encodings(encodings)[0] || false -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charsets... - * @return {String|Array} - * @public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets_) { - var charsets = charsets_ - - // support flattened arguments - if (charsets && !Array.isArray(charsets)) { - charsets = new Array(arguments.length) - for (var i = 0; i < charsets.length; i++) { - charsets[i] = arguments[i] - } - } - - // no charsets, return all requested charsets - if (!charsets || charsets.length === 0) { - return this.negotiator.charsets() - } - - return this.negotiator.charsets(charsets)[0] || false -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} langs... - * @return {Array|String} - * @public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (languages_) { - var languages = languages_ - - // support flattened arguments - if (languages && !Array.isArray(languages)) { - languages = new Array(arguments.length) - for (var i = 0; i < languages.length; i++) { - languages[i] = arguments[i] - } - } - - // no languages, return all requested languages - if (!languages || languages.length === 0) { - return this.negotiator.languages() - } - - return this.negotiator.languages(languages)[0] || false -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @private - */ - -function extToMime (type) { - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @private - */ - -function validMime (type) { - return typeof type === 'string' -} diff --git a/node_modules/accepts/package.json b/node_modules/accepts/package.json deleted file mode 100644 index 0f2d15da..00000000 --- a/node_modules/accepts/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.3.8", - "contributors": [ - "Douglas Christopher Wilson ", - "Jonathan Ong (http://jongleberry.com)" - ], - "license": "MIT", - "repository": "jshttp/accepts", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "devDependencies": { - "deep-equal": "1.0.1", - "eslint": "7.32.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.4", - "eslint-plugin-markdown": "2.2.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "4.3.1", - "eslint-plugin-standard": "4.1.0", - "mocha": "9.2.0", - "nyc": "15.1.0" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - }, - "keywords": [ - "content", - "negotiation", - "accept", - "accepts" - ] -} diff --git a/node_modules/ajv/.tonic_example.js b/node_modules/ajv/.tonic_example.js deleted file mode 100644 index aa11812d..00000000 --- a/node_modules/ajv/.tonic_example.js +++ /dev/null @@ -1,20 +0,0 @@ -var Ajv = require('ajv'); -var ajv = new Ajv({allErrors: true}); - -var schema = { - "properties": { - "foo": { "type": "string" }, - "bar": { "type": "number", "maximum": 3 } - } -}; - -var validate = ajv.compile(schema); - -test({"foo": "abc", "bar": 2}); -test({"foo": 2, "bar": 4}); - -function test(data) { - var valid = validate(data); - if (valid) console.log('Valid!'); - else console.log('Invalid: ' + ajv.errorsText(validate.errors)); -} \ No newline at end of file diff --git a/node_modules/ajv/LICENSE b/node_modules/ajv/LICENSE deleted file mode 100644 index 96ee7199..00000000 --- a/node_modules/ajv/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2017 Evgeny Poberezkin - -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/ajv/README.md b/node_modules/ajv/README.md deleted file mode 100644 index 5aa2078d..00000000 --- a/node_modules/ajv/README.md +++ /dev/null @@ -1,1497 +0,0 @@ -Ajv logo - -# Ajv: Another JSON Schema Validator - -The fastest JSON Schema validator for Node.js and browser. Supports draft-04/06/07. - -[![Build Status](https://travis-ci.org/ajv-validator/ajv.svg?branch=master)](https://travis-ci.org/ajv-validator/ajv) -[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv) -[![npm (beta)](https://img.shields.io/npm/v/ajv/beta)](https://www.npmjs.com/package/ajv/v/7.0.0-beta.0) -[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv) -[![Coverage Status](https://coveralls.io/repos/github/ajv-validator/ajv/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv?branch=master) -[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv) -[![GitHub Sponsors](https://img.shields.io/badge/$-sponsors-brightgreen)](https://github.com/sponsors/epoberezkin) - - -## Ajv v7 beta is released - -[Ajv version 7.0.0-beta.0](https://github.com/ajv-validator/ajv/tree/v7-beta) is released with these changes: - -- to reduce the mistakes in JSON schemas and unexpected validation results, [strict mode](./docs/strict-mode.md) is added - it prohibits ignored or ambiguous JSON Schema elements. -- to make code injection from untrusted schemas impossible, [code generation](./docs/codegen.md) is fully re-written to be safe. -- to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas. -- schemas are compiled to ES6 code (ES5 code generation is supported with an option). -- to improve reliability and maintainability the code is migrated to TypeScript. - -**Please note**: - -- the support for JSON-Schema draft-04 is removed - if you have schemas using "id" attributes you have to replace them with "\$id" (or continue using version 6 that will be supported until 02/28/2021). -- all formats are separated to ajv-formats package - they have to be explicitely added if you use them. - -See [release notes](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) for the details. - -To install the new version: - -```bash -npm install ajv@beta -``` - -See [Getting started with v7](https://github.com/ajv-validator/ajv/tree/v7-beta#usage) for code example. - - -## Mozilla MOSS grant and OpenJS Foundation - -[](https://www.mozilla.org/en-US/moss/)     [](https://openjsf.org/blog/2020/08/14/ajv-joins-openjs-foundation-as-an-incubation-project/) - -Ajv has been awarded a grant from Mozilla’s [Open Source Support (MOSS) program](https://www.mozilla.org/en-US/moss/) in the “Foundational Technology” track! It will sponsor the development of Ajv support of [JSON Schema version 2019-09](https://tools.ietf.org/html/draft-handrews-json-schema-02) and of [JSON Type Definition](https://tools.ietf.org/html/draft-ucarion-json-type-definition-04). - -Ajv also joined [OpenJS Foundation](https://openjsf.org/) – having this support will help ensure the longevity and stability of Ajv for all its users. - -This [blog post](https://www.poberezkin.com/posts/2020-08-14-ajv-json-validator-mozilla-open-source-grant-openjs-foundation.html) has more details. - -I am looking for the long term maintainers of Ajv – working with [ReadySet](https://www.thereadyset.co/), also sponsored by Mozilla, to establish clear guidelines for the role of a "maintainer" and the contribution standards, and to encourage a wider, more inclusive, contribution from the community. - - -## Please [sponsor Ajv development](https://github.com/sponsors/epoberezkin) - -Since I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant! - -Your continuing support is very important - the funds will be used to develop and maintain Ajv once the next major version is released. - -Please sponsor Ajv via: -- [GitHub sponsors page](https://github.com/sponsors/epoberezkin) (GitHub will match it) -- [Ajv Open Collective️](https://opencollective.com/ajv) - -Thank you. - - -#### Open Collective sponsors - - - - - - - - - - - - - - - -## Using version 6 - -[JSON Schema draft-07](http://json-schema.org/latest/json-schema-validation.html) is published. - -[Ajv version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0) that supports draft-07 is released. It may require either migrating your schemas or updating your code (to continue using draft-04 and v5 schemas, draft-06 schemas will be supported without changes). - -__Please note__: To use Ajv with draft-06 schemas you need to explicitly add the meta-schema to the validator instance: - -```javascript -ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); -``` - -To use Ajv with draft-04 schemas in addition to explicitly adding meta-schema you also need to use option schemaId: - -```javascript -var ajv = new Ajv({schemaId: 'id'}); -// If you want to use both draft-04 and draft-06/07 schemas: -// var ajv = new Ajv({schemaId: 'auto'}); -ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')); -``` - - -## Contents - -- [Performance](#performance) -- [Features](#features) -- [Getting started](#getting-started) -- [Frequently Asked Questions](https://github.com/ajv-validator/ajv/blob/master/FAQ.md) -- [Using in browser](#using-in-browser) - - [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) -- [Command line interface](#command-line-interface) -- Validation - - [Keywords](#validation-keywords) - - [Annotation keywords](#annotation-keywords) - - [Formats](#formats) - - [Combining schemas with $ref](#ref) - - [$data reference](#data-reference) - - NEW: [$merge and $patch keywords](#merge-and-patch-keywords) - - [Defining custom keywords](#defining-custom-keywords) - - [Asynchronous schema compilation](#asynchronous-schema-compilation) - - [Asynchronous validation](#asynchronous-validation) -- [Security considerations](#security-considerations) - - [Security contact](#security-contact) - - [Untrusted schemas](#untrusted-schemas) - - [Circular references in objects](#circular-references-in-javascript-objects) - - [Trusted schemas](#security-risks-of-trusted-schemas) - - [ReDoS attack](#redos-attack) -- Modifying data during validation - - [Filtering data](#filtering-data) - - [Assigning defaults](#assigning-defaults) - - [Coercing data types](#coercing-data-types) -- API - - [Methods](#api) - - [Options](#options) - - [Validation errors](#validation-errors) -- [Plugins](#plugins) -- [Related packages](#related-packages) -- [Some packages using Ajv](#some-packages-using-ajv) -- [Tests, Contributing, Changes history](#tests) -- [Support, Code of conduct, License](#open-source-software-support) - - -## Performance - -Ajv generates code using [doT templates](https://github.com/olado/doT) to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization. - -Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks: - -- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place -- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster -- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html) -- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html) - - -Performance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark): - -[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=32,4,1&chs=600x416&chxl=-1:|djv|ajv|json-schema-validator-generator|jsen|is-my-json-valid|themis|z-schema|jsck|skeemas|json-schema-library|tv4&chd=t:100,98,72.1,66.8,50.1,15.1,6.1,3.8,1.2,0.7,0.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance) - - -## Features - -- Ajv implements full JSON Schema [draft-06/07](http://json-schema.org/) and draft-04 standards: - - all validation keywords (see [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md)) - - full support of remote refs (remote schemas have to be added with `addSchema` or compiled to be available) - - support of circular references between schemas - - correct string lengths for strings with unicode pairs (can be turned off) - - [formats](#formats) defined by JSON Schema draft-07 standard and custom formats (can be turned off) - - [validates schemas against meta-schema](#api-validateschema) -- supports [browsers](#using-in-browser) and Node.js 0.10-14.x -- [asynchronous loading](#asynchronous-schema-compilation) of referenced schemas during compilation -- "All errors" validation mode with [option allErrors](#options) -- [error messages with parameters](#validation-errors) describing error reasons to allow creating custom error messages -- i18n error messages support with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package -- [filtering data](#filtering-data) from additional properties -- [assigning defaults](#assigning-defaults) to missing properties and items -- [coercing data](#coercing-data-types) to the types specified in `type` keywords -- [custom keywords](#defining-custom-keywords) -- draft-06/07 keywords `const`, `contains`, `propertyNames` and `if/then/else` -- draft-06 boolean schemas (`true`/`false` as a schema to always pass/fail). -- keywords `switch`, `patternRequired`, `formatMaximum` / `formatMinimum` and `formatExclusiveMaximum` / `formatExclusiveMinimum` from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) with [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package -- [$data reference](#data-reference) to use values from the validated data as values for the schema keywords -- [asynchronous validation](#asynchronous-validation) of custom formats and keywords - - -## Install - -``` -npm install ajv -``` - - -## Getting started - -Try it in the Node.js REPL: https://tonicdev.com/npm/ajv - - -The fastest validation call: - -```javascript -// Node.js require: -var Ajv = require('ajv'); -// or ESM/TypeScript import -import Ajv from 'ajv'; - -var ajv = new Ajv(); // options can be passed, e.g. {allErrors: true} -var validate = ajv.compile(schema); -var valid = validate(data); -if (!valid) console.log(validate.errors); -``` - -or with less code - -```javascript -// ... -var valid = ajv.validate(schema, data); -if (!valid) console.log(ajv.errors); -// ... -``` - -or - -```javascript -// ... -var valid = ajv.addSchema(schema, 'mySchema') - .validate('mySchema', data); -if (!valid) console.log(ajv.errorsText()); -// ... -``` - -See [API](#api) and [Options](#options) for more details. - -Ajv compiles schemas to functions and caches them in all cases (using schema serialized with [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) or a custom function as a key), so that the next time the same schema is used (not necessarily the same object instance) it won't be compiled again. - -The best performance is achieved when using compiled functions returned by `compile` or `getSchema` methods (there is no additional function call). - -__Please note__: every time a validation function or `ajv.validate` are called `errors` property is overwritten. You need to copy `errors` array reference to another variable if you want to use it later (e.g., in the callback). See [Validation errors](#validation-errors) - -__Note for TypeScript users__: `ajv` provides its own TypeScript declarations -out of the box, so you don't need to install the deprecated `@types/ajv` -module. - - -## Using in browser - -You can require Ajv directly from the code you browserify - in this case Ajv will be a part of your bundle. - -If you need to use Ajv in several bundles you can create a separate UMD bundle using `npm run bundle` script (thanks to [siddo420](https://github.com/siddo420)). - -Then you need to load Ajv in the browser: -```html - -``` - -This bundle can be used with different module systems; it creates global `Ajv` if no module system is found. - -The browser bundle is available on [cdnjs](https://cdnjs.com/libraries/ajv). - -Ajv is tested with these browsers: - -[![Sauce Test Status](https://saucelabs.com/browser-matrix/epoberezkin.svg)](https://saucelabs.com/u/epoberezkin) - -__Please note__: some frameworks, e.g. Dojo, may redefine global require in such way that is not compatible with CommonJS module format. In such case Ajv bundle has to be loaded before the framework and then you can use global Ajv (see issue [#234](https://github.com/ajv-validator/ajv/issues/234)). - - -### Ajv and Content Security Policies (CSP) - -If you're using Ajv to compile a schema (the typical use) in a browser document that is loaded with a Content Security Policy (CSP), that policy will require a `script-src` directive that includes the value `'unsafe-eval'`. -:warning: NOTE, however, that `unsafe-eval` is NOT recommended in a secure CSP[[1]](https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-eval), as it has the potential to open the document to cross-site scripting (XSS) attacks. - -In order to make use of Ajv without easing your CSP, you can [pre-compile a schema using the CLI](https://github.com/ajv-validator/ajv-cli#compile-schemas). This will transpile the schema JSON into a JavaScript file that exports a `validate` function that works simlarly to a schema compiled at runtime. - -Note that pre-compilation of schemas is performed using [ajv-pack](https://github.com/ajv-validator/ajv-pack) and there are [some limitations to the schema features it can compile](https://github.com/ajv-validator/ajv-pack#limitations). A successfully pre-compiled schema is equivalent to the same schema compiled at runtime. - - -## Command line interface - -CLI is available as a separate npm package [ajv-cli](https://github.com/ajv-validator/ajv-cli). It supports: - -- compiling JSON Schemas to test their validity -- BETA: generating standalone module exporting a validation function to be used without Ajv (using [ajv-pack](https://github.com/ajv-validator/ajv-pack)) -- migrate schemas to draft-07 (using [json-schema-migrate](https://github.com/epoberezkin/json-schema-migrate)) -- validating data file(s) against JSON Schema -- testing expected validity of data against JSON Schema -- referenced schemas -- custom meta-schemas -- files in JSON, JSON5, YAML, and JavaScript format -- all Ajv options -- reporting changes in data after validation in [JSON-patch](https://tools.ietf.org/html/rfc6902) format - - -## Validation keywords - -Ajv supports all validation keywords from draft-07 of JSON Schema standard: - -- [type](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#type) -- [for numbers](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-numbers) - maximum, minimum, exclusiveMaximum, exclusiveMinimum, multipleOf -- [for strings](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-strings) - maxLength, minLength, pattern, format -- [for arrays](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-arrays) - maxItems, minItems, uniqueItems, items, additionalItems, [contains](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#contains) -- [for objects](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-objects) - maxProperties, minProperties, required, properties, patternProperties, additionalProperties, dependencies, [propertyNames](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#propertynames) -- [for all types](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-all-types) - enum, [const](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#const) -- [compound keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#compound-keywords) - not, oneOf, anyOf, allOf, [if/then/else](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#ifthenelse) - -With [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package Ajv also supports validation keywords from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) for JSON Schema standard: - -- [patternRequired](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#patternrequired-proposed) - like `required` but with patterns that some property should match. -- [formatMaximum, formatMinimum, formatExclusiveMaximum, formatExclusiveMinimum](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#formatmaximum--formatminimum-and-exclusiveformatmaximum--exclusiveformatminimum-proposed) - setting limits for date, time, etc. - -See [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md) for more details. - - -## Annotation keywords - -JSON Schema specification defines several annotation keywords that describe schema itself but do not perform any validation. - -- `title` and `description`: information about the data represented by that schema -- `$comment` (NEW in draft-07): information for developers. With option `$comment` Ajv logs or passes the comment string to the user-supplied function. See [Options](#options). -- `default`: a default value of the data instance, see [Assigning defaults](#assigning-defaults). -- `examples` (NEW in draft-06): an array of data instances. Ajv does not check the validity of these instances against the schema. -- `readOnly` and `writeOnly` (NEW in draft-07): marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.). -- `contentEncoding`: [RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.1 ), e.g., "base64". -- `contentMediaType`: [RFC 2046](https://tools.ietf.org/html/rfc2046), e.g., "image/png". - -__Please note__: Ajv does not implement validation of the keywords `examples`, `contentEncoding` and `contentMediaType` but it reserves them. If you want to create a plugin that implements some of them, it should remove these keywords from the instance. - - -## Formats - -Ajv implements formats defined by JSON Schema specification and several other formats. It is recommended NOT to use "format" keyword implementations with untrusted data, as they use potentially unsafe regular expressions - see [ReDoS attack](#redos-attack). - -__Please note__: if you need to use "format" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios. - -The following formats are implemented for string validation with "format" keyword: - -- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6). -- _time_: time with optional time-zone. -- _date-time_: date-time from the same source (time-zone is mandatory). `date`, `time` and `date-time` validate ranges in `full` mode and only regexp in `fast` mode (see [options](#options)). -- _uri_: full URI. -- _uri-reference_: URI reference, including full and relative URIs. -- _uri-template_: URI template according to [RFC6570](https://tools.ietf.org/html/rfc6570) -- _url_ (deprecated): [URL record](https://url.spec.whatwg.org/#concept-url). -- _email_: email address. -- _hostname_: host name according to [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5). -- _ipv4_: IP address v4. -- _ipv6_: IP address v6. -- _regex_: tests whether a string is a valid regular expression by passing it to RegExp constructor. -- _uuid_: Universally Unique IDentifier according to [RFC4122](http://tools.ietf.org/html/rfc4122). -- _json-pointer_: JSON-pointer according to [RFC6901](https://tools.ietf.org/html/rfc6901). -- _relative-json-pointer_: relative JSON-pointer according to [this draft](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00). - -__Please note__: JSON Schema draft-07 also defines formats `iri`, `iri-reference`, `idn-hostname` and `idn-email` for URLs, hostnames and emails with international characters. Ajv does not implement these formats. If you create Ajv plugin that implements them please make a PR to mention this plugin here. - -There are two modes of format validation: `fast` and `full`. This mode affects formats `date`, `time`, `date-time`, `uri`, `uri-reference`, and `email`. See [Options](#options) for details. - -You can add additional formats and replace any of the formats above using [addFormat](#api-addformat) method. - -The option `unknownFormats` allows changing the default behaviour when an unknown format is encountered. In this case Ajv can either fail schema compilation (default) or ignore it (default in versions before 5.0.0). You also can allow specific format(s) that will be ignored. See [Options](#options) for details. - -You can find regular expressions used for format validation and the sources that were used in [formats.js](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js). - - -## Combining schemas with $ref - -You can structure your validation logic across multiple schema files and have schemas reference each other using `$ref` keyword. - -Example: - -```javascript -var schema = { - "$id": "http://example.com/schemas/schema.json", - "type": "object", - "properties": { - "foo": { "$ref": "defs.json#/definitions/int" }, - "bar": { "$ref": "defs.json#/definitions/str" } - } -}; - -var defsSchema = { - "$id": "http://example.com/schemas/defs.json", - "definitions": { - "int": { "type": "integer" }, - "str": { "type": "string" } - } -}; -``` - -Now to compile your schema you can either pass all schemas to Ajv instance: - -```javascript -var ajv = new Ajv({schemas: [schema, defsSchema]}); -var validate = ajv.getSchema('http://example.com/schemas/schema.json'); -``` - -or use `addSchema` method: - -```javascript -var ajv = new Ajv; -var validate = ajv.addSchema(defsSchema) - .compile(schema); -``` - -See [Options](#options) and [addSchema](#api) method. - -__Please note__: -- `$ref` is resolved as the uri-reference using schema $id as the base URI (see the example). -- References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.). -- You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs. -- The actual location of the schema file in the file system is not used. -- You can pass the identifier of the schema as the second parameter of `addSchema` method or as a property name in `schemas` option. This identifier can be used instead of (or in addition to) schema $id. -- You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown. -- You can implement dynamic resolution of the referenced schemas using `compileAsync` method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See [Asynchronous schema compilation](#asynchronous-schema-compilation). - - -## $data reference - -With `$data` option you can use values from the validated data as the values for the schema keywords. See [proposal](https://github.com/json-schema-org/json-schema-spec/issues/51) for more information about how it works. - -`$data` reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems. - -The value of "$data" should be a [JSON-pointer](https://tools.ietf.org/html/rfc6901) to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a [relative JSON-pointer](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema). - -Examples. - -This schema requires that the value in property `smaller` is less or equal than the value in the property larger: - -```javascript -var ajv = new Ajv({$data: true}); - -var schema = { - "properties": { - "smaller": { - "type": "number", - "maximum": { "$data": "1/larger" } - }, - "larger": { "type": "number" } - } -}; - -var validData = { - smaller: 5, - larger: 7 -}; - -ajv.validate(schema, validData); // true -``` - -This schema requires that the properties have the same format as their field names: - -```javascript -var schema = { - "additionalProperties": { - "type": "string", - "format": { "$data": "0#" } - } -}; - -var validData = { - 'date-time': '1963-06-19T08:30:06.283185Z', - email: 'joe.bloggs@example.com' -} -``` - -`$data` reference is resolved safely - it won't throw even if some property is undefined. If `$data` resolves to `undefined` the validation succeeds (with the exclusion of `const` keyword). If `$data` resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails. - - -## $merge and $patch keywords - -With the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) you can use the keywords `$merge` and `$patch` that allow extending JSON Schemas with patches using formats [JSON Merge Patch (RFC 7396)](https://tools.ietf.org/html/rfc7396) and [JSON Patch (RFC 6902)](https://tools.ietf.org/html/rfc6902). - -To add keywords `$merge` and `$patch` to Ajv instance use this code: - -```javascript -require('ajv-merge-patch')(ajv); -``` - -Examples. - -Using `$merge`: - -```json -{ - "$merge": { - "source": { - "type": "object", - "properties": { "p": { "type": "string" } }, - "additionalProperties": false - }, - "with": { - "properties": { "q": { "type": "number" } } - } - } -} -``` - -Using `$patch`: - -```json -{ - "$patch": { - "source": { - "type": "object", - "properties": { "p": { "type": "string" } }, - "additionalProperties": false - }, - "with": [ - { "op": "add", "path": "/properties/q", "value": { "type": "number" } } - ] - } -} -``` - -The schemas above are equivalent to this schema: - -```json -{ - "type": "object", - "properties": { - "p": { "type": "string" }, - "q": { "type": "number" } - }, - "additionalProperties": false -} -``` - -The properties `source` and `with` in the keywords `$merge` and `$patch` can use absolute or relative `$ref` to point to other schemas previously added to the Ajv instance or to the fragments of the current schema. - -See the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) for more information. - - -## Defining custom keywords - -The advantages of using custom keywords are: - -- allow creating validation scenarios that cannot be expressed using JSON Schema -- simplify your schemas -- help bringing a bigger part of the validation logic to your schemas -- make your schemas more expressive, less verbose and closer to your application domain -- implement custom data processors that modify your data (`modifying` option MUST be used in keyword definition) and/or create side effects while the data is being validated - -If a keyword is used only for side-effects and its validation result is pre-defined, use option `valid: true/false` in keyword definition to simplify both generated code (no error handling in case of `valid: true`) and your keyword functions (no need to return any validation result). - -The concerns you have to be aware of when extending JSON Schema standard with custom keywords are the portability and understanding of your schemas. You will have to support these custom keywords on other platforms and to properly document these keywords so that everybody can understand them in your schemas. - -You can define custom keywords with [addKeyword](#api-addkeyword) method. Keywords are defined on the `ajv` instance level - new instances will not have previously defined keywords. - -Ajv allows defining keywords with: -- validation function -- compilation function -- macro function -- inline compilation function that should return code (as string) that will be inlined in the currently compiled schema. - -Example. `range` and `exclusiveRange` keywords using compiled schema: - -```javascript -ajv.addKeyword('range', { - type: 'number', - compile: function (sch, parentSchema) { - var min = sch[0]; - var max = sch[1]; - - return parentSchema.exclusiveRange === true - ? function (data) { return data > min && data < max; } - : function (data) { return data >= min && data <= max; } - } -}); - -var schema = { "range": [2, 4], "exclusiveRange": true }; -var validate = ajv.compile(schema); -console.log(validate(2.01)); // true -console.log(validate(3.99)); // true -console.log(validate(2)); // false -console.log(validate(4)); // false -``` - -Several custom keywords (typeof, instanceof, range and propertyNames) are defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package - they can be used for your schemas and as a starting point for your own custom keywords. - -See [Defining custom keywords](https://github.com/ajv-validator/ajv/blob/master/CUSTOM.md) for more details. - - -## Asynchronous schema compilation - -During asynchronous compilation remote references are loaded using supplied function. See `compileAsync` [method](#api-compileAsync) and `loadSchema` [option](#options). - -Example: - -```javascript -var ajv = new Ajv({ loadSchema: loadSchema }); - -ajv.compileAsync(schema).then(function (validate) { - var valid = validate(data); - // ... -}); - -function loadSchema(uri) { - return request.json(uri).then(function (res) { - if (res.statusCode >= 400) - throw new Error('Loading error: ' + res.statusCode); - return res.body; - }); -} -``` - -__Please note__: [Option](#options) `missingRefs` should NOT be set to `"ignore"` or `"fail"` for asynchronous compilation to work. - - -## Asynchronous validation - -Example in Node.js REPL: https://tonicdev.com/esp/ajv-asynchronous-validation - -You can define custom formats and keywords that perform validation asynchronously by accessing database or some other service. You should add `async: true` in the keyword or format definition (see [addFormat](#api-addformat), [addKeyword](#api-addkeyword) and [Defining custom keywords](#defining-custom-keywords)). - -If your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have `"$async": true` keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without `$async` keyword Ajv will throw an exception during schema compilation. - -__Please note__: all asynchronous subschemas that are referenced from the current or other schemas should have `"$async": true` keyword as well, otherwise the schema compilation will fail. - -Validation function for an asynchronous custom format/keyword should return a promise that resolves with `true` or `false` (or rejects with `new Ajv.ValidationError(errors)` if you want to return custom errors from the keyword function). - -Ajv compiles asynchronous schemas to [es7 async functions](http://tc39.github.io/ecmascript-asyncawait/) that can optionally be transpiled with [nodent](https://github.com/MatAtBread/nodent). Async functions are supported in Node.js 7+ and all modern browsers. You can also supply any other transpiler as a function via `processCode` option. See [Options](#options). - -The compiled validation function has `$async: true` property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas. - -Validation result will be a promise that resolves with validated data or rejects with an exception `Ajv.ValidationError` that contains the array of validation errors in `errors` property. - - -Example: - -```javascript -var ajv = new Ajv; -// require('ajv-async')(ajv); - -ajv.addKeyword('idExists', { - async: true, - type: 'number', - validate: checkIdExists -}); - - -function checkIdExists(schema, data) { - return knex(schema.table) - .select('id') - .where('id', data) - .then(function (rows) { - return !!rows.length; // true if record is found - }); -} - -var schema = { - "$async": true, - "properties": { - "userId": { - "type": "integer", - "idExists": { "table": "users" } - }, - "postId": { - "type": "integer", - "idExists": { "table": "posts" } - } - } -}; - -var validate = ajv.compile(schema); - -validate({ userId: 1, postId: 19 }) -.then(function (data) { - console.log('Data is valid', data); // { userId: 1, postId: 19 } -}) -.catch(function (err) { - if (!(err instanceof Ajv.ValidationError)) throw err; - // data is invalid - console.log('Validation errors:', err.errors); -}); -``` - -### Using transpilers with asynchronous validation functions. - -[ajv-async](https://github.com/ajv-validator/ajv-async) uses [nodent](https://github.com/MatAtBread/nodent) to transpile async functions. To use another transpiler you should separately install it (or load its bundle in the browser). - - -#### Using nodent - -```javascript -var ajv = new Ajv; -require('ajv-async')(ajv); -// in the browser if you want to load ajv-async bundle separately you can: -// window.ajvAsync(ajv); -var validate = ajv.compile(schema); // transpiled es7 async function -validate(data).then(successFunc).catch(errorFunc); -``` - - -#### Using other transpilers - -```javascript -var ajv = new Ajv({ processCode: transpileFunc }); -var validate = ajv.compile(schema); // transpiled es7 async function -validate(data).then(successFunc).catch(errorFunc); -``` - -See [Options](#options). - - -## Security considerations - -JSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider. - - -##### Security contact - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues. - - -##### Untrusted schemas - -Ajv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application. - -If your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent: -- compiling schemas can cause stack overflow (if they are too deep) -- compiling schemas can be slow (e.g. [#557](https://github.com/ajv-validator/ajv/issues/557)) -- validating certain data can be slow - -It is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in `pattern` and `patternProperties` keywords. - -Regardless the measures you take, using untrusted schemas increases security risks. - - -##### Circular references in JavaScript objects - -Ajv does not support schemas and validated data that have circular references in objects. See [issue #802](https://github.com/ajv-validator/ajv/issues/802). - -An attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references. - - -##### Security risks of trusted schemas - -Some keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to): - -- `pattern` and `format` for large strings - in some cases using `maxLength` can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see [ReDoS attack](#redos-attack)). -- `patternProperties` for large property names - use `propertyNames` to mitigate, but some regular expressions can have exponential evaluation time as well. -- `uniqueItems` for large non-scalar arrays - use `maxItems` to mitigate - -__Please note__: The suggestions above to prevent slow validation would only work if you do NOT use `allErrors: true` in production code (using it would continue validation after validation errors). - -You can validate your JSON schemas against [this meta-schema](https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-secure.json) to check that these recommendations are followed: - -```javascript -const isSchemaSecure = ajv.compile(require('ajv/lib/refs/json-schema-secure.json')); - -const schema1 = {format: 'email'}; -isSchemaSecure(schema1); // false - -const schema2 = {format: 'email', maxLength: MAX_LENGTH}; -isSchemaSecure(schema2); // true -``` - -__Please note__: following all these recommendation is not a guarantee that validation of untrusted data is safe - it can still lead to some undesirable results. - - -##### Content Security Policies (CSP) -See [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) - - -## ReDoS attack - -Certain regular expressions can lead to the exponential evaluation time even with relatively short strings. - -Please assess the regular expressions you use in the schemas on their vulnerability to this attack - see [safe-regex](https://github.com/substack/safe-regex), for example. - -__Please note__: some formats that Ajv implements use [regular expressions](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js) that can be vulnerable to ReDoS attack, so if you use Ajv to validate data from untrusted sources __it is strongly recommended__ to consider the following: - -- making assessment of "format" implementations in Ajv. -- using `format: 'fast'` option that simplifies some of the regular expressions (although it does not guarantee that they are safe). -- replacing format implementations provided by Ajv with your own implementations of "format" keyword that either uses different regular expressions or another approach to format validation. Please see [addFormat](#api-addformat) method. -- disabling format validation by ignoring "format" keyword with option `format: false` - -Whatever mitigation you choose, please assume all formats provided by Ajv as potentially unsafe and make your own assessment of their suitability for your validation scenarios. - - -## Filtering data - -With [option `removeAdditional`](#options) (added by [andyscott](https://github.com/andyscott)) you can filter data during the validation. - -This option modifies original data. - -Example: - -```javascript -var ajv = new Ajv({ removeAdditional: true }); -var schema = { - "additionalProperties": false, - "properties": { - "foo": { "type": "number" }, - "bar": { - "additionalProperties": { "type": "number" }, - "properties": { - "baz": { "type": "string" } - } - } - } -} - -var data = { - "foo": 0, - "additional1": 1, // will be removed; `additionalProperties` == false - "bar": { - "baz": "abc", - "additional2": 2 // will NOT be removed; `additionalProperties` != false - }, -} - -var validate = ajv.compile(schema); - -console.log(validate(data)); // true -console.log(data); // { "foo": 0, "bar": { "baz": "abc", "additional2": 2 } -``` - -If `removeAdditional` option in the example above were `"all"` then both `additional1` and `additional2` properties would have been removed. - -If the option were `"failing"` then property `additional1` would have been removed regardless of its value and property `additional2` would have been removed only if its value were failing the schema in the inner `additionalProperties` (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed). - -__Please note__: If you use `removeAdditional` option with `additionalProperties` keyword inside `anyOf`/`oneOf` keywords your validation can fail with this schema, for example: - -```json -{ - "type": "object", - "oneOf": [ - { - "properties": { - "foo": { "type": "string" } - }, - "required": [ "foo" ], - "additionalProperties": false - }, - { - "properties": { - "bar": { "type": "integer" } - }, - "required": [ "bar" ], - "additionalProperties": false - } - ] -} -``` - -The intention of the schema above is to allow objects with either the string property "foo" or the integer property "bar", but not with both and not with any other properties. - -With the option `removeAdditional: true` the validation will pass for the object `{ "foo": "abc"}` but will fail for the object `{"bar": 1}`. It happens because while the first subschema in `oneOf` is validated, the property `bar` is removed because it is an additional property according to the standard (because it is not included in `properties` keyword in the same schema). - -While this behaviour is unexpected (issues [#129](https://github.com/ajv-validator/ajv/issues/129), [#134](https://github.com/ajv-validator/ajv/issues/134)), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way: - -```json -{ - "type": "object", - "properties": { - "foo": { "type": "string" }, - "bar": { "type": "integer" } - }, - "additionalProperties": false, - "oneOf": [ - { "required": [ "foo" ] }, - { "required": [ "bar" ] } - ] -} -``` - -The schema above is also more efficient - it will compile into a faster function. - - -## Assigning defaults - -With [option `useDefaults`](#options) Ajv will assign values from `default` keyword in the schemas of `properties` and `items` (when it is the array of schemas) to the missing properties and items. - -With the option value `"empty"` properties and items equal to `null` or `""` (empty string) will be considered missing and assigned defaults. - -This option modifies original data. - -__Please note__: the default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema. - - -Example 1 (`default` in `properties`): - -```javascript -var ajv = new Ajv({ useDefaults: true }); -var schema = { - "type": "object", - "properties": { - "foo": { "type": "number" }, - "bar": { "type": "string", "default": "baz" } - }, - "required": [ "foo", "bar" ] -}; - -var data = { "foo": 1 }; - -var validate = ajv.compile(schema); - -console.log(validate(data)); // true -console.log(data); // { "foo": 1, "bar": "baz" } -``` - -Example 2 (`default` in `items`): - -```javascript -var schema = { - "type": "array", - "items": [ - { "type": "number" }, - { "type": "string", "default": "foo" } - ] -} - -var data = [ 1 ]; - -var validate = ajv.compile(schema); - -console.log(validate(data)); // true -console.log(data); // [ 1, "foo" ] -``` - -`default` keywords in other cases are ignored: - -- not in `properties` or `items` subschemas -- in schemas inside `anyOf`, `oneOf` and `not` (see [#42](https://github.com/ajv-validator/ajv/issues/42)) -- in `if` subschema of `switch` keyword -- in schemas generated by custom macro keywords - -The [`strictDefaults` option](#options) customizes Ajv's behavior for the defaults that Ajv ignores (`true` raises an error, and `"log"` outputs a warning). - - -## Coercing data types - -When you are validating user inputs all your data properties are usually strings. The option `coerceTypes` allows you to have your data types coerced to the types specified in your schema `type` keywords, both to pass the validation and to use the correctly typed data afterwards. - -This option modifies original data. - -__Please note__: if you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value. - - -Example 1: - -```javascript -var ajv = new Ajv({ coerceTypes: true }); -var schema = { - "type": "object", - "properties": { - "foo": { "type": "number" }, - "bar": { "type": "boolean" } - }, - "required": [ "foo", "bar" ] -}; - -var data = { "foo": "1", "bar": "false" }; - -var validate = ajv.compile(schema); - -console.log(validate(data)); // true -console.log(data); // { "foo": 1, "bar": false } -``` - -Example 2 (array coercions): - -```javascript -var ajv = new Ajv({ coerceTypes: 'array' }); -var schema = { - "properties": { - "foo": { "type": "array", "items": { "type": "number" } }, - "bar": { "type": "boolean" } - } -}; - -var data = { "foo": "1", "bar": ["false"] }; - -var validate = ajv.compile(schema); - -console.log(validate(data)); // true -console.log(data); // { "foo": [1], "bar": false } -``` - -The coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of "anyOf" and other compound keywords). - -See [Coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md) for details. - - -## API - -##### new Ajv(Object options) -> Object - -Create Ajv instance. - - -##### .compile(Object schema) -> Function<Object data> - -Generate validating function and cache the compiled schema for future use. - -Validating function returns a boolean value. This function has properties `errors` and `schema`. Errors encountered during the last validation are assigned to `errors` property (it is assigned `null` if there was no errors). `schema` property contains the reference to the original schema. - -The schema passed to this method will be validated against meta-schema unless `validateSchema` option is false. If schema is invalid, an error will be thrown. See [options](#options). - - -##### .compileAsync(Object schema [, Boolean meta] [, Function callback]) -> Promise - -Asynchronous version of `compile` method that loads missing remote schemas using asynchronous function in `options.loadSchema`. This function returns a Promise that resolves to a validation function. An optional callback passed to `compileAsync` will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when: - -- missing schema can't be loaded (`loadSchema` returns a Promise that rejects). -- a schema containing a missing reference is loaded, but the reference cannot be resolved. -- schema (or some loaded/referenced schema) is invalid. - -The function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded. - -You can asynchronously compile meta-schema by passing `true` as the second parameter. - -See example in [Asynchronous compilation](#asynchronous-schema-compilation). - - -##### .validate(Object schema|String key|String ref, data) -> Boolean - -Validate data using passed schema (it will be compiled and cached). - -Instead of the schema you can use the key that was previously passed to `addSchema`, the schema id if it was present in the schema or any previously resolved reference. - -Validation errors will be available in the `errors` property of Ajv instance (`null` if there were no errors). - -__Please note__: every time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later. - -If the schema is asynchronous (has `$async` keyword on the top level) this method returns a Promise. See [Asynchronous validation](#asynchronous-validation). - - -##### .addSchema(Array<Object>|Object schema [, String key]) -> Ajv - -Add schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole. - -Array of schemas can be passed (schemas should have ids), the second parameter will be ignored. - -Key can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key. - - -Once the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data. - -Although `addSchema` does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time. - -By default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by `validateSchema` option. - -__Please note__: Ajv uses the [method chaining syntax](https://en.wikipedia.org/wiki/Method_chaining) for all methods with the prefix `add*` and `remove*`. -This allows you to do nice things like the following. - -```javascript -var validate = new Ajv().addSchema(schema).addFormat(name, regex).getSchema(uri); -``` - -##### .addMetaSchema(Array<Object>|Object schema [, String key]) -> Ajv - -Adds meta schema(s) that can be used to validate other schemas. That function should be used instead of `addSchema` because there may be instance options that would compile a meta schema incorrectly (at the moment it is `removeAdditional` option). - -There is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option `meta` is set to `false`. You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See `validateSchema`. - - -##### .validateSchema(Object schema) -> Boolean - -Validates schema. This method should be used to validate schemas rather than `validate` due to the inconsistency of `uri` format in JSON Schema standard. - -By default this method is called automatically when the schema is added, so you rarely need to use it directly. - -If schema doesn't have `$schema` property, it is validated against draft 6 meta-schema (option `meta` should not be false). - -If schema has `$schema` property, then the schema with this id (that should be previously added) is used to validate passed schema. - -Errors will be available at `ajv.errors`. - - -##### .getSchema(String key) -> Function<Object data> - -Retrieve compiled schema previously added with `addSchema` by the key passed to `addSchema` or by its full reference (id). The returned validating function has `schema` property with the reference to the original schema. - - -##### .removeSchema([Object schema|String key|String ref|RegExp pattern]) -> Ajv - -Remove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references. - -Schema can be removed using: -- key passed to `addSchema` -- it's full reference (id) -- RegExp that should match schema id or key (meta-schemas won't be removed) -- actual schema object that will be stable-stringified to remove schema from cache - -If no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared. - - -##### .addFormat(String name, String|RegExp|Function|Object format) -> Ajv - -Add custom format to validate strings or numbers. It can also be used to replace pre-defined formats for Ajv instance. - -Strings are converted to RegExp. - -Function should return validation result as `true` or `false`. - -If object is passed it should have properties `validate`, `compare` and `async`: - -- _validate_: a string, RegExp or a function as described above. -- _compare_: an optional comparison function that accepts two strings and compares them according to the format meaning. This function is used with keywords `formatMaximum`/`formatMinimum` (defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package). It should return `1` if the first value is bigger than the second value, `-1` if it is smaller and `0` if it is equal. -- _async_: an optional `true` value if `validate` is an asynchronous function; in this case it should return a promise that resolves with a value `true` or `false`. -- _type_: an optional type of data that the format applies to. It can be `"string"` (default) or `"number"` (see https://github.com/ajv-validator/ajv/issues/291#issuecomment-259923858). If the type of data is different, the validation will pass. - -Custom formats can be also added via `formats` option. - - -##### .addKeyword(String keyword, Object definition) -> Ajv - -Add custom validation keyword to Ajv instance. - -Keyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance. - -Keyword must start with a letter, `_` or `$`, and may continue with letters, numbers, `_`, `$`, or `-`. -It is recommended to use an application-specific prefix for keywords to avoid current and future name collisions. - -Example Keywords: -- `"xyz-example"`: valid, and uses prefix for the xyz project to avoid name collisions. -- `"example"`: valid, but not recommended as it could collide with future versions of JSON Schema etc. -- `"3-example"`: invalid as numbers are not allowed to be the first character in a keyword - -Keyword definition is an object with the following properties: - -- _type_: optional string or array of strings with data type(s) that the keyword applies to. If not present, the keyword will apply to all types. -- _validate_: validating function -- _compile_: compiling function -- _macro_: macro function -- _inline_: compiling function that returns code (as string) -- _schema_: an optional `false` value used with "validate" keyword to not pass schema -- _metaSchema_: an optional meta-schema for keyword schema -- _dependencies_: an optional list of properties that must be present in the parent schema - it will be checked during schema compilation -- _modifying_: `true` MUST be passed if keyword modifies data -- _statements_: `true` can be passed in case inline keyword generates statements (as opposed to expression) -- _valid_: pass `true`/`false` to pre-define validation result, the result returned from validation function will be ignored. This option cannot be used with macro keywords. -- _$data_: an optional `true` value to support [$data reference](#data-reference) as the value of custom keyword. The reference will be resolved at validation time. If the keyword has meta-schema it would be extended to allow $data and it will be used to validate the resolved value. Supporting $data reference requires that keyword has validating function (as the only option or in addition to compile, macro or inline function). -- _async_: an optional `true` value if the validation function is asynchronous (whether it is compiled or passed in _validate_ property); in this case it should return a promise that resolves with a value `true` or `false`. This option is ignored in case of "macro" and "inline" keywords. -- _errors_: an optional boolean or string `"full"` indicating whether keyword returns errors. If this property is not set Ajv will determine if the errors were set in case of failed validation. - -_compile_, _macro_ and _inline_ are mutually exclusive, only one should be used at a time. _validate_ can be used separately or in addition to them to support $data reference. - -__Please note__: If the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate `type` keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed. - -See [Defining custom keywords](#defining-custom-keywords) for more details. - - -##### .getKeyword(String keyword) -> Object|Boolean - -Returns custom keyword definition, `true` for pre-defined keywords and `false` if the keyword is unknown. - - -##### .removeKeyword(String keyword) -> Ajv - -Removes custom or pre-defined keyword so you can redefine them. - -While this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results. - -__Please note__: schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use `removeSchema` method and compile them again. - - -##### .errorsText([Array<Object> errors [, Object options]]) -> String - -Returns the text with all errors in a String. - -Options can have properties `separator` (string used to separate errors, ", " by default) and `dataVar` (the variable name that dataPaths are prefixed with, "data" by default). - - -## Options - -Defaults: - -```javascript -{ - // validation and reporting options: - $data: false, - allErrors: false, - verbose: false, - $comment: false, // NEW in Ajv version 6.0 - jsonPointers: false, - uniqueItems: true, - unicode: true, - nullable: false, - format: 'fast', - formats: {}, - unknownFormats: true, - schemas: {}, - logger: undefined, - // referenced schema options: - schemaId: '$id', - missingRefs: true, - extendRefs: 'ignore', // recommended 'fail' - loadSchema: undefined, // function(uri: string): Promise {} - // options to modify validated data: - removeAdditional: false, - useDefaults: false, - coerceTypes: false, - // strict mode options - strictDefaults: false, - strictKeywords: false, - strictNumbers: false, - // asynchronous validation options: - transpile: undefined, // requires ajv-async package - // advanced options: - meta: true, - validateSchema: true, - addUsedSchema: true, - inlineRefs: true, - passContext: false, - loopRequired: Infinity, - ownProperties: false, - multipleOfPrecision: false, - errorDataPath: 'object', // deprecated - messages: true, - sourceCode: false, - processCode: undefined, // function (str: string, schema: object): string {} - cache: new Cache, - serialize: undefined -} -``` - -##### Validation and reporting options - -- _$data_: support [$data references](#data-reference). Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See [API](#api). -- _allErrors_: check all rules collecting all errors. Default is to return after the first error. -- _verbose_: include the reference to the part of the schema (`schema` and `parentSchema`) and validated data in errors (false by default). -- _$comment_ (NEW in Ajv version 6.0): log or pass the value of `$comment` keyword to a function. Option values: - - `false` (default): ignore $comment keyword. - - `true`: log the keyword value to console. - - function: pass the keyword value, its schema path and root schema to the specified function -- _jsonPointers_: set `dataPath` property of errors using [JSON Pointers](https://tools.ietf.org/html/rfc6901) instead of JavaScript property access notation. -- _uniqueItems_: validate `uniqueItems` keyword (true by default). -- _unicode_: calculate correct length of strings with unicode pairs (true by default). Pass `false` to use `.length` of strings that is faster, but gives "incorrect" lengths of strings with unicode pairs - each unicode pair is counted as two characters. -- _nullable_: support keyword "nullable" from [Open API 3 specification](https://swagger.io/docs/specification/data-models/data-types/). -- _format_: formats validation mode. Option values: - - `"fast"` (default) - simplified and fast validation (see [Formats](#formats) for details of which formats are available and affected by this option). - - `"full"` - more restrictive and slow validation. E.g., 25:00:00 and 2015/14/33 will be invalid time and date in 'full' mode but it will be valid in 'fast' mode. - - `false` - ignore all format keywords. -- _formats_: an object with custom formats. Keys and values will be passed to `addFormat` method. -- _keywords_: an object with custom keywords. Keys and values will be passed to `addKeyword` method. -- _unknownFormats_: handling of unknown formats. Option values: - - `true` (default) - if an unknown format is encountered the exception is thrown during schema compilation. If `format` keyword value is [$data reference](#data-reference) and it is unknown the validation will fail. - - `[String]` - an array of unknown format names that will be ignored. This option can be used to allow usage of third party schemas with format(s) for which you don't have definitions, but still fail if another unknown format is used. If `format` keyword value is [$data reference](#data-reference) and it is not in this array the validation will fail. - - `"ignore"` - to log warning during schema compilation and always pass validation (the default behaviour in versions before 5.0.0). This option is not recommended, as it allows to mistype format name and it won't be validated without any error message. This behaviour is required by JSON Schema specification. -- _schemas_: an array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method `addSchema(value, key)` will be called for each schema in this object. -- _logger_: sets the logging method. Default is the global `console` object that should have methods `log`, `warn` and `error`. See [Error logging](#error-logging). Option values: - - custom logger - it should have methods `log`, `warn` and `error`. If any of these methods is missing an exception will be thrown. - - `false` - logging is disabled. - - -##### Referenced schema options - -- _schemaId_: this option defines which keywords are used as schema URI. Option value: - - `"$id"` (default) - only use `$id` keyword as schema URI (as specified in JSON Schema draft-06/07), ignore `id` keyword (if it is present a warning will be logged). - - `"id"` - only use `id` keyword as schema URI (as specified in JSON Schema draft-04), ignore `$id` keyword (if it is present a warning will be logged). - - `"auto"` - use both `$id` and `id` keywords as schema URI. If both are present (in the same schema object) and different the exception will be thrown during schema compilation. -- _missingRefs_: handling of missing referenced schemas. Option values: - - `true` (default) - if the reference cannot be resolved during compilation the exception is thrown. The thrown error has properties `missingRef` (with hash fragment) and `missingSchema` (without it). Both properties are resolved relative to the current base id (usually schema id, unless it was substituted). - - `"ignore"` - to log error during compilation and always pass validation. - - `"fail"` - to log error and successfully compile schema but fail validation if this rule is checked. -- _extendRefs_: validation of other keywords when `$ref` is present in the schema. Option values: - - `"ignore"` (default) - when `$ref` is used other keywords are ignored (as per [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3) standard). A warning will be logged during the schema compilation. - - `"fail"` (recommended) - if other validation keywords are used together with `$ref` the exception will be thrown when the schema is compiled. This option is recommended to make sure schema has no keywords that are ignored, which can be confusing. - - `true` - validate all keywords in the schemas with `$ref` (the default behaviour in versions before 5.0.0). -- _loadSchema_: asynchronous function that will be used to load remote schemas when `compileAsync` [method](#api-compileAsync) is used and some reference is missing (option `missingRefs` should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in [Asynchronous compilation](#asynchronous-schema-compilation). - - -##### Options to modify validated data - -- _removeAdditional_: remove additional properties - see example in [Filtering data](#filtering-data). This option is not used if schema is added with `addMetaSchema` method. Option values: - - `false` (default) - not to remove additional properties - - `"all"` - all additional properties are removed, regardless of `additionalProperties` keyword in schema (and no validation is made for them). - - `true` - only additional properties with `additionalProperties` keyword equal to `false` are removed. - - `"failing"` - additional properties that fail schema validation will be removed (where `additionalProperties` keyword is `false` or schema). -- _useDefaults_: replace missing or undefined properties and items with the values from corresponding `default` keywords. Default behaviour is to ignore `default` keywords. This option is not used if schema is added with `addMetaSchema` method. See examples in [Assigning defaults](#assigning-defaults). Option values: - - `false` (default) - do not use defaults - - `true` - insert defaults by value (object literal is used). - - `"empty"` - in addition to missing or undefined, use defaults for properties and items that are equal to `null` or `""` (an empty string). - - `"shared"` (deprecated) - insert defaults by reference. If the default is an object, it will be shared by all instances of validated data. If you modify the inserted default in the validated data, it will be modified in the schema as well. -- _coerceTypes_: change data type of data to match `type` keyword. See the example in [Coercing data types](#coercing-data-types) and [coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md). Option values: - - `false` (default) - no type coercion. - - `true` - coerce scalar data types. - - `"array"` - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema). - - -##### Strict mode options - -- _strictDefaults_: report ignored `default` keywords in schemas. Option values: - - `false` (default) - ignored defaults are not reported - - `true` - if an ignored default is present, throw an error - - `"log"` - if an ignored default is present, log warning -- _strictKeywords_: report unknown keywords in schemas. Option values: - - `false` (default) - unknown keywords are not reported - - `true` - if an unknown keyword is present, throw an error - - `"log"` - if an unknown keyword is present, log warning -- _strictNumbers_: validate numbers strictly, failing validation for NaN and Infinity. Option values: - - `false` (default) - NaN or Infinity will pass validation for numeric types - - `true` - NaN or Infinity will not pass validation for numeric types - -##### Asynchronous validation options - -- _transpile_: Requires [ajv-async](https://github.com/ajv-validator/ajv-async) package. It determines whether Ajv transpiles compiled asynchronous validation function. Option values: - - `undefined` (default) - transpile with [nodent](https://github.com/MatAtBread/nodent) if async functions are not supported. - - `true` - always transpile with nodent. - - `false` - do not transpile; if async functions are not supported an exception will be thrown. - - -##### Advanced options - -- _meta_: add [meta-schema](http://json-schema.org/documentation.html) so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no `$schema` keyword. This default meta-schema MUST have `$schema` keyword. -- _validateSchema_: validate added/compiled schemas against meta-schema (true by default). `$schema` property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with `addMetaSchema` method. Option values: - - `true` (default) - if the validation fails, throw the exception. - - `"log"` - if the validation fails, log error. - - `false` - skip schema validation. -- _addUsedSchema_: by default methods `compile` and `validate` add schemas to the instance if they have `$id` (or `id`) property that doesn't start with "#". If `$id` is present and it is not unique the exception will be thrown. Set this option to `false` to skip adding schemas to the instance and the `$id` uniqueness check when these methods are used. This option does not affect `addSchema` method. -- _inlineRefs_: Affects compilation of referenced schemas. Option values: - - `true` (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - that substantially improves performance at the cost of the bigger size of compiled schema functions. - - `false` - to not inline referenced schemas (they will be compiled as separate functions). - - integer number - to limit the maximum number of keywords of the schema that will be inlined. -- _passContext_: pass validation context to custom keyword functions. If this option is `true` and you pass some context to the compiled validation function with `validate.call(context, data)`, the `context` will be available as `this` in your custom keywords. By default `this` is Ajv instance. -- _loopRequired_: by default `required` keyword is compiled into a single expression (or a sequence of statements in `allErrors` mode). In case of a very large number of properties in this keyword it may result in a very big validation function. Pass integer to set the number of properties above which `required` keyword will be validated in a loop - smaller validation function size but also worse performance. -- _ownProperties_: by default Ajv iterates over all enumerable object properties; when this option is `true` only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst. -- _multipleOfPrecision_: by default `multipleOf` keyword is validated by comparing the result of division with parseInt() of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue [#84](https://github.com/ajv-validator/ajv/issues/84)). If you need to use fractional dividers set this option to some positive integer N to have `multipleOf` validated using this formula: `Math.abs(Math.round(division) - division) < 1e-N` (it is slower but allows for float arithmetics deviations). -- _errorDataPath_ (deprecated): set `dataPath` to point to 'object' (default) or to 'property' when validating keywords `required`, `additionalProperties` and `dependencies`. -- _messages_: Include human-readable messages in errors. `true` by default. `false` can be passed when custom messages are used (e.g. with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n)). -- _sourceCode_: add `sourceCode` property to validating function (for debugging; this code can be different from the result of toString call). -- _processCode_: an optional function to process generated code before it is passed to Function constructor. It can be used to either beautify (the validating function is generated without line-breaks) or to transpile code. Starting from version 5.0.0 this option replaced options: - - `beautify` that formatted the generated function using [js-beautify](https://github.com/beautify-web/js-beautify). If you want to beautify the generated code pass a function calling `require('js-beautify').js_beautify` as `processCode: code => js_beautify(code)`. - - `transpile` that transpiled asynchronous validation function. You can still use `transpile` option with [ajv-async](https://github.com/ajv-validator/ajv-async) package. See [Asynchronous validation](#asynchronous-validation) for more information. -- _cache_: an optional instance of cache to store compiled schemas using stable-stringified schema as a key. For example, set-associative cache [sacjs](https://github.com/epoberezkin/sacjs) can be used. If not passed then a simple hash is used which is good enough for the common use case (a limited number of statically defined schemas). Cache should have methods `put(key, value)`, `get(key)`, `del(key)` and `clear()`. -- _serialize_: an optional function to serialize schema to cache key. Pass `false` to use schema itself as a key (e.g., if WeakMap used as a cache). By default [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used. - - -## Validation errors - -In case of validation failure, Ajv assigns the array of errors to `errors` property of validation function (or to `errors` property of Ajv instance when `validate` or `validateSchema` methods were called). In case of [asynchronous validation](#asynchronous-validation), the returned promise is rejected with exception `Ajv.ValidationError` that has `errors` property. - - -### Error objects - -Each error is an object with the following properties: - -- _keyword_: validation keyword. -- _dataPath_: the path to the part of the data that was validated. By default `dataPath` uses JavaScript property access notation (e.g., `".prop[1].subProp"`). When the option `jsonPointers` is true (see [Options](#options)) `dataPath` will be set using JSON pointer standard (e.g., `"/prop/1/subProp"`). -- _schemaPath_: the path (JSON-pointer as a URI fragment) to the schema of the keyword that failed validation. -- _params_: the object with the additional information about error that can be used to create custom error messages (e.g., using [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package). See below for parameters set by all keywords. -- _message_: the standard error message (can be excluded with option `messages` set to false). -- _schema_: the schema of the keyword (added with `verbose` option). -- _parentSchema_: the schema containing the keyword (added with `verbose` option) -- _data_: the data validated by the keyword (added with `verbose` option). - -__Please note__: `propertyNames` keyword schema validation errors have an additional property `propertyName`, `dataPath` points to the object. After schema validation for each property name, if it is invalid an additional error is added with the property `keyword` equal to `"propertyNames"`. - - -### Error parameters - -Properties of `params` object in errors depend on the keyword that failed validation. - -- `maxItems`, `minItems`, `maxLength`, `minLength`, `maxProperties`, `minProperties` - property `limit` (number, the schema of the keyword). -- `additionalItems` - property `limit` (the maximum number of allowed items in case when `items` keyword is an array of schemas and `additionalItems` is false). -- `additionalProperties` - property `additionalProperty` (the property not used in `properties` and `patternProperties` keywords). -- `dependencies` - properties: - - `property` (dependent property), - - `missingProperty` (required missing dependency - only the first one is reported currently) - - `deps` (required dependencies, comma separated list as a string), - - `depsCount` (the number of required dependencies). -- `format` - property `format` (the schema of the keyword). -- `maximum`, `minimum` - properties: - - `limit` (number, the schema of the keyword), - - `exclusive` (boolean, the schema of `exclusiveMaximum` or `exclusiveMinimum`), - - `comparison` (string, comparison operation to compare the data to the limit, with the data on the left and the limit on the right; can be "<", "<=", ">", ">=") -- `multipleOf` - property `multipleOf` (the schema of the keyword) -- `pattern` - property `pattern` (the schema of the keyword) -- `required` - property `missingProperty` (required property that is missing). -- `propertyNames` - property `propertyName` (an invalid property name). -- `patternRequired` (in ajv-keywords) - property `missingPattern` (required pattern that did not match any property). -- `type` - property `type` (required type(s), a string, can be a comma-separated list) -- `uniqueItems` - properties `i` and `j` (indices of duplicate items). -- `const` - property `allowedValue` pointing to the value (the schema of the keyword). -- `enum` - property `allowedValues` pointing to the array of values (the schema of the keyword). -- `$ref` - property `ref` with the referenced schema URI. -- `oneOf` - property `passingSchemas` (array of indices of passing schemas, null if no schema passes). -- custom keywords (in case keyword definition doesn't create errors) - property `keyword` (the keyword name). - - -### Error logging - -Using the `logger` option when initiallizing Ajv will allow you to define custom logging. Here you can build upon the exisiting logging. The use of other logging packages is supported as long as the package or its associated wrapper exposes the required methods. If any of the required methods are missing an exception will be thrown. -- **Required Methods**: `log`, `warn`, `error` - -```javascript -var otherLogger = new OtherLogger(); -var ajv = new Ajv({ - logger: { - log: console.log.bind(console), - warn: function warn() { - otherLogger.logWarn.apply(otherLogger, arguments); - }, - error: function error() { - otherLogger.logError.apply(otherLogger, arguments); - console.error.apply(console, arguments); - } - } -}); -``` - - -## Plugins - -Ajv can be extended with plugins that add custom keywords, formats or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions: - -- it exports a function -- this function accepts ajv instance as the first parameter and returns the same instance to allow chaining -- this function can accept an optional configuration as the second parameter - -If you have published a useful plugin please submit a PR to add it to the next section. - - -## Related packages - -- [ajv-async](https://github.com/ajv-validator/ajv-async) - plugin to configure async validation mode -- [ajv-bsontype](https://github.com/BoLaMN/ajv-bsontype) - plugin to validate mongodb's bsonType formats -- [ajv-cli](https://github.com/jessedc/ajv-cli) - command line interface -- [ajv-errors](https://github.com/ajv-validator/ajv-errors) - plugin for custom error messages -- [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) - internationalised error messages -- [ajv-istanbul](https://github.com/ajv-validator/ajv-istanbul) - plugin to instrument generated validation code to measure test coverage of your schemas -- [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) - plugin with custom validation keywords (select, typeof, etc.) -- [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) - plugin with keywords $merge and $patch -- [ajv-pack](https://github.com/ajv-validator/ajv-pack) - produces a compact module exporting validation functions -- [ajv-formats-draft2019](https://github.com/luzlab/ajv-formats-draft2019) - format validators for draft2019 that aren't already included in ajv (ie. `idn-hostname`, `idn-email`, `iri`, `iri-reference` and `duration`). - -## Some packages using Ajv - -- [webpack](https://github.com/webpack/webpack) - a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser -- [jsonscript-js](https://github.com/JSONScript/jsonscript-js) - the interpreter for [JSONScript](http://www.jsonscript.org) - scripted processing of existing endpoints and services -- [osprey-method-handler](https://github.com/mulesoft-labs/osprey-method-handler) - Express middleware for validating requests and responses based on a RAML method object, used in [osprey](https://github.com/mulesoft/osprey) - validating API proxy generated from a RAML definition -- [har-validator](https://github.com/ahmadnassri/har-validator) - HTTP Archive (HAR) validator -- [jsoneditor](https://github.com/josdejong/jsoneditor) - a web-based tool to view, edit, format, and validate JSON http://jsoneditoronline.org -- [JSON Schema Lint](https://github.com/nickcmaynard/jsonschemalint) - a web tool to validate JSON/YAML document against a single JSON Schema http://jsonschemalint.com -- [objection](https://github.com/vincit/objection.js) - SQL-friendly ORM for Node.js -- [table](https://github.com/gajus/table) - formats data into a string table -- [ripple-lib](https://github.com/ripple/ripple-lib) - a JavaScript API for interacting with [Ripple](https://ripple.com) in Node.js and the browser -- [restbase](https://github.com/wikimedia/restbase) - distributed storage with REST API & dispatcher for backend services built to provide a low-latency & high-throughput API for Wikipedia / Wikimedia content -- [hippie-swagger](https://github.com/CacheControl/hippie-swagger) - [Hippie](https://github.com/vesln/hippie) wrapper that provides end to end API testing with swagger validation -- [react-form-controlled](https://github.com/seeden/react-form-controlled) - React controlled form components with validation -- [rabbitmq-schema](https://github.com/tjmehta/rabbitmq-schema) - a schema definition module for RabbitMQ graphs and messages -- [@query/schema](https://www.npmjs.com/package/@query/schema) - stream filtering with a URI-safe query syntax parsing to JSON Schema -- [chai-ajv-json-schema](https://github.com/peon374/chai-ajv-json-schema) - chai plugin to us JSON Schema with expect in mocha tests -- [grunt-jsonschema-ajv](https://github.com/SignpostMarv/grunt-jsonschema-ajv) - Grunt plugin for validating files against JSON Schema -- [extract-text-webpack-plugin](https://github.com/webpack-contrib/extract-text-webpack-plugin) - extract text from bundle into a file -- [electron-builder](https://github.com/electron-userland/electron-builder) - a solution to package and build a ready for distribution Electron app -- [addons-linter](https://github.com/mozilla/addons-linter) - Mozilla Add-ons Linter -- [gh-pages-generator](https://github.com/epoberezkin/gh-pages-generator) - multi-page site generator converting markdown files to GitHub pages -- [ESLint](https://github.com/eslint/eslint) - the pluggable linting utility for JavaScript and JSX - - -## Tests - -``` -npm install -git submodule update --init -npm test -``` - -## Contributing - -All validation functions are generated using doT templates in [dot](https://github.com/ajv-validator/ajv/tree/master/lib/dot) folder. Templates are precompiled so doT is not a run-time dependency. - -`npm run build` - compiles templates to [dotjs](https://github.com/ajv-validator/ajv/tree/master/lib/dotjs) folder. - -`npm run watch` - automatically compiles templates when files in dot folder change - -Please see [Contributing guidelines](https://github.com/ajv-validator/ajv/blob/master/CONTRIBUTING.md) - - -## Changes history - -See https://github.com/ajv-validator/ajv/releases - -__Please note__: [Changes in version 7.0.0-beta](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) - -[Version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0). - -## Code of conduct - -Please review and follow the [Code of conduct](https://github.com/ajv-validator/ajv/blob/master/CODE_OF_CONDUCT.md). - -Please report any unacceptable behaviour to ajv.validator@gmail.com - it will be reviewed by the project team. - - -## Open-source software support - -Ajv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers. - - -## License - -[MIT](https://github.com/ajv-validator/ajv/blob/master/LICENSE) diff --git a/node_modules/ajv/dist/ajv.bundle.js b/node_modules/ajv/dist/ajv.bundle.js deleted file mode 100644 index e4d9d156..00000000 --- a/node_modules/ajv/dist/ajv.bundle.js +++ /dev/null @@ -1,7189 +0,0 @@ -(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.Ajv = 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-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; -// For the source: https://gist.github.com/dperini/729294 -// For test cases: https://mathiasbynens.be/demo/url-regex -// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. -// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; -var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; -var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; -var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; -var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; -var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; - - -module.exports = formats; - -function formats(mode) { - mode = mode == 'full' ? 'full' : 'fast'; - return util.copy(formats[mode]); -} - - -formats.fast = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, - 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, - 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, - 'uri-template': URITEMPLATE, - url: URL, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, - hostname: HOSTNAME, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: UUID, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - 'json-pointer': JSON_POINTER, - 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -formats.full = { - date: date, - time: time, - 'date-time': date_time, - uri: uri, - 'uri-reference': URIREF, - 'uri-template': URITEMPLATE, - url: URL, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: HOSTNAME, - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - uuid: UUID, - 'json-pointer': JSON_POINTER, - 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -function isLeapYear(year) { - // https://tools.ietf.org/html/rfc3339#appendix-C - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -} - - -function date(str) { - // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 - var matches = str.match(DATE); - if (!matches) return false; - - var year = +matches[1]; - var month = +matches[2]; - var day = +matches[3]; - - return month >= 1 && month <= 12 && day >= 1 && - day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); -} - - -function time(str, full) { - var matches = str.match(TIME); - if (!matches) return false; - - var hour = matches[1]; - var minute = matches[2]; - var second = matches[3]; - var timeZone = matches[5]; - return ((hour <= 23 && minute <= 59 && second <= 59) || - (hour == 23 && minute == 59 && second == 60)) && - (!full || timeZone); -} - - -var DATE_TIME_SEPARATOR = /t|\s/i; -function date_time(str) { - // http://tools.ietf.org/html/rfc3339#section-5.6 - var dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); -} - - -var NOT_URI_FRAGMENT = /\/|:/; -function uri(str) { - // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." - return NOT_URI_FRAGMENT.test(str) && URI.test(str); -} - - -var Z_ANCHOR = /[^\\]\\Z/; -function regex(str) { - if (Z_ANCHOR.test(str)) return false; - try { - new RegExp(str); - return true; - } catch(e) { - return false; - } -} - -},{"./util":10}],5:[function(require,module,exports){ -'use strict'; - -var resolve = require('./resolve') - , util = require('./util') - , errorClasses = require('./error_classes') - , stableStringify = require('fast-json-stable-stringify'); - -var validateGenerator = require('../dotjs/validate'); - -/** - * Functions below are used inside compiled validations function - */ - -var ucs2length = util.ucs2length; -var equal = require('fast-deep-equal'); - -// this error is thrown by async schemas to return validation errors via exception -var ValidationError = errorClasses.Validation; - -module.exports = compile; - - -/** - * Compiles schema to validation function - * @this Ajv - * @param {Object} schema schema object - * @param {Object} root object with information about the root schema for this schema - * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution - * @param {String} baseId base ID for IDs in the schema - * @return {Function} validation function - */ -function compile(schema, root, localRefs, baseId) { - /* jshint validthis: true, evil: true */ - /* eslint no-shadow: 0 */ - var self = this - , opts = this._opts - , refVal = [ undefined ] - , refs = {} - , patterns = [] - , patternsHash = {} - , defaults = [] - , defaultsHash = {} - , customRules = []; - - root = root || { schema: schema, refVal: refVal, refs: refs }; - - var c = checkCompiling.call(this, schema, root, baseId); - var compilation = this._compilations[c.index]; - if (c.compiling) return (compilation.callValidate = callValidate); - - var formats = this._formats; - var RULES = this.RULES; - - try { - var v = localCompile(schema, root, localRefs, baseId); - compilation.validate = v; - var cv = compilation.callValidate; - if (cv) { - cv.schema = v.schema; - cv.errors = null; - cv.refs = v.refs; - cv.refVal = v.refVal; - cv.root = v.root; - cv.$async = v.$async; - if (opts.sourceCode) cv.source = v.source; - } - return v; - } finally { - endCompiling.call(this, schema, root, baseId); - } - - /* @this {*} - custom context, see passContext option */ - function callValidate() { - /* jshint validthis: true */ - var validate = compilation.validate; - var result = validate.apply(this, arguments); - callValidate.errors = validate.errors; - return result; - } - - function localCompile(_schema, _root, localRefs, baseId) { - var isRoot = !_root || (_root && _root.schema == _schema); - if (_root.schema != root.schema) - return compile.call(self, _schema, _root, localRefs, baseId); - - var $async = _schema.$async === true; - - var sourceCode = validateGenerator({ - isTop: true, - schema: _schema, - isRoot: isRoot, - baseId: baseId, - root: _root, - schemaPath: '', - errSchemaPath: '#', - errorPath: '""', - MissingRefError: errorClasses.MissingRef, - RULES: RULES, - validate: validateGenerator, - util: util, - resolve: resolve, - resolveRef: resolveRef, - usePattern: usePattern, - useDefault: useDefault, - useCustomRule: useCustomRule, - opts: opts, - formats: formats, - logger: self.logger, - self: self - }); - - sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) - + vars(defaults, defaultCode) + vars(customRules, customRuleCode) - + sourceCode; - - if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); - // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); - var validate; - try { - var makeValidate = new Function( - 'self', - 'RULES', - 'formats', - 'root', - 'refVal', - 'defaults', - 'customRules', - 'equal', - 'ucs2length', - 'ValidationError', - sourceCode - ); - - validate = makeValidate( - self, - RULES, - formats, - root, - refVal, - defaults, - customRules, - equal, - ucs2length, - ValidationError - ); - - refVal[0] = validate; - } catch(e) { - self.logger.error('Error compiling schema, function code:', sourceCode); - throw e; - } - - validate.schema = _schema; - validate.errors = null; - validate.refs = refs; - validate.refVal = refVal; - validate.root = isRoot ? validate : _root; - if ($async) validate.$async = true; - if (opts.sourceCode === true) { - validate.source = { - code: sourceCode, - patterns: patterns, - defaults: defaults - }; - } - - return validate; - } - - function resolveRef(baseId, ref, isRoot) { - ref = resolve.url(baseId, ref); - var refIndex = refs[ref]; - var _refVal, refCode; - if (refIndex !== undefined) { - _refVal = refVal[refIndex]; - refCode = 'refVal[' + refIndex + ']'; - return resolvedRef(_refVal, refCode); - } - if (!isRoot && root.refs) { - var rootRefId = root.refs[ref]; - if (rootRefId !== undefined) { - _refVal = root.refVal[rootRefId]; - refCode = addLocalRef(ref, _refVal); - return resolvedRef(_refVal, refCode); - } - } - - refCode = addLocalRef(ref); - var v = resolve.call(self, localCompile, root, ref); - if (v === undefined) { - var localSchema = localRefs && localRefs[ref]; - if (localSchema) { - v = resolve.inlineRef(localSchema, opts.inlineRefs) - ? localSchema - : compile.call(self, localSchema, root, localRefs, baseId); - } - } - - if (v === undefined) { - removeLocalRef(ref); - } else { - replaceLocalRef(ref, v); - return resolvedRef(v, refCode); - } - } - - function addLocalRef(ref, v) { - var refId = refVal.length; - refVal[refId] = v; - refs[ref] = refId; - return 'refVal' + refId; - } - - function removeLocalRef(ref) { - delete refs[ref]; - } - - function replaceLocalRef(ref, v) { - var refId = refs[ref]; - refVal[refId] = v; - } - - function resolvedRef(refVal, code) { - return typeof refVal == 'object' || typeof refVal == 'boolean' - ? { code: code, schema: refVal, inline: true } - : { code: code, $async: refVal && !!refVal.$async }; - } - - function usePattern(regexStr) { - var index = patternsHash[regexStr]; - if (index === undefined) { - index = patternsHash[regexStr] = patterns.length; - patterns[index] = regexStr; - } - return 'pattern' + index; - } - - function useDefault(value) { - switch (typeof value) { - case 'boolean': - case 'number': - return '' + value; - case 'string': - return util.toQuotedString(value); - case 'object': - if (value === null) return 'null'; - var valueStr = stableStringify(value); - var index = defaultsHash[valueStr]; - if (index === undefined) { - index = defaultsHash[valueStr] = defaults.length; - defaults[index] = value; - } - return 'default' + index; - } - } - - function useCustomRule(rule, schema, parentSchema, it) { - if (self._opts.validateSchema !== false) { - var deps = rule.definition.dependencies; - if (deps && !deps.every(function(keyword) { - return Object.prototype.hasOwnProperty.call(parentSchema, keyword); - })) - throw new Error('parent schema must have all required keywords: ' + deps.join(',')); - - var validateSchema = rule.definition.validateSchema; - if (validateSchema) { - var valid = validateSchema(schema); - if (!valid) { - var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); - if (self._opts.validateSchema == 'log') self.logger.error(message); - else throw new Error(message); - } - } - } - - var compile = rule.definition.compile - , inline = rule.definition.inline - , macro = rule.definition.macro; - - var validate; - if (compile) { - validate = compile.call(self, schema, parentSchema, it); - } else if (macro) { - validate = macro.call(self, schema, parentSchema, it); - if (opts.validateSchema !== false) self.validateSchema(validate, true); - } else if (inline) { - validate = inline.call(self, it, rule.keyword, schema, parentSchema); - } else { - validate = rule.definition.validate; - if (!validate) return; - } - - if (validate === undefined) - throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); - - var index = customRules.length; - customRules[index] = validate; - - return { - code: 'customRule' + index, - validate: validate - }; - } -} - - -/** - * Checks if the schema is currently compiled - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) - */ -function checkCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var index = compIndex.call(this, schema, root, baseId); - if (index >= 0) return { index: index, compiling: true }; - index = this._compilations.length; - this._compilations[index] = { - schema: schema, - root: root, - baseId: baseId - }; - return { index: index, compiling: false }; -} - - -/** - * Removes the schema from the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - */ -function endCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var i = compIndex.call(this, schema, root, baseId); - if (i >= 0) this._compilations.splice(i, 1); -} - - -/** - * Index of schema compilation in the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Integer} compilation index - */ -function compIndex(schema, root, baseId) { - /* jshint validthis: true */ - for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { - // high surrogate, and there is a next character - value = str.charCodeAt(pos); - if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate - } - } - return length; -}; - -},{}],10:[function(require,module,exports){ -'use strict'; - - -module.exports = { - copy: copy, - checkDataType: checkDataType, - checkDataTypes: checkDataTypes, - coerceToTypes: coerceToTypes, - toHash: toHash, - getProperty: getProperty, - escapeQuotes: escapeQuotes, - equal: require('fast-deep-equal'), - ucs2length: require('./ucs2length'), - varOccurences: varOccurences, - varReplace: varReplace, - schemaHasRules: schemaHasRules, - schemaHasRulesExcept: schemaHasRulesExcept, - schemaUnknownRules: schemaUnknownRules, - toQuotedString: toQuotedString, - getPathExpr: getPathExpr, - getPath: getPath, - getData: getData, - unescapeFragment: unescapeFragment, - unescapeJsonPointer: unescapeJsonPointer, - escapeFragment: escapeFragment, - escapeJsonPointer: escapeJsonPointer -}; - - -function copy(o, to) { - to = to || {}; - for (var key in o) to[key] = o[key]; - return to; -} - - -function checkDataType(dataType, data, strictNumbers, negate) { - var EQUAL = negate ? ' !== ' : ' === ' - , AND = negate ? ' || ' : ' && ' - , OK = negate ? '!' : '' - , NOT = negate ? '' : '!'; - switch (dataType) { - case 'null': return data + EQUAL + 'null'; - case 'array': return OK + 'Array.isArray(' + data + ')'; - case 'object': return '(' + OK + data + AND + - 'typeof ' + data + EQUAL + '"object"' + AND + - NOT + 'Array.isArray(' + data + '))'; - case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + - NOT + '(' + data + ' % 1)' + - AND + data + EQUAL + data + - (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; - case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + - (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; - default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; - } -} - - -function checkDataTypes(dataTypes, data, strictNumbers) { - switch (dataTypes.length) { - case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); - default: - var code = ''; - var types = toHash(dataTypes); - if (types.array && types.object) { - code = types.null ? '(': '(!' + data + ' || '; - code += 'typeof ' + data + ' !== "object")'; - delete types.null; - delete types.array; - delete types.object; - } - if (types.number) delete types.integer; - for (var t in types) - code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); - - return code; - } -} - - -var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); -function coerceToTypes(optionCoerceTypes, dataTypes) { - if (Array.isArray(dataTypes)) { - var types = []; - for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); - return paths[lvl - up]; - } - - if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); - data = 'data' + ((lvl - up) || ''); - if (!jsonPointer) return data; - } - - var expr = data; - var segments = jsonPointer.split('/'); - for (var i=0; i', - $notOp = $isMax ? '>' : '<', - $errorKeyword = undefined; - if (!($isData || typeof $schema == 'number' || $schema === undefined)) { - throw new Error($keyword + ' must be number'); - } - if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { - throw new Error($exclusiveKeyword + ' must be number or boolean'); - } - if ($isDataExcl) { - var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), - $exclusive = 'exclusive' + $lvl, - $exclType = 'exclType' + $lvl, - $exclIsNumber = 'exclIsNumber' + $lvl, - $opExpr = 'op' + $lvl, - $opStr = '\' + ' + $opExpr + ' + \''; - out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; - $schemaValueExcl = 'schemaExcl' + $lvl; - out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; - var $errorKeyword = $exclusiveKeyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; - if ($schema === undefined) { - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaValueExcl; - $isData = $isDataExcl; - } - } else { - var $exclIsNumber = typeof $schemaExcl == 'number', - $opStr = $op; - if ($exclIsNumber && $isData) { - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; - } else { - if ($exclIsNumber && $schema === undefined) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaExcl; - $notOp += '='; - } else { - if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); - if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $notOp += '='; - } else { - $exclusive = false; - $opStr += '='; - } - } - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; - } - } - $errorKeyword = $errorKeyword || $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be ' + ($opStr) + ' '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],14:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxItems' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxItems') { - out += 'more'; - } else { - out += 'fewer'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],15:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitLength(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxLength' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - if (it.opts.unicode === false) { - out += ' ' + ($data) + '.length '; - } else { - out += ' ucs2length(' + ($data) + ') '; - } - out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be '; - if ($keyword == 'maxLength') { - out += 'longer'; - } else { - out += 'shorter'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' characters\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],16:[function(require,module,exports){ -'use strict'; -module.exports = function generate__limitProperties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxProperties' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxProperties') { - out += 'more'; - } else { - out += 'fewer'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],17:[function(require,module,exports){ -'use strict'; -module.exports = function generate_allOf(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $allSchemasEmpty = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $allSchemasEmpty = false; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($breakOnError) { - if ($allSchemasEmpty) { - out += ' if (true) { '; - } else { - out += ' ' + ($closingBraces.slice(0, -1)) + ' '; - } - } - return out; -} - -},{}],18:[function(require,module,exports){ -'use strict'; -module.exports = function generate_anyOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $noEmptySchema = $schema.every(function($sch) { - return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); - }); - if ($noEmptySchema) { - var $currentBaseId = $it.baseId; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match some schema in anyOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - -},{}],19:[function(require,module,exports){ -'use strict'; -module.exports = function generate_comment(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $comment = it.util.toQuotedString($schema); - if (it.opts.$comment === true) { - out += ' console.log(' + ($comment) + ');'; - } else if (typeof it.opts.$comment == 'function') { - out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; - } - return out; -} - -},{}],20:[function(require,module,exports){ -'use strict'; -module.exports = function generate_const(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!$isData) { - out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to constant\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],21:[function(require,module,exports){ -'use strict'; -module.exports = function generate_contains(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId, - $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($nonEmptySchema) { - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (' + ($nextValid) + ') break; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; - } else { - out += ' if (' + ($data) + '.length == 0) {'; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should contain a valid item\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - if ($nonEmptySchema) { - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - } - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} - -},{}],22:[function(require,module,exports){ -'use strict'; -module.exports = function generate_custom(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $rule = this, - $definition = 'definition' + $lvl, - $rDef = $rule.definition, - $closingBraces = ''; - var $compile, $inline, $macro, $ruleValidate, $validateCode; - if ($isData && $rDef.$data) { - $validateCode = 'keywordValidate' + $lvl; - var $validateSchema = $rDef.validateSchema; - out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; - } else { - $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); - if (!$ruleValidate) return; - $schemaValue = 'validate.schema' + $schemaPath; - $validateCode = $ruleValidate.code; - $compile = $rDef.compile; - $inline = $rDef.inline; - $macro = $rDef.macro; - } - var $ruleErrs = $validateCode + '.errors', - $i = 'i' + $lvl, - $ruleErr = 'ruleErr' + $lvl, - $asyncKeyword = $rDef.async; - if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); - if (!($inline || $macro)) { - out += '' + ($ruleErrs) + ' = null;'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($isData && $rDef.$data) { - $closingBraces += '}'; - out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; - if ($validateSchema) { - $closingBraces += '}'; - out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; - } - } - if ($inline) { - if ($rDef.statements) { - out += ' ' + ($ruleValidate.validate) + ' '; - } else { - out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; - } - } else if ($macro) { - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - $it.schema = $ruleValidate.validate; - $it.schemaPath = ''; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($code); - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - out += ' ' + ($validateCode) + '.call( '; - if (it.opts.passContext) { - out += 'this'; - } else { - out += 'self'; - } - if ($compile || $rDef.schema === false) { - out += ' , ' + ($data) + ' '; - } else { - out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; - } - out += ' , (dataPath || \'\')'; - if (it.errorPath != '""') { - out += ' + ' + (it.errorPath); - } - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; - var def_callRuleValidate = out; - out = $$outStack.pop(); - if ($rDef.errors === false) { - out += ' ' + ($valid) + ' = '; - if ($asyncKeyword) { - out += 'await '; - } - out += '' + (def_callRuleValidate) + '; '; - } else { - if ($asyncKeyword) { - $ruleErrs = 'customErrors' + $lvl; - out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; - } else { - out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; - } - } - } - if ($rDef.modifying) { - out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; - } - out += '' + ($closingBraces); - if ($rDef.valid) { - if ($breakOnError) { - out += ' if (true) { '; - } - } else { - out += ' if ( '; - if ($rDef.valid === undefined) { - out += ' !'; - if ($macro) { - out += '' + ($nextValid); - } else { - out += '' + ($valid); - } - } else { - out += ' ' + (!$rDef.valid) + ' '; - } - out += ') { '; - $errorKeyword = $rule.keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - var def_customError = out; - out = $$outStack.pop(); - if ($inline) { - if ($rDef.errors) { - if ($rDef.errors != 'full') { - out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; - } - out += ') { '; - $it.schema = $sch; - $it.schemaPath = $schemaPath + it.util.getProperty($property); - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} - -},{}],24:[function(require,module,exports){ -'use strict'; -module.exports = function generate_enum(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $i = 'i' + $lvl, - $vSchema = 'schema' + $lvl; - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ';'; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to one of the allowed values\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],25:[function(require,module,exports){ -'use strict'; -module.exports = function generate_format(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - if (it.opts.format === false) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $unknownFormats = it.opts.unknownFormats, - $allowUnknown = Array.isArray($unknownFormats); - if ($isData) { - var $format = 'format' + $lvl, - $isObject = 'isObject' + $lvl, - $formatType = 'formatType' + $lvl; - out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; - if (it.async) { - out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; - } - out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' ('; - if ($unknownFormats != 'ignore') { - out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; - if ($allowUnknown) { - out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; - } - out += ') || '; - } - out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; - if (it.async) { - out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; - } else { - out += ' ' + ($format) + '(' + ($data) + ') '; - } - out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; - } else { - var $format = it.formats[$schema]; - if (!$format) { - if ($unknownFormats == 'ignore') { - it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else { - throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); - } - } - var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; - var $formatType = $isObject && $format.type || 'string'; - if ($isObject) { - var $async = $format.async === true; - $format = $format.validate; - } - if ($formatType != $ruleType) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - if ($async) { - if (!it.async) throw new Error('async format in sync schema'); - var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; - out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; - } else { - out += ' if (! '; - var $formatRef = 'formats' + it.util.getProperty($schema); - if ($isObject) $formatRef += '.validate'; - if (typeof $format == 'function') { - out += ' ' + ($formatRef) + '(' + ($data) + ') '; - } else { - out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; - } - out += ') { '; - } - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match format "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],26:[function(require,module,exports){ -'use strict'; -module.exports = function generate_if(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - var $thenSch = it.schema['then'], - $elseSch = it.schema['else'], - $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), - $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), - $currentBaseId = $it.baseId; - if ($thenPresent || $elsePresent) { - var $ifClause; - $it.createErrors = false; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - $it.createErrors = true; - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - if ($thenPresent) { - out += ' if (' + ($nextValid) + ') { '; - $it.schema = it.schema['then']; - $it.schemaPath = it.schemaPath + '.then'; - $it.errSchemaPath = it.errSchemaPath + '/then'; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; - if ($thenPresent && $elsePresent) { - $ifClause = 'ifClause' + $lvl; - out += ' var ' + ($ifClause) + ' = \'then\'; '; - } else { - $ifClause = '\'then\''; - } - out += ' } '; - if ($elsePresent) { - out += ' else { '; - } - } else { - out += ' if (!' + ($nextValid) + ') { '; - } - if ($elsePresent) { - $it.schema = it.schema['else']; - $it.schemaPath = it.schemaPath + '.else'; - $it.errSchemaPath = it.errSchemaPath + '/else'; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; - if ($thenPresent && $elsePresent) { - $ifClause = 'ifClause' + $lvl; - out += ' var ' + ($ifClause) + ' = \'else\'; '; - } else { - $ifClause = '\'else\''; - } - out += ' } '; - } - out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - -},{}],27:[function(require,module,exports){ -'use strict'; - -//all requires must be explicit because browserify won't work with dynamic requires -module.exports = { - '$ref': require('./ref'), - allOf: require('./allOf'), - anyOf: require('./anyOf'), - '$comment': require('./comment'), - const: require('./const'), - contains: require('./contains'), - dependencies: require('./dependencies'), - 'enum': require('./enum'), - format: require('./format'), - 'if': require('./if'), - items: require('./items'), - maximum: require('./_limit'), - minimum: require('./_limit'), - maxItems: require('./_limitItems'), - minItems: require('./_limitItems'), - maxLength: require('./_limitLength'), - minLength: require('./_limitLength'), - maxProperties: require('./_limitProperties'), - minProperties: require('./_limitProperties'), - multipleOf: require('./multipleOf'), - not: require('./not'), - oneOf: require('./oneOf'), - pattern: require('./pattern'), - properties: require('./properties'), - propertyNames: require('./propertyNames'), - required: require('./required'), - uniqueItems: require('./uniqueItems'), - validate: require('./validate') -}; - -},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){ -'use strict'; -module.exports = function generate_items(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId; - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if (Array.isArray($schema)) { - var $additionalItems = it.schema.additionalItems; - if ($additionalItems === false) { - out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - $closingBraces += '}'; - out += ' else { '; - } - } - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; - var $passData = $data + '[' + $i + ']'; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); - $it.dataPathArr[$dataNxt] = $i; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { - $it.schema = $additionalItems; - $it.schemaPath = it.schemaPath + '.additionalItems'; - $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' }'; - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} - -},{}],29:[function(require,module,exports){ -'use strict'; -module.exports = function generate_multipleOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - out += 'var division' + ($lvl) + ';if ('; - if ($isData) { - out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; - } - out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; - if (it.opts.multipleOfPrecision) { - out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; - } else { - out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; - } - out += ' ) '; - if ($isData) { - out += ' ) '; - } - out += ' ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be multiple of '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],30:[function(require,module,exports){ -'use strict'; -module.exports = function generate_not(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.createErrors = false; - var $allErrorsOption; - if ($it.opts.allErrors) { - $allErrorsOption = $it.opts.allErrors; - $it.opts.allErrors = false; - } - out += ' ' + (it.validate($it)) + ' '; - $it.createErrors = true; - if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (' + ($nextValid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - out += ' var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if ($breakOnError) { - out += ' if (false) { '; - } - } - return out; -} - -},{}],31:[function(require,module,exports){ -'use strict'; -module.exports = function generate_oneOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $prevValid = 'prevValid' + $lvl, - $passingSchemas = 'passingSchemas' + $lvl; - out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - } else { - out += ' var ' + ($nextValid) + ' = true; '; - } - if ($i) { - out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; - $closingBraces += '}'; - } - out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match exactly one schema in oneOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} - -},{}],32:[function(require,module,exports){ -'use strict'; -module.exports = function generate_pattern(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match pattern "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} - -},{}],33:[function(require,module,exports){ -'use strict'; -module.exports = function generate_properties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl; - var $schemaKeys = Object.keys($schema || {}).filter(notProto), - $pProperties = it.schema.patternProperties || {}, - $pPropertyKeys = Object.keys($pProperties).filter(notProto), - $aProperties = it.schema.additionalProperties, - $someProperties = $schemaKeys.length || $pPropertyKeys.length, - $noAdditional = $aProperties === false, - $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, - $removeAdditional = it.opts.removeAdditional, - $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - var $required = it.schema.required; - if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { - var $requiredHash = it.util.toHash($required); - } - - function notProto(p) { - return p !== '__proto__'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined;'; - } - if ($checkAdditional) { - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - if ($someProperties) { - out += ' var isAdditional' + ($lvl) + ' = !(false '; - if ($schemaKeys.length) { - if ($schemaKeys.length > 8) { - out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; - } else { - var arr1 = $schemaKeys; - if (arr1) { - var $propertyKey, i1 = -1, - l1 = arr1.length - 1; - while (i1 < l1) { - $propertyKey = arr1[i1 += 1]; - out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; - } - } - } - } - if ($pPropertyKeys.length) { - var arr2 = $pPropertyKeys; - if (arr2) { - var $pProperty, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $pProperty = arr2[$i += 1]; - out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; - } - } - } - out += ' ); if (isAdditional' + ($lvl) + ') { '; - } - if ($removeAdditional == 'all') { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - var $currentErrorPath = it.errorPath; - var $additionalProperty = '\' + ' + $key + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - } - if ($noAdditional) { - if ($removeAdditional) { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - out += ' ' + ($nextValid) + ' = false; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalProperties'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is an invalid additional property'; - } else { - out += 'should NOT have additional properties'; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' break; '; - } - } - } else if ($additionalIsSchema) { - if ($removeAdditional == 'failing') { - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - } else { - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - } - } - it.errorPath = $currentErrorPath; - } - if ($someProperties) { - out += ' } '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - var $useDefaults = it.opts.useDefaults && !it.compositeRule; - if ($schemaKeys.length) { - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - var $prop = it.util.getProperty($propertyKey), - $passData = $data + $prop, - $hasDefault = $useDefaults && $sch.default !== undefined; - $it.schema = $sch; - $it.schemaPath = $schemaPath + $prop; - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); - $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); - $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - $code = it.util.varReplace($code, $nextData, $passData); - var $useData = $passData; - } else { - var $useData = $nextData; - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; - } - if ($hasDefault) { - out += ' ' + ($code) + ' '; - } else { - if ($requiredHash && $requiredHash[$propertyKey]) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = false; '; - var $currentErrorPath = it.errorPath, - $currErrSchemaPath = $errSchemaPath, - $missingProperty = it.util.escapeQuotes($propertyKey); - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - $errSchemaPath = it.errSchemaPath + '/required'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - it.errorPath = $currentErrorPath; - out += ' } else { '; - } else { - if ($breakOnError) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = true; } else { '; - } else { - out += ' if (' + ($useData) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ' ) { '; - } - } - out += ' ' + ($code) + ' } '; - } - } - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($pPropertyKeys.length) { - var arr4 = $pPropertyKeys; - if (arr4) { - var $pProperty, i4 = -1, - l4 = arr4.length - 1; - while (i4 < l4) { - $pProperty = arr4[i4 += 1]; - var $sch = $pProperties[$pProperty]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); - $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} - -},{}],34:[function(require,module,exports){ -'use strict'; -module.exports = function generate_propertyNames(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - out += 'var ' + ($errs) + ' = errors;'; - if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $i = 'i' + $lvl, - $invalidName = '\' + ' + $key + ' + \'', - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined; '; - } - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' var startErrs' + ($lvl) + ' = errors; '; - var $passData = $key; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { - $required[$required.length] = $property; - } - } - } - } else { - var $required = $schema; - } - } - if ($isData || $required.length) { - var $currentErrorPath = it.errorPath, - $loopRequired = $isData || $required.length >= it.opts.loopRequired, - $ownProperties = it.opts.ownProperties; - if ($breakOnError) { - out += ' var missing' + ($lvl) + '; '; - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - out += ' var ' + ($valid) + ' = true; '; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += '; if (!' + ($valid) + ') break; } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } else { - out += ' if ( '; - var arr2 = $required; - if (arr2) { - var $propertyKey, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $propertyKey = arr2[$i += 1]; - if ($i) { - out += ' || '; - } - var $prop = it.util.getProperty($propertyKey), - $useData = $data + $prop; - out += ' ( ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; - } - } - out += ') { '; - var $propertyPath = 'missing' + $lvl, - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } - } else { - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - if ($isData) { - out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; - if ($isData) { - out += ' } '; - } - } else { - var arr3 = $required; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $prop = it.util.getProperty($propertyKey), - $missingProperty = it.util.escapeQuotes($propertyKey), - $useData = $data + $prop; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; - } - } - } - } - it.errorPath = $currentErrorPath; - } else if ($breakOnError) { - out += ' if (true) {'; - } - return out; -} - -},{}],37:[function(require,module,exports){ -'use strict'; -module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (($schema || $isData) && it.opts.uniqueItems !== false) { - if ($isData) { - out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; - } - out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; - var $itemType = it.schema.items && it.schema.items.type, - $typeIsArray = Array.isArray($itemType); - if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { - out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; - } else { - out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; - var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); - out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; - if ($typeIsArray) { - out += ' if (typeof item == \'string\') item = \'"\' + item; '; - } - out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; - } - out += ' } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} - -},{}],38:[function(require,module,exports){ -'use strict'; -module.exports = function generate_validate(it, $keyword, $ruleType) { - var out = ''; - var $async = it.schema.$async === true, - $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), - $id = it.self._getId(it.schema); - if (it.opts.strictKeywords) { - var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); - if ($unknownKwd) { - var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; - if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); - else throw new Error($keywordsMsg); - } - } - if (it.isTop) { - out += ' var validate = '; - if ($async) { - it.async = true; - out += 'async '; - } - out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; - if ($id && (it.opts.sourceCode || it.opts.processCode)) { - out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; - } - } - if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { - var $keyword = 'false schema'; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - if (it.schema === false) { - if (it.isTop) { - $breakOnError = true; - } else { - out += ' var ' + ($valid) + ' = false; '; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'boolean schema is false\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } else { - if (it.isTop) { - if ($async) { - out += ' return data; '; - } else { - out += ' validate.errors = null; return true; '; - } - } else { - out += ' var ' + ($valid) + ' = true; '; - } - } - if (it.isTop) { - out += ' }; return validate; '; - } - return out; - } - if (it.isTop) { - var $top = it.isTop, - $lvl = it.level = 0, - $dataLvl = it.dataLevel = 0, - $data = 'data'; - it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); - it.baseId = it.baseId || it.rootId; - delete it.isTop; - it.dataPathArr = [""]; - if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored in the schema root'; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - out += ' var vErrors = null; '; - out += ' var errors = 0; '; - out += ' if (rootData === undefined) rootData = data; '; - } else { - var $lvl = it.level, - $dataLvl = it.dataLevel, - $data = 'data' + ($dataLvl || ''); - if ($id) it.baseId = it.resolve.url(it.baseId, $id); - if ($async && !it.async) throw new Error('async schema in sync schema'); - out += ' var errs_' + ($lvl) + ' = errors;'; - } - var $valid = 'valid' + $lvl, - $breakOnError = !it.opts.allErrors, - $closingBraces1 = '', - $closingBraces2 = ''; - var $errorKeyword; - var $typeSchema = it.schema.type, - $typeIsArray = Array.isArray($typeSchema); - if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { - if ($typeIsArray) { - if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); - } else if ($typeSchema != 'null') { - $typeSchema = [$typeSchema, 'null']; - $typeIsArray = true; - } - } - if ($typeIsArray && $typeSchema.length == 1) { - $typeSchema = $typeSchema[0]; - $typeIsArray = false; - } - if (it.schema.$ref && $refKeywords) { - if (it.opts.extendRefs == 'fail') { - throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); - } else if (it.opts.extendRefs !== true) { - $refKeywords = false; - it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); - } - } - if (it.schema.$comment && it.opts.$comment) { - out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); - } - if ($typeSchema) { - if (it.opts.coerceTypes) { - var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); - } - var $rulesGroup = it.RULES.types[$typeSchema]; - if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type', - $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; - out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; - if ($coerceToTypes) { - var $dataType = 'dataType' + $lvl, - $coerced = 'coerced' + $lvl; - out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; - if (it.opts.coerceTypes == 'array') { - out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; - } - out += ' if (' + ($coerced) + ' !== undefined) ; '; - var arr1 = $coerceToTypes; - if (arr1) { - var $type, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $type = arr1[$i += 1]; - if ($type == 'string') { - out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; - } else if ($type == 'number' || $type == 'integer') { - out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; - if ($type == 'integer') { - out += ' && !(' + ($data) + ' % 1)'; - } - out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; - } else if ($type == 'boolean') { - out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; - } else if ($type == 'null') { - out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; - } else if (it.opts.coerceTypes == 'array' && $type == 'array') { - out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; - } - } - } - out += ' else { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } if (' + ($coerced) + ' !== undefined) { '; - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' ' + ($data) + ' = ' + ($coerced) + '; '; - if (!$dataLvl) { - out += 'if (' + ($parentData) + ' !== undefined)'; - } - out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } - out += ' } '; - } - } - if (it.schema.$ref && !$refKeywords) { - out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; - if ($breakOnError) { - out += ' } if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } else { - var arr2 = it.RULES; - if (arr2) { - var $rulesGroup, i2 = -1, - l2 = arr2.length - 1; - while (i2 < l2) { - $rulesGroup = arr2[i2 += 1]; - if ($shouldUseGroup($rulesGroup)) { - if ($rulesGroup.type) { - out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; - } - if (it.opts.useDefaults) { - if ($rulesGroup.type == 'object' && it.schema.properties) { - var $schema = it.schema.properties, - $schemaKeys = Object.keys($schema); - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ($sch.default !== undefined) { - var $passData = $data + it.util.getProperty($propertyKey); - if (it.compositeRule) { - if (it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored for: ' + $passData; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - } else { - out += ' if (' + ($passData) + ' === undefined '; - if (it.opts.useDefaults == 'empty') { - out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; - } - out += ' ) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { - var arr4 = it.schema.items; - if (arr4) { - var $sch, $i = -1, - l4 = arr4.length - 1; - while ($i < l4) { - $sch = arr4[$i += 1]; - if ($sch.default !== undefined) { - var $passData = $data + '[' + $i + ']'; - if (it.compositeRule) { - if (it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored for: ' + $passData; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - } else { - out += ' if (' + ($passData) + ' === undefined '; - if (it.opts.useDefaults == 'empty') { - out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; - } - out += ' ) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } - } - var arr5 = $rulesGroup.rules; - if (arr5) { - var $rule, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $rule = arr5[i5 += 1]; - if ($shouldUseRule($rule)) { - var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); - if ($code) { - out += ' ' + ($code) + ' '; - if ($breakOnError) { - $closingBraces1 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces1) + ' '; - $closingBraces1 = ''; - } - if ($rulesGroup.type) { - out += ' } '; - if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { - out += ' else { '; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - } - if ($breakOnError) { - out += ' if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces2) + ' '; - } - if ($top) { - if ($async) { - out += ' if (errors === 0) return data; '; - out += ' else throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; '; - out += ' return errors === 0; '; - } - out += ' }; return validate;'; - } else { - out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; - } - - function $shouldUseGroup($rulesGroup) { - var rules = $rulesGroup.rules; - for (var i = 0; i < rules.length; i++) - if ($shouldUseRule(rules[i])) return true; - } - - function $shouldUseRule($rule) { - return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); - } - - function $ruleImplementsSomeKeyword($rule) { - var impl = $rule.implements; - for (var i = 0; i < impl.length; i++) - if (it.schema[impl[i]] !== undefined) return true; - } - return out; -} - -},{}],39:[function(require,module,exports){ -'use strict'; - -var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; -var customRuleCode = require('./dotjs/custom'); -var definitionSchema = require('./definition_schema'); - -module.exports = { - add: addKeyword, - get: getKeyword, - remove: removeKeyword, - validate: validateKeyword -}; - - -/** - * Define custom keyword - * @this Ajv - * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). - * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. - * @return {Ajv} this for method chaining - */ -function addKeyword(keyword, definition) { - /* jshint validthis: true */ - /* eslint no-shadow: 0 */ - var RULES = this.RULES; - if (RULES.keywords[keyword]) - throw new Error('Keyword ' + keyword + ' is already defined'); - - if (!IDENTIFIER.test(keyword)) - throw new Error('Keyword ' + keyword + ' is not a valid identifier'); - - if (definition) { - this.validateKeyword(definition, true); - - var dataType = definition.type; - if (Array.isArray(dataType)) { - for (var i=0; i 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 }); - -}))); - - -},{}],"ajv":[function(require,module,exports){ -'use strict'; - -var compileSchema = require('./compile') - , resolve = require('./compile/resolve') - , Cache = require('./cache') - , SchemaObject = require('./compile/schema_obj') - , stableStringify = require('fast-json-stable-stringify') - , formats = require('./compile/formats') - , rules = require('./compile/rules') - , $dataMetaSchema = require('./data') - , util = require('./compile/util'); - -module.exports = Ajv; - -Ajv.prototype.validate = validate; -Ajv.prototype.compile = compile; -Ajv.prototype.addSchema = addSchema; -Ajv.prototype.addMetaSchema = addMetaSchema; -Ajv.prototype.validateSchema = validateSchema; -Ajv.prototype.getSchema = getSchema; -Ajv.prototype.removeSchema = removeSchema; -Ajv.prototype.addFormat = addFormat; -Ajv.prototype.errorsText = errorsText; - -Ajv.prototype._addSchema = _addSchema; -Ajv.prototype._compile = _compile; - -Ajv.prototype.compileAsync = require('./compile/async'); -var customKeyword = require('./keyword'); -Ajv.prototype.addKeyword = customKeyword.add; -Ajv.prototype.getKeyword = customKeyword.get; -Ajv.prototype.removeKeyword = customKeyword.remove; -Ajv.prototype.validateKeyword = customKeyword.validate; - -var errorClasses = require('./compile/error_classes'); -Ajv.ValidationError = errorClasses.Validation; -Ajv.MissingRefError = errorClasses.MissingRef; -Ajv.$dataMetaSchema = $dataMetaSchema; - -var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; - -var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; -var META_SUPPORT_DATA = ['/properties']; - -/** - * Creates validator instance. - * Usage: `Ajv(opts)` - * @param {Object} opts optional options - * @return {Object} ajv instance - */ -function Ajv(opts) { - if (!(this instanceof Ajv)) return new Ajv(opts); - opts = this._opts = util.copy(opts) || {}; - setLogger(this); - this._schemas = {}; - this._refs = {}; - this._fragments = {}; - this._formats = formats(opts.format); - - this._cache = opts.cache || new Cache; - this._loadingSchemas = {}; - this._compilations = []; - this.RULES = rules(); - this._getId = chooseGetId(opts); - - opts.loopRequired = opts.loopRequired || Infinity; - if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; - if (opts.serialize === undefined) opts.serialize = stableStringify; - this._metaOpts = getMetaSchemaOptions(this); - - if (opts.formats) addInitialFormats(this); - if (opts.keywords) addInitialKeywords(this); - addDefaultMetaSchema(this); - if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); - if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); - addInitialSchemas(this); -} - - - -/** - * Validate data using schema - * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. - * @this Ajv - * @param {String|Object} schemaKeyRef key, ref or schema object - * @param {Any} data to be validated - * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). - */ -function validate(schemaKeyRef, data) { - var v; - if (typeof schemaKeyRef == 'string') { - v = this.getSchema(schemaKeyRef); - if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); - } else { - var schemaObj = this._addSchema(schemaKeyRef); - v = schemaObj.validate || this._compile(schemaObj); - } - - var valid = v(data); - if (v.$async !== true) this.errors = v.errors; - return valid; -} - - -/** - * Create validating function for passed schema. - * @this Ajv - * @param {Object} schema schema object - * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. - * @return {Function} validating function - */ -function compile(schema, _meta) { - var schemaObj = this._addSchema(schema, undefined, _meta); - return schemaObj.validate || this._compile(schemaObj); -} - - -/** - * Adds schema to the instance. - * @this Ajv - * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. - * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. - * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. - * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. - * @return {Ajv} this for method chaining - */ -function addSchema(schema, key, _skipValidation, _meta) { - if (Array.isArray(schema)){ - for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. - * @param {Object} options optional options with properties `separator` and `dataVar`. - * @return {String} human readable string with all errors descriptions - */ -function errorsText(errors, options) { - errors = errors || this.errors; - if (!errors) return 'No errors'; - options = options || {}; - var separator = options.separator === undefined ? ', ' : options.separator; - var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; - - var text = ''; - for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,z)+Q(l,N)+Q(m,q)+Q(v,T)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema: ",c+=y?"validate.schema"+p:""+d,c+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" } ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0 "+o.length+") { for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } } ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+=" ) ");var d=d||[];d.push(t+=" ) { "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+=" } "),(s=s||[]).push(i+=" if (!"+f+") { "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema: ",i+=m?"validate.schema"+u:""+c,i+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[""],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0; ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!Z(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; var "+F+" = undefined; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+") && "+f+".length == 1) { "+f+" = "+f+"[0]; "+_+" = typeof "+f+"; if ("+a.util.checkDataType(a.schema.type,f,a.opts.strictNumbers)+") "+F+" = "+f+"; } "),r+=" if ("+F+" !== undefined) ; ";var x=g;if(x)for(var R,$=-1,j=x.length-1;$= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1>1,e+=k(e/r);455k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(pk(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=z(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");pk((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(RA&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($>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 p(e){for(var r="",t=0,a=e.length;tA-Z\\x5E-\\x7E]",'[\\"\\\\]')),Y=new RegExp(K,"g"),W=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),X=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',G),"g"),ee=new RegExp(J("[^]",K,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),re=ee;function te(e){var r=p(e);return r.match(Y)?r:e}var ae={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n); - - message: string; - errors: Array; - ajv: true; - validation: true; - } - - class MissingRefError extends Error { - constructor(baseId: string, ref: string, message?: string); - static message: (baseId: string, ref: string) => string; - - message: string; - missingRef: string; - missingSchema: string; - } -} - -declare namespace ajv { - type ValidationError = AjvErrors.ValidationError; - - type MissingRefError = AjvErrors.MissingRefError; - - interface Ajv { - /** - * Validate data using schema - * Schema will be compiled and cached (using serialized JSON as key, [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize by default). - * @param {string|object|Boolean} schemaKeyRef key, ref or schema object - * @param {Any} data to be validated - * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). - */ - validate(schemaKeyRef: object | string | boolean, data: any): boolean | PromiseLike; - /** - * Create validating function for passed schema. - * @param {object|Boolean} schema schema object - * @return {Function} validating function - */ - compile(schema: object | boolean): ValidateFunction; - /** - * Creates validating function for passed schema with asynchronous loading of missing schemas. - * `loadSchema` option should be a function that accepts schema uri and node-style callback. - * @this Ajv - * @param {object|Boolean} schema schema object - * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped - * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function. - * @return {PromiseLike} validating function - */ - compileAsync(schema: object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): PromiseLike; - /** - * Adds schema to the instance. - * @param {object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. - * @param {string} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. - * @return {Ajv} this for method chaining - */ - addSchema(schema: Array | object, key?: string): Ajv; - /** - * Add schema that will be used to validate other schemas - * options in META_IGNORE_OPTIONS are alway set to false - * @param {object} schema schema object - * @param {string} key optional schema key - * @return {Ajv} this for method chaining - */ - addMetaSchema(schema: object, key?: string): Ajv; - /** - * Validate schema - * @param {object|Boolean} schema schema to validate - * @return {Boolean} true if schema is valid - */ - validateSchema(schema: object | boolean): boolean; - /** - * Get compiled schema from the instance by `key` or `ref`. - * @param {string} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). - * @return {Function} schema validating function (with property `schema`). Returns undefined if keyRef can't be resolved to an existing schema. - */ - getSchema(keyRef: string): ValidateFunction | undefined; - /** - * Remove cached schema(s). - * If no parameter is passed all schemas but meta-schemas are removed. - * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. - * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. - * @param {string|object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object - * @return {Ajv} this for method chaining - */ - removeSchema(schemaKeyRef?: object | string | RegExp | boolean): Ajv; - /** - * Add custom format - * @param {string} name format name - * @param {string|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) - * @return {Ajv} this for method chaining - */ - addFormat(name: string, format: FormatValidator | FormatDefinition): Ajv; - /** - * Define custom keyword - * @this Ajv - * @param {string} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords. - * @param {object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. - * @return {Ajv} this for method chaining - */ - addKeyword(keyword: string, definition: KeywordDefinition): Ajv; - /** - * Get keyword definition - * @this Ajv - * @param {string} keyword pre-defined or custom keyword. - * @return {object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise. - */ - getKeyword(keyword: string): object | boolean; - /** - * Remove keyword - * @this Ajv - * @param {string} keyword pre-defined or custom keyword. - * @return {Ajv} this for method chaining - */ - removeKeyword(keyword: string): Ajv; - /** - * Validate keyword - * @this Ajv - * @param {object} definition keyword definition object - * @param {boolean} throwError true to throw exception if definition is invalid - * @return {boolean} validation result - */ - validateKeyword(definition: KeywordDefinition, throwError: boolean): boolean; - /** - * Convert array of error message objects to string - * @param {Array} errors optional array of validation errors, if not passed errors from the instance are used. - * @param {object} options optional options with properties `separator` and `dataVar`. - * @return {string} human readable string with all errors descriptions - */ - errorsText(errors?: Array | null, options?: ErrorsTextOptions): string; - errors?: Array | null; - _opts: Options; - } - - interface CustomLogger { - log(...args: any[]): any; - warn(...args: any[]): any; - error(...args: any[]): any; - } - - interface ValidateFunction { - ( - data: any, - dataPath?: string, - parentData?: object | Array, - parentDataProperty?: string | number, - rootData?: object | Array - ): boolean | PromiseLike; - schema?: object | boolean; - errors?: null | Array; - refs?: object; - refVal?: Array; - root?: ValidateFunction | object; - $async?: true; - source?: object; - } - - interface Options { - $data?: boolean; - allErrors?: boolean; - verbose?: boolean; - jsonPointers?: boolean; - uniqueItems?: boolean; - unicode?: boolean; - format?: false | string; - formats?: object; - keywords?: object; - unknownFormats?: true | string[] | 'ignore'; - schemas?: Array | object; - schemaId?: '$id' | 'id' | 'auto'; - missingRefs?: true | 'ignore' | 'fail'; - extendRefs?: true | 'ignore' | 'fail'; - loadSchema?: (uri: string, cb?: (err: Error, schema: object) => void) => PromiseLike; - removeAdditional?: boolean | 'all' | 'failing'; - useDefaults?: boolean | 'empty' | 'shared'; - coerceTypes?: boolean | 'array'; - strictDefaults?: boolean | 'log'; - strictKeywords?: boolean | 'log'; - strictNumbers?: boolean; - async?: boolean | string; - transpile?: string | ((code: string) => string); - meta?: boolean | object; - validateSchema?: boolean | 'log'; - addUsedSchema?: boolean; - inlineRefs?: boolean | number; - passContext?: boolean; - loopRequired?: number; - ownProperties?: boolean; - multipleOfPrecision?: boolean | number; - errorDataPath?: string, - messages?: boolean; - sourceCode?: boolean; - processCode?: (code: string, schema: object) => string; - cache?: object; - logger?: CustomLogger | false; - nullable?: boolean; - serialize?: ((schema: object | boolean) => any) | false; - } - - type FormatValidator = string | RegExp | ((data: string) => boolean | PromiseLike); - type NumberFormatValidator = ((data: number) => boolean | PromiseLike); - - interface NumberFormatDefinition { - type: "number", - validate: NumberFormatValidator; - compare?: (data1: number, data2: number) => number; - async?: boolean; - } - - interface StringFormatDefinition { - type?: "string", - validate: FormatValidator; - compare?: (data1: string, data2: string) => number; - async?: boolean; - } - - type FormatDefinition = NumberFormatDefinition | StringFormatDefinition; - - interface KeywordDefinition { - type?: string | Array; - async?: boolean; - $data?: boolean; - errors?: boolean | string; - metaSchema?: object; - // schema: false makes validate not to expect schema (ValidateFunction) - schema?: boolean; - statements?: boolean; - dependencies?: Array; - modifying?: boolean; - valid?: boolean; - // one and only one of the following properties should be present - validate?: SchemaValidateFunction | ValidateFunction; - compile?: (schema: any, parentSchema: object, it: CompilationContext) => ValidateFunction; - macro?: (schema: any, parentSchema: object, it: CompilationContext) => object | boolean; - inline?: (it: CompilationContext, keyword: string, schema: any, parentSchema: object) => string; - } - - interface CompilationContext { - level: number; - dataLevel: number; - dataPathArr: string[]; - schema: any; - schemaPath: string; - baseId: string; - async: boolean; - opts: Options; - formats: { - [index: string]: FormatDefinition | undefined; - }; - keywords: { - [index: string]: KeywordDefinition | undefined; - }; - compositeRule: boolean; - validate: (schema: object) => boolean; - util: { - copy(obj: any, target?: any): any; - toHash(source: string[]): { [index: string]: true | undefined }; - equal(obj: any, target: any): boolean; - getProperty(str: string): string; - schemaHasRules(schema: object, rules: any): string; - escapeQuotes(str: string): string; - toQuotedString(str: string): string; - getData(jsonPointer: string, dataLevel: number, paths: string[]): string; - escapeJsonPointer(str: string): string; - unescapeJsonPointer(str: string): string; - escapeFragment(str: string): string; - unescapeFragment(str: string): string; - }; - self: Ajv; - } - - interface SchemaValidateFunction { - ( - schema: any, - data: any, - parentSchema?: object, - dataPath?: string, - parentData?: object | Array, - parentDataProperty?: string | number, - rootData?: object | Array - ): boolean | PromiseLike; - errors?: Array; - } - - interface ErrorsTextOptions { - separator?: string; - dataVar?: string; - } - - interface ErrorObject { - keyword: string; - dataPath: string; - schemaPath: string; - params: ErrorParameters; - // Added to validation errors of propertyNames keyword schema - propertyName?: string; - // Excluded if messages set to false. - message?: string; - // These are added with the `verbose` option. - schema?: any; - parentSchema?: object; - data?: any; - } - - type ErrorParameters = RefParams | LimitParams | AdditionalPropertiesParams | - DependenciesParams | FormatParams | ComparisonParams | - MultipleOfParams | PatternParams | RequiredParams | - TypeParams | UniqueItemsParams | CustomParams | - PatternRequiredParams | PropertyNamesParams | - IfParams | SwitchParams | NoParams | EnumParams; - - interface RefParams { - ref: string; - } - - interface LimitParams { - limit: number; - } - - interface AdditionalPropertiesParams { - additionalProperty: string; - } - - interface DependenciesParams { - property: string; - missingProperty: string; - depsCount: number; - deps: string; - } - - interface FormatParams { - format: string - } - - interface ComparisonParams { - comparison: string; - limit: number | string; - exclusive: boolean; - } - - interface MultipleOfParams { - multipleOf: number; - } - - interface PatternParams { - pattern: string; - } - - interface RequiredParams { - missingProperty: string; - } - - interface TypeParams { - type: string; - } - - interface UniqueItemsParams { - i: number; - j: number; - } - - interface CustomParams { - keyword: string; - } - - interface PatternRequiredParams { - missingPattern: string; - } - - interface PropertyNamesParams { - propertyName: string; - } - - interface IfParams { - failingKeyword: string; - } - - interface SwitchParams { - caseIndex: number; - } - - interface NoParams { } - - interface EnumParams { - allowedValues: Array; - } -} - -export = ajv; diff --git a/node_modules/ajv/lib/ajv.js b/node_modules/ajv/lib/ajv.js deleted file mode 100644 index 06a45b65..00000000 --- a/node_modules/ajv/lib/ajv.js +++ /dev/null @@ -1,506 +0,0 @@ -'use strict'; - -var compileSchema = require('./compile') - , resolve = require('./compile/resolve') - , Cache = require('./cache') - , SchemaObject = require('./compile/schema_obj') - , stableStringify = require('fast-json-stable-stringify') - , formats = require('./compile/formats') - , rules = require('./compile/rules') - , $dataMetaSchema = require('./data') - , util = require('./compile/util'); - -module.exports = Ajv; - -Ajv.prototype.validate = validate; -Ajv.prototype.compile = compile; -Ajv.prototype.addSchema = addSchema; -Ajv.prototype.addMetaSchema = addMetaSchema; -Ajv.prototype.validateSchema = validateSchema; -Ajv.prototype.getSchema = getSchema; -Ajv.prototype.removeSchema = removeSchema; -Ajv.prototype.addFormat = addFormat; -Ajv.prototype.errorsText = errorsText; - -Ajv.prototype._addSchema = _addSchema; -Ajv.prototype._compile = _compile; - -Ajv.prototype.compileAsync = require('./compile/async'); -var customKeyword = require('./keyword'); -Ajv.prototype.addKeyword = customKeyword.add; -Ajv.prototype.getKeyword = customKeyword.get; -Ajv.prototype.removeKeyword = customKeyword.remove; -Ajv.prototype.validateKeyword = customKeyword.validate; - -var errorClasses = require('./compile/error_classes'); -Ajv.ValidationError = errorClasses.Validation; -Ajv.MissingRefError = errorClasses.MissingRef; -Ajv.$dataMetaSchema = $dataMetaSchema; - -var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; - -var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; -var META_SUPPORT_DATA = ['/properties']; - -/** - * Creates validator instance. - * Usage: `Ajv(opts)` - * @param {Object} opts optional options - * @return {Object} ajv instance - */ -function Ajv(opts) { - if (!(this instanceof Ajv)) return new Ajv(opts); - opts = this._opts = util.copy(opts) || {}; - setLogger(this); - this._schemas = {}; - this._refs = {}; - this._fragments = {}; - this._formats = formats(opts.format); - - this._cache = opts.cache || new Cache; - this._loadingSchemas = {}; - this._compilations = []; - this.RULES = rules(); - this._getId = chooseGetId(opts); - - opts.loopRequired = opts.loopRequired || Infinity; - if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; - if (opts.serialize === undefined) opts.serialize = stableStringify; - this._metaOpts = getMetaSchemaOptions(this); - - if (opts.formats) addInitialFormats(this); - if (opts.keywords) addInitialKeywords(this); - addDefaultMetaSchema(this); - if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); - if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); - addInitialSchemas(this); -} - - - -/** - * Validate data using schema - * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. - * @this Ajv - * @param {String|Object} schemaKeyRef key, ref or schema object - * @param {Any} data to be validated - * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). - */ -function validate(schemaKeyRef, data) { - var v; - if (typeof schemaKeyRef == 'string') { - v = this.getSchema(schemaKeyRef); - if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); - } else { - var schemaObj = this._addSchema(schemaKeyRef); - v = schemaObj.validate || this._compile(schemaObj); - } - - var valid = v(data); - if (v.$async !== true) this.errors = v.errors; - return valid; -} - - -/** - * Create validating function for passed schema. - * @this Ajv - * @param {Object} schema schema object - * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. - * @return {Function} validating function - */ -function compile(schema, _meta) { - var schemaObj = this._addSchema(schema, undefined, _meta); - return schemaObj.validate || this._compile(schemaObj); -} - - -/** - * Adds schema to the instance. - * @this Ajv - * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. - * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. - * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. - * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. - * @return {Ajv} this for method chaining - */ -function addSchema(schema, key, _skipValidation, _meta) { - if (Array.isArray(schema)){ - for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. - * @param {Object} options optional options with properties `separator` and `dataVar`. - * @return {String} human readable string with all errors descriptions - */ -function errorsText(errors, options) { - errors = errors || this.errors; - if (!errors) return 'No errors'; - options = options || {}; - var separator = options.separator === undefined ? ', ' : options.separator; - var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; - - var text = ''; - for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; -// For the source: https://gist.github.com/dperini/729294 -// For test cases: https://mathiasbynens.be/demo/url-regex -// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. -// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; -var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; -var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; -var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; -var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; -var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; - - -module.exports = formats; - -function formats(mode) { - mode = mode == 'full' ? 'full' : 'fast'; - return util.copy(formats[mode]); -} - - -formats.fast = { - // date: http://tools.ietf.org/html/rfc3339#section-5.6 - date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, - // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 - time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, - 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, - // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js - uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, - 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, - 'uri-template': URITEMPLATE, - url: URL, - // email (sources from jsen validator): - // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 - // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') - email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, - hostname: HOSTNAME, - // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - // uuid: http://tools.ietf.org/html/rfc4122 - uuid: UUID, - // JSON-pointer: https://tools.ietf.org/html/rfc6901 - // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A - 'json-pointer': JSON_POINTER, - 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, - // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -formats.full = { - date: date, - time: time, - 'date-time': date_time, - uri: uri, - 'uri-reference': URIREF, - 'uri-template': URITEMPLATE, - url: URL, - email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, - hostname: HOSTNAME, - ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, - ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, - regex: regex, - uuid: UUID, - 'json-pointer': JSON_POINTER, - 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, - 'relative-json-pointer': RELATIVE_JSON_POINTER -}; - - -function isLeapYear(year) { - // https://tools.ietf.org/html/rfc3339#appendix-C - return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -} - - -function date(str) { - // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 - var matches = str.match(DATE); - if (!matches) return false; - - var year = +matches[1]; - var month = +matches[2]; - var day = +matches[3]; - - return month >= 1 && month <= 12 && day >= 1 && - day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); -} - - -function time(str, full) { - var matches = str.match(TIME); - if (!matches) return false; - - var hour = matches[1]; - var minute = matches[2]; - var second = matches[3]; - var timeZone = matches[5]; - return ((hour <= 23 && minute <= 59 && second <= 59) || - (hour == 23 && minute == 59 && second == 60)) && - (!full || timeZone); -} - - -var DATE_TIME_SEPARATOR = /t|\s/i; -function date_time(str) { - // http://tools.ietf.org/html/rfc3339#section-5.6 - var dateTime = str.split(DATE_TIME_SEPARATOR); - return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); -} - - -var NOT_URI_FRAGMENT = /\/|:/; -function uri(str) { - // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." - return NOT_URI_FRAGMENT.test(str) && URI.test(str); -} - - -var Z_ANCHOR = /[^\\]\\Z/; -function regex(str) { - if (Z_ANCHOR.test(str)) return false; - try { - new RegExp(str); - return true; - } catch(e) { - return false; - } -} diff --git a/node_modules/ajv/lib/compile/index.js b/node_modules/ajv/lib/compile/index.js deleted file mode 100644 index 97518c42..00000000 --- a/node_modules/ajv/lib/compile/index.js +++ /dev/null @@ -1,387 +0,0 @@ -'use strict'; - -var resolve = require('./resolve') - , util = require('./util') - , errorClasses = require('./error_classes') - , stableStringify = require('fast-json-stable-stringify'); - -var validateGenerator = require('../dotjs/validate'); - -/** - * Functions below are used inside compiled validations function - */ - -var ucs2length = util.ucs2length; -var equal = require('fast-deep-equal'); - -// this error is thrown by async schemas to return validation errors via exception -var ValidationError = errorClasses.Validation; - -module.exports = compile; - - -/** - * Compiles schema to validation function - * @this Ajv - * @param {Object} schema schema object - * @param {Object} root object with information about the root schema for this schema - * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution - * @param {String} baseId base ID for IDs in the schema - * @return {Function} validation function - */ -function compile(schema, root, localRefs, baseId) { - /* jshint validthis: true, evil: true */ - /* eslint no-shadow: 0 */ - var self = this - , opts = this._opts - , refVal = [ undefined ] - , refs = {} - , patterns = [] - , patternsHash = {} - , defaults = [] - , defaultsHash = {} - , customRules = []; - - root = root || { schema: schema, refVal: refVal, refs: refs }; - - var c = checkCompiling.call(this, schema, root, baseId); - var compilation = this._compilations[c.index]; - if (c.compiling) return (compilation.callValidate = callValidate); - - var formats = this._formats; - var RULES = this.RULES; - - try { - var v = localCompile(schema, root, localRefs, baseId); - compilation.validate = v; - var cv = compilation.callValidate; - if (cv) { - cv.schema = v.schema; - cv.errors = null; - cv.refs = v.refs; - cv.refVal = v.refVal; - cv.root = v.root; - cv.$async = v.$async; - if (opts.sourceCode) cv.source = v.source; - } - return v; - } finally { - endCompiling.call(this, schema, root, baseId); - } - - /* @this {*} - custom context, see passContext option */ - function callValidate() { - /* jshint validthis: true */ - var validate = compilation.validate; - var result = validate.apply(this, arguments); - callValidate.errors = validate.errors; - return result; - } - - function localCompile(_schema, _root, localRefs, baseId) { - var isRoot = !_root || (_root && _root.schema == _schema); - if (_root.schema != root.schema) - return compile.call(self, _schema, _root, localRefs, baseId); - - var $async = _schema.$async === true; - - var sourceCode = validateGenerator({ - isTop: true, - schema: _schema, - isRoot: isRoot, - baseId: baseId, - root: _root, - schemaPath: '', - errSchemaPath: '#', - errorPath: '""', - MissingRefError: errorClasses.MissingRef, - RULES: RULES, - validate: validateGenerator, - util: util, - resolve: resolve, - resolveRef: resolveRef, - usePattern: usePattern, - useDefault: useDefault, - useCustomRule: useCustomRule, - opts: opts, - formats: formats, - logger: self.logger, - self: self - }); - - sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) - + vars(defaults, defaultCode) + vars(customRules, customRuleCode) - + sourceCode; - - if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); - // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); - var validate; - try { - var makeValidate = new Function( - 'self', - 'RULES', - 'formats', - 'root', - 'refVal', - 'defaults', - 'customRules', - 'equal', - 'ucs2length', - 'ValidationError', - sourceCode - ); - - validate = makeValidate( - self, - RULES, - formats, - root, - refVal, - defaults, - customRules, - equal, - ucs2length, - ValidationError - ); - - refVal[0] = validate; - } catch(e) { - self.logger.error('Error compiling schema, function code:', sourceCode); - throw e; - } - - validate.schema = _schema; - validate.errors = null; - validate.refs = refs; - validate.refVal = refVal; - validate.root = isRoot ? validate : _root; - if ($async) validate.$async = true; - if (opts.sourceCode === true) { - validate.source = { - code: sourceCode, - patterns: patterns, - defaults: defaults - }; - } - - return validate; - } - - function resolveRef(baseId, ref, isRoot) { - ref = resolve.url(baseId, ref); - var refIndex = refs[ref]; - var _refVal, refCode; - if (refIndex !== undefined) { - _refVal = refVal[refIndex]; - refCode = 'refVal[' + refIndex + ']'; - return resolvedRef(_refVal, refCode); - } - if (!isRoot && root.refs) { - var rootRefId = root.refs[ref]; - if (rootRefId !== undefined) { - _refVal = root.refVal[rootRefId]; - refCode = addLocalRef(ref, _refVal); - return resolvedRef(_refVal, refCode); - } - } - - refCode = addLocalRef(ref); - var v = resolve.call(self, localCompile, root, ref); - if (v === undefined) { - var localSchema = localRefs && localRefs[ref]; - if (localSchema) { - v = resolve.inlineRef(localSchema, opts.inlineRefs) - ? localSchema - : compile.call(self, localSchema, root, localRefs, baseId); - } - } - - if (v === undefined) { - removeLocalRef(ref); - } else { - replaceLocalRef(ref, v); - return resolvedRef(v, refCode); - } - } - - function addLocalRef(ref, v) { - var refId = refVal.length; - refVal[refId] = v; - refs[ref] = refId; - return 'refVal' + refId; - } - - function removeLocalRef(ref) { - delete refs[ref]; - } - - function replaceLocalRef(ref, v) { - var refId = refs[ref]; - refVal[refId] = v; - } - - function resolvedRef(refVal, code) { - return typeof refVal == 'object' || typeof refVal == 'boolean' - ? { code: code, schema: refVal, inline: true } - : { code: code, $async: refVal && !!refVal.$async }; - } - - function usePattern(regexStr) { - var index = patternsHash[regexStr]; - if (index === undefined) { - index = patternsHash[regexStr] = patterns.length; - patterns[index] = regexStr; - } - return 'pattern' + index; - } - - function useDefault(value) { - switch (typeof value) { - case 'boolean': - case 'number': - return '' + value; - case 'string': - return util.toQuotedString(value); - case 'object': - if (value === null) return 'null'; - var valueStr = stableStringify(value); - var index = defaultsHash[valueStr]; - if (index === undefined) { - index = defaultsHash[valueStr] = defaults.length; - defaults[index] = value; - } - return 'default' + index; - } - } - - function useCustomRule(rule, schema, parentSchema, it) { - if (self._opts.validateSchema !== false) { - var deps = rule.definition.dependencies; - if (deps && !deps.every(function(keyword) { - return Object.prototype.hasOwnProperty.call(parentSchema, keyword); - })) - throw new Error('parent schema must have all required keywords: ' + deps.join(',')); - - var validateSchema = rule.definition.validateSchema; - if (validateSchema) { - var valid = validateSchema(schema); - if (!valid) { - var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); - if (self._opts.validateSchema == 'log') self.logger.error(message); - else throw new Error(message); - } - } - } - - var compile = rule.definition.compile - , inline = rule.definition.inline - , macro = rule.definition.macro; - - var validate; - if (compile) { - validate = compile.call(self, schema, parentSchema, it); - } else if (macro) { - validate = macro.call(self, schema, parentSchema, it); - if (opts.validateSchema !== false) self.validateSchema(validate, true); - } else if (inline) { - validate = inline.call(self, it, rule.keyword, schema, parentSchema); - } else { - validate = rule.definition.validate; - if (!validate) return; - } - - if (validate === undefined) - throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); - - var index = customRules.length; - customRules[index] = validate; - - return { - code: 'customRule' + index, - validate: validate - }; - } -} - - -/** - * Checks if the schema is currently compiled - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) - */ -function checkCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var index = compIndex.call(this, schema, root, baseId); - if (index >= 0) return { index: index, compiling: true }; - index = this._compilations.length; - this._compilations[index] = { - schema: schema, - root: root, - baseId: baseId - }; - return { index: index, compiling: false }; -} - - -/** - * Removes the schema from the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - */ -function endCompiling(schema, root, baseId) { - /* jshint validthis: true */ - var i = compIndex.call(this, schema, root, baseId); - if (i >= 0) this._compilations.splice(i, 1); -} - - -/** - * Index of schema compilation in the currently compiled list - * @this Ajv - * @param {Object} schema schema to compile - * @param {Object} root root object - * @param {String} baseId base schema ID - * @return {Integer} compilation index - */ -function compIndex(schema, root, baseId) { - /* jshint validthis: true */ - for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { - // high surrogate, and there is a next character - value = str.charCodeAt(pos); - if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate - } - } - return length; -}; diff --git a/node_modules/ajv/lib/compile/util.js b/node_modules/ajv/lib/compile/util.js deleted file mode 100644 index ef07b8c7..00000000 --- a/node_modules/ajv/lib/compile/util.js +++ /dev/null @@ -1,239 +0,0 @@ -'use strict'; - - -module.exports = { - copy: copy, - checkDataType: checkDataType, - checkDataTypes: checkDataTypes, - coerceToTypes: coerceToTypes, - toHash: toHash, - getProperty: getProperty, - escapeQuotes: escapeQuotes, - equal: require('fast-deep-equal'), - ucs2length: require('./ucs2length'), - varOccurences: varOccurences, - varReplace: varReplace, - schemaHasRules: schemaHasRules, - schemaHasRulesExcept: schemaHasRulesExcept, - schemaUnknownRules: schemaUnknownRules, - toQuotedString: toQuotedString, - getPathExpr: getPathExpr, - getPath: getPath, - getData: getData, - unescapeFragment: unescapeFragment, - unescapeJsonPointer: unescapeJsonPointer, - escapeFragment: escapeFragment, - escapeJsonPointer: escapeJsonPointer -}; - - -function copy(o, to) { - to = to || {}; - for (var key in o) to[key] = o[key]; - return to; -} - - -function checkDataType(dataType, data, strictNumbers, negate) { - var EQUAL = negate ? ' !== ' : ' === ' - , AND = negate ? ' || ' : ' && ' - , OK = negate ? '!' : '' - , NOT = negate ? '' : '!'; - switch (dataType) { - case 'null': return data + EQUAL + 'null'; - case 'array': return OK + 'Array.isArray(' + data + ')'; - case 'object': return '(' + OK + data + AND + - 'typeof ' + data + EQUAL + '"object"' + AND + - NOT + 'Array.isArray(' + data + '))'; - case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + - NOT + '(' + data + ' % 1)' + - AND + data + EQUAL + data + - (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; - case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + - (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; - default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; - } -} - - -function checkDataTypes(dataTypes, data, strictNumbers) { - switch (dataTypes.length) { - case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); - default: - var code = ''; - var types = toHash(dataTypes); - if (types.array && types.object) { - code = types.null ? '(': '(!' + data + ' || '; - code += 'typeof ' + data + ' !== "object")'; - delete types.null; - delete types.array; - delete types.object; - } - if (types.number) delete types.integer; - for (var t in types) - code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); - - return code; - } -} - - -var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); -function coerceToTypes(optionCoerceTypes, dataTypes) { - if (Array.isArray(dataTypes)) { - var types = []; - for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); - return paths[lvl - up]; - } - - if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); - data = 'data' + ((lvl - up) || ''); - if (!jsonPointer) return data; - } - - var expr = data; - var segments = jsonPointer.split('/'); - for (var i=0; i' - , $notOp = $isMax ? '>' : '<' - , $errorKeyword = undefined; - - if (!($isData || typeof $schema == 'number' || $schema === undefined)) { - throw new Error($keyword + ' must be number'); - } - if (!($isDataExcl || $schemaExcl === undefined - || typeof $schemaExcl == 'number' - || typeof $schemaExcl == 'boolean')) { - throw new Error($exclusiveKeyword + ' must be number or boolean'); - } -}} - -{{? $isDataExcl }} - {{ - var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr) - , $exclusive = 'exclusive' + $lvl - , $exclType = 'exclType' + $lvl - , $exclIsNumber = 'exclIsNumber' + $lvl - , $opExpr = 'op' + $lvl - , $opStr = '\' + ' + $opExpr + ' + \''; - }} - var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}}; - {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} - - var {{=$exclusive}}; - var {{=$exclType}} = typeof {{=$schemaValueExcl}}; - if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') { - {{ var $errorKeyword = $exclusiveKeyword; }} - {{# def.error:'_exclusiveLimit' }} - } else if ({{# def.$dataNotType:'number' }} - {{=$exclType}} == 'number' - ? ( - ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}}) - ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}} - : {{=$data}} {{=$notOp}} {{=$schemaValue}} - ) - : ( - ({{=$exclusive}} = {{=$schemaValueExcl}} === true) - ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} - : {{=$data}} {{=$notOp}} {{=$schemaValue}} - ) - || {{=$data}} !== {{=$data}}) { - var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}='; - {{ - if ($schema === undefined) { - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaValueExcl; - $isData = $isDataExcl; - } - }} -{{??}} - {{ - var $exclIsNumber = typeof $schemaExcl == 'number' - , $opStr = $op; /*used in error*/ - }} - - {{? $exclIsNumber && $isData }} - {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }} - if ({{# def.$dataNotType:'number' }} - ( {{=$schemaValue}} === undefined - || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}} - ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}} - : {{=$data}} {{=$notOp}} {{=$schemaValue}} ) - || {{=$data}} !== {{=$data}}) { - {{??}} - {{ - if ($exclIsNumber && $schema === undefined) { - {{# def.setExclusiveLimit }} - $schemaValue = $schemaExcl; - $notOp += '='; - } else { - if ($exclIsNumber) - $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); - - if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { - {{# def.setExclusiveLimit }} - $notOp += '='; - } else { - $exclusive = false; - $opStr += '='; - } - } - - var $opExpr = '\'' + $opStr + '\''; /*used in error*/ - }} - - if ({{# def.$dataNotType:'number' }} - {{=$data}} {{=$notOp}} {{=$schemaValue}} - || {{=$data}} !== {{=$data}}) { - {{?}} -{{?}} - {{ $errorKeyword = $errorKeyword || $keyword; }} - {{# def.error:'_limit' }} - } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitItems.jst b/node_modules/ajv/lib/dot/_limitItems.jst deleted file mode 100644 index 741329e7..00000000 --- a/node_modules/ajv/lib/dot/_limitItems.jst +++ /dev/null @@ -1,12 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{# def.numberKeyword }} - -{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }} -if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) { - {{ var $errorKeyword = $keyword; }} - {{# def.error:'_limitItems' }} -} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitLength.jst b/node_modules/ajv/lib/dot/_limitLength.jst deleted file mode 100644 index 285c66bd..00000000 --- a/node_modules/ajv/lib/dot/_limitLength.jst +++ /dev/null @@ -1,12 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{# def.numberKeyword }} - -{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }} -if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) { - {{ var $errorKeyword = $keyword; }} - {{# def.error:'_limitLength' }} -} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/_limitProperties.jst b/node_modules/ajv/lib/dot/_limitProperties.jst deleted file mode 100644 index c4c21551..00000000 --- a/node_modules/ajv/lib/dot/_limitProperties.jst +++ /dev/null @@ -1,12 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{# def.numberKeyword }} - -{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }} -if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) { - {{ var $errorKeyword = $keyword; }} - {{# def.error:'_limitProperties' }} -} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/allOf.jst b/node_modules/ajv/lib/dot/allOf.jst deleted file mode 100644 index 0e782fe9..00000000 --- a/node_modules/ajv/lib/dot/allOf.jst +++ /dev/null @@ -1,32 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - -{{ - var $currentBaseId = $it.baseId - , $allSchemasEmpty = true; -}} - -{{~ $schema:$sch:$i }} - {{? {{# def.nonEmptySchema:$sch }} }} - {{ - $allSchemasEmpty = false; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - }} - - {{# def.insertSubschemaCode }} - - {{# def.ifResultValid }} - {{?}} -{{~}} - -{{? $breakOnError }} - {{? $allSchemasEmpty }} - if (true) { - {{??}} - {{= $closingBraces.slice(0,-1) }} - {{?}} -{{?}} diff --git a/node_modules/ajv/lib/dot/anyOf.jst b/node_modules/ajv/lib/dot/anyOf.jst deleted file mode 100644 index ea909ee6..00000000 --- a/node_modules/ajv/lib/dot/anyOf.jst +++ /dev/null @@ -1,46 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - -{{ - var $noEmptySchema = $schema.every(function($sch) { - return {{# def.nonEmptySchema:$sch }}; - }); -}} -{{? $noEmptySchema }} - {{ var $currentBaseId = $it.baseId; }} - var {{=$errs}} = errors; - var {{=$valid}} = false; - - {{# def.setCompositeRule }} - - {{~ $schema:$sch:$i }} - {{ - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - }} - - {{# def.insertSubschemaCode }} - - {{=$valid}} = {{=$valid}} || {{=$nextValid}}; - - if (!{{=$valid}}) { - {{ $closingBraces += '}'; }} - {{~}} - - {{# def.resetCompositeRule }} - - {{= $closingBraces }} - - if (!{{=$valid}}) { - {{# def.extraError:'anyOf' }} - } else { - {{# def.resetErrors }} - {{? it.opts.allErrors }} } {{?}} -{{??}} - {{? $breakOnError }} - if (true) { - {{?}} -{{?}} diff --git a/node_modules/ajv/lib/dot/coerce.def b/node_modules/ajv/lib/dot/coerce.def deleted file mode 100644 index c947ed6a..00000000 --- a/node_modules/ajv/lib/dot/coerce.def +++ /dev/null @@ -1,51 +0,0 @@ -{{## def.coerceType: - {{ - var $dataType = 'dataType' + $lvl - , $coerced = 'coerced' + $lvl; - }} - var {{=$dataType}} = typeof {{=$data}}; - var {{=$coerced}} = undefined; - - {{? it.opts.coerceTypes == 'array' }} - if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) { - {{=$data}} = {{=$data}}[0]; - {{=$dataType}} = typeof {{=$data}}; - if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}}; - } - {{?}} - - if ({{=$coerced}} !== undefined) ; - {{~ $coerceToTypes:$type:$i }} - {{? $type == 'string' }} - else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean') - {{=$coerced}} = '' + {{=$data}}; - else if ({{=$data}} === null) {{=$coerced}} = ''; - {{?? $type == 'number' || $type == 'integer' }} - else if ({{=$dataType}} == 'boolean' || {{=$data}} === null - || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}} - {{? $type == 'integer' }} && !({{=$data}} % 1){{?}})) - {{=$coerced}} = +{{=$data}}; - {{?? $type == 'boolean' }} - else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null) - {{=$coerced}} = false; - else if ({{=$data}} === 'true' || {{=$data}} === 1) - {{=$coerced}} = true; - {{?? $type == 'null' }} - else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false) - {{=$coerced}} = null; - {{?? it.opts.coerceTypes == 'array' && $type == 'array' }} - else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null) - {{=$coerced}} = [{{=$data}}]; - {{?}} - {{~}} - else { - {{# def.error:'type' }} - } - - if ({{=$coerced}} !== undefined) { - {{# def.setParentData }} - {{=$data}} = {{=$coerced}}; - {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}} - {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}}; - } -#}} diff --git a/node_modules/ajv/lib/dot/comment.jst b/node_modules/ajv/lib/dot/comment.jst deleted file mode 100644 index f9591503..00000000 --- a/node_modules/ajv/lib/dot/comment.jst +++ /dev/null @@ -1,9 +0,0 @@ -{{# def.definitions }} -{{# def.setupKeyword }} - -{{ var $comment = it.util.toQuotedString($schema); }} -{{? it.opts.$comment === true }} - console.log({{=$comment}}); -{{?? typeof it.opts.$comment == 'function' }} - self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema); -{{?}} diff --git a/node_modules/ajv/lib/dot/const.jst b/node_modules/ajv/lib/dot/const.jst deleted file mode 100644 index 2aa22980..00000000 --- a/node_modules/ajv/lib/dot/const.jst +++ /dev/null @@ -1,11 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{? !$isData }} - var schema{{=$lvl}} = validate.schema{{=$schemaPath}}; -{{?}} -var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}}); -{{# def.checkError:'const' }} -{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/contains.jst b/node_modules/ajv/lib/dot/contains.jst deleted file mode 100644 index 4dc99674..00000000 --- a/node_modules/ajv/lib/dot/contains.jst +++ /dev/null @@ -1,55 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{ - var $idx = 'i' + $lvl - , $dataNxt = $it.dataLevel = it.dataLevel + 1 - , $nextData = 'data' + $dataNxt - , $currentBaseId = it.baseId - , $nonEmptySchema = {{# def.nonEmptySchema:$schema }}; -}} - -var {{=$errs}} = errors; -var {{=$valid}}; - -{{? $nonEmptySchema }} - {{# def.setCompositeRule }} - - {{ - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - }} - - var {{=$nextValid}} = false; - - for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { - {{ - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - }} - - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} - - if ({{=$nextValid}}) break; - } - - {{# def.resetCompositeRule }} - {{= $closingBraces }} - - if (!{{=$nextValid}}) { -{{??}} - if ({{=$data}}.length == 0) { -{{?}} - - {{# def.error:'contains' }} - } else { - {{? $nonEmptySchema }} - {{# def.resetErrors }} - {{?}} - {{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/custom.jst b/node_modules/ajv/lib/dot/custom.jst deleted file mode 100644 index d30588fb..00000000 --- a/node_modules/ajv/lib/dot/custom.jst +++ /dev/null @@ -1,191 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{ - var $rule = this - , $definition = 'definition' + $lvl - , $rDef = $rule.definition - , $closingBraces = ''; - var $validate = $rDef.validate; - var $compile, $inline, $macro, $ruleValidate, $validateCode; -}} - -{{? $isData && $rDef.$data }} - {{ - $validateCode = 'keywordValidate' + $lvl; - var $validateSchema = $rDef.validateSchema; - }} - var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition; - var {{=$validateCode}} = {{=$definition}}.validate; -{{??}} - {{ - $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); - if (!$ruleValidate) return; - $schemaValue = 'validate.schema' + $schemaPath; - $validateCode = $ruleValidate.code; - $compile = $rDef.compile; - $inline = $rDef.inline; - $macro = $rDef.macro; - }} -{{?}} - -{{ - var $ruleErrs = $validateCode + '.errors' - , $i = 'i' + $lvl - , $ruleErr = 'ruleErr' + $lvl - , $asyncKeyword = $rDef.async; - - if ($asyncKeyword && !it.async) - throw new Error('async keyword in sync schema'); -}} - - -{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}} -var {{=$errs}} = errors; -var {{=$valid}}; - -{{## def.callRuleValidate: - {{=$validateCode}}.call( - {{? it.opts.passContext }}this{{??}}self{{?}} - {{? $compile || $rDef.schema === false }} - , {{=$data}} - {{??}} - , {{=$schemaValue}} - , {{=$data}} - , validate.schema{{=it.schemaPath}} - {{?}} - , {{# def.dataPath }} - {{# def.passParentData }} - , rootData - ) -#}} - -{{## def.extendErrors:_inline: - for (var {{=$i}}={{=$errs}}; {{=$i}} 0) - || _schema === false - : it.util.schemaHasRules(_schema, it.RULES.all)) -#}} - - -{{## def.strLength: - {{? it.opts.unicode === false }} - {{=$data}}.length - {{??}} - ucs2length({{=$data}}) - {{?}} -#}} - - -{{## def.willOptimize: - it.util.varOccurences($code, $nextData) < 2 -#}} - - -{{## def.generateSubschemaCode: - {{ - var $code = it.validate($it); - $it.baseId = $currentBaseId; - }} -#}} - - -{{## def.insertSubschemaCode: - {{= it.validate($it) }} - {{ $it.baseId = $currentBaseId; }} -#}} - - -{{## def._optimizeValidate: - it.util.varReplace($code, $nextData, $passData) -#}} - - -{{## def.optimizeValidate: - {{? {{# def.willOptimize}} }} - {{= {{# def._optimizeValidate }} }} - {{??}} - var {{=$nextData}} = {{=$passData}}; - {{= $code }} - {{?}} -#}} - - -{{## def.$data: - {{ - var $isData = it.opts.$data && $schema && $schema.$data - , $schemaValue; - }} - {{? $isData }} - var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }}; - {{ $schemaValue = 'schema' + $lvl; }} - {{??}} - {{ $schemaValue = $schema; }} - {{?}} -#}} - - -{{## def.$dataNotType:_type: - {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}} -#}} - - -{{## def.check$dataIsArray: - if (schema{{=$lvl}} === undefined) {{=$valid}} = true; - else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false; - else { -#}} - - -{{## def.numberKeyword: - {{? !($isData || typeof $schema == 'number') }} - {{ throw new Error($keyword + ' must be number'); }} - {{?}} -#}} - - -{{## def.beginDefOut: - {{ - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - }} -#}} - - -{{## def.storeDefOut:_variable: - {{ - var _variable = out; - out = $$outStack.pop(); - }} -#}} - - -{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}} - -{{## def.setParentData: - {{ - var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData' - , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - }} -#}} - -{{## def.passParentData: - {{# def.setParentData }} - , {{= $parentData }} - , {{= $parentDataProperty }} -#}} - - -{{## def.iterateProperties: - {{? $ownProperties }} - {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); - for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { - var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; - {{??}} - for (var {{=$key}} in {{=$data}}) { - {{?}} -#}} - - -{{## def.noPropertyInData: - {{=$useData}} === undefined - {{? $ownProperties }} - || !{{# def.isOwnProperty }} - {{?}} -#}} - - -{{## def.isOwnProperty: - Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') -#}} diff --git a/node_modules/ajv/lib/dot/dependencies.jst b/node_modules/ajv/lib/dot/dependencies.jst deleted file mode 100644 index e4bdddec..00000000 --- a/node_modules/ajv/lib/dot/dependencies.jst +++ /dev/null @@ -1,79 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.missing }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{## def.propertyInData: - {{=$data}}{{= it.util.getProperty($property) }} !== undefined - {{? $ownProperties }} - && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}') - {{?}} -#}} - - -{{ - var $schemaDeps = {} - , $propertyDeps = {} - , $ownProperties = it.opts.ownProperties; - - for ($property in $schema) { - if ($property == '__proto__') continue; - var $sch = $schema[$property]; - var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; - $deps[$property] = $sch; - } -}} - -var {{=$errs}} = errors; - -{{ var $currentErrorPath = it.errorPath; }} - -var missing{{=$lvl}}; -{{ for (var $property in $propertyDeps) { }} - {{ $deps = $propertyDeps[$property]; }} - {{? $deps.length }} - if ({{# def.propertyInData }} - {{? $breakOnError }} - && ({{# def.checkMissingProperty:$deps }})) { - {{# def.errorMissingProperty:'dependencies' }} - {{??}} - ) { - {{~ $deps:$propertyKey }} - {{# def.allErrorsMissingProperty:'dependencies' }} - {{~}} - {{?}} - } {{# def.elseIfValid }} - {{?}} -{{ } }} - -{{ - it.errorPath = $currentErrorPath; - var $currentBaseId = $it.baseId; -}} - - -{{ for (var $property in $schemaDeps) { }} - {{ var $sch = $schemaDeps[$property]; }} - {{? {{# def.nonEmptySchema:$sch }} }} - {{=$nextValid}} = true; - - if ({{# def.propertyInData }}) { - {{ - $it.schema = $sch; - $it.schemaPath = $schemaPath + it.util.getProperty($property); - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); - }} - - {{# def.insertSubschemaCode }} - } - - {{# def.ifResultValid }} - {{?}} -{{ } }} - -{{? $breakOnError }} - {{= $closingBraces }} - if ({{=$errs}} == errors) { -{{?}} diff --git a/node_modules/ajv/lib/dot/enum.jst b/node_modules/ajv/lib/dot/enum.jst deleted file mode 100644 index 357c2e8c..00000000 --- a/node_modules/ajv/lib/dot/enum.jst +++ /dev/null @@ -1,30 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{ - var $i = 'i' + $lvl - , $vSchema = 'schema' + $lvl; -}} - -{{? !$isData }} - var {{=$vSchema}} = validate.schema{{=$schemaPath}}; -{{?}} -var {{=$valid}}; - -{{?$isData}}{{# def.check$dataIsArray }}{{?}} - -{{=$valid}} = false; - -for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++) - if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) { - {{=$valid}} = true; - break; - } - -{{? $isData }} } {{?}} - -{{# def.checkError:'enum' }} - -{{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/errors.def b/node_modules/ajv/lib/dot/errors.def deleted file mode 100644 index 5c5752cb..00000000 --- a/node_modules/ajv/lib/dot/errors.def +++ /dev/null @@ -1,194 +0,0 @@ -{{# def.definitions }} - -{{## def._error:_rule: - {{ 'istanbul ignore else'; }} - {{? it.createErrors !== false }} - { - keyword: '{{= $errorKeyword || _rule }}' - , dataPath: (dataPath || '') + {{= it.errorPath }} - , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}} - , params: {{# def._errorParams[_rule] }} - {{? it.opts.messages !== false }} - , message: {{# def._errorMessages[_rule] }} - {{?}} - {{? it.opts.verbose }} - , schema: {{# def._errorSchemas[_rule] }} - , parentSchema: validate.schema{{=it.schemaPath}} - , data: {{=$data}} - {{?}} - } - {{??}} - {} - {{?}} -#}} - - -{{## def._addError:_rule: - if (vErrors === null) vErrors = [err]; - else vErrors.push(err); - errors++; -#}} - - -{{## def.addError:_rule: - var err = {{# def._error:_rule }}; - {{# def._addError:_rule }} -#}} - - -{{## def.error:_rule: - {{# def.beginDefOut}} - {{# def._error:_rule }} - {{# def.storeDefOut:__err }} - - {{? !it.compositeRule && $breakOnError }} - {{ 'istanbul ignore if'; }} - {{? it.async }} - throw new ValidationError([{{=__err}}]); - {{??}} - validate.errors = [{{=__err}}]; - return false; - {{?}} - {{??}} - var err = {{=__err}}; - {{# def._addError:_rule }} - {{?}} -#}} - - -{{## def.extraError:_rule: - {{# def.addError:_rule}} - {{? !it.compositeRule && $breakOnError }} - {{ 'istanbul ignore if'; }} - {{? it.async }} - throw new ValidationError(vErrors); - {{??}} - validate.errors = vErrors; - return false; - {{?}} - {{?}} -#}} - - -{{## def.checkError:_rule: - if (!{{=$valid}}) { - {{# def.error:_rule }} - } -#}} - - -{{## def.resetErrors: - errors = {{=$errs}}; - if (vErrors !== null) { - if ({{=$errs}}) vErrors.length = {{=$errs}}; - else vErrors = null; - } -#}} - - -{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}} -{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}} -{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}} - -{{## def._errorMessages = { - 'false schema': "'boolean schema is false'", - $ref: "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'", - additionalItems: "'should NOT have more than {{=$schema.length}} items'", - additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'", - anyOf: "'should match some schema in anyOf'", - const: "'should be equal to constant'", - contains: "'should contain a valid item'", - dependencies: "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'", - 'enum': "'should be equal to one of the allowed values'", - format: "'should match format \"{{#def.concatSchemaEQ}}\"'", - 'if': "'should match \"' + {{=$ifClause}} + '\" schema'", - _limit: "'should be {{=$opStr}} {{#def.appendSchema}}", - _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'", - _limitItems: "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'", - _limitLength: "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'", - _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'", - multipleOf: "'should be multiple of {{#def.appendSchema}}", - not: "'should NOT be valid'", - oneOf: "'should match exactly one schema in oneOf'", - pattern: "'should match pattern \"{{#def.concatSchemaEQ}}\"'", - propertyNames: "'property name \\'{{=$invalidName}}\\' is invalid'", - required: "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'", - type: "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'", - uniqueItems: "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'", - custom: "'should pass \"{{=$rule.keyword}}\" keyword validation'", - patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''", - switch: "'should pass \"switch\" keyword validation'", - _formatLimit: "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'", - _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'" -} #}} - - -{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}} -{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} - -{{## def._errorSchemas = { - 'false schema': "false", - $ref: "{{=it.util.toQuotedString($schema)}}", - additionalItems: "false", - additionalProperties: "false", - anyOf: "validate.schema{{=$schemaPath}}", - const: "validate.schema{{=$schemaPath}}", - contains: "validate.schema{{=$schemaPath}}", - dependencies: "validate.schema{{=$schemaPath}}", - 'enum': "validate.schema{{=$schemaPath}}", - format: "{{#def.schemaRefOrQS}}", - 'if': "validate.schema{{=$schemaPath}}", - _limit: "{{#def.schemaRefOrVal}}", - _exclusiveLimit: "validate.schema{{=$schemaPath}}", - _limitItems: "{{#def.schemaRefOrVal}}", - _limitLength: "{{#def.schemaRefOrVal}}", - _limitProperties:"{{#def.schemaRefOrVal}}", - multipleOf: "{{#def.schemaRefOrVal}}", - not: "validate.schema{{=$schemaPath}}", - oneOf: "validate.schema{{=$schemaPath}}", - pattern: "{{#def.schemaRefOrQS}}", - propertyNames: "validate.schema{{=$schemaPath}}", - required: "validate.schema{{=$schemaPath}}", - type: "validate.schema{{=$schemaPath}}", - uniqueItems: "{{#def.schemaRefOrVal}}", - custom: "validate.schema{{=$schemaPath}}", - patternRequired: "validate.schema{{=$schemaPath}}", - switch: "validate.schema{{=$schemaPath}}", - _formatLimit: "{{#def.schemaRefOrQS}}", - _formatExclusiveLimit: "validate.schema{{=$schemaPath}}" -} #}} - - -{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} - -{{## def._errorParams = { - 'false schema': "{}", - $ref: "{ ref: '{{=it.util.escapeQuotes($schema)}}' }", - additionalItems: "{ limit: {{=$schema.length}} }", - additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }", - anyOf: "{}", - const: "{ allowedValue: schema{{=$lvl}} }", - contains: "{}", - dependencies: "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }", - 'enum': "{ allowedValues: schema{{=$lvl}} }", - format: "{ format: {{#def.schemaValueQS}} }", - 'if': "{ failingKeyword: {{=$ifClause}} }", - _limit: "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }", - _exclusiveLimit: "{}", - _limitItems: "{ limit: {{=$schemaValue}} }", - _limitLength: "{ limit: {{=$schemaValue}} }", - _limitProperties:"{ limit: {{=$schemaValue}} }", - multipleOf: "{ multipleOf: {{=$schemaValue}} }", - not: "{}", - oneOf: "{ passingSchemas: {{=$passingSchemas}} }", - pattern: "{ pattern: {{#def.schemaValueQS}} }", - propertyNames: "{ propertyName: '{{=$invalidName}}' }", - required: "{ missingProperty: '{{=$missingProperty}}' }", - type: "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }", - uniqueItems: "{ i: i, j: j }", - custom: "{ keyword: '{{=$rule.keyword}}' }", - patternRequired: "{ missingPattern: '{{=$missingPattern}}' }", - switch: "{ caseIndex: {{=$caseIndex}} }", - _formatLimit: "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }", - _formatExclusiveLimit: "{}" -} #}} diff --git a/node_modules/ajv/lib/dot/format.jst b/node_modules/ajv/lib/dot/format.jst deleted file mode 100644 index 37f14da8..00000000 --- a/node_modules/ajv/lib/dot/format.jst +++ /dev/null @@ -1,106 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} - -{{## def.skipFormat: - {{? $breakOnError }} if (true) { {{?}} - {{ return out; }} -#}} - -{{? it.opts.format === false }}{{# def.skipFormat }}{{?}} - - -{{# def.$data }} - - -{{## def.$dataCheckFormat: - {{# def.$dataNotType:'string' }} - ({{? $unknownFormats != 'ignore' }} - ({{=$schemaValue}} && !{{=$format}} - {{? $allowUnknown }} - && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1 - {{?}}) || - {{?}} - ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}' - && !(typeof {{=$format}} == 'function' - ? {{? it.async}} - (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}})) - {{??}} - {{=$format}}({{=$data}}) - {{?}} - : {{=$format}}.test({{=$data}})))) -#}} - -{{## def.checkFormat: - {{ - var $formatRef = 'formats' + it.util.getProperty($schema); - if ($isObject) $formatRef += '.validate'; - }} - {{? typeof $format == 'function' }} - {{=$formatRef}}({{=$data}}) - {{??}} - {{=$formatRef}}.test({{=$data}}) - {{?}} -#}} - - -{{ - var $unknownFormats = it.opts.unknownFormats - , $allowUnknown = Array.isArray($unknownFormats); -}} - -{{? $isData }} - {{ - var $format = 'format' + $lvl - , $isObject = 'isObject' + $lvl - , $formatType = 'formatType' + $lvl; - }} - var {{=$format}} = formats[{{=$schemaValue}}]; - var {{=$isObject}} = typeof {{=$format}} == 'object' - && !({{=$format}} instanceof RegExp) - && {{=$format}}.validate; - var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string'; - if ({{=$isObject}}) { - {{? it.async}} - var async{{=$lvl}} = {{=$format}}.async; - {{?}} - {{=$format}} = {{=$format}}.validate; - } - if ({{# def.$dataCheckFormat }}) { -{{??}} - {{ var $format = it.formats[$schema]; }} - {{? !$format }} - {{? $unknownFormats == 'ignore' }} - {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }} - {{# def.skipFormat }} - {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }} - {{# def.skipFormat }} - {{??}} - {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }} - {{?}} - {{?}} - {{ - var $isObject = typeof $format == 'object' - && !($format instanceof RegExp) - && $format.validate; - var $formatType = $isObject && $format.type || 'string'; - if ($isObject) { - var $async = $format.async === true; - $format = $format.validate; - } - }} - {{? $formatType != $ruleType }} - {{# def.skipFormat }} - {{?}} - {{? $async }} - {{ - if (!it.async) throw new Error('async format in sync schema'); - var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; - }} - if (!(await {{=$formatRef}}({{=$data}}))) { - {{??}} - if (!{{# def.checkFormat }}) { - {{?}} -{{?}} - {{# def.error:'format' }} - } {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/if.jst b/node_modules/ajv/lib/dot/if.jst deleted file mode 100644 index adb50361..00000000 --- a/node_modules/ajv/lib/dot/if.jst +++ /dev/null @@ -1,73 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{## def.validateIfClause:_clause: - {{ - $it.schema = it.schema['_clause']; - $it.schemaPath = it.schemaPath + '._clause'; - $it.errSchemaPath = it.errSchemaPath + '/_clause'; - }} - {{# def.insertSubschemaCode }} - {{=$valid}} = {{=$nextValid}}; - {{? $thenPresent && $elsePresent }} - {{ $ifClause = 'ifClause' + $lvl; }} - var {{=$ifClause}} = '_clause'; - {{??}} - {{ $ifClause = '\'_clause\''; }} - {{?}} -#}} - -{{ - var $thenSch = it.schema['then'] - , $elseSch = it.schema['else'] - , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }} - , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }} - , $currentBaseId = $it.baseId; -}} - -{{? $thenPresent || $elsePresent }} - {{ - var $ifClause; - $it.createErrors = false; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - }} - var {{=$errs}} = errors; - var {{=$valid}} = true; - - {{# def.setCompositeRule }} - {{# def.insertSubschemaCode }} - {{ $it.createErrors = true; }} - {{# def.resetErrors }} - {{# def.resetCompositeRule }} - - {{? $thenPresent }} - if ({{=$nextValid}}) { - {{# def.validateIfClause:then }} - } - {{? $elsePresent }} - else { - {{?}} - {{??}} - if (!{{=$nextValid}}) { - {{?}} - - {{? $elsePresent }} - {{# def.validateIfClause:else }} - } - {{?}} - - if (!{{=$valid}}) { - {{# def.extraError:'if' }} - } - {{? $breakOnError }} else { {{?}} -{{??}} - {{? $breakOnError }} - if (true) { - {{?}} -{{?}} - diff --git a/node_modules/ajv/lib/dot/items.jst b/node_modules/ajv/lib/dot/items.jst deleted file mode 100644 index acc932a2..00000000 --- a/node_modules/ajv/lib/dot/items.jst +++ /dev/null @@ -1,98 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{## def.validateItems:startFrom: - for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { - {{ - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - }} - - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} - - {{? $breakOnError }} - if (!{{=$nextValid}}) break; - {{?}} - } -#}} - -{{ - var $idx = 'i' + $lvl - , $dataNxt = $it.dataLevel = it.dataLevel + 1 - , $nextData = 'data' + $dataNxt - , $currentBaseId = it.baseId; -}} - -var {{=$errs}} = errors; -var {{=$valid}}; - -{{? Array.isArray($schema) }} - {{ /* 'items' is an array of schemas */}} - {{ var $additionalItems = it.schema.additionalItems; }} - {{? $additionalItems === false }} - {{=$valid}} = {{=$data}}.length <= {{= $schema.length }}; - {{ - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalItems'; - }} - {{# def.checkError:'additionalItems' }} - {{ $errSchemaPath = $currErrSchemaPath; }} - {{# def.elseIfValid}} - {{?}} - - {{~ $schema:$sch:$i }} - {{? {{# def.nonEmptySchema:$sch }} }} - {{=$nextValid}} = true; - - if ({{=$data}}.length > {{=$i}}) { - {{ - var $passData = $data + '[' + $i + ']'; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); - $it.dataPathArr[$dataNxt] = $i; - }} - - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} - } - - {{# def.ifResultValid }} - {{?}} - {{~}} - - {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }} - {{ - $it.schema = $additionalItems; - $it.schemaPath = it.schemaPath + '.additionalItems'; - $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; - }} - {{=$nextValid}} = true; - - if ({{=$data}}.length > {{= $schema.length }}) { - {{# def.validateItems: $schema.length }} - } - - {{# def.ifResultValid }} - {{?}} - -{{?? {{# def.nonEmptySchema:$schema }} }} - {{ /* 'items' is a single schema */}} - {{ - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - }} - {{# def.validateItems: 0 }} -{{?}} - -{{? $breakOnError }} - {{= $closingBraces }} - if ({{=$errs}} == errors) { -{{?}} diff --git a/node_modules/ajv/lib/dot/missing.def b/node_modules/ajv/lib/dot/missing.def deleted file mode 100644 index a73b9f96..00000000 --- a/node_modules/ajv/lib/dot/missing.def +++ /dev/null @@ -1,39 +0,0 @@ -{{## def.checkMissingProperty:_properties: - {{~ _properties:$propertyKey:$i }} - {{?$i}} || {{?}} - {{ - var $prop = it.util.getProperty($propertyKey) - , $useData = $data + $prop; - }} - ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) ) - {{~}} -#}} - - -{{## def.errorMissingProperty:_error: - {{ - var $propertyPath = 'missing' + $lvl - , $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.opts.jsonPointers - ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) - : $currentErrorPath + ' + ' + $propertyPath; - } - }} - {{# def.error:_error }} -#}} - - -{{## def.allErrorsMissingProperty:_error: - {{ - var $prop = it.util.getProperty($propertyKey) - , $missingProperty = it.util.escapeQuotes($propertyKey) - , $useData = $data + $prop; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - }} - if ({{# def.noPropertyInData }}) { - {{# def.addError:_error }} - } -#}} diff --git a/node_modules/ajv/lib/dot/multipleOf.jst b/node_modules/ajv/lib/dot/multipleOf.jst deleted file mode 100644 index 6d88a456..00000000 --- a/node_modules/ajv/lib/dot/multipleOf.jst +++ /dev/null @@ -1,22 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{# def.numberKeyword }} - -var division{{=$lvl}}; -if ({{?$isData}} - {{=$schemaValue}} !== undefined && ( - typeof {{=$schemaValue}} != 'number' || - {{?}} - (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}}, - {{? it.opts.multipleOfPrecision }} - Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}} - {{??}} - division{{=$lvl}} !== parseInt(division{{=$lvl}}) - {{?}} - ) - {{?$isData}} ) {{?}} ) { - {{# def.error:'multipleOf' }} -} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/not.jst b/node_modules/ajv/lib/dot/not.jst deleted file mode 100644 index e03185ae..00000000 --- a/node_modules/ajv/lib/dot/not.jst +++ /dev/null @@ -1,43 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - -{{? {{# def.nonEmptySchema:$schema }} }} - {{ - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - }} - - var {{=$errs}} = errors; - - {{# def.setCompositeRule }} - - {{ - $it.createErrors = false; - var $allErrorsOption; - if ($it.opts.allErrors) { - $allErrorsOption = $it.opts.allErrors; - $it.opts.allErrors = false; - } - }} - {{= it.validate($it) }} - {{ - $it.createErrors = true; - if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; - }} - - {{# def.resetCompositeRule }} - - if ({{=$nextValid}}) { - {{# def.error:'not' }} - } else { - {{# def.resetErrors }} - {{? it.opts.allErrors }} } {{?}} -{{??}} - {{# def.addError:'not' }} - {{? $breakOnError}} - if (false) { - {{?}} -{{?}} diff --git a/node_modules/ajv/lib/dot/oneOf.jst b/node_modules/ajv/lib/dot/oneOf.jst deleted file mode 100644 index bcce2c6e..00000000 --- a/node_modules/ajv/lib/dot/oneOf.jst +++ /dev/null @@ -1,54 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - -{{ - var $currentBaseId = $it.baseId - , $prevValid = 'prevValid' + $lvl - , $passingSchemas = 'passingSchemas' + $lvl; -}} - -var {{=$errs}} = errors - , {{=$prevValid}} = false - , {{=$valid}} = false - , {{=$passingSchemas}} = null; - -{{# def.setCompositeRule }} - -{{~ $schema:$sch:$i }} - {{? {{# def.nonEmptySchema:$sch }} }} - {{ - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - }} - - {{# def.insertSubschemaCode }} - {{??}} - var {{=$nextValid}} = true; - {{?}} - - {{? $i }} - if ({{=$nextValid}} && {{=$prevValid}}) { - {{=$valid}} = false; - {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}]; - } else { - {{ $closingBraces += '}'; }} - {{?}} - - if ({{=$nextValid}}) { - {{=$valid}} = {{=$prevValid}} = true; - {{=$passingSchemas}} = {{=$i}}; - } -{{~}} - -{{# def.resetCompositeRule }} - -{{= $closingBraces }} - -if (!{{=$valid}}) { - {{# def.extraError:'oneOf' }} -} else { - {{# def.resetErrors }} -{{? it.opts.allErrors }} } {{?}} diff --git a/node_modules/ajv/lib/dot/pattern.jst b/node_modules/ajv/lib/dot/pattern.jst deleted file mode 100644 index 3a37ef6c..00000000 --- a/node_modules/ajv/lib/dot/pattern.jst +++ /dev/null @@ -1,14 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - -{{ - var $regexp = $isData - ? '(new RegExp(' + $schemaValue + '))' - : it.usePattern($schema); -}} - -if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) { - {{# def.error:'pattern' }} -} {{? $breakOnError }} else { {{?}} diff --git a/node_modules/ajv/lib/dot/properties.jst b/node_modules/ajv/lib/dot/properties.jst deleted file mode 100644 index 5cebb9b1..00000000 --- a/node_modules/ajv/lib/dot/properties.jst +++ /dev/null @@ -1,245 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - - -{{## def.validateAdditional: - {{ /* additionalProperties is schema */ - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty - ? it.errorPath - : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - }} - - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} -#}} - - -{{ - var $key = 'key' + $lvl - , $idx = 'idx' + $lvl - , $dataNxt = $it.dataLevel = it.dataLevel + 1 - , $nextData = 'data' + $dataNxt - , $dataProperties = 'dataProperties' + $lvl; - - var $schemaKeys = Object.keys($schema || {}).filter(notProto) - , $pProperties = it.schema.patternProperties || {} - , $pPropertyKeys = Object.keys($pProperties).filter(notProto) - , $aProperties = it.schema.additionalProperties - , $someProperties = $schemaKeys.length || $pPropertyKeys.length - , $noAdditional = $aProperties === false - , $additionalIsSchema = typeof $aProperties == 'object' - && Object.keys($aProperties).length - , $removeAdditional = it.opts.removeAdditional - , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional - , $ownProperties = it.opts.ownProperties - , $currentBaseId = it.baseId; - - var $required = it.schema.required; - if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { - var $requiredHash = it.util.toHash($required); - } - - function notProto(p) { return p !== '__proto__'; } -}} - - -var {{=$errs}} = errors; -var {{=$nextValid}} = true; -{{? $ownProperties }} - var {{=$dataProperties}} = undefined; -{{?}} - -{{? $checkAdditional }} - {{# def.iterateProperties }} - {{? $someProperties }} - var isAdditional{{=$lvl}} = !(false - {{? $schemaKeys.length }} - {{? $schemaKeys.length > 8 }} - || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}}) - {{??}} - {{~ $schemaKeys:$propertyKey }} - || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }} - {{~}} - {{?}} - {{?}} - {{? $pPropertyKeys.length }} - {{~ $pPropertyKeys:$pProperty:$i }} - || {{= it.usePattern($pProperty) }}.test({{=$key}}) - {{~}} - {{?}} - ); - - if (isAdditional{{=$lvl}}) { - {{?}} - {{? $removeAdditional == 'all' }} - delete {{=$data}}[{{=$key}}]; - {{??}} - {{ - var $currentErrorPath = it.errorPath; - var $additionalProperty = '\' + ' + $key + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - } - }} - {{? $noAdditional }} - {{? $removeAdditional }} - delete {{=$data}}[{{=$key}}]; - {{??}} - {{=$nextValid}} = false; - {{ - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalProperties'; - }} - {{# def.error:'additionalProperties' }} - {{ $errSchemaPath = $currErrSchemaPath; }} - {{? $breakOnError }} break; {{?}} - {{?}} - {{?? $additionalIsSchema }} - {{? $removeAdditional == 'failing' }} - var {{=$errs}} = errors; - {{# def.setCompositeRule }} - - {{# def.validateAdditional }} - - if (!{{=$nextValid}}) { - errors = {{=$errs}}; - if (validate.errors !== null) { - if (errors) validate.errors.length = errors; - else validate.errors = null; - } - delete {{=$data}}[{{=$key}}]; - } - - {{# def.resetCompositeRule }} - {{??}} - {{# def.validateAdditional }} - {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} - {{?}} - {{?}} - {{ it.errorPath = $currentErrorPath; }} - {{?}} - {{? $someProperties }} - } - {{?}} - } - - {{# def.ifResultValid }} -{{?}} - -{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }} - -{{? $schemaKeys.length }} - {{~ $schemaKeys:$propertyKey }} - {{ var $sch = $schema[$propertyKey]; }} - - {{? {{# def.nonEmptySchema:$sch}} }} - {{ - var $prop = it.util.getProperty($propertyKey) - , $passData = $data + $prop - , $hasDefault = $useDefaults && $sch.default !== undefined; - $it.schema = $sch; - $it.schemaPath = $schemaPath + $prop; - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); - $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); - $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); - }} - - {{# def.generateSubschemaCode }} - - {{? {{# def.willOptimize }} }} - {{ - $code = {{# def._optimizeValidate }}; - var $useData = $passData; - }} - {{??}} - {{ var $useData = $nextData; }} - var {{=$nextData}} = {{=$passData}}; - {{?}} - - {{? $hasDefault }} - {{= $code }} - {{??}} - {{? $requiredHash && $requiredHash[$propertyKey] }} - if ({{# def.noPropertyInData }}) { - {{=$nextValid}} = false; - {{ - var $currentErrorPath = it.errorPath - , $currErrSchemaPath = $errSchemaPath - , $missingProperty = it.util.escapeQuotes($propertyKey); - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - $errSchemaPath = it.errSchemaPath + '/required'; - }} - {{# def.error:'required' }} - {{ $errSchemaPath = $currErrSchemaPath; }} - {{ it.errorPath = $currentErrorPath; }} - } else { - {{??}} - {{? $breakOnError }} - if ({{# def.noPropertyInData }}) { - {{=$nextValid}} = true; - } else { - {{??}} - if ({{=$useData}} !== undefined - {{? $ownProperties }} - && {{# def.isOwnProperty }} - {{?}} - ) { - {{?}} - {{?}} - - {{= $code }} - } - {{?}} {{ /* $hasDefault */ }} - {{?}} {{ /* def.nonEmptySchema */ }} - - {{# def.ifResultValid }} - {{~}} -{{?}} - -{{? $pPropertyKeys.length }} - {{~ $pPropertyKeys:$pProperty }} - {{ var $sch = $pProperties[$pProperty]; }} - - {{? {{# def.nonEmptySchema:$sch}} }} - {{ - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); - $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' - + it.util.escapeFragment($pProperty); - }} - - {{# def.iterateProperties }} - if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { - {{ - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - }} - - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} - - {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} - } - {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} - } - - {{# def.ifResultValid }} - {{?}} {{ /* def.nonEmptySchema */ }} - {{~}} -{{?}} - - -{{? $breakOnError }} - {{= $closingBraces }} - if ({{=$errs}} == errors) { -{{?}} diff --git a/node_modules/ajv/lib/dot/propertyNames.jst b/node_modules/ajv/lib/dot/propertyNames.jst deleted file mode 100644 index d456ccaf..00000000 --- a/node_modules/ajv/lib/dot/propertyNames.jst +++ /dev/null @@ -1,52 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.setupNextLevel }} - -var {{=$errs}} = errors; - -{{? {{# def.nonEmptySchema:$schema }} }} - {{ - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - }} - - {{ - var $key = 'key' + $lvl - , $idx = 'idx' + $lvl - , $i = 'i' + $lvl - , $invalidName = '\' + ' + $key + ' + \'' - , $dataNxt = $it.dataLevel = it.dataLevel + 1 - , $nextData = 'data' + $dataNxt - , $dataProperties = 'dataProperties' + $lvl - , $ownProperties = it.opts.ownProperties - , $currentBaseId = it.baseId; - }} - - {{? $ownProperties }} - var {{=$dataProperties}} = undefined; - {{?}} - {{# def.iterateProperties }} - var startErrs{{=$lvl}} = errors; - - {{ var $passData = $key; }} - {{# def.setCompositeRule }} - {{# def.generateSubschemaCode }} - {{# def.optimizeValidate }} - {{# def.resetCompositeRule }} - - if (!{{=$nextValid}}) { - for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}= it.opts.loopRequired - , $ownProperties = it.opts.ownProperties; - }} - - {{? $breakOnError }} - var missing{{=$lvl}}; - {{? $loopRequired }} - {{# def.setupLoop }} - var {{=$valid}} = true; - - {{?$isData}}{{# def.check$dataIsArray }}{{?}} - - for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { - {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined - {{? $ownProperties }} - && {{# def.isRequiredOwnProperty }} - {{?}}; - if (!{{=$valid}}) break; - } - - {{? $isData }} } {{?}} - - {{# def.checkError:'required' }} - else { - {{??}} - if ({{# def.checkMissingProperty:$required }}) { - {{# def.errorMissingProperty:'required' }} - } else { - {{?}} - {{??}} - {{? $loopRequired }} - {{# def.setupLoop }} - {{? $isData }} - if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) { - {{# def.addError:'required' }} - } else if ({{=$vSchema}} !== undefined) { - {{?}} - - for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { - if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined - {{? $ownProperties }} - || !{{# def.isRequiredOwnProperty }} - {{?}}) { - {{# def.addError:'required' }} - } - } - - {{? $isData }} } {{?}} - {{??}} - {{~ $required:$propertyKey }} - {{# def.allErrorsMissingProperty:'required' }} - {{~}} - {{?}} - {{?}} - - {{ it.errorPath = $currentErrorPath; }} - -{{?? $breakOnError }} - if (true) { -{{?}} diff --git a/node_modules/ajv/lib/dot/uniqueItems.jst b/node_modules/ajv/lib/dot/uniqueItems.jst deleted file mode 100644 index e69b8308..00000000 --- a/node_modules/ajv/lib/dot/uniqueItems.jst +++ /dev/null @@ -1,62 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.setupKeyword }} -{{# def.$data }} - - -{{? ($schema || $isData) && it.opts.uniqueItems !== false }} - {{? $isData }} - var {{=$valid}}; - if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined) - {{=$valid}} = true; - else if (typeof {{=$schemaValue}} != 'boolean') - {{=$valid}} = false; - else { - {{?}} - - var i = {{=$data}}.length - , {{=$valid}} = true - , j; - if (i > 1) { - {{ - var $itemType = it.schema.items && it.schema.items.type - , $typeIsArray = Array.isArray($itemType); - }} - {{? !$itemType || $itemType == 'object' || $itemType == 'array' || - ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }} - outer: - for (;i--;) { - for (j = i; j--;) { - if (equal({{=$data}}[i], {{=$data}}[j])) { - {{=$valid}} = false; - break outer; - } - } - } - {{??}} - var itemIndices = {}, item; - for (;i--;) { - var item = {{=$data}}[i]; - {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }} - if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue; - {{? $typeIsArray}} - if (typeof item == 'string') item = '"' + item; - {{?}} - if (typeof itemIndices[item] == 'number') { - {{=$valid}} = false; - j = itemIndices[item]; - break; - } - itemIndices[item] = i; - } - {{?}} - } - - {{? $isData }} } {{?}} - - if (!{{=$valid}}) { - {{# def.error:'uniqueItems' }} - } {{? $breakOnError }} else { {{?}} -{{??}} - {{? $breakOnError }} if (true) { {{?}} -{{?}} diff --git a/node_modules/ajv/lib/dot/validate.jst b/node_modules/ajv/lib/dot/validate.jst deleted file mode 100644 index 32087e71..00000000 --- a/node_modules/ajv/lib/dot/validate.jst +++ /dev/null @@ -1,276 +0,0 @@ -{{# def.definitions }} -{{# def.errors }} -{{# def.defaults }} -{{# def.coerce }} - -{{ /** - * schema compilation (render) time: - * it = { schema, RULES, _validate, opts } - * it.validate - this template function, - * it is used recursively to generate code for subschemas - * - * runtime: - * "validate" is a variable name to which this function will be assigned - * validateRef etc. are defined in the parent scope in index.js - */ }} - -{{ - var $async = it.schema.$async === true - , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') - , $id = it.self._getId(it.schema); -}} - -{{ - if (it.opts.strictKeywords) { - var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); - if ($unknownKwd) { - var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; - if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); - else throw new Error($keywordsMsg); - } - } -}} - -{{? it.isTop }} - var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) { - 'use strict'; - {{? $id && (it.opts.sourceCode || it.opts.processCode) }} - {{= '/\*# sourceURL=' + $id + ' */' }} - {{?}} -{{?}} - -{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }} - {{ var $keyword = 'false schema'; }} - {{# def.setupKeyword }} - {{? it.schema === false}} - {{? it.isTop}} - {{ $breakOnError = true; }} - {{??}} - var {{=$valid}} = false; - {{?}} - {{# def.error:'false schema' }} - {{??}} - {{? it.isTop}} - {{? $async }} - return data; - {{??}} - validate.errors = null; - return true; - {{?}} - {{??}} - var {{=$valid}} = true; - {{?}} - {{?}} - - {{? it.isTop}} - }; - return validate; - {{?}} - - {{ return out; }} -{{?}} - - -{{? it.isTop }} - {{ - var $top = it.isTop - , $lvl = it.level = 0 - , $dataLvl = it.dataLevel = 0 - , $data = 'data'; - it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); - it.baseId = it.baseId || it.rootId; - delete it.isTop; - - it.dataPathArr = [""]; - - if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored in the schema root'; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - }} - - var vErrors = null; {{ /* don't edit, used in replace */ }} - var errors = 0; {{ /* don't edit, used in replace */ }} - if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }} -{{??}} - {{ - var $lvl = it.level - , $dataLvl = it.dataLevel - , $data = 'data' + ($dataLvl || ''); - - if ($id) it.baseId = it.resolve.url(it.baseId, $id); - - if ($async && !it.async) throw new Error('async schema in sync schema'); - }} - - var errs_{{=$lvl}} = errors; -{{?}} - -{{ - var $valid = 'valid' + $lvl - , $breakOnError = !it.opts.allErrors - , $closingBraces1 = '' - , $closingBraces2 = ''; - - var $errorKeyword; - var $typeSchema = it.schema.type - , $typeIsArray = Array.isArray($typeSchema); - - if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { - if ($typeIsArray) { - if ($typeSchema.indexOf('null') == -1) - $typeSchema = $typeSchema.concat('null'); - } else if ($typeSchema != 'null') { - $typeSchema = [$typeSchema, 'null']; - $typeIsArray = true; - } - } - - if ($typeIsArray && $typeSchema.length == 1) { - $typeSchema = $typeSchema[0]; - $typeIsArray = false; - } -}} - -{{## def.checkType: - {{ - var $schemaPath = it.schemaPath + '.type' - , $errSchemaPath = it.errSchemaPath + '/type' - , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; - }} - - if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) { -#}} - -{{? it.schema.$ref && $refKeywords }} - {{? it.opts.extendRefs == 'fail' }} - {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }} - {{?? it.opts.extendRefs !== true }} - {{ - $refKeywords = false; - it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); - }} - {{?}} -{{?}} - -{{? it.schema.$comment && it.opts.$comment }} - {{= it.RULES.all.$comment.code(it, '$comment') }} -{{?}} - -{{? $typeSchema }} - {{? it.opts.coerceTypes }} - {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} - {{?}} - - {{ var $rulesGroup = it.RULES.types[$typeSchema]; }} - {{? $coerceToTypes || $typeIsArray || $rulesGroup === true || - ($rulesGroup && !$shouldUseGroup($rulesGroup)) }} - {{ - var $schemaPath = it.schemaPath + '.type' - , $errSchemaPath = it.errSchemaPath + '/type'; - }} - {{# def.checkType }} - {{? $coerceToTypes }} - {{# def.coerceType }} - {{??}} - {{# def.error:'type' }} - {{?}} - } - {{?}} -{{?}} - - -{{? it.schema.$ref && !$refKeywords }} - {{= it.RULES.all.$ref.code(it, '$ref') }} - {{? $breakOnError }} - } - if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { - {{ $closingBraces2 += '}'; }} - {{?}} -{{??}} - {{~ it.RULES:$rulesGroup }} - {{? $shouldUseGroup($rulesGroup) }} - {{? $rulesGroup.type }} - if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) { - {{?}} - {{? it.opts.useDefaults }} - {{? $rulesGroup.type == 'object' && it.schema.properties }} - {{# def.defaultProperties }} - {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }} - {{# def.defaultItems }} - {{?}} - {{?}} - {{~ $rulesGroup.rules:$rule }} - {{? $shouldUseRule($rule) }} - {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }} - {{? $code }} - {{= $code }} - {{? $breakOnError }} - {{ $closingBraces1 += '}'; }} - {{?}} - {{?}} - {{?}} - {{~}} - {{? $breakOnError }} - {{= $closingBraces1 }} - {{ $closingBraces1 = ''; }} - {{?}} - {{? $rulesGroup.type }} - } - {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }} - else { - {{ - var $schemaPath = it.schemaPath + '.type' - , $errSchemaPath = it.errSchemaPath + '/type'; - }} - {{# def.error:'type' }} - } - {{?}} - {{?}} - - {{? $breakOnError }} - if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { - {{ $closingBraces2 += '}'; }} - {{?}} - {{?}} - {{~}} -{{?}} - -{{? $breakOnError }} {{= $closingBraces2 }} {{?}} - -{{? $top }} - {{? $async }} - if (errors === 0) return data; {{ /* don't edit, used in replace */ }} - else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }} - {{??}} - validate.errors = vErrors; {{ /* don't edit, used in replace */ }} - return errors === 0; {{ /* don't edit, used in replace */ }} - {{?}} - }; - - return validate; -{{??}} - var {{=$valid}} = errors === errs_{{=$lvl}}; -{{?}} - -{{ - function $shouldUseGroup($rulesGroup) { - var rules = $rulesGroup.rules; - for (var i=0; i < rules.length; i++) - if ($shouldUseRule(rules[i])) - return true; - } - - function $shouldUseRule($rule) { - return it.schema[$rule.keyword] !== undefined || - ($rule.implements && $ruleImplementsSomeKeyword($rule)); - } - - function $ruleImplementsSomeKeyword($rule) { - var impl = $rule.implements; - for (var i=0; i < impl.length; i++) - if (it.schema[impl[i]] !== undefined) - return true; - } -}} diff --git a/node_modules/ajv/lib/dotjs/README.md b/node_modules/ajv/lib/dotjs/README.md deleted file mode 100644 index 4d994846..00000000 --- a/node_modules/ajv/lib/dotjs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -These files are compiled dot templates from dot folder. - -Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder. diff --git a/node_modules/ajv/lib/dotjs/_limit.js b/node_modules/ajv/lib/dotjs/_limit.js deleted file mode 100644 index 05a1979d..00000000 --- a/node_modules/ajv/lib/dotjs/_limit.js +++ /dev/null @@ -1,163 +0,0 @@ -'use strict'; -module.exports = function generate__limit(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $isMax = $keyword == 'maximum', - $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', - $schemaExcl = it.schema[$exclusiveKeyword], - $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, - $op = $isMax ? '<' : '>', - $notOp = $isMax ? '>' : '<', - $errorKeyword = undefined; - if (!($isData || typeof $schema == 'number' || $schema === undefined)) { - throw new Error($keyword + ' must be number'); - } - if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { - throw new Error($exclusiveKeyword + ' must be number or boolean'); - } - if ($isDataExcl) { - var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), - $exclusive = 'exclusive' + $lvl, - $exclType = 'exclType' + $lvl, - $exclIsNumber = 'exclIsNumber' + $lvl, - $opExpr = 'op' + $lvl, - $opStr = '\' + ' + $opExpr + ' + \''; - out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; - $schemaValueExcl = 'schemaExcl' + $lvl; - out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; - var $errorKeyword = $exclusiveKeyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; - if ($schema === undefined) { - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaValueExcl; - $isData = $isDataExcl; - } - } else { - var $exclIsNumber = typeof $schemaExcl == 'number', - $opStr = $op; - if ($exclIsNumber && $isData) { - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; - } else { - if ($exclIsNumber && $schema === undefined) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $schemaValue = $schemaExcl; - $notOp += '='; - } else { - if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); - if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { - $exclusive = true; - $errorKeyword = $exclusiveKeyword; - $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; - $notOp += '='; - } else { - $exclusive = false; - $opStr += '='; - } - } - var $opExpr = '\'' + $opStr + '\''; - out += ' if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; - } - } - $errorKeyword = $errorKeyword || $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be ' + ($opStr) + ' '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/_limitItems.js b/node_modules/ajv/lib/dotjs/_limitItems.js deleted file mode 100644 index e092a559..00000000 --- a/node_modules/ajv/lib/dotjs/_limitItems.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; -module.exports = function generate__limitItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxItems' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxItems') { - out += 'more'; - } else { - out += 'fewer'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/_limitLength.js b/node_modules/ajv/lib/dotjs/_limitLength.js deleted file mode 100644 index ecbd3fe1..00000000 --- a/node_modules/ajv/lib/dotjs/_limitLength.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict'; -module.exports = function generate__limitLength(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxLength' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - if (it.opts.unicode === false) { - out += ' ' + ($data) + '.length '; - } else { - out += ' ucs2length(' + ($data) + ') '; - } - out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be '; - if ($keyword == 'maxLength') { - out += 'longer'; - } else { - out += 'shorter'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' characters\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/_limitProperties.js b/node_modules/ajv/lib/dotjs/_limitProperties.js deleted file mode 100644 index d232755a..00000000 --- a/node_modules/ajv/lib/dotjs/_limitProperties.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; -module.exports = function generate__limitProperties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - var $op = $keyword == 'maxProperties' ? '>' : '<'; - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; - } - out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; - var $errorKeyword = $keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have '; - if ($keyword == 'maxProperties') { - out += 'more'; - } else { - out += 'fewer'; - } - out += ' than '; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + ($schema); - } - out += ' properties\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/allOf.js b/node_modules/ajv/lib/dotjs/allOf.js deleted file mode 100644 index fb8c2e4b..00000000 --- a/node_modules/ajv/lib/dotjs/allOf.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; -module.exports = function generate_allOf(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $allSchemasEmpty = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $allSchemasEmpty = false; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($breakOnError) { - if ($allSchemasEmpty) { - out += ' if (true) { '; - } else { - out += ' ' + ($closingBraces.slice(0, -1)) + ' '; - } - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/anyOf.js b/node_modules/ajv/lib/dotjs/anyOf.js deleted file mode 100644 index 0600a9d4..00000000 --- a/node_modules/ajv/lib/dotjs/anyOf.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict'; -module.exports = function generate_anyOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $noEmptySchema = $schema.every(function($sch) { - return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); - }); - if ($noEmptySchema) { - var $currentBaseId = $it.baseId; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; - $closingBraces += '}'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should match some schema in anyOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/comment.js b/node_modules/ajv/lib/dotjs/comment.js deleted file mode 100644 index dd66bb8f..00000000 --- a/node_modules/ajv/lib/dotjs/comment.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; -module.exports = function generate_comment(it, $keyword, $ruleType) { - var out = ' '; - var $schema = it.schema[$keyword]; - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $comment = it.util.toQuotedString($schema); - if (it.opts.$comment === true) { - out += ' console.log(' + ($comment) + ');'; - } else if (typeof it.opts.$comment == 'function') { - out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/const.js b/node_modules/ajv/lib/dotjs/const.js deleted file mode 100644 index 15b7c619..00000000 --- a/node_modules/ajv/lib/dotjs/const.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; -module.exports = function generate_const(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!$isData) { - out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to constant\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/contains.js b/node_modules/ajv/lib/dotjs/contains.js deleted file mode 100644 index 7d763009..00000000 --- a/node_modules/ajv/lib/dotjs/contains.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; -module.exports = function generate_contains(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId, - $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($nonEmptySchema) { - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (' + ($nextValid) + ') break; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; - } else { - out += ' if (' + ($data) + '.length == 0) {'; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should contain a valid item\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - if ($nonEmptySchema) { - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - } - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/custom.js b/node_modules/ajv/lib/dotjs/custom.js deleted file mode 100644 index f3e641e7..00000000 --- a/node_modules/ajv/lib/dotjs/custom.js +++ /dev/null @@ -1,228 +0,0 @@ -'use strict'; -module.exports = function generate_custom(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $rule = this, - $definition = 'definition' + $lvl, - $rDef = $rule.definition, - $closingBraces = ''; - var $compile, $inline, $macro, $ruleValidate, $validateCode; - if ($isData && $rDef.$data) { - $validateCode = 'keywordValidate' + $lvl; - var $validateSchema = $rDef.validateSchema; - out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; - } else { - $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); - if (!$ruleValidate) return; - $schemaValue = 'validate.schema' + $schemaPath; - $validateCode = $ruleValidate.code; - $compile = $rDef.compile; - $inline = $rDef.inline; - $macro = $rDef.macro; - } - var $ruleErrs = $validateCode + '.errors', - $i = 'i' + $lvl, - $ruleErr = 'ruleErr' + $lvl, - $asyncKeyword = $rDef.async; - if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); - if (!($inline || $macro)) { - out += '' + ($ruleErrs) + ' = null;'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if ($isData && $rDef.$data) { - $closingBraces += '}'; - out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; - if ($validateSchema) { - $closingBraces += '}'; - out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; - } - } - if ($inline) { - if ($rDef.statements) { - out += ' ' + ($ruleValidate.validate) + ' '; - } else { - out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; - } - } else if ($macro) { - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - $it.schema = $ruleValidate.validate; - $it.schemaPath = ''; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' ' + ($code); - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - out += ' ' + ($validateCode) + '.call( '; - if (it.opts.passContext) { - out += 'this'; - } else { - out += 'self'; - } - if ($compile || $rDef.schema === false) { - out += ' , ' + ($data) + ' '; - } else { - out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; - } - out += ' , (dataPath || \'\')'; - if (it.errorPath != '""') { - out += ' + ' + (it.errorPath); - } - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; - var def_callRuleValidate = out; - out = $$outStack.pop(); - if ($rDef.errors === false) { - out += ' ' + ($valid) + ' = '; - if ($asyncKeyword) { - out += 'await '; - } - out += '' + (def_callRuleValidate) + '; '; - } else { - if ($asyncKeyword) { - $ruleErrs = 'customErrors' + $lvl; - out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; - } else { - out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; - } - } - } - if ($rDef.modifying) { - out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; - } - out += '' + ($closingBraces); - if ($rDef.valid) { - if ($breakOnError) { - out += ' if (true) { '; - } - } else { - out += ' if ( '; - if ($rDef.valid === undefined) { - out += ' !'; - if ($macro) { - out += '' + ($nextValid); - } else { - out += '' + ($valid); - } - } else { - out += ' ' + (!$rDef.valid) + ' '; - } - out += ') { '; - $errorKeyword = $rule.keyword; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - var def_customError = out; - out = $$outStack.pop(); - if ($inline) { - if ($rDef.errors) { - if ($rDef.errors != 'full') { - out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; - } - out += ') { '; - $it.schema = $sch; - $it.schemaPath = $schemaPath + it.util.getProperty($property); - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/enum.js b/node_modules/ajv/lib/dotjs/enum.js deleted file mode 100644 index 90580b9f..00000000 --- a/node_modules/ajv/lib/dotjs/enum.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; -module.exports = function generate_enum(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $i = 'i' + $lvl, - $vSchema = 'schema' + $lvl; - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; - } - out += 'var ' + ($valid) + ';'; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be equal to one of the allowed values\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' }'; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/format.js b/node_modules/ajv/lib/dotjs/format.js deleted file mode 100644 index cd9a5693..00000000 --- a/node_modules/ajv/lib/dotjs/format.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict'; -module.exports = function generate_format(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - if (it.opts.format === false) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $unknownFormats = it.opts.unknownFormats, - $allowUnknown = Array.isArray($unknownFormats); - if ($isData) { - var $format = 'format' + $lvl, - $isObject = 'isObject' + $lvl, - $formatType = 'formatType' + $lvl; - out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; - if (it.async) { - out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; - } - out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' ('; - if ($unknownFormats != 'ignore') { - out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; - if ($allowUnknown) { - out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; - } - out += ') || '; - } - out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; - if (it.async) { - out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; - } else { - out += ' ' + ($format) + '(' + ($data) + ') '; - } - out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; - } else { - var $format = it.formats[$schema]; - if (!$format) { - if ($unknownFormats == 'ignore') { - it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } else { - throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); - } - } - var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; - var $formatType = $isObject && $format.type || 'string'; - if ($isObject) { - var $async = $format.async === true; - $format = $format.validate; - } - if ($formatType != $ruleType) { - if ($breakOnError) { - out += ' if (true) { '; - } - return out; - } - if ($async) { - if (!it.async) throw new Error('async format in sync schema'); - var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; - out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; - } else { - out += ' if (! '; - var $formatRef = 'formats' + it.util.getProperty($schema); - if ($isObject) $formatRef += '.validate'; - if (typeof $format == 'function') { - out += ' ' + ($formatRef) + '(' + ($data) + ') '; - } else { - out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; - } - out += ') { '; - } - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match format "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/if.js b/node_modules/ajv/lib/dotjs/if.js deleted file mode 100644 index 94d27ad8..00000000 --- a/node_modules/ajv/lib/dotjs/if.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; -module.exports = function generate_if(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - var $thenSch = it.schema['then'], - $elseSch = it.schema['else'], - $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), - $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), - $currentBaseId = $it.baseId; - if ($thenPresent || $elsePresent) { - var $ifClause; - $it.createErrors = false; - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - $it.createErrors = true; - out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - if ($thenPresent) { - out += ' if (' + ($nextValid) + ') { '; - $it.schema = it.schema['then']; - $it.schemaPath = it.schemaPath + '.then'; - $it.errSchemaPath = it.errSchemaPath + '/then'; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; - if ($thenPresent && $elsePresent) { - $ifClause = 'ifClause' + $lvl; - out += ' var ' + ($ifClause) + ' = \'then\'; '; - } else { - $ifClause = '\'then\''; - } - out += ' } '; - if ($elsePresent) { - out += ' else { '; - } - } else { - out += ' if (!' + ($nextValid) + ') { '; - } - if ($elsePresent) { - $it.schema = it.schema['else']; - $it.schemaPath = it.schemaPath + '.else'; - $it.errSchemaPath = it.errSchemaPath + '/else'; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; - if ($thenPresent && $elsePresent) { - $ifClause = 'ifClause' + $lvl; - out += ' var ' + ($ifClause) + ' = \'else\'; '; - } else { - $ifClause = '\'else\''; - } - out += ' } '; - } - out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/index.js b/node_modules/ajv/lib/dotjs/index.js deleted file mode 100644 index 2fb1b00e..00000000 --- a/node_modules/ajv/lib/dotjs/index.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; - -//all requires must be explicit because browserify won't work with dynamic requires -module.exports = { - '$ref': require('./ref'), - allOf: require('./allOf'), - anyOf: require('./anyOf'), - '$comment': require('./comment'), - const: require('./const'), - contains: require('./contains'), - dependencies: require('./dependencies'), - 'enum': require('./enum'), - format: require('./format'), - 'if': require('./if'), - items: require('./items'), - maximum: require('./_limit'), - minimum: require('./_limit'), - maxItems: require('./_limitItems'), - minItems: require('./_limitItems'), - maxLength: require('./_limitLength'), - minLength: require('./_limitLength'), - maxProperties: require('./_limitProperties'), - minProperties: require('./_limitProperties'), - multipleOf: require('./multipleOf'), - not: require('./not'), - oneOf: require('./oneOf'), - pattern: require('./pattern'), - properties: require('./properties'), - propertyNames: require('./propertyNames'), - required: require('./required'), - uniqueItems: require('./uniqueItems'), - validate: require('./validate') -}; diff --git a/node_modules/ajv/lib/dotjs/items.js b/node_modules/ajv/lib/dotjs/items.js deleted file mode 100644 index bee5d67d..00000000 --- a/node_modules/ajv/lib/dotjs/items.js +++ /dev/null @@ -1,140 +0,0 @@ -'use strict'; -module.exports = function generate_items(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $idx = 'i' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $currentBaseId = it.baseId; - out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; - if (Array.isArray($schema)) { - var $additionalItems = it.schema.additionalItems; - if ($additionalItems === false) { - out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - $closingBraces += '}'; - out += ' else { '; - } - } - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; - var $passData = $data + '[' + $i + ']'; - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); - $it.dataPathArr[$dataNxt] = $i; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { - $it.schema = $additionalItems; - $it.schemaPath = it.schemaPath + '.additionalItems'; - $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; - out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); - var $passData = $data + '[' + $idx + ']'; - $it.dataPathArr[$dataNxt] = $idx; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' }'; - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/multipleOf.js b/node_modules/ajv/lib/dotjs/multipleOf.js deleted file mode 100644 index 9d6401b8..00000000 --- a/node_modules/ajv/lib/dotjs/multipleOf.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; -module.exports = function generate_multipleOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (!($isData || typeof $schema == 'number')) { - throw new Error($keyword + ' must be number'); - } - out += 'var division' + ($lvl) + ';if ('; - if ($isData) { - out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; - } - out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; - if (it.opts.multipleOfPrecision) { - out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; - } else { - out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; - } - out += ' ) '; - if ($isData) { - out += ' ) '; - } - out += ' ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be multiple of '; - if ($isData) { - out += '\' + ' + ($schemaValue); - } else { - out += '' + ($schemaValue) + '\''; - } - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/not.js b/node_modules/ajv/lib/dotjs/not.js deleted file mode 100644 index f50c9378..00000000 --- a/node_modules/ajv/lib/dotjs/not.js +++ /dev/null @@ -1,84 +0,0 @@ -'use strict'; -module.exports = function generate_not(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - $it.level++; - var $nextValid = 'valid' + $it.level; - if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.createErrors = false; - var $allErrorsOption; - if ($it.opts.allErrors) { - $allErrorsOption = $it.opts.allErrors; - $it.opts.allErrors = false; - } - out += ' ' + (it.validate($it)) + ' '; - $it.createErrors = true; - if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (' + ($nextValid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; - if (it.opts.allErrors) { - out += ' } '; - } - } else { - out += ' var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT be valid\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if ($breakOnError) { - out += ' if (false) { '; - } - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/oneOf.js b/node_modules/ajv/lib/dotjs/oneOf.js deleted file mode 100644 index dfe2fd55..00000000 --- a/node_modules/ajv/lib/dotjs/oneOf.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict'; -module.exports = function generate_oneOf(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $currentBaseId = $it.baseId, - $prevValid = 'prevValid' + $lvl, - $passingSchemas = 'passingSchemas' + $lvl; - out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var arr1 = $schema; - if (arr1) { - var $sch, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $sch = arr1[$i += 1]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $it.schema = $sch; - $it.schemaPath = $schemaPath + '[' + $i + ']'; - $it.errSchemaPath = $errSchemaPath + '/' + $i; - out += ' ' + (it.validate($it)) + ' '; - $it.baseId = $currentBaseId; - } else { - out += ' var ' + ($nextValid) + ' = true; '; - } - if ($i) { - out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; - $closingBraces += '}'; - } - out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; - } - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match exactly one schema in oneOf\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; return false; '; - } - } - out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; - if (it.opts.allErrors) { - out += ' } '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/pattern.js b/node_modules/ajv/lib/dotjs/pattern.js deleted file mode 100644 index 1d74d6b0..00000000 --- a/node_modules/ajv/lib/dotjs/pattern.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; -module.exports = function generate_pattern(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); - out += 'if ( '; - if ($isData) { - out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; - } - out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; - if ($isData) { - out += '' + ($schemaValue); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should match pattern "'; - if ($isData) { - out += '\' + ' + ($schemaValue) + ' + \''; - } else { - out += '' + (it.util.escapeQuotes($schema)); - } - out += '"\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + (it.util.toQuotedString($schema)); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += '} '; - if ($breakOnError) { - out += ' else { '; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/properties.js b/node_modules/ajv/lib/dotjs/properties.js deleted file mode 100644 index bc5ee554..00000000 --- a/node_modules/ajv/lib/dotjs/properties.js +++ /dev/null @@ -1,335 +0,0 @@ -'use strict'; -module.exports = function generate_properties(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl; - var $schemaKeys = Object.keys($schema || {}).filter(notProto), - $pProperties = it.schema.patternProperties || {}, - $pPropertyKeys = Object.keys($pProperties).filter(notProto), - $aProperties = it.schema.additionalProperties, - $someProperties = $schemaKeys.length || $pPropertyKeys.length, - $noAdditional = $aProperties === false, - $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, - $removeAdditional = it.opts.removeAdditional, - $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - var $required = it.schema.required; - if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { - var $requiredHash = it.util.toHash($required); - } - - function notProto(p) { - return p !== '__proto__'; - } - out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined;'; - } - if ($checkAdditional) { - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - if ($someProperties) { - out += ' var isAdditional' + ($lvl) + ' = !(false '; - if ($schemaKeys.length) { - if ($schemaKeys.length > 8) { - out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; - } else { - var arr1 = $schemaKeys; - if (arr1) { - var $propertyKey, i1 = -1, - l1 = arr1.length - 1; - while (i1 < l1) { - $propertyKey = arr1[i1 += 1]; - out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; - } - } - } - } - if ($pPropertyKeys.length) { - var arr2 = $pPropertyKeys; - if (arr2) { - var $pProperty, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $pProperty = arr2[$i += 1]; - out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; - } - } - } - out += ' ); if (isAdditional' + ($lvl) + ') { '; - } - if ($removeAdditional == 'all') { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - var $currentErrorPath = it.errorPath; - var $additionalProperty = '\' + ' + $key + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - } - if ($noAdditional) { - if ($removeAdditional) { - out += ' delete ' + ($data) + '[' + ($key) + ']; '; - } else { - out += ' ' + ($nextValid) + ' = false; '; - var $currErrSchemaPath = $errSchemaPath; - $errSchemaPath = it.errSchemaPath + '/additionalProperties'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is an invalid additional property'; - } else { - out += 'should NOT have additional properties'; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - if ($breakOnError) { - out += ' break; '; - } - } - } else if ($additionalIsSchema) { - if ($removeAdditional == 'failing') { - out += ' var ' + ($errs) + ' = errors; '; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; - it.compositeRule = $it.compositeRule = $wasComposite; - } else { - $it.schema = $aProperties; - $it.schemaPath = it.schemaPath + '.additionalProperties'; - $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; - $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - } - } - it.errorPath = $currentErrorPath; - } - if ($someProperties) { - out += ' } '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - var $useDefaults = it.opts.useDefaults && !it.compositeRule; - if ($schemaKeys.length) { - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - var $prop = it.util.getProperty($propertyKey), - $passData = $data + $prop, - $hasDefault = $useDefaults && $sch.default !== undefined; - $it.schema = $sch; - $it.schemaPath = $schemaPath + $prop; - $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); - $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); - $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - $code = it.util.varReplace($code, $nextData, $passData); - var $useData = $passData; - } else { - var $useData = $nextData; - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; - } - if ($hasDefault) { - out += ' ' + ($code) + ' '; - } else { - if ($requiredHash && $requiredHash[$propertyKey]) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = false; '; - var $currentErrorPath = it.errorPath, - $currErrSchemaPath = $errSchemaPath, - $missingProperty = it.util.escapeQuotes($propertyKey); - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - $errSchemaPath = it.errSchemaPath + '/required'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - $errSchemaPath = $currErrSchemaPath; - it.errorPath = $currentErrorPath; - out += ' } else { '; - } else { - if ($breakOnError) { - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { ' + ($nextValid) + ' = true; } else { '; - } else { - out += ' if (' + ($useData) + ' !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ' ) { '; - } - } - out += ' ' + ($code) + ' } '; - } - } - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - if ($pPropertyKeys.length) { - var arr4 = $pPropertyKeys; - if (arr4) { - var $pProperty, i4 = -1, - l4 = arr4.length - 1; - while (i4 < l4) { - $pProperty = arr4[i4 += 1]; - var $sch = $pProperties[$pProperty]; - if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { - $it.schema = $sch; - $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); - $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; - $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); - var $passData = $data + '[' + $key + ']'; - $it.dataPathArr[$dataNxt] = $key; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - if ($breakOnError) { - out += ' if (!' + ($nextValid) + ') break; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else ' + ($nextValid) + ' = true; '; - } - out += ' } '; - if ($breakOnError) { - out += ' if (' + ($nextValid) + ') { '; - $closingBraces += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/propertyNames.js b/node_modules/ajv/lib/dotjs/propertyNames.js deleted file mode 100644 index 2a54a08f..00000000 --- a/node_modules/ajv/lib/dotjs/propertyNames.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; -module.exports = function generate_propertyNames(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $errs = 'errs__' + $lvl; - var $it = it.util.copy(it); - var $closingBraces = ''; - $it.level++; - var $nextValid = 'valid' + $it.level; - out += 'var ' + ($errs) + ' = errors;'; - if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { - $it.schema = $schema; - $it.schemaPath = $schemaPath; - $it.errSchemaPath = $errSchemaPath; - var $key = 'key' + $lvl, - $idx = 'idx' + $lvl, - $i = 'i' + $lvl, - $invalidName = '\' + ' + $key + ' + \'', - $dataNxt = $it.dataLevel = it.dataLevel + 1, - $nextData = 'data' + $dataNxt, - $dataProperties = 'dataProperties' + $lvl, - $ownProperties = it.opts.ownProperties, - $currentBaseId = it.baseId; - if ($ownProperties) { - out += ' var ' + ($dataProperties) + ' = undefined; '; - } - if ($ownProperties) { - out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; - } else { - out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; - } - out += ' var startErrs' + ($lvl) + ' = errors; '; - var $passData = $key; - var $wasComposite = it.compositeRule; - it.compositeRule = $it.compositeRule = true; - var $code = it.validate($it); - $it.baseId = $currentBaseId; - if (it.util.varOccurences($code, $nextData) < 2) { - out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; - } else { - out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; - } - it.compositeRule = $it.compositeRule = $wasComposite; - out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { - $required[$required.length] = $property; - } - } - } - } else { - var $required = $schema; - } - } - if ($isData || $required.length) { - var $currentErrorPath = it.errorPath, - $loopRequired = $isData || $required.length >= it.opts.loopRequired, - $ownProperties = it.opts.ownProperties; - if ($breakOnError) { - out += ' var missing' + ($lvl) + '; '; - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - out += ' var ' + ($valid) + ' = true; '; - if ($isData) { - out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; - if ($ownProperties) { - out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += '; if (!' + ($valid) + ') break; } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } else { - out += ' if ( '; - var arr2 = $required; - if (arr2) { - var $propertyKey, $i = -1, - l2 = arr2.length - 1; - while ($i < l2) { - $propertyKey = arr2[$i += 1]; - if ($i) { - out += ' || '; - } - var $prop = it.util.getProperty($propertyKey), - $useData = $data + $prop; - out += ' ( ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; - } - } - out += ') { '; - var $propertyPath = 'missing' + $lvl, - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } else { '; - } - } else { - if ($loopRequired) { - if (!$isData) { - out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; - } - var $i = 'i' + $lvl, - $propertyPath = 'schema' + $lvl + '[' + $i + ']', - $missingProperty = '\' + ' + $propertyPath + ' + \''; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); - } - if ($isData) { - out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; - } - out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; - if ($isData) { - out += ' } '; - } - } else { - var arr3 = $required; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $prop = it.util.getProperty($propertyKey), - $missingProperty = it.util.escapeQuotes($propertyKey), - $useData = $data + $prop; - if (it.opts._errorDataPathProperty) { - it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); - } - out += ' if ( ' + ($useData) + ' === undefined '; - if ($ownProperties) { - out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; - } - out += ') { var err = '; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \''; - if (it.opts._errorDataPathProperty) { - out += 'is a required property'; - } else { - out += 'should have required property \\\'' + ($missingProperty) + '\\\''; - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; - } - } - } - } - it.errorPath = $currentErrorPath; - } else if ($breakOnError) { - out += ' if (true) {'; - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/uniqueItems.js b/node_modules/ajv/lib/dotjs/uniqueItems.js deleted file mode 100644 index 0736a0ed..00000000 --- a/node_modules/ajv/lib/dotjs/uniqueItems.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict'; -module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { - var out = ' '; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - var $isData = it.opts.$data && $schema && $schema.$data, - $schemaValue; - if ($isData) { - out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; - $schemaValue = 'schema' + $lvl; - } else { - $schemaValue = $schema; - } - if (($schema || $isData) && it.opts.uniqueItems !== false) { - if ($isData) { - out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; - } - out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; - var $itemType = it.schema.items && it.schema.items.type, - $typeIsArray = Array.isArray($itemType); - if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { - out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; - } else { - out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; - var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); - out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; - if ($typeIsArray) { - out += ' if (typeof item == \'string\') item = \'"\' + item; '; - } - out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; - } - out += ' } '; - if ($isData) { - out += ' } '; - } - out += ' if (!' + ($valid) + ') { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; - if (it.opts.messages !== false) { - out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; - } - if (it.opts.verbose) { - out += ' , schema: '; - if ($isData) { - out += 'validate.schema' + ($schemaPath); - } else { - out += '' + ($schema); - } - out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - if ($breakOnError) { - out += ' else { '; - } - } else { - if ($breakOnError) { - out += ' if (true) { '; - } - } - return out; -} diff --git a/node_modules/ajv/lib/dotjs/validate.js b/node_modules/ajv/lib/dotjs/validate.js deleted file mode 100644 index f295824b..00000000 --- a/node_modules/ajv/lib/dotjs/validate.js +++ /dev/null @@ -1,482 +0,0 @@ -'use strict'; -module.exports = function generate_validate(it, $keyword, $ruleType) { - var out = ''; - var $async = it.schema.$async === true, - $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), - $id = it.self._getId(it.schema); - if (it.opts.strictKeywords) { - var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); - if ($unknownKwd) { - var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; - if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); - else throw new Error($keywordsMsg); - } - } - if (it.isTop) { - out += ' var validate = '; - if ($async) { - it.async = true; - out += 'async '; - } - out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; - if ($id && (it.opts.sourceCode || it.opts.processCode)) { - out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; - } - } - if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { - var $keyword = 'false schema'; - var $lvl = it.level; - var $dataLvl = it.dataLevel; - var $schema = it.schema[$keyword]; - var $schemaPath = it.schemaPath + it.util.getProperty($keyword); - var $errSchemaPath = it.errSchemaPath + '/' + $keyword; - var $breakOnError = !it.opts.allErrors; - var $errorKeyword; - var $data = 'data' + ($dataLvl || ''); - var $valid = 'valid' + $lvl; - if (it.schema === false) { - if (it.isTop) { - $breakOnError = true; - } else { - out += ' var ' + ($valid) + ' = false; '; - } - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; - if (it.opts.messages !== false) { - out += ' , message: \'boolean schema is false\' '; - } - if (it.opts.verbose) { - out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } else { - if (it.isTop) { - if ($async) { - out += ' return data; '; - } else { - out += ' validate.errors = null; return true; '; - } - } else { - out += ' var ' + ($valid) + ' = true; '; - } - } - if (it.isTop) { - out += ' }; return validate; '; - } - return out; - } - if (it.isTop) { - var $top = it.isTop, - $lvl = it.level = 0, - $dataLvl = it.dataLevel = 0, - $data = 'data'; - it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); - it.baseId = it.baseId || it.rootId; - delete it.isTop; - it.dataPathArr = [""]; - if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored in the schema root'; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - out += ' var vErrors = null; '; - out += ' var errors = 0; '; - out += ' if (rootData === undefined) rootData = data; '; - } else { - var $lvl = it.level, - $dataLvl = it.dataLevel, - $data = 'data' + ($dataLvl || ''); - if ($id) it.baseId = it.resolve.url(it.baseId, $id); - if ($async && !it.async) throw new Error('async schema in sync schema'); - out += ' var errs_' + ($lvl) + ' = errors;'; - } - var $valid = 'valid' + $lvl, - $breakOnError = !it.opts.allErrors, - $closingBraces1 = '', - $closingBraces2 = ''; - var $errorKeyword; - var $typeSchema = it.schema.type, - $typeIsArray = Array.isArray($typeSchema); - if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { - if ($typeIsArray) { - if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); - } else if ($typeSchema != 'null') { - $typeSchema = [$typeSchema, 'null']; - $typeIsArray = true; - } - } - if ($typeIsArray && $typeSchema.length == 1) { - $typeSchema = $typeSchema[0]; - $typeIsArray = false; - } - if (it.schema.$ref && $refKeywords) { - if (it.opts.extendRefs == 'fail') { - throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); - } else if (it.opts.extendRefs !== true) { - $refKeywords = false; - it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); - } - } - if (it.schema.$comment && it.opts.$comment) { - out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); - } - if ($typeSchema) { - if (it.opts.coerceTypes) { - var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); - } - var $rulesGroup = it.RULES.types[$typeSchema]; - if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type', - $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; - out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; - if ($coerceToTypes) { - var $dataType = 'dataType' + $lvl, - $coerced = 'coerced' + $lvl; - out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; - if (it.opts.coerceTypes == 'array') { - out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; - } - out += ' if (' + ($coerced) + ' !== undefined) ; '; - var arr1 = $coerceToTypes; - if (arr1) { - var $type, $i = -1, - l1 = arr1.length - 1; - while ($i < l1) { - $type = arr1[$i += 1]; - if ($type == 'string') { - out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; - } else if ($type == 'number' || $type == 'integer') { - out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; - if ($type == 'integer') { - out += ' && !(' + ($data) + ' % 1)'; - } - out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; - } else if ($type == 'boolean') { - out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; - } else if ($type == 'null') { - out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; - } else if (it.opts.coerceTypes == 'array' && $type == 'array') { - out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; - } - } - } - out += ' else { '; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } if (' + ($coerced) + ' !== undefined) { '; - var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', - $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; - out += ' ' + ($data) + ' = ' + ($coerced) + '; '; - if (!$dataLvl) { - out += 'if (' + ($parentData) + ' !== undefined)'; - } - out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; - } else { - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - } - out += ' } '; - } - } - if (it.schema.$ref && !$refKeywords) { - out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; - if ($breakOnError) { - out += ' } if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } else { - var arr2 = it.RULES; - if (arr2) { - var $rulesGroup, i2 = -1, - l2 = arr2.length - 1; - while (i2 < l2) { - $rulesGroup = arr2[i2 += 1]; - if ($shouldUseGroup($rulesGroup)) { - if ($rulesGroup.type) { - out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; - } - if (it.opts.useDefaults) { - if ($rulesGroup.type == 'object' && it.schema.properties) { - var $schema = it.schema.properties, - $schemaKeys = Object.keys($schema); - var arr3 = $schemaKeys; - if (arr3) { - var $propertyKey, i3 = -1, - l3 = arr3.length - 1; - while (i3 < l3) { - $propertyKey = arr3[i3 += 1]; - var $sch = $schema[$propertyKey]; - if ($sch.default !== undefined) { - var $passData = $data + it.util.getProperty($propertyKey); - if (it.compositeRule) { - if (it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored for: ' + $passData; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - } else { - out += ' if (' + ($passData) + ' === undefined '; - if (it.opts.useDefaults == 'empty') { - out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; - } - out += ' ) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { - var arr4 = it.schema.items; - if (arr4) { - var $sch, $i = -1, - l4 = arr4.length - 1; - while ($i < l4) { - $sch = arr4[$i += 1]; - if ($sch.default !== undefined) { - var $passData = $data + '[' + $i + ']'; - if (it.compositeRule) { - if (it.opts.strictDefaults) { - var $defaultMsg = 'default is ignored for: ' + $passData; - if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); - else throw new Error($defaultMsg); - } - } else { - out += ' if (' + ($passData) + ' === undefined '; - if (it.opts.useDefaults == 'empty') { - out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; - } - out += ' ) ' + ($passData) + ' = '; - if (it.opts.useDefaults == 'shared') { - out += ' ' + (it.useDefault($sch.default)) + ' '; - } else { - out += ' ' + (JSON.stringify($sch.default)) + ' '; - } - out += '; '; - } - } - } - } - } - } - var arr5 = $rulesGroup.rules; - if (arr5) { - var $rule, i5 = -1, - l5 = arr5.length - 1; - while (i5 < l5) { - $rule = arr5[i5 += 1]; - if ($shouldUseRule($rule)) { - var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); - if ($code) { - out += ' ' + ($code) + ' '; - if ($breakOnError) { - $closingBraces1 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces1) + ' '; - $closingBraces1 = ''; - } - if ($rulesGroup.type) { - out += ' } '; - if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { - out += ' else { '; - var $schemaPath = it.schemaPath + '.type', - $errSchemaPath = it.errSchemaPath + '/type'; - var $$outStack = $$outStack || []; - $$outStack.push(out); - out = ''; /* istanbul ignore else */ - if (it.createErrors !== false) { - out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' } '; - if (it.opts.messages !== false) { - out += ' , message: \'should be '; - if ($typeIsArray) { - out += '' + ($typeSchema.join(",")); - } else { - out += '' + ($typeSchema); - } - out += '\' '; - } - if (it.opts.verbose) { - out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; - } - out += ' } '; - } else { - out += ' {} '; - } - var __err = out; - out = $$outStack.pop(); - if (!it.compositeRule && $breakOnError) { - /* istanbul ignore if */ - if (it.async) { - out += ' throw new ValidationError([' + (__err) + ']); '; - } else { - out += ' validate.errors = [' + (__err) + ']; return false; '; - } - } else { - out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; - } - out += ' } '; - } - } - if ($breakOnError) { - out += ' if (errors === '; - if ($top) { - out += '0'; - } else { - out += 'errs_' + ($lvl); - } - out += ') { '; - $closingBraces2 += '}'; - } - } - } - } - } - if ($breakOnError) { - out += ' ' + ($closingBraces2) + ' '; - } - if ($top) { - if ($async) { - out += ' if (errors === 0) return data; '; - out += ' else throw new ValidationError(vErrors); '; - } else { - out += ' validate.errors = vErrors; '; - out += ' return errors === 0; '; - } - out += ' }; return validate;'; - } else { - out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; - } - - function $shouldUseGroup($rulesGroup) { - var rules = $rulesGroup.rules; - for (var i = 0; i < rules.length; i++) - if ($shouldUseRule(rules[i])) return true; - } - - function $shouldUseRule($rule) { - return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); - } - - function $ruleImplementsSomeKeyword($rule) { - var impl = $rule.implements; - for (var i = 0; i < impl.length; i++) - if (it.schema[impl[i]] !== undefined) return true; - } - return out; -} diff --git a/node_modules/ajv/lib/keyword.js b/node_modules/ajv/lib/keyword.js deleted file mode 100644 index 06da9a2d..00000000 --- a/node_modules/ajv/lib/keyword.js +++ /dev/null @@ -1,146 +0,0 @@ -'use strict'; - -var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; -var customRuleCode = require('./dotjs/custom'); -var definitionSchema = require('./definition_schema'); - -module.exports = { - add: addKeyword, - get: getKeyword, - remove: removeKeyword, - validate: validateKeyword -}; - - -/** - * Define custom keyword - * @this Ajv - * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). - * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. - * @return {Ajv} this for method chaining - */ -function addKeyword(keyword, definition) { - /* jshint validthis: true */ - /* eslint no-shadow: 0 */ - var RULES = this.RULES; - if (RULES.keywords[keyword]) - throw new Error('Keyword ' + keyword + ' is already defined'); - - if (!IDENTIFIER.test(keyword)) - throw new Error('Keyword ' + keyword + ' is not a valid identifier'); - - if (definition) { - this.validateKeyword(definition, true); - - var dataType = definition.type; - if (Array.isArray(dataType)) { - for (var i=0; i ../ajv-dist/bower.json - cd ../ajv-dist - - if [[ `git status --porcelain` ]]; then - echo "Changes detected. Updating master branch..." - git add -A - git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER" - git push --quiet origin master > /dev/null 2>&1 - fi - - echo "Publishing tag..." - - git tag $TRAVIS_TAG - git push --tags > /dev/null 2>&1 - - echo "Done" -fi diff --git a/node_modules/ajv/scripts/travis-gh-pages b/node_modules/ajv/scripts/travis-gh-pages deleted file mode 100644 index b3d4f3d0..00000000 --- a/node_modules/ajv/scripts/travis-gh-pages +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -set -e - -if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then - git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && { - rm -rf ../gh-pages - git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv.git ../gh-pages - mkdir -p ../gh-pages/_source - cp *.md ../gh-pages/_source - cp LICENSE ../gh-pages/_source - currentDir=$(pwd) - cd ../gh-pages - $currentDir/node_modules/.bin/gh-pages-generator - # remove logo from README - sed -i -E "s/]+ajv_logo[^>]+>//" index.md - git config user.email "$GIT_USER_EMAIL" - git config user.name "$GIT_USER_NAME" - git add . - git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER" - git push --quiet origin gh-pages > /dev/null 2>&1 - } -fi diff --git a/node_modules/ansi-styles/index.d.ts b/node_modules/ansi-styles/index.d.ts deleted file mode 100644 index 44a907e5..00000000 --- a/node_modules/ansi-styles/index.d.ts +++ /dev/null @@ -1,345 +0,0 @@ -declare type CSSColor = - | 'aliceblue' - | 'antiquewhite' - | 'aqua' - | 'aquamarine' - | 'azure' - | 'beige' - | 'bisque' - | 'black' - | 'blanchedalmond' - | 'blue' - | 'blueviolet' - | 'brown' - | 'burlywood' - | 'cadetblue' - | 'chartreuse' - | 'chocolate' - | 'coral' - | 'cornflowerblue' - | 'cornsilk' - | 'crimson' - | 'cyan' - | 'darkblue' - | 'darkcyan' - | 'darkgoldenrod' - | 'darkgray' - | 'darkgreen' - | 'darkgrey' - | 'darkkhaki' - | 'darkmagenta' - | 'darkolivegreen' - | 'darkorange' - | 'darkorchid' - | 'darkred' - | 'darksalmon' - | 'darkseagreen' - | 'darkslateblue' - | 'darkslategray' - | 'darkslategrey' - | 'darkturquoise' - | 'darkviolet' - | 'deeppink' - | 'deepskyblue' - | 'dimgray' - | 'dimgrey' - | 'dodgerblue' - | 'firebrick' - | 'floralwhite' - | 'forestgreen' - | 'fuchsia' - | 'gainsboro' - | 'ghostwhite' - | 'gold' - | 'goldenrod' - | 'gray' - | 'green' - | 'greenyellow' - | 'grey' - | 'honeydew' - | 'hotpink' - | 'indianred' - | 'indigo' - | 'ivory' - | 'khaki' - | 'lavender' - | 'lavenderblush' - | 'lawngreen' - | 'lemonchiffon' - | 'lightblue' - | 'lightcoral' - | 'lightcyan' - | 'lightgoldenrodyellow' - | 'lightgray' - | 'lightgreen' - | 'lightgrey' - | 'lightpink' - | 'lightsalmon' - | 'lightseagreen' - | 'lightskyblue' - | 'lightslategray' - | 'lightslategrey' - | 'lightsteelblue' - | 'lightyellow' - | 'lime' - | 'limegreen' - | 'linen' - | 'magenta' - | 'maroon' - | 'mediumaquamarine' - | 'mediumblue' - | 'mediumorchid' - | 'mediumpurple' - | 'mediumseagreen' - | 'mediumslateblue' - | 'mediumspringgreen' - | 'mediumturquoise' - | 'mediumvioletred' - | 'midnightblue' - | 'mintcream' - | 'mistyrose' - | 'moccasin' - | 'navajowhite' - | 'navy' - | 'oldlace' - | 'olive' - | 'olivedrab' - | 'orange' - | 'orangered' - | 'orchid' - | 'palegoldenrod' - | 'palegreen' - | 'paleturquoise' - | 'palevioletred' - | 'papayawhip' - | 'peachpuff' - | 'peru' - | 'pink' - | 'plum' - | 'powderblue' - | 'purple' - | 'rebeccapurple' - | 'red' - | 'rosybrown' - | 'royalblue' - | 'saddlebrown' - | 'salmon' - | 'sandybrown' - | 'seagreen' - | 'seashell' - | 'sienna' - | 'silver' - | 'skyblue' - | 'slateblue' - | 'slategray' - | 'slategrey' - | 'snow' - | 'springgreen' - | 'steelblue' - | 'tan' - | 'teal' - | 'thistle' - | 'tomato' - | 'turquoise' - | 'violet' - | 'wheat' - | 'white' - | 'whitesmoke' - | 'yellow' - | 'yellowgreen'; - -declare namespace ansiStyles { - interface ColorConvert { - /** - The RGB color space. - - @param red - (`0`-`255`) - @param green - (`0`-`255`) - @param blue - (`0`-`255`) - */ - rgb(red: number, green: number, blue: number): string; - - /** - The RGB HEX color space. - - @param hex - A hexadecimal string containing RGB data. - */ - hex(hex: string): string; - - /** - @param keyword - A CSS color name. - */ - keyword(keyword: CSSColor): string; - - /** - The HSL color space. - - @param hue - (`0`-`360`) - @param saturation - (`0`-`100`) - @param lightness - (`0`-`100`) - */ - hsl(hue: number, saturation: number, lightness: number): string; - - /** - The HSV color space. - - @param hue - (`0`-`360`) - @param saturation - (`0`-`100`) - @param value - (`0`-`100`) - */ - hsv(hue: number, saturation: number, value: number): string; - - /** - The HSV color space. - - @param hue - (`0`-`360`) - @param whiteness - (`0`-`100`) - @param blackness - (`0`-`100`) - */ - hwb(hue: number, whiteness: number, blackness: number): string; - - /** - Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color. - */ - ansi(ansi: number): string; - - /** - Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. - */ - ansi256(ansi: number): string; - } - - interface CSPair { - /** - The ANSI terminal control sequence for starting this style. - */ - readonly open: string; - - /** - The ANSI terminal control sequence for ending this style. - */ - readonly close: string; - } - - interface ColorBase { - readonly ansi: ColorConvert; - readonly ansi256: ColorConvert; - readonly ansi16m: ColorConvert; - - /** - The ANSI terminal control sequence for ending this color. - */ - readonly close: string; - } - - interface Modifier { - /** - Resets the current color chain. - */ - readonly reset: CSPair; - - /** - Make text bold. - */ - readonly bold: CSPair; - - /** - Emitting only a small amount of light. - */ - readonly dim: CSPair; - - /** - Make text italic. (Not widely supported) - */ - readonly italic: CSPair; - - /** - Make text underline. (Not widely supported) - */ - readonly underline: CSPair; - - /** - Inverse background and foreground colors. - */ - readonly inverse: CSPair; - - /** - Prints the text, but makes it invisible. - */ - readonly hidden: CSPair; - - /** - Puts a horizontal line through the center of the text. (Not widely supported) - */ - readonly strikethrough: CSPair; - } - - interface ForegroundColor { - readonly black: CSPair; - readonly red: CSPair; - readonly green: CSPair; - readonly yellow: CSPair; - readonly blue: CSPair; - readonly cyan: CSPair; - readonly magenta: CSPair; - readonly white: CSPair; - - /** - Alias for `blackBright`. - */ - readonly gray: CSPair; - - /** - Alias for `blackBright`. - */ - readonly grey: CSPair; - - readonly blackBright: CSPair; - readonly redBright: CSPair; - readonly greenBright: CSPair; - readonly yellowBright: CSPair; - readonly blueBright: CSPair; - readonly cyanBright: CSPair; - readonly magentaBright: CSPair; - readonly whiteBright: CSPair; - } - - interface BackgroundColor { - readonly bgBlack: CSPair; - readonly bgRed: CSPair; - readonly bgGreen: CSPair; - readonly bgYellow: CSPair; - readonly bgBlue: CSPair; - readonly bgCyan: CSPair; - readonly bgMagenta: CSPair; - readonly bgWhite: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGray: CSPair; - - /** - Alias for `bgBlackBright`. - */ - readonly bgGrey: CSPair; - - readonly bgBlackBright: CSPair; - readonly bgRedBright: CSPair; - readonly bgGreenBright: CSPair; - readonly bgYellowBright: CSPair; - readonly bgBlueBright: CSPair; - readonly bgCyanBright: CSPair; - readonly bgMagentaBright: CSPair; - readonly bgWhiteBright: CSPair; - } -} - -declare const ansiStyles: { - readonly modifier: ansiStyles.Modifier; - readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase; - readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase; - readonly codes: ReadonlyMap; -} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; - -export = ansiStyles; diff --git a/node_modules/ansi-styles/index.js b/node_modules/ansi-styles/index.js deleted file mode 100644 index 5d82581a..00000000 --- a/node_modules/ansi-styles/index.js +++ /dev/null @@ -1,163 +0,0 @@ -'use strict'; - -const wrapAnsi16 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${code + offset}m`; -}; - -const wrapAnsi256 = (fn, offset) => (...args) => { - const code = fn(...args); - return `\u001B[${38 + offset};5;${code}m`; -}; - -const wrapAnsi16m = (fn, offset) => (...args) => { - const rgb = fn(...args); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; - -const ansi2ansi = n => n; -const rgb2rgb = (r, g, b) => [r, g, b]; - -const setLazyProperty = (object, property, get) => { - Object.defineProperty(object, property, { - get: () => { - const value = get(); - - Object.defineProperty(object, property, { - value, - enumerable: true, - configurable: true - }); - - return value; - }, - enumerable: true, - configurable: true - }); -}; - -/** @type {typeof import('color-convert')} */ -let colorConvert; -const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { - if (colorConvert === undefined) { - colorConvert = require('color-convert'); - } - - const offset = isBackground ? 10 : 0; - const styles = {}; - - for (const [sourceSpace, suite] of Object.entries(colorConvert)) { - const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; - if (sourceSpace === targetSpace) { - styles[name] = wrap(identity, offset); - } else if (typeof suite === 'object') { - styles[name] = wrap(suite[targetSpace], offset); - } - } - - return styles; -}; - -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - - // Bright color - blackBright: [90, 39], - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; - - // Alias bright black as gray (and grey) - styles.color.gray = styles.color.blackBright; - styles.bgColor.bgGray = styles.bgColor.bgBlackBright; - styles.color.grey = styles.color.blackBright; - styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; - - for (const [groupName, group] of Object.entries(styles)) { - for (const [styleName, style] of Object.entries(group)) { - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; - - group[styleName] = styles[styleName]; - - codes.set(style[0], style[1]); - } - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - } - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; - - setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); - setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); - setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); - setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); - - return styles; -} - -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); diff --git a/node_modules/ansi-styles/license b/node_modules/ansi-styles/license deleted file mode 100644 index e7af2f77..00000000 --- a/node_modules/ansi-styles/license +++ /dev/null @@ -1,9 +0,0 @@ -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/ansi-styles/package.json b/node_modules/ansi-styles/package.json deleted file mode 100644 index 75393284..00000000 --- a/node_modules/ansi-styles/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "ansi-styles", - "version": "4.3.0", - "description": "ANSI escape codes for styling strings in the terminal", - "license": "MIT", - "repository": "chalk/ansi-styles", - "funding": "https://github.com/chalk/ansi-styles?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd", - "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "color-convert": "^2.0.1" - }, - "devDependencies": { - "@types/color-convert": "^1.9.0", - "ava": "^2.3.0", - "svg-term-cli": "^2.1.1", - "tsd": "^0.11.0", - "xo": "^0.25.3" - } -} diff --git a/node_modules/ansi-styles/readme.md b/node_modules/ansi-styles/readme.md deleted file mode 100644 index 24883de8..00000000 --- a/node_modules/ansi-styles/readme.md +++ /dev/null @@ -1,152 +0,0 @@ -# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) - -> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal - -You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. - - - -## Install - -``` -$ npm install ansi-styles -``` - -## Usage - -```js -const style = require('ansi-styles'); - -console.log(`${style.green.open}Hello world!${style.green.close}`); - - -// Color conversion between 16/256/truecolor -// NOTE: If conversion goes to 16 colors or 256 colors, the original color -// may be degraded to fit that color palette. This means terminals -// that do not support 16 million colors will best-match the -// original color. -console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close); -console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close); -console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close); -``` - -## API - -Each style has an `open` and `close` property. - -## Styles - -### Modifiers - -- `reset` -- `bold` -- `dim` -- `italic` *(Not widely supported)* -- `underline` -- `inverse` -- `hidden` -- `strikethrough` *(Not widely supported)* - -### Colors - -- `black` -- `red` -- `green` -- `yellow` -- `blue` -- `magenta` -- `cyan` -- `white` -- `blackBright` (alias: `gray`, `grey`) -- `redBright` -- `greenBright` -- `yellowBright` -- `blueBright` -- `magentaBright` -- `cyanBright` -- `whiteBright` - -### Background colors - -- `bgBlack` -- `bgRed` -- `bgGreen` -- `bgYellow` -- `bgBlue` -- `bgMagenta` -- `bgCyan` -- `bgWhite` -- `bgBlackBright` (alias: `bgGray`, `bgGrey`) -- `bgRedBright` -- `bgGreenBright` -- `bgYellowBright` -- `bgBlueBright` -- `bgMagentaBright` -- `bgCyanBright` -- `bgWhiteBright` - -## Advanced usage - -By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. - -- `style.modifier` -- `style.color` -- `style.bgColor` - -###### Example - -```js -console.log(style.color.green.open); -``` - -Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values. - -###### Example - -```js -console.log(style.codes.get(36)); -//=> 39 -``` - -## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728) - -`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors. - -The following color spaces from `color-convert` are supported: - -- `rgb` -- `hex` -- `keyword` -- `hsl` -- `hsv` -- `hwb` -- `ansi` -- `ansi256` - -To use these, call the associated conversion function with the intended output, for example: - -```js -style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code -style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code - -style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code -style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code - -style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code -style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code -``` - -## Related - -- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [Josh Junon](https://github.com/qix-) - -## For enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of `ansi-styles` 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-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE deleted file mode 100644 index 491766ca..00000000 --- a/node_modules/anymatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.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/anymatch/README.md b/node_modules/anymatch/README.md deleted file mode 100644 index 1dd67f53..00000000 --- a/node_modules/anymatch/README.md +++ /dev/null @@ -1,87 +0,0 @@ -anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) -====== -Javascript module to match a string against a regular expression, glob, string, -or function that takes the string as an argument and returns a truthy or falsy -value. The matcher can also be an array of any or all of these. Useful for -allowing a very flexible user-defined config to define things like file paths. - -__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ - - -Usage ------ -```sh -npm install anymatch -``` - -#### anymatch(matchers, testString, [returnIndex], [options]) -* __matchers__: (_Array|String|RegExp|Function_) -String to be directly matched, string with glob patterns, regular expression -test, function that takes the testString as an argument and returns a truthy -value if it should be matched, or an array of any number and mix of these types. -* __testString__: (_String|Array_) The string to test against the matchers. If -passed as an array, the first element of the array will be used as the -`testString` for non-function matchers, while the entire array will be applied -as the arguments for function matchers. -* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. - * __returnIndex__: (_Boolean [optional]_) If true, return the array index of -the first matcher that that testString matched, or -1 if no match, instead of a -boolean result. - -```js -const anymatch = require('anymatch'); - -const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; - -anymatch(matchers, 'path/to/file.js'); // true -anymatch(matchers, 'path/anyjs/baz.js'); // true -anymatch(matchers, 'path/to/foo.js'); // true -anymatch(matchers, 'path/to/bar.js'); // true -anymatch(matchers, 'bar.js'); // false - -// returnIndex = true -anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 -anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 - -// any picomatc - -// using globs to match directories and their children -anymatch('node_modules', 'node_modules'); // true -anymatch('node_modules', 'node_modules/somelib/index.js'); // false -anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true -anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false -anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true - -const matcher = anymatch(matchers); -['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] -anymatch master* ❯ - -``` - -#### anymatch(matchers) -You can also pass in only your matcher(s) to get a curried function that has -already been bound to the provided matching criteria. This can be used as an -`Array#filter` callback. - -```js -var matcher = anymatch(matchers); - -matcher('path/to/file.js'); // true -matcher('path/anyjs/baz.js', true); // 1 - -['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] -``` - -Changelog ----------- -[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) - -- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. -- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). -- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) -for glob pattern matching. Issues with glob pattern matching should be -reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). - -License -------- -[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts deleted file mode 100644 index 3ef7eaad..00000000 --- a/node_modules/anymatch/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -type AnymatchFn = (testString: string) => boolean; -type AnymatchPattern = string|RegExp|AnymatchFn; -type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] -type AnymatchTester = { - (testString: string|any[], returnIndex: true): number; - (testString: string|any[]): boolean; -} - -type PicomatchOptions = {dot: boolean}; - -declare const anymatch: { - (matchers: AnymatchMatcher): AnymatchTester; - (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester; - (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; - (matchers: AnymatchMatcher, testString: string|any[]): boolean; -} - -export {AnymatchMatcher as Matcher} -export {AnymatchTester as Tester} -export default anymatch diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js deleted file mode 100644 index 8eb73e9c..00000000 --- a/node_modules/anymatch/index.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { value: true }); - -const picomatch = require('picomatch'); -const normalizePath = require('normalize-path'); - -/** - * @typedef {(testString: string) => boolean} AnymatchFn - * @typedef {string|RegExp|AnymatchFn} AnymatchPattern - * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher - */ -const BANG = '!'; -const DEFAULT_OPTIONS = {returnIndex: false}; -const arrify = (item) => Array.isArray(item) ? item : [item]; - -/** - * @param {AnymatchPattern} matcher - * @param {object} options - * @returns {AnymatchFn} - */ -const createPattern = (matcher, options) => { - if (typeof matcher === 'function') { - return matcher; - } - if (typeof matcher === 'string') { - const glob = picomatch(matcher, options); - return (string) => matcher === string || glob(string); - } - if (matcher instanceof RegExp) { - return (string) => matcher.test(string); - } - return (string) => false; -}; - -/** - * @param {Array} patterns - * @param {Array} negPatterns - * @param {String|Array} args - * @param {Boolean} returnIndex - * @returns {boolean|number} - */ -const matchPatterns = (patterns, negPatterns, args, returnIndex) => { - const isList = Array.isArray(args); - const _path = isList ? args[0] : args; - if (!isList && typeof _path !== 'string') { - throw new TypeError('anymatch: second argument must be a string: got ' + - Object.prototype.toString.call(_path)) - } - const path = normalizePath(_path, false); - - for (let index = 0; index < negPatterns.length; index++) { - const nglob = negPatterns[index]; - if (nglob(path)) { - return returnIndex ? -1 : false; - } - } - - const applied = isList && [path].concat(args.slice(1)); - for (let index = 0; index < patterns.length; index++) { - const pattern = patterns[index]; - if (isList ? pattern(...applied) : pattern(path)) { - return returnIndex ? index : true; - } - } - - return returnIndex ? -1 : false; -}; - -/** - * @param {AnymatchMatcher} matchers - * @param {Array|string} testString - * @param {object} options - * @returns {boolean|number|Function} - */ -const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { - if (matchers == null) { - throw new TypeError('anymatch: specify first argument'); - } - const opts = typeof options === 'boolean' ? {returnIndex: options} : options; - const returnIndex = opts.returnIndex || false; - - // Early cache for matchers. - const mtchers = arrify(matchers); - const negatedGlobs = mtchers - .filter(item => typeof item === 'string' && item.charAt(0) === BANG) - .map(item => item.slice(1)) - .map(item => picomatch(item, opts)); - const patterns = mtchers - .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG)) - .map(matcher => createPattern(matcher, opts)); - - if (testString == null) { - return (testString, ri = false) => { - const returnIndex = typeof ri === 'boolean' ? ri : false; - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); - } - } - - return matchPatterns(patterns, negatedGlobs, testString, returnIndex); -}; - -anymatch.default = anymatch; -module.exports = anymatch; diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json deleted file mode 100644 index 2cb2307e..00000000 --- a/node_modules/anymatch/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "anymatch", - "version": "3.1.3", - "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", - "files": [ - "index.js", - "index.d.ts" - ], - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "author": { - "name": "Elan Shanker", - "url": "https://github.com/es128" - }, - "license": "ISC", - "homepage": "https://github.com/micromatch/anymatch", - "repository": { - "type": "git", - "url": "https://github.com/micromatch/anymatch" - }, - "keywords": [ - "match", - "any", - "string", - "file", - "fs", - "list", - "glob", - "regex", - "regexp", - "regular", - "expression", - "function" - ], - "scripts": { - "test": "nyc mocha", - "mocha": "mocha" - }, - "devDependencies": { - "mocha": "^6.1.3", - "nyc": "^14.0.0" - }, - "engines": { - "node": ">= 8" - } -} diff --git a/node_modules/array-flatten/LICENSE b/node_modules/array-flatten/LICENSE deleted file mode 100644 index 983fbe8a..00000000 --- a/node_modules/array-flatten/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/array-flatten/README.md b/node_modules/array-flatten/README.md deleted file mode 100644 index 91fa5b63..00000000 --- a/node_modules/array-flatten/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Array Flatten - -[![NPM version][npm-image]][npm-url] -[![NPM downloads][downloads-image]][downloads-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] - -> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. - -## Installation - -``` -npm install array-flatten --save -``` - -## Usage - -```javascript -var flatten = require('array-flatten') - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) -//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) -//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] - -(function () { - flatten(arguments) //=> [1, 2, 3] -})(1, [2, 3]) -``` - -## License - -MIT - -[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat -[npm-url]: https://npmjs.org/package/array-flatten -[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat -[downloads-url]: https://npmjs.org/package/array-flatten -[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat -[travis-url]: https://travis-ci.org/blakeembrey/array-flatten -[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat -[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/node_modules/array-flatten/array-flatten.js b/node_modules/array-flatten/array-flatten.js deleted file mode 100644 index 089117b3..00000000 --- a/node_modules/array-flatten/array-flatten.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' - -/** - * Expose `arrayFlatten`. - */ -module.exports = arrayFlatten - -/** - * Recursive flatten function with depth. - * - * @param {Array} array - * @param {Array} result - * @param {Number} depth - * @return {Array} - */ -function flattenWithDepth (array, result, depth) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (depth > 0 && Array.isArray(value)) { - flattenWithDepth(value, result, depth - 1) - } else { - result.push(value) - } - } - - return result -} - -/** - * Recursive flatten function. Omitting depth is slightly faster. - * - * @param {Array} array - * @param {Array} result - * @return {Array} - */ -function flattenForever (array, result) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (Array.isArray(value)) { - flattenForever(value, result) - } else { - result.push(value) - } - } - - return result -} - -/** - * Flatten an array, with the ability to define a depth. - * - * @param {Array} array - * @param {Number} depth - * @return {Array} - */ -function arrayFlatten (array, depth) { - if (depth == null) { - return flattenForever(array, []) - } - - return flattenWithDepth(array, [], depth) -} diff --git a/node_modules/array-flatten/package.json b/node_modules/array-flatten/package.json deleted file mode 100644 index 1a24e2a1..00000000 --- a/node_modules/array-flatten/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "array-flatten", - "version": "1.1.1", - "description": "Flatten an array of nested arrays into a single flat array", - "main": "array-flatten.js", - "files": [ - "array-flatten.js", - "LICENSE" - ], - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "repository": { - "type": "git", - "url": "git://github.com/blakeembrey/array-flatten.git" - }, - "keywords": [ - "array", - "flatten", - "arguments", - "depth" - ], - "author": { - "name": "Blake Embrey", - "email": "hello@blakeembrey.com", - "url": "http://blakeembrey.me" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/blakeembrey/array-flatten/issues" - }, - "homepage": "https://github.com/blakeembrey/array-flatten", - "devDependencies": { - "istanbul": "^0.3.13", - "mocha": "^2.2.4", - "pre-commit": "^1.0.7", - "standard": "^3.7.3" - } -} diff --git a/node_modules/asn1/Jenkinsfile b/node_modules/asn1/Jenkinsfile deleted file mode 100644 index d1b45937..00000000 --- a/node_modules/asn1/Jenkinsfile +++ /dev/null @@ -1,65 +0,0 @@ -@Library('jenkins-joylib@v1.0.8') _ - -pipeline { - - agent none - - options { - buildDiscarder(logRotator(numToKeepStr: '45')) - timestamps() - } - - stages { - stage('top') { - parallel { - stage('v4-zone') { - agent { - label joyCommonLabels(image_ver: '15.4.1') - } - tools { - nodejs 'sdcnode-v4-zone' - } - stages { - stage('check') { - steps{ - sh('make check') - } - } - stage('test') { - steps{ - sh('make test') - } - } - } - } - - stage('v6-zone64') { - agent { - label joyCommonLabels(image_ver: '18.4.0') - } - tools { - nodejs 'sdcnode-v6-zone64' - } - stages { - stage('check') { - steps{ - sh('make check') - } - } - stage('test') { - steps{ - sh('make test') - } - } - } - } - } - } - } - - post { - always { - joySlackNotifications() - } - } -} diff --git a/node_modules/asn1/LICENSE b/node_modules/asn1/LICENSE deleted file mode 100644 index 9b5dcdb7..00000000 --- a/node_modules/asn1/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Mark Cavage, 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/asn1/README.md b/node_modules/asn1/README.md deleted file mode 100644 index 2208210a..00000000 --- a/node_modules/asn1/README.md +++ /dev/null @@ -1,50 +0,0 @@ -node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS. -Currently BER encoding is supported; at some point I'll likely have to do DER. - -## Usage - -Mostly, if you're *actually* needing to read and write ASN.1, you probably don't -need this readme to explain what and why. If you have no idea what ASN.1 is, -see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc - -The source is pretty much self-explanatory, and has read/write methods for the -common types out there. - -### Decoding - -The following reads an ASN.1 sequence with a boolean. - - var Ber = require('asn1').Ber; - - var reader = new Ber.Reader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff])); - - reader.readSequence(); - console.log('Sequence len: ' + reader.length); - if (reader.peek() === Ber.Boolean) - console.log(reader.readBoolean()); - -### Encoding - -The following generates the same payload as above. - - var Ber = require('asn1').Ber; - - var writer = new Ber.Writer(); - - writer.startSequence(); - writer.writeBoolean(true); - writer.endSequence(); - - console.log(writer.buffer); - -## Installation - - npm install asn1 - -## License - -MIT. - -## Bugs - -See . diff --git a/node_modules/asn1/lib/ber/errors.js b/node_modules/asn1/lib/ber/errors.js deleted file mode 100644 index 4557b8ae..00000000 --- a/node_modules/asn1/lib/ber/errors.js +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - - -module.exports = { - - newInvalidAsn1Error: function (msg) { - var e = new Error(); - e.name = 'InvalidAsn1Error'; - e.message = msg || ''; - return e; - } - -}; diff --git a/node_modules/asn1/lib/ber/index.js b/node_modules/asn1/lib/ber/index.js deleted file mode 100644 index 387d1326..00000000 --- a/node_modules/asn1/lib/ber/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - -var errors = require('./errors'); -var types = require('./types'); - -var Reader = require('./reader'); -var Writer = require('./writer'); - - -// --- Exports - -module.exports = { - - Reader: Reader, - - Writer: Writer - -}; - -for (var t in types) { - if (types.hasOwnProperty(t)) - module.exports[t] = types[t]; -} -for (var e in errors) { - if (errors.hasOwnProperty(e)) - module.exports[e] = errors[e]; -} diff --git a/node_modules/asn1/lib/ber/reader.js b/node_modules/asn1/lib/ber/reader.js deleted file mode 100644 index 8a7e4ca0..00000000 --- a/node_modules/asn1/lib/ber/reader.js +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - -var assert = require('assert'); -var Buffer = require('safer-buffer').Buffer; - -var ASN1 = require('./types'); -var errors = require('./errors'); - - -// --- Globals - -var newInvalidAsn1Error = errors.newInvalidAsn1Error; - - - -// --- API - -function Reader(data) { - if (!data || !Buffer.isBuffer(data)) - throw new TypeError('data must be a node Buffer'); - - this._buf = data; - this._size = data.length; - - // These hold the "current" state - this._len = 0; - this._offset = 0; -} - -Object.defineProperty(Reader.prototype, 'length', { - enumerable: true, - get: function () { return (this._len); } -}); - -Object.defineProperty(Reader.prototype, 'offset', { - enumerable: true, - get: function () { return (this._offset); } -}); - -Object.defineProperty(Reader.prototype, 'remain', { - get: function () { return (this._size - this._offset); } -}); - -Object.defineProperty(Reader.prototype, 'buffer', { - get: function () { return (this._buf.slice(this._offset)); } -}); - - -/** - * Reads a single byte and advances offset; you can pass in `true` to make this - * a "peek" operation (i.e., get the byte, but don't advance the offset). - * - * @param {Boolean} peek true means don't move offset. - * @return {Number} the next byte, null if not enough data. - */ -Reader.prototype.readByte = function (peek) { - if (this._size - this._offset < 1) - return null; - - var b = this._buf[this._offset] & 0xff; - - if (!peek) - this._offset += 1; - - return b; -}; - - -Reader.prototype.peek = function () { - return this.readByte(true); -}; - - -/** - * Reads a (potentially) variable length off the BER buffer. This call is - * not really meant to be called directly, as callers have to manipulate - * the internal buffer afterwards. - * - * As a result of this call, you can call `Reader.length`, until the - * next thing called that does a readLength. - * - * @return {Number} the amount of offset to advance the buffer. - * @throws {InvalidAsn1Error} on bad ASN.1 - */ -Reader.prototype.readLength = function (offset) { - if (offset === undefined) - offset = this._offset; - - if (offset >= this._size) - return null; - - var lenB = this._buf[offset++] & 0xff; - if (lenB === null) - return null; - - if ((lenB & 0x80) === 0x80) { - lenB &= 0x7f; - - if (lenB === 0) - throw newInvalidAsn1Error('Indefinite length not supported'); - - if (lenB > 4) - throw newInvalidAsn1Error('encoding too long'); - - if (this._size - offset < lenB) - return null; - - this._len = 0; - for (var i = 0; i < lenB; i++) - this._len = (this._len << 8) + (this._buf[offset++] & 0xff); - - } else { - // Wasn't a variable length - this._len = lenB; - } - - return offset; -}; - - -/** - * Parses the next sequence in this BER buffer. - * - * To get the length of the sequence, call `Reader.length`. - * - * @return {Number} the sequence's tag. - */ -Reader.prototype.readSequence = function (tag) { - var seq = this.peek(); - if (seq === null) - return null; - if (tag !== undefined && tag !== seq) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + seq.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - if (o === null) - return null; - - this._offset = o; - return seq; -}; - - -Reader.prototype.readInt = function () { - return this._readTag(ASN1.Integer); -}; - - -Reader.prototype.readBoolean = function () { - return (this._readTag(ASN1.Boolean) === 0 ? false : true); -}; - - -Reader.prototype.readEnumeration = function () { - return this._readTag(ASN1.Enumeration); -}; - - -Reader.prototype.readString = function (tag, retbuf) { - if (!tag) - tag = ASN1.OctetString; - - var b = this.peek(); - if (b === null) - return null; - - if (b !== tag) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + b.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - - if (o === null) - return null; - - if (this.length > this._size - o) - return null; - - this._offset = o; - - if (this.length === 0) - return retbuf ? Buffer.alloc(0) : ''; - - var str = this._buf.slice(this._offset, this._offset + this.length); - this._offset += this.length; - - return retbuf ? str : str.toString('utf8'); -}; - -Reader.prototype.readOID = function (tag) { - if (!tag) - tag = ASN1.OID; - - var b = this.readString(tag, true); - if (b === null) - return null; - - var values = []; - var value = 0; - - for (var i = 0; i < b.length; i++) { - var byte = b[i] & 0xff; - - value <<= 7; - value += byte & 0x7f; - if ((byte & 0x80) === 0) { - values.push(value); - value = 0; - } - } - - value = values.shift(); - values.unshift(value % 40); - values.unshift((value / 40) >> 0); - - return values.join('.'); -}; - - -Reader.prototype._readTag = function (tag) { - assert.ok(tag !== undefined); - - var b = this.peek(); - - if (b === null) - return null; - - if (b !== tag) - throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + - ': got 0x' + b.toString(16)); - - var o = this.readLength(this._offset + 1); // stored in `length` - if (o === null) - return null; - - if (this.length > 4) - throw newInvalidAsn1Error('Integer too long: ' + this.length); - - if (this.length > this._size - o) - return null; - this._offset = o; - - var fb = this._buf[this._offset]; - var value = 0; - - for (var i = 0; i < this.length; i++) { - value <<= 8; - value |= (this._buf[this._offset++] & 0xff); - } - - if ((fb & 0x80) === 0x80 && i !== 4) - value -= (1 << (i * 8)); - - return value >> 0; -}; - - - -// --- Exported API - -module.exports = Reader; diff --git a/node_modules/asn1/lib/ber/types.js b/node_modules/asn1/lib/ber/types.js deleted file mode 100644 index 8aea0001..00000000 --- a/node_modules/asn1/lib/ber/types.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - - -module.exports = { - EOC: 0, - Boolean: 1, - Integer: 2, - BitString: 3, - OctetString: 4, - Null: 5, - OID: 6, - ObjectDescriptor: 7, - External: 8, - Real: 9, // float - Enumeration: 10, - PDV: 11, - Utf8String: 12, - RelativeOID: 13, - Sequence: 16, - Set: 17, - NumericString: 18, - PrintableString: 19, - T61String: 20, - VideotexString: 21, - IA5String: 22, - UTCTime: 23, - GeneralizedTime: 24, - GraphicString: 25, - VisibleString: 26, - GeneralString: 28, - UniversalString: 29, - CharacterString: 30, - BMPString: 31, - Constructor: 32, - Context: 128 -}; diff --git a/node_modules/asn1/lib/ber/writer.js b/node_modules/asn1/lib/ber/writer.js deleted file mode 100644 index 3515acf7..00000000 --- a/node_modules/asn1/lib/ber/writer.js +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - -var assert = require('assert'); -var Buffer = require('safer-buffer').Buffer; -var ASN1 = require('./types'); -var errors = require('./errors'); - - -// --- Globals - -var newInvalidAsn1Error = errors.newInvalidAsn1Error; - -var DEFAULT_OPTS = { - size: 1024, - growthFactor: 8 -}; - - -// --- Helpers - -function merge(from, to) { - assert.ok(from); - assert.equal(typeof (from), 'object'); - assert.ok(to); - assert.equal(typeof (to), 'object'); - - var keys = Object.getOwnPropertyNames(from); - keys.forEach(function (key) { - if (to[key]) - return; - - var value = Object.getOwnPropertyDescriptor(from, key); - Object.defineProperty(to, key, value); - }); - - return to; -} - - - -// --- API - -function Writer(options) { - options = merge(DEFAULT_OPTS, options || {}); - - this._buf = Buffer.alloc(options.size || 1024); - this._size = this._buf.length; - this._offset = 0; - this._options = options; - - // A list of offsets in the buffer where we need to insert - // sequence tag/len pairs. - this._seq = []; -} - -Object.defineProperty(Writer.prototype, 'buffer', { - get: function () { - if (this._seq.length) - throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)'); - - return (this._buf.slice(0, this._offset)); - } -}); - -Writer.prototype.writeByte = function (b) { - if (typeof (b) !== 'number') - throw new TypeError('argument must be a Number'); - - this._ensure(1); - this._buf[this._offset++] = b; -}; - - -Writer.prototype.writeInt = function (i, tag) { - if (typeof (i) !== 'number') - throw new TypeError('argument must be a Number'); - if (typeof (tag) !== 'number') - tag = ASN1.Integer; - - var sz = 4; - - while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && - (sz > 1)) { - sz--; - i <<= 8; - } - - if (sz > 4) - throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff'); - - this._ensure(2 + sz); - this._buf[this._offset++] = tag; - this._buf[this._offset++] = sz; - - while (sz-- > 0) { - this._buf[this._offset++] = ((i & 0xff000000) >>> 24); - i <<= 8; - } - -}; - - -Writer.prototype.writeNull = function () { - this.writeByte(ASN1.Null); - this.writeByte(0x00); -}; - - -Writer.prototype.writeEnumeration = function (i, tag) { - if (typeof (i) !== 'number') - throw new TypeError('argument must be a Number'); - if (typeof (tag) !== 'number') - tag = ASN1.Enumeration; - - return this.writeInt(i, tag); -}; - - -Writer.prototype.writeBoolean = function (b, tag) { - if (typeof (b) !== 'boolean') - throw new TypeError('argument must be a Boolean'); - if (typeof (tag) !== 'number') - tag = ASN1.Boolean; - - this._ensure(3); - this._buf[this._offset++] = tag; - this._buf[this._offset++] = 0x01; - this._buf[this._offset++] = b ? 0xff : 0x00; -}; - - -Writer.prototype.writeString = function (s, tag) { - if (typeof (s) !== 'string') - throw new TypeError('argument must be a string (was: ' + typeof (s) + ')'); - if (typeof (tag) !== 'number') - tag = ASN1.OctetString; - - var len = Buffer.byteLength(s); - this.writeByte(tag); - this.writeLength(len); - if (len) { - this._ensure(len); - this._buf.write(s, this._offset); - this._offset += len; - } -}; - - -Writer.prototype.writeBuffer = function (buf, tag) { - if (typeof (tag) !== 'number') - throw new TypeError('tag must be a number'); - if (!Buffer.isBuffer(buf)) - throw new TypeError('argument must be a buffer'); - - this.writeByte(tag); - this.writeLength(buf.length); - this._ensure(buf.length); - buf.copy(this._buf, this._offset, 0, buf.length); - this._offset += buf.length; -}; - - -Writer.prototype.writeStringArray = function (strings) { - if ((!strings instanceof Array)) - throw new TypeError('argument must be an Array[String]'); - - var self = this; - strings.forEach(function (s) { - self.writeString(s); - }); -}; - -// This is really to solve DER cases, but whatever for now -Writer.prototype.writeOID = function (s, tag) { - if (typeof (s) !== 'string') - throw new TypeError('argument must be a string'); - if (typeof (tag) !== 'number') - tag = ASN1.OID; - - if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) - throw new Error('argument is not a valid OID string'); - - function encodeOctet(bytes, octet) { - if (octet < 128) { - bytes.push(octet); - } else if (octet < 16384) { - bytes.push((octet >>> 7) | 0x80); - bytes.push(octet & 0x7F); - } else if (octet < 2097152) { - bytes.push((octet >>> 14) | 0x80); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } else if (octet < 268435456) { - bytes.push((octet >>> 21) | 0x80); - bytes.push(((octet >>> 14) | 0x80) & 0xFF); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } else { - bytes.push(((octet >>> 28) | 0x80) & 0xFF); - bytes.push(((octet >>> 21) | 0x80) & 0xFF); - bytes.push(((octet >>> 14) | 0x80) & 0xFF); - bytes.push(((octet >>> 7) | 0x80) & 0xFF); - bytes.push(octet & 0x7F); - } - } - - var tmp = s.split('.'); - var bytes = []; - bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); - tmp.slice(2).forEach(function (b) { - encodeOctet(bytes, parseInt(b, 10)); - }); - - var self = this; - this._ensure(2 + bytes.length); - this.writeByte(tag); - this.writeLength(bytes.length); - bytes.forEach(function (b) { - self.writeByte(b); - }); -}; - - -Writer.prototype.writeLength = function (len) { - if (typeof (len) !== 'number') - throw new TypeError('argument must be a Number'); - - this._ensure(4); - - if (len <= 0x7f) { - this._buf[this._offset++] = len; - } else if (len <= 0xff) { - this._buf[this._offset++] = 0x81; - this._buf[this._offset++] = len; - } else if (len <= 0xffff) { - this._buf[this._offset++] = 0x82; - this._buf[this._offset++] = len >> 8; - this._buf[this._offset++] = len; - } else if (len <= 0xffffff) { - this._buf[this._offset++] = 0x83; - this._buf[this._offset++] = len >> 16; - this._buf[this._offset++] = len >> 8; - this._buf[this._offset++] = len; - } else { - throw newInvalidAsn1Error('Length too long (> 4 bytes)'); - } -}; - -Writer.prototype.startSequence = function (tag) { - if (typeof (tag) !== 'number') - tag = ASN1.Sequence | ASN1.Constructor; - - this.writeByte(tag); - this._seq.push(this._offset); - this._ensure(3); - this._offset += 3; -}; - - -Writer.prototype.endSequence = function () { - var seq = this._seq.pop(); - var start = seq + 3; - var len = this._offset - start; - - if (len <= 0x7f) { - this._shift(start, len, -2); - this._buf[seq] = len; - } else if (len <= 0xff) { - this._shift(start, len, -1); - this._buf[seq] = 0x81; - this._buf[seq + 1] = len; - } else if (len <= 0xffff) { - this._buf[seq] = 0x82; - this._buf[seq + 1] = len >> 8; - this._buf[seq + 2] = len; - } else if (len <= 0xffffff) { - this._shift(start, len, 1); - this._buf[seq] = 0x83; - this._buf[seq + 1] = len >> 16; - this._buf[seq + 2] = len >> 8; - this._buf[seq + 3] = len; - } else { - throw newInvalidAsn1Error('Sequence too long'); - } -}; - - -Writer.prototype._shift = function (start, len, shift) { - assert.ok(start !== undefined); - assert.ok(len !== undefined); - assert.ok(shift); - - this._buf.copy(this._buf, start + shift, start, start + len); - this._offset += shift; -}; - -Writer.prototype._ensure = function (len) { - assert.ok(len); - - if (this._size - this._offset < len) { - var sz = this._size * this._options.growthFactor; - if (sz - this._offset < len) - sz += len; - - var buf = Buffer.alloc(sz); - - this._buf.copy(buf, 0, 0, this._offset); - this._buf = buf; - this._size = sz; - } -}; - - - -// --- Exported API - -module.exports = Writer; diff --git a/node_modules/asn1/lib/index.js b/node_modules/asn1/lib/index.js deleted file mode 100644 index ede3ab23..00000000 --- a/node_modules/asn1/lib/index.js +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2011 Mark Cavage All rights reserved. - -// If you have no idea what ASN.1 or BER is, see this: -// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc - -var Ber = require('./ber/index'); - - - -// --- Exported API - -module.exports = { - - Ber: Ber, - - BerReader: Ber.Reader, - - BerWriter: Ber.Writer - -}; diff --git a/node_modules/asn1/package.json b/node_modules/asn1/package.json deleted file mode 100644 index e31cce5e..00000000 --- a/node_modules/asn1/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "author": "Joyent (joyent.com)", - "contributors": [ - "Mark Cavage ", - "David Gwynne ", - "Yunong Xiao ", - "Alex Wilson " - ], - "name": "asn1", - "description": "Contains parsers and serializers for ASN.1 (currently BER only)", - "version": "0.2.6", - "repository": { - "type": "git", - "url": "https://github.com/joyent/node-asn1.git" - }, - "main": "lib/index.js", - "dependencies": { - "safer-buffer": "~2.1.0" - }, - "devDependencies": { - "istanbul": "^0.3.6", - "faucet": "0.0.1", - "tape": "^3.5.0", - "eslint": "2.13.1", - "eslint-plugin-joyent": "~1.3.0" - }, - "scripts": { - "test": "./node_modules/.bin/tape ./test/ber/*.test.js" - }, - "license": "MIT" -} diff --git a/node_modules/assert-plus/AUTHORS b/node_modules/assert-plus/AUTHORS deleted file mode 100644 index 1923524f..00000000 --- a/node_modules/assert-plus/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -Dave Eddy -Fred Kuo -Lars-Magnus Skog -Mark Cavage -Patrick Mooney -Rob Gulewich diff --git a/node_modules/assert-plus/CHANGES.md b/node_modules/assert-plus/CHANGES.md deleted file mode 100644 index 57d92bfd..00000000 --- a/node_modules/assert-plus/CHANGES.md +++ /dev/null @@ -1,14 +0,0 @@ -# assert-plus Changelog - -## 1.0.0 - -- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input -- Add assert.finite check. Previous assert.number callers should use this if - they expect Infinity inputs to throw. - -## 0.2.0 - -- Fix `assert.object(null)` so it throws -- Fix optional/arrayOf exports for non-type-of asserts -- Add optiona/arrayOf exports for Stream/Date/Regex/uuid -- Add basic unit test coverage diff --git a/node_modules/assert-plus/README.md b/node_modules/assert-plus/README.md deleted file mode 100644 index ec200d16..00000000 --- a/node_modules/assert-plus/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# assert-plus - -This library is a super small wrapper over node's assert module that has two -things: (1) the ability to disable assertions with the environment variable -NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like -`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks -like this: - -```javascript - var assert = require('assert-plus'); - - function fooAccount(options, callback) { - assert.object(options, 'options'); - assert.number(options.id, 'options.id'); - assert.bool(options.isManager, 'options.isManager'); - assert.string(options.name, 'options.name'); - assert.arrayOfString(options.email, 'options.email'); - assert.func(callback, 'callback'); - - // Do stuff - callback(null, {}); - } -``` - -# API - -All methods that *aren't* part of node's core assert API are simply assumed to -take an argument, and then a string 'name' that's not a message; `AssertionError` -will be thrown if the assertion fails with a message like: - - AssertionError: foo (string) is required - at test (/home/mark/work/foo/foo.js:3:9) - at Object. (/home/mark/work/foo/foo.js:15:1) - at Module._compile (module.js:446:26) - at Object..js (module.js:464:10) - at Module.load (module.js:353:31) - at Function._load (module.js:311:12) - at Array.0 (module.js:484:10) - at EventEmitter._tickCallback (node.js:190:38) - -from: - -```javascript - function test(foo) { - assert.string(foo, 'foo'); - } -``` - -There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: - -```javascript - function test(foo) { - assert.arrayOfString(foo, 'foo'); - } -``` - -You can assert IFF an argument is not `undefined` (i.e., an optional arg): - -```javascript - assert.optionalString(foo, 'foo'); -``` - -Lastly, you can opt-out of assertion checking altogether by setting the -environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have -lots of assertions, and don't want to pay `typeof ()` taxes to v8 in -production. Be advised: The standard functions re-exported from `assert` are -also disabled in assert-plus if NDEBUG is specified. Using them directly from -the `assert` module avoids this behavior. - -The complete list of APIs is: - -* assert.array -* assert.bool -* assert.buffer -* assert.func -* assert.number -* assert.finite -* assert.object -* assert.string -* assert.stream -* assert.date -* assert.regexp -* assert.uuid -* assert.arrayOfArray -* assert.arrayOfBool -* assert.arrayOfBuffer -* assert.arrayOfFunc -* assert.arrayOfNumber -* assert.arrayOfFinite -* assert.arrayOfObject -* assert.arrayOfString -* assert.arrayOfStream -* assert.arrayOfDate -* assert.arrayOfRegexp -* assert.arrayOfUuid -* assert.optionalArray -* assert.optionalBool -* assert.optionalBuffer -* assert.optionalFunc -* assert.optionalNumber -* assert.optionalFinite -* assert.optionalObject -* assert.optionalString -* assert.optionalStream -* assert.optionalDate -* assert.optionalRegexp -* assert.optionalUuid -* assert.optionalArrayOfArray -* assert.optionalArrayOfBool -* assert.optionalArrayOfBuffer -* assert.optionalArrayOfFunc -* assert.optionalArrayOfNumber -* assert.optionalArrayOfFinite -* assert.optionalArrayOfObject -* assert.optionalArrayOfString -* assert.optionalArrayOfStream -* assert.optionalArrayOfDate -* assert.optionalArrayOfRegexp -* assert.optionalArrayOfUuid -* assert.AssertionError -* assert.fail -* assert.ok -* assert.equal -* assert.notEqual -* assert.deepEqual -* assert.notDeepEqual -* assert.strictEqual -* assert.notStrictEqual -* assert.throws -* assert.doesNotThrow -* assert.ifError - -# Installation - - npm install assert-plus - -## License - -The MIT License (MIT) -Copyright (c) 2012 Mark Cavage - -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. - -## Bugs - -See . diff --git a/node_modules/assert-plus/assert.js b/node_modules/assert-plus/assert.js deleted file mode 100644 index 26f944ee..00000000 --- a/node_modules/assert-plus/assert.js +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) 2012, Mark Cavage. All rights reserved. -// Copyright 2015 Joyent, Inc. - -var assert = require('assert'); -var Stream = require('stream').Stream; -var util = require('util'); - - -///--- Globals - -/* JSSTYLED */ -var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; - - -///--- Internal - -function _capitalize(str) { - return (str.charAt(0).toUpperCase() + str.slice(1)); -} - -function _toss(name, expected, oper, arg, actual) { - throw new assert.AssertionError({ - message: util.format('%s (%s) is required', name, expected), - actual: (actual === undefined) ? typeof (arg) : actual(arg), - expected: expected, - operator: oper || '===', - stackStartFunction: _toss.caller - }); -} - -function _getClass(arg) { - return (Object.prototype.toString.call(arg).slice(8, -1)); -} - -function noop() { - // Why even bother with asserts? -} - - -///--- Exports - -var types = { - bool: { - check: function (arg) { return typeof (arg) === 'boolean'; } - }, - func: { - check: function (arg) { return typeof (arg) === 'function'; } - }, - string: { - check: function (arg) { return typeof (arg) === 'string'; } - }, - object: { - check: function (arg) { - return typeof (arg) === 'object' && arg !== null; - } - }, - number: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg); - } - }, - finite: { - check: function (arg) { - return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); - } - }, - buffer: { - check: function (arg) { return Buffer.isBuffer(arg); }, - operator: 'Buffer.isBuffer' - }, - array: { - check: function (arg) { return Array.isArray(arg); }, - operator: 'Array.isArray' - }, - stream: { - check: function (arg) { return arg instanceof Stream; }, - operator: 'instanceof', - actual: _getClass - }, - date: { - check: function (arg) { return arg instanceof Date; }, - operator: 'instanceof', - actual: _getClass - }, - regexp: { - check: function (arg) { return arg instanceof RegExp; }, - operator: 'instanceof', - actual: _getClass - }, - uuid: { - check: function (arg) { - return typeof (arg) === 'string' && UUID_REGEXP.test(arg); - }, - operator: 'isUUID' - } -}; - -function _setExports(ndebug) { - var keys = Object.keys(types); - var out; - - /* re-export standard assert */ - if (process.env.NODE_NDEBUG) { - out = noop; - } else { - out = function (arg, msg) { - if (!arg) { - _toss(msg, 'true', arg); - } - }; - } - - /* standard checks */ - keys.forEach(function (k) { - if (ndebug) { - out[k] = noop; - return; - } - var type = types[k]; - out[k] = function (arg, msg) { - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* optional checks */ - keys.forEach(function (k) { - var name = 'optional' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* arrayOf checks */ - keys.forEach(function (k) { - var name = 'arrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* optionalArrayOf checks */ - keys.forEach(function (k) { - var name = 'optionalArrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* re-export built-in assertions */ - Object.keys(assert).forEach(function (k) { - if (k === 'AssertionError') { - out[k] = assert[k]; - return; - } - if (ndebug) { - out[k] = noop; - return; - } - out[k] = assert[k]; - }); - - /* export ourselves (for unit tests _only_) */ - out._setExports = _setExports; - - return out; -} - -module.exports = _setExports(process.env.NODE_NDEBUG); diff --git a/node_modules/assert-plus/package.json b/node_modules/assert-plus/package.json deleted file mode 100644 index 40d6a5cd..00000000 --- a/node_modules/assert-plus/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "author": "Mark Cavage ", - "name": "assert-plus", - "description": "Extra assertions on top of node's assert module", - "version": "1.0.0", - "license": "MIT", - "main": "./assert.js", - "devDependencies": { - "tape": "4.2.2", - "faucet": "0.0.1" - }, - "optionalDependencies": {}, - "scripts": { - "test": "./node_modules/.bin/tape tests/*.js | ./node_modules/.bin/faucet" - }, - "repository": { - "type": "git", - "url": "https://github.com/mcavage/node-assert-plus.git" - }, - "engines": { - "node": ">=0.8" - } -} diff --git a/node_modules/async/CHANGELOG.md b/node_modules/async/CHANGELOG.md deleted file mode 100644 index 8a9a1bfd..00000000 --- a/node_modules/async/CHANGELOG.md +++ /dev/null @@ -1,348 +0,0 @@ -# v3.2.4 -- Fix a bug in `priorityQueue` where it didn't wait for the result. (#1725) -- Fix a bug where `unshiftAsync` was included in `priorityQueue`. (#1790) - -# v3.2.3 -- Fix bugs in comment parsing in `autoInject`. (#1767, #1780) - -# v3.2.2 -- Fix potential prototype pollution exploit - -# v3.2.1 -- Use `queueMicrotask` if available to the environment (#1761) -- Minor perf improvement in `priorityQueue` (#1727) -- More examples in documentation (#1726) -- Various doc fixes (#1708, #1712, #1717, #1740, #1739, #1749, #1756) -- Improved test coverage (#1754) - -# v3.2.0 -- Fix a bug in Safari related to overwriting `func.name` -- Remove built-in browserify configuration (#1653) -- Varios doc fixes (#1688, #1703, #1704) - -# v3.1.1 -- Allow redefining `name` property on wrapped functions. - -# v3.1.0 - -- Added `q.pushAsync` and `q.unshiftAsync`, analagous to `q.push` and `q.unshift`, except they always do not accept a callback, and reject if processing the task errors. (#1659) -- Promises returned from `q.push` and `q.unshift` when a callback is not passed now resolve even if an error ocurred. (#1659) -- Fixed a parsing bug in `autoInject` with complicated function bodies (#1663) -- Added ES6+ configuration for Browserify bundlers (#1653) -- Various doc fixes (#1664, #1658, #1665, #1652) - -# v3.0.1 - -## Bug fixes -- Fixed a regression where arrays passed to `queue` and `cargo` would be completely flattened. (#1645) -- Clarified Async's browser support (#1643) - - -# v3.0.0 - -The `async`/`await` release! - -There are a lot of new features and subtle breaking changes in this major version, but the biggest feature is that most Async methods return a Promise if you omit the callback, meaning you can `await` them from within an `async` function. - -```js -const results = await async.mapLimit(urls, 5, async url => { - const resp = await fetch(url) - return resp.body -}) -``` - -## Breaking Changes -- Most Async methods return a Promise when the final callback is omitted, making them `await`-able! (#1572) -- We are now making heavy use of ES2015 features, this means we have dropped out-of-the-box support for Node 4 and earlier, and many old versions of browsers. (#1541, #1553) -- In `queue`, `priorityQueue`, `cargo` and `cargoQueue`, the "event"-style methods, like `q.drain` and `q.saturated` are now methods that register a callback, rather than properties you assign a callback to. They are now of the form `q.drain(callback)`. If you do not pass a callback a Promise will be returned for the next occurrence of the event, making them `await`-able, e.g. `await q.drain()`. (#1586, #1641) -- Calling `callback(false)` will cancel an async method, preventing further iteration and callback calls. This is useful for preventing memory leaks when you break out of an async flow by calling an outer callback. (#1064, #1542) -- `during` and `doDuring` have been removed, and instead `whilst`, `doWhilst`, `until` and `doUntil` now have asynchronous `test` functions. (#850, #1557) -- `limits` of less than 1 now cause an error to be thrown in queues and collection methods. (#1249, #1552) -- `memoize` no longer memoizes errors (#1465, #1466) -- `applyEach`/`applyEachSeries` have a simpler interface, to make them more easily type-able. It always returns a function that takes in a single callback argument. If that callback is omitted, a promise is returned, making it awaitable. (#1228, #1640) - -## New Features -- Async generators are now supported in all the Collection methods. (#1560) -- Added `cargoQueue`, a queue with both `concurrency` and `payload` size parameters. (#1567) -- Queue objects returned from `queue` now have a `Symbol.iterator` method, meaning they can be iterated over to inspect the current list of items in the queue. (#1459, #1556) -- A ESM-flavored `async.mjs` is included in the `async` package. This is described in the `package.json` `"module"` field, meaning it should be automatically used by Webpack and other compatible bundlers. - -## Bug fixes -- Better handle arbitrary error objects in `asyncify` (#1568, #1569) - -## Other -- Removed Lodash as a dependency (#1283, #1528) -- Miscellaneous docs fixes (#1393, #1501, #1540, #1543, #1558, #1563, #1564, #1579, #1581) -- Miscellaneous test fixes (#1538) - -------- - -# v2.6.1 -- Updated lodash to prevent `npm audit` warnings. (#1532, #1533) -- Made `async-es` more optimized for webpack users (#1517) -- Fixed a stack overflow with large collections and a synchronous iterator (#1514) -- Various small fixes/chores (#1505, #1511, #1527, #1530) - -# v2.6.0 -- Added missing aliases for many methods. Previously, you could not (e.g.) `require('async/find')` or use `async.anyLimit`. (#1483) -- Improved `queue` performance. (#1448, #1454) -- Add missing sourcemap (#1452, #1453) -- Various doc updates (#1448, #1471, #1483) - -# v2.5.0 -- Added `concatLimit`, the `Limit` equivalent of [`concat`](https://caolan.github.io/async/docs.html#concat) ([#1426](https://github.com/caolan/async/issues/1426), [#1430](https://github.com/caolan/async/pull/1430)) -- `concat` improvements: it now preserves order, handles falsy values and the `iteratee` callback takes a variable number of arguments ([#1437](https://github.com/caolan/async/issues/1437), [#1436](https://github.com/caolan/async/pull/1436)) -- Fixed an issue in `queue` where there was a size discrepancy between `workersList().length` and `running()` ([#1428](https://github.com/caolan/async/issues/1428), [#1429](https://github.com/caolan/async/pull/1429)) -- Various doc fixes ([#1422](https://github.com/caolan/async/issues/1422), [#1424](https://github.com/caolan/async/pull/1424)) - -# v2.4.1 -- Fixed a bug preventing functions wrapped with `timeout()` from being re-used. ([#1418](https://github.com/caolan/async/issues/1418), [#1419](https://github.com/caolan/async/issues/1419)) - -# v2.4.0 -- Added `tryEach`, for running async functions in parallel, where you only expect one to succeed. ([#1365](https://github.com/caolan/async/issues/1365), [#687](https://github.com/caolan/async/issues/687)) -- Improved performance, most notably in `parallel` and `waterfall` ([#1395](https://github.com/caolan/async/issues/1395)) -- Added `queue.remove()`, for removing items in a `queue` ([#1397](https://github.com/caolan/async/issues/1397), [#1391](https://github.com/caolan/async/issues/1391)) -- Fixed using `eval`, preventing Async from running in pages with Content Security Policy ([#1404](https://github.com/caolan/async/issues/1404), [#1403](https://github.com/caolan/async/issues/1403)) -- Fixed errors thrown in an `asyncify`ed function's callback being caught by the underlying Promise ([#1408](https://github.com/caolan/async/issues/1408)) -- Fixed timing of `queue.empty()` ([#1367](https://github.com/caolan/async/issues/1367)) -- Various doc fixes ([#1314](https://github.com/caolan/async/issues/1314), [#1394](https://github.com/caolan/async/issues/1394), [#1412](https://github.com/caolan/async/issues/1412)) - -# v2.3.0 -- Added support for ES2017 `async` functions. Wherever you can pass a Node-style/CPS function that uses a callback, you can also pass an `async` function. Previously, you had to wrap `async` functions with `asyncify`. The caveat is that it will only work if `async` functions are supported natively in your environment, transpiled implementations can't be detected. ([#1386](https://github.com/caolan/async/issues/1386), [#1390](https://github.com/caolan/async/issues/1390)) -- Small doc fix ([#1392](https://github.com/caolan/async/issues/1392)) - -# v2.2.0 -- Added `groupBy`, and the `Series`/`Limit` equivalents, analogous to [`_.groupBy`](http://lodash.com/docs#groupBy) ([#1364](https://github.com/caolan/async/issues/1364)) -- Fixed `transform` bug when `callback` was not passed ([#1381](https://github.com/caolan/async/issues/1381)) -- Added note about `reflect` to `parallel` docs ([#1385](https://github.com/caolan/async/issues/1385)) - -# v2.1.5 -- Fix `auto` bug when function names collided with Array.prototype ([#1358](https://github.com/caolan/async/issues/1358)) -- Improve some error messages ([#1349](https://github.com/caolan/async/issues/1349)) -- Avoid stack overflow case in queue -- Fixed an issue in `some`, `every` and `find` where processing would continue after the result was determined. -- Cleanup implementations of `some`, `every` and `find` - -# v2.1.3 -- Make bundle size smaller -- Create optimized hotpath for `filter` in array case. - -# v2.1.2 -- Fixed a stackoverflow bug with `detect`, `some`, `every` on large inputs ([#1293](https://github.com/caolan/async/issues/1293)). - -# v2.1.0 - -- `retry` and `retryable` now support an optional `errorFilter` function that determines if the `task` should retry on the error ([#1256](https://github.com/caolan/async/issues/1256), [#1261](https://github.com/caolan/async/issues/1261)) -- Optimized array iteration in `race`, `cargo`, `queue`, and `priorityQueue` ([#1253](https://github.com/caolan/async/issues/1253)) -- Added alias documentation to doc site ([#1251](https://github.com/caolan/async/issues/1251), [#1254](https://github.com/caolan/async/issues/1254)) -- Added [BootStrap scrollspy](http://getbootstrap.com/javascript/#scrollspy) to docs to highlight in the sidebar the current method being viewed ([#1289](https://github.com/caolan/async/issues/1289), [#1300](https://github.com/caolan/async/issues/1300)) -- Various minor doc fixes ([#1263](https://github.com/caolan/async/issues/1263), [#1264](https://github.com/caolan/async/issues/1264), [#1271](https://github.com/caolan/async/issues/1271), [#1278](https://github.com/caolan/async/issues/1278), [#1280](https://github.com/caolan/async/issues/1280), [#1282](https://github.com/caolan/async/issues/1282), [#1302](https://github.com/caolan/async/issues/1302)) - -# v2.0.1 - -- Significantly optimized all iteration based collection methods such as `each`, `map`, `filter`, etc ([#1245](https://github.com/caolan/async/issues/1245), [#1246](https://github.com/caolan/async/issues/1246), [#1247](https://github.com/caolan/async/issues/1247)). - -# v2.0.0 - -Lots of changes here! - -First and foremost, we have a slick new [site for docs](https://caolan.github.io/async/). Special thanks to [**@hargasinski**](https://github.com/hargasinski) for his work converting our old docs to `jsdoc` format and implementing the new website. Also huge ups to [**@ivanseidel**](https://github.com/ivanseidel) for designing our new logo. It was a long process for both of these tasks, but I think these changes turned out extraordinary well. - -The biggest feature is modularization. You can now `require("async/series")` to only require the `series` function. Every Async library function is available this way. You still can `require("async")` to require the entire library, like you could do before. - -We also provide Async as a collection of ES2015 modules. You can now `import {each} from 'async-es'` or `import waterfall from 'async-es/waterfall'`. If you are using only a few Async functions, and are using a ES bundler such as Rollup, this can significantly lower your build size. - -Major thanks to [**@Kikobeats**](github.com/Kikobeats), [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for doing the majority of the modularization work, as well as [**@jdalton**](github.com/jdalton) and [**@Rich-Harris**](github.com/Rich-Harris) for advisory work on the general modularization strategy. - -Another one of the general themes of the 2.0 release is standardization of what an "async" function is. We are now more strictly following the node-style continuation passing style. That is, an async function is a function that: - -1. Takes a variable number of arguments -2. The last argument is always a callback -3. The callback can accept any number of arguments -4. The first argument passed to the callback will be treated as an error result, if the argument is truthy -5. Any number of result arguments can be passed after the "error" argument -6. The callback is called once and exactly once, either on the same tick or later tick of the JavaScript event loop. - -There were several cases where Async accepted some functions that did not strictly have these properties, most notably `auto`, `every`, `some`, `filter`, `reject` and `detect`. - -Another theme is performance. We have eliminated internal deferrals in all cases where they make sense. For example, in `waterfall` and `auto`, there was a `setImmediate` between each task -- these deferrals have been removed. A `setImmediate` call can add up to 1ms of delay. This might not seem like a lot, but it can add up if you are using many Async functions in the course of processing a HTTP request, for example. Nearly all asynchronous functions that do I/O already have some sort of deferral built in, so the extra deferral is unnecessary. The trade-off of this change is removing our built-in stack-overflow defense. Many synchronous callback calls in series can quickly overflow the JS call stack. If you do have a function that is sometimes synchronous (calling its callback on the same tick), and are running into stack overflows, wrap it with `async.ensureAsync()`. - -Another big performance win has been re-implementing `queue`, `cargo`, and `priorityQueue` with [doubly linked lists](https://en.wikipedia.org/wiki/Doubly_linked_list) instead of arrays. This has lead to queues being an order of [magnitude faster on large sets of tasks](https://github.com/caolan/async/pull/1205). - -## New Features - -- Async is now modularized. Individual functions can be `require()`d from the main package. (`require('async/auto')`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996)) -- Async is also available as a collection of ES2015 modules in the new `async-es` package. (`import {forEachSeries} from 'async-es'`) ([#984](https://github.com/caolan/async/issues/984), [#996](https://github.com/caolan/async/issues/996)) -- Added `race`, analogous to `Promise.race()`. It will run an array of async tasks in parallel and will call its callback with the result of the first task to respond. ([#568](https://github.com/caolan/async/issues/568), [#1038](https://github.com/caolan/async/issues/1038)) -- Collection methods now accept ES2015 iterators. Maps, Sets, and anything that implements the iterator spec can now be passed directly to `each`, `map`, `parallel`, etc.. ([#579](https://github.com/caolan/async/issues/579), [#839](https://github.com/caolan/async/issues/839), [#1074](https://github.com/caolan/async/issues/1074)) -- Added `mapValues`, for mapping over the properties of an object and returning an object with the same keys. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177)) -- Added `timeout`, a wrapper for an async function that will make the task time-out after the specified time. ([#1007](https://github.com/caolan/async/issues/1007), [#1027](https://github.com/caolan/async/issues/1027)) -- Added `reflect` and `reflectAll`, analagous to [`Promise.reflect()`](http://bluebirdjs.com/docs/api/reflect.html), a wrapper for async tasks that always succeeds, by gathering results and errors into an object. ([#942](https://github.com/caolan/async/issues/942), [#1012](https://github.com/caolan/async/issues/1012), [#1095](https://github.com/caolan/async/issues/1095)) -- `constant` supports dynamic arguments -- it will now always use its last argument as the callback. ([#1016](https://github.com/caolan/async/issues/1016), [#1052](https://github.com/caolan/async/issues/1052)) -- `setImmediate` and `nextTick` now support arguments to partially apply to the deferred function, like the node-native versions do. ([#940](https://github.com/caolan/async/issues/940), [#1053](https://github.com/caolan/async/issues/1053)) -- `auto` now supports resolving cyclic dependencies using [Kahn's algorithm](https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm) ([#1140](https://github.com/caolan/async/issues/1140)). -- Added `autoInject`, a relative of `auto` that automatically spreads a task's dependencies as arguments to the task function. ([#608](https://github.com/caolan/async/issues/608), [#1055](https://github.com/caolan/async/issues/1055), [#1099](https://github.com/caolan/async/issues/1099), [#1100](https://github.com/caolan/async/issues/1100)) -- You can now limit the concurrency of `auto` tasks. ([#635](https://github.com/caolan/async/issues/635), [#637](https://github.com/caolan/async/issues/637)) -- Added `retryable`, a relative of `retry` that wraps an async function, making it retry when called. ([#1058](https://github.com/caolan/async/issues/1058)) -- `retry` now supports specifying a function that determines the next time interval, useful for exponential backoff, logging and other retry strategies. ([#1161](https://github.com/caolan/async/issues/1161)) -- `retry` will now pass all of the arguments the task function was resolved with to the callback ([#1231](https://github.com/caolan/async/issues/1231)). -- Added `q.unsaturated` -- callback called when a `queue`'s number of running workers falls below a threshold. ([#868](https://github.com/caolan/async/issues/868), [#1030](https://github.com/caolan/async/issues/1030), [#1033](https://github.com/caolan/async/issues/1033), [#1034](https://github.com/caolan/async/issues/1034)) -- Added `q.error` -- a callback called whenever a `queue` task calls its callback with an error. ([#1170](https://github.com/caolan/async/issues/1170)) -- `applyEach` and `applyEachSeries` now pass results to the final callback. ([#1088](https://github.com/caolan/async/issues/1088)) - -## Breaking changes - -- Calling a callback more than once is considered an error, and an error will be thrown. This had an explicit breaking change in `waterfall`. If you were relying on this behavior, you should more accurately represent your control flow as an event emitter or stream. ([#814](https://github.com/caolan/async/issues/814), [#815](https://github.com/caolan/async/issues/815), [#1048](https://github.com/caolan/async/issues/1048), [#1050](https://github.com/caolan/async/issues/1050)) -- `auto` task functions now always take the callback as the last argument. If a task has dependencies, the `results` object will be passed as the first argument. To migrate old task functions, wrap them with [`_.flip`](https://lodash.com/docs#flip) ([#1036](https://github.com/caolan/async/issues/1036), [#1042](https://github.com/caolan/async/issues/1042)) -- Internal `setImmediate` calls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. Use `ensureAsync` to work around this. ([#696](https://github.com/caolan/async/issues/696), [#704](https://github.com/caolan/async/issues/704), [#1049](https://github.com/caolan/async/issues/1049), [#1050](https://github.com/caolan/async/issues/1050)) -- `map` used to return an object when iterating over an object. `map` now always returns an array, like in other libraries. The previous object behavior has been split out into `mapValues`. ([#1157](https://github.com/caolan/async/issues/1157), [#1177](https://github.com/caolan/async/issues/1177)) -- `filter`, `reject`, `some`, `every`, `detect` and their families like `{METHOD}Series` and `{METHOD}Limit` now expect an error as the first callback argument, rather than just a simple boolean. Pass `null` as the first argument, or use `fs.access` instead of `fs.exists`. ([#118](https://github.com/caolan/async/issues/118), [#774](https://github.com/caolan/async/issues/774), [#1028](https://github.com/caolan/async/issues/1028), [#1041](https://github.com/caolan/async/issues/1041)) -- `{METHOD}` and `{METHOD}Series` are now implemented in terms of `{METHOD}Limit`. This is a major internal simplification, and is not expected to cause many problems, but it does subtly affect how functions execute internally. ([#778](https://github.com/caolan/async/issues/778), [#847](https://github.com/caolan/async/issues/847)) -- `retry`'s callback is now optional. Previously, omitting the callback would partially apply the function, meaning it could be passed directly as a task to `series` or `auto`. The partially applied "control-flow" behavior has been separated out into `retryable`. ([#1054](https://github.com/caolan/async/issues/1054), [#1058](https://github.com/caolan/async/issues/1058)) -- The test function for `whilst`, `until`, and `during` used to be passed non-error args from the iteratee function's callback, but this led to weirdness where the first call of the test function would be passed no args. We have made it so the test function is never passed extra arguments, and only the `doWhilst`, `doUntil`, and `doDuring` functions pass iteratee callback arguments to the test function ([#1217](https://github.com/caolan/async/issues/1217), [#1224](https://github.com/caolan/async/issues/1224)) -- The `q.tasks` array has been renamed `q._tasks` and is now implemented as a doubly linked list (DLL). Any code that used to interact with this array will need to be updated to either use the provided helpers or support DLLs ([#1205](https://github.com/caolan/async/issues/1205)). -- The timing of the `q.saturated()` callback in a `queue` has been modified to better reflect when tasks pushed to the queue will start queueing. ([#724](https://github.com/caolan/async/issues/724), [#1078](https://github.com/caolan/async/issues/1078)) -- Removed `iterator` method in favour of [ES2015 iterator protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators ) which natively supports arrays ([#1237](https://github.com/caolan/async/issues/1237)) -- Dropped support for Component, Jam, SPM, and Volo ([#1175](https://github.com/caolan/async/issues/1175), #[#176](https://github.com/caolan/async/issues/176)) - -## Bug Fixes - -- Improved handling of no dependency cases in `auto` & `autoInject` ([#1147](https://github.com/caolan/async/issues/1147)). -- Fixed a bug where the callback generated by `asyncify` with `Promises` could resolve twice ([#1197](https://github.com/caolan/async/issues/1197)). -- Fixed several documented optional callbacks not actually being optional ([#1223](https://github.com/caolan/async/issues/1223)). - -## Other - -- Added `someSeries` and `everySeries` for symmetry, as well as a complete set of `any`/`anyLimit`/`anySeries` and `all`/`/allLmit`/`allSeries` aliases. -- Added `find` as an alias for `detect. (as well as `findLimit` and `findSeries`). -- Various doc fixes ([#1005](https://github.com/caolan/async/issues/1005), [#1008](https://github.com/caolan/async/issues/1008), [#1010](https://github.com/caolan/async/issues/1010), [#1015](https://github.com/caolan/async/issues/1015), [#1021](https://github.com/caolan/async/issues/1021), [#1037](https://github.com/caolan/async/issues/1037), [#1039](https://github.com/caolan/async/issues/1039), [#1051](https://github.com/caolan/async/issues/1051), [#1102](https://github.com/caolan/async/issues/1102), [#1107](https://github.com/caolan/async/issues/1107), [#1121](https://github.com/caolan/async/issues/1121), [#1123](https://github.com/caolan/async/issues/1123), [#1129](https://github.com/caolan/async/issues/1129), [#1135](https://github.com/caolan/async/issues/1135), [#1138](https://github.com/caolan/async/issues/1138), [#1141](https://github.com/caolan/async/issues/1141), [#1153](https://github.com/caolan/async/issues/1153), [#1216](https://github.com/caolan/async/issues/1216), [#1217](https://github.com/caolan/async/issues/1217), [#1232](https://github.com/caolan/async/issues/1232), [#1233](https://github.com/caolan/async/issues/1233), [#1236](https://github.com/caolan/async/issues/1236), [#1238](https://github.com/caolan/async/issues/1238)) - -Thank you [**@aearly**](github.com/aearly) and [**@megawac**](github.com/megawac) for taking the lead on version 2 of async. - ------------------------------------------- - -# v1.5.2 -- Allow using `"constructor"` as an argument in `memoize` ([#998](https://github.com/caolan/async/issues/998)) -- Give a better error messsage when `auto` dependency checking fails ([#994](https://github.com/caolan/async/issues/994)) -- Various doc updates ([#936](https://github.com/caolan/async/issues/936), [#956](https://github.com/caolan/async/issues/956), [#979](https://github.com/caolan/async/issues/979), [#1002](https://github.com/caolan/async/issues/1002)) - -# v1.5.1 -- Fix issue with `pause` in `queue` with concurrency enabled ([#946](https://github.com/caolan/async/issues/946)) -- `while` and `until` now pass the final result to callback ([#963](https://github.com/caolan/async/issues/963)) -- `auto` will properly handle concurrency when there is no callback ([#966](https://github.com/caolan/async/issues/966)) -- `auto` will no. properly stop execution when an error occurs ([#988](https://github.com/caolan/async/issues/988), [#993](https://github.com/caolan/async/issues/993)) -- Various doc fixes ([#971](https://github.com/caolan/async/issues/971), [#980](https://github.com/caolan/async/issues/980)) - -# v1.5.0 - -- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) ([#892](https://github.com/caolan/async/issues/892)) -- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. ([#873](https://github.com/caolan/async/issues/873)) -- `auto` now accepts an optional `concurrency` argument to limit the number o. running tasks ([#637](https://github.com/caolan/async/issues/637)) -- Added `queue#workersList()`, to retrieve the lis. of currently running tasks. ([#891](https://github.com/caolan/async/issues/891)) -- Various code simplifications ([#896](https://github.com/caolan/async/issues/896), [#904](https://github.com/caolan/async/issues/904)) -- Various doc fixes :scroll: ([#890](https://github.com/caolan/async/issues/890), [#894](https://github.com/caolan/async/issues/894), [#903](https://github.com/caolan/async/issues/903), [#905](https://github.com/caolan/async/issues/905), [#912](https://github.com/caolan/async/issues/912)) - -# v1.4.2 - -- Ensure coverage files don't get published on npm ([#879](https://github.com/caolan/async/issues/879)) - -# v1.4.1 - -- Add in overlooked `detectLimit` method ([#866](https://github.com/caolan/async/issues/866)) -- Removed unnecessary files from npm releases ([#861](https://github.com/caolan/async/issues/861)) -- Removed usage of a reserved word to prevent :boom: in older environments ([#870](https://github.com/caolan/async/issues/870)) - -# v1.4.0 - -- `asyncify` now supports promises ([#840](https://github.com/caolan/async/issues/840)) -- Added `Limit` versions of `filter` and `reject` ([#836](https://github.com/caolan/async/issues/836)) -- Add `Limit` versions of `detect`, `some` and `every` ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829)) -- `some`, `every` and `detect` now short circuit early ([#828](https://github.com/caolan/async/issues/828), [#829](https://github.com/caolan/async/issues/829)) -- Improve detection of the global object ([#804](https://github.com/caolan/async/issues/804)), enabling use in WebWorkers -- `whilst` now called with arguments from iterator ([#823](https://github.com/caolan/async/issues/823)) -- `during` now gets called with arguments from iterator ([#824](https://github.com/caolan/async/issues/824)) -- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0)) - - -# v1.3.0 - -New Features: -- Added `constant` -- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. ([#671](https://github.com/caolan/async/issues/671), [#806](https://github.com/caolan/async/issues/806)) -- Added `during` and `doDuring`, which are like `whilst` with an async truth test. ([#800](https://github.com/caolan/async/issues/800)) -- `retry` now accepts an `interval` parameter to specify a delay between retries. ([#793](https://github.com/caolan/async/issues/793)) -- `async` should work better in Web Workers due to better `root` detection ([#804](https://github.com/caolan/async/issues/804)) -- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` ([#642](https://github.com/caolan/async/issues/642)) -- Various internal updates ([#786](https://github.com/caolan/async/issues/786), [#801](https://github.com/caolan/async/issues/801), [#802](https://github.com/caolan/async/issues/802), [#803](https://github.com/caolan/async/issues/803)) -- Various doc fixes ([#790](https://github.com/caolan/async/issues/790), [#794](https://github.com/caolan/async/issues/794)) - -Bug Fixes: -- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. ([#740](https://github.com/caolan/async/issues/740), [#744](https://github.com/caolan/async/issues/744), [#783](https://github.com/caolan/async/issues/783)) - - -# v1.2.1 - -Bug Fix: - -- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782)) - - -# v1.2.0 - -New Features: - -- Added `timesLimit` ([#743](https://github.com/caolan/async/issues/743)) -- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. ([#747](https://github.com/caolan/async/issues/747), [#772](https://github.com/caolan/async/issues/772)) - -Bug Fixes: - -- Fixed a regression in `each` and family with empty arrays that have additional properties. ([#775](https://github.com/caolan/async/issues/775), [#777](https://github.com/caolan/async/issues/777)) - - -# v1.1.1 - -Bug Fix: - -- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. ([#782](https://github.com/caolan/async/issues/782)) - - -# v1.1.0 - -New Features: - -- `cargo` now supports all of the same methods and event callbacks as `queue`. -- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. ([#769](https://github.com/caolan/async/issues/769)) -- Optimized `map`, `eachOf`, and `waterfall` families of functions -- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array ([#667](https://github.com/caolan/async/issues/667)). -- The callback is now optional for the composed results of `compose` and `seq`. ([#618](https://github.com/caolan/async/issues/618)) -- Reduced file size by 4kb, (minified version by 1kb) -- Added code coverage through `nyc` and `coveralls` ([#768](https://github.com/caolan/async/issues/768)) - -Bug Fixes: - -- `forever` will no longer stack overflow with a synchronous iterator ([#622](https://github.com/caolan/async/issues/622)) -- `eachLimit` and other limit functions will stop iterating once an error occurs ([#754](https://github.com/caolan/async/issues/754)) -- Always pass `null` in callbacks when there is no error ([#439](https://github.com/caolan/async/issues/439)) -- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue ([#668](https://github.com/caolan/async/issues/668)) -- `each` and family will properly handle an empty array ([#578](https://github.com/caolan/async/issues/578)) -- `eachSeries` and family will finish if the underlying array is modified during execution ([#557](https://github.com/caolan/async/issues/557)) -- `queue` will throw if a non-function is passed to `q.push()` ([#593](https://github.com/caolan/async/issues/593)) -- Doc fixes ([#629](https://github.com/caolan/async/issues/629), [#766](https://github.com/caolan/async/issues/766)) - - -# v1.0.0 - -No known breaking changes, we are simply complying with semver from here on out. - -Changes: - -- Start using a changelog! -- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) ([#168](https://github.com/caolan/async/issues/168) [#704](https://github.com/caolan/async/issues/704) [#321](https://github.com/caolan/async/issues/321)) -- Detect deadlocks in `auto` ([#663](https://github.com/caolan/async/issues/663)) -- Better support for require.js ([#527](https://github.com/caolan/async/issues/527)) -- Throw if queue created with concurrency `0` ([#714](https://github.com/caolan/async/issues/714)) -- Fix unneeded iteration in `queue.resume()` ([#758](https://github.com/caolan/async/issues/758)) -- Guard against timer mocking overriding `setImmediate` ([#609](https://github.com/caolan/async/issues/609) [#611](https://github.com/caolan/async/issues/611)) -- Miscellaneous doc fixes ([#542](https://github.com/caolan/async/issues/542) [#596](https://github.com/caolan/async/issues/596) [#615](https://github.com/caolan/async/issues/615) [#628](https://github.com/caolan/async/issues/628) [#631](https://github.com/caolan/async/issues/631) [#690](https://github.com/caolan/async/issues/690) [#729](https://github.com/caolan/async/issues/729)) -- Use single noop function internally ([#546](https://github.com/caolan/async/issues/546)) -- Optimize internal `_each`, `_map` and `_keys` functions. diff --git a/node_modules/async/LICENSE b/node_modules/async/LICENSE deleted file mode 100644 index b18aed69..00000000 --- a/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010-2018 Caolan McMahon - -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/async/README.md b/node_modules/async/README.md deleted file mode 100644 index 77f645e2..00000000 --- a/node_modules/async/README.md +++ /dev/null @@ -1,59 +0,0 @@ -![Async Logo](https://raw.githubusercontent.com/caolan/async/master/logo/async-logo_readme.jpg) - -![Github Actions CI status](https://github.com/caolan/async/actions/workflows/ci.yml/badge.svg) -[![NPM version](https://img.shields.io/npm/v/async.svg)](https://www.npmjs.com/package/async) -[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master) -[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/async/badge?style=rounded)](https://www.jsdelivr.com/package/npm/async) - - - -Async is a utility module which provides straight-forward, powerful functions for working with [asynchronous JavaScript](http://caolan.github.io/async/v3/global.html). Although originally designed for use with [Node.js](https://nodejs.org/) and installable via `npm i async`, it can also be used directly in the browser. A ESM/MJS version is included in the main `async` package that should automatically be used with compatible bundlers such as Webpack and Rollup. - -A pure ESM version of Async is available as [`async-es`](https://www.npmjs.com/package/async-es). - -For Documentation, visit - -*For Async v1.5.x documentation, go [HERE](https://github.com/caolan/async/blob/v1.5.2/README.md)* - - -```javascript -// for use with Node-style callbacks... -var async = require("async"); - -var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; -var configs = {}; - -async.forEachOf(obj, (value, key, callback) => { - fs.readFile(__dirname + value, "utf8", (err, data) => { - if (err) return callback(err); - try { - configs[key] = JSON.parse(data); - } catch (e) { - return callback(e); - } - callback(); - }); -}, err => { - if (err) console.error(err.message); - // configs is now a map of JSON data - doSomethingWith(configs); -}); -``` - -```javascript -var async = require("async"); - -// ...or ES2017 async functions -async.mapLimit(urls, 5, async function(url) { - const response = await fetch(url) - return response.body -}, (err, results) => { - if (err) throw err - // results is now an array of the response bodies - console.log(results) -}) -``` diff --git a/node_modules/async/all.js b/node_modules/async/all.js deleted file mode 100644 index 148db683..00000000 --- a/node_modules/async/all.js +++ /dev/null @@ -1,119 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns `true` if every element in `coll` satisfies an async test. If any - * iteratee call returns `false`, the main `callback` is immediately called. - * - * @name every - * @static - * @memberOf module:Collections - * @method - * @alias all - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.every(fileList, fileExists, function(err, result) { - * console.log(result); - * // true - * // result is true since every file exists - * }); - * - * async.every(withMissingFileList, fileExists, function(err, result) { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }); - * - * // Using Promises - * async.every(fileList, fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.every(withMissingFileList, fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.every(fileList, fileExists); - * console.log(result); - * // true - * // result is true since every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.every(withMissingFileList, fileExists); - * console.log(result); - * // false - * // result is false since NOT every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function every(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(every, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/allLimit.js b/node_modules/async/allLimit.js deleted file mode 100644 index 25b2c089..00000000 --- a/node_modules/async/allLimit.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. - * - * @name everyLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everyLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(everyLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/allSeries.js b/node_modules/async/allSeries.js deleted file mode 100644 index 147c3dc5..00000000 --- a/node_modules/async/allSeries.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. - * - * @name everySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in series. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everySeries(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(everySeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/any.js b/node_modules/async/any.js deleted file mode 100644 index 2046cf64..00000000 --- a/node_modules/async/any.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns `true` if at least one element in the `coll` satisfies an async test. - * If any iteratee call returns `true`, the main `callback` is immediately - * called. - * - * @name some - * @static - * @memberOf module:Collections - * @method - * @alias any - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - *); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // false - * // result is false since none of the files exists - * } - *); - * - * // Using Promises - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since some file in the list exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since none of the files exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); - * console.log(result); - * // false - * // result is false since none of the files exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function some(coll, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(some, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/anyLimit.js b/node_modules/async/anyLimit.js deleted file mode 100644 index c8a295a8..00000000 --- a/node_modules/async/anyLimit.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. - * - * @name someLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anyLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(someLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/anySeries.js b/node_modules/async/anySeries.js deleted file mode 100644 index ee0654ba..00000000 --- a/node_modules/async/anySeries.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. - * - * @name someSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anySeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in series. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someSeries(coll, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(someSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/apply.js b/node_modules/async/apply.js deleted file mode 100644 index 5246833a..00000000 --- a/node_modules/async/apply.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (fn, ...args) { - return (...callArgs) => fn(...args, ...callArgs); -}; - -module.exports = exports["default"]; /** - * Creates a continuation function with some arguments already applied. - * - * Useful as a shorthand when combined with other control flow functions. Any - * arguments passed to the returned function are added to the arguments - * originally passed to apply. - * - * @name apply - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {Function} fn - The function you want to eventually apply all - * arguments to. Invokes with (arguments...). - * @param {...*} arguments... - Any number of arguments to automatically apply - * when the continuation is called. - * @returns {Function} the partially-applied function - * @example - * - * // using apply - * async.parallel([ - * async.apply(fs.writeFile, 'testfile1', 'test1'), - * async.apply(fs.writeFile, 'testfile2', 'test2') - * ]); - * - * - * // the same process without using apply - * async.parallel([ - * function(callback) { - * fs.writeFile('testfile1', 'test1', callback); - * }, - * function(callback) { - * fs.writeFile('testfile2', 'test2', callback); - * } - * ]); - * - * // It's possible to pass any number of additional arguments when calling the - * // continuation: - * - * node> var fn = async.apply(sys.puts, 'one'); - * node> fn('two', 'three'); - * one - * two - * three - */ \ No newline at end of file diff --git a/node_modules/async/applyEach.js b/node_modules/async/applyEach.js deleted file mode 100644 index b08c6701..00000000 --- a/node_modules/async/applyEach.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _applyEach = require('./internal/applyEach.js'); - -var _applyEach2 = _interopRequireDefault(_applyEach); - -var _map = require('./map.js'); - -var _map2 = _interopRequireDefault(_map); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Applies the provided arguments to each function in the array, calling - * `callback` after all functions have completed. If you only provide the first - * argument, `fns`, then it will return a function which lets you pass in the - * arguments as if it were a single function call. If more arguments are - * provided, `callback` is required while `args` is still optional. The results - * for each of the applied async functions are passed to the final callback - * as an array. - * - * @name applyEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s - * to all call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - Returns a function that takes no args other than - * an optional callback, that is the result of applying the `args` to each - * of the functions. - * @example - * - * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') - * - * appliedFn((err, results) => { - * // results[0] is the results for `enableSearch` - * // results[1] is the results for `updateSchema` - * }); - * - * // partial application example: - * async.each( - * buckets, - * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), - * callback - * ); - */ -exports.default = (0, _applyEach2.default)(_map2.default); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/applyEachSeries.js b/node_modules/async/applyEachSeries.js deleted file mode 100644 index 6a19ca3f..00000000 --- a/node_modules/async/applyEachSeries.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _applyEach = require('./internal/applyEach.js'); - -var _applyEach2 = _interopRequireDefault(_applyEach); - -var _mapSeries = require('./mapSeries.js'); - -var _mapSeries2 = _interopRequireDefault(_mapSeries); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. - * - * @name applyEachSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.applyEach]{@link module:ControlFlow.applyEach} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all - * call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - A function, that when called, is the result of - * appling the `args` to the list of functions. It takes no args, other than - * a callback. - */ -exports.default = (0, _applyEach2.default)(_mapSeries2.default); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/asyncify.js b/node_modules/async/asyncify.js deleted file mode 100644 index 3c3bf886..00000000 --- a/node_modules/async/asyncify.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = asyncify; - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _setImmediate = require('./internal/setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Take a sync function and make it async, passing its return value to a - * callback. This is useful for plugging sync functions into a waterfall, - * series, or other async functions. Any arguments passed to the generated - * function will be passed to the wrapped function (except for the final - * callback argument). Errors thrown will be passed to the callback. - * - * If the function passed to `asyncify` returns a Promise, that promises's - * resolved/rejected state will be used to call the callback, rather than simply - * the synchronous return value. - * - * This also means you can asyncify ES2017 `async` functions. - * - * @name asyncify - * @static - * @memberOf module:Utils - * @method - * @alias wrapSync - * @category Util - * @param {Function} func - The synchronous function, or Promise-returning - * function to convert to an {@link AsyncFunction}. - * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be - * invoked with `(args..., callback)`. - * @example - * - * // passing a regular synchronous function - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(JSON.parse), - * function (data, next) { - * // data is the result of parsing the text. - * // If there was a parsing error, it would have been caught. - * } - * ], callback); - * - * // passing a function returning a promise - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(function (contents) { - * return db.model.create(contents); - * }), - * function (model, next) { - * // `model` is the instantiated model object. - * // If there was an error, this function would be skipped. - * } - * ], callback); - * - * // es2017 example, though `asyncify` is not needed if your JS environment - * // supports async functions out of the box - * var q = async.queue(async.asyncify(async function(file) { - * var intermediateStep = await processFile(file); - * return await somePromise(intermediateStep) - * })); - * - * q.push(files); - */ -function asyncify(func) { - if ((0, _wrapAsync.isAsync)(func)) { - return function (...args /*, callback*/) { - const callback = args.pop(); - const promise = func.apply(this, args); - return handlePromise(promise, callback); - }; - } - - return (0, _initialParams2.default)(function (args, callback) { - var result; - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } - // if result is Promise object - if (result && typeof result.then === 'function') { - return handlePromise(result, callback); - } else { - callback(null, result); - } - }); -} - -function handlePromise(promise, callback) { - return promise.then(value => { - invokeCallback(callback, null, value); - }, err => { - invokeCallback(callback, err && err.message ? err : new Error(err)); - }); -} - -function invokeCallback(callback, error, value) { - try { - callback(error, value); - } catch (err) { - (0, _setImmediate2.default)(e => { - throw e; - }, err); - } -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/auto.js b/node_modules/async/auto.js deleted file mode 100644 index c4a85d43..00000000 --- a/node_modules/async/auto.js +++ /dev/null @@ -1,333 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = auto; - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _promiseCallback = require('./internal/promiseCallback.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on - * their requirements. Each function can optionally depend on other functions - * being completed first, and each function is run as soon as its requirements - * are satisfied. - * - * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence - * will stop. Further tasks will not execute (so any other functions depending - * on it will not run), and the main `callback` is immediately called with the - * error. - * - * {@link AsyncFunction}s also receive an object containing the results of functions which - * have completed so far as the first argument, if they have dependencies. If a - * task function has no dependencies, it will only be passed a callback. - * - * @name auto - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Object} tasks - An object. Each of its properties is either a - * function or an array of requirements, with the {@link AsyncFunction} itself the last item - * in the array. The object's key of a property serves as the name of the task - * defined by that property, i.e. can be used when specifying requirements for - * other tasks. The function receives one or two arguments: - * * a `results` object, containing the results of the previously executed - * functions, only passed if the task has any dependencies, - * * a `callback(err, result)` function, which must be called when finished, - * passing an `error` (which can be `null`) and the result of the function's - * execution. - * @param {number} [concurrency=Infinity] - An optional `integer` for - * determining the maximum number of tasks that can be run in parallel. By - * default, as many as possible. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback. Results are always returned; however, if an - * error occurs, no further `tasks` will be performed, and the results object - * will only contain partial results. Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * @example - * - * //Using Callbacks - * async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }, function(err, results) { - * if (err) { - * console.log('err = ', err); - * } - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }); - * - * //Using Promises - * async.auto({ - * get_data: function(callback) { - * console.log('in get_data'); - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * console.log('in make_folder'); - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }).then(results => { - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }).catch(err => { - * console.log('err = ', err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }); - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function auto(tasks, concurrency, callback) { - if (typeof concurrency !== 'number') { - // concurrency is optional, shift the args. - callback = concurrency; - concurrency = null; - } - callback = (0, _once2.default)(callback || (0, _promiseCallback.promiseCallback)()); - var numTasks = Object.keys(tasks).length; - if (!numTasks) { - return callback(null); - } - if (!concurrency) { - concurrency = numTasks; - } - - var results = {}; - var runningTasks = 0; - var canceled = false; - var hasError = false; - - var listeners = Object.create(null); - - var readyTasks = []; - - // for cycle detection: - var readyToCheck = []; // tasks that have been identified as reachable - // without the possibility of returning to an ancestor task - var uncheckedDependencies = {}; - - Object.keys(tasks).forEach(key => { - var task = tasks[key]; - if (!Array.isArray(task)) { - // no dependencies - enqueueTask(key, [task]); - readyToCheck.push(key); - return; - } - - var dependencies = task.slice(0, task.length - 1); - var remainingDependencies = dependencies.length; - if (remainingDependencies === 0) { - enqueueTask(key, task); - readyToCheck.push(key); - return; - } - uncheckedDependencies[key] = remainingDependencies; - - dependencies.forEach(dependencyName => { - if (!tasks[dependencyName]) { - throw new Error('async.auto task `' + key + '` has a non-existent dependency `' + dependencyName + '` in ' + dependencies.join(', ')); - } - addListener(dependencyName, () => { - remainingDependencies--; - if (remainingDependencies === 0) { - enqueueTask(key, task); - } - }); - }); - }); - - checkForDeadlocks(); - processQueue(); - - function enqueueTask(key, task) { - readyTasks.push(() => runTask(key, task)); - } - - function processQueue() { - if (canceled) return; - if (readyTasks.length === 0 && runningTasks === 0) { - return callback(null, results); - } - while (readyTasks.length && runningTasks < concurrency) { - var run = readyTasks.shift(); - run(); - } - } - - function addListener(taskName, fn) { - var taskListeners = listeners[taskName]; - if (!taskListeners) { - taskListeners = listeners[taskName] = []; - } - - taskListeners.push(fn); - } - - function taskComplete(taskName) { - var taskListeners = listeners[taskName] || []; - taskListeners.forEach(fn => fn()); - processQueue(); - } - - function runTask(key, task) { - if (hasError) return; - - var taskCallback = (0, _onlyOnce2.default)((err, ...result) => { - runningTasks--; - if (err === false) { - canceled = true; - return; - } - if (result.length < 2) { - [result] = result; - } - if (err) { - var safeResults = {}; - Object.keys(results).forEach(rkey => { - safeResults[rkey] = results[rkey]; - }); - safeResults[key] = result; - hasError = true; - listeners = Object.create(null); - if (canceled) return; - callback(err, safeResults); - } else { - results[key] = result; - taskComplete(key); - } - }); - - runningTasks++; - var taskFn = (0, _wrapAsync2.default)(task[task.length - 1]); - if (task.length > 1) { - taskFn(results, taskCallback); - } else { - taskFn(taskCallback); - } - } - - function checkForDeadlocks() { - // Kahn's algorithm - // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm - // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html - var currentTask; - var counter = 0; - while (readyToCheck.length) { - currentTask = readyToCheck.pop(); - counter++; - getDependents(currentTask).forEach(dependent => { - if (--uncheckedDependencies[dependent] === 0) { - readyToCheck.push(dependent); - } - }); - } - - if (counter !== numTasks) { - throw new Error('async.auto cannot execute tasks due to a recursive dependency'); - } - } - - function getDependents(taskName) { - var result = []; - Object.keys(tasks).forEach(key => { - const task = tasks[key]; - if (Array.isArray(task) && task.indexOf(taskName) >= 0) { - result.push(key); - } - }); - return result; - } - - return callback[_promiseCallback.PROMISE_SYMBOL]; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/autoInject.js b/node_modules/async/autoInject.js deleted file mode 100644 index 393baad6..00000000 --- a/node_modules/async/autoInject.js +++ /dev/null @@ -1,182 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = autoInject; - -var _auto = require('./auto.js'); - -var _auto2 = _interopRequireDefault(_auto); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; -var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /(=.+)?(\s*)$/; - -function stripComments(string) { - let stripped = ''; - let index = 0; - let endBlockComment = string.indexOf('*/'); - while (index < string.length) { - if (string[index] === '/' && string[index + 1] === '/') { - // inline comment - let endIndex = string.indexOf('\n', index); - index = endIndex === -1 ? string.length : endIndex; - } else if (endBlockComment !== -1 && string[index] === '/' && string[index + 1] === '*') { - // block comment - let endIndex = string.indexOf('*/', index); - if (endIndex !== -1) { - index = endIndex + 2; - endBlockComment = string.indexOf('*/', index); - } else { - stripped += string[index]; - index++; - } - } else { - stripped += string[index]; - index++; - } - } - return stripped; -} - -function parseParams(func) { - const src = stripComments(func.toString()); - let match = src.match(FN_ARGS); - if (!match) { - match = src.match(ARROW_FN_ARGS); - } - if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src); - let [, args] = match; - return args.replace(/\s/g, '').split(FN_ARG_SPLIT).map(arg => arg.replace(FN_ARG, '').trim()); -} - -/** - * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent - * tasks are specified as parameters to the function, after the usual callback - * parameter, with the parameter names matching the names of the tasks it - * depends on. This can provide even more readable task graphs which can be - * easier to maintain. - * - * If a final callback is specified, the task results are similarly injected, - * specified as named parameters after the initial error parameter. - * - * The autoInject function is purely syntactic sugar and its semantics are - * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. - * - * @name autoInject - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.auto]{@link module:ControlFlow.auto} - * @category Control Flow - * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of - * the form 'func([dependencies...], callback). The object's key of a property - * serves as the name of the task defined by that property, i.e. can be used - * when specifying requirements for other tasks. - * * The `callback` parameter is a `callback(err, result)` which must be called - * when finished, passing an `error` (which can be `null`) and the result of - * the function's execution. The remaining parameters name other tasks on - * which the task is dependent, and the results from those tasks are the - * arguments of those parameters. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback, and a `results` object with any completed - * task results, similar to `auto`. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // The example from `auto` can be rewritten as follows: - * async.autoInject({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: function(get_data, make_folder, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }, - * email_link: function(write_file, callback) { - * // once the file is written let's email a link to it... - * // write_file contains the filename returned by write_file. - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * } - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - * - * // If you are using a JS minifier that mangles parameter names, `autoInject` - * // will not work with plain functions, since the parameter names will be - * // collapsed to a single letter identifier. To work around this, you can - * // explicitly specify the names of the parameters your task function needs - * // in an array, similar to Angular.js dependency injection. - * - * // This still has an advantage over plain `auto`, since the results a task - * // depends on are still spread into arguments. - * async.autoInject({ - * //... - * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(write_file, callback) { - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * }] - * //... - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - */ -function autoInject(tasks, callback) { - var newTasks = {}; - - Object.keys(tasks).forEach(key => { - var taskFn = tasks[key]; - var params; - var fnIsAsync = (0, _wrapAsync.isAsync)(taskFn); - var hasNoDeps = !fnIsAsync && taskFn.length === 1 || fnIsAsync && taskFn.length === 0; - - if (Array.isArray(taskFn)) { - params = [...taskFn]; - taskFn = params.pop(); - - newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); - } else if (hasNoDeps) { - // no dependencies, use the function as-is - newTasks[key] = taskFn; - } else { - params = parseParams(taskFn); - if (taskFn.length === 0 && !fnIsAsync && params.length === 0) { - throw new Error("autoInject task functions require explicit parameters."); - } - - // remove callback param - if (!fnIsAsync) params.pop(); - - newTasks[key] = params.concat(newTask); - } - - function newTask(results, taskCb) { - var newArgs = params.map(name => results[name]); - newArgs.push(taskCb); - (0, _wrapAsync2.default)(taskFn)(...newArgs); - } - }); - - return (0, _auto2.default)(newTasks, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/bower.json b/node_modules/async/bower.json deleted file mode 100644 index 390c6502..00000000 --- a/node_modules/async/bower.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "async", - "main": "dist/async.js", - "ignore": [ - "bower_components", - "lib", - "test", - "node_modules", - "perf", - "support", - "**/.*", - "*.config.js", - "*.json", - "index.js", - "Makefile" - ] -} diff --git a/node_modules/async/cargo.js b/node_modules/async/cargo.js deleted file mode 100644 index aa385f8a..00000000 --- a/node_modules/async/cargo.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = cargo; - -var _queue = require('./internal/queue.js'); - -var _queue2 = _interopRequireDefault(_queue); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Creates a `cargo` object with the specified payload. Tasks added to the - * cargo will be processed altogether (up to the `payload` limit). If the - * `worker` is in progress, the task is queued until it becomes available. Once - * the `worker` has completed some tasks, each callback of those tasks is - * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) - * for how `cargo` and `queue` work. - * - * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers - * at a time, cargo passes an array of tasks to a single worker, repeating - * when the worker is finished. - * - * @name cargo - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An asynchronous function for processing an array - * of queued tasks. Invoked with `(tasks, callback)`. - * @param {number} [payload=Infinity] - An optional `integer` for determining - * how many tasks should be processed per round; if omitted, the default is - * unlimited. - * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can - * attached as certain properties to listen for specific events during the - * lifecycle of the cargo and inner queue. - * @example - * - * // create a cargo object with payload 2 - * var cargo = async.cargo(function(tasks, callback) { - * for (var i=0; i { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir) - * .then(results => { - * console.log(results); - * }).catch(err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.concat(directoryList, fs.readdir); - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.concat(withMissingDirectoryList, fs.readdir); - * console.log(results); - * } catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } - * } - * - */ -function concat(coll, iteratee, callback) { - return (0, _concatLimit2.default)(coll, Infinity, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(concat, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/concatLimit.js b/node_modules/async/concatLimit.js deleted file mode 100644 index 3d170f17..00000000 --- a/node_modules/async/concatLimit.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _mapLimit = require('./mapLimit.js'); - -var _mapLimit2 = _interopRequireDefault(_mapLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. - * - * @name concatLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapLimit - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatLimit(coll, limit, iteratee, callback) { - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { - _iteratee(val, (err, ...args) => { - if (err) return iterCb(err); - return iterCb(err, args); - }); - }, (err, mapResults) => { - var result = []; - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - result = result.concat(...mapResults[i]); - } - } - - return callback(err, result); - }); -} -exports.default = (0, _awaitify2.default)(concatLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/concatSeries.js b/node_modules/async/concatSeries.js deleted file mode 100644 index 84add3b0..00000000 --- a/node_modules/async/concatSeries.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _concatLimit = require('./concatLimit.js'); - -var _concatLimit2 = _interopRequireDefault(_concatLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. - * - * @name concatSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapSeries - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. - * The iteratee should complete with an array an array of results. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatSeries(coll, iteratee, callback) { - return (0, _concatLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(concatSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/constant.js b/node_modules/async/constant.js deleted file mode 100644 index 07596538..00000000 --- a/node_modules/async/constant.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (...args) { - return function (...ignoredArgs /*, callback*/) { - var callback = ignoredArgs.pop(); - return callback(null, ...args); - }; -}; - -module.exports = exports["default"]; /** - * Returns a function that when called, calls-back with the values provided. - * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to - * [`auto`]{@link module:ControlFlow.auto}. - * - * @name constant - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {...*} arguments... - Any number of arguments to automatically invoke - * callback with. - * @returns {AsyncFunction} Returns a function that when invoked, automatically - * invokes the callback with the previous given arguments. - * @example - * - * async.waterfall([ - * async.constant(42), - * function (value, next) { - * // value === 42 - * }, - * //... - * ], callback); - * - * async.waterfall([ - * async.constant(filename, "utf8"), - * fs.readFile, - * function (fileData, next) { - * //... - * } - * //... - * ], callback); - * - * async.auto({ - * hostname: async.constant("https://server.net/"), - * port: findFreePort, - * launchServer: ["hostname", "port", function (options, cb) { - * startServer(options, cb); - * }], - * //... - * }, callback); - */ \ No newline at end of file diff --git a/node_modules/async/detect.js b/node_modules/async/detect.js deleted file mode 100644 index 05b2e5c6..00000000 --- a/node_modules/async/detect.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns the first value in `coll` that passes an async truth test. The - * `iteratee` is applied in parallel, meaning the first iteratee to return - * `true` will fire the detect `callback` with that result. That means the - * result might not be the first item in the original `coll` (in terms of order) - * that passes the test. - - * If order within the original `coll` is important, then look at - * [`detectSeries`]{@link module:Collections.detectSeries}. - * - * @name detect - * @static - * @memberOf module:Collections - * @method - * @alias find - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * } - *); - * - * // Using Promises - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) - * .then(result => { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); - * console.log(result); - * // dir1/file1.txt - * // result now equals the file in the list that exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function detect(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(detect, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/detectLimit.js b/node_modules/async/detectLimit.js deleted file mode 100644 index db6961ec..00000000 --- a/node_modules/async/detectLimit.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a - * time. - * - * @name detectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findLimit - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(detectLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/detectSeries.js b/node_modules/async/detectSeries.js deleted file mode 100644 index b9131b4a..00000000 --- a/node_modules/async/detectSeries.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. - * - * @name detectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findSeries - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectSeries(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(1), coll, iteratee, callback); -} - -exports.default = (0, _awaitify2.default)(detectSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/dir.js b/node_modules/async/dir.js deleted file mode 100644 index 950d0a22..00000000 --- a/node_modules/async/dir.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _consoleFunc = require('./internal/consoleFunc.js'); - -var _consoleFunc2 = _interopRequireDefault(_consoleFunc); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Logs the result of an [`async` function]{@link AsyncFunction} to the - * `console` using `console.dir` to display the properties of the resulting object. - * Only works in Node.js or in browsers that support `console.dir` and - * `console.error` (such as FF and Chrome). - * If multiple arguments are returned from the async function, - * `console.dir` is called on each argument in order. - * - * @name dir - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, {hello: name}); - * }, 1000); - * }; - * - * // in the node repl - * node> async.dir(hello, 'world'); - * {hello: 'world'} - */ -exports.default = (0, _consoleFunc2.default)('dir'); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/dist/async.js b/node_modules/async/dist/async.js deleted file mode 100644 index 8d5e7825..00000000 --- a/node_modules/async/dist/async.js +++ /dev/null @@ -1,6059 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.async = {}))); -}(this, (function (exports) { 'use strict'; - - /** - * Creates a continuation function with some arguments already applied. - * - * Useful as a shorthand when combined with other control flow functions. Any - * arguments passed to the returned function are added to the arguments - * originally passed to apply. - * - * @name apply - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {Function} fn - The function you want to eventually apply all - * arguments to. Invokes with (arguments...). - * @param {...*} arguments... - Any number of arguments to automatically apply - * when the continuation is called. - * @returns {Function} the partially-applied function - * @example - * - * // using apply - * async.parallel([ - * async.apply(fs.writeFile, 'testfile1', 'test1'), - * async.apply(fs.writeFile, 'testfile2', 'test2') - * ]); - * - * - * // the same process without using apply - * async.parallel([ - * function(callback) { - * fs.writeFile('testfile1', 'test1', callback); - * }, - * function(callback) { - * fs.writeFile('testfile2', 'test2', callback); - * } - * ]); - * - * // It's possible to pass any number of additional arguments when calling the - * // continuation: - * - * node> var fn = async.apply(sys.puts, 'one'); - * node> fn('two', 'three'); - * one - * two - * three - */ - function apply(fn, ...args) { - return (...callArgs) => fn(...args,...callArgs); - } - - function initialParams (fn) { - return function (...args/*, callback*/) { - var callback = args.pop(); - return fn.call(this, args, callback); - }; - } - - /* istanbul ignore file */ - - var hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; - var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; - var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; - - function fallback(fn) { - setTimeout(fn, 0); - } - - function wrap(defer) { - return (fn, ...args) => defer(() => fn(...args)); - } - - var _defer; - - if (hasQueueMicrotask) { - _defer = queueMicrotask; - } else if (hasSetImmediate) { - _defer = setImmediate; - } else if (hasNextTick) { - _defer = process.nextTick; - } else { - _defer = fallback; - } - - var setImmediate$1 = wrap(_defer); - - /** - * Take a sync function and make it async, passing its return value to a - * callback. This is useful for plugging sync functions into a waterfall, - * series, or other async functions. Any arguments passed to the generated - * function will be passed to the wrapped function (except for the final - * callback argument). Errors thrown will be passed to the callback. - * - * If the function passed to `asyncify` returns a Promise, that promises's - * resolved/rejected state will be used to call the callback, rather than simply - * the synchronous return value. - * - * This also means you can asyncify ES2017 `async` functions. - * - * @name asyncify - * @static - * @memberOf module:Utils - * @method - * @alias wrapSync - * @category Util - * @param {Function} func - The synchronous function, or Promise-returning - * function to convert to an {@link AsyncFunction}. - * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be - * invoked with `(args..., callback)`. - * @example - * - * // passing a regular synchronous function - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(JSON.parse), - * function (data, next) { - * // data is the result of parsing the text. - * // If there was a parsing error, it would have been caught. - * } - * ], callback); - * - * // passing a function returning a promise - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(function (contents) { - * return db.model.create(contents); - * }), - * function (model, next) { - * // `model` is the instantiated model object. - * // If there was an error, this function would be skipped. - * } - * ], callback); - * - * // es2017 example, though `asyncify` is not needed if your JS environment - * // supports async functions out of the box - * var q = async.queue(async.asyncify(async function(file) { - * var intermediateStep = await processFile(file); - * return await somePromise(intermediateStep) - * })); - * - * q.push(files); - */ - function asyncify(func) { - if (isAsync(func)) { - return function (...args/*, callback*/) { - const callback = args.pop(); - const promise = func.apply(this, args); - return handlePromise(promise, callback) - } - } - - return initialParams(function (args, callback) { - var result; - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } - // if result is Promise object - if (result && typeof result.then === 'function') { - return handlePromise(result, callback) - } else { - callback(null, result); - } - }); - } - - function handlePromise(promise, callback) { - return promise.then(value => { - invokeCallback(callback, null, value); - }, err => { - invokeCallback(callback, err && err.message ? err : new Error(err)); - }); - } - - function invokeCallback(callback, error, value) { - try { - callback(error, value); - } catch (err) { - setImmediate$1(e => { throw e }, err); - } - } - - function isAsync(fn) { - return fn[Symbol.toStringTag] === 'AsyncFunction'; - } - - function isAsyncGenerator(fn) { - return fn[Symbol.toStringTag] === 'AsyncGenerator'; - } - - function isAsyncIterable(obj) { - return typeof obj[Symbol.asyncIterator] === 'function'; - } - - function wrapAsync(asyncFn) { - if (typeof asyncFn !== 'function') throw new Error('expected a function') - return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; - } - - // conditionally promisify a function. - // only return a promise if a callback is omitted - function awaitify (asyncFn, arity = asyncFn.length) { - if (!arity) throw new Error('arity is undefined') - function awaitable (...args) { - if (typeof args[arity - 1] === 'function') { - return asyncFn.apply(this, args) - } - - return new Promise((resolve, reject) => { - args[arity - 1] = (err, ...cbArgs) => { - if (err) return reject(err) - resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); - }; - asyncFn.apply(this, args); - }) - } - - return awaitable - } - - function applyEach (eachfn) { - return function applyEach(fns, ...callArgs) { - const go = awaitify(function (callback) { - var that = this; - return eachfn(fns, (fn, cb) => { - wrapAsync(fn).apply(that, callArgs.concat(cb)); - }, callback); - }); - return go; - }; - } - - function _asyncMap(eachfn, arr, iteratee, callback) { - arr = arr || []; - var results = []; - var counter = 0; - var _iteratee = wrapAsync(iteratee); - - return eachfn(arr, (value, _, iterCb) => { - var index = counter++; - _iteratee(value, (err, v) => { - results[index] = v; - iterCb(err); - }); - }, err => { - callback(err, results); - }); - } - - function isArrayLike(value) { - return value && - typeof value.length === 'number' && - value.length >= 0 && - value.length % 1 === 0; - } - - // A temporary value used to identify if the loop should be broken. - // See #1064, #1293 - const breakLoop = {}; - - function once(fn) { - function wrapper (...args) { - if (fn === null) return; - var callFn = fn; - fn = null; - callFn.apply(this, args); - } - Object.assign(wrapper, fn); - return wrapper - } - - function getIterator (coll) { - return coll[Symbol.iterator] && coll[Symbol.iterator](); - } - - function createArrayIterator(coll) { - var i = -1; - var len = coll.length; - return function next() { - return ++i < len ? {value: coll[i], key: i} : null; - } - } - - function createES2015Iterator(iterator) { - var i = -1; - return function next() { - var item = iterator.next(); - if (item.done) - return null; - i++; - return {value: item.value, key: i}; - } - } - - function createObjectIterator(obj) { - var okeys = obj ? Object.keys(obj) : []; - var i = -1; - var len = okeys.length; - return function next() { - var key = okeys[++i]; - if (key === '__proto__') { - return next(); - } - return i < len ? {value: obj[key], key} : null; - }; - } - - function createIterator(coll) { - if (isArrayLike(coll)) { - return createArrayIterator(coll); - } - - var iterator = getIterator(coll); - return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); - } - - function onlyOnce(fn) { - return function (...args) { - if (fn === null) throw new Error("Callback was already called."); - var callFn = fn; - fn = null; - callFn.apply(this, args); - }; - } - - // for async generators - function asyncEachOfLimit(generator, limit, iteratee, callback) { - let done = false; - let canceled = false; - let awaiting = false; - let running = 0; - let idx = 0; - - function replenish() { - //console.log('replenish') - if (running >= limit || awaiting || done) return - //console.log('replenish awaiting') - awaiting = true; - generator.next().then(({value, done: iterDone}) => { - //console.log('got value', value) - if (canceled || done) return - awaiting = false; - if (iterDone) { - done = true; - if (running <= 0) { - //console.log('done nextCb') - callback(null); - } - return; - } - running++; - iteratee(value, idx, iterateeCallback); - idx++; - replenish(); - }).catch(handleError); - } - - function iterateeCallback(err, result) { - //console.log('iterateeCallback') - running -= 1; - if (canceled) return - if (err) return handleError(err) - - if (err === false) { - done = true; - canceled = true; - return - } - - if (result === breakLoop || (done && running <= 0)) { - done = true; - //console.log('done iterCb') - return callback(null); - } - replenish(); - } - - function handleError(err) { - if (canceled) return - awaiting = false; - done = true; - callback(err); - } - - replenish(); - } - - var eachOfLimit = (limit) => { - return (obj, iteratee, callback) => { - callback = once(callback); - if (limit <= 0) { - throw new RangeError('concurrency limit cannot be less than 1') - } - if (!obj) { - return callback(null); - } - if (isAsyncGenerator(obj)) { - return asyncEachOfLimit(obj, limit, iteratee, callback) - } - if (isAsyncIterable(obj)) { - return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback) - } - var nextElem = createIterator(obj); - var done = false; - var canceled = false; - var running = 0; - var looping = false; - - function iterateeCallback(err, value) { - if (canceled) return - running -= 1; - if (err) { - done = true; - callback(err); - } - else if (err === false) { - done = true; - canceled = true; - } - else if (value === breakLoop || (done && running <= 0)) { - done = true; - return callback(null); - } - else if (!looping) { - replenish(); - } - } - - function replenish () { - looping = true; - while (running < limit && !done) { - var elem = nextElem(); - if (elem === null) { - done = true; - if (running <= 0) { - callback(null); - } - return; - } - running += 1; - iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); - } - looping = false; - } - - replenish(); - }; - }; - - /** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a - * time. - * - * @name eachOfLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. The `key` is the item's key, or index in the case of an - * array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - function eachOfLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, wrapAsync(iteratee), callback); - } - - var eachOfLimit$2 = awaitify(eachOfLimit$1, 4); - - // eachOf implementation optimized for array-likes - function eachOfArrayLike(coll, iteratee, callback) { - callback = once(callback); - var index = 0, - completed = 0, - {length} = coll, - canceled = false; - if (length === 0) { - callback(null); - } - - function iteratorCallback(err, value) { - if (err === false) { - canceled = true; - } - if (canceled === true) return - if (err) { - callback(err); - } else if ((++completed === length) || value === breakLoop) { - callback(null); - } - } - - for (; index < length; index++) { - iteratee(coll[index], index, onlyOnce(iteratorCallback)); - } - } - - // a generic version of eachOf which can handle array, object, and iterator cases. - function eachOfGeneric (coll, iteratee, callback) { - return eachOfLimit$2(coll, Infinity, iteratee, callback); - } - - /** - * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument - * to the iteratee. - * - * @name eachOf - * @static - * @memberOf module:Collections - * @method - * @alias forEachOf - * @category Collection - * @see [async.each]{@link module:Collections.each} - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each - * item in `coll`. - * The `key` is the item's key, or index in the case of an array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dev.json is a file containing a valid json object config for dev environment - * // dev.json is a file containing a valid json object config for test environment - * // prod.json is a file containing a valid json object config for prod environment - * // invalid.json is a file with a malformed json object - * - * let configs = {}; //global variable - * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; - * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; - * - * // asynchronous function that reads a json file and parses the contents as json object - * function parseFile(file, key, callback) { - * fs.readFile(file, "utf8", function(err, data) { - * if (err) return calback(err); - * try { - * configs[key] = JSON.parse(data); - * } catch (e) { - * return callback(e); - * } - * callback(); - * }); - * } - * - * // Using callbacks - * async.forEachOf(validConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * } else { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * // JSON parse error exception - * } else { - * console.log(configs); - * } - * }); - * - * // Using Promises - * async.forEachOf(validConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * }).catch( err => { - * console.error(err); - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * }).catch( err => { - * console.error(err); - * // JSON parse error exception - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.forEachOf(validConfigFileMap, parseFile); - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * catch (err) { - * console.log(err); - * } - * } - * - * //Error handing - * async () => { - * try { - * let result = await async.forEachOf(invalidConfigFileMap, parseFile); - * console.log(configs); - * } - * catch (err) { - * console.log(err); - * // JSON parse error exception - * } - * } - * - */ - function eachOf(coll, iteratee, callback) { - var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; - return eachOfImplementation(coll, wrapAsync(iteratee), callback); - } - - var eachOf$1 = awaitify(eachOf, 3); - - /** - * Produces a new collection of values by mapping each value in `coll` through - * the `iteratee` function. The `iteratee` is called with an item from `coll` - * and a callback for when it has finished processing. Each of these callbacks - * takes 2 arguments: an `error`, and the transformed item from `coll`. If - * `iteratee` passes an error to its callback, the main `callback` (for the - * `map` function) is immediately called with the error. - * - * Note, that since this function applies the `iteratee` to each item in - * parallel, there is no guarantee that the `iteratee` functions will complete - * in order. However, the results array will be in the same order as the - * original `coll`. - * - * If `map` is passed an Object, the results will be an Array. The results - * will roughly be in the order of the original Objects' keys (but this can - * vary across JavaScript engines). - * - * @name map - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an Array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.map(fileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.map(fileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.map(fileList, getFileSizeInBytes); - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.map(withMissingFileList, getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ - function map (coll, iteratee, callback) { - return _asyncMap(eachOf$1, coll, iteratee, callback) - } - var map$1 = awaitify(map, 3); - - /** - * Applies the provided arguments to each function in the array, calling - * `callback` after all functions have completed. If you only provide the first - * argument, `fns`, then it will return a function which lets you pass in the - * arguments as if it were a single function call. If more arguments are - * provided, `callback` is required while `args` is still optional. The results - * for each of the applied async functions are passed to the final callback - * as an array. - * - * @name applyEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s - * to all call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - Returns a function that takes no args other than - * an optional callback, that is the result of applying the `args` to each - * of the functions. - * @example - * - * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') - * - * appliedFn((err, results) => { - * // results[0] is the results for `enableSearch` - * // results[1] is the results for `updateSchema` - * }); - * - * // partial application example: - * async.each( - * buckets, - * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), - * callback - * ); - */ - var applyEach$1 = applyEach(map$1); - - /** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. - * - * @name eachOfSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - function eachOfSeries(coll, iteratee, callback) { - return eachOfLimit$2(coll, 1, iteratee, callback) - } - var eachOfSeries$1 = awaitify(eachOfSeries, 3); - - /** - * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. - * - * @name mapSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - function mapSeries (coll, iteratee, callback) { - return _asyncMap(eachOfSeries$1, coll, iteratee, callback) - } - var mapSeries$1 = awaitify(mapSeries, 3); - - /** - * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. - * - * @name applyEachSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.applyEach]{@link module:ControlFlow.applyEach} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all - * call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - A function, that when called, is the result of - * appling the `args` to the list of functions. It takes no args, other than - * a callback. - */ - var applyEachSeries = applyEach(mapSeries$1); - - const PROMISE_SYMBOL = Symbol('promiseCallback'); - - function promiseCallback () { - let resolve, reject; - function callback (err, ...args) { - if (err) return reject(err) - resolve(args.length > 1 ? args : args[0]); - } - - callback[PROMISE_SYMBOL] = new Promise((res, rej) => { - resolve = res, - reject = rej; - }); - - return callback - } - - /** - * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on - * their requirements. Each function can optionally depend on other functions - * being completed first, and each function is run as soon as its requirements - * are satisfied. - * - * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence - * will stop. Further tasks will not execute (so any other functions depending - * on it will not run), and the main `callback` is immediately called with the - * error. - * - * {@link AsyncFunction}s also receive an object containing the results of functions which - * have completed so far as the first argument, if they have dependencies. If a - * task function has no dependencies, it will only be passed a callback. - * - * @name auto - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Object} tasks - An object. Each of its properties is either a - * function or an array of requirements, with the {@link AsyncFunction} itself the last item - * in the array. The object's key of a property serves as the name of the task - * defined by that property, i.e. can be used when specifying requirements for - * other tasks. The function receives one or two arguments: - * * a `results` object, containing the results of the previously executed - * functions, only passed if the task has any dependencies, - * * a `callback(err, result)` function, which must be called when finished, - * passing an `error` (which can be `null`) and the result of the function's - * execution. - * @param {number} [concurrency=Infinity] - An optional `integer` for - * determining the maximum number of tasks that can be run in parallel. By - * default, as many as possible. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback. Results are always returned; however, if an - * error occurs, no further `tasks` will be performed, and the results object - * will only contain partial results. Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * @example - * - * //Using Callbacks - * async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }, function(err, results) { - * if (err) { - * console.log('err = ', err); - * } - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }); - * - * //Using Promises - * async.auto({ - * get_data: function(callback) { - * console.log('in get_data'); - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * console.log('in make_folder'); - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }).then(results => { - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }).catch(err => { - * console.log('err = ', err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }); - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function auto(tasks, concurrency, callback) { - if (typeof concurrency !== 'number') { - // concurrency is optional, shift the args. - callback = concurrency; - concurrency = null; - } - callback = once(callback || promiseCallback()); - var numTasks = Object.keys(tasks).length; - if (!numTasks) { - return callback(null); - } - if (!concurrency) { - concurrency = numTasks; - } - - var results = {}; - var runningTasks = 0; - var canceled = false; - var hasError = false; - - var listeners = Object.create(null); - - var readyTasks = []; - - // for cycle detection: - var readyToCheck = []; // tasks that have been identified as reachable - // without the possibility of returning to an ancestor task - var uncheckedDependencies = {}; - - Object.keys(tasks).forEach(key => { - var task = tasks[key]; - if (!Array.isArray(task)) { - // no dependencies - enqueueTask(key, [task]); - readyToCheck.push(key); - return; - } - - var dependencies = task.slice(0, task.length - 1); - var remainingDependencies = dependencies.length; - if (remainingDependencies === 0) { - enqueueTask(key, task); - readyToCheck.push(key); - return; - } - uncheckedDependencies[key] = remainingDependencies; - - dependencies.forEach(dependencyName => { - if (!tasks[dependencyName]) { - throw new Error('async.auto task `' + key + - '` has a non-existent dependency `' + - dependencyName + '` in ' + - dependencies.join(', ')); - } - addListener(dependencyName, () => { - remainingDependencies--; - if (remainingDependencies === 0) { - enqueueTask(key, task); - } - }); - }); - }); - - checkForDeadlocks(); - processQueue(); - - function enqueueTask(key, task) { - readyTasks.push(() => runTask(key, task)); - } - - function processQueue() { - if (canceled) return - if (readyTasks.length === 0 && runningTasks === 0) { - return callback(null, results); - } - while(readyTasks.length && runningTasks < concurrency) { - var run = readyTasks.shift(); - run(); - } - - } - - function addListener(taskName, fn) { - var taskListeners = listeners[taskName]; - if (!taskListeners) { - taskListeners = listeners[taskName] = []; - } - - taskListeners.push(fn); - } - - function taskComplete(taskName) { - var taskListeners = listeners[taskName] || []; - taskListeners.forEach(fn => fn()); - processQueue(); - } - - - function runTask(key, task) { - if (hasError) return; - - var taskCallback = onlyOnce((err, ...result) => { - runningTasks--; - if (err === false) { - canceled = true; - return - } - if (result.length < 2) { - [result] = result; - } - if (err) { - var safeResults = {}; - Object.keys(results).forEach(rkey => { - safeResults[rkey] = results[rkey]; - }); - safeResults[key] = result; - hasError = true; - listeners = Object.create(null); - if (canceled) return - callback(err, safeResults); - } else { - results[key] = result; - taskComplete(key); - } - }); - - runningTasks++; - var taskFn = wrapAsync(task[task.length - 1]); - if (task.length > 1) { - taskFn(results, taskCallback); - } else { - taskFn(taskCallback); - } - } - - function checkForDeadlocks() { - // Kahn's algorithm - // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm - // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html - var currentTask; - var counter = 0; - while (readyToCheck.length) { - currentTask = readyToCheck.pop(); - counter++; - getDependents(currentTask).forEach(dependent => { - if (--uncheckedDependencies[dependent] === 0) { - readyToCheck.push(dependent); - } - }); - } - - if (counter !== numTasks) { - throw new Error( - 'async.auto cannot execute tasks due to a recursive dependency' - ); - } - } - - function getDependents(taskName) { - var result = []; - Object.keys(tasks).forEach(key => { - const task = tasks[key]; - if (Array.isArray(task) && task.indexOf(taskName) >= 0) { - result.push(key); - } - }); - return result; - } - - return callback[PROMISE_SYMBOL] - } - - var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; - var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; - var FN_ARG_SPLIT = /,/; - var FN_ARG = /(=.+)?(\s*)$/; - - function stripComments(string) { - let stripped = ''; - let index = 0; - let endBlockComment = string.indexOf('*/'); - while (index < string.length) { - if (string[index] === '/' && string[index+1] === '/') { - // inline comment - let endIndex = string.indexOf('\n', index); - index = (endIndex === -1) ? string.length : endIndex; - } else if ((endBlockComment !== -1) && (string[index] === '/') && (string[index+1] === '*')) { - // block comment - let endIndex = string.indexOf('*/', index); - if (endIndex !== -1) { - index = endIndex + 2; - endBlockComment = string.indexOf('*/', index); - } else { - stripped += string[index]; - index++; - } - } else { - stripped += string[index]; - index++; - } - } - return stripped; - } - - function parseParams(func) { - const src = stripComments(func.toString()); - let match = src.match(FN_ARGS); - if (!match) { - match = src.match(ARROW_FN_ARGS); - } - if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src) - let [, args] = match; - return args - .replace(/\s/g, '') - .split(FN_ARG_SPLIT) - .map((arg) => arg.replace(FN_ARG, '').trim()); - } - - /** - * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent - * tasks are specified as parameters to the function, after the usual callback - * parameter, with the parameter names matching the names of the tasks it - * depends on. This can provide even more readable task graphs which can be - * easier to maintain. - * - * If a final callback is specified, the task results are similarly injected, - * specified as named parameters after the initial error parameter. - * - * The autoInject function is purely syntactic sugar and its semantics are - * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. - * - * @name autoInject - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.auto]{@link module:ControlFlow.auto} - * @category Control Flow - * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of - * the form 'func([dependencies...], callback). The object's key of a property - * serves as the name of the task defined by that property, i.e. can be used - * when specifying requirements for other tasks. - * * The `callback` parameter is a `callback(err, result)` which must be called - * when finished, passing an `error` (which can be `null`) and the result of - * the function's execution. The remaining parameters name other tasks on - * which the task is dependent, and the results from those tasks are the - * arguments of those parameters. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback, and a `results` object with any completed - * task results, similar to `auto`. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // The example from `auto` can be rewritten as follows: - * async.autoInject({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: function(get_data, make_folder, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }, - * email_link: function(write_file, callback) { - * // once the file is written let's email a link to it... - * // write_file contains the filename returned by write_file. - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * } - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - * - * // If you are using a JS minifier that mangles parameter names, `autoInject` - * // will not work with plain functions, since the parameter names will be - * // collapsed to a single letter identifier. To work around this, you can - * // explicitly specify the names of the parameters your task function needs - * // in an array, similar to Angular.js dependency injection. - * - * // This still has an advantage over plain `auto`, since the results a task - * // depends on are still spread into arguments. - * async.autoInject({ - * //... - * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(write_file, callback) { - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * }] - * //... - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - */ - function autoInject(tasks, callback) { - var newTasks = {}; - - Object.keys(tasks).forEach(key => { - var taskFn = tasks[key]; - var params; - var fnIsAsync = isAsync(taskFn); - var hasNoDeps = - (!fnIsAsync && taskFn.length === 1) || - (fnIsAsync && taskFn.length === 0); - - if (Array.isArray(taskFn)) { - params = [...taskFn]; - taskFn = params.pop(); - - newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); - } else if (hasNoDeps) { - // no dependencies, use the function as-is - newTasks[key] = taskFn; - } else { - params = parseParams(taskFn); - if ((taskFn.length === 0 && !fnIsAsync) && params.length === 0) { - throw new Error("autoInject task functions require explicit parameters."); - } - - // remove callback param - if (!fnIsAsync) params.pop(); - - newTasks[key] = params.concat(newTask); - } - - function newTask(results, taskCb) { - var newArgs = params.map(name => results[name]); - newArgs.push(taskCb); - wrapAsync(taskFn)(...newArgs); - } - }); - - return auto(newTasks, callback); - } - - // Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation - // used for queues. This implementation assumes that the node provided by the user can be modified - // to adjust the next and last properties. We implement only the minimal functionality - // for queue support. - class DLL { - constructor() { - this.head = this.tail = null; - this.length = 0; - } - - removeLink(node) { - if (node.prev) node.prev.next = node.next; - else this.head = node.next; - if (node.next) node.next.prev = node.prev; - else this.tail = node.prev; - - node.prev = node.next = null; - this.length -= 1; - return node; - } - - empty () { - while(this.head) this.shift(); - return this; - } - - insertAfter(node, newNode) { - newNode.prev = node; - newNode.next = node.next; - if (node.next) node.next.prev = newNode; - else this.tail = newNode; - node.next = newNode; - this.length += 1; - } - - insertBefore(node, newNode) { - newNode.prev = node.prev; - newNode.next = node; - if (node.prev) node.prev.next = newNode; - else this.head = newNode; - node.prev = newNode; - this.length += 1; - } - - unshift(node) { - if (this.head) this.insertBefore(this.head, node); - else setInitial(this, node); - } - - push(node) { - if (this.tail) this.insertAfter(this.tail, node); - else setInitial(this, node); - } - - shift() { - return this.head && this.removeLink(this.head); - } - - pop() { - return this.tail && this.removeLink(this.tail); - } - - toArray() { - return [...this] - } - - *[Symbol.iterator] () { - var cur = this.head; - while (cur) { - yield cur.data; - cur = cur.next; - } - } - - remove (testFn) { - var curr = this.head; - while(curr) { - var {next} = curr; - if (testFn(curr)) { - this.removeLink(curr); - } - curr = next; - } - return this; - } - } - - function setInitial(dll, node) { - dll.length = 1; - dll.head = dll.tail = node; - } - - function queue(worker, concurrency, payload) { - if (concurrency == null) { - concurrency = 1; - } - else if(concurrency === 0) { - throw new RangeError('Concurrency must not be zero'); - } - - var _worker = wrapAsync(worker); - var numRunning = 0; - var workersList = []; - const events = { - error: [], - drain: [], - saturated: [], - unsaturated: [], - empty: [] - }; - - function on (event, handler) { - events[event].push(handler); - } - - function once (event, handler) { - const handleAndRemove = (...args) => { - off(event, handleAndRemove); - handler(...args); - }; - events[event].push(handleAndRemove); - } - - function off (event, handler) { - if (!event) return Object.keys(events).forEach(ev => events[ev] = []) - if (!handler) return events[event] = [] - events[event] = events[event].filter(ev => ev !== handler); - } - - function trigger (event, ...args) { - events[event].forEach(handler => handler(...args)); - } - - var processingScheduled = false; - function _insert(data, insertAtFront, rejectOnError, callback) { - if (callback != null && typeof callback !== 'function') { - throw new Error('task callback must be a function'); - } - q.started = true; - - var res, rej; - function promiseCallback (err, ...args) { - // we don't care about the error, let the global error handler - // deal with it - if (err) return rejectOnError ? rej(err) : res() - if (args.length <= 1) return res(args[0]) - res(args); - } - - var item = q._createTaskItem( - data, - rejectOnError ? promiseCallback : - (callback || promiseCallback) - ); - - if (insertAtFront) { - q._tasks.unshift(item); - } else { - q._tasks.push(item); - } - - if (!processingScheduled) { - processingScheduled = true; - setImmediate$1(() => { - processingScheduled = false; - q.process(); - }); - } - - if (rejectOnError || !callback) { - return new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }) - } - } - - function _createCB(tasks) { - return function (err, ...args) { - numRunning -= 1; - - for (var i = 0, l = tasks.length; i < l; i++) { - var task = tasks[i]; - - var index = workersList.indexOf(task); - if (index === 0) { - workersList.shift(); - } else if (index > 0) { - workersList.splice(index, 1); - } - - task.callback(err, ...args); - - if (err != null) { - trigger('error', err, task.data); - } - } - - if (numRunning <= (q.concurrency - q.buffer) ) { - trigger('unsaturated'); - } - - if (q.idle()) { - trigger('drain'); - } - q.process(); - }; - } - - function _maybeDrain(data) { - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - setImmediate$1(() => trigger('drain')); - return true - } - return false - } - - const eventMethod = (name) => (handler) => { - if (!handler) { - return new Promise((resolve, reject) => { - once(name, (err, data) => { - if (err) return reject(err) - resolve(data); - }); - }) - } - off(name); - on(name, handler); - - }; - - var isProcessing = false; - var q = { - _tasks: new DLL(), - _createTaskItem (data, callback) { - return { - data, - callback - }; - }, - *[Symbol.iterator] () { - yield* q._tasks[Symbol.iterator](); - }, - concurrency, - payload, - buffer: concurrency / 4, - started: false, - paused: false, - push (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, false, false, callback)) - } - return _insert(data, false, false, callback); - }, - pushAsync (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, false, true, callback)) - } - return _insert(data, false, true, callback); - }, - kill () { - off(); - q._tasks.empty(); - }, - unshift (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, true, false, callback)) - } - return _insert(data, true, false, callback); - }, - unshiftAsync (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, true, true, callback)) - } - return _insert(data, true, true, callback); - }, - remove (testFn) { - q._tasks.remove(testFn); - }, - process () { - // Avoid trying to start too many processing operations. This can occur - // when callbacks resolve synchronously (#1267). - if (isProcessing) { - return; - } - isProcessing = true; - while(!q.paused && numRunning < q.concurrency && q._tasks.length){ - var tasks = [], data = []; - var l = q._tasks.length; - if (q.payload) l = Math.min(l, q.payload); - for (var i = 0; i < l; i++) { - var node = q._tasks.shift(); - tasks.push(node); - workersList.push(node); - data.push(node.data); - } - - numRunning += 1; - - if (q._tasks.length === 0) { - trigger('empty'); - } - - if (numRunning === q.concurrency) { - trigger('saturated'); - } - - var cb = onlyOnce(_createCB(tasks)); - _worker(data, cb); - } - isProcessing = false; - }, - length () { - return q._tasks.length; - }, - running () { - return numRunning; - }, - workersList () { - return workersList; - }, - idle() { - return q._tasks.length + numRunning === 0; - }, - pause () { - q.paused = true; - }, - resume () { - if (q.paused === false) { return; } - q.paused = false; - setImmediate$1(q.process); - } - }; - // define these as fixed properties, so people get useful errors when updating - Object.defineProperties(q, { - saturated: { - writable: false, - value: eventMethod('saturated') - }, - unsaturated: { - writable: false, - value: eventMethod('unsaturated') - }, - empty: { - writable: false, - value: eventMethod('empty') - }, - drain: { - writable: false, - value: eventMethod('drain') - }, - error: { - writable: false, - value: eventMethod('error') - }, - }); - return q; - } - - /** - * Creates a `cargo` object with the specified payload. Tasks added to the - * cargo will be processed altogether (up to the `payload` limit). If the - * `worker` is in progress, the task is queued until it becomes available. Once - * the `worker` has completed some tasks, each callback of those tasks is - * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) - * for how `cargo` and `queue` work. - * - * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers - * at a time, cargo passes an array of tasks to a single worker, repeating - * when the worker is finished. - * - * @name cargo - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An asynchronous function for processing an array - * of queued tasks. Invoked with `(tasks, callback)`. - * @param {number} [payload=Infinity] - An optional `integer` for determining - * how many tasks should be processed per round; if omitted, the default is - * unlimited. - * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can - * attached as certain properties to listen for specific events during the - * lifecycle of the cargo and inner queue. - * @example - * - * // create a cargo object with payload 2 - * var cargo = async.cargo(function(tasks, callback) { - * for (var i=0; i { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.reduce(fileList, 0, getFileSizeInBytes); - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ - function reduce(coll, memo, iteratee, callback) { - callback = once(callback); - var _iteratee = wrapAsync(iteratee); - return eachOfSeries$1(coll, (x, i, iterCb) => { - _iteratee(memo, x, (err, v) => { - memo = v; - iterCb(err); - }); - }, err => callback(err, memo)); - } - var reduce$1 = awaitify(reduce, 4); - - /** - * Version of the compose function that is more natural to read. Each function - * consumes the return value of the previous function. It is the equivalent of - * [compose]{@link module:ControlFlow.compose} with the arguments reversed. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name seq - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.compose]{@link module:ControlFlow.compose} - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} a function that composes the `functions` in order - * @example - * - * // Requires lodash (or underscore), express3 and dresende's orm2. - * // Part of an app, that fetches cats of the logged user. - * // This example uses `seq` function to avoid overnesting and error - * // handling clutter. - * app.get('/cats', function(request, response) { - * var User = request.models.User; - * async.seq( - * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) - * function(user, fn) { - * user.getCats(fn); // 'getCats' has signature (callback(err, data)) - * } - * )(req.session.user_id, function (err, cats) { - * if (err) { - * console.error(err); - * response.json({ status: 'error', message: err.message }); - * } else { - * response.json({ status: 'ok', message: 'Cats found', data: cats }); - * } - * }); - * }); - */ - function seq(...functions) { - var _functions = functions.map(wrapAsync); - return function (...args) { - var that = this; - - var cb = args[args.length - 1]; - if (typeof cb == 'function') { - args.pop(); - } else { - cb = promiseCallback(); - } - - reduce$1(_functions, args, (newargs, fn, iterCb) => { - fn.apply(that, newargs.concat((err, ...nextargs) => { - iterCb(err, nextargs); - })); - }, - (err, results) => cb(err, ...results)); - - return cb[PROMISE_SYMBOL] - }; - } - - /** - * Creates a function which is a composition of the passed asynchronous - * functions. Each function consumes the return value of the function that - * follows. Composing functions `f()`, `g()`, and `h()` would produce the result - * of `f(g(h()))`, only this version uses callbacks to obtain the return values. - * - * If the last argument to the composed function is not a function, a promise - * is returned when you call it. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name compose - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} an asynchronous function that is the composed - * asynchronous `functions` - * @example - * - * function add1(n, callback) { - * setTimeout(function () { - * callback(null, n + 1); - * }, 10); - * } - * - * function mul3(n, callback) { - * setTimeout(function () { - * callback(null, n * 3); - * }, 10); - * } - * - * var add1mul3 = async.compose(mul3, add1); - * add1mul3(4, function (err, result) { - * // result now equals 15 - * }); - */ - function compose(...args) { - return seq(...args.reverse()); - } - - /** - * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. - * - * @name mapLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - function mapLimit (coll, limit, iteratee, callback) { - return _asyncMap(eachOfLimit(limit), coll, iteratee, callback) - } - var mapLimit$1 = awaitify(mapLimit, 4); - - /** - * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. - * - * @name concatLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapLimit - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ - function concatLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(coll, limit, (val, iterCb) => { - _iteratee(val, (err, ...args) => { - if (err) return iterCb(err); - return iterCb(err, args); - }); - }, (err, mapResults) => { - var result = []; - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - result = result.concat(...mapResults[i]); - } - } - - return callback(err, result); - }); - } - var concatLimit$1 = awaitify(concatLimit, 4); - - /** - * Applies `iteratee` to each item in `coll`, concatenating the results. Returns - * the concatenated list. The `iteratee`s are called in parallel, and the - * results are concatenated as they return. The results array will be returned in - * the original order of `coll` passed to the `iteratee` function. - * - * @name concat - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @alias flatMap - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * let directoryList = ['dir1','dir2','dir3']; - * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; - * - * // Using callbacks - * async.concat(directoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.concat(directoryList, fs.readdir) - * .then(results => { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir) - * .then(results => { - * console.log(results); - * }).catch(err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.concat(directoryList, fs.readdir); - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.concat(withMissingDirectoryList, fs.readdir); - * console.log(results); - * } catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } - * } - * - */ - function concat(coll, iteratee, callback) { - return concatLimit$1(coll, Infinity, iteratee, callback) - } - var concat$1 = awaitify(concat, 3); - - /** - * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. - * - * @name concatSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapSeries - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. - * The iteratee should complete with an array an array of results. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ - function concatSeries(coll, iteratee, callback) { - return concatLimit$1(coll, 1, iteratee, callback) - } - var concatSeries$1 = awaitify(concatSeries, 3); - - /** - * Returns a function that when called, calls-back with the values provided. - * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to - * [`auto`]{@link module:ControlFlow.auto}. - * - * @name constant - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {...*} arguments... - Any number of arguments to automatically invoke - * callback with. - * @returns {AsyncFunction} Returns a function that when invoked, automatically - * invokes the callback with the previous given arguments. - * @example - * - * async.waterfall([ - * async.constant(42), - * function (value, next) { - * // value === 42 - * }, - * //... - * ], callback); - * - * async.waterfall([ - * async.constant(filename, "utf8"), - * fs.readFile, - * function (fileData, next) { - * //... - * } - * //... - * ], callback); - * - * async.auto({ - * hostname: async.constant("https://server.net/"), - * port: findFreePort, - * launchServer: ["hostname", "port", function (options, cb) { - * startServer(options, cb); - * }], - * //... - * }, callback); - */ - function constant(...args) { - return function (...ignoredArgs/*, callback*/) { - var callback = ignoredArgs.pop(); - return callback(null, ...args); - }; - } - - function _createTester(check, getResult) { - return (eachfn, arr, _iteratee, cb) => { - var testPassed = false; - var testResult; - const iteratee = wrapAsync(_iteratee); - eachfn(arr, (value, _, callback) => { - iteratee(value, (err, result) => { - if (err || err === false) return callback(err); - - if (check(result) && !testResult) { - testPassed = true; - testResult = getResult(true, value); - return callback(null, breakLoop); - } - callback(); - }); - }, err => { - if (err) return cb(err); - cb(null, testPassed ? testResult : getResult(false)); - }); - }; - } - - /** - * Returns the first value in `coll` that passes an async truth test. The - * `iteratee` is applied in parallel, meaning the first iteratee to return - * `true` will fire the detect `callback` with that result. That means the - * result might not be the first item in the original `coll` (in terms of order) - * that passes the test. - - * If order within the original `coll` is important, then look at - * [`detectSeries`]{@link module:Collections.detectSeries}. - * - * @name detect - * @static - * @memberOf module:Collections - * @method - * @alias find - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * } - *); - * - * // Using Promises - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) - * .then(result => { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); - * console.log(result); - * // dir1/file1.txt - * // result now equals the file in the list that exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function detect(coll, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback) - } - var detect$1 = awaitify(detect, 3); - - /** - * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a - * time. - * - * @name detectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findLimit - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ - function detectLimit(coll, limit, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOfLimit(limit), coll, iteratee, callback) - } - var detectLimit$1 = awaitify(detectLimit, 4); - - /** - * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. - * - * @name detectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findSeries - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ - function detectSeries(coll, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOfLimit(1), coll, iteratee, callback) - } - - var detectSeries$1 = awaitify(detectSeries, 3); - - function consoleFunc(name) { - return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => { - /* istanbul ignore else */ - if (typeof console === 'object') { - /* istanbul ignore else */ - if (err) { - /* istanbul ignore else */ - if (console.error) { - console.error(err); - } - } else if (console[name]) { /* istanbul ignore else */ - resultArgs.forEach(x => console[name](x)); - } - } - }) - } - - /** - * Logs the result of an [`async` function]{@link AsyncFunction} to the - * `console` using `console.dir` to display the properties of the resulting object. - * Only works in Node.js or in browsers that support `console.dir` and - * `console.error` (such as FF and Chrome). - * If multiple arguments are returned from the async function, - * `console.dir` is called on each argument in order. - * - * @name dir - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, {hello: name}); - * }, 1000); - * }; - * - * // in the node repl - * node> async.dir(hello, 'world'); - * {hello: 'world'} - */ - var dir = consoleFunc('dir'); - - /** - * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in - * the order of operations, the arguments `test` and `iteratee` are switched. - * - * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - * - * @name doWhilst - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - A function which is called each time `test` - * passes. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee`. - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. - * `callback` will be passed an error and any arguments passed to the final - * `iteratee`'s callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ - function doWhilst(iteratee, test, callback) { - callback = onlyOnce(callback); - var _fn = wrapAsync(iteratee); - var _test = wrapAsync(test); - var results; - - function next(err, ...args) { - if (err) return callback(err); - if (err === false) return; - results = args; - _test(...args, check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return check(null, true); - } - - var doWhilst$1 = awaitify(doWhilst, 3); - - /** - * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the - * argument ordering differs from `until`. - * - * @name doUntil - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee` - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ - function doUntil(iteratee, test, callback) { - const _test = wrapAsync(test); - return doWhilst$1(iteratee, (...args) => { - const cb = args.pop(); - _test(...args, (err, truth) => cb (err, !truth)); - }, callback); - } - - function _withoutIndex(iteratee) { - return (value, index, callback) => iteratee(value, callback); - } - - /** - * Applies the function `iteratee` to each item in `coll`, in parallel. - * The `iteratee` is called with an item from the list, and a callback for when - * it has finished. If the `iteratee` passes an error to its `callback`, the - * main `callback` (for the `each` function) is immediately called with the - * error. - * - * Note, that since this function applies `iteratee` to each item in parallel, - * there is no guarantee that the iteratee functions will complete in order. - * - * @name each - * @static - * @memberOf module:Collections - * @method - * @alias forEach - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to - * each item in `coll`. Invoked with (item, callback). - * The array index is not passed to the iteratee. - * If you need the index, use `eachOf`. - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; - * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; - * - * // asynchronous function that deletes a file - * const deleteFile = function(file, callback) { - * fs.unlink(file, callback); - * }; - * - * // Using callbacks - * async.each(fileList, deleteFile, function(err) { - * if( err ) { - * console.log(err); - * } else { - * console.log('All files have been deleted successfully'); - * } - * }); - * - * // Error Handling - * async.each(withMissingFileList, deleteFile, function(err){ - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using Promises - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using async/await - * async () => { - * try { - * await async.each(files, deleteFile); - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * await async.each(withMissingFileList, deleteFile); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * } - * } - * - */ - function eachLimit(coll, iteratee, callback) { - return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); - } - - var each = awaitify(eachLimit, 3); - - /** - * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. - * - * @name eachLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfLimit`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - function eachLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); - } - var eachLimit$2 = awaitify(eachLimit$1, 4); - - /** - * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. - * - * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item - * in series and therefore the iteratee functions will complete in order. - - * @name eachSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfSeries`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - function eachSeries(coll, iteratee, callback) { - return eachLimit$2(coll, 1, iteratee, callback) - } - var eachSeries$1 = awaitify(eachSeries, 3); - - /** - * Wrap an async function and ensure it calls its callback on a later tick of - * the event loop. If the function already calls its callback on a next tick, - * no extra deferral is added. This is useful for preventing stack overflows - * (`RangeError: Maximum call stack size exceeded`) and generally keeping - * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) - * contained. ES2017 `async` functions are returned as-is -- they are immune - * to Zalgo's corrupting influences, as they always resolve on a later tick. - * - * @name ensureAsync - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - an async function, one that expects a node-style - * callback as its last argument. - * @returns {AsyncFunction} Returns a wrapped function with the exact same call - * signature as the function passed in. - * @example - * - * function sometimesAsync(arg, callback) { - * if (cache[arg]) { - * return callback(null, cache[arg]); // this would be synchronous!! - * } else { - * doSomeIO(arg, callback); // this IO would be asynchronous - * } - * } - * - * // this has a risk of stack overflows if many results are cached in a row - * async.mapSeries(args, sometimesAsync, done); - * - * // this will defer sometimesAsync's callback if necessary, - * // preventing stack overflows - * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); - */ - function ensureAsync(fn) { - if (isAsync(fn)) return fn; - return function (...args/*, callback*/) { - var callback = args.pop(); - var sync = true; - args.push((...innerArgs) => { - if (sync) { - setImmediate$1(() => callback(...innerArgs)); - } else { - callback(...innerArgs); - } - }); - fn.apply(this, args); - sync = false; - }; - } - - /** - * Returns `true` if every element in `coll` satisfies an async test. If any - * iteratee call returns `false`, the main `callback` is immediately called. - * - * @name every - * @static - * @memberOf module:Collections - * @method - * @alias all - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.every(fileList, fileExists, function(err, result) { - * console.log(result); - * // true - * // result is true since every file exists - * }); - * - * async.every(withMissingFileList, fileExists, function(err, result) { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }); - * - * // Using Promises - * async.every(fileList, fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.every(withMissingFileList, fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.every(fileList, fileExists); - * console.log(result); - * // true - * // result is true since every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.every(withMissingFileList, fileExists); - * console.log(result); - * // false - * // result is false since NOT every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function every(coll, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOf$1, coll, iteratee, callback) - } - var every$1 = awaitify(every, 3); - - /** - * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. - * - * @name everyLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - function everyLimit(coll, limit, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOfLimit(limit), coll, iteratee, callback) - } - var everyLimit$1 = awaitify(everyLimit, 4); - - /** - * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. - * - * @name everySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in series. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - function everySeries(coll, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOfSeries$1, coll, iteratee, callback) - } - var everySeries$1 = awaitify(everySeries, 3); - - function filterArray(eachfn, arr, iteratee, callback) { - var truthValues = new Array(arr.length); - eachfn(arr, (x, index, iterCb) => { - iteratee(x, (err, v) => { - truthValues[index] = !!v; - iterCb(err); - }); - }, err => { - if (err) return callback(err); - var results = []; - for (var i = 0; i < arr.length; i++) { - if (truthValues[i]) results.push(arr[i]); - } - callback(null, results); - }); - } - - function filterGeneric(eachfn, coll, iteratee, callback) { - var results = []; - eachfn(coll, (x, index, iterCb) => { - iteratee(x, (err, v) => { - if (err) return iterCb(err); - if (v) { - results.push({index, value: x}); - } - iterCb(err); - }); - }, err => { - if (err) return callback(err); - callback(null, results - .sort((a, b) => a.index - b.index) - .map(v => v.value)); - }); - } - - function _filter(eachfn, coll, iteratee, callback) { - var filter = isArrayLike(coll) ? filterArray : filterGeneric; - return filter(eachfn, coll, wrapAsync(iteratee), callback); - } - - /** - * Returns a new array of all the values in `coll` which pass an async truth - * test. This operation is performed in parallel, but the results array will be - * in the same order as the original. - * - * @name filter - * @static - * @memberOf module:Collections - * @method - * @alias select - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.filter(files, fileExists, function(err, results) { - * if(err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * }); - * - * // Using Promises - * async.filter(files, fileExists) - * .then(results => { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.filter(files, fileExists); - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function filter (coll, iteratee, callback) { - return _filter(eachOf$1, coll, iteratee, callback) - } - var filter$1 = awaitify(filter, 3); - - /** - * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a - * time. - * - * @name filterLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - */ - function filterLimit (coll, limit, iteratee, callback) { - return _filter(eachOfLimit(limit), coll, iteratee, callback) - } - var filterLimit$1 = awaitify(filterLimit, 4); - - /** - * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. - * - * @name filterSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results) - * @returns {Promise} a promise, if no callback provided - */ - function filterSeries (coll, iteratee, callback) { - return _filter(eachOfSeries$1, coll, iteratee, callback) - } - var filterSeries$1 = awaitify(filterSeries, 3); - - /** - * Calls the asynchronous function `fn` with a callback parameter that allows it - * to call itself again, in series, indefinitely. - - * If an error is passed to the callback then `errback` is called with the - * error, and execution stops, otherwise it will never be called. - * - * @name forever - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} fn - an async function to call repeatedly. - * Invoked with (next). - * @param {Function} [errback] - when `fn` passes an error to it's callback, - * this function will be called, and execution stops. Invoked with (err). - * @returns {Promise} a promise that rejects if an error occurs and an errback - * is not passed - * @example - * - * async.forever( - * function(next) { - * // next is suitable for passing to things that need a callback(err [, whatever]); - * // it will result in this function being called again. - * }, - * function(err) { - * // if next is called with a value in its first parameter, it will appear - * // in here as 'err', and execution will stop. - * } - * ); - */ - function forever(fn, errback) { - var done = onlyOnce(errback); - var task = wrapAsync(ensureAsync(fn)); - - function next(err) { - if (err) return done(err); - if (err === false) return; - task(next); - } - return next(); - } - var forever$1 = awaitify(forever, 2); - - /** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. - * - * @name groupByLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ - function groupByLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(coll, limit, (val, iterCb) => { - _iteratee(val, (err, key) => { - if (err) return iterCb(err); - return iterCb(err, {key, val}); - }); - }, (err, mapResults) => { - var result = {}; - // from MDN, handle object having an `hasOwnProperty` prop - var {hasOwnProperty} = Object.prototype; - - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - var {key} = mapResults[i]; - var {val} = mapResults[i]; - - if (hasOwnProperty.call(result, key)) { - result[key].push(val); - } else { - result[key] = [val]; - } - } - } - - return callback(err, result); - }); - } - - var groupByLimit$1 = awaitify(groupByLimit, 4); - - /** - * Returns a new object, where each value corresponds to an array of items, from - * `coll`, that returned the corresponding key. That is, the keys of the object - * correspond to the values passed to the `iteratee` callback. - * - * Note: Since this function applies the `iteratee` to each item in parallel, - * there is no guarantee that the `iteratee` functions will complete in order. - * However, the values for each key in the `result` will be in the same order as - * the original `coll`. For Objects, the values will roughly be in the order of - * the original Objects' keys (but this can vary across JavaScript engines). - * - * @name groupBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const files = ['dir1/file1.txt','dir2','dir4'] - * - * // asynchronous function that detects file type as none, file, or directory - * function detectFile(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(null, 'none'); - * } - * callback(null, stat.isDirectory() ? 'directory' : 'file'); - * }); - * } - * - * //Using callbacks - * async.groupBy(files, detectFile, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * }); - * - * // Using Promises - * async.groupBy(files, detectFile) - * .then( result => { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.groupBy(files, detectFile); - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function groupBy (coll, iteratee, callback) { - return groupByLimit$1(coll, Infinity, iteratee, callback) - } - - /** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. - * - * @name groupBySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whose - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ - function groupBySeries (coll, iteratee, callback) { - return groupByLimit$1(coll, 1, iteratee, callback) - } - - /** - * Logs the result of an `async` function to the `console`. Only works in - * Node.js or in browsers that support `console.log` and `console.error` (such - * as FF and Chrome). If multiple arguments are returned from the async - * function, `console.log` is called on each argument in order. - * - * @name log - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, 'hello ' + name); - * }, 1000); - * }; - * - * // in the node repl - * node> async.log(hello, 'world'); - * 'hello world' - */ - var log = consoleFunc('log'); - - /** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a - * time. - * - * @name mapValuesLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - function mapValuesLimit(obj, limit, iteratee, callback) { - callback = once(callback); - var newObj = {}; - var _iteratee = wrapAsync(iteratee); - return eachOfLimit(limit)(obj, (val, key, next) => { - _iteratee(val, key, (err, result) => { - if (err) return next(err); - newObj[key] = result; - next(err); - }); - }, err => callback(err, newObj)); - } - - var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); - - /** - * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. - * - * Produces a new Object by mapping each value of `obj` through the `iteratee` - * function. The `iteratee` is called each `value` and `key` from `obj` and a - * callback for when it has finished processing. Each of these callbacks takes - * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` - * passes an error to its callback, the main `callback` (for the `mapValues` - * function) is immediately called with the error. - * - * Note, the order of the keys in the result is not guaranteed. The keys will - * be roughly in the order they complete, (but this is very engine-specific) - * - * @name mapValues - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file3.txt' - * }; - * - * const withMissingFileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file4.txt' - * }; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, key, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * }); - * - * // Error handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.mapValues(fileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * }).catch (err => { - * console.log(err); - * }); - * - * // Error Handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch (err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.mapValues(fileMap, getFileSizeInBytes); - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ - function mapValues(obj, iteratee, callback) { - return mapValuesLimit$1(obj, Infinity, iteratee, callback) - } - - /** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. - * - * @name mapValuesSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - function mapValuesSeries(obj, iteratee, callback) { - return mapValuesLimit$1(obj, 1, iteratee, callback) - } - - /** - * Caches the results of an async function. When creating a hash to store - * function results against, the callback is omitted from the hash and an - * optional hash function can be used. - * - * **Note: if the async function errs, the result will not be cached and - * subsequent calls will call the wrapped function.** - * - * If no hash function is specified, the first argument is used as a hash key, - * which may work reasonably if it is a string or a data type that converts to a - * distinct string. Note that objects and arrays will not behave reasonably. - * Neither will cases where the other arguments are significant. In such cases, - * specify your own hash function. - * - * The cache of results is exposed as the `memo` property of the function - * returned by `memoize`. - * - * @name memoize - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function to proxy and cache results from. - * @param {Function} hasher - An optional function for generating a custom hash - * for storing results. It has all the arguments applied to it apart from the - * callback, and must be synchronous. - * @returns {AsyncFunction} a memoized version of `fn` - * @example - * - * var slow_fn = function(name, callback) { - * // do something - * callback(null, result); - * }; - * var fn = async.memoize(slow_fn); - * - * // fn can now be used as if it were slow_fn - * fn('some name', function() { - * // callback - * }); - */ - function memoize(fn, hasher = v => v) { - var memo = Object.create(null); - var queues = Object.create(null); - var _fn = wrapAsync(fn); - var memoized = initialParams((args, callback) => { - var key = hasher(...args); - if (key in memo) { - setImmediate$1(() => callback(null, ...memo[key])); - } else if (key in queues) { - queues[key].push(callback); - } else { - queues[key] = [callback]; - _fn(...args, (err, ...resultArgs) => { - // #1465 don't memoize if an error occurred - if (!err) { - memo[key] = resultArgs; - } - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i](err, ...resultArgs); - } - }); - } - }); - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - } - - /* istanbul ignore file */ - - /** - * Calls `callback` on a later loop around the event loop. In Node.js this just - * calls `process.nextTick`. In the browser it will use `setImmediate` if - * available, otherwise `setTimeout(callback, 0)`, which means other higher - * priority events may precede the execution of `callback`. - * - * This is used internally for browser-compatibility purposes. - * - * @name nextTick - * @static - * @memberOf module:Utils - * @method - * @see [async.setImmediate]{@link module:Utils.setImmediate} - * @category Util - * @param {Function} callback - The function to call on a later loop around - * the event loop. Invoked with (args...). - * @param {...*} args... - any number of additional arguments to pass to the - * callback on the next tick. - * @example - * - * var call_order = []; - * async.nextTick(function() { - * call_order.push('two'); - * // call_order now equals ['one','two'] - * }); - * call_order.push('one'); - * - * async.setImmediate(function (a, b, c) { - * // a, b, and c equal 1, 2, and 3 - * }, 1, 2, 3); - */ - var _defer$1; - - if (hasNextTick) { - _defer$1 = process.nextTick; - } else if (hasSetImmediate) { - _defer$1 = setImmediate; - } else { - _defer$1 = fallback; - } - - var nextTick = wrap(_defer$1); - - var parallel = awaitify((eachfn, tasks, callback) => { - var results = isArrayLike(tasks) ? [] : {}; - - eachfn(tasks, (task, key, taskCb) => { - wrapAsync(task)((err, ...result) => { - if (result.length < 2) { - [result] = result; - } - results[key] = result; - taskCb(err); - }); - }, err => callback(err, results)); - }, 3); - - /** - * Run the `tasks` collection of functions in parallel, without waiting until - * the previous function has completed. If any of the functions pass an error to - * its callback, the main `callback` is immediately called with the value of the - * error. Once the `tasks` have completed, the results are passed to the final - * `callback` as an array. - * - * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about - * parallel execution of code. If your tasks do not use any timers or perform - * any I/O, they will actually be executed in series. Any synchronous setup - * sections for each task will happen one after the other. JavaScript remains - * single-threaded. - * - * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the - * execution of other tasks when a task fails. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.parallel}. - * - * @name parallel - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * - * //Using Callbacks - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function parallel$1(tasks, callback) { - return parallel(eachOf$1, tasks, callback); - } - - /** - * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a - * time. - * - * @name parallelLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.parallel]{@link module:ControlFlow.parallel} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - */ - function parallelLimit(tasks, limit, callback) { - return parallel(eachOfLimit(limit), tasks, callback); - } - - /** - * A queue of tasks for the worker function to complete. - * @typedef {Iterable} QueueObject - * @memberOf module:ControlFlow - * @property {Function} length - a function returning the number of items - * waiting to be processed. Invoke with `queue.length()`. - * @property {boolean} started - a boolean indicating whether or not any - * items have been pushed and processed by the queue. - * @property {Function} running - a function returning the number of items - * currently being processed. Invoke with `queue.running()`. - * @property {Function} workersList - a function returning the array of items - * currently being processed. Invoke with `queue.workersList()`. - * @property {Function} idle - a function returning false if there are items - * waiting or being processed, or true if not. Invoke with `queue.idle()`. - * @property {number} concurrency - an integer for determining how many `worker` - * functions should be run in parallel. This property can be changed after a - * `queue` is created to alter the concurrency on-the-fly. - * @property {number} payload - an integer that specifies how many items are - * passed to the worker function at a time. only applies if this is a - * [cargo]{@link module:ControlFlow.cargo} object - * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` - * once the `worker` has finished processing the task. Instead of a single task, - * a `tasks` array can be submitted. The respective callback is used for every - * task in the list. Invoke with `queue.push(task, [callback])`, - * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. - * Invoke with `queue.unshift(task, [callback])`. - * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns - * a promise that rejects if an error occurs. - * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns - * a promise that rejects if an error occurs. - * @property {Function} remove - remove items from the queue that match a test - * function. The test function will be passed an object with a `data` property, - * and a `priority` property, if this is a - * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. - * Invoked with `queue.remove(testFn)`, where `testFn` is of the form - * `function ({data, priority}) {}` and returns a Boolean. - * @property {Function} saturated - a function that sets a callback that is - * called when the number of running workers hits the `concurrency` limit, and - * further tasks will be queued. If the callback is omitted, `q.saturated()` - * returns a promise for the next occurrence. - * @property {Function} unsaturated - a function that sets a callback that is - * called when the number of running workers is less than the `concurrency` & - * `buffer` limits, and further tasks will not be queued. If the callback is - * omitted, `q.unsaturated()` returns a promise for the next occurrence. - * @property {number} buffer - A minimum threshold buffer in order to say that - * the `queue` is `unsaturated`. - * @property {Function} empty - a function that sets a callback that is called - * when the last item from the `queue` is given to a `worker`. If the callback - * is omitted, `q.empty()` returns a promise for the next occurrence. - * @property {Function} drain - a function that sets a callback that is called - * when the last item from the `queue` has returned from the `worker`. If the - * callback is omitted, `q.drain()` returns a promise for the next occurrence. - * @property {Function} error - a function that sets a callback that is called - * when a task errors. Has the signature `function(error, task)`. If the - * callback is omitted, `error()` returns a promise that rejects on the next - * error. - * @property {boolean} paused - a boolean for determining whether the queue is - * in a paused state. - * @property {Function} pause - a function that pauses the processing of tasks - * until `resume()` is called. Invoke with `queue.pause()`. - * @property {Function} resume - a function that resumes the processing of - * queued tasks when the queue is paused. Invoke with `queue.resume()`. - * @property {Function} kill - a function that removes the `drain` callback and - * empties remaining tasks from the queue forcing it to go idle. No more tasks - * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. - * - * @example - * const q = async.queue(worker, 2) - * q.push(item1) - * q.push(item2) - * q.push(item3) - * // queues are iterable, spread into an array to inspect - * const items = [...q] // [item1, item2, item3] - * // or use for of - * for (let item of q) { - * console.log(item) - * } - * - * q.drain(() => { - * console.log('all done') - * }) - * // or - * await q.drain() - */ - - /** - * Creates a `queue` object with the specified `concurrency`. Tasks added to the - * `queue` are processed in parallel (up to the `concurrency` limit). If all - * `worker`s are in progress, the task is queued until one becomes available. - * Once a `worker` completes a `task`, that `task`'s callback is called. - * - * @name queue - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. Invoked with (task, callback). - * @param {number} [concurrency=1] - An `integer` for determining how many - * `worker` functions should be run in parallel. If omitted, the concurrency - * defaults to `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be - * attached as certain properties to listen for specific events during the - * lifecycle of the queue. - * @example - * - * // create a queue object with concurrency 2 - * var q = async.queue(function(task, callback) { - * console.log('hello ' + task.name); - * callback(); - * }, 2); - * - * // assign a callback - * q.drain(function() { - * console.log('all items have been processed'); - * }); - * // or await the end - * await q.drain() - * - * // assign an error callback - * q.error(function(err, task) { - * console.error('task experienced an error'); - * }); - * - * // add some items to the queue - * q.push({name: 'foo'}, function(err) { - * console.log('finished processing foo'); - * }); - * // callback is optional - * q.push({name: 'bar'}); - * - * // add some items to the queue (batch-wise) - * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { - * console.log('finished processing item'); - * }); - * - * // add some items to the front of the queue - * q.unshift({name: 'bar'}, function (err) { - * console.log('finished processing bar'); - * }); - */ - function queue$1 (worker, concurrency) { - var _worker = wrapAsync(worker); - return queue((items, cb) => { - _worker(items[0], cb); - }, concurrency, 1); - } - - // Binary min-heap implementation used for priority queue. - // Implementation is stable, i.e. push time is considered for equal priorities - class Heap { - constructor() { - this.heap = []; - this.pushCount = Number.MIN_SAFE_INTEGER; - } - - get length() { - return this.heap.length; - } - - empty () { - this.heap = []; - return this; - } - - percUp(index) { - let p; - - while (index > 0 && smaller(this.heap[index], this.heap[p=parent(index)])) { - let t = this.heap[index]; - this.heap[index] = this.heap[p]; - this.heap[p] = t; - - index = p; - } - } - - percDown(index) { - let l; - - while ((l=leftChi(index)) < this.heap.length) { - if (l+1 < this.heap.length && smaller(this.heap[l+1], this.heap[l])) { - l = l+1; - } - - if (smaller(this.heap[index], this.heap[l])) { - break; - } - - let t = this.heap[index]; - this.heap[index] = this.heap[l]; - this.heap[l] = t; - - index = l; - } - } - - push(node) { - node.pushCount = ++this.pushCount; - this.heap.push(node); - this.percUp(this.heap.length-1); - } - - unshift(node) { - return this.heap.push(node); - } - - shift() { - let [top] = this.heap; - - this.heap[0] = this.heap[this.heap.length-1]; - this.heap.pop(); - this.percDown(0); - - return top; - } - - toArray() { - return [...this]; - } - - *[Symbol.iterator] () { - for (let i = 0; i < this.heap.length; i++) { - yield this.heap[i].data; - } - } - - remove (testFn) { - let j = 0; - for (let i = 0; i < this.heap.length; i++) { - if (!testFn(this.heap[i])) { - this.heap[j] = this.heap[i]; - j++; - } - } - - this.heap.splice(j); - - for (let i = parent(this.heap.length-1); i >= 0; i--) { - this.percDown(i); - } - - return this; - } - } - - function leftChi(i) { - return (i<<1)+1; - } - - function parent(i) { - return ((i+1)>>1)-1; - } - - function smaller(x, y) { - if (x.priority !== y.priority) { - return x.priority < y.priority; - } - else { - return x.pushCount < y.pushCount; - } - } - - /** - * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and - * completed in ascending priority order. - * - * @name priorityQueue - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. - * Invoked with (task, callback). - * @param {number} concurrency - An `integer` for determining how many `worker` - * functions should be run in parallel. If omitted, the concurrency defaults to - * `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three - * differences between `queue` and `priorityQueue` objects: - * * `push(task, priority, [callback])` - `priority` should be a number. If an - * array of `tasks` is given, all tasks will be assigned the same priority. - * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, - * except this returns a promise that rejects if an error occurs. - * * The `unshift` and `unshiftAsync` methods were removed. - */ - function priorityQueue(worker, concurrency) { - // Start with a normal queue - var q = queue$1(worker, concurrency); - - var { - push, - pushAsync - } = q; - - q._tasks = new Heap(); - q._createTaskItem = ({data, priority}, callback) => { - return { - data, - priority, - callback - }; - }; - - function createDataItems(tasks, priority) { - if (!Array.isArray(tasks)) { - return {data: tasks, priority}; - } - return tasks.map(data => { return {data, priority}; }); - } - - // Override push to accept second parameter representing priority - q.push = function(data, priority = 0, callback) { - return push(createDataItems(data, priority), callback); - }; - - q.pushAsync = function(data, priority = 0, callback) { - return pushAsync(createDataItems(data, priority), callback); - }; - - // Remove unshift functions - delete q.unshift; - delete q.unshiftAsync; - - return q; - } - - /** - * Runs the `tasks` array of functions in parallel, without waiting until the - * previous function has completed. Once any of the `tasks` complete or pass an - * error to its callback, the main `callback` is immediately called. It's - * equivalent to `Promise.race()`. - * - * @name race - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} - * to run. Each function can complete with an optional `result` value. - * @param {Function} callback - A callback to run once any of the functions have - * completed. This function gets an error or result from the first function that - * completed. Invoked with (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.race([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], - * // main callback - * function(err, result) { - * // the result will be equal to 'two' as it finishes earlier - * }); - */ - function race(tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); - if (!tasks.length) return callback(); - for (var i = 0, l = tasks.length; i < l; i++) { - wrapAsync(tasks[i])(callback); - } - } - - var race$1 = awaitify(race, 2); - - /** - * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. - * - * @name reduceRight - * @static - * @memberOf module:Collections - * @method - * @see [async.reduce]{@link module:Collections.reduce} - * @alias foldr - * @category Collection - * @param {Array} array - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - function reduceRight (array, memo, iteratee, callback) { - var reversed = [...array].reverse(); - return reduce$1(reversed, memo, iteratee, callback); - } - - /** - * Wraps the async function in another function that always completes with a - * result object, even when it errors. - * - * The result object has either the property `error` or `value`. - * - * @name reflect - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function you want to wrap - * @returns {Function} - A function that always passes null to it's callback as - * the error. The second argument to the callback will be an `object` with - * either an `error` or a `value` property. - * @example - * - * async.parallel([ - * async.reflect(function(callback) { - * // do some stuff ... - * callback(null, 'one'); - * }), - * async.reflect(function(callback) { - * // do some more stuff but error ... - * callback('bad stuff happened'); - * }), - * async.reflect(function(callback) { - * // do some more stuff ... - * callback(null, 'two'); - * }) - * ], - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = 'bad stuff happened' - * // results[2].value = 'two' - * }); - */ - function reflect(fn) { - var _fn = wrapAsync(fn); - return initialParams(function reflectOn(args, reflectCallback) { - args.push((error, ...cbArgs) => { - let retVal = {}; - if (error) { - retVal.error = error; - } - if (cbArgs.length > 0){ - var value = cbArgs; - if (cbArgs.length <= 1) { - [value] = cbArgs; - } - retVal.value = value; - } - reflectCallback(null, retVal); - }); - - return _fn.apply(this, args); - }); - } - - /** - * A helper function that wraps an array or an object of functions with `reflect`. - * - * @name reflectAll - * @static - * @memberOf module:Utils - * @method - * @see [async.reflect]{@link module:Utils.reflect} - * @category Util - * @param {Array|Object|Iterable} tasks - The collection of - * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. - * @returns {Array} Returns an array of async functions, each wrapped in - * `async.reflect` - * @example - * - * let tasks = [ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * // do some more stuff but error ... - * callback(new Error('bad stuff happened')); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = Error('bad stuff happened') - * // results[2].value = 'two' - * }); - * - * // an example using an object instead of an array - * let tasks = { - * one: function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * two: function(callback) { - * callback('two'); - * }, - * three: function(callback) { - * setTimeout(function() { - * callback(null, 'three'); - * }, 100); - * } - * }; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results.one.value = 'one' - * // results.two.error = 'two' - * // results.three.value = 'three' - * }); - */ - function reflectAll(tasks) { - var results; - if (Array.isArray(tasks)) { - results = tasks.map(reflect); - } else { - results = {}; - Object.keys(tasks).forEach(key => { - results[key] = reflect.call(this, tasks[key]); - }); - } - return results; - } - - function reject(eachfn, arr, _iteratee, callback) { - const iteratee = wrapAsync(_iteratee); - return _filter(eachfn, arr, (value, cb) => { - iteratee(value, (err, v) => { - cb(err, !v); - }); - }, callback); - } - - /** - * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. - * - * @name reject - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.reject(fileList, fileExists, function(err, results) { - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }); - * - * // Using Promises - * async.reject(fileList, fileExists) - * .then( results => { - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.reject(fileList, fileExists); - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function reject$1 (coll, iteratee, callback) { - return reject(eachOf$1, coll, iteratee, callback) - } - var reject$2 = awaitify(reject$1, 3); - - /** - * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a - * time. - * - * @name rejectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - function rejectLimit (coll, limit, iteratee, callback) { - return reject(eachOfLimit(limit), coll, iteratee, callback) - } - var rejectLimit$1 = awaitify(rejectLimit, 4); - - /** - * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. - * - * @name rejectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - function rejectSeries (coll, iteratee, callback) { - return reject(eachOfSeries$1, coll, iteratee, callback) - } - var rejectSeries$1 = awaitify(rejectSeries, 3); - - function constant$1(value) { - return function () { - return value; - } - } - - /** - * Attempts to get a successful response from `task` no more than `times` times - * before returning an error. If the task is successful, the `callback` will be - * passed the result of the successful task. If all attempts fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name retry - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @see [async.retryable]{@link module:ControlFlow.retryable} - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an - * object with `times` and `interval` or a number. - * * `times` - The number of attempts to make before giving up. The default - * is `5`. - * * `interval` - The time to wait between retries, in milliseconds. The - * default is `0`. The interval may also be specified as a function of the - * retry count (see example). - * * `errorFilter` - An optional synchronous function that is invoked on - * erroneous result. If it returns `true` the retry attempts will continue; - * if the function returns `false` the retry flow is aborted with the current - * attempt's error and result being returned to the final callback. - * Invoked with (err). - * * If `opts` is a number, the number specifies the number of times to retry, - * with the default interval of `0`. - * @param {AsyncFunction} task - An async function to retry. - * Invoked with (callback). - * @param {Function} [callback] - An optional callback which is called when the - * task has succeeded, or after the final failed attempt. It receives the `err` - * and `result` arguments of the last attempt at completing the `task`. Invoked - * with (err, results). - * @returns {Promise} a promise if no callback provided - * - * @example - * - * // The `retry` function can be used as a stand-alone control flow by passing - * // a callback, as shown below: - * - * // try calling apiMethod 3 times - * async.retry(3, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 3 times, waiting 200 ms between each retry - * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 10 times with exponential backoff - * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) - * async.retry({ - * times: 10, - * interval: function(retryCount) { - * return 50 * Math.pow(2, retryCount); - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod the default 5 times no delay between each retry - * async.retry(apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod only when error condition satisfies, all other - * // errors will abort the retry control flow and return to final callback - * async.retry({ - * errorFilter: function(err) { - * return err.message === 'Temporary error'; // only retry on a specific error - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // to retry individual methods that are not as reliable within other - * // control flow functions, use the `retryable` wrapper: - * async.auto({ - * users: api.getUsers.bind(api), - * payments: async.retryable(3, api.getPayments.bind(api)) - * }, function(err, results) { - * // do something with the results - * }); - * - */ - const DEFAULT_TIMES = 5; - const DEFAULT_INTERVAL = 0; - - function retry(opts, task, callback) { - var options = { - times: DEFAULT_TIMES, - intervalFunc: constant$1(DEFAULT_INTERVAL) - }; - - if (arguments.length < 3 && typeof opts === 'function') { - callback = task || promiseCallback(); - task = opts; - } else { - parseTimes(options, opts); - callback = callback || promiseCallback(); - } - - if (typeof task !== 'function') { - throw new Error("Invalid arguments for async.retry"); - } - - var _task = wrapAsync(task); - - var attempt = 1; - function retryAttempt() { - _task((err, ...args) => { - if (err === false) return - if (err && attempt++ < options.times && - (typeof options.errorFilter != 'function' || - options.errorFilter(err))) { - setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); - } else { - callback(err, ...args); - } - }); - } - - retryAttempt(); - return callback[PROMISE_SYMBOL] - } - - function parseTimes(acc, t) { - if (typeof t === 'object') { - acc.times = +t.times || DEFAULT_TIMES; - - acc.intervalFunc = typeof t.interval === 'function' ? - t.interval : - constant$1(+t.interval || DEFAULT_INTERVAL); - - acc.errorFilter = t.errorFilter; - } else if (typeof t === 'number' || typeof t === 'string') { - acc.times = +t || DEFAULT_TIMES; - } else { - throw new Error("Invalid arguments for async.retry"); - } - } - - /** - * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method - * wraps a task and makes it retryable, rather than immediately calling it - * with retries. - * - * @name retryable - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.retry]{@link module:ControlFlow.retry} - * @category Control Flow - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional - * options, exactly the same as from `retry`, except for a `opts.arity` that - * is the arity of the `task` function, defaulting to `task.length` - * @param {AsyncFunction} task - the asynchronous function to wrap. - * This function will be passed any arguments passed to the returned wrapper. - * Invoked with (...args, callback). - * @returns {AsyncFunction} The wrapped function, which when invoked, will - * retry on an error, based on the parameters specified in `opts`. - * This function will accept the same parameters as `task`. - * @example - * - * async.auto({ - * dep1: async.retryable(3, getFromFlakyService), - * process: ["dep1", async.retryable(3, function (results, cb) { - * maybeProcessData(results.dep1, cb); - * })] - * }, callback); - */ - function retryable (opts, task) { - if (!task) { - task = opts; - opts = null; - } - let arity = (opts && opts.arity) || task.length; - if (isAsync(task)) { - arity += 1; - } - var _task = wrapAsync(task); - return initialParams((args, callback) => { - if (args.length < arity - 1 || callback == null) { - args.push(callback); - callback = promiseCallback(); - } - function taskFn(cb) { - _task(...args, cb); - } - - if (opts) retry(opts, taskFn, callback); - else retry(taskFn, callback); - - return callback[PROMISE_SYMBOL] - }); - } - - /** - * Run the functions in the `tasks` collection in series, each one running once - * the previous function has completed. If any functions in the series pass an - * error to its callback, no more functions are run, and `callback` is - * immediately called with the value of the error. Otherwise, `callback` - * receives an array of results when `tasks` have completed. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function, and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.series}. - * - * **Note** that while many implementations preserve the order of object - * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) - * explicitly states that - * - * > The mechanics and order of enumerating the properties is not specified. - * - * So if you rely on the order in which your series of functions are executed, - * and want this to work on all platforms, consider using an array. - * - * @name series - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing - * [async functions]{@link AsyncFunction} to run in series. - * Each function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This function gets a results array (or object) - * containing all the result arguments passed to the `task` callbacks. Invoked - * with (err, result). - * @return {Promise} a promise, if no callback is passed - * @example - * - * //Using Callbacks - * async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] - * }); - * - * // an example using objects instead of arrays - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.series([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function series(tasks, callback) { - return parallel(eachOfSeries$1, tasks, callback); - } - - /** - * Returns `true` if at least one element in the `coll` satisfies an async test. - * If any iteratee call returns `true`, the main `callback` is immediately - * called. - * - * @name some - * @static - * @memberOf module:Collections - * @method - * @alias any - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - *); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // false - * // result is false since none of the files exists - * } - *); - * - * // Using Promises - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since some file in the list exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since none of the files exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); - * console.log(result); - * // false - * // result is false since none of the files exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function some(coll, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOf$1, coll, iteratee, callback) - } - var some$1 = awaitify(some, 3); - - /** - * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. - * - * @name someLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anyLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - function someLimit(coll, limit, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOfLimit(limit), coll, iteratee, callback) - } - var someLimit$1 = awaitify(someLimit, 4); - - /** - * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. - * - * @name someSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anySeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in series. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - function someSeries(coll, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOfSeries$1, coll, iteratee, callback) - } - var someSeries$1 = awaitify(someSeries, 3); - - /** - * Sorts a list by the results of running each `coll` value through an async - * `iteratee`. - * - * @name sortBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a value to use as the sort criteria as - * its `result`. - * Invoked with (item, callback). - * @param {Function} callback - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is the items - * from the original `coll` sorted by the values returned by the `iteratee` - * calls. Invoked with (err, results). - * @returns {Promise} a promise, if no callback passed - * @example - * - * // bigfile.txt is a file that is 251100 bytes in size - * // mediumfile.txt is a file that is 11000 bytes in size - * // smallfile.txt is a file that is 121 bytes in size - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // By modifying the callback parameter the - * // sorting order can be influenced: - * - * // ascending order - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) return callback(getFileSizeErr); - * callback(null, fileSize); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // descending order - * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) { - * return callback(getFileSizeErr); - * } - * callback(null, fileSize * -1); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] - * } - * } - * ); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * } - * ); - * - * // Using Promises - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * (async () => { - * try { - * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * // Error handling - * async () => { - * try { - * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ - function sortBy (coll, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return map$1(coll, (x, iterCb) => { - _iteratee(x, (err, criteria) => { - if (err) return iterCb(err); - iterCb(err, {value: x, criteria}); - }); - }, (err, results) => { - if (err) return callback(err); - callback(null, results.sort(comparator).map(v => v.value)); - }); - - function comparator(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - } - } - var sortBy$1 = awaitify(sortBy, 3); - - /** - * Sets a time limit on an asynchronous function. If the function does not call - * its callback within the specified milliseconds, it will be called with a - * timeout error. The code property for the error object will be `'ETIMEDOUT'`. - * - * @name timeout - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} asyncFn - The async function to limit in time. - * @param {number} milliseconds - The specified time limit. - * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) - * to timeout Error for more information.. - * @returns {AsyncFunction} Returns a wrapped function that can be used with any - * of the control flow functions. - * Invoke this function with the same parameters as you would `asyncFunc`. - * @example - * - * function myFunction(foo, callback) { - * doAsyncTask(foo, function(err, data) { - * // handle errors - * if (err) return callback(err); - * - * // do some stuff ... - * - * // return processed data - * return callback(null, data); - * }); - * } - * - * var wrapped = async.timeout(myFunction, 1000); - * - * // call `wrapped` as you would `myFunction` - * wrapped({ bar: 'bar' }, function(err, data) { - * // if `myFunction` takes < 1000 ms to execute, `err` - * // and `data` will have their expected values - * - * // else `err` will be an Error with the code 'ETIMEDOUT' - * }); - */ - function timeout(asyncFn, milliseconds, info) { - var fn = wrapAsync(asyncFn); - - return initialParams((args, callback) => { - var timedOut = false; - var timer; - - function timeoutCallback() { - var name = asyncFn.name || 'anonymous'; - var error = new Error('Callback function "' + name + '" timed out.'); - error.code = 'ETIMEDOUT'; - if (info) { - error.info = info; - } - timedOut = true; - callback(error); - } - - args.push((...cbArgs) => { - if (!timedOut) { - callback(...cbArgs); - clearTimeout(timer); - } - }); - - // setup timer and call original function - timer = setTimeout(timeoutCallback, milliseconds); - fn(...args); - }); - } - - function range(size) { - var result = Array(size); - while (size--) { - result[size] = size; - } - return result; - } - - /** - * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a - * time. - * - * @name timesLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} count - The number of times to run the function. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see [async.map]{@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ - function timesLimit(count, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(range(count), limit, _iteratee, callback); - } - - /** - * Calls the `iteratee` function `n` times, and accumulates results in the same - * manner you would use with [map]{@link module:Collections.map}. - * - * @name times - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.map]{@link module:Collections.map} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - * @example - * - * // Pretend this is some complicated async factory - * var createUser = function(id, callback) { - * callback(null, { - * id: 'user' + id - * }); - * }; - * - * // generate 5 users - * async.times(5, function(n, next) { - * createUser(n, function(err, user) { - * next(err, user); - * }); - * }, function(err, users) { - * // we should now have 5 users - * }); - */ - function times (n, iteratee, callback) { - return timesLimit(n, Infinity, iteratee, callback) - } - - /** - * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. - * - * @name timesSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ - function timesSeries (n, iteratee, callback) { - return timesLimit(n, 1, iteratee, callback) - } - - /** - * A relative of `reduce`. Takes an Object or Array, and iterates over each - * element in parallel, each step potentially mutating an `accumulator` value. - * The type of the accumulator defaults to the type of collection passed in. - * - * @name transform - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} [accumulator] - The initial state of the transform. If omitted, - * it will default to an empty Object or Array, depending on the type of `coll` - * @param {AsyncFunction} iteratee - A function applied to each item in the - * collection that potentially modifies the accumulator. - * Invoked with (accumulator, item, key, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the transformed accumulator. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileList, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * }); - * - * // Using Promises - * async.transform(fileList, transformFileSize) - * .then(result => { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * (async () => { - * try { - * let result = await async.transform(fileList, transformFileSize); - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileMap, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * }); - * - * // Using Promises - * async.transform(fileMap, transformFileSize) - * .then(result => { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.transform(fileMap, transformFileSize); - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ - function transform (coll, accumulator, iteratee, callback) { - if (arguments.length <= 3 && typeof accumulator === 'function') { - callback = iteratee; - iteratee = accumulator; - accumulator = Array.isArray(coll) ? [] : {}; - } - callback = once(callback || promiseCallback()); - var _iteratee = wrapAsync(iteratee); - - eachOf$1(coll, (v, k, cb) => { - _iteratee(accumulator, v, k, cb); - }, err => callback(err, accumulator)); - return callback[PROMISE_SYMBOL] - } - - /** - * It runs each task in series but stops whenever any of the functions were - * successful. If one of the tasks were successful, the `callback` will be - * passed the result of the successful task. If all tasks fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name tryEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to - * run, each function is passed a `callback(err, result)` it must call on - * completion with an error `err` (which can be `null`) and an optional `result` - * value. - * @param {Function} [callback] - An optional callback which is called when one - * of the tasks has succeeded, or all have failed. It receives the `err` and - * `result` arguments of the last attempt at completing the `task`. Invoked with - * (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * async.tryEach([ - * function getDataFromFirstWebsite(callback) { - * // Try getting the data from the first website - * callback(err, data); - * }, - * function getDataFromSecondWebsite(callback) { - * // First website failed, - * // Try getting the data from the backup website - * callback(err, data); - * } - * ], - * // optional callback - * function(err, results) { - * Now do something with the data. - * }); - * - */ - function tryEach(tasks, callback) { - var error = null; - var result; - return eachSeries$1(tasks, (task, taskCb) => { - wrapAsync(task)((err, ...args) => { - if (err === false) return taskCb(err); - - if (args.length < 2) { - [result] = args; - } else { - result = args; - } - error = err; - taskCb(err ? null : {}); - }); - }, () => callback(error, result)); - } - - var tryEach$1 = awaitify(tryEach); - - /** - * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, - * unmemoized form. Handy for testing. - * - * @name unmemoize - * @static - * @memberOf module:Utils - * @method - * @see [async.memoize]{@link module:Utils.memoize} - * @category Util - * @param {AsyncFunction} fn - the memoized function - * @returns {AsyncFunction} a function that calls the original unmemoized function - */ - function unmemoize(fn) { - return (...args) => { - return (fn.unmemoized || fn)(...args); - }; - } - - /** - * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. - * - * @name whilst - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` passes. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - * @example - * - * var count = 0; - * async.whilst( - * function test(cb) { cb(null, count < 5); }, - * function iter(callback) { - * count++; - * setTimeout(function() { - * callback(null, count); - * }, 1000); - * }, - * function (err, n) { - * // 5 seconds have passed, n = 5 - * } - * ); - */ - function whilst(test, iteratee, callback) { - callback = onlyOnce(callback); - var _fn = wrapAsync(iteratee); - var _test = wrapAsync(test); - var results = []; - - function next(err, ...rest) { - if (err) return callback(err); - results = rest; - if (err === false) return; - _test(check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return _test(check); - } - var whilst$1 = awaitify(whilst, 3); - - /** - * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. `callback` will be passed an error and any - * arguments passed to the final `iteratee`'s callback. - * - * The inverse of [whilst]{@link module:ControlFlow.whilst}. - * - * @name until - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (callback). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * const results = [] - * let finished = false - * async.until(function test(cb) { - * cb(null, finished) - * }, function iter(next) { - * fetchPage(url, (err, body) => { - * if (err) return next(err) - * results = results.concat(body.objects) - * finished = !!body.next - * next(err) - * }) - * }, function done (err) { - * // all pages have been fetched - * }) - */ - function until(test, iteratee, callback) { - const _test = wrapAsync(test); - return whilst$1((cb) => _test((err, truth) => cb (err, !truth)), iteratee, callback); - } - - /** - * Runs the `tasks` array of functions in series, each passing their results to - * the next in the array. However, if any of the `tasks` pass an error to their - * own callback, the next function is not executed, and the main `callback` is - * immediately called with the error. - * - * @name waterfall - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} - * to run. - * Each function should complete with any number of `result` values. - * The `result` values will be passed as arguments, in order, to the next task. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This will be passed the results of the last task's - * callback. Invoked with (err, [results]). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.waterfall([ - * function(callback) { - * callback(null, 'one', 'two'); - * }, - * function(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * }, - * function(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - * ], function (err, result) { - * // result now equals 'done' - * }); - * - * // Or, with named functions: - * async.waterfall([ - * myFirstFunction, - * mySecondFunction, - * myLastFunction, - * ], function (err, result) { - * // result now equals 'done' - * }); - * function myFirstFunction(callback) { - * callback(null, 'one', 'two'); - * } - * function mySecondFunction(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * } - * function myLastFunction(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - */ - function waterfall (tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); - if (!tasks.length) return callback(); - var taskIndex = 0; - - function nextTask(args) { - var task = wrapAsync(tasks[taskIndex++]); - task(...args, onlyOnce(next)); - } - - function next(err, ...args) { - if (err === false) return - if (err || taskIndex === tasks.length) { - return callback(err, ...args); - } - nextTask(args); - } - - nextTask([]); - } - - var waterfall$1 = awaitify(waterfall); - - /** - * An "async function" in the context of Async is an asynchronous function with - * a variable number of parameters, with the final parameter being a callback. - * (`function (arg1, arg2, ..., callback) {}`) - * The final callback is of the form `callback(err, results...)`, which must be - * called once the function is completed. The callback should be called with a - * Error as its first argument to signal that an error occurred. - * Otherwise, if no error occurred, it should be called with `null` as the first - * argument, and any additional `result` arguments that may apply, to signal - * successful completion. - * The callback must be called exactly once, ideally on a later tick of the - * JavaScript event loop. - * - * This type of function is also referred to as a "Node-style async function", - * or a "continuation passing-style function" (CPS). Most of the methods of this - * library are themselves CPS/Node-style async functions, or functions that - * return CPS/Node-style async functions. - * - * Wherever we accept a Node-style async function, we also directly accept an - * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. - * In this case, the `async` function will not be passed a final callback - * argument, and any thrown error will be used as the `err` argument of the - * implicit callback, and the return value will be used as the `result` value. - * (i.e. a `rejected` of the returned Promise becomes the `err` callback - * argument, and a `resolved` value becomes the `result`.) - * - * Note, due to JavaScript limitations, we can only detect native `async` - * functions and not transpilied implementations. - * Your environment must have `async`/`await` support for this to work. - * (e.g. Node > v7.6, or a recent version of a modern browser). - * If you are using `async` functions through a transpiler (e.g. Babel), you - * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, - * because the `async function` will be compiled to an ordinary function that - * returns a promise. - * - * @typedef {Function} AsyncFunction - * @static - */ - - var index = { - apply, - applyEach: applyEach$1, - applyEachSeries, - asyncify, - auto, - autoInject, - cargo, - cargoQueue: cargo$1, - compose, - concat: concat$1, - concatLimit: concatLimit$1, - concatSeries: concatSeries$1, - constant, - detect: detect$1, - detectLimit: detectLimit$1, - detectSeries: detectSeries$1, - dir, - doUntil, - doWhilst: doWhilst$1, - each, - eachLimit: eachLimit$2, - eachOf: eachOf$1, - eachOfLimit: eachOfLimit$2, - eachOfSeries: eachOfSeries$1, - eachSeries: eachSeries$1, - ensureAsync, - every: every$1, - everyLimit: everyLimit$1, - everySeries: everySeries$1, - filter: filter$1, - filterLimit: filterLimit$1, - filterSeries: filterSeries$1, - forever: forever$1, - groupBy, - groupByLimit: groupByLimit$1, - groupBySeries, - log, - map: map$1, - mapLimit: mapLimit$1, - mapSeries: mapSeries$1, - mapValues, - mapValuesLimit: mapValuesLimit$1, - mapValuesSeries, - memoize, - nextTick, - parallel: parallel$1, - parallelLimit, - priorityQueue, - queue: queue$1, - race: race$1, - reduce: reduce$1, - reduceRight, - reflect, - reflectAll, - reject: reject$2, - rejectLimit: rejectLimit$1, - rejectSeries: rejectSeries$1, - retry, - retryable, - seq, - series, - setImmediate: setImmediate$1, - some: some$1, - someLimit: someLimit$1, - someSeries: someSeries$1, - sortBy: sortBy$1, - timeout, - times, - timesLimit, - timesSeries, - transform, - tryEach: tryEach$1, - unmemoize, - until, - waterfall: waterfall$1, - whilst: whilst$1, - - // aliases - all: every$1, - allLimit: everyLimit$1, - allSeries: everySeries$1, - any: some$1, - anyLimit: someLimit$1, - anySeries: someSeries$1, - find: detect$1, - findLimit: detectLimit$1, - findSeries: detectSeries$1, - flatMap: concat$1, - flatMapLimit: concatLimit$1, - flatMapSeries: concatSeries$1, - forEach: each, - forEachSeries: eachSeries$1, - forEachLimit: eachLimit$2, - forEachOf: eachOf$1, - forEachOfSeries: eachOfSeries$1, - forEachOfLimit: eachOfLimit$2, - inject: reduce$1, - foldl: reduce$1, - foldr: reduceRight, - select: filter$1, - selectLimit: filterLimit$1, - selectSeries: filterSeries$1, - wrapSync: asyncify, - during: whilst$1, - doDuring: doWhilst$1 - }; - - exports.default = index; - exports.apply = apply; - exports.applyEach = applyEach$1; - exports.applyEachSeries = applyEachSeries; - exports.asyncify = asyncify; - exports.auto = auto; - exports.autoInject = autoInject; - exports.cargo = cargo; - exports.cargoQueue = cargo$1; - exports.compose = compose; - exports.concat = concat$1; - exports.concatLimit = concatLimit$1; - exports.concatSeries = concatSeries$1; - exports.constant = constant; - exports.detect = detect$1; - exports.detectLimit = detectLimit$1; - exports.detectSeries = detectSeries$1; - exports.dir = dir; - exports.doUntil = doUntil; - exports.doWhilst = doWhilst$1; - exports.each = each; - exports.eachLimit = eachLimit$2; - exports.eachOf = eachOf$1; - exports.eachOfLimit = eachOfLimit$2; - exports.eachOfSeries = eachOfSeries$1; - exports.eachSeries = eachSeries$1; - exports.ensureAsync = ensureAsync; - exports.every = every$1; - exports.everyLimit = everyLimit$1; - exports.everySeries = everySeries$1; - exports.filter = filter$1; - exports.filterLimit = filterLimit$1; - exports.filterSeries = filterSeries$1; - exports.forever = forever$1; - exports.groupBy = groupBy; - exports.groupByLimit = groupByLimit$1; - exports.groupBySeries = groupBySeries; - exports.log = log; - exports.map = map$1; - exports.mapLimit = mapLimit$1; - exports.mapSeries = mapSeries$1; - exports.mapValues = mapValues; - exports.mapValuesLimit = mapValuesLimit$1; - exports.mapValuesSeries = mapValuesSeries; - exports.memoize = memoize; - exports.nextTick = nextTick; - exports.parallel = parallel$1; - exports.parallelLimit = parallelLimit; - exports.priorityQueue = priorityQueue; - exports.queue = queue$1; - exports.race = race$1; - exports.reduce = reduce$1; - exports.reduceRight = reduceRight; - exports.reflect = reflect; - exports.reflectAll = reflectAll; - exports.reject = reject$2; - exports.rejectLimit = rejectLimit$1; - exports.rejectSeries = rejectSeries$1; - exports.retry = retry; - exports.retryable = retryable; - exports.seq = seq; - exports.series = series; - exports.setImmediate = setImmediate$1; - exports.some = some$1; - exports.someLimit = someLimit$1; - exports.someSeries = someSeries$1; - exports.sortBy = sortBy$1; - exports.timeout = timeout; - exports.times = times; - exports.timesLimit = timesLimit; - exports.timesSeries = timesSeries; - exports.transform = transform; - exports.tryEach = tryEach$1; - exports.unmemoize = unmemoize; - exports.until = until; - exports.waterfall = waterfall$1; - exports.whilst = whilst$1; - exports.all = every$1; - exports.allLimit = everyLimit$1; - exports.allSeries = everySeries$1; - exports.any = some$1; - exports.anyLimit = someLimit$1; - exports.anySeries = someSeries$1; - exports.find = detect$1; - exports.findLimit = detectLimit$1; - exports.findSeries = detectSeries$1; - exports.flatMap = concat$1; - exports.flatMapLimit = concatLimit$1; - exports.flatMapSeries = concatSeries$1; - exports.forEach = each; - exports.forEachSeries = eachSeries$1; - exports.forEachLimit = eachLimit$2; - exports.forEachOf = eachOf$1; - exports.forEachOfSeries = eachOfSeries$1; - exports.forEachOfLimit = eachOfLimit$2; - exports.inject = reduce$1; - exports.foldl = reduce$1; - exports.foldr = reduceRight; - exports.select = filter$1; - exports.selectLimit = filterLimit$1; - exports.selectSeries = filterSeries$1; - exports.wrapSync = asyncify; - exports.during = whilst$1; - exports.doDuring = doWhilst$1; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); diff --git a/node_modules/async/dist/async.min.js b/node_modules/async/dist/async.min.js deleted file mode 100644 index a12963b6..00000000 --- a/node_modules/async/dist/async.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.async={})})(this,function(e){'use strict';function t(e,...t){return(...n)=>e(...t,...n)}function n(e){return function(...t){var n=t.pop();return e.call(this,t,n)}}function a(e){setTimeout(e,0)}function i(e){return(t,...n)=>e(()=>t(...n))}function r(e){return u(e)?function(...t){const n=t.pop(),a=e.apply(this,t);return s(a,n)}:n(function(t,n){var a;try{a=e.apply(this,t)}catch(t){return n(t)}return a&&"function"==typeof a.then?s(a,n):void n(null,a)})}function s(e,t){return e.then(e=>{l(t,null,e)},e=>{l(t,e&&e.message?e:new Error(e))})}function l(e,t,n){try{e(t,n)}catch(e){_e(t=>{throw t},e)}}function u(e){return"AsyncFunction"===e[Symbol.toStringTag]}function d(e){return"AsyncGenerator"===e[Symbol.toStringTag]}function p(e){return"function"==typeof e[Symbol.asyncIterator]}function c(e){if("function"!=typeof e)throw new Error("expected a function");return u(e)?r(e):e}function o(e,t=e.length){if(!t)throw new Error("arity is undefined");return function(...n){return"function"==typeof n[t-1]?e.apply(this,n):new Promise((a,i)=>{n[t-1]=(e,...t)=>e?i(e):void a(1{c(e).apply(i,n.concat(t))},a)});return a}}function f(e,t,n,a){t=t||[];var i=[],r=0,s=c(n);return e(t,(e,t,n)=>{var a=r++;s(e,(e,t)=>{i[a]=t,n(e)})},e=>{a(e,i)})}function y(e){return e&&"number"==typeof e.length&&0<=e.length&&0==e.length%1}function m(e){function t(...t){if(null!==e){var n=e;e=null,n.apply(this,t)}}return Object.assign(t,e),t}function g(e){return e[Symbol.iterator]&&e[Symbol.iterator]()}function k(e){var t=-1,n=e.length;return function(){return++t=t||d||l||(d=!0,e.next().then(({value:e,done:t})=>{if(!(u||l))return d=!1,t?(l=!0,void(0>=p&&a(null))):void(p++,n(e,c,r),c++,i())}).catch(s))}function r(e,t){return p-=1,u?void 0:e?s(e):!1===e?(l=!0,void(u=!0)):t===be||l&&0>=p?(l=!0,a(null)):void i()}function s(e){u||(d=!1,l=!0,a(e))}let l=!1,u=!1,d=!1,p=0,c=0;i()}function O(e,t,n){function a(e,t){!1===e&&(l=!0);!0===l||(e?n(e):(++r===s||t===be)&&n(null))}n=m(n);var i=0,r=0,{length:s}=e,l=!1;for(0===s&&n(null);i{t=e,n=a}),e}function A(e,t,n){function a(e,t){g.push(()=>l(e,t))}function i(){if(!h){if(0===g.length&&0===o)return n(null,p);for(;g.length&&oe()),i()}function l(e,t){if(!f){var a=L((t,...a)=>{if(o--,!1===t)return void(h=!0);if(2>a.length&&([a]=a),t){var i={};if(Object.keys(p).forEach(e=>{i[e]=p[e]}),i[e]=a,f=!0,y=Object.create(null),h)return;n(t,i)}else p[e]=a,s(e)});o++;var i=c(t[t.length-1]);1{const i=e[a];Array.isArray(i)&&0<=i.indexOf(t)&&n.push(a)}),n}"number"!=typeof t&&(n=t,t=null),n=m(n||b());var d=Object.keys(e).length;if(!d)return n(null);t||(t=d);var p={},o=0,h=!1,f=!1,y=Object.create(null),g=[],k=[],v={};return Object.keys(e).forEach(t=>{var n=e[t];if(!Array.isArray(n))return a(t,[n]),void k.push(t);var i=n.slice(0,n.length-1),s=i.length;return 0===s?(a(t,n),void k.push(t)):void(v[t]=s,i.forEach(l=>{if(!e[l])throw new Error("async.auto task `"+t+"` has a non-existent dependency `"+l+"` in "+i.join(", "));r(l,()=>{s--,0===s&&a(t,n)})}))}),function(){for(var e,t=0;k.length;)e=k.pop(),t++,u(e).forEach(e=>{0==--v[e]&&k.push(e)});if(t!==d)throw new Error("async.auto cannot execute tasks due to a recursive dependency")}(),i(),n[Ce]}function I(e){let t="",n=0,a=e.indexOf("*/");for(;ne.replace(Ne,"").trim())}function j(e,t){var n={};return Object.keys(e).forEach(t=>{function a(e,t){var n=i.map(t=>e[t]);n.push(t),c(r)(...n)}var i,r=e[t],s=u(r),l=!s&&1===r.length||s&&0===r.length;if(Array.isArray(r))i=[...r],r=i.pop(),n[t]=i.concat(0{r(e,n),t(...a)};f[e].push(n)}function r(e,t){return e?t?void(f[e]=f[e].filter(e=>e!==t)):f[e]=[]:Object.keys(f).forEach(e=>f[e]=[])}function s(e,...t){f[e].forEach(e=>e(...t))}function l(e,t,n,a){function i(e,...t){return e?n?s(e):r():1>=t.length?r(t[0]):void r(t)}if(null!=a&&"function"!=typeof a)throw new Error("task callback must be a function");k.started=!0;var r,s,l=k._createTaskItem(e,n?i:a||i);if(t?k._tasks.unshift(l):k._tasks.push(l),y||(y=!0,_e(()=>{y=!1,k.process()})),n||!a)return new Promise((e,t)=>{r=e,s=t})}function u(e){return function(t,...n){o-=1;for(var a=0,r=e.length;as("drain")),!0)}if(null==t)t=1;else if(0===t)throw new RangeError("Concurrency must not be zero");var p=c(e),o=0,h=[];const f={error:[],drain:[],saturated:[],unsaturated:[],empty:[]};var y=!1;const m=e=>t=>t?void(r(e),a(e,t)):new Promise((t,n)=>{i(e,(e,a)=>e?n(e):void t(a))});var g=!1,k={_tasks:new Ve,_createTaskItem(e,t){return{data:e,callback:t}},*[Symbol.iterator](){yield*k._tasks[Symbol.iterator]()},concurrency:t,payload:n,buffer:t/4,started:!1,paused:!1,push(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!1,!1,t)):l(e,!1,!1,t)},pushAsync(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!1,!0,t)):l(e,!1,!0,t)},kill(){r(),k._tasks.empty()},unshift(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!0,!1,t)):l(e,!0,!1,t)},unshiftAsync(e,t){return Array.isArray(e)?d(e)?void 0:e.map(e=>l(e,!0,!0,t)):l(e,!0,!0,t)},remove(e){k._tasks.remove(e)},process(){var e=Math.min;if(!g){for(g=!0;!k.paused&&o{t.apply(n,e.concat((e,...t)=>{a(e,t)}))},(e,t)=>a(e,...t)),a[Ce]}}function P(...e){return C(...e.reverse())}function R(...e){return function(...t){var n=t.pop();return n(null,...e)}}function z(e,t){return(n,a,i,r)=>{var s,l=!1;const u=c(i);n(a,(n,a,i)=>{u(n,(a,r)=>a||!1===a?i(a):e(r)&&!s?(l=!0,s=t(!0,n),i(null,be)):void i())},e=>e?r(e):void r(null,l?s:t(!1)))}}function N(e){return(t,...n)=>c(t)(...n,(t,...n)=>{"object"==typeof console&&(t?console.error&&console.error(t):console[e]&&n.forEach(t=>console[e](t)))})}function V(e,t,n){const a=c(t);return Xe(e,(...e)=>{const t=e.pop();a(...e,(e,n)=>t(e,!n))},n)}function Y(e){return(t,n,a)=>e(t,a)}function q(e){return u(e)?e:function(...t){var n=t.pop(),a=!0;t.push((...e)=>{a?_e(()=>n(...e)):n(...e)}),e.apply(this,t),a=!1}}function D(e,t,n,a){var r=Array(t.length);e(t,(e,t,a)=>{n(e,(e,n)=>{r[t]=!!n,a(e)})},e=>{if(e)return a(e);for(var n=[],s=0;s{n(e,(n,r)=>n?a(n):void(r&&i.push({index:t,value:e}),a(n)))},e=>e?a(e):void a(null,i.sort((e,t)=>e.index-t.index).map(e=>e.value)))}function U(e,t,n,a){var i=y(t)?D:Q;return i(e,t,c(n),a)}function G(e,t,n){return ut(e,1/0,t,n)}function W(e,t,n){return ut(e,1,t,n)}function H(e,t,n){return pt(e,1/0,t,n)}function J(e,t,n){return pt(e,1,t,n)}function K(e,t=e=>e){var a=Object.create(null),r=Object.create(null),s=c(e),l=n((e,n)=>{var u=t(...e);u in a?_e(()=>n(null,...a[u])):u in r?r[u].push(n):(r[u]=[n],s(...e,(e,...t)=>{e||(a[u]=t);var n=r[u];delete r[u];for(var s=0,d=n.length;s{n(e[0],t)},t,1)}function ee(e){return(e<<1)+1}function te(e){return(e+1>>1)-1}function ne(e,t){return e.priority===t.priority?e.pushCount({data:e,priority:t})):{data:e,priority:t}}var a=$(e,t),{push:i,pushAsync:r}=a;return a._tasks=new ht,a._createTaskItem=({data:e,priority:t},n)=>({data:e,priority:t,callback:n}),a.push=function(e,t=0,a){return i(n(e,t),a)},a.pushAsync=function(e,t=0,a){return r(n(e,t),a)},delete a.unshift,delete a.unshiftAsync,a}function ie(e,t,n,a){var i=[...e].reverse();return qe(i,t,n,a)}function re(e){var t=c(e);return n(function(e,n){return e.push((e,...t)=>{let a={};if(e&&(a.error=e),0=t.length&&([i]=t),a.value=i}n(null,a)}),t.apply(this,e)})}function se(e){var t;return Array.isArray(e)?t=e.map(re):(t={},Object.keys(e).forEach(n=>{t[n]=re.call(this,e[n])})),t}function le(e,t,n,a){const i=c(n);return U(e,t,(e,t)=>{i(e,(e,n)=>{t(e,!n)})},a)}function ue(e){return function(){return e}}function de(e,t,n){function a(){r((e,...t)=>{!1===e||(e&&s++arguments.length&&"function"==typeof e?(n=t||b(),t=e):(pe(i,e),n=n||b()),"function"!=typeof t)throw new Error("Invalid arguments for async.retry");var r=c(t),s=1;return a(),n[Ce]}function pe(e,n){if("object"==typeof n)e.times=+n.times||kt,e.intervalFunc="function"==typeof n.interval?n.interval:ue(+n.interval||vt),e.errorFilter=n.errorFilter;else if("number"==typeof n||"string"==typeof n)e.times=+n||kt;else throw new Error("Invalid arguments for async.retry")}function ce(e,t){t||(t=e,e=null);let a=e&&e.arity||t.length;u(t)&&(a+=1);var i=c(t);return n((t,n)=>{function r(e){i(...t,e)}return(t.length{var s,l=!1;n.push((...e)=>{l||(r(...e),clearTimeout(s))}),s=setTimeout(function(){var t=e.name||"anonymous",n=new Error("Callback function \""+t+"\" timed out.");n.code="ETIMEDOUT",a&&(n.info=a),l=!0,r(n)},t),i(...n)})}function fe(e){for(var t=Array(e);e--;)t[e]=e;return t}function ye(e,t,n,a){var i=c(n);return De(fe(e),t,i,a)}function me(e,t,n){return ye(e,1/0,t,n)}function ge(e,t,n){return ye(e,1,t,n)}function ke(e,t,n,a){3>=arguments.length&&"function"==typeof t&&(a=n,n=t,t=Array.isArray(e)?[]:{}),a=m(a||b());var i=c(n);return Me(e,(e,n,a)=>{i(t,e,n,a)},e=>a(e,t)),a[Ce]}function ve(e){return(...t)=>(e.unmemoized||e)(...t)}function Se(e,t,n){const a=c(e);return _t(e=>a((t,n)=>e(t,!n)),t,n)}var xe,Le="function"==typeof queueMicrotask&&queueMicrotask,Ee="function"==typeof setImmediate&&setImmediate,Oe="object"==typeof process&&"function"==typeof process.nextTick;xe=Le?queueMicrotask:Ee?setImmediate:Oe?process.nextTick:a;var _e=i(xe);const be={};var Ae=e=>(t,n,a)=>{function i(e,t){if(!u)if(c-=1,e)l=!0,a(e);else if(!1===e)l=!0,u=!0;else{if(t===be||l&&0>=c)return l=!0,a(null);o||r()}}function r(){for(o=!0;c=c&&a(null));c+=1,n(t.value,t.key,L(i))}o=!1}if(a=m(a),0>=e)throw new RangeError("concurrency limit cannot be less than 1");if(!t)return a(null);if(d(t))return E(t,e,n,a);if(p(t))return E(t[Symbol.asyncIterator](),e,n,a);var s=x(t),l=!1,u=!1,c=0,o=!1;r()},Ie=o(function(e,t,n,a){return Ae(t)(e,c(n),a)},4),Me=o(function(e,t,n){var a=y(e)?O:_;return a(e,c(t),n)},3),je=o(function(e,t,n){return f(Me,e,t,n)},3),we=h(je),Be=o(function(e,t,n){return Ie(e,1,t,n)},3),Te=o(function(e,t,n){return f(Be,e,t,n)},3),Fe=h(Te);const Ce=Symbol("promiseCallback");var Pe=/^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/,Re=/^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/,ze=/,/,Ne=/(=.+)?(\s*)$/;class Ve{constructor(){this.head=this.tail=null,this.length=0}removeLink(e){return e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=e.next=null,this.length-=1,e}empty(){for(;this.head;)this.shift();return this}insertAfter(e,t){t.prev=e,t.next=e.next,e.next?e.next.prev=t:this.tail=t,e.next=t,this.length+=1}insertBefore(e,t){t.prev=e.prev,t.next=e,e.prev?e.prev.next=t:this.head=t,e.prev=t,this.length+=1}unshift(e){this.head?this.insertBefore(this.head,e):w(this,e)}push(e){this.tail?this.insertAfter(this.tail,e):w(this,e)}shift(){return this.head&&this.removeLink(this.head)}pop(){return this.tail&&this.removeLink(this.tail)}toArray(){return[...this]}*[Symbol.iterator](){for(var e=this.head;e;)yield e.data,e=e.next}remove(e){for(var t=this.head;t;){var{next:n}=t;e(t)&&this.removeLink(t),t=n}return this}}var Ye,qe=o(function(e,t,n,a){a=m(a);var r=c(n);return Be(e,(e,n,a)=>{r(t,e,(e,n)=>{t=n,a(e)})},e=>a(e,t))},4),De=o(function(e,t,n,a){return f(Ae(t),e,n,a)},4),Qe=o(function(e,t,n,a){var i=c(n);return De(e,t,(e,t)=>{i(e,(e,...n)=>e?t(e):t(e,n))},(e,t)=>{for(var n=[],r=0;re,(e,t)=>t)(Me,e,t,n)},3),He=o(function(e,t,n,a){return z(e=>e,(e,t)=>t)(Ae(t),e,n,a)},4),Je=o(function(e,t,n){return z(e=>e,(e,t)=>t)(Ae(1),e,t,n)},3),Ke=N("dir"),Xe=o(function(e,t,n){function a(e,...t){return e?n(e):void(!1===e||(r=t,l(...t,i)))}function i(e,t){return e?n(e):!1===e?void 0:t?void s(a):n(null,...r)}n=L(n);var r,s=c(e),l=c(t);return i(null,!0)},3),Ze=o(function(e,t,n){return Me(e,Y(c(t)),n)},3),$e=o(function(e,t,n,a){return Ae(t)(e,Y(c(n)),a)},4),et=o(function(e,t,n){return $e(e,1,t,n)},3),tt=o(function(e,t,n){return z(e=>!e,e=>!e)(Me,e,t,n)},3),nt=o(function(e,t,n,a){return z(e=>!e,e=>!e)(Ae(t),e,n,a)},4),at=o(function(e,t,n){return z(e=>!e,e=>!e)(Be,e,t,n)},3),it=o(function(e,t,n){return U(Me,e,t,n)},3),rt=o(function(e,t,n,a){return U(Ae(t),e,n,a)},4),st=o(function(e,t,n){return U(Be,e,t,n)},3),lt=o(function(e,t){function n(e){return e?a(e):void(!1===e||i(n))}var a=L(t),i=c(q(e));return n()},2),ut=o(function(e,t,n,a){var i=c(n);return De(e,t,(e,t)=>{i(e,(n,a)=>n?t(n):t(n,{key:a,val:e}))},(e,t)=>{for(var n={},{hasOwnProperty:r}=Object.prototype,s=0;s{r(e,t,(e,a)=>e?n(e):void(i[t]=a,n(e)))},e=>a(e,i))},4);Ye=Oe?process.nextTick:Ee?setImmediate:a;var ct=i(Ye),ot=o((e,t,n)=>{var a=y(t)?[]:{};e(t,(e,t,n)=>{c(e)((e,...i)=>{2>i.length&&([i]=i),a[t]=i,n(e)})},e=>n(e,a))},3);class ht{constructor(){this.heap=[],this.pushCount=Number.MIN_SAFE_INTEGER}get length(){return this.heap.length}empty(){return this.heap=[],this}percUp(e){for(let n;0e)(Me,e,t,n)},3),xt=o(function(e,t,n,a){return z(Boolean,e=>e)(Ae(t),e,n,a)},4),Lt=o(function(e,t,n){return z(Boolean,e=>e)(Be,e,t,n)},3),Et=o(function(e,t,n){function a(e,t){var n=e.criteria,a=t.criteria;return na?1:0}var i=c(t);return je(e,(e,t)=>{i(e,(n,a)=>n?t(n):void t(n,{value:e,criteria:a}))},(e,t)=>e?n(e):void n(null,t.sort(a).map(e=>e.value)))},3),Ot=o(function(e,t){var n,a=null;return et(e,(e,t)=>{c(e)((e,...i)=>!1===e?t(e):void(2>i.length?[n]=i:n=i,a=e,t(e?null:{})))},()=>t(a,n))}),_t=o(function(e,t,n){function a(e,...t){if(e)return n(e);l=t;!1===e||s(i)}function i(e,t){return e?n(e):!1===e?void 0:t?void r(a):n(null,...l)}n=L(n);var r=c(t),s=c(e),l=[];return s(i)},3),bt=o(function(e,t){function n(t){var n=c(e[i++]);n(...t,L(a))}function a(a,...r){return!1===a?void 0:a||i===e.length?t(a,...r):void n(r)}if(t=m(t),!Array.isArray(e))return t(new Error("First argument to waterfall must be an array of functions"));if(!e.length)return t();var i=0;n([])});e.default={apply:t,applyEach:we,applyEachSeries:Fe,asyncify:r,auto:A,autoInject:j,cargo:T,cargoQueue:F,compose:P,concat:Ue,concatLimit:Qe,concatSeries:Ge,constant:R,detect:We,detectLimit:He,detectSeries:Je,dir:Ke,doUntil:V,doWhilst:Xe,each:Ze,eachLimit:$e,eachOf:Me,eachOfLimit:Ie,eachOfSeries:Be,eachSeries:et,ensureAsync:q,every:tt,everyLimit:nt,everySeries:at,filter:it,filterLimit:rt,filterSeries:st,forever:lt,groupBy:G,groupByLimit:ut,groupBySeries:W,log:dt,map:je,mapLimit:De,mapSeries:Te,mapValues:H,mapValuesLimit:pt,mapValuesSeries:J,memoize:K,nextTick:ct,parallel:X,parallelLimit:Z,priorityQueue:ae,queue:$,race:ft,reduce:qe,reduceRight:ie,reflect:re,reflectAll:se,reject:yt,rejectLimit:mt,rejectSeries:gt,retry:de,retryable:ce,seq:C,series:oe,setImmediate:_e,some:St,someLimit:xt,someSeries:Lt,sortBy:Et,timeout:he,times:me,timesLimit:ye,timesSeries:ge,transform:ke,tryEach:Ot,unmemoize:ve,until:Se,waterfall:bt,whilst:_t,all:tt,allLimit:nt,allSeries:at,any:St,anyLimit:xt,anySeries:Lt,find:We,findLimit:He,findSeries:Je,flatMap:Ue,flatMapLimit:Qe,flatMapSeries:Ge,forEach:Ze,forEachSeries:et,forEachLimit:$e,forEachOf:Me,forEachOfSeries:Be,forEachOfLimit:Ie,inject:qe,foldl:qe,foldr:ie,select:it,selectLimit:rt,selectSeries:st,wrapSync:r,during:_t,doDuring:Xe},e.apply=t,e.applyEach=we,e.applyEachSeries=Fe,e.asyncify=r,e.auto=A,e.autoInject=j,e.cargo=T,e.cargoQueue=F,e.compose=P,e.concat=Ue,e.concatLimit=Qe,e.concatSeries=Ge,e.constant=R,e.detect=We,e.detectLimit=He,e.detectSeries=Je,e.dir=Ke,e.doUntil=V,e.doWhilst=Xe,e.each=Ze,e.eachLimit=$e,e.eachOf=Me,e.eachOfLimit=Ie,e.eachOfSeries=Be,e.eachSeries=et,e.ensureAsync=q,e.every=tt,e.everyLimit=nt,e.everySeries=at,e.filter=it,e.filterLimit=rt,e.filterSeries=st,e.forever=lt,e.groupBy=G,e.groupByLimit=ut,e.groupBySeries=W,e.log=dt,e.map=je,e.mapLimit=De,e.mapSeries=Te,e.mapValues=H,e.mapValuesLimit=pt,e.mapValuesSeries=J,e.memoize=K,e.nextTick=ct,e.parallel=X,e.parallelLimit=Z,e.priorityQueue=ae,e.queue=$,e.race=ft,e.reduce=qe,e.reduceRight=ie,e.reflect=re,e.reflectAll=se,e.reject=yt,e.rejectLimit=mt,e.rejectSeries=gt,e.retry=de,e.retryable=ce,e.seq=C,e.series=oe,e.setImmediate=_e,e.some=St,e.someLimit=xt,e.someSeries=Lt,e.sortBy=Et,e.timeout=he,e.times=me,e.timesLimit=ye,e.timesSeries=ge,e.transform=ke,e.tryEach=Ot,e.unmemoize=ve,e.until=Se,e.waterfall=bt,e.whilst=_t,e.all=tt,e.allLimit=nt,e.allSeries=at,e.any=St,e.anyLimit=xt,e.anySeries=Lt,e.find=We,e.findLimit=He,e.findSeries=Je,e.flatMap=Ue,e.flatMapLimit=Qe,e.flatMapSeries=Ge,e.forEach=Ze,e.forEachSeries=et,e.forEachLimit=$e,e.forEachOf=Me,e.forEachOfSeries=Be,e.forEachOfLimit=Ie,e.inject=qe,e.foldl=qe,e.foldr=ie,e.select=it,e.selectLimit=rt,e.selectSeries=st,e.wrapSync=r,e.during=_t,e.doDuring=Xe,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/node_modules/async/dist/async.mjs b/node_modules/async/dist/async.mjs deleted file mode 100644 index d0cd59d9..00000000 --- a/node_modules/async/dist/async.mjs +++ /dev/null @@ -1,5947 +0,0 @@ -/** - * Creates a continuation function with some arguments already applied. - * - * Useful as a shorthand when combined with other control flow functions. Any - * arguments passed to the returned function are added to the arguments - * originally passed to apply. - * - * @name apply - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {Function} fn - The function you want to eventually apply all - * arguments to. Invokes with (arguments...). - * @param {...*} arguments... - Any number of arguments to automatically apply - * when the continuation is called. - * @returns {Function} the partially-applied function - * @example - * - * // using apply - * async.parallel([ - * async.apply(fs.writeFile, 'testfile1', 'test1'), - * async.apply(fs.writeFile, 'testfile2', 'test2') - * ]); - * - * - * // the same process without using apply - * async.parallel([ - * function(callback) { - * fs.writeFile('testfile1', 'test1', callback); - * }, - * function(callback) { - * fs.writeFile('testfile2', 'test2', callback); - * } - * ]); - * - * // It's possible to pass any number of additional arguments when calling the - * // continuation: - * - * node> var fn = async.apply(sys.puts, 'one'); - * node> fn('two', 'three'); - * one - * two - * three - */ -function apply(fn, ...args) { - return (...callArgs) => fn(...args,...callArgs); -} - -function initialParams (fn) { - return function (...args/*, callback*/) { - var callback = args.pop(); - return fn.call(this, args, callback); - }; -} - -/* istanbul ignore file */ - -var hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; -var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; -var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; - -function fallback(fn) { - setTimeout(fn, 0); -} - -function wrap(defer) { - return (fn, ...args) => defer(() => fn(...args)); -} - -var _defer; - -if (hasQueueMicrotask) { - _defer = queueMicrotask; -} else if (hasSetImmediate) { - _defer = setImmediate; -} else if (hasNextTick) { - _defer = process.nextTick; -} else { - _defer = fallback; -} - -var setImmediate$1 = wrap(_defer); - -/** - * Take a sync function and make it async, passing its return value to a - * callback. This is useful for plugging sync functions into a waterfall, - * series, or other async functions. Any arguments passed to the generated - * function will be passed to the wrapped function (except for the final - * callback argument). Errors thrown will be passed to the callback. - * - * If the function passed to `asyncify` returns a Promise, that promises's - * resolved/rejected state will be used to call the callback, rather than simply - * the synchronous return value. - * - * This also means you can asyncify ES2017 `async` functions. - * - * @name asyncify - * @static - * @memberOf module:Utils - * @method - * @alias wrapSync - * @category Util - * @param {Function} func - The synchronous function, or Promise-returning - * function to convert to an {@link AsyncFunction}. - * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be - * invoked with `(args..., callback)`. - * @example - * - * // passing a regular synchronous function - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(JSON.parse), - * function (data, next) { - * // data is the result of parsing the text. - * // If there was a parsing error, it would have been caught. - * } - * ], callback); - * - * // passing a function returning a promise - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(function (contents) { - * return db.model.create(contents); - * }), - * function (model, next) { - * // `model` is the instantiated model object. - * // If there was an error, this function would be skipped. - * } - * ], callback); - * - * // es2017 example, though `asyncify` is not needed if your JS environment - * // supports async functions out of the box - * var q = async.queue(async.asyncify(async function(file) { - * var intermediateStep = await processFile(file); - * return await somePromise(intermediateStep) - * })); - * - * q.push(files); - */ -function asyncify(func) { - if (isAsync(func)) { - return function (...args/*, callback*/) { - const callback = args.pop(); - const promise = func.apply(this, args); - return handlePromise(promise, callback) - } - } - - return initialParams(function (args, callback) { - var result; - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } - // if result is Promise object - if (result && typeof result.then === 'function') { - return handlePromise(result, callback) - } else { - callback(null, result); - } - }); -} - -function handlePromise(promise, callback) { - return promise.then(value => { - invokeCallback(callback, null, value); - }, err => { - invokeCallback(callback, err && err.message ? err : new Error(err)); - }); -} - -function invokeCallback(callback, error, value) { - try { - callback(error, value); - } catch (err) { - setImmediate$1(e => { throw e }, err); - } -} - -function isAsync(fn) { - return fn[Symbol.toStringTag] === 'AsyncFunction'; -} - -function isAsyncGenerator(fn) { - return fn[Symbol.toStringTag] === 'AsyncGenerator'; -} - -function isAsyncIterable(obj) { - return typeof obj[Symbol.asyncIterator] === 'function'; -} - -function wrapAsync(asyncFn) { - if (typeof asyncFn !== 'function') throw new Error('expected a function') - return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; -} - -// conditionally promisify a function. -// only return a promise if a callback is omitted -function awaitify (asyncFn, arity = asyncFn.length) { - if (!arity) throw new Error('arity is undefined') - function awaitable (...args) { - if (typeof args[arity - 1] === 'function') { - return asyncFn.apply(this, args) - } - - return new Promise((resolve, reject) => { - args[arity - 1] = (err, ...cbArgs) => { - if (err) return reject(err) - resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); - }; - asyncFn.apply(this, args); - }) - } - - return awaitable -} - -function applyEach (eachfn) { - return function applyEach(fns, ...callArgs) { - const go = awaitify(function (callback) { - var that = this; - return eachfn(fns, (fn, cb) => { - wrapAsync(fn).apply(that, callArgs.concat(cb)); - }, callback); - }); - return go; - }; -} - -function _asyncMap(eachfn, arr, iteratee, callback) { - arr = arr || []; - var results = []; - var counter = 0; - var _iteratee = wrapAsync(iteratee); - - return eachfn(arr, (value, _, iterCb) => { - var index = counter++; - _iteratee(value, (err, v) => { - results[index] = v; - iterCb(err); - }); - }, err => { - callback(err, results); - }); -} - -function isArrayLike(value) { - return value && - typeof value.length === 'number' && - value.length >= 0 && - value.length % 1 === 0; -} - -// A temporary value used to identify if the loop should be broken. -// See #1064, #1293 -const breakLoop = {}; - -function once(fn) { - function wrapper (...args) { - if (fn === null) return; - var callFn = fn; - fn = null; - callFn.apply(this, args); - } - Object.assign(wrapper, fn); - return wrapper -} - -function getIterator (coll) { - return coll[Symbol.iterator] && coll[Symbol.iterator](); -} - -function createArrayIterator(coll) { - var i = -1; - var len = coll.length; - return function next() { - return ++i < len ? {value: coll[i], key: i} : null; - } -} - -function createES2015Iterator(iterator) { - var i = -1; - return function next() { - var item = iterator.next(); - if (item.done) - return null; - i++; - return {value: item.value, key: i}; - } -} - -function createObjectIterator(obj) { - var okeys = obj ? Object.keys(obj) : []; - var i = -1; - var len = okeys.length; - return function next() { - var key = okeys[++i]; - if (key === '__proto__') { - return next(); - } - return i < len ? {value: obj[key], key} : null; - }; -} - -function createIterator(coll) { - if (isArrayLike(coll)) { - return createArrayIterator(coll); - } - - var iterator = getIterator(coll); - return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); -} - -function onlyOnce(fn) { - return function (...args) { - if (fn === null) throw new Error("Callback was already called."); - var callFn = fn; - fn = null; - callFn.apply(this, args); - }; -} - -// for async generators -function asyncEachOfLimit(generator, limit, iteratee, callback) { - let done = false; - let canceled = false; - let awaiting = false; - let running = 0; - let idx = 0; - - function replenish() { - //console.log('replenish') - if (running >= limit || awaiting || done) return - //console.log('replenish awaiting') - awaiting = true; - generator.next().then(({value, done: iterDone}) => { - //console.log('got value', value) - if (canceled || done) return - awaiting = false; - if (iterDone) { - done = true; - if (running <= 0) { - //console.log('done nextCb') - callback(null); - } - return; - } - running++; - iteratee(value, idx, iterateeCallback); - idx++; - replenish(); - }).catch(handleError); - } - - function iterateeCallback(err, result) { - //console.log('iterateeCallback') - running -= 1; - if (canceled) return - if (err) return handleError(err) - - if (err === false) { - done = true; - canceled = true; - return - } - - if (result === breakLoop || (done && running <= 0)) { - done = true; - //console.log('done iterCb') - return callback(null); - } - replenish(); - } - - function handleError(err) { - if (canceled) return - awaiting = false; - done = true; - callback(err); - } - - replenish(); -} - -var eachOfLimit = (limit) => { - return (obj, iteratee, callback) => { - callback = once(callback); - if (limit <= 0) { - throw new RangeError('concurrency limit cannot be less than 1') - } - if (!obj) { - return callback(null); - } - if (isAsyncGenerator(obj)) { - return asyncEachOfLimit(obj, limit, iteratee, callback) - } - if (isAsyncIterable(obj)) { - return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback) - } - var nextElem = createIterator(obj); - var done = false; - var canceled = false; - var running = 0; - var looping = false; - - function iterateeCallback(err, value) { - if (canceled) return - running -= 1; - if (err) { - done = true; - callback(err); - } - else if (err === false) { - done = true; - canceled = true; - } - else if (value === breakLoop || (done && running <= 0)) { - done = true; - return callback(null); - } - else if (!looping) { - replenish(); - } - } - - function replenish () { - looping = true; - while (running < limit && !done) { - var elem = nextElem(); - if (elem === null) { - done = true; - if (running <= 0) { - callback(null); - } - return; - } - running += 1; - iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); - } - looping = false; - } - - replenish(); - }; -}; - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a - * time. - * - * @name eachOfLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. The `key` is the item's key, or index in the case of an - * array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, wrapAsync(iteratee), callback); -} - -var eachOfLimit$2 = awaitify(eachOfLimit$1, 4); - -// eachOf implementation optimized for array-likes -function eachOfArrayLike(coll, iteratee, callback) { - callback = once(callback); - var index = 0, - completed = 0, - {length} = coll, - canceled = false; - if (length === 0) { - callback(null); - } - - function iteratorCallback(err, value) { - if (err === false) { - canceled = true; - } - if (canceled === true) return - if (err) { - callback(err); - } else if ((++completed === length) || value === breakLoop) { - callback(null); - } - } - - for (; index < length; index++) { - iteratee(coll[index], index, onlyOnce(iteratorCallback)); - } -} - -// a generic version of eachOf which can handle array, object, and iterator cases. -function eachOfGeneric (coll, iteratee, callback) { - return eachOfLimit$2(coll, Infinity, iteratee, callback); -} - -/** - * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument - * to the iteratee. - * - * @name eachOf - * @static - * @memberOf module:Collections - * @method - * @alias forEachOf - * @category Collection - * @see [async.each]{@link module:Collections.each} - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each - * item in `coll`. - * The `key` is the item's key, or index in the case of an array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dev.json is a file containing a valid json object config for dev environment - * // dev.json is a file containing a valid json object config for test environment - * // prod.json is a file containing a valid json object config for prod environment - * // invalid.json is a file with a malformed json object - * - * let configs = {}; //global variable - * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; - * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; - * - * // asynchronous function that reads a json file and parses the contents as json object - * function parseFile(file, key, callback) { - * fs.readFile(file, "utf8", function(err, data) { - * if (err) return calback(err); - * try { - * configs[key] = JSON.parse(data); - * } catch (e) { - * return callback(e); - * } - * callback(); - * }); - * } - * - * // Using callbacks - * async.forEachOf(validConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * } else { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * // JSON parse error exception - * } else { - * console.log(configs); - * } - * }); - * - * // Using Promises - * async.forEachOf(validConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * }).catch( err => { - * console.error(err); - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * }).catch( err => { - * console.error(err); - * // JSON parse error exception - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.forEachOf(validConfigFileMap, parseFile); - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * catch (err) { - * console.log(err); - * } - * } - * - * //Error handing - * async () => { - * try { - * let result = await async.forEachOf(invalidConfigFileMap, parseFile); - * console.log(configs); - * } - * catch (err) { - * console.log(err); - * // JSON parse error exception - * } - * } - * - */ -function eachOf(coll, iteratee, callback) { - var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; - return eachOfImplementation(coll, wrapAsync(iteratee), callback); -} - -var eachOf$1 = awaitify(eachOf, 3); - -/** - * Produces a new collection of values by mapping each value in `coll` through - * the `iteratee` function. The `iteratee` is called with an item from `coll` - * and a callback for when it has finished processing. Each of these callbacks - * takes 2 arguments: an `error`, and the transformed item from `coll`. If - * `iteratee` passes an error to its callback, the main `callback` (for the - * `map` function) is immediately called with the error. - * - * Note, that since this function applies the `iteratee` to each item in - * parallel, there is no guarantee that the `iteratee` functions will complete - * in order. However, the results array will be in the same order as the - * original `coll`. - * - * If `map` is passed an Object, the results will be an Array. The results - * will roughly be in the order of the original Objects' keys (but this can - * vary across JavaScript engines). - * - * @name map - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an Array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.map(fileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.map(fileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.map(fileList, getFileSizeInBytes); - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.map(withMissingFileList, getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function map (coll, iteratee, callback) { - return _asyncMap(eachOf$1, coll, iteratee, callback) -} -var map$1 = awaitify(map, 3); - -/** - * Applies the provided arguments to each function in the array, calling - * `callback` after all functions have completed. If you only provide the first - * argument, `fns`, then it will return a function which lets you pass in the - * arguments as if it were a single function call. If more arguments are - * provided, `callback` is required while `args` is still optional. The results - * for each of the applied async functions are passed to the final callback - * as an array. - * - * @name applyEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s - * to all call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - Returns a function that takes no args other than - * an optional callback, that is the result of applying the `args` to each - * of the functions. - * @example - * - * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') - * - * appliedFn((err, results) => { - * // results[0] is the results for `enableSearch` - * // results[1] is the results for `updateSchema` - * }); - * - * // partial application example: - * async.each( - * buckets, - * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), - * callback - * ); - */ -var applyEach$1 = applyEach(map$1); - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. - * - * @name eachOfSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfSeries(coll, iteratee, callback) { - return eachOfLimit$2(coll, 1, iteratee, callback) -} -var eachOfSeries$1 = awaitify(eachOfSeries, 3); - -/** - * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. - * - * @name mapSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function mapSeries (coll, iteratee, callback) { - return _asyncMap(eachOfSeries$1, coll, iteratee, callback) -} -var mapSeries$1 = awaitify(mapSeries, 3); - -/** - * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. - * - * @name applyEachSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.applyEach]{@link module:ControlFlow.applyEach} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all - * call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - A function, that when called, is the result of - * appling the `args` to the list of functions. It takes no args, other than - * a callback. - */ -var applyEachSeries = applyEach(mapSeries$1); - -const PROMISE_SYMBOL = Symbol('promiseCallback'); - -function promiseCallback () { - let resolve, reject; - function callback (err, ...args) { - if (err) return reject(err) - resolve(args.length > 1 ? args : args[0]); - } - - callback[PROMISE_SYMBOL] = new Promise((res, rej) => { - resolve = res, - reject = rej; - }); - - return callback -} - -/** - * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on - * their requirements. Each function can optionally depend on other functions - * being completed first, and each function is run as soon as its requirements - * are satisfied. - * - * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence - * will stop. Further tasks will not execute (so any other functions depending - * on it will not run), and the main `callback` is immediately called with the - * error. - * - * {@link AsyncFunction}s also receive an object containing the results of functions which - * have completed so far as the first argument, if they have dependencies. If a - * task function has no dependencies, it will only be passed a callback. - * - * @name auto - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Object} tasks - An object. Each of its properties is either a - * function or an array of requirements, with the {@link AsyncFunction} itself the last item - * in the array. The object's key of a property serves as the name of the task - * defined by that property, i.e. can be used when specifying requirements for - * other tasks. The function receives one or two arguments: - * * a `results` object, containing the results of the previously executed - * functions, only passed if the task has any dependencies, - * * a `callback(err, result)` function, which must be called when finished, - * passing an `error` (which can be `null`) and the result of the function's - * execution. - * @param {number} [concurrency=Infinity] - An optional `integer` for - * determining the maximum number of tasks that can be run in parallel. By - * default, as many as possible. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback. Results are always returned; however, if an - * error occurs, no further `tasks` will be performed, and the results object - * will only contain partial results. Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * @example - * - * //Using Callbacks - * async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }, function(err, results) { - * if (err) { - * console.log('err = ', err); - * } - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }); - * - * //Using Promises - * async.auto({ - * get_data: function(callback) { - * console.log('in get_data'); - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * console.log('in make_folder'); - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }).then(results => { - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * }).catch(err => { - * console.log('err = ', err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.auto({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * // once the file is written let's email a link to it... - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }); - * console.log('results = ', results); - * // results = { - * // get_data: ['data', 'converted to array'] - * // make_folder; 'folder', - * // write_file: 'filename' - * // email_link: { file: 'filename', email: 'user@example.com' } - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function auto(tasks, concurrency, callback) { - if (typeof concurrency !== 'number') { - // concurrency is optional, shift the args. - callback = concurrency; - concurrency = null; - } - callback = once(callback || promiseCallback()); - var numTasks = Object.keys(tasks).length; - if (!numTasks) { - return callback(null); - } - if (!concurrency) { - concurrency = numTasks; - } - - var results = {}; - var runningTasks = 0; - var canceled = false; - var hasError = false; - - var listeners = Object.create(null); - - var readyTasks = []; - - // for cycle detection: - var readyToCheck = []; // tasks that have been identified as reachable - // without the possibility of returning to an ancestor task - var uncheckedDependencies = {}; - - Object.keys(tasks).forEach(key => { - var task = tasks[key]; - if (!Array.isArray(task)) { - // no dependencies - enqueueTask(key, [task]); - readyToCheck.push(key); - return; - } - - var dependencies = task.slice(0, task.length - 1); - var remainingDependencies = dependencies.length; - if (remainingDependencies === 0) { - enqueueTask(key, task); - readyToCheck.push(key); - return; - } - uncheckedDependencies[key] = remainingDependencies; - - dependencies.forEach(dependencyName => { - if (!tasks[dependencyName]) { - throw new Error('async.auto task `' + key + - '` has a non-existent dependency `' + - dependencyName + '` in ' + - dependencies.join(', ')); - } - addListener(dependencyName, () => { - remainingDependencies--; - if (remainingDependencies === 0) { - enqueueTask(key, task); - } - }); - }); - }); - - checkForDeadlocks(); - processQueue(); - - function enqueueTask(key, task) { - readyTasks.push(() => runTask(key, task)); - } - - function processQueue() { - if (canceled) return - if (readyTasks.length === 0 && runningTasks === 0) { - return callback(null, results); - } - while(readyTasks.length && runningTasks < concurrency) { - var run = readyTasks.shift(); - run(); - } - - } - - function addListener(taskName, fn) { - var taskListeners = listeners[taskName]; - if (!taskListeners) { - taskListeners = listeners[taskName] = []; - } - - taskListeners.push(fn); - } - - function taskComplete(taskName) { - var taskListeners = listeners[taskName] || []; - taskListeners.forEach(fn => fn()); - processQueue(); - } - - - function runTask(key, task) { - if (hasError) return; - - var taskCallback = onlyOnce((err, ...result) => { - runningTasks--; - if (err === false) { - canceled = true; - return - } - if (result.length < 2) { - [result] = result; - } - if (err) { - var safeResults = {}; - Object.keys(results).forEach(rkey => { - safeResults[rkey] = results[rkey]; - }); - safeResults[key] = result; - hasError = true; - listeners = Object.create(null); - if (canceled) return - callback(err, safeResults); - } else { - results[key] = result; - taskComplete(key); - } - }); - - runningTasks++; - var taskFn = wrapAsync(task[task.length - 1]); - if (task.length > 1) { - taskFn(results, taskCallback); - } else { - taskFn(taskCallback); - } - } - - function checkForDeadlocks() { - // Kahn's algorithm - // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm - // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html - var currentTask; - var counter = 0; - while (readyToCheck.length) { - currentTask = readyToCheck.pop(); - counter++; - getDependents(currentTask).forEach(dependent => { - if (--uncheckedDependencies[dependent] === 0) { - readyToCheck.push(dependent); - } - }); - } - - if (counter !== numTasks) { - throw new Error( - 'async.auto cannot execute tasks due to a recursive dependency' - ); - } - } - - function getDependents(taskName) { - var result = []; - Object.keys(tasks).forEach(key => { - const task = tasks[key]; - if (Array.isArray(task) && task.indexOf(taskName) >= 0) { - result.push(key); - } - }); - return result; - } - - return callback[PROMISE_SYMBOL] -} - -var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; -var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /(=.+)?(\s*)$/; - -function stripComments(string) { - let stripped = ''; - let index = 0; - let endBlockComment = string.indexOf('*/'); - while (index < string.length) { - if (string[index] === '/' && string[index+1] === '/') { - // inline comment - let endIndex = string.indexOf('\n', index); - index = (endIndex === -1) ? string.length : endIndex; - } else if ((endBlockComment !== -1) && (string[index] === '/') && (string[index+1] === '*')) { - // block comment - let endIndex = string.indexOf('*/', index); - if (endIndex !== -1) { - index = endIndex + 2; - endBlockComment = string.indexOf('*/', index); - } else { - stripped += string[index]; - index++; - } - } else { - stripped += string[index]; - index++; - } - } - return stripped; -} - -function parseParams(func) { - const src = stripComments(func.toString()); - let match = src.match(FN_ARGS); - if (!match) { - match = src.match(ARROW_FN_ARGS); - } - if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src) - let [, args] = match; - return args - .replace(/\s/g, '') - .split(FN_ARG_SPLIT) - .map((arg) => arg.replace(FN_ARG, '').trim()); -} - -/** - * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent - * tasks are specified as parameters to the function, after the usual callback - * parameter, with the parameter names matching the names of the tasks it - * depends on. This can provide even more readable task graphs which can be - * easier to maintain. - * - * If a final callback is specified, the task results are similarly injected, - * specified as named parameters after the initial error parameter. - * - * The autoInject function is purely syntactic sugar and its semantics are - * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. - * - * @name autoInject - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.auto]{@link module:ControlFlow.auto} - * @category Control Flow - * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of - * the form 'func([dependencies...], callback). The object's key of a property - * serves as the name of the task defined by that property, i.e. can be used - * when specifying requirements for other tasks. - * * The `callback` parameter is a `callback(err, result)` which must be called - * when finished, passing an `error` (which can be `null`) and the result of - * the function's execution. The remaining parameters name other tasks on - * which the task is dependent, and the results from those tasks are the - * arguments of those parameters. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback, and a `results` object with any completed - * task results, similar to `auto`. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // The example from `auto` can be rewritten as follows: - * async.autoInject({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: function(get_data, make_folder, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }, - * email_link: function(write_file, callback) { - * // once the file is written let's email a link to it... - * // write_file contains the filename returned by write_file. - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * } - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - * - * // If you are using a JS minifier that mangles parameter names, `autoInject` - * // will not work with plain functions, since the parameter names will be - * // collapsed to a single letter identifier. To work around this, you can - * // explicitly specify the names of the parameters your task function needs - * // in an array, similar to Angular.js dependency injection. - * - * // This still has an advantage over plain `auto`, since the results a task - * // depends on are still spread into arguments. - * async.autoInject({ - * //... - * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(write_file, callback) { - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * }] - * //... - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - */ -function autoInject(tasks, callback) { - var newTasks = {}; - - Object.keys(tasks).forEach(key => { - var taskFn = tasks[key]; - var params; - var fnIsAsync = isAsync(taskFn); - var hasNoDeps = - (!fnIsAsync && taskFn.length === 1) || - (fnIsAsync && taskFn.length === 0); - - if (Array.isArray(taskFn)) { - params = [...taskFn]; - taskFn = params.pop(); - - newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); - } else if (hasNoDeps) { - // no dependencies, use the function as-is - newTasks[key] = taskFn; - } else { - params = parseParams(taskFn); - if ((taskFn.length === 0 && !fnIsAsync) && params.length === 0) { - throw new Error("autoInject task functions require explicit parameters."); - } - - // remove callback param - if (!fnIsAsync) params.pop(); - - newTasks[key] = params.concat(newTask); - } - - function newTask(results, taskCb) { - var newArgs = params.map(name => results[name]); - newArgs.push(taskCb); - wrapAsync(taskFn)(...newArgs); - } - }); - - return auto(newTasks, callback); -} - -// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation -// used for queues. This implementation assumes that the node provided by the user can be modified -// to adjust the next and last properties. We implement only the minimal functionality -// for queue support. -class DLL { - constructor() { - this.head = this.tail = null; - this.length = 0; - } - - removeLink(node) { - if (node.prev) node.prev.next = node.next; - else this.head = node.next; - if (node.next) node.next.prev = node.prev; - else this.tail = node.prev; - - node.prev = node.next = null; - this.length -= 1; - return node; - } - - empty () { - while(this.head) this.shift(); - return this; - } - - insertAfter(node, newNode) { - newNode.prev = node; - newNode.next = node.next; - if (node.next) node.next.prev = newNode; - else this.tail = newNode; - node.next = newNode; - this.length += 1; - } - - insertBefore(node, newNode) { - newNode.prev = node.prev; - newNode.next = node; - if (node.prev) node.prev.next = newNode; - else this.head = newNode; - node.prev = newNode; - this.length += 1; - } - - unshift(node) { - if (this.head) this.insertBefore(this.head, node); - else setInitial(this, node); - } - - push(node) { - if (this.tail) this.insertAfter(this.tail, node); - else setInitial(this, node); - } - - shift() { - return this.head && this.removeLink(this.head); - } - - pop() { - return this.tail && this.removeLink(this.tail); - } - - toArray() { - return [...this] - } - - *[Symbol.iterator] () { - var cur = this.head; - while (cur) { - yield cur.data; - cur = cur.next; - } - } - - remove (testFn) { - var curr = this.head; - while(curr) { - var {next} = curr; - if (testFn(curr)) { - this.removeLink(curr); - } - curr = next; - } - return this; - } -} - -function setInitial(dll, node) { - dll.length = 1; - dll.head = dll.tail = node; -} - -function queue(worker, concurrency, payload) { - if (concurrency == null) { - concurrency = 1; - } - else if(concurrency === 0) { - throw new RangeError('Concurrency must not be zero'); - } - - var _worker = wrapAsync(worker); - var numRunning = 0; - var workersList = []; - const events = { - error: [], - drain: [], - saturated: [], - unsaturated: [], - empty: [] - }; - - function on (event, handler) { - events[event].push(handler); - } - - function once (event, handler) { - const handleAndRemove = (...args) => { - off(event, handleAndRemove); - handler(...args); - }; - events[event].push(handleAndRemove); - } - - function off (event, handler) { - if (!event) return Object.keys(events).forEach(ev => events[ev] = []) - if (!handler) return events[event] = [] - events[event] = events[event].filter(ev => ev !== handler); - } - - function trigger (event, ...args) { - events[event].forEach(handler => handler(...args)); - } - - var processingScheduled = false; - function _insert(data, insertAtFront, rejectOnError, callback) { - if (callback != null && typeof callback !== 'function') { - throw new Error('task callback must be a function'); - } - q.started = true; - - var res, rej; - function promiseCallback (err, ...args) { - // we don't care about the error, let the global error handler - // deal with it - if (err) return rejectOnError ? rej(err) : res() - if (args.length <= 1) return res(args[0]) - res(args); - } - - var item = q._createTaskItem( - data, - rejectOnError ? promiseCallback : - (callback || promiseCallback) - ); - - if (insertAtFront) { - q._tasks.unshift(item); - } else { - q._tasks.push(item); - } - - if (!processingScheduled) { - processingScheduled = true; - setImmediate$1(() => { - processingScheduled = false; - q.process(); - }); - } - - if (rejectOnError || !callback) { - return new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }) - } - } - - function _createCB(tasks) { - return function (err, ...args) { - numRunning -= 1; - - for (var i = 0, l = tasks.length; i < l; i++) { - var task = tasks[i]; - - var index = workersList.indexOf(task); - if (index === 0) { - workersList.shift(); - } else if (index > 0) { - workersList.splice(index, 1); - } - - task.callback(err, ...args); - - if (err != null) { - trigger('error', err, task.data); - } - } - - if (numRunning <= (q.concurrency - q.buffer) ) { - trigger('unsaturated'); - } - - if (q.idle()) { - trigger('drain'); - } - q.process(); - }; - } - - function _maybeDrain(data) { - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - setImmediate$1(() => trigger('drain')); - return true - } - return false - } - - const eventMethod = (name) => (handler) => { - if (!handler) { - return new Promise((resolve, reject) => { - once(name, (err, data) => { - if (err) return reject(err) - resolve(data); - }); - }) - } - off(name); - on(name, handler); - - }; - - var isProcessing = false; - var q = { - _tasks: new DLL(), - _createTaskItem (data, callback) { - return { - data, - callback - }; - }, - *[Symbol.iterator] () { - yield* q._tasks[Symbol.iterator](); - }, - concurrency, - payload, - buffer: concurrency / 4, - started: false, - paused: false, - push (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, false, false, callback)) - } - return _insert(data, false, false, callback); - }, - pushAsync (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, false, true, callback)) - } - return _insert(data, false, true, callback); - }, - kill () { - off(); - q._tasks.empty(); - }, - unshift (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, true, false, callback)) - } - return _insert(data, true, false, callback); - }, - unshiftAsync (data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return - return data.map(datum => _insert(datum, true, true, callback)) - } - return _insert(data, true, true, callback); - }, - remove (testFn) { - q._tasks.remove(testFn); - }, - process () { - // Avoid trying to start too many processing operations. This can occur - // when callbacks resolve synchronously (#1267). - if (isProcessing) { - return; - } - isProcessing = true; - while(!q.paused && numRunning < q.concurrency && q._tasks.length){ - var tasks = [], data = []; - var l = q._tasks.length; - if (q.payload) l = Math.min(l, q.payload); - for (var i = 0; i < l; i++) { - var node = q._tasks.shift(); - tasks.push(node); - workersList.push(node); - data.push(node.data); - } - - numRunning += 1; - - if (q._tasks.length === 0) { - trigger('empty'); - } - - if (numRunning === q.concurrency) { - trigger('saturated'); - } - - var cb = onlyOnce(_createCB(tasks)); - _worker(data, cb); - } - isProcessing = false; - }, - length () { - return q._tasks.length; - }, - running () { - return numRunning; - }, - workersList () { - return workersList; - }, - idle() { - return q._tasks.length + numRunning === 0; - }, - pause () { - q.paused = true; - }, - resume () { - if (q.paused === false) { return; } - q.paused = false; - setImmediate$1(q.process); - } - }; - // define these as fixed properties, so people get useful errors when updating - Object.defineProperties(q, { - saturated: { - writable: false, - value: eventMethod('saturated') - }, - unsaturated: { - writable: false, - value: eventMethod('unsaturated') - }, - empty: { - writable: false, - value: eventMethod('empty') - }, - drain: { - writable: false, - value: eventMethod('drain') - }, - error: { - writable: false, - value: eventMethod('error') - }, - }); - return q; -} - -/** - * Creates a `cargo` object with the specified payload. Tasks added to the - * cargo will be processed altogether (up to the `payload` limit). If the - * `worker` is in progress, the task is queued until it becomes available. Once - * the `worker` has completed some tasks, each callback of those tasks is - * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) - * for how `cargo` and `queue` work. - * - * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers - * at a time, cargo passes an array of tasks to a single worker, repeating - * when the worker is finished. - * - * @name cargo - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An asynchronous function for processing an array - * of queued tasks. Invoked with `(tasks, callback)`. - * @param {number} [payload=Infinity] - An optional `integer` for determining - * how many tasks should be processed per round; if omitted, the default is - * unlimited. - * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can - * attached as certain properties to listen for specific events during the - * lifecycle of the cargo and inner queue. - * @example - * - * // create a cargo object with payload 2 - * var cargo = async.cargo(function(tasks, callback) { - * for (var i=0; i { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.reduce(fileList, 0, getFileSizeInBytes); - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function reduce(coll, memo, iteratee, callback) { - callback = once(callback); - var _iteratee = wrapAsync(iteratee); - return eachOfSeries$1(coll, (x, i, iterCb) => { - _iteratee(memo, x, (err, v) => { - memo = v; - iterCb(err); - }); - }, err => callback(err, memo)); -} -var reduce$1 = awaitify(reduce, 4); - -/** - * Version of the compose function that is more natural to read. Each function - * consumes the return value of the previous function. It is the equivalent of - * [compose]{@link module:ControlFlow.compose} with the arguments reversed. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name seq - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.compose]{@link module:ControlFlow.compose} - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} a function that composes the `functions` in order - * @example - * - * // Requires lodash (or underscore), express3 and dresende's orm2. - * // Part of an app, that fetches cats of the logged user. - * // This example uses `seq` function to avoid overnesting and error - * // handling clutter. - * app.get('/cats', function(request, response) { - * var User = request.models.User; - * async.seq( - * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) - * function(user, fn) { - * user.getCats(fn); // 'getCats' has signature (callback(err, data)) - * } - * )(req.session.user_id, function (err, cats) { - * if (err) { - * console.error(err); - * response.json({ status: 'error', message: err.message }); - * } else { - * response.json({ status: 'ok', message: 'Cats found', data: cats }); - * } - * }); - * }); - */ -function seq(...functions) { - var _functions = functions.map(wrapAsync); - return function (...args) { - var that = this; - - var cb = args[args.length - 1]; - if (typeof cb == 'function') { - args.pop(); - } else { - cb = promiseCallback(); - } - - reduce$1(_functions, args, (newargs, fn, iterCb) => { - fn.apply(that, newargs.concat((err, ...nextargs) => { - iterCb(err, nextargs); - })); - }, - (err, results) => cb(err, ...results)); - - return cb[PROMISE_SYMBOL] - }; -} - -/** - * Creates a function which is a composition of the passed asynchronous - * functions. Each function consumes the return value of the function that - * follows. Composing functions `f()`, `g()`, and `h()` would produce the result - * of `f(g(h()))`, only this version uses callbacks to obtain the return values. - * - * If the last argument to the composed function is not a function, a promise - * is returned when you call it. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name compose - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} an asynchronous function that is the composed - * asynchronous `functions` - * @example - * - * function add1(n, callback) { - * setTimeout(function () { - * callback(null, n + 1); - * }, 10); - * } - * - * function mul3(n, callback) { - * setTimeout(function () { - * callback(null, n * 3); - * }, 10); - * } - * - * var add1mul3 = async.compose(mul3, add1); - * add1mul3(4, function (err, result) { - * // result now equals 15 - * }); - */ -function compose(...args) { - return seq(...args.reverse()); -} - -/** - * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. - * - * @name mapLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function mapLimit (coll, limit, iteratee, callback) { - return _asyncMap(eachOfLimit(limit), coll, iteratee, callback) -} -var mapLimit$1 = awaitify(mapLimit, 4); - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. - * - * @name concatLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapLimit - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(coll, limit, (val, iterCb) => { - _iteratee(val, (err, ...args) => { - if (err) return iterCb(err); - return iterCb(err, args); - }); - }, (err, mapResults) => { - var result = []; - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - result = result.concat(...mapResults[i]); - } - } - - return callback(err, result); - }); -} -var concatLimit$1 = awaitify(concatLimit, 4); - -/** - * Applies `iteratee` to each item in `coll`, concatenating the results. Returns - * the concatenated list. The `iteratee`s are called in parallel, and the - * results are concatenated as they return. The results array will be returned in - * the original order of `coll` passed to the `iteratee` function. - * - * @name concat - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @alias flatMap - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * let directoryList = ['dir1','dir2','dir3']; - * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; - * - * // Using callbacks - * async.concat(directoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.concat(directoryList, fs.readdir) - * .then(results => { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir) - * .then(results => { - * console.log(results); - * }).catch(err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.concat(directoryList, fs.readdir); - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.concat(withMissingDirectoryList, fs.readdir); - * console.log(results); - * } catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } - * } - * - */ -function concat(coll, iteratee, callback) { - return concatLimit$1(coll, Infinity, iteratee, callback) -} -var concat$1 = awaitify(concat, 3); - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. - * - * @name concatSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapSeries - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. - * The iteratee should complete with an array an array of results. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatSeries(coll, iteratee, callback) { - return concatLimit$1(coll, 1, iteratee, callback) -} -var concatSeries$1 = awaitify(concatSeries, 3); - -/** - * Returns a function that when called, calls-back with the values provided. - * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to - * [`auto`]{@link module:ControlFlow.auto}. - * - * @name constant - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {...*} arguments... - Any number of arguments to automatically invoke - * callback with. - * @returns {AsyncFunction} Returns a function that when invoked, automatically - * invokes the callback with the previous given arguments. - * @example - * - * async.waterfall([ - * async.constant(42), - * function (value, next) { - * // value === 42 - * }, - * //... - * ], callback); - * - * async.waterfall([ - * async.constant(filename, "utf8"), - * fs.readFile, - * function (fileData, next) { - * //... - * } - * //... - * ], callback); - * - * async.auto({ - * hostname: async.constant("https://server.net/"), - * port: findFreePort, - * launchServer: ["hostname", "port", function (options, cb) { - * startServer(options, cb); - * }], - * //... - * }, callback); - */ -function constant(...args) { - return function (...ignoredArgs/*, callback*/) { - var callback = ignoredArgs.pop(); - return callback(null, ...args); - }; -} - -function _createTester(check, getResult) { - return (eachfn, arr, _iteratee, cb) => { - var testPassed = false; - var testResult; - const iteratee = wrapAsync(_iteratee); - eachfn(arr, (value, _, callback) => { - iteratee(value, (err, result) => { - if (err || err === false) return callback(err); - - if (check(result) && !testResult) { - testPassed = true; - testResult = getResult(true, value); - return callback(null, breakLoop); - } - callback(); - }); - }, err => { - if (err) return cb(err); - cb(null, testPassed ? testResult : getResult(false)); - }); - }; -} - -/** - * Returns the first value in `coll` that passes an async truth test. The - * `iteratee` is applied in parallel, meaning the first iteratee to return - * `true` will fire the detect `callback` with that result. That means the - * result might not be the first item in the original `coll` (in terms of order) - * that passes the test. - - * If order within the original `coll` is important, then look at - * [`detectSeries`]{@link module:Collections.detectSeries}. - * - * @name detect - * @static - * @memberOf module:Collections - * @method - * @alias find - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * } - *); - * - * // Using Promises - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) - * .then(result => { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); - * console.log(result); - * // dir1/file1.txt - * // result now equals the file in the list that exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function detect(coll, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback) -} -var detect$1 = awaitify(detect, 3); - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a - * time. - * - * @name detectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findLimit - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectLimit(coll, limit, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOfLimit(limit), coll, iteratee, callback) -} -var detectLimit$1 = awaitify(detectLimit, 4); - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. - * - * @name detectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findSeries - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectSeries(coll, iteratee, callback) { - return _createTester(bool => bool, (res, item) => item)(eachOfLimit(1), coll, iteratee, callback) -} - -var detectSeries$1 = awaitify(detectSeries, 3); - -function consoleFunc(name) { - return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => { - /* istanbul ignore else */ - if (typeof console === 'object') { - /* istanbul ignore else */ - if (err) { - /* istanbul ignore else */ - if (console.error) { - console.error(err); - } - } else if (console[name]) { /* istanbul ignore else */ - resultArgs.forEach(x => console[name](x)); - } - } - }) -} - -/** - * Logs the result of an [`async` function]{@link AsyncFunction} to the - * `console` using `console.dir` to display the properties of the resulting object. - * Only works in Node.js or in browsers that support `console.dir` and - * `console.error` (such as FF and Chrome). - * If multiple arguments are returned from the async function, - * `console.dir` is called on each argument in order. - * - * @name dir - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, {hello: name}); - * }, 1000); - * }; - * - * // in the node repl - * node> async.dir(hello, 'world'); - * {hello: 'world'} - */ -var dir = consoleFunc('dir'); - -/** - * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in - * the order of operations, the arguments `test` and `iteratee` are switched. - * - * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - * - * @name doWhilst - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - A function which is called each time `test` - * passes. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee`. - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. - * `callback` will be passed an error and any arguments passed to the final - * `iteratee`'s callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ -function doWhilst(iteratee, test, callback) { - callback = onlyOnce(callback); - var _fn = wrapAsync(iteratee); - var _test = wrapAsync(test); - var results; - - function next(err, ...args) { - if (err) return callback(err); - if (err === false) return; - results = args; - _test(...args, check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return check(null, true); -} - -var doWhilst$1 = awaitify(doWhilst, 3); - -/** - * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the - * argument ordering differs from `until`. - * - * @name doUntil - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee` - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ -function doUntil(iteratee, test, callback) { - const _test = wrapAsync(test); - return doWhilst$1(iteratee, (...args) => { - const cb = args.pop(); - _test(...args, (err, truth) => cb (err, !truth)); - }, callback); -} - -function _withoutIndex(iteratee) { - return (value, index, callback) => iteratee(value, callback); -} - -/** - * Applies the function `iteratee` to each item in `coll`, in parallel. - * The `iteratee` is called with an item from the list, and a callback for when - * it has finished. If the `iteratee` passes an error to its `callback`, the - * main `callback` (for the `each` function) is immediately called with the - * error. - * - * Note, that since this function applies `iteratee` to each item in parallel, - * there is no guarantee that the iteratee functions will complete in order. - * - * @name each - * @static - * @memberOf module:Collections - * @method - * @alias forEach - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to - * each item in `coll`. Invoked with (item, callback). - * The array index is not passed to the iteratee. - * If you need the index, use `eachOf`. - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; - * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; - * - * // asynchronous function that deletes a file - * const deleteFile = function(file, callback) { - * fs.unlink(file, callback); - * }; - * - * // Using callbacks - * async.each(fileList, deleteFile, function(err) { - * if( err ) { - * console.log(err); - * } else { - * console.log('All files have been deleted successfully'); - * } - * }); - * - * // Error Handling - * async.each(withMissingFileList, deleteFile, function(err){ - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using Promises - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using async/await - * async () => { - * try { - * await async.each(files, deleteFile); - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * await async.each(withMissingFileList, deleteFile); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * } - * } - * - */ -function eachLimit(coll, iteratee, callback) { - return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); -} - -var each = awaitify(eachLimit, 3); - -/** - * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. - * - * @name eachLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfLimit`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); -} -var eachLimit$2 = awaitify(eachLimit$1, 4); - -/** - * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. - * - * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item - * in series and therefore the iteratee functions will complete in order. - - * @name eachSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfSeries`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachSeries(coll, iteratee, callback) { - return eachLimit$2(coll, 1, iteratee, callback) -} -var eachSeries$1 = awaitify(eachSeries, 3); - -/** - * Wrap an async function and ensure it calls its callback on a later tick of - * the event loop. If the function already calls its callback on a next tick, - * no extra deferral is added. This is useful for preventing stack overflows - * (`RangeError: Maximum call stack size exceeded`) and generally keeping - * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) - * contained. ES2017 `async` functions are returned as-is -- they are immune - * to Zalgo's corrupting influences, as they always resolve on a later tick. - * - * @name ensureAsync - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - an async function, one that expects a node-style - * callback as its last argument. - * @returns {AsyncFunction} Returns a wrapped function with the exact same call - * signature as the function passed in. - * @example - * - * function sometimesAsync(arg, callback) { - * if (cache[arg]) { - * return callback(null, cache[arg]); // this would be synchronous!! - * } else { - * doSomeIO(arg, callback); // this IO would be asynchronous - * } - * } - * - * // this has a risk of stack overflows if many results are cached in a row - * async.mapSeries(args, sometimesAsync, done); - * - * // this will defer sometimesAsync's callback if necessary, - * // preventing stack overflows - * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); - */ -function ensureAsync(fn) { - if (isAsync(fn)) return fn; - return function (...args/*, callback*/) { - var callback = args.pop(); - var sync = true; - args.push((...innerArgs) => { - if (sync) { - setImmediate$1(() => callback(...innerArgs)); - } else { - callback(...innerArgs); - } - }); - fn.apply(this, args); - sync = false; - }; -} - -/** - * Returns `true` if every element in `coll` satisfies an async test. If any - * iteratee call returns `false`, the main `callback` is immediately called. - * - * @name every - * @static - * @memberOf module:Collections - * @method - * @alias all - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.every(fileList, fileExists, function(err, result) { - * console.log(result); - * // true - * // result is true since every file exists - * }); - * - * async.every(withMissingFileList, fileExists, function(err, result) { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }); - * - * // Using Promises - * async.every(fileList, fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.every(withMissingFileList, fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.every(fileList, fileExists); - * console.log(result); - * // true - * // result is true since every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.every(withMissingFileList, fileExists); - * console.log(result); - * // false - * // result is false since NOT every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function every(coll, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOf$1, coll, iteratee, callback) -} -var every$1 = awaitify(every, 3); - -/** - * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. - * - * @name everyLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everyLimit(coll, limit, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOfLimit(limit), coll, iteratee, callback) -} -var everyLimit$1 = awaitify(everyLimit, 4); - -/** - * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. - * - * @name everySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in series. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everySeries(coll, iteratee, callback) { - return _createTester(bool => !bool, res => !res)(eachOfSeries$1, coll, iteratee, callback) -} -var everySeries$1 = awaitify(everySeries, 3); - -function filterArray(eachfn, arr, iteratee, callback) { - var truthValues = new Array(arr.length); - eachfn(arr, (x, index, iterCb) => { - iteratee(x, (err, v) => { - truthValues[index] = !!v; - iterCb(err); - }); - }, err => { - if (err) return callback(err); - var results = []; - for (var i = 0; i < arr.length; i++) { - if (truthValues[i]) results.push(arr[i]); - } - callback(null, results); - }); -} - -function filterGeneric(eachfn, coll, iteratee, callback) { - var results = []; - eachfn(coll, (x, index, iterCb) => { - iteratee(x, (err, v) => { - if (err) return iterCb(err); - if (v) { - results.push({index, value: x}); - } - iterCb(err); - }); - }, err => { - if (err) return callback(err); - callback(null, results - .sort((a, b) => a.index - b.index) - .map(v => v.value)); - }); -} - -function _filter(eachfn, coll, iteratee, callback) { - var filter = isArrayLike(coll) ? filterArray : filterGeneric; - return filter(eachfn, coll, wrapAsync(iteratee), callback); -} - -/** - * Returns a new array of all the values in `coll` which pass an async truth - * test. This operation is performed in parallel, but the results array will be - * in the same order as the original. - * - * @name filter - * @static - * @memberOf module:Collections - * @method - * @alias select - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.filter(files, fileExists, function(err, results) { - * if(err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * }); - * - * // Using Promises - * async.filter(files, fileExists) - * .then(results => { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.filter(files, fileExists); - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function filter (coll, iteratee, callback) { - return _filter(eachOf$1, coll, iteratee, callback) -} -var filter$1 = awaitify(filter, 3); - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a - * time. - * - * @name filterLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - */ -function filterLimit (coll, limit, iteratee, callback) { - return _filter(eachOfLimit(limit), coll, iteratee, callback) -} -var filterLimit$1 = awaitify(filterLimit, 4); - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. - * - * @name filterSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results) - * @returns {Promise} a promise, if no callback provided - */ -function filterSeries (coll, iteratee, callback) { - return _filter(eachOfSeries$1, coll, iteratee, callback) -} -var filterSeries$1 = awaitify(filterSeries, 3); - -/** - * Calls the asynchronous function `fn` with a callback parameter that allows it - * to call itself again, in series, indefinitely. - - * If an error is passed to the callback then `errback` is called with the - * error, and execution stops, otherwise it will never be called. - * - * @name forever - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} fn - an async function to call repeatedly. - * Invoked with (next). - * @param {Function} [errback] - when `fn` passes an error to it's callback, - * this function will be called, and execution stops. Invoked with (err). - * @returns {Promise} a promise that rejects if an error occurs and an errback - * is not passed - * @example - * - * async.forever( - * function(next) { - * // next is suitable for passing to things that need a callback(err [, whatever]); - * // it will result in this function being called again. - * }, - * function(err) { - * // if next is called with a value in its first parameter, it will appear - * // in here as 'err', and execution will stop. - * } - * ); - */ -function forever(fn, errback) { - var done = onlyOnce(errback); - var task = wrapAsync(ensureAsync(fn)); - - function next(err) { - if (err) return done(err); - if (err === false) return; - task(next); - } - return next(); -} -var forever$1 = awaitify(forever, 2); - -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. - * - * @name groupByLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ -function groupByLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(coll, limit, (val, iterCb) => { - _iteratee(val, (err, key) => { - if (err) return iterCb(err); - return iterCb(err, {key, val}); - }); - }, (err, mapResults) => { - var result = {}; - // from MDN, handle object having an `hasOwnProperty` prop - var {hasOwnProperty} = Object.prototype; - - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - var {key} = mapResults[i]; - var {val} = mapResults[i]; - - if (hasOwnProperty.call(result, key)) { - result[key].push(val); - } else { - result[key] = [val]; - } - } - } - - return callback(err, result); - }); -} - -var groupByLimit$1 = awaitify(groupByLimit, 4); - -/** - * Returns a new object, where each value corresponds to an array of items, from - * `coll`, that returned the corresponding key. That is, the keys of the object - * correspond to the values passed to the `iteratee` callback. - * - * Note: Since this function applies the `iteratee` to each item in parallel, - * there is no guarantee that the `iteratee` functions will complete in order. - * However, the values for each key in the `result` will be in the same order as - * the original `coll`. For Objects, the values will roughly be in the order of - * the original Objects' keys (but this can vary across JavaScript engines). - * - * @name groupBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const files = ['dir1/file1.txt','dir2','dir4'] - * - * // asynchronous function that detects file type as none, file, or directory - * function detectFile(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(null, 'none'); - * } - * callback(null, stat.isDirectory() ? 'directory' : 'file'); - * }); - * } - * - * //Using callbacks - * async.groupBy(files, detectFile, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * }); - * - * // Using Promises - * async.groupBy(files, detectFile) - * .then( result => { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.groupBy(files, detectFile); - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function groupBy (coll, iteratee, callback) { - return groupByLimit$1(coll, Infinity, iteratee, callback) -} - -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. - * - * @name groupBySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whose - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ -function groupBySeries (coll, iteratee, callback) { - return groupByLimit$1(coll, 1, iteratee, callback) -} - -/** - * Logs the result of an `async` function to the `console`. Only works in - * Node.js or in browsers that support `console.log` and `console.error` (such - * as FF and Chrome). If multiple arguments are returned from the async - * function, `console.log` is called on each argument in order. - * - * @name log - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, 'hello ' + name); - * }, 1000); - * }; - * - * // in the node repl - * node> async.log(hello, 'world'); - * 'hello world' - */ -var log = consoleFunc('log'); - -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a - * time. - * - * @name mapValuesLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function mapValuesLimit(obj, limit, iteratee, callback) { - callback = once(callback); - var newObj = {}; - var _iteratee = wrapAsync(iteratee); - return eachOfLimit(limit)(obj, (val, key, next) => { - _iteratee(val, key, (err, result) => { - if (err) return next(err); - newObj[key] = result; - next(err); - }); - }, err => callback(err, newObj)); -} - -var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); - -/** - * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. - * - * Produces a new Object by mapping each value of `obj` through the `iteratee` - * function. The `iteratee` is called each `value` and `key` from `obj` and a - * callback for when it has finished processing. Each of these callbacks takes - * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` - * passes an error to its callback, the main `callback` (for the `mapValues` - * function) is immediately called with the error. - * - * Note, the order of the keys in the result is not guaranteed. The keys will - * be roughly in the order they complete, (but this is very engine-specific) - * - * @name mapValues - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file3.txt' - * }; - * - * const withMissingFileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file4.txt' - * }; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, key, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * }); - * - * // Error handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.mapValues(fileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * }).catch (err => { - * console.log(err); - * }); - * - * // Error Handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch (err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.mapValues(fileMap, getFileSizeInBytes); - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function mapValues(obj, iteratee, callback) { - return mapValuesLimit$1(obj, Infinity, iteratee, callback) -} - -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. - * - * @name mapValuesSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function mapValuesSeries(obj, iteratee, callback) { - return mapValuesLimit$1(obj, 1, iteratee, callback) -} - -/** - * Caches the results of an async function. When creating a hash to store - * function results against, the callback is omitted from the hash and an - * optional hash function can be used. - * - * **Note: if the async function errs, the result will not be cached and - * subsequent calls will call the wrapped function.** - * - * If no hash function is specified, the first argument is used as a hash key, - * which may work reasonably if it is a string or a data type that converts to a - * distinct string. Note that objects and arrays will not behave reasonably. - * Neither will cases where the other arguments are significant. In such cases, - * specify your own hash function. - * - * The cache of results is exposed as the `memo` property of the function - * returned by `memoize`. - * - * @name memoize - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function to proxy and cache results from. - * @param {Function} hasher - An optional function for generating a custom hash - * for storing results. It has all the arguments applied to it apart from the - * callback, and must be synchronous. - * @returns {AsyncFunction} a memoized version of `fn` - * @example - * - * var slow_fn = function(name, callback) { - * // do something - * callback(null, result); - * }; - * var fn = async.memoize(slow_fn); - * - * // fn can now be used as if it were slow_fn - * fn('some name', function() { - * // callback - * }); - */ -function memoize(fn, hasher = v => v) { - var memo = Object.create(null); - var queues = Object.create(null); - var _fn = wrapAsync(fn); - var memoized = initialParams((args, callback) => { - var key = hasher(...args); - if (key in memo) { - setImmediate$1(() => callback(null, ...memo[key])); - } else if (key in queues) { - queues[key].push(callback); - } else { - queues[key] = [callback]; - _fn(...args, (err, ...resultArgs) => { - // #1465 don't memoize if an error occurred - if (!err) { - memo[key] = resultArgs; - } - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i](err, ...resultArgs); - } - }); - } - }); - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; -} - -/* istanbul ignore file */ - -/** - * Calls `callback` on a later loop around the event loop. In Node.js this just - * calls `process.nextTick`. In the browser it will use `setImmediate` if - * available, otherwise `setTimeout(callback, 0)`, which means other higher - * priority events may precede the execution of `callback`. - * - * This is used internally for browser-compatibility purposes. - * - * @name nextTick - * @static - * @memberOf module:Utils - * @method - * @see [async.setImmediate]{@link module:Utils.setImmediate} - * @category Util - * @param {Function} callback - The function to call on a later loop around - * the event loop. Invoked with (args...). - * @param {...*} args... - any number of additional arguments to pass to the - * callback on the next tick. - * @example - * - * var call_order = []; - * async.nextTick(function() { - * call_order.push('two'); - * // call_order now equals ['one','two'] - * }); - * call_order.push('one'); - * - * async.setImmediate(function (a, b, c) { - * // a, b, and c equal 1, 2, and 3 - * }, 1, 2, 3); - */ -var _defer$1; - -if (hasNextTick) { - _defer$1 = process.nextTick; -} else if (hasSetImmediate) { - _defer$1 = setImmediate; -} else { - _defer$1 = fallback; -} - -var nextTick = wrap(_defer$1); - -var parallel = awaitify((eachfn, tasks, callback) => { - var results = isArrayLike(tasks) ? [] : {}; - - eachfn(tasks, (task, key, taskCb) => { - wrapAsync(task)((err, ...result) => { - if (result.length < 2) { - [result] = result; - } - results[key] = result; - taskCb(err); - }); - }, err => callback(err, results)); -}, 3); - -/** - * Run the `tasks` collection of functions in parallel, without waiting until - * the previous function has completed. If any of the functions pass an error to - * its callback, the main `callback` is immediately called with the value of the - * error. Once the `tasks` have completed, the results are passed to the final - * `callback` as an array. - * - * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about - * parallel execution of code. If your tasks do not use any timers or perform - * any I/O, they will actually be executed in series. Any synchronous setup - * sections for each task will happen one after the other. JavaScript remains - * single-threaded. - * - * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the - * execution of other tasks when a task fails. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.parallel}. - * - * @name parallel - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * - * //Using Callbacks - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function parallel$1(tasks, callback) { - return parallel(eachOf$1, tasks, callback); -} - -/** - * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a - * time. - * - * @name parallelLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.parallel]{@link module:ControlFlow.parallel} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - */ -function parallelLimit(tasks, limit, callback) { - return parallel(eachOfLimit(limit), tasks, callback); -} - -/** - * A queue of tasks for the worker function to complete. - * @typedef {Iterable} QueueObject - * @memberOf module:ControlFlow - * @property {Function} length - a function returning the number of items - * waiting to be processed. Invoke with `queue.length()`. - * @property {boolean} started - a boolean indicating whether or not any - * items have been pushed and processed by the queue. - * @property {Function} running - a function returning the number of items - * currently being processed. Invoke with `queue.running()`. - * @property {Function} workersList - a function returning the array of items - * currently being processed. Invoke with `queue.workersList()`. - * @property {Function} idle - a function returning false if there are items - * waiting or being processed, or true if not. Invoke with `queue.idle()`. - * @property {number} concurrency - an integer for determining how many `worker` - * functions should be run in parallel. This property can be changed after a - * `queue` is created to alter the concurrency on-the-fly. - * @property {number} payload - an integer that specifies how many items are - * passed to the worker function at a time. only applies if this is a - * [cargo]{@link module:ControlFlow.cargo} object - * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` - * once the `worker` has finished processing the task. Instead of a single task, - * a `tasks` array can be submitted. The respective callback is used for every - * task in the list. Invoke with `queue.push(task, [callback])`, - * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. - * Invoke with `queue.unshift(task, [callback])`. - * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns - * a promise that rejects if an error occurs. - * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns - * a promise that rejects if an error occurs. - * @property {Function} remove - remove items from the queue that match a test - * function. The test function will be passed an object with a `data` property, - * and a `priority` property, if this is a - * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. - * Invoked with `queue.remove(testFn)`, where `testFn` is of the form - * `function ({data, priority}) {}` and returns a Boolean. - * @property {Function} saturated - a function that sets a callback that is - * called when the number of running workers hits the `concurrency` limit, and - * further tasks will be queued. If the callback is omitted, `q.saturated()` - * returns a promise for the next occurrence. - * @property {Function} unsaturated - a function that sets a callback that is - * called when the number of running workers is less than the `concurrency` & - * `buffer` limits, and further tasks will not be queued. If the callback is - * omitted, `q.unsaturated()` returns a promise for the next occurrence. - * @property {number} buffer - A minimum threshold buffer in order to say that - * the `queue` is `unsaturated`. - * @property {Function} empty - a function that sets a callback that is called - * when the last item from the `queue` is given to a `worker`. If the callback - * is omitted, `q.empty()` returns a promise for the next occurrence. - * @property {Function} drain - a function that sets a callback that is called - * when the last item from the `queue` has returned from the `worker`. If the - * callback is omitted, `q.drain()` returns a promise for the next occurrence. - * @property {Function} error - a function that sets a callback that is called - * when a task errors. Has the signature `function(error, task)`. If the - * callback is omitted, `error()` returns a promise that rejects on the next - * error. - * @property {boolean} paused - a boolean for determining whether the queue is - * in a paused state. - * @property {Function} pause - a function that pauses the processing of tasks - * until `resume()` is called. Invoke with `queue.pause()`. - * @property {Function} resume - a function that resumes the processing of - * queued tasks when the queue is paused. Invoke with `queue.resume()`. - * @property {Function} kill - a function that removes the `drain` callback and - * empties remaining tasks from the queue forcing it to go idle. No more tasks - * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. - * - * @example - * const q = async.queue(worker, 2) - * q.push(item1) - * q.push(item2) - * q.push(item3) - * // queues are iterable, spread into an array to inspect - * const items = [...q] // [item1, item2, item3] - * // or use for of - * for (let item of q) { - * console.log(item) - * } - * - * q.drain(() => { - * console.log('all done') - * }) - * // or - * await q.drain() - */ - -/** - * Creates a `queue` object with the specified `concurrency`. Tasks added to the - * `queue` are processed in parallel (up to the `concurrency` limit). If all - * `worker`s are in progress, the task is queued until one becomes available. - * Once a `worker` completes a `task`, that `task`'s callback is called. - * - * @name queue - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. Invoked with (task, callback). - * @param {number} [concurrency=1] - An `integer` for determining how many - * `worker` functions should be run in parallel. If omitted, the concurrency - * defaults to `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be - * attached as certain properties to listen for specific events during the - * lifecycle of the queue. - * @example - * - * // create a queue object with concurrency 2 - * var q = async.queue(function(task, callback) { - * console.log('hello ' + task.name); - * callback(); - * }, 2); - * - * // assign a callback - * q.drain(function() { - * console.log('all items have been processed'); - * }); - * // or await the end - * await q.drain() - * - * // assign an error callback - * q.error(function(err, task) { - * console.error('task experienced an error'); - * }); - * - * // add some items to the queue - * q.push({name: 'foo'}, function(err) { - * console.log('finished processing foo'); - * }); - * // callback is optional - * q.push({name: 'bar'}); - * - * // add some items to the queue (batch-wise) - * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { - * console.log('finished processing item'); - * }); - * - * // add some items to the front of the queue - * q.unshift({name: 'bar'}, function (err) { - * console.log('finished processing bar'); - * }); - */ -function queue$1 (worker, concurrency) { - var _worker = wrapAsync(worker); - return queue((items, cb) => { - _worker(items[0], cb); - }, concurrency, 1); -} - -// Binary min-heap implementation used for priority queue. -// Implementation is stable, i.e. push time is considered for equal priorities -class Heap { - constructor() { - this.heap = []; - this.pushCount = Number.MIN_SAFE_INTEGER; - } - - get length() { - return this.heap.length; - } - - empty () { - this.heap = []; - return this; - } - - percUp(index) { - let p; - - while (index > 0 && smaller(this.heap[index], this.heap[p=parent(index)])) { - let t = this.heap[index]; - this.heap[index] = this.heap[p]; - this.heap[p] = t; - - index = p; - } - } - - percDown(index) { - let l; - - while ((l=leftChi(index)) < this.heap.length) { - if (l+1 < this.heap.length && smaller(this.heap[l+1], this.heap[l])) { - l = l+1; - } - - if (smaller(this.heap[index], this.heap[l])) { - break; - } - - let t = this.heap[index]; - this.heap[index] = this.heap[l]; - this.heap[l] = t; - - index = l; - } - } - - push(node) { - node.pushCount = ++this.pushCount; - this.heap.push(node); - this.percUp(this.heap.length-1); - } - - unshift(node) { - return this.heap.push(node); - } - - shift() { - let [top] = this.heap; - - this.heap[0] = this.heap[this.heap.length-1]; - this.heap.pop(); - this.percDown(0); - - return top; - } - - toArray() { - return [...this]; - } - - *[Symbol.iterator] () { - for (let i = 0; i < this.heap.length; i++) { - yield this.heap[i].data; - } - } - - remove (testFn) { - let j = 0; - for (let i = 0; i < this.heap.length; i++) { - if (!testFn(this.heap[i])) { - this.heap[j] = this.heap[i]; - j++; - } - } - - this.heap.splice(j); - - for (let i = parent(this.heap.length-1); i >= 0; i--) { - this.percDown(i); - } - - return this; - } -} - -function leftChi(i) { - return (i<<1)+1; -} - -function parent(i) { - return ((i+1)>>1)-1; -} - -function smaller(x, y) { - if (x.priority !== y.priority) { - return x.priority < y.priority; - } - else { - return x.pushCount < y.pushCount; - } -} - -/** - * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and - * completed in ascending priority order. - * - * @name priorityQueue - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. - * Invoked with (task, callback). - * @param {number} concurrency - An `integer` for determining how many `worker` - * functions should be run in parallel. If omitted, the concurrency defaults to - * `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three - * differences between `queue` and `priorityQueue` objects: - * * `push(task, priority, [callback])` - `priority` should be a number. If an - * array of `tasks` is given, all tasks will be assigned the same priority. - * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, - * except this returns a promise that rejects if an error occurs. - * * The `unshift` and `unshiftAsync` methods were removed. - */ -function priorityQueue(worker, concurrency) { - // Start with a normal queue - var q = queue$1(worker, concurrency); - - var { - push, - pushAsync - } = q; - - q._tasks = new Heap(); - q._createTaskItem = ({data, priority}, callback) => { - return { - data, - priority, - callback - }; - }; - - function createDataItems(tasks, priority) { - if (!Array.isArray(tasks)) { - return {data: tasks, priority}; - } - return tasks.map(data => { return {data, priority}; }); - } - - // Override push to accept second parameter representing priority - q.push = function(data, priority = 0, callback) { - return push(createDataItems(data, priority), callback); - }; - - q.pushAsync = function(data, priority = 0, callback) { - return pushAsync(createDataItems(data, priority), callback); - }; - - // Remove unshift functions - delete q.unshift; - delete q.unshiftAsync; - - return q; -} - -/** - * Runs the `tasks` array of functions in parallel, without waiting until the - * previous function has completed. Once any of the `tasks` complete or pass an - * error to its callback, the main `callback` is immediately called. It's - * equivalent to `Promise.race()`. - * - * @name race - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} - * to run. Each function can complete with an optional `result` value. - * @param {Function} callback - A callback to run once any of the functions have - * completed. This function gets an error or result from the first function that - * completed. Invoked with (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.race([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], - * // main callback - * function(err, result) { - * // the result will be equal to 'two' as it finishes earlier - * }); - */ -function race(tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); - if (!tasks.length) return callback(); - for (var i = 0, l = tasks.length; i < l; i++) { - wrapAsync(tasks[i])(callback); - } -} - -var race$1 = awaitify(race, 2); - -/** - * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. - * - * @name reduceRight - * @static - * @memberOf module:Collections - * @method - * @see [async.reduce]{@link module:Collections.reduce} - * @alias foldr - * @category Collection - * @param {Array} array - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function reduceRight (array, memo, iteratee, callback) { - var reversed = [...array].reverse(); - return reduce$1(reversed, memo, iteratee, callback); -} - -/** - * Wraps the async function in another function that always completes with a - * result object, even when it errors. - * - * The result object has either the property `error` or `value`. - * - * @name reflect - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function you want to wrap - * @returns {Function} - A function that always passes null to it's callback as - * the error. The second argument to the callback will be an `object` with - * either an `error` or a `value` property. - * @example - * - * async.parallel([ - * async.reflect(function(callback) { - * // do some stuff ... - * callback(null, 'one'); - * }), - * async.reflect(function(callback) { - * // do some more stuff but error ... - * callback('bad stuff happened'); - * }), - * async.reflect(function(callback) { - * // do some more stuff ... - * callback(null, 'two'); - * }) - * ], - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = 'bad stuff happened' - * // results[2].value = 'two' - * }); - */ -function reflect(fn) { - var _fn = wrapAsync(fn); - return initialParams(function reflectOn(args, reflectCallback) { - args.push((error, ...cbArgs) => { - let retVal = {}; - if (error) { - retVal.error = error; - } - if (cbArgs.length > 0){ - var value = cbArgs; - if (cbArgs.length <= 1) { - [value] = cbArgs; - } - retVal.value = value; - } - reflectCallback(null, retVal); - }); - - return _fn.apply(this, args); - }); -} - -/** - * A helper function that wraps an array or an object of functions with `reflect`. - * - * @name reflectAll - * @static - * @memberOf module:Utils - * @method - * @see [async.reflect]{@link module:Utils.reflect} - * @category Util - * @param {Array|Object|Iterable} tasks - The collection of - * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. - * @returns {Array} Returns an array of async functions, each wrapped in - * `async.reflect` - * @example - * - * let tasks = [ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * // do some more stuff but error ... - * callback(new Error('bad stuff happened')); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = Error('bad stuff happened') - * // results[2].value = 'two' - * }); - * - * // an example using an object instead of an array - * let tasks = { - * one: function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * two: function(callback) { - * callback('two'); - * }, - * three: function(callback) { - * setTimeout(function() { - * callback(null, 'three'); - * }, 100); - * } - * }; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results.one.value = 'one' - * // results.two.error = 'two' - * // results.three.value = 'three' - * }); - */ -function reflectAll(tasks) { - var results; - if (Array.isArray(tasks)) { - results = tasks.map(reflect); - } else { - results = {}; - Object.keys(tasks).forEach(key => { - results[key] = reflect.call(this, tasks[key]); - }); - } - return results; -} - -function reject(eachfn, arr, _iteratee, callback) { - const iteratee = wrapAsync(_iteratee); - return _filter(eachfn, arr, (value, cb) => { - iteratee(value, (err, v) => { - cb(err, !v); - }); - }, callback); -} - -/** - * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. - * - * @name reject - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.reject(fileList, fileExists, function(err, results) { - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }); - * - * // Using Promises - * async.reject(fileList, fileExists) - * .then( results => { - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.reject(fileList, fileExists); - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function reject$1 (coll, iteratee, callback) { - return reject(eachOf$1, coll, iteratee, callback) -} -var reject$2 = awaitify(reject$1, 3); - -/** - * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a - * time. - * - * @name rejectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function rejectLimit (coll, limit, iteratee, callback) { - return reject(eachOfLimit(limit), coll, iteratee, callback) -} -var rejectLimit$1 = awaitify(rejectLimit, 4); - -/** - * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. - * - * @name rejectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function rejectSeries (coll, iteratee, callback) { - return reject(eachOfSeries$1, coll, iteratee, callback) -} -var rejectSeries$1 = awaitify(rejectSeries, 3); - -function constant$1(value) { - return function () { - return value; - } -} - -/** - * Attempts to get a successful response from `task` no more than `times` times - * before returning an error. If the task is successful, the `callback` will be - * passed the result of the successful task. If all attempts fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name retry - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @see [async.retryable]{@link module:ControlFlow.retryable} - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an - * object with `times` and `interval` or a number. - * * `times` - The number of attempts to make before giving up. The default - * is `5`. - * * `interval` - The time to wait between retries, in milliseconds. The - * default is `0`. The interval may also be specified as a function of the - * retry count (see example). - * * `errorFilter` - An optional synchronous function that is invoked on - * erroneous result. If it returns `true` the retry attempts will continue; - * if the function returns `false` the retry flow is aborted with the current - * attempt's error and result being returned to the final callback. - * Invoked with (err). - * * If `opts` is a number, the number specifies the number of times to retry, - * with the default interval of `0`. - * @param {AsyncFunction} task - An async function to retry. - * Invoked with (callback). - * @param {Function} [callback] - An optional callback which is called when the - * task has succeeded, or after the final failed attempt. It receives the `err` - * and `result` arguments of the last attempt at completing the `task`. Invoked - * with (err, results). - * @returns {Promise} a promise if no callback provided - * - * @example - * - * // The `retry` function can be used as a stand-alone control flow by passing - * // a callback, as shown below: - * - * // try calling apiMethod 3 times - * async.retry(3, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 3 times, waiting 200 ms between each retry - * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 10 times with exponential backoff - * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) - * async.retry({ - * times: 10, - * interval: function(retryCount) { - * return 50 * Math.pow(2, retryCount); - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod the default 5 times no delay between each retry - * async.retry(apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod only when error condition satisfies, all other - * // errors will abort the retry control flow and return to final callback - * async.retry({ - * errorFilter: function(err) { - * return err.message === 'Temporary error'; // only retry on a specific error - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // to retry individual methods that are not as reliable within other - * // control flow functions, use the `retryable` wrapper: - * async.auto({ - * users: api.getUsers.bind(api), - * payments: async.retryable(3, api.getPayments.bind(api)) - * }, function(err, results) { - * // do something with the results - * }); - * - */ -const DEFAULT_TIMES = 5; -const DEFAULT_INTERVAL = 0; - -function retry(opts, task, callback) { - var options = { - times: DEFAULT_TIMES, - intervalFunc: constant$1(DEFAULT_INTERVAL) - }; - - if (arguments.length < 3 && typeof opts === 'function') { - callback = task || promiseCallback(); - task = opts; - } else { - parseTimes(options, opts); - callback = callback || promiseCallback(); - } - - if (typeof task !== 'function') { - throw new Error("Invalid arguments for async.retry"); - } - - var _task = wrapAsync(task); - - var attempt = 1; - function retryAttempt() { - _task((err, ...args) => { - if (err === false) return - if (err && attempt++ < options.times && - (typeof options.errorFilter != 'function' || - options.errorFilter(err))) { - setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); - } else { - callback(err, ...args); - } - }); - } - - retryAttempt(); - return callback[PROMISE_SYMBOL] -} - -function parseTimes(acc, t) { - if (typeof t === 'object') { - acc.times = +t.times || DEFAULT_TIMES; - - acc.intervalFunc = typeof t.interval === 'function' ? - t.interval : - constant$1(+t.interval || DEFAULT_INTERVAL); - - acc.errorFilter = t.errorFilter; - } else if (typeof t === 'number' || typeof t === 'string') { - acc.times = +t || DEFAULT_TIMES; - } else { - throw new Error("Invalid arguments for async.retry"); - } -} - -/** - * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method - * wraps a task and makes it retryable, rather than immediately calling it - * with retries. - * - * @name retryable - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.retry]{@link module:ControlFlow.retry} - * @category Control Flow - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional - * options, exactly the same as from `retry`, except for a `opts.arity` that - * is the arity of the `task` function, defaulting to `task.length` - * @param {AsyncFunction} task - the asynchronous function to wrap. - * This function will be passed any arguments passed to the returned wrapper. - * Invoked with (...args, callback). - * @returns {AsyncFunction} The wrapped function, which when invoked, will - * retry on an error, based on the parameters specified in `opts`. - * This function will accept the same parameters as `task`. - * @example - * - * async.auto({ - * dep1: async.retryable(3, getFromFlakyService), - * process: ["dep1", async.retryable(3, function (results, cb) { - * maybeProcessData(results.dep1, cb); - * })] - * }, callback); - */ -function retryable (opts, task) { - if (!task) { - task = opts; - opts = null; - } - let arity = (opts && opts.arity) || task.length; - if (isAsync(task)) { - arity += 1; - } - var _task = wrapAsync(task); - return initialParams((args, callback) => { - if (args.length < arity - 1 || callback == null) { - args.push(callback); - callback = promiseCallback(); - } - function taskFn(cb) { - _task(...args, cb); - } - - if (opts) retry(opts, taskFn, callback); - else retry(taskFn, callback); - - return callback[PROMISE_SYMBOL] - }); -} - -/** - * Run the functions in the `tasks` collection in series, each one running once - * the previous function has completed. If any functions in the series pass an - * error to its callback, no more functions are run, and `callback` is - * immediately called with the value of the error. Otherwise, `callback` - * receives an array of results when `tasks` have completed. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function, and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.series}. - * - * **Note** that while many implementations preserve the order of object - * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) - * explicitly states that - * - * > The mechanics and order of enumerating the properties is not specified. - * - * So if you rely on the order in which your series of functions are executed, - * and want this to work on all platforms, consider using an array. - * - * @name series - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing - * [async functions]{@link AsyncFunction} to run in series. - * Each function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This function gets a results array (or object) - * containing all the result arguments passed to the `task` callbacks. Invoked - * with (err, result). - * @return {Promise} a promise, if no callback is passed - * @example - * - * //Using Callbacks - * async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] - * }); - * - * // an example using objects instead of arrays - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.series([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function series(tasks, callback) { - return parallel(eachOfSeries$1, tasks, callback); -} - -/** - * Returns `true` if at least one element in the `coll` satisfies an async test. - * If any iteratee call returns `true`, the main `callback` is immediately - * called. - * - * @name some - * @static - * @memberOf module:Collections - * @method - * @alias any - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - *); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // false - * // result is false since none of the files exists - * } - *); - * - * // Using Promises - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since some file in the list exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since none of the files exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); - * console.log(result); - * // false - * // result is false since none of the files exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function some(coll, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOf$1, coll, iteratee, callback) -} -var some$1 = awaitify(some, 3); - -/** - * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. - * - * @name someLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anyLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someLimit(coll, limit, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOfLimit(limit), coll, iteratee, callback) -} -var someLimit$1 = awaitify(someLimit, 4); - -/** - * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. - * - * @name someSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anySeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in series. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someSeries(coll, iteratee, callback) { - return _createTester(Boolean, res => res)(eachOfSeries$1, coll, iteratee, callback) -} -var someSeries$1 = awaitify(someSeries, 3); - -/** - * Sorts a list by the results of running each `coll` value through an async - * `iteratee`. - * - * @name sortBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a value to use as the sort criteria as - * its `result`. - * Invoked with (item, callback). - * @param {Function} callback - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is the items - * from the original `coll` sorted by the values returned by the `iteratee` - * calls. Invoked with (err, results). - * @returns {Promise} a promise, if no callback passed - * @example - * - * // bigfile.txt is a file that is 251100 bytes in size - * // mediumfile.txt is a file that is 11000 bytes in size - * // smallfile.txt is a file that is 121 bytes in size - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // By modifying the callback parameter the - * // sorting order can be influenced: - * - * // ascending order - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) return callback(getFileSizeErr); - * callback(null, fileSize); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // descending order - * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) { - * return callback(getFileSizeErr); - * } - * callback(null, fileSize * -1); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] - * } - * } - * ); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * } - * ); - * - * // Using Promises - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * (async () => { - * try { - * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * // Error handling - * async () => { - * try { - * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function sortBy (coll, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return map$1(coll, (x, iterCb) => { - _iteratee(x, (err, criteria) => { - if (err) return iterCb(err); - iterCb(err, {value: x, criteria}); - }); - }, (err, results) => { - if (err) return callback(err); - callback(null, results.sort(comparator).map(v => v.value)); - }); - - function comparator(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - } -} -var sortBy$1 = awaitify(sortBy, 3); - -/** - * Sets a time limit on an asynchronous function. If the function does not call - * its callback within the specified milliseconds, it will be called with a - * timeout error. The code property for the error object will be `'ETIMEDOUT'`. - * - * @name timeout - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} asyncFn - The async function to limit in time. - * @param {number} milliseconds - The specified time limit. - * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) - * to timeout Error for more information.. - * @returns {AsyncFunction} Returns a wrapped function that can be used with any - * of the control flow functions. - * Invoke this function with the same parameters as you would `asyncFunc`. - * @example - * - * function myFunction(foo, callback) { - * doAsyncTask(foo, function(err, data) { - * // handle errors - * if (err) return callback(err); - * - * // do some stuff ... - * - * // return processed data - * return callback(null, data); - * }); - * } - * - * var wrapped = async.timeout(myFunction, 1000); - * - * // call `wrapped` as you would `myFunction` - * wrapped({ bar: 'bar' }, function(err, data) { - * // if `myFunction` takes < 1000 ms to execute, `err` - * // and `data` will have their expected values - * - * // else `err` will be an Error with the code 'ETIMEDOUT' - * }); - */ -function timeout(asyncFn, milliseconds, info) { - var fn = wrapAsync(asyncFn); - - return initialParams((args, callback) => { - var timedOut = false; - var timer; - - function timeoutCallback() { - var name = asyncFn.name || 'anonymous'; - var error = new Error('Callback function "' + name + '" timed out.'); - error.code = 'ETIMEDOUT'; - if (info) { - error.info = info; - } - timedOut = true; - callback(error); - } - - args.push((...cbArgs) => { - if (!timedOut) { - callback(...cbArgs); - clearTimeout(timer); - } - }); - - // setup timer and call original function - timer = setTimeout(timeoutCallback, milliseconds); - fn(...args); - }); -} - -function range(size) { - var result = Array(size); - while (size--) { - result[size] = size; - } - return result; -} - -/** - * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a - * time. - * - * @name timesLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} count - The number of times to run the function. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see [async.map]{@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ -function timesLimit(count, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - return mapLimit$1(range(count), limit, _iteratee, callback); -} - -/** - * Calls the `iteratee` function `n` times, and accumulates results in the same - * manner you would use with [map]{@link module:Collections.map}. - * - * @name times - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.map]{@link module:Collections.map} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - * @example - * - * // Pretend this is some complicated async factory - * var createUser = function(id, callback) { - * callback(null, { - * id: 'user' + id - * }); - * }; - * - * // generate 5 users - * async.times(5, function(n, next) { - * createUser(n, function(err, user) { - * next(err, user); - * }); - * }, function(err, users) { - * // we should now have 5 users - * }); - */ -function times (n, iteratee, callback) { - return timesLimit(n, Infinity, iteratee, callback) -} - -/** - * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. - * - * @name timesSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ -function timesSeries (n, iteratee, callback) { - return timesLimit(n, 1, iteratee, callback) -} - -/** - * A relative of `reduce`. Takes an Object or Array, and iterates over each - * element in parallel, each step potentially mutating an `accumulator` value. - * The type of the accumulator defaults to the type of collection passed in. - * - * @name transform - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} [accumulator] - The initial state of the transform. If omitted, - * it will default to an empty Object or Array, depending on the type of `coll` - * @param {AsyncFunction} iteratee - A function applied to each item in the - * collection that potentially modifies the accumulator. - * Invoked with (accumulator, item, key, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the transformed accumulator. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileList, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * }); - * - * // Using Promises - * async.transform(fileList, transformFileSize) - * .then(result => { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * (async () => { - * try { - * let result = await async.transform(fileList, transformFileSize); - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileMap, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * }); - * - * // Using Promises - * async.transform(fileMap, transformFileSize) - * .then(result => { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.transform(fileMap, transformFileSize); - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function transform (coll, accumulator, iteratee, callback) { - if (arguments.length <= 3 && typeof accumulator === 'function') { - callback = iteratee; - iteratee = accumulator; - accumulator = Array.isArray(coll) ? [] : {}; - } - callback = once(callback || promiseCallback()); - var _iteratee = wrapAsync(iteratee); - - eachOf$1(coll, (v, k, cb) => { - _iteratee(accumulator, v, k, cb); - }, err => callback(err, accumulator)); - return callback[PROMISE_SYMBOL] -} - -/** - * It runs each task in series but stops whenever any of the functions were - * successful. If one of the tasks were successful, the `callback` will be - * passed the result of the successful task. If all tasks fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name tryEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to - * run, each function is passed a `callback(err, result)` it must call on - * completion with an error `err` (which can be `null`) and an optional `result` - * value. - * @param {Function} [callback] - An optional callback which is called when one - * of the tasks has succeeded, or all have failed. It receives the `err` and - * `result` arguments of the last attempt at completing the `task`. Invoked with - * (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * async.tryEach([ - * function getDataFromFirstWebsite(callback) { - * // Try getting the data from the first website - * callback(err, data); - * }, - * function getDataFromSecondWebsite(callback) { - * // First website failed, - * // Try getting the data from the backup website - * callback(err, data); - * } - * ], - * // optional callback - * function(err, results) { - * Now do something with the data. - * }); - * - */ -function tryEach(tasks, callback) { - var error = null; - var result; - return eachSeries$1(tasks, (task, taskCb) => { - wrapAsync(task)((err, ...args) => { - if (err === false) return taskCb(err); - - if (args.length < 2) { - [result] = args; - } else { - result = args; - } - error = err; - taskCb(err ? null : {}); - }); - }, () => callback(error, result)); -} - -var tryEach$1 = awaitify(tryEach); - -/** - * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, - * unmemoized form. Handy for testing. - * - * @name unmemoize - * @static - * @memberOf module:Utils - * @method - * @see [async.memoize]{@link module:Utils.memoize} - * @category Util - * @param {AsyncFunction} fn - the memoized function - * @returns {AsyncFunction} a function that calls the original unmemoized function - */ -function unmemoize(fn) { - return (...args) => { - return (fn.unmemoized || fn)(...args); - }; -} - -/** - * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. - * - * @name whilst - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` passes. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - * @example - * - * var count = 0; - * async.whilst( - * function test(cb) { cb(null, count < 5); }, - * function iter(callback) { - * count++; - * setTimeout(function() { - * callback(null, count); - * }, 1000); - * }, - * function (err, n) { - * // 5 seconds have passed, n = 5 - * } - * ); - */ -function whilst(test, iteratee, callback) { - callback = onlyOnce(callback); - var _fn = wrapAsync(iteratee); - var _test = wrapAsync(test); - var results = []; - - function next(err, ...rest) { - if (err) return callback(err); - results = rest; - if (err === false) return; - _test(check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return _test(check); -} -var whilst$1 = awaitify(whilst, 3); - -/** - * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. `callback` will be passed an error and any - * arguments passed to the final `iteratee`'s callback. - * - * The inverse of [whilst]{@link module:ControlFlow.whilst}. - * - * @name until - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (callback). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * const results = [] - * let finished = false - * async.until(function test(cb) { - * cb(null, finished) - * }, function iter(next) { - * fetchPage(url, (err, body) => { - * if (err) return next(err) - * results = results.concat(body.objects) - * finished = !!body.next - * next(err) - * }) - * }, function done (err) { - * // all pages have been fetched - * }) - */ -function until(test, iteratee, callback) { - const _test = wrapAsync(test); - return whilst$1((cb) => _test((err, truth) => cb (err, !truth)), iteratee, callback); -} - -/** - * Runs the `tasks` array of functions in series, each passing their results to - * the next in the array. However, if any of the `tasks` pass an error to their - * own callback, the next function is not executed, and the main `callback` is - * immediately called with the error. - * - * @name waterfall - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} - * to run. - * Each function should complete with any number of `result` values. - * The `result` values will be passed as arguments, in order, to the next task. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This will be passed the results of the last task's - * callback. Invoked with (err, [results]). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.waterfall([ - * function(callback) { - * callback(null, 'one', 'two'); - * }, - * function(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * }, - * function(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - * ], function (err, result) { - * // result now equals 'done' - * }); - * - * // Or, with named functions: - * async.waterfall([ - * myFirstFunction, - * mySecondFunction, - * myLastFunction, - * ], function (err, result) { - * // result now equals 'done' - * }); - * function myFirstFunction(callback) { - * callback(null, 'one', 'two'); - * } - * function mySecondFunction(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * } - * function myLastFunction(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - */ -function waterfall (tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); - if (!tasks.length) return callback(); - var taskIndex = 0; - - function nextTask(args) { - var task = wrapAsync(tasks[taskIndex++]); - task(...args, onlyOnce(next)); - } - - function next(err, ...args) { - if (err === false) return - if (err || taskIndex === tasks.length) { - return callback(err, ...args); - } - nextTask(args); - } - - nextTask([]); -} - -var waterfall$1 = awaitify(waterfall); - -/** - * An "async function" in the context of Async is an asynchronous function with - * a variable number of parameters, with the final parameter being a callback. - * (`function (arg1, arg2, ..., callback) {}`) - * The final callback is of the form `callback(err, results...)`, which must be - * called once the function is completed. The callback should be called with a - * Error as its first argument to signal that an error occurred. - * Otherwise, if no error occurred, it should be called with `null` as the first - * argument, and any additional `result` arguments that may apply, to signal - * successful completion. - * The callback must be called exactly once, ideally on a later tick of the - * JavaScript event loop. - * - * This type of function is also referred to as a "Node-style async function", - * or a "continuation passing-style function" (CPS). Most of the methods of this - * library are themselves CPS/Node-style async functions, or functions that - * return CPS/Node-style async functions. - * - * Wherever we accept a Node-style async function, we also directly accept an - * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. - * In this case, the `async` function will not be passed a final callback - * argument, and any thrown error will be used as the `err` argument of the - * implicit callback, and the return value will be used as the `result` value. - * (i.e. a `rejected` of the returned Promise becomes the `err` callback - * argument, and a `resolved` value becomes the `result`.) - * - * Note, due to JavaScript limitations, we can only detect native `async` - * functions and not transpilied implementations. - * Your environment must have `async`/`await` support for this to work. - * (e.g. Node > v7.6, or a recent version of a modern browser). - * If you are using `async` functions through a transpiler (e.g. Babel), you - * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, - * because the `async function` will be compiled to an ordinary function that - * returns a promise. - * - * @typedef {Function} AsyncFunction - * @static - */ - -var index = { - apply, - applyEach: applyEach$1, - applyEachSeries, - asyncify, - auto, - autoInject, - cargo, - cargoQueue: cargo$1, - compose, - concat: concat$1, - concatLimit: concatLimit$1, - concatSeries: concatSeries$1, - constant, - detect: detect$1, - detectLimit: detectLimit$1, - detectSeries: detectSeries$1, - dir, - doUntil, - doWhilst: doWhilst$1, - each, - eachLimit: eachLimit$2, - eachOf: eachOf$1, - eachOfLimit: eachOfLimit$2, - eachOfSeries: eachOfSeries$1, - eachSeries: eachSeries$1, - ensureAsync, - every: every$1, - everyLimit: everyLimit$1, - everySeries: everySeries$1, - filter: filter$1, - filterLimit: filterLimit$1, - filterSeries: filterSeries$1, - forever: forever$1, - groupBy, - groupByLimit: groupByLimit$1, - groupBySeries, - log, - map: map$1, - mapLimit: mapLimit$1, - mapSeries: mapSeries$1, - mapValues, - mapValuesLimit: mapValuesLimit$1, - mapValuesSeries, - memoize, - nextTick, - parallel: parallel$1, - parallelLimit, - priorityQueue, - queue: queue$1, - race: race$1, - reduce: reduce$1, - reduceRight, - reflect, - reflectAll, - reject: reject$2, - rejectLimit: rejectLimit$1, - rejectSeries: rejectSeries$1, - retry, - retryable, - seq, - series, - setImmediate: setImmediate$1, - some: some$1, - someLimit: someLimit$1, - someSeries: someSeries$1, - sortBy: sortBy$1, - timeout, - times, - timesLimit, - timesSeries, - transform, - tryEach: tryEach$1, - unmemoize, - until, - waterfall: waterfall$1, - whilst: whilst$1, - - // aliases - all: every$1, - allLimit: everyLimit$1, - allSeries: everySeries$1, - any: some$1, - anyLimit: someLimit$1, - anySeries: someSeries$1, - find: detect$1, - findLimit: detectLimit$1, - findSeries: detectSeries$1, - flatMap: concat$1, - flatMapLimit: concatLimit$1, - flatMapSeries: concatSeries$1, - forEach: each, - forEachSeries: eachSeries$1, - forEachLimit: eachLimit$2, - forEachOf: eachOf$1, - forEachOfSeries: eachOfSeries$1, - forEachOfLimit: eachOfLimit$2, - inject: reduce$1, - foldl: reduce$1, - foldr: reduceRight, - select: filter$1, - selectLimit: filterLimit$1, - selectSeries: filterSeries$1, - wrapSync: asyncify, - during: whilst$1, - doDuring: doWhilst$1 -}; - -export default index; -export { apply, applyEach$1 as applyEach, applyEachSeries, asyncify, auto, autoInject, cargo, cargo$1 as cargoQueue, compose, concat$1 as concat, concatLimit$1 as concatLimit, concatSeries$1 as concatSeries, constant, detect$1 as detect, detectLimit$1 as detectLimit, detectSeries$1 as detectSeries, dir, doUntil, doWhilst$1 as doWhilst, each, eachLimit$2 as eachLimit, eachOf$1 as eachOf, eachOfLimit$2 as eachOfLimit, eachOfSeries$1 as eachOfSeries, eachSeries$1 as eachSeries, ensureAsync, every$1 as every, everyLimit$1 as everyLimit, everySeries$1 as everySeries, filter$1 as filter, filterLimit$1 as filterLimit, filterSeries$1 as filterSeries, forever$1 as forever, groupBy, groupByLimit$1 as groupByLimit, groupBySeries, log, map$1 as map, mapLimit$1 as mapLimit, mapSeries$1 as mapSeries, mapValues, mapValuesLimit$1 as mapValuesLimit, mapValuesSeries, memoize, nextTick, parallel$1 as parallel, parallelLimit, priorityQueue, queue$1 as queue, race$1 as race, reduce$1 as reduce, reduceRight, reflect, reflectAll, reject$2 as reject, rejectLimit$1 as rejectLimit, rejectSeries$1 as rejectSeries, retry, retryable, seq, series, setImmediate$1 as setImmediate, some$1 as some, someLimit$1 as someLimit, someSeries$1 as someSeries, sortBy$1 as sortBy, timeout, times, timesLimit, timesSeries, transform, tryEach$1 as tryEach, unmemoize, until, waterfall$1 as waterfall, whilst$1 as whilst, every$1 as all, everyLimit$1 as allLimit, everySeries$1 as allSeries, some$1 as any, someLimit$1 as anyLimit, someSeries$1 as anySeries, detect$1 as find, detectLimit$1 as findLimit, detectSeries$1 as findSeries, concat$1 as flatMap, concatLimit$1 as flatMapLimit, concatSeries$1 as flatMapSeries, each as forEach, eachSeries$1 as forEachSeries, eachLimit$2 as forEachLimit, eachOf$1 as forEachOf, eachOfSeries$1 as forEachOfSeries, eachOfLimit$2 as forEachOfLimit, reduce$1 as inject, reduce$1 as foldl, reduceRight as foldr, filter$1 as select, filterLimit$1 as selectLimit, filterSeries$1 as selectSeries, asyncify as wrapSync, whilst$1 as during, doWhilst$1 as doDuring }; diff --git a/node_modules/async/doDuring.js b/node_modules/async/doDuring.js deleted file mode 100644 index 4c98e9e1..00000000 --- a/node_modules/async/doDuring.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in - * the order of operations, the arguments `test` and `iteratee` are switched. - * - * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - * - * @name doWhilst - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - A function which is called each time `test` - * passes. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee`. - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. - * `callback` will be passed an error and any arguments passed to the final - * `iteratee`'s callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ -function doWhilst(iteratee, test, callback) { - callback = (0, _onlyOnce2.default)(callback); - var _fn = (0, _wrapAsync2.default)(iteratee); - var _test = (0, _wrapAsync2.default)(test); - var results; - - function next(err, ...args) { - if (err) return callback(err); - if (err === false) return; - results = args; - _test(...args, check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return check(null, true); -} - -exports.default = (0, _awaitify2.default)(doWhilst, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/doUntil.js b/node_modules/async/doUntil.js deleted file mode 100644 index 8aa09350..00000000 --- a/node_modules/async/doUntil.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = doUntil; - -var _doWhilst = require('./doWhilst.js'); - -var _doWhilst2 = _interopRequireDefault(_doWhilst); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the - * argument ordering differs from `until`. - * - * @name doUntil - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee` - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ -function doUntil(iteratee, test, callback) { - const _test = (0, _wrapAsync2.default)(test); - return (0, _doWhilst2.default)(iteratee, (...args) => { - const cb = args.pop(); - _test(...args, (err, truth) => cb(err, !truth)); - }, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/doWhilst.js b/node_modules/async/doWhilst.js deleted file mode 100644 index 4c98e9e1..00000000 --- a/node_modules/async/doWhilst.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in - * the order of operations, the arguments `test` and `iteratee` are switched. - * - * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - * - * @name doWhilst - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - A function which is called each time `test` - * passes. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee`. - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. - * `callback` will be passed an error and any arguments passed to the final - * `iteratee`'s callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ -function doWhilst(iteratee, test, callback) { - callback = (0, _onlyOnce2.default)(callback); - var _fn = (0, _wrapAsync2.default)(iteratee); - var _test = (0, _wrapAsync2.default)(test); - var results; - - function next(err, ...args) { - if (err) return callback(err); - if (err === false) return; - results = args; - _test(...args, check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return check(null, true); -} - -exports.default = (0, _awaitify2.default)(doWhilst, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/during.js b/node_modules/async/during.js deleted file mode 100644 index 32a47762..00000000 --- a/node_modules/async/during.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. - * - * @name whilst - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` passes. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - * @example - * - * var count = 0; - * async.whilst( - * function test(cb) { cb(null, count < 5); }, - * function iter(callback) { - * count++; - * setTimeout(function() { - * callback(null, count); - * }, 1000); - * }, - * function (err, n) { - * // 5 seconds have passed, n = 5 - * } - * ); - */ -function whilst(test, iteratee, callback) { - callback = (0, _onlyOnce2.default)(callback); - var _fn = (0, _wrapAsync2.default)(iteratee); - var _test = (0, _wrapAsync2.default)(test); - var results = []; - - function next(err, ...rest) { - if (err) return callback(err); - results = rest; - if (err === false) return; - _test(check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return _test(check); -} -exports.default = (0, _awaitify2.default)(whilst, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/each.js b/node_modules/async/each.js deleted file mode 100644 index 405d495c..00000000 --- a/node_modules/async/each.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _withoutIndex = require('./internal/withoutIndex.js'); - -var _withoutIndex2 = _interopRequireDefault(_withoutIndex); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Applies the function `iteratee` to each item in `coll`, in parallel. - * The `iteratee` is called with an item from the list, and a callback for when - * it has finished. If the `iteratee` passes an error to its `callback`, the - * main `callback` (for the `each` function) is immediately called with the - * error. - * - * Note, that since this function applies `iteratee` to each item in parallel, - * there is no guarantee that the iteratee functions will complete in order. - * - * @name each - * @static - * @memberOf module:Collections - * @method - * @alias forEach - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to - * each item in `coll`. Invoked with (item, callback). - * The array index is not passed to the iteratee. - * If you need the index, use `eachOf`. - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; - * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; - * - * // asynchronous function that deletes a file - * const deleteFile = function(file, callback) { - * fs.unlink(file, callback); - * }; - * - * // Using callbacks - * async.each(fileList, deleteFile, function(err) { - * if( err ) { - * console.log(err); - * } else { - * console.log('All files have been deleted successfully'); - * } - * }); - * - * // Error Handling - * async.each(withMissingFileList, deleteFile, function(err){ - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using Promises - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using async/await - * async () => { - * try { - * await async.each(files, deleteFile); - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * await async.each(withMissingFileList, deleteFile); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * } - * } - * - */ -function eachLimit(coll, iteratee, callback) { - return (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); -} - -exports.default = (0, _awaitify2.default)(eachLimit, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachLimit.js b/node_modules/async/eachLimit.js deleted file mode 100644 index 5f3d0094..00000000 --- a/node_modules/async/eachLimit.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _withoutIndex = require('./internal/withoutIndex.js'); - -var _withoutIndex2 = _interopRequireDefault(_withoutIndex); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. - * - * @name eachLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfLimit`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachLimit(coll, limit, iteratee, callback) { - return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); -} -exports.default = (0, _awaitify2.default)(eachLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOf.js b/node_modules/async/eachOf.js deleted file mode 100644 index c22614f3..00000000 --- a/node_modules/async/eachOf.js +++ /dev/null @@ -1,185 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _isArrayLike = require('./internal/isArrayLike.js'); - -var _isArrayLike2 = _interopRequireDefault(_isArrayLike); - -var _breakLoop = require('./internal/breakLoop.js'); - -var _breakLoop2 = _interopRequireDefault(_breakLoop); - -var _eachOfLimit = require('./eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eachOf implementation optimized for array-likes -function eachOfArrayLike(coll, iteratee, callback) { - callback = (0, _once2.default)(callback); - var index = 0, - completed = 0, - { length } = coll, - canceled = false; - if (length === 0) { - callback(null); - } - - function iteratorCallback(err, value) { - if (err === false) { - canceled = true; - } - if (canceled === true) return; - if (err) { - callback(err); - } else if (++completed === length || value === _breakLoop2.default) { - callback(null); - } - } - - for (; index < length; index++) { - iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback)); - } -} - -// a generic version of eachOf which can handle array, object, and iterator cases. -function eachOfGeneric(coll, iteratee, callback) { - return (0, _eachOfLimit2.default)(coll, Infinity, iteratee, callback); -} - -/** - * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument - * to the iteratee. - * - * @name eachOf - * @static - * @memberOf module:Collections - * @method - * @alias forEachOf - * @category Collection - * @see [async.each]{@link module:Collections.each} - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each - * item in `coll`. - * The `key` is the item's key, or index in the case of an array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dev.json is a file containing a valid json object config for dev environment - * // dev.json is a file containing a valid json object config for test environment - * // prod.json is a file containing a valid json object config for prod environment - * // invalid.json is a file with a malformed json object - * - * let configs = {}; //global variable - * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; - * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; - * - * // asynchronous function that reads a json file and parses the contents as json object - * function parseFile(file, key, callback) { - * fs.readFile(file, "utf8", function(err, data) { - * if (err) return calback(err); - * try { - * configs[key] = JSON.parse(data); - * } catch (e) { - * return callback(e); - * } - * callback(); - * }); - * } - * - * // Using callbacks - * async.forEachOf(validConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * } else { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * // JSON parse error exception - * } else { - * console.log(configs); - * } - * }); - * - * // Using Promises - * async.forEachOf(validConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * }).catch( err => { - * console.error(err); - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * }).catch( err => { - * console.error(err); - * // JSON parse error exception - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.forEachOf(validConfigFileMap, parseFile); - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * catch (err) { - * console.log(err); - * } - * } - * - * //Error handing - * async () => { - * try { - * let result = await async.forEachOf(invalidConfigFileMap, parseFile); - * console.log(configs); - * } - * catch (err) { - * console.log(err); - * // JSON parse error exception - * } - * } - * - */ -function eachOf(coll, iteratee, callback) { - var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric; - return eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback); -} - -exports.default = (0, _awaitify2.default)(eachOf, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOfLimit.js b/node_modules/async/eachOfLimit.js deleted file mode 100644 index e9fc4db8..00000000 --- a/node_modules/async/eachOfLimit.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit2 = require('./internal/eachOfLimit.js'); - -var _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a - * time. - * - * @name eachOfLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. The `key` is the item's key, or index in the case of an - * array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfLimit(coll, limit, iteratee, callback) { - return (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); -} - -exports.default = (0, _awaitify2.default)(eachOfLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachOfSeries.js b/node_modules/async/eachOfSeries.js deleted file mode 100644 index cfb0f33c..00000000 --- a/node_modules/async/eachOfSeries.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit = require('./eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. - * - * @name eachOfSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfSeries(coll, iteratee, callback) { - return (0, _eachOfLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(eachOfSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/eachSeries.js b/node_modules/async/eachSeries.js deleted file mode 100644 index d674d0c3..00000000 --- a/node_modules/async/eachSeries.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachLimit = require('./eachLimit.js'); - -var _eachLimit2 = _interopRequireDefault(_eachLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. - * - * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item - * in series and therefore the iteratee functions will complete in order. - - * @name eachSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfSeries`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachSeries(coll, iteratee, callback) { - return (0, _eachLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(eachSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/ensureAsync.js b/node_modules/async/ensureAsync.js deleted file mode 100644 index ad8beb52..00000000 --- a/node_modules/async/ensureAsync.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = ensureAsync; - -var _setImmediate = require('./internal/setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Wrap an async function and ensure it calls its callback on a later tick of - * the event loop. If the function already calls its callback on a next tick, - * no extra deferral is added. This is useful for preventing stack overflows - * (`RangeError: Maximum call stack size exceeded`) and generally keeping - * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) - * contained. ES2017 `async` functions are returned as-is -- they are immune - * to Zalgo's corrupting influences, as they always resolve on a later tick. - * - * @name ensureAsync - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - an async function, one that expects a node-style - * callback as its last argument. - * @returns {AsyncFunction} Returns a wrapped function with the exact same call - * signature as the function passed in. - * @example - * - * function sometimesAsync(arg, callback) { - * if (cache[arg]) { - * return callback(null, cache[arg]); // this would be synchronous!! - * } else { - * doSomeIO(arg, callback); // this IO would be asynchronous - * } - * } - * - * // this has a risk of stack overflows if many results are cached in a row - * async.mapSeries(args, sometimesAsync, done); - * - * // this will defer sometimesAsync's callback if necessary, - * // preventing stack overflows - * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); - */ -function ensureAsync(fn) { - if ((0, _wrapAsync.isAsync)(fn)) return fn; - return function (...args /*, callback*/) { - var callback = args.pop(); - var sync = true; - args.push((...innerArgs) => { - if (sync) { - (0, _setImmediate2.default)(() => callback(...innerArgs)); - } else { - callback(...innerArgs); - } - }); - fn.apply(this, args); - sync = false; - }; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/every.js b/node_modules/async/every.js deleted file mode 100644 index 148db683..00000000 --- a/node_modules/async/every.js +++ /dev/null @@ -1,119 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns `true` if every element in `coll` satisfies an async test. If any - * iteratee call returns `false`, the main `callback` is immediately called. - * - * @name every - * @static - * @memberOf module:Collections - * @method - * @alias all - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file5.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.every(fileList, fileExists, function(err, result) { - * console.log(result); - * // true - * // result is true since every file exists - * }); - * - * async.every(withMissingFileList, fileExists, function(err, result) { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }); - * - * // Using Promises - * async.every(fileList, fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.every(withMissingFileList, fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since NOT every file exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.every(fileList, fileExists); - * console.log(result); - * // true - * // result is true since every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.every(withMissingFileList, fileExists); - * console.log(result); - * // false - * // result is false since NOT every file exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function every(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(every, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/everyLimit.js b/node_modules/async/everyLimit.js deleted file mode 100644 index 25b2c089..00000000 --- a/node_modules/async/everyLimit.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. - * - * @name everyLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everyLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(everyLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/everySeries.js b/node_modules/async/everySeries.js deleted file mode 100644 index 147c3dc5..00000000 --- a/node_modules/async/everySeries.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. - * - * @name everySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in series. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function everySeries(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => !bool, res => !res)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(everySeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filter.js b/node_modules/async/filter.js deleted file mode 100644 index 303dc1fb..00000000 --- a/node_modules/async/filter.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns a new array of all the values in `coll` which pass an async truth - * test. This operation is performed in parallel, but the results array will be - * in the same order as the original. - * - * @name filter - * @static - * @memberOf module:Collections - * @method - * @alias select - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.filter(files, fileExists, function(err, results) { - * if(err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * }); - * - * // Using Promises - * async.filter(files, fileExists) - * .then(results => { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.filter(files, fileExists); - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function filter(coll, iteratee, callback) { - return (0, _filter3.default)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filter, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filterLimit.js b/node_modules/async/filterLimit.js deleted file mode 100644 index 89e55f53..00000000 --- a/node_modules/async/filterLimit.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a - * time. - * - * @name filterLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - */ -function filterLimit(coll, limit, iteratee, callback) { - return (0, _filter3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filterLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/filterSeries.js b/node_modules/async/filterSeries.js deleted file mode 100644 index a045e52c..00000000 --- a/node_modules/async/filterSeries.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. - * - * @name filterSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results) - * @returns {Promise} a promise, if no callback provided - */ -function filterSeries(coll, iteratee, callback) { - return (0, _filter3.default)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filterSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/find.js b/node_modules/async/find.js deleted file mode 100644 index 05b2e5c6..00000000 --- a/node_modules/async/find.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns the first value in `coll` that passes an async truth test. The - * `iteratee` is applied in parallel, meaning the first iteratee to return - * `true` will fire the detect `callback` with that result. That means the - * result might not be the first item in the original `coll` (in terms of order) - * that passes the test. - - * If order within the original `coll` is important, then look at - * [`detectSeries`]{@link module:Collections.detectSeries}. - * - * @name detect - * @static - * @memberOf module:Collections - * @method - * @alias find - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * } - *); - * - * // Using Promises - * async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists) - * .then(result => { - * console.log(result); - * // dir1/file1.txt - * // result now equals the first file in the list that exists - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.detect(['file3.txt','file2.txt','dir1/file1.txt'], fileExists); - * console.log(result); - * // dir1/file1.txt - * // result now equals the file in the list that exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function detect(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(detect, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/findLimit.js b/node_modules/async/findLimit.js deleted file mode 100644 index db6961ec..00000000 --- a/node_modules/async/findLimit.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a - * time. - * - * @name detectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findLimit - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(detectLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/findSeries.js b/node_modules/async/findSeries.js deleted file mode 100644 index b9131b4a..00000000 --- a/node_modules/async/findSeries.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. - * - * @name detectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findSeries - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns {Promise} a promise, if a callback is omitted - */ -function detectSeries(coll, iteratee, callback) { - return (0, _createTester2.default)(bool => bool, (res, item) => item)((0, _eachOfLimit2.default)(1), coll, iteratee, callback); -} - -exports.default = (0, _awaitify2.default)(detectSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMap.js b/node_modules/async/flatMap.js deleted file mode 100644 index 8eed1ac8..00000000 --- a/node_modules/async/flatMap.js +++ /dev/null @@ -1,115 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _concatLimit = require('./concatLimit.js'); - -var _concatLimit2 = _interopRequireDefault(_concatLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Applies `iteratee` to each item in `coll`, concatenating the results. Returns - * the concatenated list. The `iteratee`s are called in parallel, and the - * results are concatenated as they return. The results array will be returned in - * the original order of `coll` passed to the `iteratee` function. - * - * @name concat - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @alias flatMap - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * let directoryList = ['dir1','dir2','dir3']; - * let withMissingDirectoryList = ['dir1','dir2','dir3', 'dir4']; - * - * // Using callbacks - * async.concat(directoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.concat(directoryList, fs.readdir) - * .then(results => { - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Error Handling - * async.concat(withMissingDirectoryList, fs.readdir) - * .then(results => { - * console.log(results); - * }).catch(err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.concat(directoryList, fs.readdir); - * console.log(results); - * // [ 'file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', file5.txt ] - * } catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.concat(withMissingDirectoryList, fs.readdir); - * console.log(results); - * } catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4 does not exist - * } - * } - * - */ -function concat(coll, iteratee, callback) { - return (0, _concatLimit2.default)(coll, Infinity, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(concat, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMapLimit.js b/node_modules/async/flatMapLimit.js deleted file mode 100644 index 3d170f17..00000000 --- a/node_modules/async/flatMapLimit.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _mapLimit = require('./mapLimit.js'); - -var _mapLimit2 = _interopRequireDefault(_mapLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. - * - * @name concatLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapLimit - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatLimit(coll, limit, iteratee, callback) { - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { - _iteratee(val, (err, ...args) => { - if (err) return iterCb(err); - return iterCb(err, args); - }); - }, (err, mapResults) => { - var result = []; - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - result = result.concat(...mapResults[i]); - } - } - - return callback(err, result); - }); -} -exports.default = (0, _awaitify2.default)(concatLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/flatMapSeries.js b/node_modules/async/flatMapSeries.js deleted file mode 100644 index 84add3b0..00000000 --- a/node_modules/async/flatMapSeries.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _concatLimit = require('./concatLimit.js'); - -var _concatLimit2 = _interopRequireDefault(_concatLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. - * - * @name concatSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapSeries - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. - * The iteratee should complete with an array an array of results. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ -function concatSeries(coll, iteratee, callback) { - return (0, _concatLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(concatSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/foldl.js b/node_modules/async/foldl.js deleted file mode 100644 index 56e2db81..00000000 --- a/node_modules/async/foldl.js +++ /dev/null @@ -1,153 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Reduces `coll` into a single value using an async `iteratee` to return each - * successive step. `memo` is the initial state of the reduction. This function - * only operates in series. - * - * For performance reasons, it may make sense to split a call to this function - * into a parallel map, and then use the normal `Array.prototype.reduce` on the - * results. This function is for situations where each step in the reduction - * needs to be async; if you can get the data before reducing it, then it's - * probably a good idea to do so. - * - * @name reduce - * @static - * @memberOf module:Collections - * @method - * @alias inject - * @alias foldl - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; - * - * // asynchronous function that computes the file size in bytes - * // file size is added to the memoized value, then returned - * function getFileSizeInBytes(memo, file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, memo + stat.size); - * }); - * } - * - * // Using callbacks - * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.reduce(fileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.reduce(fileList, 0, getFileSizeInBytes); - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function reduce(coll, memo, iteratee, callback) { - callback = (0, _once2.default)(callback); - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { - _iteratee(memo, x, (err, v) => { - memo = v; - iterCb(err); - }); - }, err => callback(err, memo)); -} -exports.default = (0, _awaitify2.default)(reduce, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/foldr.js b/node_modules/async/foldr.js deleted file mode 100644 index bee5391d..00000000 --- a/node_modules/async/foldr.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reduceRight; - -var _reduce = require('./reduce.js'); - -var _reduce2 = _interopRequireDefault(_reduce); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. - * - * @name reduceRight - * @static - * @memberOf module:Collections - * @method - * @see [async.reduce]{@link module:Collections.reduce} - * @alias foldr - * @category Collection - * @param {Array} array - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function reduceRight(array, memo, iteratee, callback) { - var reversed = [...array].reverse(); - return (0, _reduce2.default)(reversed, memo, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEach.js b/node_modules/async/forEach.js deleted file mode 100644 index 405d495c..00000000 --- a/node_modules/async/forEach.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _withoutIndex = require('./internal/withoutIndex.js'); - -var _withoutIndex2 = _interopRequireDefault(_withoutIndex); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Applies the function `iteratee` to each item in `coll`, in parallel. - * The `iteratee` is called with an item from the list, and a callback for when - * it has finished. If the `iteratee` passes an error to its `callback`, the - * main `callback` (for the `each` function) is immediately called with the - * error. - * - * Note, that since this function applies `iteratee` to each item in parallel, - * there is no guarantee that the iteratee functions will complete in order. - * - * @name each - * @static - * @memberOf module:Collections - * @method - * @alias forEach - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to - * each item in `coll`. Invoked with (item, callback). - * The array index is not passed to the iteratee. - * If you need the index, use `eachOf`. - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const fileList = [ 'dir1/file2.txt', 'dir2/file3.txt', 'dir/file5.txt']; - * const withMissingFileList = ['dir1/file1.txt', 'dir4/file2.txt']; - * - * // asynchronous function that deletes a file - * const deleteFile = function(file, callback) { - * fs.unlink(file, callback); - * }; - * - * // Using callbacks - * async.each(fileList, deleteFile, function(err) { - * if( err ) { - * console.log(err); - * } else { - * console.log('All files have been deleted successfully'); - * } - * }); - * - * // Error Handling - * async.each(withMissingFileList, deleteFile, function(err){ - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using Promises - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.each(fileList, deleteFile) - * .then( () => { - * console.log('All files have been deleted successfully'); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * }); - * - * // Using async/await - * async () => { - * try { - * await async.each(files, deleteFile); - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * await async.each(withMissingFileList, deleteFile); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * // since dir4/file2.txt does not exist - * // dir1/file1.txt could have been deleted - * } - * } - * - */ -function eachLimit(coll, iteratee, callback) { - return (0, _eachOf2.default)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); -} - -exports.default = (0, _awaitify2.default)(eachLimit, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachLimit.js b/node_modules/async/forEachLimit.js deleted file mode 100644 index 5f3d0094..00000000 --- a/node_modules/async/forEachLimit.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _withoutIndex = require('./internal/withoutIndex.js'); - -var _withoutIndex2 = _interopRequireDefault(_withoutIndex); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. - * - * @name eachLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfLimit`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachLimit(coll, limit, iteratee, callback) { - return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback); -} -exports.default = (0, _awaitify2.default)(eachLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOf.js b/node_modules/async/forEachOf.js deleted file mode 100644 index c22614f3..00000000 --- a/node_modules/async/forEachOf.js +++ /dev/null @@ -1,185 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _isArrayLike = require('./internal/isArrayLike.js'); - -var _isArrayLike2 = _interopRequireDefault(_isArrayLike); - -var _breakLoop = require('./internal/breakLoop.js'); - -var _breakLoop2 = _interopRequireDefault(_breakLoop); - -var _eachOfLimit = require('./eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// eachOf implementation optimized for array-likes -function eachOfArrayLike(coll, iteratee, callback) { - callback = (0, _once2.default)(callback); - var index = 0, - completed = 0, - { length } = coll, - canceled = false; - if (length === 0) { - callback(null); - } - - function iteratorCallback(err, value) { - if (err === false) { - canceled = true; - } - if (canceled === true) return; - if (err) { - callback(err); - } else if (++completed === length || value === _breakLoop2.default) { - callback(null); - } - } - - for (; index < length; index++) { - iteratee(coll[index], index, (0, _onlyOnce2.default)(iteratorCallback)); - } -} - -// a generic version of eachOf which can handle array, object, and iterator cases. -function eachOfGeneric(coll, iteratee, callback) { - return (0, _eachOfLimit2.default)(coll, Infinity, iteratee, callback); -} - -/** - * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument - * to the iteratee. - * - * @name eachOf - * @static - * @memberOf module:Collections - * @method - * @alias forEachOf - * @category Collection - * @see [async.each]{@link module:Collections.each} - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each - * item in `coll`. - * The `key` is the item's key, or index in the case of an array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // dev.json is a file containing a valid json object config for dev environment - * // dev.json is a file containing a valid json object config for test environment - * // prod.json is a file containing a valid json object config for prod environment - * // invalid.json is a file with a malformed json object - * - * let configs = {}; //global variable - * let validConfigFileMap = {dev: 'dev.json', test: 'test.json', prod: 'prod.json'}; - * let invalidConfigFileMap = {dev: 'dev.json', test: 'test.json', invalid: 'invalid.json'}; - * - * // asynchronous function that reads a json file and parses the contents as json object - * function parseFile(file, key, callback) { - * fs.readFile(file, "utf8", function(err, data) { - * if (err) return calback(err); - * try { - * configs[key] = JSON.parse(data); - * } catch (e) { - * return callback(e); - * } - * callback(); - * }); - * } - * - * // Using callbacks - * async.forEachOf(validConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * } else { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile, function (err) { - * if (err) { - * console.error(err); - * // JSON parse error exception - * } else { - * console.log(configs); - * } - * }); - * - * // Using Promises - * async.forEachOf(validConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * }).catch( err => { - * console.error(err); - * }); - * - * //Error handing - * async.forEachOf(invalidConfigFileMap, parseFile) - * .then( () => { - * console.log(configs); - * }).catch( err => { - * console.error(err); - * // JSON parse error exception - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.forEachOf(validConfigFileMap, parseFile); - * console.log(configs); - * // configs is now a map of JSON data, e.g. - * // { dev: //parsed dev.json, test: //parsed test.json, prod: //parsed prod.json} - * } - * catch (err) { - * console.log(err); - * } - * } - * - * //Error handing - * async () => { - * try { - * let result = await async.forEachOf(invalidConfigFileMap, parseFile); - * console.log(configs); - * } - * catch (err) { - * console.log(err); - * // JSON parse error exception - * } - * } - * - */ -function eachOf(coll, iteratee, callback) { - var eachOfImplementation = (0, _isArrayLike2.default)(coll) ? eachOfArrayLike : eachOfGeneric; - return eachOfImplementation(coll, (0, _wrapAsync2.default)(iteratee), callback); -} - -exports.default = (0, _awaitify2.default)(eachOf, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOfLimit.js b/node_modules/async/forEachOfLimit.js deleted file mode 100644 index e9fc4db8..00000000 --- a/node_modules/async/forEachOfLimit.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit2 = require('./internal/eachOfLimit.js'); - -var _eachOfLimit3 = _interopRequireDefault(_eachOfLimit2); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a - * time. - * - * @name eachOfLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. The `key` is the item's key, or index in the case of an - * array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfLimit(coll, limit, iteratee, callback) { - return (0, _eachOfLimit3.default)(limit)(coll, (0, _wrapAsync2.default)(iteratee), callback); -} - -exports.default = (0, _awaitify2.default)(eachOfLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachOfSeries.js b/node_modules/async/forEachOfSeries.js deleted file mode 100644 index cfb0f33c..00000000 --- a/node_modules/async/forEachOfSeries.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit = require('./eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. - * - * @name eachOfSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachOfSeries(coll, iteratee, callback) { - return (0, _eachOfLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(eachOfSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forEachSeries.js b/node_modules/async/forEachSeries.js deleted file mode 100644 index d674d0c3..00000000 --- a/node_modules/async/forEachSeries.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachLimit = require('./eachLimit.js'); - -var _eachLimit2 = _interopRequireDefault(_eachLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. - * - * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item - * in series and therefore the iteratee functions will complete in order. - - * @name eachSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfSeries`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ -function eachSeries(coll, iteratee, callback) { - return (0, _eachLimit2.default)(coll, 1, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(eachSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/forever.js b/node_modules/async/forever.js deleted file mode 100644 index 2c8d5b8f..00000000 --- a/node_modules/async/forever.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _ensureAsync = require('./ensureAsync.js'); - -var _ensureAsync2 = _interopRequireDefault(_ensureAsync); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Calls the asynchronous function `fn` with a callback parameter that allows it - * to call itself again, in series, indefinitely. - - * If an error is passed to the callback then `errback` is called with the - * error, and execution stops, otherwise it will never be called. - * - * @name forever - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} fn - an async function to call repeatedly. - * Invoked with (next). - * @param {Function} [errback] - when `fn` passes an error to it's callback, - * this function will be called, and execution stops. Invoked with (err). - * @returns {Promise} a promise that rejects if an error occurs and an errback - * is not passed - * @example - * - * async.forever( - * function(next) { - * // next is suitable for passing to things that need a callback(err [, whatever]); - * // it will result in this function being called again. - * }, - * function(err) { - * // if next is called with a value in its first parameter, it will appear - * // in here as 'err', and execution will stop. - * } - * ); - */ -function forever(fn, errback) { - var done = (0, _onlyOnce2.default)(errback); - var task = (0, _wrapAsync2.default)((0, _ensureAsync2.default)(fn)); - - function next(err) { - if (err) return done(err); - if (err === false) return; - task(next); - } - return next(); -} -exports.default = (0, _awaitify2.default)(forever, 2); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupBy.js b/node_modules/async/groupBy.js deleted file mode 100644 index 6bb52aaa..00000000 --- a/node_modules/async/groupBy.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = groupBy; - -var _groupByLimit = require('./groupByLimit.js'); - -var _groupByLimit2 = _interopRequireDefault(_groupByLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns a new object, where each value corresponds to an array of items, from - * `coll`, that returned the corresponding key. That is, the keys of the object - * correspond to the values passed to the `iteratee` callback. - * - * Note: Since this function applies the `iteratee` to each item in parallel, - * there is no guarantee that the `iteratee` functions will complete in order. - * However, the values for each key in the `result` will be in the same order as - * the original `coll`. For Objects, the values will roughly be in the order of - * the original Objects' keys (but this can vary across JavaScript engines). - * - * @name groupBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * const files = ['dir1/file1.txt','dir2','dir4'] - * - * // asynchronous function that detects file type as none, file, or directory - * function detectFile(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(null, 'none'); - * } - * callback(null, stat.isDirectory() ? 'directory' : 'file'); - * }); - * } - * - * //Using callbacks - * async.groupBy(files, detectFile, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * }); - * - * // Using Promises - * async.groupBy(files, detectFile) - * .then( result => { - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.groupBy(files, detectFile); - * console.log(result); - * // { - * // file: [ 'dir1/file1.txt' ], - * // none: [ 'dir4' ], - * // directory: [ 'dir2'] - * // } - * // result is object containing the files grouped by type - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function groupBy(coll, iteratee, callback) { - return (0, _groupByLimit2.default)(coll, Infinity, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupByLimit.js b/node_modules/async/groupByLimit.js deleted file mode 100644 index 5766d6e0..00000000 --- a/node_modules/async/groupByLimit.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _mapLimit = require('./mapLimit.js'); - -var _mapLimit2 = _interopRequireDefault(_mapLimit); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. - * - * @name groupByLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ -function groupByLimit(coll, limit, iteratee, callback) { - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _mapLimit2.default)(coll, limit, (val, iterCb) => { - _iteratee(val, (err, key) => { - if (err) return iterCb(err); - return iterCb(err, { key, val }); - }); - }, (err, mapResults) => { - var result = {}; - // from MDN, handle object having an `hasOwnProperty` prop - var { hasOwnProperty } = Object.prototype; - - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - var { key } = mapResults[i]; - var { val } = mapResults[i]; - - if (hasOwnProperty.call(result, key)) { - result[key].push(val); - } else { - result[key] = [val]; - } - } - } - - return callback(err, result); - }); -} - -exports.default = (0, _awaitify2.default)(groupByLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/groupBySeries.js b/node_modules/async/groupBySeries.js deleted file mode 100644 index 60567435..00000000 --- a/node_modules/async/groupBySeries.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = groupBySeries; - -var _groupByLimit = require('./groupByLimit.js'); - -var _groupByLimit2 = _interopRequireDefault(_groupByLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. - * - * @name groupBySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whose - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ -function groupBySeries(coll, iteratee, callback) { - return (0, _groupByLimit2.default)(coll, 1, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/index.js b/node_modules/async/index.js deleted file mode 100644 index ce647d59..00000000 --- a/node_modules/async/index.js +++ /dev/null @@ -1,588 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.doDuring = exports.during = exports.wrapSync = undefined; -exports.selectSeries = exports.selectLimit = exports.select = exports.foldr = exports.foldl = exports.inject = exports.forEachOfLimit = exports.forEachOfSeries = exports.forEachOf = exports.forEachLimit = exports.forEachSeries = exports.forEach = exports.flatMapSeries = exports.flatMapLimit = exports.flatMap = exports.findSeries = exports.findLimit = exports.find = exports.anySeries = exports.anyLimit = exports.any = exports.allSeries = exports.allLimit = exports.all = exports.whilst = exports.waterfall = exports.until = exports.unmemoize = exports.tryEach = exports.transform = exports.timesSeries = exports.timesLimit = exports.times = exports.timeout = exports.sortBy = exports.someSeries = exports.someLimit = exports.some = exports.setImmediate = exports.series = exports.seq = exports.retryable = exports.retry = exports.rejectSeries = exports.rejectLimit = exports.reject = exports.reflectAll = exports.reflect = exports.reduceRight = exports.reduce = exports.race = exports.queue = exports.priorityQueue = exports.parallelLimit = exports.parallel = exports.nextTick = exports.memoize = exports.mapValuesSeries = exports.mapValuesLimit = exports.mapValues = exports.mapSeries = exports.mapLimit = exports.map = exports.log = exports.groupBySeries = exports.groupByLimit = exports.groupBy = exports.forever = exports.filterSeries = exports.filterLimit = exports.filter = exports.everySeries = exports.everyLimit = exports.every = exports.ensureAsync = exports.eachSeries = exports.eachOfSeries = exports.eachOfLimit = exports.eachOf = exports.eachLimit = exports.each = exports.doWhilst = exports.doUntil = exports.dir = exports.detectSeries = exports.detectLimit = exports.detect = exports.constant = exports.concatSeries = exports.concatLimit = exports.concat = exports.compose = exports.cargoQueue = exports.cargo = exports.autoInject = exports.auto = exports.asyncify = exports.applyEachSeries = exports.applyEach = exports.apply = undefined; - -var _apply = require('./apply'); - -var _apply2 = _interopRequireDefault(_apply); - -var _applyEach = require('./applyEach'); - -var _applyEach2 = _interopRequireDefault(_applyEach); - -var _applyEachSeries = require('./applyEachSeries'); - -var _applyEachSeries2 = _interopRequireDefault(_applyEachSeries); - -var _asyncify = require('./asyncify'); - -var _asyncify2 = _interopRequireDefault(_asyncify); - -var _auto = require('./auto'); - -var _auto2 = _interopRequireDefault(_auto); - -var _autoInject = require('./autoInject'); - -var _autoInject2 = _interopRequireDefault(_autoInject); - -var _cargo = require('./cargo'); - -var _cargo2 = _interopRequireDefault(_cargo); - -var _cargoQueue = require('./cargoQueue'); - -var _cargoQueue2 = _interopRequireDefault(_cargoQueue); - -var _compose = require('./compose'); - -var _compose2 = _interopRequireDefault(_compose); - -var _concat = require('./concat'); - -var _concat2 = _interopRequireDefault(_concat); - -var _concatLimit = require('./concatLimit'); - -var _concatLimit2 = _interopRequireDefault(_concatLimit); - -var _concatSeries = require('./concatSeries'); - -var _concatSeries2 = _interopRequireDefault(_concatSeries); - -var _constant = require('./constant'); - -var _constant2 = _interopRequireDefault(_constant); - -var _detect = require('./detect'); - -var _detect2 = _interopRequireDefault(_detect); - -var _detectLimit = require('./detectLimit'); - -var _detectLimit2 = _interopRequireDefault(_detectLimit); - -var _detectSeries = require('./detectSeries'); - -var _detectSeries2 = _interopRequireDefault(_detectSeries); - -var _dir = require('./dir'); - -var _dir2 = _interopRequireDefault(_dir); - -var _doUntil = require('./doUntil'); - -var _doUntil2 = _interopRequireDefault(_doUntil); - -var _doWhilst = require('./doWhilst'); - -var _doWhilst2 = _interopRequireDefault(_doWhilst); - -var _each = require('./each'); - -var _each2 = _interopRequireDefault(_each); - -var _eachLimit = require('./eachLimit'); - -var _eachLimit2 = _interopRequireDefault(_eachLimit); - -var _eachOf = require('./eachOf'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _eachOfLimit = require('./eachOfLimit'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _eachOfSeries = require('./eachOfSeries'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _eachSeries = require('./eachSeries'); - -var _eachSeries2 = _interopRequireDefault(_eachSeries); - -var _ensureAsync = require('./ensureAsync'); - -var _ensureAsync2 = _interopRequireDefault(_ensureAsync); - -var _every = require('./every'); - -var _every2 = _interopRequireDefault(_every); - -var _everyLimit = require('./everyLimit'); - -var _everyLimit2 = _interopRequireDefault(_everyLimit); - -var _everySeries = require('./everySeries'); - -var _everySeries2 = _interopRequireDefault(_everySeries); - -var _filter = require('./filter'); - -var _filter2 = _interopRequireDefault(_filter); - -var _filterLimit = require('./filterLimit'); - -var _filterLimit2 = _interopRequireDefault(_filterLimit); - -var _filterSeries = require('./filterSeries'); - -var _filterSeries2 = _interopRequireDefault(_filterSeries); - -var _forever = require('./forever'); - -var _forever2 = _interopRequireDefault(_forever); - -var _groupBy = require('./groupBy'); - -var _groupBy2 = _interopRequireDefault(_groupBy); - -var _groupByLimit = require('./groupByLimit'); - -var _groupByLimit2 = _interopRequireDefault(_groupByLimit); - -var _groupBySeries = require('./groupBySeries'); - -var _groupBySeries2 = _interopRequireDefault(_groupBySeries); - -var _log = require('./log'); - -var _log2 = _interopRequireDefault(_log); - -var _map = require('./map'); - -var _map2 = _interopRequireDefault(_map); - -var _mapLimit = require('./mapLimit'); - -var _mapLimit2 = _interopRequireDefault(_mapLimit); - -var _mapSeries = require('./mapSeries'); - -var _mapSeries2 = _interopRequireDefault(_mapSeries); - -var _mapValues = require('./mapValues'); - -var _mapValues2 = _interopRequireDefault(_mapValues); - -var _mapValuesLimit = require('./mapValuesLimit'); - -var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); - -var _mapValuesSeries = require('./mapValuesSeries'); - -var _mapValuesSeries2 = _interopRequireDefault(_mapValuesSeries); - -var _memoize = require('./memoize'); - -var _memoize2 = _interopRequireDefault(_memoize); - -var _nextTick = require('./nextTick'); - -var _nextTick2 = _interopRequireDefault(_nextTick); - -var _parallel = require('./parallel'); - -var _parallel2 = _interopRequireDefault(_parallel); - -var _parallelLimit = require('./parallelLimit'); - -var _parallelLimit2 = _interopRequireDefault(_parallelLimit); - -var _priorityQueue = require('./priorityQueue'); - -var _priorityQueue2 = _interopRequireDefault(_priorityQueue); - -var _queue = require('./queue'); - -var _queue2 = _interopRequireDefault(_queue); - -var _race = require('./race'); - -var _race2 = _interopRequireDefault(_race); - -var _reduce = require('./reduce'); - -var _reduce2 = _interopRequireDefault(_reduce); - -var _reduceRight = require('./reduceRight'); - -var _reduceRight2 = _interopRequireDefault(_reduceRight); - -var _reflect = require('./reflect'); - -var _reflect2 = _interopRequireDefault(_reflect); - -var _reflectAll = require('./reflectAll'); - -var _reflectAll2 = _interopRequireDefault(_reflectAll); - -var _reject = require('./reject'); - -var _reject2 = _interopRequireDefault(_reject); - -var _rejectLimit = require('./rejectLimit'); - -var _rejectLimit2 = _interopRequireDefault(_rejectLimit); - -var _rejectSeries = require('./rejectSeries'); - -var _rejectSeries2 = _interopRequireDefault(_rejectSeries); - -var _retry = require('./retry'); - -var _retry2 = _interopRequireDefault(_retry); - -var _retryable = require('./retryable'); - -var _retryable2 = _interopRequireDefault(_retryable); - -var _seq = require('./seq'); - -var _seq2 = _interopRequireDefault(_seq); - -var _series = require('./series'); - -var _series2 = _interopRequireDefault(_series); - -var _setImmediate = require('./setImmediate'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _some = require('./some'); - -var _some2 = _interopRequireDefault(_some); - -var _someLimit = require('./someLimit'); - -var _someLimit2 = _interopRequireDefault(_someLimit); - -var _someSeries = require('./someSeries'); - -var _someSeries2 = _interopRequireDefault(_someSeries); - -var _sortBy = require('./sortBy'); - -var _sortBy2 = _interopRequireDefault(_sortBy); - -var _timeout = require('./timeout'); - -var _timeout2 = _interopRequireDefault(_timeout); - -var _times = require('./times'); - -var _times2 = _interopRequireDefault(_times); - -var _timesLimit = require('./timesLimit'); - -var _timesLimit2 = _interopRequireDefault(_timesLimit); - -var _timesSeries = require('./timesSeries'); - -var _timesSeries2 = _interopRequireDefault(_timesSeries); - -var _transform = require('./transform'); - -var _transform2 = _interopRequireDefault(_transform); - -var _tryEach = require('./tryEach'); - -var _tryEach2 = _interopRequireDefault(_tryEach); - -var _unmemoize = require('./unmemoize'); - -var _unmemoize2 = _interopRequireDefault(_unmemoize); - -var _until = require('./until'); - -var _until2 = _interopRequireDefault(_until); - -var _waterfall = require('./waterfall'); - -var _waterfall2 = _interopRequireDefault(_waterfall); - -var _whilst = require('./whilst'); - -var _whilst2 = _interopRequireDefault(_whilst); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * An "async function" in the context of Async is an asynchronous function with - * a variable number of parameters, with the final parameter being a callback. - * (`function (arg1, arg2, ..., callback) {}`) - * The final callback is of the form `callback(err, results...)`, which must be - * called once the function is completed. The callback should be called with a - * Error as its first argument to signal that an error occurred. - * Otherwise, if no error occurred, it should be called with `null` as the first - * argument, and any additional `result` arguments that may apply, to signal - * successful completion. - * The callback must be called exactly once, ideally on a later tick of the - * JavaScript event loop. - * - * This type of function is also referred to as a "Node-style async function", - * or a "continuation passing-style function" (CPS). Most of the methods of this - * library are themselves CPS/Node-style async functions, or functions that - * return CPS/Node-style async functions. - * - * Wherever we accept a Node-style async function, we also directly accept an - * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. - * In this case, the `async` function will not be passed a final callback - * argument, and any thrown error will be used as the `err` argument of the - * implicit callback, and the return value will be used as the `result` value. - * (i.e. a `rejected` of the returned Promise becomes the `err` callback - * argument, and a `resolved` value becomes the `result`.) - * - * Note, due to JavaScript limitations, we can only detect native `async` - * functions and not transpilied implementations. - * Your environment must have `async`/`await` support for this to work. - * (e.g. Node > v7.6, or a recent version of a modern browser). - * If you are using `async` functions through a transpiler (e.g. Babel), you - * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, - * because the `async function` will be compiled to an ordinary function that - * returns a promise. - * - * @typedef {Function} AsyncFunction - * @static - */ - -/** - * Async is a utility module which provides straight-forward, powerful functions - * for working with asynchronous JavaScript. Although originally designed for - * use with [Node.js](http://nodejs.org) and installable via - * `npm install --save async`, it can also be used directly in the browser. - * @module async - * @see AsyncFunction - */ - -/** - * A collection of `async` functions for manipulating collections, such as - * arrays and objects. - * @module Collections - */ - -/** - * A collection of `async` functions for controlling the flow through a script. - * @module ControlFlow - */ - -/** - * A collection of `async` utility functions. - * @module Utils - */ - -exports.default = { - apply: _apply2.default, - applyEach: _applyEach2.default, - applyEachSeries: _applyEachSeries2.default, - asyncify: _asyncify2.default, - auto: _auto2.default, - autoInject: _autoInject2.default, - cargo: _cargo2.default, - cargoQueue: _cargoQueue2.default, - compose: _compose2.default, - concat: _concat2.default, - concatLimit: _concatLimit2.default, - concatSeries: _concatSeries2.default, - constant: _constant2.default, - detect: _detect2.default, - detectLimit: _detectLimit2.default, - detectSeries: _detectSeries2.default, - dir: _dir2.default, - doUntil: _doUntil2.default, - doWhilst: _doWhilst2.default, - each: _each2.default, - eachLimit: _eachLimit2.default, - eachOf: _eachOf2.default, - eachOfLimit: _eachOfLimit2.default, - eachOfSeries: _eachOfSeries2.default, - eachSeries: _eachSeries2.default, - ensureAsync: _ensureAsync2.default, - every: _every2.default, - everyLimit: _everyLimit2.default, - everySeries: _everySeries2.default, - filter: _filter2.default, - filterLimit: _filterLimit2.default, - filterSeries: _filterSeries2.default, - forever: _forever2.default, - groupBy: _groupBy2.default, - groupByLimit: _groupByLimit2.default, - groupBySeries: _groupBySeries2.default, - log: _log2.default, - map: _map2.default, - mapLimit: _mapLimit2.default, - mapSeries: _mapSeries2.default, - mapValues: _mapValues2.default, - mapValuesLimit: _mapValuesLimit2.default, - mapValuesSeries: _mapValuesSeries2.default, - memoize: _memoize2.default, - nextTick: _nextTick2.default, - parallel: _parallel2.default, - parallelLimit: _parallelLimit2.default, - priorityQueue: _priorityQueue2.default, - queue: _queue2.default, - race: _race2.default, - reduce: _reduce2.default, - reduceRight: _reduceRight2.default, - reflect: _reflect2.default, - reflectAll: _reflectAll2.default, - reject: _reject2.default, - rejectLimit: _rejectLimit2.default, - rejectSeries: _rejectSeries2.default, - retry: _retry2.default, - retryable: _retryable2.default, - seq: _seq2.default, - series: _series2.default, - setImmediate: _setImmediate2.default, - some: _some2.default, - someLimit: _someLimit2.default, - someSeries: _someSeries2.default, - sortBy: _sortBy2.default, - timeout: _timeout2.default, - times: _times2.default, - timesLimit: _timesLimit2.default, - timesSeries: _timesSeries2.default, - transform: _transform2.default, - tryEach: _tryEach2.default, - unmemoize: _unmemoize2.default, - until: _until2.default, - waterfall: _waterfall2.default, - whilst: _whilst2.default, - - // aliases - all: _every2.default, - allLimit: _everyLimit2.default, - allSeries: _everySeries2.default, - any: _some2.default, - anyLimit: _someLimit2.default, - anySeries: _someSeries2.default, - find: _detect2.default, - findLimit: _detectLimit2.default, - findSeries: _detectSeries2.default, - flatMap: _concat2.default, - flatMapLimit: _concatLimit2.default, - flatMapSeries: _concatSeries2.default, - forEach: _each2.default, - forEachSeries: _eachSeries2.default, - forEachLimit: _eachLimit2.default, - forEachOf: _eachOf2.default, - forEachOfSeries: _eachOfSeries2.default, - forEachOfLimit: _eachOfLimit2.default, - inject: _reduce2.default, - foldl: _reduce2.default, - foldr: _reduceRight2.default, - select: _filter2.default, - selectLimit: _filterLimit2.default, - selectSeries: _filterSeries2.default, - wrapSync: _asyncify2.default, - during: _whilst2.default, - doDuring: _doWhilst2.default -}; -exports.apply = _apply2.default; -exports.applyEach = _applyEach2.default; -exports.applyEachSeries = _applyEachSeries2.default; -exports.asyncify = _asyncify2.default; -exports.auto = _auto2.default; -exports.autoInject = _autoInject2.default; -exports.cargo = _cargo2.default; -exports.cargoQueue = _cargoQueue2.default; -exports.compose = _compose2.default; -exports.concat = _concat2.default; -exports.concatLimit = _concatLimit2.default; -exports.concatSeries = _concatSeries2.default; -exports.constant = _constant2.default; -exports.detect = _detect2.default; -exports.detectLimit = _detectLimit2.default; -exports.detectSeries = _detectSeries2.default; -exports.dir = _dir2.default; -exports.doUntil = _doUntil2.default; -exports.doWhilst = _doWhilst2.default; -exports.each = _each2.default; -exports.eachLimit = _eachLimit2.default; -exports.eachOf = _eachOf2.default; -exports.eachOfLimit = _eachOfLimit2.default; -exports.eachOfSeries = _eachOfSeries2.default; -exports.eachSeries = _eachSeries2.default; -exports.ensureAsync = _ensureAsync2.default; -exports.every = _every2.default; -exports.everyLimit = _everyLimit2.default; -exports.everySeries = _everySeries2.default; -exports.filter = _filter2.default; -exports.filterLimit = _filterLimit2.default; -exports.filterSeries = _filterSeries2.default; -exports.forever = _forever2.default; -exports.groupBy = _groupBy2.default; -exports.groupByLimit = _groupByLimit2.default; -exports.groupBySeries = _groupBySeries2.default; -exports.log = _log2.default; -exports.map = _map2.default; -exports.mapLimit = _mapLimit2.default; -exports.mapSeries = _mapSeries2.default; -exports.mapValues = _mapValues2.default; -exports.mapValuesLimit = _mapValuesLimit2.default; -exports.mapValuesSeries = _mapValuesSeries2.default; -exports.memoize = _memoize2.default; -exports.nextTick = _nextTick2.default; -exports.parallel = _parallel2.default; -exports.parallelLimit = _parallelLimit2.default; -exports.priorityQueue = _priorityQueue2.default; -exports.queue = _queue2.default; -exports.race = _race2.default; -exports.reduce = _reduce2.default; -exports.reduceRight = _reduceRight2.default; -exports.reflect = _reflect2.default; -exports.reflectAll = _reflectAll2.default; -exports.reject = _reject2.default; -exports.rejectLimit = _rejectLimit2.default; -exports.rejectSeries = _rejectSeries2.default; -exports.retry = _retry2.default; -exports.retryable = _retryable2.default; -exports.seq = _seq2.default; -exports.series = _series2.default; -exports.setImmediate = _setImmediate2.default; -exports.some = _some2.default; -exports.someLimit = _someLimit2.default; -exports.someSeries = _someSeries2.default; -exports.sortBy = _sortBy2.default; -exports.timeout = _timeout2.default; -exports.times = _times2.default; -exports.timesLimit = _timesLimit2.default; -exports.timesSeries = _timesSeries2.default; -exports.transform = _transform2.default; -exports.tryEach = _tryEach2.default; -exports.unmemoize = _unmemoize2.default; -exports.until = _until2.default; -exports.waterfall = _waterfall2.default; -exports.whilst = _whilst2.default; -exports.all = _every2.default; -exports.allLimit = _everyLimit2.default; -exports.allSeries = _everySeries2.default; -exports.any = _some2.default; -exports.anyLimit = _someLimit2.default; -exports.anySeries = _someSeries2.default; -exports.find = _detect2.default; -exports.findLimit = _detectLimit2.default; -exports.findSeries = _detectSeries2.default; -exports.flatMap = _concat2.default; -exports.flatMapLimit = _concatLimit2.default; -exports.flatMapSeries = _concatSeries2.default; -exports.forEach = _each2.default; -exports.forEachSeries = _eachSeries2.default; -exports.forEachLimit = _eachLimit2.default; -exports.forEachOf = _eachOf2.default; -exports.forEachOfSeries = _eachOfSeries2.default; -exports.forEachOfLimit = _eachOfLimit2.default; -exports.inject = _reduce2.default; -exports.foldl = _reduce2.default; -exports.foldr = _reduceRight2.default; -exports.select = _filter2.default; -exports.selectLimit = _filterLimit2.default; -exports.selectSeries = _filterSeries2.default; -exports.wrapSync = _asyncify2.default; -exports.during = _whilst2.default; -exports.doDuring = _doWhilst2.default; \ No newline at end of file diff --git a/node_modules/async/inject.js b/node_modules/async/inject.js deleted file mode 100644 index 56e2db81..00000000 --- a/node_modules/async/inject.js +++ /dev/null @@ -1,153 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Reduces `coll` into a single value using an async `iteratee` to return each - * successive step. `memo` is the initial state of the reduction. This function - * only operates in series. - * - * For performance reasons, it may make sense to split a call to this function - * into a parallel map, and then use the normal `Array.prototype.reduce` on the - * results. This function is for situations where each step in the reduction - * needs to be async; if you can get the data before reducing it, then it's - * probably a good idea to do so. - * - * @name reduce - * @static - * @memberOf module:Collections - * @method - * @alias inject - * @alias foldl - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; - * - * // asynchronous function that computes the file size in bytes - * // file size is added to the memoized value, then returned - * function getFileSizeInBytes(memo, file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, memo + stat.size); - * }); - * } - * - * // Using callbacks - * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.reduce(fileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.reduce(fileList, 0, getFileSizeInBytes); - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function reduce(coll, memo, iteratee, callback) { - callback = (0, _once2.default)(callback); - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { - _iteratee(memo, x, (err, v) => { - memo = v; - iterCb(err); - }); - }, err => callback(err, memo)); -} -exports.default = (0, _awaitify2.default)(reduce, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/DoublyLinkedList.js b/node_modules/async/internal/DoublyLinkedList.js deleted file mode 100644 index cd11c3b3..00000000 --- a/node_modules/async/internal/DoublyLinkedList.js +++ /dev/null @@ -1,92 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation -// used for queues. This implementation assumes that the node provided by the user can be modified -// to adjust the next and last properties. We implement only the minimal functionality -// for queue support. -class DLL { - constructor() { - this.head = this.tail = null; - this.length = 0; - } - - removeLink(node) { - if (node.prev) node.prev.next = node.next;else this.head = node.next; - if (node.next) node.next.prev = node.prev;else this.tail = node.prev; - - node.prev = node.next = null; - this.length -= 1; - return node; - } - - empty() { - while (this.head) this.shift(); - return this; - } - - insertAfter(node, newNode) { - newNode.prev = node; - newNode.next = node.next; - if (node.next) node.next.prev = newNode;else this.tail = newNode; - node.next = newNode; - this.length += 1; - } - - insertBefore(node, newNode) { - newNode.prev = node.prev; - newNode.next = node; - if (node.prev) node.prev.next = newNode;else this.head = newNode; - node.prev = newNode; - this.length += 1; - } - - unshift(node) { - if (this.head) this.insertBefore(this.head, node);else setInitial(this, node); - } - - push(node) { - if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node); - } - - shift() { - return this.head && this.removeLink(this.head); - } - - pop() { - return this.tail && this.removeLink(this.tail); - } - - toArray() { - return [...this]; - } - - *[Symbol.iterator]() { - var cur = this.head; - while (cur) { - yield cur.data; - cur = cur.next; - } - } - - remove(testFn) { - var curr = this.head; - while (curr) { - var { next } = curr; - if (testFn(curr)) { - this.removeLink(curr); - } - curr = next; - } - return this; - } -} - -exports.default = DLL; -function setInitial(dll, node) { - dll.length = 1; - dll.head = dll.tail = node; -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/Heap.js b/node_modules/async/internal/Heap.js deleted file mode 100644 index 80762fe0..00000000 --- a/node_modules/async/internal/Heap.js +++ /dev/null @@ -1,120 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -// Binary min-heap implementation used for priority queue. -// Implementation is stable, i.e. push time is considered for equal priorities -class Heap { - constructor() { - this.heap = []; - this.pushCount = Number.MIN_SAFE_INTEGER; - } - - get length() { - return this.heap.length; - } - - empty() { - this.heap = []; - return this; - } - - percUp(index) { - let p; - - while (index > 0 && smaller(this.heap[index], this.heap[p = parent(index)])) { - let t = this.heap[index]; - this.heap[index] = this.heap[p]; - this.heap[p] = t; - - index = p; - } - } - - percDown(index) { - let l; - - while ((l = leftChi(index)) < this.heap.length) { - if (l + 1 < this.heap.length && smaller(this.heap[l + 1], this.heap[l])) { - l = l + 1; - } - - if (smaller(this.heap[index], this.heap[l])) { - break; - } - - let t = this.heap[index]; - this.heap[index] = this.heap[l]; - this.heap[l] = t; - - index = l; - } - } - - push(node) { - node.pushCount = ++this.pushCount; - this.heap.push(node); - this.percUp(this.heap.length - 1); - } - - unshift(node) { - return this.heap.push(node); - } - - shift() { - let [top] = this.heap; - - this.heap[0] = this.heap[this.heap.length - 1]; - this.heap.pop(); - this.percDown(0); - - return top; - } - - toArray() { - return [...this]; - } - - *[Symbol.iterator]() { - for (let i = 0; i < this.heap.length; i++) { - yield this.heap[i].data; - } - } - - remove(testFn) { - let j = 0; - for (let i = 0; i < this.heap.length; i++) { - if (!testFn(this.heap[i])) { - this.heap[j] = this.heap[i]; - j++; - } - } - - this.heap.splice(j); - - for (let i = parent(this.heap.length - 1); i >= 0; i--) { - this.percDown(i); - } - - return this; - } -} - -exports.default = Heap; -function leftChi(i) { - return (i << 1) + 1; -} - -function parent(i) { - return (i + 1 >> 1) - 1; -} - -function smaller(x, y) { - if (x.priority !== y.priority) { - return x.priority < y.priority; - } else { - return x.pushCount < y.pushCount; - } -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/applyEach.js b/node_modules/async/internal/applyEach.js deleted file mode 100644 index a3f4ef1d..00000000 --- a/node_modules/async/internal/applyEach.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (eachfn) { - return function applyEach(fns, ...callArgs) { - const go = (0, _awaitify2.default)(function (callback) { - var that = this; - return eachfn(fns, (fn, cb) => { - (0, _wrapAsync2.default)(fn).apply(that, callArgs.concat(cb)); - }, callback); - }); - return go; - }; -}; - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/asyncEachOfLimit.js b/node_modules/async/internal/asyncEachOfLimit.js deleted file mode 100644 index bba74c7c..00000000 --- a/node_modules/async/internal/asyncEachOfLimit.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = asyncEachOfLimit; - -var _breakLoop = require('./breakLoop.js'); - -var _breakLoop2 = _interopRequireDefault(_breakLoop); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// for async generators -function asyncEachOfLimit(generator, limit, iteratee, callback) { - let done = false; - let canceled = false; - let awaiting = false; - let running = 0; - let idx = 0; - - function replenish() { - //console.log('replenish') - if (running >= limit || awaiting || done) return; - //console.log('replenish awaiting') - awaiting = true; - generator.next().then(({ value, done: iterDone }) => { - //console.log('got value', value) - if (canceled || done) return; - awaiting = false; - if (iterDone) { - done = true; - if (running <= 0) { - //console.log('done nextCb') - callback(null); - } - return; - } - running++; - iteratee(value, idx, iterateeCallback); - idx++; - replenish(); - }).catch(handleError); - } - - function iterateeCallback(err, result) { - //console.log('iterateeCallback') - running -= 1; - if (canceled) return; - if (err) return handleError(err); - - if (err === false) { - done = true; - canceled = true; - return; - } - - if (result === _breakLoop2.default || done && running <= 0) { - done = true; - //console.log('done iterCb') - return callback(null); - } - replenish(); - } - - function handleError(err) { - if (canceled) return; - awaiting = false; - done = true; - callback(err); - } - - replenish(); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/awaitify.js b/node_modules/async/internal/awaitify.js deleted file mode 100644 index 7b36f1ac..00000000 --- a/node_modules/async/internal/awaitify.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = awaitify; -// conditionally promisify a function. -// only return a promise if a callback is omitted -function awaitify(asyncFn, arity = asyncFn.length) { - if (!arity) throw new Error('arity is undefined'); - function awaitable(...args) { - if (typeof args[arity - 1] === 'function') { - return asyncFn.apply(this, args); - } - - return new Promise((resolve, reject) => { - args[arity - 1] = (err, ...cbArgs) => { - if (err) return reject(err); - resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); - }; - asyncFn.apply(this, args); - }); - } - - return awaitable; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/breakLoop.js b/node_modules/async/internal/breakLoop.js deleted file mode 100644 index 8245e553..00000000 --- a/node_modules/async/internal/breakLoop.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -// A temporary value used to identify if the loop should be broken. -// See #1064, #1293 -const breakLoop = {}; -exports.default = breakLoop; -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/consoleFunc.js b/node_modules/async/internal/consoleFunc.js deleted file mode 100644 index 70347a5d..00000000 --- a/node_modules/async/internal/consoleFunc.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = consoleFunc; - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function consoleFunc(name) { - return (fn, ...args) => (0, _wrapAsync2.default)(fn)(...args, (err, ...resultArgs) => { - /* istanbul ignore else */ - if (typeof console === 'object') { - /* istanbul ignore else */ - if (err) { - /* istanbul ignore else */ - if (console.error) { - console.error(err); - } - } else if (console[name]) { - /* istanbul ignore else */ - resultArgs.forEach(x => console[name](x)); - } - } - }); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/createTester.js b/node_modules/async/internal/createTester.js deleted file mode 100644 index 7b2d7346..00000000 --- a/node_modules/async/internal/createTester.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = _createTester; - -var _breakLoop = require('./breakLoop.js'); - -var _breakLoop2 = _interopRequireDefault(_breakLoop); - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _createTester(check, getResult) { - return (eachfn, arr, _iteratee, cb) => { - var testPassed = false; - var testResult; - const iteratee = (0, _wrapAsync2.default)(_iteratee); - eachfn(arr, (value, _, callback) => { - iteratee(value, (err, result) => { - if (err || err === false) return callback(err); - - if (check(result) && !testResult) { - testPassed = true; - testResult = getResult(true, value); - return callback(null, _breakLoop2.default); - } - callback(); - }); - }, err => { - if (err) return cb(err); - cb(null, testPassed ? testResult : getResult(false)); - }); - }; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/eachOfLimit.js b/node_modules/async/internal/eachOfLimit.js deleted file mode 100644 index fc26b20f..00000000 --- a/node_modules/async/internal/eachOfLimit.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _once = require('./once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _iterator = require('./iterator.js'); - -var _iterator2 = _interopRequireDefault(_iterator); - -var _onlyOnce = require('./onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./wrapAsync.js'); - -var _asyncEachOfLimit = require('./asyncEachOfLimit.js'); - -var _asyncEachOfLimit2 = _interopRequireDefault(_asyncEachOfLimit); - -var _breakLoop = require('./breakLoop.js'); - -var _breakLoop2 = _interopRequireDefault(_breakLoop); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = limit => { - return (obj, iteratee, callback) => { - callback = (0, _once2.default)(callback); - if (limit <= 0) { - throw new RangeError('concurrency limit cannot be less than 1'); - } - if (!obj) { - return callback(null); - } - if ((0, _wrapAsync.isAsyncGenerator)(obj)) { - return (0, _asyncEachOfLimit2.default)(obj, limit, iteratee, callback); - } - if ((0, _wrapAsync.isAsyncIterable)(obj)) { - return (0, _asyncEachOfLimit2.default)(obj[Symbol.asyncIterator](), limit, iteratee, callback); - } - var nextElem = (0, _iterator2.default)(obj); - var done = false; - var canceled = false; - var running = 0; - var looping = false; - - function iterateeCallback(err, value) { - if (canceled) return; - running -= 1; - if (err) { - done = true; - callback(err); - } else if (err === false) { - done = true; - canceled = true; - } else if (value === _breakLoop2.default || done && running <= 0) { - done = true; - return callback(null); - } else if (!looping) { - replenish(); - } - } - - function replenish() { - looping = true; - while (running < limit && !done) { - var elem = nextElem(); - if (elem === null) { - done = true; - if (running <= 0) { - callback(null); - } - return; - } - running += 1; - iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback)); - } - looping = false; - } - - replenish(); - }; -}; - -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/filter.js b/node_modules/async/internal/filter.js deleted file mode 100644 index aef2b9d2..00000000 --- a/node_modules/async/internal/filter.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = _filter; - -var _isArrayLike = require('./isArrayLike.js'); - -var _isArrayLike2 = _interopRequireDefault(_isArrayLike); - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function filterArray(eachfn, arr, iteratee, callback) { - var truthValues = new Array(arr.length); - eachfn(arr, (x, index, iterCb) => { - iteratee(x, (err, v) => { - truthValues[index] = !!v; - iterCb(err); - }); - }, err => { - if (err) return callback(err); - var results = []; - for (var i = 0; i < arr.length; i++) { - if (truthValues[i]) results.push(arr[i]); - } - callback(null, results); - }); -} - -function filterGeneric(eachfn, coll, iteratee, callback) { - var results = []; - eachfn(coll, (x, index, iterCb) => { - iteratee(x, (err, v) => { - if (err) return iterCb(err); - if (v) { - results.push({ index, value: x }); - } - iterCb(err); - }); - }, err => { - if (err) return callback(err); - callback(null, results.sort((a, b) => a.index - b.index).map(v => v.value)); - }); -} - -function _filter(eachfn, coll, iteratee, callback) { - var filter = (0, _isArrayLike2.default)(coll) ? filterArray : filterGeneric; - return filter(eachfn, coll, (0, _wrapAsync2.default)(iteratee), callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/getIterator.js b/node_modules/async/internal/getIterator.js deleted file mode 100644 index 830a5452..00000000 --- a/node_modules/async/internal/getIterator.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (coll) { - return coll[Symbol.iterator] && coll[Symbol.iterator](); -}; - -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/initialParams.js b/node_modules/async/internal/initialParams.js deleted file mode 100644 index 245378cf..00000000 --- a/node_modules/async/internal/initialParams.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (fn) { - return function (...args /*, callback*/) { - var callback = args.pop(); - return fn.call(this, args, callback); - }; -}; - -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/isArrayLike.js b/node_modules/async/internal/isArrayLike.js deleted file mode 100644 index ce076704..00000000 --- a/node_modules/async/internal/isArrayLike.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = isArrayLike; -function isArrayLike(value) { - return value && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/iterator.js b/node_modules/async/internal/iterator.js deleted file mode 100644 index 90b0223b..00000000 --- a/node_modules/async/internal/iterator.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = createIterator; - -var _isArrayLike = require('./isArrayLike.js'); - -var _isArrayLike2 = _interopRequireDefault(_isArrayLike); - -var _getIterator = require('./getIterator.js'); - -var _getIterator2 = _interopRequireDefault(_getIterator); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function createArrayIterator(coll) { - var i = -1; - var len = coll.length; - return function next() { - return ++i < len ? { value: coll[i], key: i } : null; - }; -} - -function createES2015Iterator(iterator) { - var i = -1; - return function next() { - var item = iterator.next(); - if (item.done) return null; - i++; - return { value: item.value, key: i }; - }; -} - -function createObjectIterator(obj) { - var okeys = obj ? Object.keys(obj) : []; - var i = -1; - var len = okeys.length; - return function next() { - var key = okeys[++i]; - if (key === '__proto__') { - return next(); - } - return i < len ? { value: obj[key], key } : null; - }; -} - -function createIterator(coll) { - if ((0, _isArrayLike2.default)(coll)) { - return createArrayIterator(coll); - } - - var iterator = (0, _getIterator2.default)(coll); - return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/map.js b/node_modules/async/internal/map.js deleted file mode 100644 index af3fd098..00000000 --- a/node_modules/async/internal/map.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = _asyncMap; - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _asyncMap(eachfn, arr, iteratee, callback) { - arr = arr || []; - var results = []; - var counter = 0; - var _iteratee = (0, _wrapAsync2.default)(iteratee); - - return eachfn(arr, (value, _, iterCb) => { - var index = counter++; - _iteratee(value, (err, v) => { - results[index] = v; - iterCb(err); - }); - }, err => { - callback(err, results); - }); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/once.js b/node_modules/async/internal/once.js deleted file mode 100644 index 49f37270..00000000 --- a/node_modules/async/internal/once.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = once; -function once(fn) { - function wrapper(...args) { - if (fn === null) return; - var callFn = fn; - fn = null; - callFn.apply(this, args); - } - Object.assign(wrapper, fn); - return wrapper; -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/onlyOnce.js b/node_modules/async/internal/onlyOnce.js deleted file mode 100644 index 6ad721bd..00000000 --- a/node_modules/async/internal/onlyOnce.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = onlyOnce; -function onlyOnce(fn) { - return function (...args) { - if (fn === null) throw new Error("Callback was already called."); - var callFn = fn; - fn = null; - callFn.apply(this, args); - }; -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/parallel.js b/node_modules/async/internal/parallel.js deleted file mode 100644 index 75741bba..00000000 --- a/node_modules/async/internal/parallel.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _isArrayLike = require('./isArrayLike.js'); - -var _isArrayLike2 = _interopRequireDefault(_isArrayLike); - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = (0, _awaitify2.default)((eachfn, tasks, callback) => { - var results = (0, _isArrayLike2.default)(tasks) ? [] : {}; - - eachfn(tasks, (task, key, taskCb) => { - (0, _wrapAsync2.default)(task)((err, ...result) => { - if (result.length < 2) { - [result] = result; - } - results[key] = result; - taskCb(err); - }); - }, err => callback(err, results)); -}, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/promiseCallback.js b/node_modules/async/internal/promiseCallback.js deleted file mode 100644 index 17a83016..00000000 --- a/node_modules/async/internal/promiseCallback.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -const PROMISE_SYMBOL = Symbol('promiseCallback'); - -function promiseCallback() { - let resolve, reject; - function callback(err, ...args) { - if (err) return reject(err); - resolve(args.length > 1 ? args : args[0]); - } - - callback[PROMISE_SYMBOL] = new Promise((res, rej) => { - resolve = res, reject = rej; - }); - - return callback; -} - -exports.promiseCallback = promiseCallback; -exports.PROMISE_SYMBOL = PROMISE_SYMBOL; \ No newline at end of file diff --git a/node_modules/async/internal/queue.js b/node_modules/async/internal/queue.js deleted file mode 100644 index cbc590d0..00000000 --- a/node_modules/async/internal/queue.js +++ /dev/null @@ -1,294 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = queue; - -var _onlyOnce = require('./onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _setImmediate = require('./setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _DoublyLinkedList = require('./DoublyLinkedList.js'); - -var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList); - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function queue(worker, concurrency, payload) { - if (concurrency == null) { - concurrency = 1; - } else if (concurrency === 0) { - throw new RangeError('Concurrency must not be zero'); - } - - var _worker = (0, _wrapAsync2.default)(worker); - var numRunning = 0; - var workersList = []; - const events = { - error: [], - drain: [], - saturated: [], - unsaturated: [], - empty: [] - }; - - function on(event, handler) { - events[event].push(handler); - } - - function once(event, handler) { - const handleAndRemove = (...args) => { - off(event, handleAndRemove); - handler(...args); - }; - events[event].push(handleAndRemove); - } - - function off(event, handler) { - if (!event) return Object.keys(events).forEach(ev => events[ev] = []); - if (!handler) return events[event] = []; - events[event] = events[event].filter(ev => ev !== handler); - } - - function trigger(event, ...args) { - events[event].forEach(handler => handler(...args)); - } - - var processingScheduled = false; - function _insert(data, insertAtFront, rejectOnError, callback) { - if (callback != null && typeof callback !== 'function') { - throw new Error('task callback must be a function'); - } - q.started = true; - - var res, rej; - function promiseCallback(err, ...args) { - // we don't care about the error, let the global error handler - // deal with it - if (err) return rejectOnError ? rej(err) : res(); - if (args.length <= 1) return res(args[0]); - res(args); - } - - var item = q._createTaskItem(data, rejectOnError ? promiseCallback : callback || promiseCallback); - - if (insertAtFront) { - q._tasks.unshift(item); - } else { - q._tasks.push(item); - } - - if (!processingScheduled) { - processingScheduled = true; - (0, _setImmediate2.default)(() => { - processingScheduled = false; - q.process(); - }); - } - - if (rejectOnError || !callback) { - return new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - } - } - - function _createCB(tasks) { - return function (err, ...args) { - numRunning -= 1; - - for (var i = 0, l = tasks.length; i < l; i++) { - var task = tasks[i]; - - var index = workersList.indexOf(task); - if (index === 0) { - workersList.shift(); - } else if (index > 0) { - workersList.splice(index, 1); - } - - task.callback(err, ...args); - - if (err != null) { - trigger('error', err, task.data); - } - } - - if (numRunning <= q.concurrency - q.buffer) { - trigger('unsaturated'); - } - - if (q.idle()) { - trigger('drain'); - } - q.process(); - }; - } - - function _maybeDrain(data) { - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - (0, _setImmediate2.default)(() => trigger('drain')); - return true; - } - return false; - } - - const eventMethod = name => handler => { - if (!handler) { - return new Promise((resolve, reject) => { - once(name, (err, data) => { - if (err) return reject(err); - resolve(data); - }); - }); - } - off(name); - on(name, handler); - }; - - var isProcessing = false; - var q = { - _tasks: new _DoublyLinkedList2.default(), - _createTaskItem(data, callback) { - return { - data, - callback - }; - }, - *[Symbol.iterator]() { - yield* q._tasks[Symbol.iterator](); - }, - concurrency, - payload, - buffer: concurrency / 4, - started: false, - paused: false, - push(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(datum => _insert(datum, false, false, callback)); - } - return _insert(data, false, false, callback); - }, - pushAsync(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(datum => _insert(datum, false, true, callback)); - } - return _insert(data, false, true, callback); - }, - kill() { - off(); - q._tasks.empty(); - }, - unshift(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(datum => _insert(datum, true, false, callback)); - } - return _insert(data, true, false, callback); - }, - unshiftAsync(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(datum => _insert(datum, true, true, callback)); - } - return _insert(data, true, true, callback); - }, - remove(testFn) { - q._tasks.remove(testFn); - }, - process() { - // Avoid trying to start too many processing operations. This can occur - // when callbacks resolve synchronously (#1267). - if (isProcessing) { - return; - } - isProcessing = true; - while (!q.paused && numRunning < q.concurrency && q._tasks.length) { - var tasks = [], - data = []; - var l = q._tasks.length; - if (q.payload) l = Math.min(l, q.payload); - for (var i = 0; i < l; i++) { - var node = q._tasks.shift(); - tasks.push(node); - workersList.push(node); - data.push(node.data); - } - - numRunning += 1; - - if (q._tasks.length === 0) { - trigger('empty'); - } - - if (numRunning === q.concurrency) { - trigger('saturated'); - } - - var cb = (0, _onlyOnce2.default)(_createCB(tasks)); - _worker(data, cb); - } - isProcessing = false; - }, - length() { - return q._tasks.length; - }, - running() { - return numRunning; - }, - workersList() { - return workersList; - }, - idle() { - return q._tasks.length + numRunning === 0; - }, - pause() { - q.paused = true; - }, - resume() { - if (q.paused === false) { - return; - } - q.paused = false; - (0, _setImmediate2.default)(q.process); - } - }; - // define these as fixed properties, so people get useful errors when updating - Object.defineProperties(q, { - saturated: { - writable: false, - value: eventMethod('saturated') - }, - unsaturated: { - writable: false, - value: eventMethod('unsaturated') - }, - empty: { - writable: false, - value: eventMethod('empty') - }, - drain: { - writable: false, - value: eventMethod('drain') - }, - error: { - writable: false, - value: eventMethod('error') - } - }); - return q; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/range.js b/node_modules/async/internal/range.js deleted file mode 100644 index 6680e642..00000000 --- a/node_modules/async/internal/range.js +++ /dev/null @@ -1,14 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = range; -function range(size) { - var result = Array(size); - while (size--) { - result[size] = size; - } - return result; -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/reject.js b/node_modules/async/internal/reject.js deleted file mode 100644 index 7388ef49..00000000 --- a/node_modules/async/internal/reject.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reject; - -var _filter = require('./filter.js'); - -var _filter2 = _interopRequireDefault(_filter); - -var _wrapAsync = require('./wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function reject(eachfn, arr, _iteratee, callback) { - const iteratee = (0, _wrapAsync2.default)(_iteratee); - return (0, _filter2.default)(eachfn, arr, (value, cb) => { - iteratee(value, (err, v) => { - cb(err, !v); - }); - }, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/internal/setImmediate.js b/node_modules/async/internal/setImmediate.js deleted file mode 100644 index 513efd13..00000000 --- a/node_modules/async/internal/setImmediate.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.fallback = fallback; -exports.wrap = wrap; -/* istanbul ignore file */ - -var hasQueueMicrotask = exports.hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask; -var hasSetImmediate = exports.hasSetImmediate = typeof setImmediate === 'function' && setImmediate; -var hasNextTick = exports.hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; - -function fallback(fn) { - setTimeout(fn, 0); -} - -function wrap(defer) { - return (fn, ...args) => defer(() => fn(...args)); -} - -var _defer; - -if (hasQueueMicrotask) { - _defer = queueMicrotask; -} else if (hasSetImmediate) { - _defer = setImmediate; -} else if (hasNextTick) { - _defer = process.nextTick; -} else { - _defer = fallback; -} - -exports.default = wrap(_defer); \ No newline at end of file diff --git a/node_modules/async/internal/withoutIndex.js b/node_modules/async/internal/withoutIndex.js deleted file mode 100644 index ec45fa35..00000000 --- a/node_modules/async/internal/withoutIndex.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = _withoutIndex; -function _withoutIndex(iteratee) { - return (value, index, callback) => iteratee(value, callback); -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/internal/wrapAsync.js b/node_modules/async/internal/wrapAsync.js deleted file mode 100644 index ad4d6198..00000000 --- a/node_modules/async/internal/wrapAsync.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isAsyncIterable = exports.isAsyncGenerator = exports.isAsync = undefined; - -var _asyncify = require('../asyncify.js'); - -var _asyncify2 = _interopRequireDefault(_asyncify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function isAsync(fn) { - return fn[Symbol.toStringTag] === 'AsyncFunction'; -} - -function isAsyncGenerator(fn) { - return fn[Symbol.toStringTag] === 'AsyncGenerator'; -} - -function isAsyncIterable(obj) { - return typeof obj[Symbol.asyncIterator] === 'function'; -} - -function wrapAsync(asyncFn) { - if (typeof asyncFn !== 'function') throw new Error('expected a function'); - return isAsync(asyncFn) ? (0, _asyncify2.default)(asyncFn) : asyncFn; -} - -exports.default = wrapAsync; -exports.isAsync = isAsync; -exports.isAsyncGenerator = isAsyncGenerator; -exports.isAsyncIterable = isAsyncIterable; \ No newline at end of file diff --git a/node_modules/async/log.js b/node_modules/async/log.js deleted file mode 100644 index 8fc1ed51..00000000 --- a/node_modules/async/log.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _consoleFunc = require('./internal/consoleFunc.js'); - -var _consoleFunc2 = _interopRequireDefault(_consoleFunc); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Logs the result of an `async` function to the `console`. Only works in - * Node.js or in browsers that support `console.log` and `console.error` (such - * as FF and Chrome). If multiple arguments are returned from the async - * function, `console.log` is called on each argument in order. - * - * @name log - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, 'hello ' + name); - * }, 1000); - * }; - * - * // in the node repl - * node> async.log(hello, 'world'); - * 'hello world' - */ -exports.default = (0, _consoleFunc2.default)('log'); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/map.js b/node_modules/async/map.js deleted file mode 100644 index ec4135d1..00000000 --- a/node_modules/async/map.js +++ /dev/null @@ -1,142 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _map2 = require('./internal/map.js'); - -var _map3 = _interopRequireDefault(_map2); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Produces a new collection of values by mapping each value in `coll` through - * the `iteratee` function. The `iteratee` is called with an item from `coll` - * and a callback for when it has finished processing. Each of these callbacks - * takes 2 arguments: an `error`, and the transformed item from `coll`. If - * `iteratee` passes an error to its callback, the main `callback` (for the - * `map` function) is immediately called with the error. - * - * Note, that since this function applies the `iteratee` to each item in - * parallel, there is no guarantee that the `iteratee` functions will complete - * in order. However, the results array will be in the same order as the - * original `coll`. - * - * If `map` is passed an Object, the results will be an Array. The results - * will roughly be in the order of the original Objects' keys (but this can - * vary across JavaScript engines). - * - * @name map - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an Array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file4.txt']; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.map(fileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes, function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * }); - * - * // Using Promises - * async.map(fileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.map(withMissingFileList, getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.map(fileList, getFileSizeInBytes); - * console.log(results); - * // results is now an array of the file size in bytes for each file, e.g. - * // [ 1000, 2000, 3000] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let results = await async.map(withMissingFileList, getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function map(coll, iteratee, callback) { - return (0, _map3.default)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(map, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapLimit.js b/node_modules/async/mapLimit.js deleted file mode 100644 index b5e461c3..00000000 --- a/node_modules/async/mapLimit.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _map2 = require('./internal/map.js'); - -var _map3 = _interopRequireDefault(_map2); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. - * - * @name mapLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function mapLimit(coll, limit, iteratee, callback) { - return (0, _map3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(mapLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapSeries.js b/node_modules/async/mapSeries.js deleted file mode 100644 index 91f36bf4..00000000 --- a/node_modules/async/mapSeries.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _map2 = require('./internal/map.js'); - -var _map3 = _interopRequireDefault(_map2); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. - * - * @name mapSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function mapSeries(coll, iteratee, callback) { - return (0, _map3.default)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(mapSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValues.js b/node_modules/async/mapValues.js deleted file mode 100644 index 00da9262..00000000 --- a/node_modules/async/mapValues.js +++ /dev/null @@ -1,152 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = mapValues; - -var _mapValuesLimit = require('./mapValuesLimit.js'); - -var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. - * - * Produces a new Object by mapping each value of `obj` through the `iteratee` - * function. The `iteratee` is called each `value` and `key` from `obj` and a - * callback for when it has finished processing. Each of these callbacks takes - * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` - * passes an error to its callback, the main `callback` (for the `mapValues` - * function) is immediately called with the error. - * - * Note, the order of the keys in the result is not guaranteed. The keys will - * be roughly in the order they complete, (but this is very engine-specific) - * - * @name mapValues - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file3.txt' - * }; - * - * const withMissingFileMap = { - * f1: 'file1.txt', - * f2: 'file2.txt', - * f3: 'file4.txt' - * }; - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, key, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.mapValues(fileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * }); - * - * // Error handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.mapValues(fileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * }).catch (err => { - * console.log(err); - * }); - * - * // Error Handling - * async.mapValues(withMissingFileMap, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch (err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.mapValues(fileMap, getFileSizeInBytes); - * console.log(result); - * // result is now a map of file size in bytes for each file, e.g. - * // { - * // f1: 1000, - * // f2: 2000, - * // f3: 3000 - * // } - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.mapValues(withMissingFileMap, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function mapValues(obj, iteratee, callback) { - return (0, _mapValuesLimit2.default)(obj, Infinity, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValuesLimit.js b/node_modules/async/mapValuesLimit.js deleted file mode 100644 index 93066ee8..00000000 --- a/node_modules/async/mapValuesLimit.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a - * time. - * - * @name mapValuesLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function mapValuesLimit(obj, limit, iteratee, callback) { - callback = (0, _once2.default)(callback); - var newObj = {}; - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _eachOfLimit2.default)(limit)(obj, (val, key, next) => { - _iteratee(val, key, (err, result) => { - if (err) return next(err); - newObj[key] = result; - next(err); - }); - }, err => callback(err, newObj)); -} - -exports.default = (0, _awaitify2.default)(mapValuesLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/mapValuesSeries.js b/node_modules/async/mapValuesSeries.js deleted file mode 100644 index 560058aa..00000000 --- a/node_modules/async/mapValuesSeries.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = mapValuesSeries; - -var _mapValuesLimit = require('./mapValuesLimit.js'); - -var _mapValuesLimit2 = _interopRequireDefault(_mapValuesLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. - * - * @name mapValuesSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function mapValuesSeries(obj, iteratee, callback) { - return (0, _mapValuesLimit2.default)(obj, 1, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/memoize.js b/node_modules/async/memoize.js deleted file mode 100644 index 6003e412..00000000 --- a/node_modules/async/memoize.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = memoize; - -var _setImmediate = require('./internal/setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Caches the results of an async function. When creating a hash to store - * function results against, the callback is omitted from the hash and an - * optional hash function can be used. - * - * **Note: if the async function errs, the result will not be cached and - * subsequent calls will call the wrapped function.** - * - * If no hash function is specified, the first argument is used as a hash key, - * which may work reasonably if it is a string or a data type that converts to a - * distinct string. Note that objects and arrays will not behave reasonably. - * Neither will cases where the other arguments are significant. In such cases, - * specify your own hash function. - * - * The cache of results is exposed as the `memo` property of the function - * returned by `memoize`. - * - * @name memoize - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function to proxy and cache results from. - * @param {Function} hasher - An optional function for generating a custom hash - * for storing results. It has all the arguments applied to it apart from the - * callback, and must be synchronous. - * @returns {AsyncFunction} a memoized version of `fn` - * @example - * - * var slow_fn = function(name, callback) { - * // do something - * callback(null, result); - * }; - * var fn = async.memoize(slow_fn); - * - * // fn can now be used as if it were slow_fn - * fn('some name', function() { - * // callback - * }); - */ -function memoize(fn, hasher = v => v) { - var memo = Object.create(null); - var queues = Object.create(null); - var _fn = (0, _wrapAsync2.default)(fn); - var memoized = (0, _initialParams2.default)((args, callback) => { - var key = hasher(...args); - if (key in memo) { - (0, _setImmediate2.default)(() => callback(null, ...memo[key])); - } else if (key in queues) { - queues[key].push(callback); - } else { - queues[key] = [callback]; - _fn(...args, (err, ...resultArgs) => { - // #1465 don't memoize if an error occurred - if (!err) { - memo[key] = resultArgs; - } - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i](err, ...resultArgs); - } - }); - } - }); - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/nextTick.js b/node_modules/async/nextTick.js deleted file mode 100644 index e6d321bc..00000000 --- a/node_modules/async/nextTick.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _setImmediate = require('./internal/setImmediate.js'); - -/** - * Calls `callback` on a later loop around the event loop. In Node.js this just - * calls `process.nextTick`. In the browser it will use `setImmediate` if - * available, otherwise `setTimeout(callback, 0)`, which means other higher - * priority events may precede the execution of `callback`. - * - * This is used internally for browser-compatibility purposes. - * - * @name nextTick - * @static - * @memberOf module:Utils - * @method - * @see [async.setImmediate]{@link module:Utils.setImmediate} - * @category Util - * @param {Function} callback - The function to call on a later loop around - * the event loop. Invoked with (args...). - * @param {...*} args... - any number of additional arguments to pass to the - * callback on the next tick. - * @example - * - * var call_order = []; - * async.nextTick(function() { - * call_order.push('two'); - * // call_order now equals ['one','two'] - * }); - * call_order.push('one'); - * - * async.setImmediate(function (a, b, c) { - * // a, b, and c equal 1, 2, and 3 - * }, 1, 2, 3); - */ -var _defer; /* istanbul ignore file */ - - -if (_setImmediate.hasNextTick) { - _defer = process.nextTick; -} else if (_setImmediate.hasSetImmediate) { - _defer = setImmediate; -} else { - _defer = _setImmediate.fallback; -} - -exports.default = (0, _setImmediate.wrap)(_defer); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/package.json b/node_modules/async/package.json deleted file mode 100644 index 9c464bc7..00000000 --- a/node_modules/async/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "async", - "description": "Higher-order functions and common patterns for asynchronous code", - "version": "3.2.4", - "main": "dist/async.js", - "author": "Caolan McMahon", - "homepage": "https://caolan.github.io/async/", - "repository": { - "type": "git", - "url": "https://github.com/caolan/async.git" - }, - "bugs": { - "url": "https://github.com/caolan/async/issues" - }, - "keywords": [ - "async", - "callback", - "module", - "utility" - ], - "devDependencies": { - "@babel/eslint-parser": "^7.16.5", - "babel-core": "^6.26.3", - "babel-minify": "^0.5.0", - "babel-plugin-add-module-exports": "^1.0.4", - "babel-plugin-istanbul": "^6.1.1", - "babel-plugin-syntax-async-generators": "^6.13.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "babel-preset-es2015": "^6.3.13", - "babel-preset-es2017": "^6.22.0", - "babel-register": "^6.26.0", - "babelify": "^10.0.0", - "benchmark": "^2.1.1", - "bluebird": "^3.4.6", - "browserify": "^17.0.0", - "chai": "^4.2.0", - "cheerio": "^0.22.0", - "es6-promise": "^4.2.8", - "eslint": "^8.6.0", - "eslint-plugin-prefer-arrow": "^1.2.3", - "fs-extra": "^10.0.0", - "jsdoc": "^3.6.2", - "karma": "^6.3.12", - "karma-browserify": "^8.1.0", - "karma-firefox-launcher": "^2.1.2", - "karma-mocha": "^2.0.1", - "karma-mocha-reporter": "^2.2.0", - "karma-safari-launcher": "^1.0.0", - "mocha": "^6.1.4", - "native-promise-only": "^0.8.0-a", - "nyc": "^15.1.0", - "rollup": "^2.66.1", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-npm": "^2.0.0", - "rsvp": "^4.8.5", - "semver": "^7.3.5", - "yargs": "^17.3.1" - }, - "scripts": { - "coverage": "nyc npm run mocha-node-test -- --grep @nycinvalid --invert", - "jsdoc": "jsdoc -c ./support/jsdoc/jsdoc.json && node support/jsdoc/jsdoc-fix-html.js", - "lint": "eslint --fix .", - "mocha-browser-test": "karma start", - "mocha-node-test": "mocha", - "mocha-test": "npm run mocha-node-test && npm run mocha-browser-test", - "test": "npm run lint && npm run mocha-node-test" - }, - "license": "MIT", - "nyc": { - "exclude": [ - "test" - ] - }, - "module": "dist/async.mjs" -} \ No newline at end of file diff --git a/node_modules/async/parallel.js b/node_modules/async/parallel.js deleted file mode 100644 index 76bc6243..00000000 --- a/node_modules/async/parallel.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = parallel; - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _parallel2 = require('./internal/parallel.js'); - -var _parallel3 = _interopRequireDefault(_parallel2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Run the `tasks` collection of functions in parallel, without waiting until - * the previous function has completed. If any of the functions pass an error to - * its callback, the main `callback` is immediately called with the value of the - * error. Once the `tasks` have completed, the results are passed to the final - * `callback` as an array. - * - * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about - * parallel execution of code. If your tasks do not use any timers or perform - * any I/O, they will actually be executed in series. Any synchronous setup - * sections for each task will happen one after the other. JavaScript remains - * single-threaded. - * - * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the - * execution of other tasks when a task fails. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.parallel}. - * - * @name parallel - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * - * //Using Callbacks - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] even though - * // the second function had a shorter timeout. - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function parallel(tasks, callback) { - return (0, _parallel3.default)(_eachOf2.default, tasks, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/parallelLimit.js b/node_modules/async/parallelLimit.js deleted file mode 100644 index dbe0bb8c..00000000 --- a/node_modules/async/parallelLimit.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = parallelLimit; - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _parallel = require('./internal/parallel.js'); - -var _parallel2 = _interopRequireDefault(_parallel); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a - * time. - * - * @name parallelLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.parallel]{@link module:ControlFlow.parallel} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - */ -function parallelLimit(tasks, limit, callback) { - return (0, _parallel2.default)((0, _eachOfLimit2.default)(limit), tasks, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/priorityQueue.js b/node_modules/async/priorityQueue.js deleted file mode 100644 index 6006f669..00000000 --- a/node_modules/async/priorityQueue.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (worker, concurrency) { - // Start with a normal queue - var q = (0, _queue2.default)(worker, concurrency); - - var { - push, - pushAsync - } = q; - - q._tasks = new _Heap2.default(); - q._createTaskItem = ({ data, priority }, callback) => { - return { - data, - priority, - callback - }; - }; - - function createDataItems(tasks, priority) { - if (!Array.isArray(tasks)) { - return { data: tasks, priority }; - } - return tasks.map(data => { - return { data, priority }; - }); - } - - // Override push to accept second parameter representing priority - q.push = function (data, priority = 0, callback) { - return push(createDataItems(data, priority), callback); - }; - - q.pushAsync = function (data, priority = 0, callback) { - return pushAsync(createDataItems(data, priority), callback); - }; - - // Remove unshift functions - delete q.unshift; - delete q.unshiftAsync; - - return q; -}; - -var _queue = require('./queue.js'); - -var _queue2 = _interopRequireDefault(_queue); - -var _Heap = require('./internal/Heap.js'); - -var _Heap2 = _interopRequireDefault(_Heap); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = exports['default']; - -/** - * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and - * completed in ascending priority order. - * - * @name priorityQueue - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. - * Invoked with (task, callback). - * @param {number} concurrency - An `integer` for determining how many `worker` - * functions should be run in parallel. If omitted, the concurrency defaults to - * `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are three - * differences between `queue` and `priorityQueue` objects: - * * `push(task, priority, [callback])` - `priority` should be a number. If an - * array of `tasks` is given, all tasks will be assigned the same priority. - * * `pushAsync(task, priority, [callback])` - the same as `priorityQueue.push`, - * except this returns a promise that rejects if an error occurs. - * * The `unshift` and `unshiftAsync` methods were removed. - */ \ No newline at end of file diff --git a/node_modules/async/queue.js b/node_modules/async/queue.js deleted file mode 100644 index c69becb8..00000000 --- a/node_modules/async/queue.js +++ /dev/null @@ -1,167 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (worker, concurrency) { - var _worker = (0, _wrapAsync2.default)(worker); - return (0, _queue2.default)((items, cb) => { - _worker(items[0], cb); - }, concurrency, 1); -}; - -var _queue = require('./internal/queue.js'); - -var _queue2 = _interopRequireDefault(_queue); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = exports['default']; - -/** - * A queue of tasks for the worker function to complete. - * @typedef {Iterable} QueueObject - * @memberOf module:ControlFlow - * @property {Function} length - a function returning the number of items - * waiting to be processed. Invoke with `queue.length()`. - * @property {boolean} started - a boolean indicating whether or not any - * items have been pushed and processed by the queue. - * @property {Function} running - a function returning the number of items - * currently being processed. Invoke with `queue.running()`. - * @property {Function} workersList - a function returning the array of items - * currently being processed. Invoke with `queue.workersList()`. - * @property {Function} idle - a function returning false if there are items - * waiting or being processed, or true if not. Invoke with `queue.idle()`. - * @property {number} concurrency - an integer for determining how many `worker` - * functions should be run in parallel. This property can be changed after a - * `queue` is created to alter the concurrency on-the-fly. - * @property {number} payload - an integer that specifies how many items are - * passed to the worker function at a time. only applies if this is a - * [cargo]{@link module:ControlFlow.cargo} object - * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` - * once the `worker` has finished processing the task. Instead of a single task, - * a `tasks` array can be submitted. The respective callback is used for every - * task in the list. Invoke with `queue.push(task, [callback])`, - * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. - * Invoke with `queue.unshift(task, [callback])`. - * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns - * a promise that rejects if an error occurs. - * @property {AsyncFunction} unshiftAsync - the same as `q.unshift`, except this returns - * a promise that rejects if an error occurs. - * @property {Function} remove - remove items from the queue that match a test - * function. The test function will be passed an object with a `data` property, - * and a `priority` property, if this is a - * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. - * Invoked with `queue.remove(testFn)`, where `testFn` is of the form - * `function ({data, priority}) {}` and returns a Boolean. - * @property {Function} saturated - a function that sets a callback that is - * called when the number of running workers hits the `concurrency` limit, and - * further tasks will be queued. If the callback is omitted, `q.saturated()` - * returns a promise for the next occurrence. - * @property {Function} unsaturated - a function that sets a callback that is - * called when the number of running workers is less than the `concurrency` & - * `buffer` limits, and further tasks will not be queued. If the callback is - * omitted, `q.unsaturated()` returns a promise for the next occurrence. - * @property {number} buffer - A minimum threshold buffer in order to say that - * the `queue` is `unsaturated`. - * @property {Function} empty - a function that sets a callback that is called - * when the last item from the `queue` is given to a `worker`. If the callback - * is omitted, `q.empty()` returns a promise for the next occurrence. - * @property {Function} drain - a function that sets a callback that is called - * when the last item from the `queue` has returned from the `worker`. If the - * callback is omitted, `q.drain()` returns a promise for the next occurrence. - * @property {Function} error - a function that sets a callback that is called - * when a task errors. Has the signature `function(error, task)`. If the - * callback is omitted, `error()` returns a promise that rejects on the next - * error. - * @property {boolean} paused - a boolean for determining whether the queue is - * in a paused state. - * @property {Function} pause - a function that pauses the processing of tasks - * until `resume()` is called. Invoke with `queue.pause()`. - * @property {Function} resume - a function that resumes the processing of - * queued tasks when the queue is paused. Invoke with `queue.resume()`. - * @property {Function} kill - a function that removes the `drain` callback and - * empties remaining tasks from the queue forcing it to go idle. No more tasks - * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. - * - * @example - * const q = async.queue(worker, 2) - * q.push(item1) - * q.push(item2) - * q.push(item3) - * // queues are iterable, spread into an array to inspect - * const items = [...q] // [item1, item2, item3] - * // or use for of - * for (let item of q) { - * console.log(item) - * } - * - * q.drain(() => { - * console.log('all done') - * }) - * // or - * await q.drain() - */ - -/** - * Creates a `queue` object with the specified `concurrency`. Tasks added to the - * `queue` are processed in parallel (up to the `concurrency` limit). If all - * `worker`s are in progress, the task is queued until one becomes available. - * Once a `worker` completes a `task`, that `task`'s callback is called. - * - * @name queue - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. Invoked with (task, callback). - * @param {number} [concurrency=1] - An `integer` for determining how many - * `worker` functions should be run in parallel. If omitted, the concurrency - * defaults to `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be - * attached as certain properties to listen for specific events during the - * lifecycle of the queue. - * @example - * - * // create a queue object with concurrency 2 - * var q = async.queue(function(task, callback) { - * console.log('hello ' + task.name); - * callback(); - * }, 2); - * - * // assign a callback - * q.drain(function() { - * console.log('all items have been processed'); - * }); - * // or await the end - * await q.drain() - * - * // assign an error callback - * q.error(function(err, task) { - * console.error('task experienced an error'); - * }); - * - * // add some items to the queue - * q.push({name: 'foo'}, function(err) { - * console.log('finished processing foo'); - * }); - * // callback is optional - * q.push({name: 'bar'}); - * - * // add some items to the queue (batch-wise) - * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { - * console.log('finished processing item'); - * }); - * - * // add some items to the front of the queue - * q.unshift({name: 'bar'}, function (err) { - * console.log('finished processing bar'); - * }); - */ \ No newline at end of file diff --git a/node_modules/async/race.js b/node_modules/async/race.js deleted file mode 100644 index 9595d884..00000000 --- a/node_modules/async/race.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Runs the `tasks` array of functions in parallel, without waiting until the - * previous function has completed. Once any of the `tasks` complete or pass an - * error to its callback, the main `callback` is immediately called. It's - * equivalent to `Promise.race()`. - * - * @name race - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} - * to run. Each function can complete with an optional `result` value. - * @param {Function} callback - A callback to run once any of the functions have - * completed. This function gets an error or result from the first function that - * completed. Invoked with (err, result). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.race([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], - * // main callback - * function(err, result) { - * // the result will be equal to 'two' as it finishes earlier - * }); - */ -function race(tasks, callback) { - callback = (0, _once2.default)(callback); - if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); - if (!tasks.length) return callback(); - for (var i = 0, l = tasks.length; i < l; i++) { - (0, _wrapAsync2.default)(tasks[i])(callback); - } -} - -exports.default = (0, _awaitify2.default)(race, 2); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reduce.js b/node_modules/async/reduce.js deleted file mode 100644 index 56e2db81..00000000 --- a/node_modules/async/reduce.js +++ /dev/null @@ -1,153 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Reduces `coll` into a single value using an async `iteratee` to return each - * successive step. `memo` is the initial state of the reduction. This function - * only operates in series. - * - * For performance reasons, it may make sense to split a call to this function - * into a parallel map, and then use the normal `Array.prototype.reduce` on the - * results. This function is for situations where each step in the reduction - * needs to be async; if you can get the data before reducing it, then it's - * probably a good idea to do so. - * - * @name reduce - * @static - * @memberOf module:Collections - * @method - * @alias inject - * @alias foldl - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * // file4.txt does not exist - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * const withMissingFileList = ['file1.txt','file2.txt','file3.txt', 'file4.txt']; - * - * // asynchronous function that computes the file size in bytes - * // file size is added to the memoized value, then returned - * function getFileSizeInBytes(memo, file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, memo + stat.size); - * }); - * } - * - * // Using callbacks - * async.reduce(fileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * } else { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes, function(err, result) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(result); - * } - * }); - * - * // Using Promises - * async.reduce(fileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * }).catch( err => { - * console.log(err); - * }); - * - * // Error Handling - * async.reduce(withMissingFileList, 0, getFileSizeInBytes) - * .then( result => { - * console.log(result); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.reduce(fileList, 0, getFileSizeInBytes); - * console.log(result); - * // 6000 - * // which is the sum of the file sizes of the three files - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // Error Handling - * async () => { - * try { - * let result = await async.reduce(withMissingFileList, 0, getFileSizeInBytes); - * console.log(result); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function reduce(coll, memo, iteratee, callback) { - callback = (0, _once2.default)(callback); - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _eachOfSeries2.default)(coll, (x, i, iterCb) => { - _iteratee(memo, x, (err, v) => { - memo = v; - iterCb(err); - }); - }, err => callback(err, memo)); -} -exports.default = (0, _awaitify2.default)(reduce, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reduceRight.js b/node_modules/async/reduceRight.js deleted file mode 100644 index bee5391d..00000000 --- a/node_modules/async/reduceRight.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reduceRight; - -var _reduce = require('./reduce.js'); - -var _reduce2 = _interopRequireDefault(_reduce); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. - * - * @name reduceRight - * @static - * @memberOf module:Collections - * @method - * @see [async.reduce]{@link module:Collections.reduce} - * @alias foldr - * @category Collection - * @param {Array} array - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee completes with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - */ -function reduceRight(array, memo, iteratee, callback) { - var reversed = [...array].reverse(); - return (0, _reduce2.default)(reversed, memo, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reflect.js b/node_modules/async/reflect.js deleted file mode 100644 index 297ed797..00000000 --- a/node_modules/async/reflect.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reflect; - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Wraps the async function in another function that always completes with a - * result object, even when it errors. - * - * The result object has either the property `error` or `value`. - * - * @name reflect - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function you want to wrap - * @returns {Function} - A function that always passes null to it's callback as - * the error. The second argument to the callback will be an `object` with - * either an `error` or a `value` property. - * @example - * - * async.parallel([ - * async.reflect(function(callback) { - * // do some stuff ... - * callback(null, 'one'); - * }), - * async.reflect(function(callback) { - * // do some more stuff but error ... - * callback('bad stuff happened'); - * }), - * async.reflect(function(callback) { - * // do some more stuff ... - * callback(null, 'two'); - * }) - * ], - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = 'bad stuff happened' - * // results[2].value = 'two' - * }); - */ -function reflect(fn) { - var _fn = (0, _wrapAsync2.default)(fn); - return (0, _initialParams2.default)(function reflectOn(args, reflectCallback) { - args.push((error, ...cbArgs) => { - let retVal = {}; - if (error) { - retVal.error = error; - } - if (cbArgs.length > 0) { - var value = cbArgs; - if (cbArgs.length <= 1) { - [value] = cbArgs; - } - retVal.value = value; - } - reflectCallback(null, retVal); - }); - - return _fn.apply(this, args); - }); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reflectAll.js b/node_modules/async/reflectAll.js deleted file mode 100644 index a862ff05..00000000 --- a/node_modules/async/reflectAll.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reflectAll; - -var _reflect = require('./reflect.js'); - -var _reflect2 = _interopRequireDefault(_reflect); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * A helper function that wraps an array or an object of functions with `reflect`. - * - * @name reflectAll - * @static - * @memberOf module:Utils - * @method - * @see [async.reflect]{@link module:Utils.reflect} - * @category Util - * @param {Array|Object|Iterable} tasks - The collection of - * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. - * @returns {Array} Returns an array of async functions, each wrapped in - * `async.reflect` - * @example - * - * let tasks = [ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * // do some more stuff but error ... - * callback(new Error('bad stuff happened')); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = Error('bad stuff happened') - * // results[2].value = 'two' - * }); - * - * // an example using an object instead of an array - * let tasks = { - * one: function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * two: function(callback) { - * callback('two'); - * }, - * three: function(callback) { - * setTimeout(function() { - * callback(null, 'three'); - * }, 100); - * } - * }; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results.one.value = 'one' - * // results.two.error = 'two' - * // results.three.value = 'three' - * }); - */ -function reflectAll(tasks) { - var results; - if (Array.isArray(tasks)) { - results = tasks.map(_reflect2.default); - } else { - results = {}; - Object.keys(tasks).forEach(key => { - results[key] = _reflect2.default.call(this, tasks[key]); - }); - } - return results; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/reject.js b/node_modules/async/reject.js deleted file mode 100644 index cabd96ea..00000000 --- a/node_modules/async/reject.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reject2 = require('./internal/reject.js'); - -var _reject3 = _interopRequireDefault(_reject2); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. - * - * @name reject - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const fileList = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.reject(fileList, fileExists, function(err, results) { - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }); - * - * // Using Promises - * async.reject(fileList, fileExists) - * .then( results => { - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.reject(fileList, fileExists); - * console.log(results); - * // [ 'dir3/file6.txt' ] - * // results now equals an array of the non-existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function reject(coll, iteratee, callback) { - return (0, _reject3.default)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(reject, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/rejectLimit.js b/node_modules/async/rejectLimit.js deleted file mode 100644 index 1a899252..00000000 --- a/node_modules/async/rejectLimit.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reject2 = require('./internal/reject.js'); - -var _reject3 = _interopRequireDefault(_reject2); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a - * time. - * - * @name rejectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function rejectLimit(coll, limit, iteratee, callback) { - return (0, _reject3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(rejectLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/rejectSeries.js b/node_modules/async/rejectSeries.js deleted file mode 100644 index 6e1a1c5e..00000000 --- a/node_modules/async/rejectSeries.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _reject2 = require('./internal/reject.js'); - -var _reject3 = _interopRequireDefault(_reject2); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. - * - * @name rejectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ -function rejectSeries(coll, iteratee, callback) { - return (0, _reject3.default)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(rejectSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/retry.js b/node_modules/async/retry.js deleted file mode 100644 index dba30301..00000000 --- a/node_modules/async/retry.js +++ /dev/null @@ -1,159 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = retry; - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _promiseCallback = require('./internal/promiseCallback.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function constant(value) { - return function () { - return value; - }; -} - -/** - * Attempts to get a successful response from `task` no more than `times` times - * before returning an error. If the task is successful, the `callback` will be - * passed the result of the successful task. If all attempts fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name retry - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @see [async.retryable]{@link module:ControlFlow.retryable} - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an - * object with `times` and `interval` or a number. - * * `times` - The number of attempts to make before giving up. The default - * is `5`. - * * `interval` - The time to wait between retries, in milliseconds. The - * default is `0`. The interval may also be specified as a function of the - * retry count (see example). - * * `errorFilter` - An optional synchronous function that is invoked on - * erroneous result. If it returns `true` the retry attempts will continue; - * if the function returns `false` the retry flow is aborted with the current - * attempt's error and result being returned to the final callback. - * Invoked with (err). - * * If `opts` is a number, the number specifies the number of times to retry, - * with the default interval of `0`. - * @param {AsyncFunction} task - An async function to retry. - * Invoked with (callback). - * @param {Function} [callback] - An optional callback which is called when the - * task has succeeded, or after the final failed attempt. It receives the `err` - * and `result` arguments of the last attempt at completing the `task`. Invoked - * with (err, results). - * @returns {Promise} a promise if no callback provided - * - * @example - * - * // The `retry` function can be used as a stand-alone control flow by passing - * // a callback, as shown below: - * - * // try calling apiMethod 3 times - * async.retry(3, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 3 times, waiting 200 ms between each retry - * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 10 times with exponential backoff - * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) - * async.retry({ - * times: 10, - * interval: function(retryCount) { - * return 50 * Math.pow(2, retryCount); - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod the default 5 times no delay between each retry - * async.retry(apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod only when error condition satisfies, all other - * // errors will abort the retry control flow and return to final callback - * async.retry({ - * errorFilter: function(err) { - * return err.message === 'Temporary error'; // only retry on a specific error - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // to retry individual methods that are not as reliable within other - * // control flow functions, use the `retryable` wrapper: - * async.auto({ - * users: api.getUsers.bind(api), - * payments: async.retryable(3, api.getPayments.bind(api)) - * }, function(err, results) { - * // do something with the results - * }); - * - */ -const DEFAULT_TIMES = 5; -const DEFAULT_INTERVAL = 0; - -function retry(opts, task, callback) { - var options = { - times: DEFAULT_TIMES, - intervalFunc: constant(DEFAULT_INTERVAL) - }; - - if (arguments.length < 3 && typeof opts === 'function') { - callback = task || (0, _promiseCallback.promiseCallback)(); - task = opts; - } else { - parseTimes(options, opts); - callback = callback || (0, _promiseCallback.promiseCallback)(); - } - - if (typeof task !== 'function') { - throw new Error("Invalid arguments for async.retry"); - } - - var _task = (0, _wrapAsync2.default)(task); - - var attempt = 1; - function retryAttempt() { - _task((err, ...args) => { - if (err === false) return; - if (err && attempt++ < options.times && (typeof options.errorFilter != 'function' || options.errorFilter(err))) { - setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); - } else { - callback(err, ...args); - } - }); - } - - retryAttempt(); - return callback[_promiseCallback.PROMISE_SYMBOL]; -} - -function parseTimes(acc, t) { - if (typeof t === 'object') { - acc.times = +t.times || DEFAULT_TIMES; - - acc.intervalFunc = typeof t.interval === 'function' ? t.interval : constant(+t.interval || DEFAULT_INTERVAL); - - acc.errorFilter = t.errorFilter; - } else if (typeof t === 'number' || typeof t === 'string') { - acc.times = +t || DEFAULT_TIMES; - } else { - throw new Error("Invalid arguments for async.retry"); - } -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/retryable.js b/node_modules/async/retryable.js deleted file mode 100644 index 1b1147cd..00000000 --- a/node_modules/async/retryable.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = retryable; - -var _retry = require('./retry.js'); - -var _retry2 = _interopRequireDefault(_retry); - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _promiseCallback = require('./internal/promiseCallback.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method - * wraps a task and makes it retryable, rather than immediately calling it - * with retries. - * - * @name retryable - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.retry]{@link module:ControlFlow.retry} - * @category Control Flow - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional - * options, exactly the same as from `retry`, except for a `opts.arity` that - * is the arity of the `task` function, defaulting to `task.length` - * @param {AsyncFunction} task - the asynchronous function to wrap. - * This function will be passed any arguments passed to the returned wrapper. - * Invoked with (...args, callback). - * @returns {AsyncFunction} The wrapped function, which when invoked, will - * retry on an error, based on the parameters specified in `opts`. - * This function will accept the same parameters as `task`. - * @example - * - * async.auto({ - * dep1: async.retryable(3, getFromFlakyService), - * process: ["dep1", async.retryable(3, function (results, cb) { - * maybeProcessData(results.dep1, cb); - * })] - * }, callback); - */ -function retryable(opts, task) { - if (!task) { - task = opts; - opts = null; - } - let arity = opts && opts.arity || task.length; - if ((0, _wrapAsync.isAsync)(task)) { - arity += 1; - } - var _task = (0, _wrapAsync2.default)(task); - return (0, _initialParams2.default)((args, callback) => { - if (args.length < arity - 1 || callback == null) { - args.push(callback); - callback = (0, _promiseCallback.promiseCallback)(); - } - function taskFn(cb) { - _task(...args, cb); - } - - if (opts) (0, _retry2.default)(opts, taskFn, callback);else (0, _retry2.default)(taskFn, callback); - - return callback[_promiseCallback.PROMISE_SYMBOL]; - }); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/select.js b/node_modules/async/select.js deleted file mode 100644 index 303dc1fb..00000000 --- a/node_modules/async/select.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns a new array of all the values in `coll` which pass an async truth - * test. This operation is performed in parallel, but the results array will be - * in the same order as the original. - * - * @name filter - * @static - * @memberOf module:Collections - * @method - * @alias select - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * - * const files = ['dir1/file1.txt','dir2/file3.txt','dir3/file6.txt']; - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.filter(files, fileExists, function(err, results) { - * if(err) { - * console.log(err); - * } else { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * }); - * - * // Using Promises - * async.filter(files, fileExists) - * .then(results => { - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let results = await async.filter(files, fileExists); - * console.log(results); - * // [ 'dir1/file1.txt', 'dir2/file3.txt' ] - * // results is now an array of the existing files - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function filter(coll, iteratee, callback) { - return (0, _filter3.default)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filter, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/selectLimit.js b/node_modules/async/selectLimit.js deleted file mode 100644 index 89e55f53..00000000 --- a/node_modules/async/selectLimit.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a - * time. - * - * @name filterLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - */ -function filterLimit(coll, limit, iteratee, callback) { - return (0, _filter3.default)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filterLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/selectSeries.js b/node_modules/async/selectSeries.js deleted file mode 100644 index a045e52c..00000000 --- a/node_modules/async/selectSeries.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _filter2 = require('./internal/filter.js'); - -var _filter3 = _interopRequireDefault(_filter2); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. - * - * @name filterSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results) - * @returns {Promise} a promise, if no callback provided - */ -function filterSeries(coll, iteratee, callback) { - return (0, _filter3.default)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(filterSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/seq.js b/node_modules/async/seq.js deleted file mode 100644 index 28c825f2..00000000 --- a/node_modules/async/seq.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = seq; - -var _reduce = require('./reduce.js'); - -var _reduce2 = _interopRequireDefault(_reduce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _promiseCallback = require('./internal/promiseCallback.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Version of the compose function that is more natural to read. Each function - * consumes the return value of the previous function. It is the equivalent of - * [compose]{@link module:ControlFlow.compose} with the arguments reversed. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name seq - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.compose]{@link module:ControlFlow.compose} - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} a function that composes the `functions` in order - * @example - * - * // Requires lodash (or underscore), express3 and dresende's orm2. - * // Part of an app, that fetches cats of the logged user. - * // This example uses `seq` function to avoid overnesting and error - * // handling clutter. - * app.get('/cats', function(request, response) { - * var User = request.models.User; - * async.seq( - * User.get.bind(User), // 'User.get' has signature (id, callback(err, data)) - * function(user, fn) { - * user.getCats(fn); // 'getCats' has signature (callback(err, data)) - * } - * )(req.session.user_id, function (err, cats) { - * if (err) { - * console.error(err); - * response.json({ status: 'error', message: err.message }); - * } else { - * response.json({ status: 'ok', message: 'Cats found', data: cats }); - * } - * }); - * }); - */ -function seq(...functions) { - var _functions = functions.map(_wrapAsync2.default); - return function (...args) { - var that = this; - - var cb = args[args.length - 1]; - if (typeof cb == 'function') { - args.pop(); - } else { - cb = (0, _promiseCallback.promiseCallback)(); - } - - (0, _reduce2.default)(_functions, args, (newargs, fn, iterCb) => { - fn.apply(that, newargs.concat((err, ...nextargs) => { - iterCb(err, nextargs); - })); - }, (err, results) => cb(err, ...results)); - - return cb[_promiseCallback.PROMISE_SYMBOL]; - }; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/series.js b/node_modules/async/series.js deleted file mode 100644 index 56e78f9f..00000000 --- a/node_modules/async/series.js +++ /dev/null @@ -1,186 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = series; - -var _parallel2 = require('./internal/parallel.js'); - -var _parallel3 = _interopRequireDefault(_parallel2); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Run the functions in the `tasks` collection in series, each one running once - * the previous function has completed. If any functions in the series pass an - * error to its callback, no more functions are run, and `callback` is - * immediately called with the value of the error. Otherwise, `callback` - * receives an array of results when `tasks` have completed. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function, and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.series}. - * - * **Note** that while many implementations preserve the order of object - * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) - * explicitly states that - * - * > The mechanics and order of enumerating the properties is not specified. - * - * So if you rely on the order in which your series of functions are executed, - * and want this to work on all platforms, consider using an array. - * - * @name series - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing - * [async functions]{@link AsyncFunction} to run in series. - * Each function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This function gets a results array (or object) - * containing all the result arguments passed to the `task` callbacks. Invoked - * with (err, result). - * @return {Promise} a promise, if no callback is passed - * @example - * - * //Using Callbacks - * async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ], function(err, results) { - * console.log(results); - * // results is equal to ['one','two'] - * }); - * - * // an example using objects instead of arrays - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }); - * - * //Using Promises - * async.series([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]).then(results => { - * console.log(results); - * // results is equal to ['one','two'] - * }).catch(err => { - * console.log(err); - * }); - * - * // an example using an object instead of an array - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }).then(results => { - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * }).catch(err => { - * console.log(err); - * }); - * - * //Using async/await - * async () => { - * try { - * let results = await async.series([ - * function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 'two'); - * }, 100); - * } - * ]); - * console.log(results); - * // results is equal to ['one','two'] - * } - * catch (err) { - * console.log(err); - * } - * } - * - * // an example using an object instead of an array - * async () => { - * try { - * let results = await async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * // do some async task - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * // then do another async task - * callback(null, 2); - * }, 100); - * } - * }); - * console.log(results); - * // results is equal to: { one: 1, two: 2 } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function series(tasks, callback) { - return (0, _parallel3.default)(_eachOfSeries2.default, tasks, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/setImmediate.js b/node_modules/async/setImmediate.js deleted file mode 100644 index c712ec3b..00000000 --- a/node_modules/async/setImmediate.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _setImmediate = require('./internal/setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Calls `callback` on a later loop around the event loop. In Node.js this just - * calls `setImmediate`. In the browser it will use `setImmediate` if - * available, otherwise `setTimeout(callback, 0)`, which means other higher - * priority events may precede the execution of `callback`. - * - * This is used internally for browser-compatibility purposes. - * - * @name setImmediate - * @static - * @memberOf module:Utils - * @method - * @see [async.nextTick]{@link module:Utils.nextTick} - * @category Util - * @param {Function} callback - The function to call on a later loop around - * the event loop. Invoked with (args...). - * @param {...*} args... - any number of additional arguments to pass to the - * callback on the next tick. - * @example - * - * var call_order = []; - * async.nextTick(function() { - * call_order.push('two'); - * // call_order now equals ['one','two'] - * }); - * call_order.push('one'); - * - * async.setImmediate(function (a, b, c) { - * // a, b, and c equal 1, 2, and 3 - * }, 1, 2, 3); - */ -exports.default = _setImmediate2.default; -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/some.js b/node_modules/async/some.js deleted file mode 100644 index 2046cf64..00000000 --- a/node_modules/async/some.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Returns `true` if at least one element in the `coll` satisfies an async test. - * If any iteratee call returns `true`, the main `callback` is immediately - * called. - * - * @name some - * @static - * @memberOf module:Collections - * @method - * @alias any - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // dir1 is a directory that contains file1.txt, file2.txt - * // dir2 is a directory that contains file3.txt, file4.txt - * // dir3 is a directory that contains file5.txt - * // dir4 does not exist - * - * // asynchronous function that checks if a file exists - * function fileExists(file, callback) { - * fs.access(file, fs.constants.F_OK, (err) => { - * callback(null, !err); - * }); - * } - * - * // Using callbacks - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - *); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists, - * function(err, result) { - * console.log(result); - * // false - * // result is false since none of the files exists - * } - *); - * - * // Using Promises - * async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists) - * .then( result => { - * console.log(result); - * // true - * // result is true since some file in the list exists - * }).catch( err => { - * console.log(err); - * }); - * - * async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists) - * .then( result => { - * console.log(result); - * // false - * // result is false since none of the files exists - * }).catch( err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir3/file5.txt'], fileExists); - * console.log(result); - * // true - * // result is true since some file in the list exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - * async () => { - * try { - * let result = await async.some(['dir1/missing.txt','dir2/missing.txt','dir4/missing.txt'], fileExists); - * console.log(result); - * // false - * // result is false since none of the files exists - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function some(coll, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)(_eachOf2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(some, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/someLimit.js b/node_modules/async/someLimit.js deleted file mode 100644 index c8a295a8..00000000 --- a/node_modules/async/someLimit.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfLimit = require('./internal/eachOfLimit.js'); - -var _eachOfLimit2 = _interopRequireDefault(_eachOfLimit); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. - * - * @name someLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anyLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someLimit(coll, limit, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)((0, _eachOfLimit2.default)(limit), coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(someLimit, 4); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/someSeries.js b/node_modules/async/someSeries.js deleted file mode 100644 index ee0654ba..00000000 --- a/node_modules/async/someSeries.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createTester = require('./internal/createTester.js'); - -var _createTester2 = _interopRequireDefault(_createTester); - -var _eachOfSeries = require('./eachOfSeries.js'); - -var _eachOfSeries2 = _interopRequireDefault(_eachOfSeries); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. - * - * @name someSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anySeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in series. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ -function someSeries(coll, iteratee, callback) { - return (0, _createTester2.default)(Boolean, res => res)(_eachOfSeries2.default, coll, iteratee, callback); -} -exports.default = (0, _awaitify2.default)(someSeries, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/sortBy.js b/node_modules/async/sortBy.js deleted file mode 100644 index d17fb6a2..00000000 --- a/node_modules/async/sortBy.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _map = require('./map.js'); - -var _map2 = _interopRequireDefault(_map); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Sorts a list by the results of running each `coll` value through an async - * `iteratee`. - * - * @name sortBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a value to use as the sort criteria as - * its `result`. - * Invoked with (item, callback). - * @param {Function} callback - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is the items - * from the original `coll` sorted by the values returned by the `iteratee` - * calls. Invoked with (err, results). - * @returns {Promise} a promise, if no callback passed - * @example - * - * // bigfile.txt is a file that is 251100 bytes in size - * // mediumfile.txt is a file that is 11000 bytes in size - * // smallfile.txt is a file that is 121 bytes in size - * - * // asynchronous function that returns the file size in bytes - * function getFileSizeInBytes(file, callback) { - * fs.stat(file, function(err, stat) { - * if (err) { - * return callback(err); - * } - * callback(null, stat.size); - * }); - * } - * - * // Using callbacks - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // By modifying the callback parameter the - * // sorting order can be influenced: - * - * // ascending order - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) return callback(getFileSizeErr); - * callback(null, fileSize); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * } - * ); - * - * // descending order - * async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], function(file, callback) { - * getFileSizeInBytes(file, function(getFileSizeErr, fileSize) { - * if (getFileSizeErr) { - * return callback(getFileSizeErr); - * } - * callback(null, fileSize * -1); - * }); - * }, function(err, results) { - * if (err) { - * console.log(err); - * } else { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'bigfile.txt', 'mediumfile.txt', 'smallfile.txt'] - * } - * } - * ); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes, - * function(err, results) { - * if (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } else { - * console.log(results); - * } - * } - * ); - * - * // Using Promises - * async.sortBy(['mediumfile.txt','smallfile.txt','bigfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * }).catch( err => { - * console.log(err); - * }); - * - * // Error handling - * async.sortBy(['mediumfile.txt','smallfile.txt','missingfile.txt'], getFileSizeInBytes) - * .then( results => { - * console.log(results); - * }).catch( err => { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * }); - * - * // Using async/await - * (async () => { - * try { - * let results = await async.sortBy(['bigfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * // results is now the original array of files sorted by - * // file size (ascending by default), e.g. - * // [ 'smallfile.txt', 'mediumfile.txt', 'bigfile.txt'] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * // Error handling - * async () => { - * try { - * let results = await async.sortBy(['missingfile.txt','mediumfile.txt','smallfile.txt'], getFileSizeInBytes); - * console.log(results); - * } - * catch (err) { - * console.log(err); - * // [ Error: ENOENT: no such file or directory ] - * } - * } - * - */ -function sortBy(coll, iteratee, callback) { - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _map2.default)(coll, (x, iterCb) => { - _iteratee(x, (err, criteria) => { - if (err) return iterCb(err); - iterCb(err, { value: x, criteria }); - }); - }, (err, results) => { - if (err) return callback(err); - callback(null, results.sort(comparator).map(v => v.value)); - }); - - function comparator(left, right) { - var a = left.criteria, - b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - } -} -exports.default = (0, _awaitify2.default)(sortBy, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timeout.js b/node_modules/async/timeout.js deleted file mode 100644 index dd58eb38..00000000 --- a/node_modules/async/timeout.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = timeout; - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Sets a time limit on an asynchronous function. If the function does not call - * its callback within the specified milliseconds, it will be called with a - * timeout error. The code property for the error object will be `'ETIMEDOUT'`. - * - * @name timeout - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} asyncFn - The async function to limit in time. - * @param {number} milliseconds - The specified time limit. - * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) - * to timeout Error for more information.. - * @returns {AsyncFunction} Returns a wrapped function that can be used with any - * of the control flow functions. - * Invoke this function with the same parameters as you would `asyncFunc`. - * @example - * - * function myFunction(foo, callback) { - * doAsyncTask(foo, function(err, data) { - * // handle errors - * if (err) return callback(err); - * - * // do some stuff ... - * - * // return processed data - * return callback(null, data); - * }); - * } - * - * var wrapped = async.timeout(myFunction, 1000); - * - * // call `wrapped` as you would `myFunction` - * wrapped({ bar: 'bar' }, function(err, data) { - * // if `myFunction` takes < 1000 ms to execute, `err` - * // and `data` will have their expected values - * - * // else `err` will be an Error with the code 'ETIMEDOUT' - * }); - */ -function timeout(asyncFn, milliseconds, info) { - var fn = (0, _wrapAsync2.default)(asyncFn); - - return (0, _initialParams2.default)((args, callback) => { - var timedOut = false; - var timer; - - function timeoutCallback() { - var name = asyncFn.name || 'anonymous'; - var error = new Error('Callback function "' + name + '" timed out.'); - error.code = 'ETIMEDOUT'; - if (info) { - error.info = info; - } - timedOut = true; - callback(error); - } - - args.push((...cbArgs) => { - if (!timedOut) { - callback(...cbArgs); - clearTimeout(timer); - } - }); - - // setup timer and call original function - timer = setTimeout(timeoutCallback, milliseconds); - fn(...args); - }); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/times.js b/node_modules/async/times.js deleted file mode 100644 index 4484c73e..00000000 --- a/node_modules/async/times.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = times; - -var _timesLimit = require('./timesLimit.js'); - -var _timesLimit2 = _interopRequireDefault(_timesLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Calls the `iteratee` function `n` times, and accumulates results in the same - * manner you would use with [map]{@link module:Collections.map}. - * - * @name times - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.map]{@link module:Collections.map} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - * @example - * - * // Pretend this is some complicated async factory - * var createUser = function(id, callback) { - * callback(null, { - * id: 'user' + id - * }); - * }; - * - * // generate 5 users - * async.times(5, function(n, next) { - * createUser(n, function(err, user) { - * next(err, user); - * }); - * }, function(err, users) { - * // we should now have 5 users - * }); - */ -function times(n, iteratee, callback) { - return (0, _timesLimit2.default)(n, Infinity, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timesLimit.js b/node_modules/async/timesLimit.js deleted file mode 100644 index 9fb0ba35..00000000 --- a/node_modules/async/timesLimit.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = timesLimit; - -var _mapLimit = require('./mapLimit.js'); - -var _mapLimit2 = _interopRequireDefault(_mapLimit); - -var _range = require('./internal/range.js'); - -var _range2 = _interopRequireDefault(_range); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a - * time. - * - * @name timesLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} count - The number of times to run the function. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see [async.map]{@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ -function timesLimit(count, limit, iteratee, callback) { - var _iteratee = (0, _wrapAsync2.default)(iteratee); - return (0, _mapLimit2.default)((0, _range2.default)(count), limit, _iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/timesSeries.js b/node_modules/async/timesSeries.js deleted file mode 100644 index a10f0cbe..00000000 --- a/node_modules/async/timesSeries.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = timesSeries; - -var _timesLimit = require('./timesLimit.js'); - -var _timesLimit2 = _interopRequireDefault(_timesLimit); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. - * - * @name timesSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ -function timesSeries(n, iteratee, callback) { - return (0, _timesLimit2.default)(n, 1, iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/transform.js b/node_modules/async/transform.js deleted file mode 100644 index 75b754e9..00000000 --- a/node_modules/async/transform.js +++ /dev/null @@ -1,173 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = transform; - -var _eachOf = require('./eachOf.js'); - -var _eachOf2 = _interopRequireDefault(_eachOf); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _promiseCallback = require('./internal/promiseCallback.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * A relative of `reduce`. Takes an Object or Array, and iterates over each - * element in parallel, each step potentially mutating an `accumulator` value. - * The type of the accumulator defaults to the type of collection passed in. - * - * @name transform - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} [accumulator] - The initial state of the transform. If omitted, - * it will default to an empty Object or Array, depending on the type of `coll` - * @param {AsyncFunction} iteratee - A function applied to each item in the - * collection that potentially modifies the accumulator. - * Invoked with (accumulator, item, key, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the transformed accumulator. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileList = ['file1.txt','file2.txt','file3.txt']; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileList, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * }); - * - * // Using Promises - * async.transform(fileList, transformFileSize) - * .then(result => { - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * (async () => { - * try { - * let result = await async.transform(fileList, transformFileSize); - * console.log(result); - * // [ '1000 Bytes', '1.95 KB', '2.93 KB' ] - * } - * catch (err) { - * console.log(err); - * } - * })(); - * - * @example - * - * // file1.txt is a file that is 1000 bytes in size - * // file2.txt is a file that is 2000 bytes in size - * // file3.txt is a file that is 3000 bytes in size - * - * // helper function that returns human-readable size format from bytes - * function formatBytes(bytes, decimals = 2) { - * // implementation not included for brevity - * return humanReadbleFilesize; - * } - * - * const fileMap = { f1: 'file1.txt', f2: 'file2.txt', f3: 'file3.txt' }; - * - * // asynchronous function that returns the file size, transformed to human-readable format - * // e.g. 1024 bytes = 1KB, 1234 bytes = 1.21 KB, 1048576 bytes = 1MB, etc. - * function transformFileSize(acc, value, key, callback) { - * fs.stat(value, function(err, stat) { - * if (err) { - * return callback(err); - * } - * acc[key] = formatBytes(stat.size); - * callback(null); - * }); - * } - * - * // Using callbacks - * async.transform(fileMap, transformFileSize, function(err, result) { - * if(err) { - * console.log(err); - * } else { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * }); - * - * // Using Promises - * async.transform(fileMap, transformFileSize) - * .then(result => { - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * }).catch(err => { - * console.log(err); - * }); - * - * // Using async/await - * async () => { - * try { - * let result = await async.transform(fileMap, transformFileSize); - * console.log(result); - * // { f1: '1000 Bytes', f2: '1.95 KB', f3: '2.93 KB' } - * } - * catch (err) { - * console.log(err); - * } - * } - * - */ -function transform(coll, accumulator, iteratee, callback) { - if (arguments.length <= 3 && typeof accumulator === 'function') { - callback = iteratee; - iteratee = accumulator; - accumulator = Array.isArray(coll) ? [] : {}; - } - callback = (0, _once2.default)(callback || (0, _promiseCallback.promiseCallback)()); - var _iteratee = (0, _wrapAsync2.default)(iteratee); - - (0, _eachOf2.default)(coll, (v, k, cb) => { - _iteratee(accumulator, v, k, cb); - }, err => callback(err, accumulator)); - return callback[_promiseCallback.PROMISE_SYMBOL]; -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/tryEach.js b/node_modules/async/tryEach.js deleted file mode 100644 index 82fe8ec1..00000000 --- a/node_modules/async/tryEach.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _eachSeries = require('./eachSeries.js'); - -var _eachSeries2 = _interopRequireDefault(_eachSeries); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * It runs each task in series but stops whenever any of the functions were - * successful. If one of the tasks were successful, the `callback` will be - * passed the result of the successful task. If all tasks fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name tryEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to - * run, each function is passed a `callback(err, result)` it must call on - * completion with an error `err` (which can be `null`) and an optional `result` - * value. - * @param {Function} [callback] - An optional callback which is called when one - * of the tasks has succeeded, or all have failed. It receives the `err` and - * `result` arguments of the last attempt at completing the `task`. Invoked with - * (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * async.tryEach([ - * function getDataFromFirstWebsite(callback) { - * // Try getting the data from the first website - * callback(err, data); - * }, - * function getDataFromSecondWebsite(callback) { - * // First website failed, - * // Try getting the data from the backup website - * callback(err, data); - * } - * ], - * // optional callback - * function(err, results) { - * Now do something with the data. - * }); - * - */ -function tryEach(tasks, callback) { - var error = null; - var result; - return (0, _eachSeries2.default)(tasks, (task, taskCb) => { - (0, _wrapAsync2.default)(task)((err, ...args) => { - if (err === false) return taskCb(err); - - if (args.length < 2) { - [result] = args; - } else { - result = args; - } - error = err; - taskCb(err ? null : {}); - }); - }, () => callback(error, result)); -} - -exports.default = (0, _awaitify2.default)(tryEach); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/unmemoize.js b/node_modules/async/unmemoize.js deleted file mode 100644 index 47a92b42..00000000 --- a/node_modules/async/unmemoize.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = unmemoize; -/** - * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, - * unmemoized form. Handy for testing. - * - * @name unmemoize - * @static - * @memberOf module:Utils - * @method - * @see [async.memoize]{@link module:Utils.memoize} - * @category Util - * @param {AsyncFunction} fn - the memoized function - * @returns {AsyncFunction} a function that calls the original unmemoized function - */ -function unmemoize(fn) { - return (...args) => { - return (fn.unmemoized || fn)(...args); - }; -} -module.exports = exports["default"]; \ No newline at end of file diff --git a/node_modules/async/until.js b/node_modules/async/until.js deleted file mode 100644 index 3c71e514..00000000 --- a/node_modules/async/until.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = until; - -var _whilst = require('./whilst.js'); - -var _whilst2 = _interopRequireDefault(_whilst); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. `callback` will be passed an error and any - * arguments passed to the final `iteratee`'s callback. - * - * The inverse of [whilst]{@link module:ControlFlow.whilst}. - * - * @name until - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (callback). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * const results = [] - * let finished = false - * async.until(function test(cb) { - * cb(null, finished) - * }, function iter(next) { - * fetchPage(url, (err, body) => { - * if (err) return next(err) - * results = results.concat(body.objects) - * finished = !!body.next - * next(err) - * }) - * }, function done (err) { - * // all pages have been fetched - * }) - */ -function until(test, iteratee, callback) { - const _test = (0, _wrapAsync2.default)(test); - return (0, _whilst2.default)(cb => _test((err, truth) => cb(err, !truth)), iteratee, callback); -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/waterfall.js b/node_modules/async/waterfall.js deleted file mode 100644 index fcd0dc1c..00000000 --- a/node_modules/async/waterfall.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _once = require('./internal/once.js'); - -var _once2 = _interopRequireDefault(_once); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Runs the `tasks` array of functions in series, each passing their results to - * the next in the array. However, if any of the `tasks` pass an error to their - * own callback, the next function is not executed, and the main `callback` is - * immediately called with the error. - * - * @name waterfall - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} - * to run. - * Each function should complete with any number of `result` values. - * The `result` values will be passed as arguments, in order, to the next task. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This will be passed the results of the last task's - * callback. Invoked with (err, [results]). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * async.waterfall([ - * function(callback) { - * callback(null, 'one', 'two'); - * }, - * function(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * }, - * function(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - * ], function (err, result) { - * // result now equals 'done' - * }); - * - * // Or, with named functions: - * async.waterfall([ - * myFirstFunction, - * mySecondFunction, - * myLastFunction, - * ], function (err, result) { - * // result now equals 'done' - * }); - * function myFirstFunction(callback) { - * callback(null, 'one', 'two'); - * } - * function mySecondFunction(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * } - * function myLastFunction(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - */ -function waterfall(tasks, callback) { - callback = (0, _once2.default)(callback); - if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); - if (!tasks.length) return callback(); - var taskIndex = 0; - - function nextTask(args) { - var task = (0, _wrapAsync2.default)(tasks[taskIndex++]); - task(...args, (0, _onlyOnce2.default)(next)); - } - - function next(err, ...args) { - if (err === false) return; - if (err || taskIndex === tasks.length) { - return callback(err, ...args); - } - nextTask(args); - } - - nextTask([]); -} - -exports.default = (0, _awaitify2.default)(waterfall); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/whilst.js b/node_modules/async/whilst.js deleted file mode 100644 index 32a47762..00000000 --- a/node_modules/async/whilst.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _onlyOnce = require('./internal/onlyOnce.js'); - -var _onlyOnce2 = _interopRequireDefault(_onlyOnce); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -var _wrapAsync2 = _interopRequireDefault(_wrapAsync); - -var _awaitify = require('./internal/awaitify.js'); - -var _awaitify2 = _interopRequireDefault(_awaitify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. - * - * @name whilst - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` passes. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - * @example - * - * var count = 0; - * async.whilst( - * function test(cb) { cb(null, count < 5); }, - * function iter(callback) { - * count++; - * setTimeout(function() { - * callback(null, count); - * }, 1000); - * }, - * function (err, n) { - * // 5 seconds have passed, n = 5 - * } - * ); - */ -function whilst(test, iteratee, callback) { - callback = (0, _onlyOnce2.default)(callback); - var _fn = (0, _wrapAsync2.default)(iteratee); - var _test = (0, _wrapAsync2.default)(test); - var results = []; - - function next(err, ...rest) { - if (err) return callback(err); - results = rest; - if (err === false) return; - _test(check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback(null, ...results); - _fn(next); - } - - return _test(check); -} -exports.default = (0, _awaitify2.default)(whilst, 3); -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/async/wrapSync.js b/node_modules/async/wrapSync.js deleted file mode 100644 index 3c3bf886..00000000 --- a/node_modules/async/wrapSync.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = asyncify; - -var _initialParams = require('./internal/initialParams.js'); - -var _initialParams2 = _interopRequireDefault(_initialParams); - -var _setImmediate = require('./internal/setImmediate.js'); - -var _setImmediate2 = _interopRequireDefault(_setImmediate); - -var _wrapAsync = require('./internal/wrapAsync.js'); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Take a sync function and make it async, passing its return value to a - * callback. This is useful for plugging sync functions into a waterfall, - * series, or other async functions. Any arguments passed to the generated - * function will be passed to the wrapped function (except for the final - * callback argument). Errors thrown will be passed to the callback. - * - * If the function passed to `asyncify` returns a Promise, that promises's - * resolved/rejected state will be used to call the callback, rather than simply - * the synchronous return value. - * - * This also means you can asyncify ES2017 `async` functions. - * - * @name asyncify - * @static - * @memberOf module:Utils - * @method - * @alias wrapSync - * @category Util - * @param {Function} func - The synchronous function, or Promise-returning - * function to convert to an {@link AsyncFunction}. - * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be - * invoked with `(args..., callback)`. - * @example - * - * // passing a regular synchronous function - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(JSON.parse), - * function (data, next) { - * // data is the result of parsing the text. - * // If there was a parsing error, it would have been caught. - * } - * ], callback); - * - * // passing a function returning a promise - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(function (contents) { - * return db.model.create(contents); - * }), - * function (model, next) { - * // `model` is the instantiated model object. - * // If there was an error, this function would be skipped. - * } - * ], callback); - * - * // es2017 example, though `asyncify` is not needed if your JS environment - * // supports async functions out of the box - * var q = async.queue(async.asyncify(async function(file) { - * var intermediateStep = await processFile(file); - * return await somePromise(intermediateStep) - * })); - * - * q.push(files); - */ -function asyncify(func) { - if ((0, _wrapAsync.isAsync)(func)) { - return function (...args /*, callback*/) { - const callback = args.pop(); - const promise = func.apply(this, args); - return handlePromise(promise, callback); - }; - } - - return (0, _initialParams2.default)(function (args, callback) { - var result; - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } - // if result is Promise object - if (result && typeof result.then === 'function') { - return handlePromise(result, callback); - } else { - callback(null, result); - } - }); -} - -function handlePromise(promise, callback) { - return promise.then(value => { - invokeCallback(callback, null, value); - }, err => { - invokeCallback(callback, err && err.message ? err : new Error(err)); - }); -} - -function invokeCallback(callback, error, value) { - try { - callback(error, value); - } catch (err) { - (0, _setImmediate2.default)(e => { - throw e; - }, err); - } -} -module.exports = exports['default']; \ No newline at end of file diff --git a/node_modules/asynckit/LICENSE b/node_modules/asynckit/LICENSE deleted file mode 100644 index c9eca5dd..00000000 --- a/node_modules/asynckit/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Alex Indigo - -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/asynckit/README.md b/node_modules/asynckit/README.md deleted file mode 100644 index ddcc7e6b..00000000 --- a/node_modules/asynckit/README.md +++ /dev/null @@ -1,233 +0,0 @@ -# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit) - -Minimal async jobs utility library, with streams support. - -[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit) -[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit) -[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit) - -[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master) -[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit) -[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit) - - - -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 deleted file mode 100644 index c612f1a5..00000000 --- a/node_modules/asynckit/bench.js +++ /dev/null @@ -1,76 +0,0 @@ -/* 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 deleted file mode 100644 index 455f9454..00000000 --- a/node_modules/asynckit/index.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = -{ - parallel : require('./parallel.js'), - serial : require('./serial.js'), - serialOrdered : require('./serialOrdered.js') -}; diff --git a/node_modules/asynckit/lib/abort.js b/node_modules/asynckit/lib/abort.js deleted file mode 100644 index 114367e5..00000000 --- a/node_modules/asynckit/lib/abort.js +++ /dev/null @@ -1,29 +0,0 @@ -// API -module.exports = abort; - -/** - * Aborts leftover active jobs - * - * @param {object} state - current state object - */ -function abort(state) -{ - Object.keys(state.jobs).forEach(clean.bind(state)); - - // reset leftover jobs - state.jobs = {}; -} - -/** - * Cleans up leftover job by invoking abort function for the provided job id - * - * @this state - * @param {string|number} key - job id to abort - */ -function clean(key) -{ - if (typeof this.jobs[key] == 'function') - { - this.jobs[key](); - } -} diff --git a/node_modules/asynckit/lib/async.js b/node_modules/asynckit/lib/async.js deleted file mode 100644 index 7f1288a4..00000000 --- a/node_modules/asynckit/lib/async.js +++ /dev/null @@ -1,34 +0,0 @@ -var defer = require('./defer.js'); - -// API -module.exports = async; - -/** - * Runs provided callback asynchronously - * even if callback itself is not - * - * @param {function} callback - callback to invoke - * @returns {function} - augmented callback - */ -function async(callback) -{ - var isAsync = false; - - // check if async happened - defer(function() { isAsync = true; }); - - return function async_callback(err, result) - { - if (isAsync) - { - callback(err, result); - } - else - { - defer(function nextTick_callback() - { - callback(err, result); - }); - } - }; -} diff --git a/node_modules/asynckit/lib/defer.js b/node_modules/asynckit/lib/defer.js deleted file mode 100644 index b67110c7..00000000 --- a/node_modules/asynckit/lib/defer.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = defer; - -/** - * Runs provided function on next iteration of the event loop - * - * @param {function} fn - function to run - */ -function defer(fn) -{ - var nextTick = typeof setImmediate == 'function' - ? setImmediate - : ( - typeof process == 'object' && typeof process.nextTick == 'function' - ? process.nextTick - : null - ); - - if (nextTick) - { - nextTick(fn); - } - else - { - setTimeout(fn, 0); - } -} diff --git a/node_modules/asynckit/lib/iterate.js b/node_modules/asynckit/lib/iterate.js deleted file mode 100644 index 5d2839a5..00000000 --- a/node_modules/asynckit/lib/iterate.js +++ /dev/null @@ -1,75 +0,0 @@ -var async = require('./async.js') - , abort = require('./abort.js') - ; - -// API -module.exports = iterate; - -/** - * Iterates over each job object - * - * @param {array|object} list - array or object (named list) to iterate over - * @param {function} iterator - iterator to run - * @param {object} state - current job status - * @param {function} callback - invoked when all elements processed - */ -function iterate(list, iterator, state, callback) -{ - // store current index - var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; - - state.jobs[key] = runJob(iterator, key, list[key], function(error, output) - { - // don't repeat yourself - // skip secondary callbacks - if (!(key in state.jobs)) - { - return; - } - - // clean up jobs - delete state.jobs[key]; - - if (error) - { - // don't process rest of the results - // stop still active jobs - // and reset the list - abort(state); - } - else - { - state.results[key] = output; - } - - // return salvaged results - callback(error, state.results); - }); -} - -/** - * Runs iterator over provided job element - * - * @param {function} iterator - iterator to invoke - * @param {string|number} key - key/index of the element in the list of jobs - * @param {mixed} item - job description - * @param {function} callback - invoked after iterator is done with the job - * @returns {function|mixed} - job abort function or something else - */ -function runJob(iterator, key, item, callback) -{ - var aborter; - - // allow shortcut if iterator expects only two arguments - if (iterator.length == 2) - { - aborter = iterator(item, async(callback)); - } - // otherwise go with full three arguments - else - { - aborter = iterator(item, key, async(callback)); - } - - return aborter; -} diff --git a/node_modules/asynckit/lib/readable_asynckit.js b/node_modules/asynckit/lib/readable_asynckit.js deleted file mode 100644 index 78ad240f..00000000 --- a/node_modules/asynckit/lib/readable_asynckit.js +++ /dev/null @@ -1,91 +0,0 @@ -var streamify = require('./streamify.js') - , defer = require('./defer.js') - ; - -// API -module.exports = ReadableAsyncKit; - -/** - * Base constructor for all streams - * used to hold properties/methods - */ -function ReadableAsyncKit() -{ - ReadableAsyncKit.super_.apply(this, arguments); - - // list of active jobs - this.jobs = {}; - - // add stream methods - this.destroy = destroy; - this._start = _start; - this._read = _read; -} - -/** - * Destroys readable stream, - * by aborting outstanding jobs - * - * @returns {void} - */ -function destroy() -{ - if (this.destroyed) - { - return; - } - - this.destroyed = true; - - if (typeof this.terminator == 'function') - { - this.terminator(); - } -} - -/** - * Starts provided jobs in async manner - * - * @private - */ -function _start() -{ - // first argument – runner function - var runner = arguments[0] - // take away first argument - , args = Array.prototype.slice.call(arguments, 1) - // second argument - input data - , input = args[0] - // last argument - result callback - , endCb = streamify.callback.call(this, args[args.length - 1]) - ; - - args[args.length - 1] = endCb; - // third argument - iterator - args[1] = streamify.iterator.call(this, args[1]); - - // allow time for proper setup - defer(function() - { - if (!this.destroyed) - { - this.terminator = runner.apply(null, args); - } - else - { - endCb(null, Array.isArray(input) ? [] : {}); - } - }.bind(this)); -} - - -/** - * Implement _read to comply with Readable streams - * Doesn't really make sense for flowing object mode - * - * @private - */ -function _read() -{ - -} diff --git a/node_modules/asynckit/lib/readable_parallel.js b/node_modules/asynckit/lib/readable_parallel.js deleted file mode 100644 index 5d2929f7..00000000 --- a/node_modules/asynckit/lib/readable_parallel.js +++ /dev/null @@ -1,25 +0,0 @@ -var parallel = require('../parallel.js'); - -// API -module.exports = ReadableParallel; - -/** - * Streaming wrapper to `asynckit.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 {stream.Readable#} - */ -function ReadableParallel(list, iterator, callback) -{ - if (!(this instanceof ReadableParallel)) - { - return new ReadableParallel(list, iterator, callback); - } - - // turn on object mode - ReadableParallel.super_.call(this, {objectMode: true}); - - this._start(parallel, list, iterator, callback); -} diff --git a/node_modules/asynckit/lib/readable_serial.js b/node_modules/asynckit/lib/readable_serial.js deleted file mode 100644 index 78226982..00000000 --- a/node_modules/asynckit/lib/readable_serial.js +++ /dev/null @@ -1,25 +0,0 @@ -var serial = require('../serial.js'); - -// API -module.exports = ReadableSerial; - -/** - * Streaming wrapper to `asynckit.serial` - * - * @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 {stream.Readable#} - */ -function ReadableSerial(list, iterator, callback) -{ - if (!(this instanceof ReadableSerial)) - { - return new ReadableSerial(list, iterator, callback); - } - - // turn on object mode - ReadableSerial.super_.call(this, {objectMode: true}); - - this._start(serial, list, iterator, callback); -} diff --git a/node_modules/asynckit/lib/readable_serial_ordered.js b/node_modules/asynckit/lib/readable_serial_ordered.js deleted file mode 100644 index 3de89c47..00000000 --- a/node_modules/asynckit/lib/readable_serial_ordered.js +++ /dev/null @@ -1,29 +0,0 @@ -var serialOrdered = require('../serialOrdered.js'); - -// API -module.exports = ReadableSerialOrdered; -// expose sort helpers -module.exports.ascending = serialOrdered.ascending; -module.exports.descending = serialOrdered.descending; - -/** - * Streaming wrapper to `asynckit.serialOrdered` - * - * @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 {stream.Readable#} - */ -function ReadableSerialOrdered(list, iterator, sortMethod, callback) -{ - if (!(this instanceof ReadableSerialOrdered)) - { - return new ReadableSerialOrdered(list, iterator, sortMethod, callback); - } - - // turn on object mode - ReadableSerialOrdered.super_.call(this, {objectMode: true}); - - this._start(serialOrdered, list, iterator, sortMethod, callback); -} diff --git a/node_modules/asynckit/lib/state.js b/node_modules/asynckit/lib/state.js deleted file mode 100644 index cbea7ad8..00000000 --- a/node_modules/asynckit/lib/state.js +++ /dev/null @@ -1,37 +0,0 @@ -// API -module.exports = state; - -/** - * Creates initial state object - * for iteration over list - * - * @param {array|object} list - list to iterate over - * @param {function|null} sortMethod - function to use for keys sort, - * or `null` to keep them as is - * @returns {object} - initial state object - */ -function state(list, sortMethod) -{ - var isNamedList = !Array.isArray(list) - , initState = - { - index : 0, - keyedList: isNamedList || sortMethod ? Object.keys(list) : null, - jobs : {}, - results : isNamedList ? {} : [], - size : isNamedList ? Object.keys(list).length : list.length - } - ; - - if (sortMethod) - { - // sort array keys based on it's values - // sort object's keys just on own merit - initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) - { - return sortMethod(list[a], list[b]); - }); - } - - return initState; -} diff --git a/node_modules/asynckit/lib/streamify.js b/node_modules/asynckit/lib/streamify.js deleted file mode 100644 index f56a1c92..00000000 --- a/node_modules/asynckit/lib/streamify.js +++ /dev/null @@ -1,141 +0,0 @@ -var async = require('./async.js'); - -// API -module.exports = { - iterator: wrapIterator, - callback: wrapCallback -}; - -/** - * Wraps iterators with long signature - * - * @this ReadableAsyncKit# - * @param {function} iterator - function to wrap - * @returns {function} - wrapped function - */ -function wrapIterator(iterator) -{ - var stream = this; - - return function(item, key, cb) - { - var aborter - , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) - ; - - stream.jobs[key] = wrappedCb; - - // it's either shortcut (item, cb) - if (iterator.length == 2) - { - aborter = iterator(item, wrappedCb); - } - // or long format (item, key, cb) - else - { - aborter = iterator(item, key, wrappedCb); - } - - return aborter; - }; -} - -/** - * Wraps provided callback function - * allowing to execute snitch function before - * real callback - * - * @this ReadableAsyncKit# - * @param {function} callback - function to wrap - * @returns {function} - wrapped function - */ -function wrapCallback(callback) -{ - var stream = this; - - var wrapped = function(error, result) - { - return finisher.call(stream, error, result, callback); - }; - - return wrapped; -} - -/** - * Wraps provided iterator callback function - * makes sure snitch only called once, - * but passes secondary calls to the original callback - * - * @this ReadableAsyncKit# - * @param {function} callback - callback to wrap - * @param {number|string} key - iteration key - * @returns {function} wrapped callback - */ -function wrapIteratorCallback(callback, key) -{ - var stream = this; - - return function(error, output) - { - // don't repeat yourself - if (!(key in stream.jobs)) - { - callback(error, output); - return; - } - - // clean up jobs - delete stream.jobs[key]; - - return streamer.call(stream, error, {key: key, value: output}, callback); - }; -} - -/** - * Stream wrapper for iterator callback - * - * @this ReadableAsyncKit# - * @param {mixed} error - error response - * @param {mixed} output - iterator output - * @param {function} callback - callback that expects iterator results - */ -function streamer(error, output, callback) -{ - if (error && !this.error) - { - this.error = error; - this.pause(); - this.emit('error', error); - // send back value only, as expected - callback(error, output && output.value); - return; - } - - // stream stuff - this.push(output); - - // back to original track - // send back value only, as expected - callback(error, output && output.value); -} - -/** - * Stream wrapper for finishing callback - * - * @this ReadableAsyncKit# - * @param {mixed} error - error response - * @param {mixed} output - iterator output - * @param {function} callback - callback that expects final results - */ -function finisher(error, output, callback) -{ - // signal end of the stream - // only for successfully finished streams - if (!error) - { - this.push(null); - } - - // back to original track - callback(error, output); -} diff --git a/node_modules/asynckit/lib/terminator.js b/node_modules/asynckit/lib/terminator.js deleted file mode 100644 index d6eb9921..00000000 --- a/node_modules/asynckit/lib/terminator.js +++ /dev/null @@ -1,29 +0,0 @@ -var abort = require('./abort.js') - , async = require('./async.js') - ; - -// API -module.exports = terminator; - -/** - * Terminates jobs in the attached state context - * - * @this AsyncKitState# - * @param {function} callback - final callback to invoke after termination - */ -function terminator(callback) -{ - if (!Object.keys(this.jobs).length) - { - return; - } - - // fast forward iteration index - this.index = this.size; - - // abort jobs - abort(this); - - // send back results we have so far - async(callback)(null, this.results); -} diff --git a/node_modules/asynckit/package.json b/node_modules/asynckit/package.json deleted file mode 100644 index 51147d65..00000000 --- a/node_modules/asynckit/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "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 deleted file mode 100644 index 3c50344d..00000000 --- a/node_modules/asynckit/parallel.js +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index 6cd949a6..00000000 --- a/node_modules/asynckit/serial.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 607eafea..00000000 --- a/node_modules/asynckit/serialOrdered.js +++ /dev/null @@ -1,75 +0,0 @@ -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 deleted file mode 100644 index d43465f9..00000000 --- a/node_modules/asynckit/stream.js +++ /dev/null @@ -1,21 +0,0 @@ -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/aws-sign2/LICENSE b/node_modules/aws-sign2/LICENSE deleted file mode 100644 index a4a9aee0..00000000 --- a/node_modules/aws-sign2/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 763564e0..00000000 --- a/node_modules/aws-sign2/README.md +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index fb35f6db..00000000 --- a/node_modules/aws-sign2/index.js +++ /dev/null @@ -1,212 +0,0 @@ - -/*! - * 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 deleted file mode 100644 index 4c3d57e5..00000000 --- a/node_modules/aws-sign2/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "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 deleted file mode 100644 index b7fdd974..00000000 --- a/node_modules/aws4/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -github: mhart diff --git a/node_modules/aws4/.travis.yml b/node_modules/aws4/.travis.yml deleted file mode 100644 index 178bf31e..00000000 --- a/node_modules/aws4/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 4f321e59..00000000 --- a/node_modules/aws4/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 4e9e66fb..00000000 --- a/node_modules/aws4/README.md +++ /dev/null @@ -1,213 +0,0 @@ -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 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":[]} -... -*/ - -// you can also specify extra headers to ignore during signing -request(aws4.sign({ - host: '07tjusf2h91cunochc.us-east-1.aoss.amazonaws.com', - method: 'PUT', - path: '/my-index', - body: '{"mappings":{}}', - headers: { - 'Content-Type': 'application/json', - 'X-Amz-Content-Sha256': 'UNSIGNED-PAYLOAD' - }, - extraHeadersToIgnore: { - 'content-length': true - } -})) - -// and headers to include that would normally be ignored -request(aws4.sign({ - service: 'mycustomservice', - path: '/whatever', - headers: { - 'Range': 'bytes=200-1000, 2000-6576, 19000-' - }, - extraHeadersToInclude: { - 'range': true - } -})) - - -// 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) -- `extraHeadersToIgnore` (an object with lowercase header keys to ignore when signing, eg `{ 'content-length': true }`) -- `extraHeadersToInclude` (an object with lowercase header keys to include when signing, overriding any ignores) -- `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 deleted file mode 100644 index b0cfb7c1..00000000 --- a/node_modules/aws4/aws4.js +++ /dev/null @@ -1,381 +0,0 @@ -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' - - this.extraHeadersToIgnore = request.extraHeadersToIgnore || Object.create(null) - this.extraHeadersToInclude = request.extraHeadersToInclude || Object.create(null) -} - -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[1] === 'aoss') - 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() { - var extraHeadersToInclude = this.extraHeadersToInclude, - extraHeadersToIgnore = this.extraHeadersToIgnore - return Object.keys(this.request.headers) - .map(function(key) { return key.toLowerCase() }) - .filter(function(key) { - return extraHeadersToInclude[key] || - (HEADERS_TO_IGNORE[key] == null && !extraHeadersToIgnore[key]) - }) - .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 deleted file mode 100644 index 333f66a4..00000000 --- a/node_modules/aws4/lru.js +++ /dev/null @@ -1,96 +0,0 @@ -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 deleted file mode 100644 index 534b31d6..00000000 --- a/node_modules/aws4/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "aws4", - "version": "1.12.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/balanced-match/.github/FUNDING.yml b/node_modules/balanced-match/.github/FUNDING.yml deleted file mode 100644 index cea8b16e..00000000 --- a/node_modules/balanced-match/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -tidelift: "npm/balanced-match" -patreon: juliangruber diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md deleted file mode 100644 index 2cdc8e41..00000000 --- a/node_modules/balanced-match/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -(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 deleted file mode 100644 index d2a48b6b..00000000 --- a/node_modules/balanced-match/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# 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 -``` - -## Security contact information - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. - -## 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 deleted file mode 100644 index c67a6460..00000000 --- a/node_modules/balanced-match/index.js +++ /dev/null @@ -1,62 +0,0 @@ -'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) { - if(a===b) { - return [ai, bi]; - } - 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 deleted file mode 100644 index ce6073e0..00000000 --- a/node_modules/balanced-match/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "balanced-match", - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "version": "1.0.2", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "main": "index.js", - "scripts": { - "test": "tape test/test.js", - "bench": "matcha test/bench.js" - }, - "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/bcrypt-pbkdf/CONTRIBUTING.md b/node_modules/bcrypt-pbkdf/CONTRIBUTING.md deleted file mode 100644 index 401d34ed..00000000 --- a/node_modules/bcrypt-pbkdf/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# 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 deleted file mode 100644 index fc58d2ab..00000000 --- a/node_modules/bcrypt-pbkdf/LICENSE +++ /dev/null @@ -1,66 +0,0 @@ -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 deleted file mode 100644 index 7551f335..00000000 --- a/node_modules/bcrypt-pbkdf/README.md +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index b1b5ad4b..00000000 --- a/node_modules/bcrypt-pbkdf/index.js +++ /dev/null @@ -1,556 +0,0 @@ -'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 deleted file mode 100644 index e93a969b..00000000 --- a/node_modules/bcrypt-pbkdf/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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 deleted file mode 100644 index 4aab3837..00000000 --- a/node_modules/binary-extensions/binary-extensions.json +++ /dev/null @@ -1,260 +0,0 @@ -[ - "3dm", - "3ds", - "3g2", - "3gp", - "7z", - "a", - "aac", - "adp", - "ai", - "aif", - "aiff", - "alz", - "ape", - "apk", - "appimage", - "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", - "flatpak", - "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", - "odp", - "ods", - "odt", - "oga", - "ogg", - "ogv", - "otf", - "ott", - "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", - "rpm", - "rtf", - "rz", - "s3m", - "s7z", - "scpt", - "sgi", - "shar", - "snap", - "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/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts deleted file mode 100644 index 94a248c2..00000000 --- a/node_modules/binary-extensions/binary-extensions.json.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const binaryExtensionsJson: readonly string[]; - -export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts deleted file mode 100644 index f469ac5f..00000000 --- a/node_modules/binary-extensions/index.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** -List of binary file extensions. - -@example -``` -import binaryExtensions = require('binary-extensions'); - -console.log(binaryExtensions); -//=> ['3ds', '3g2', …] -``` -*/ -declare const binaryExtensions: readonly string[]; - -export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js deleted file mode 100644 index d46e4688..00000000 --- a/node_modules/binary-extensions/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license deleted file mode 100644 index 401b1c73..00000000 --- a/node_modules/binary-extensions/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.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 deleted file mode 100644 index c4d36417..00000000 --- a/node_modules/binary-extensions/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "binary-extensions", - "version": "2.2.0", - "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": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts", - "binary-extensions.json", - "binary-extensions.json.d.ts" - ], - "keywords": [ - "binary", - "extensions", - "extension", - "file", - "json", - "list", - "array" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md deleted file mode 100644 index 3e25dd83..00000000 --- a/node_modules/binary-extensions/readme.md +++ /dev/null @@ -1,41 +0,0 @@ -# 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 - - ---- - - diff --git a/node_modules/body-parser/HISTORY.md b/node_modules/body-parser/HISTORY.md deleted file mode 100644 index fb212b36..00000000 --- a/node_modules/body-parser/HISTORY.md +++ /dev/null @@ -1,657 +0,0 @@ -1.20.1 / 2022-10-06 -=================== - - * deps: qs@6.11.0 - * perf: remove unnecessary object clone - -1.20.0 / 2022-04-02 -=================== - - * Fix error message for json parse whitespace in `strict` - * Fix internal error when inflated body exceeds limit - * Prevent loss of async hooks context - * Prevent hanging when request already read - * deps: depd@2.0.0 - - Replace internal `eval` usage with `Function` constructor - - Use instance methods on `process` to check for listeners - * deps: http-errors@2.0.0 - - deps: depd@2.0.0 - - deps: statuses@2.0.1 - * deps: on-finished@2.4.1 - * deps: qs@6.10.3 - * deps: raw-body@2.5.1 - - deps: http-errors@2.0.0 - -1.19.2 / 2022-02-15 -=================== - - * deps: bytes@3.1.2 - * deps: qs@6.9.7 - * Fix handling of `__proto__` keys - * deps: raw-body@2.4.3 - - deps: bytes@3.1.2 - -1.19.1 / 2021-12-10 -=================== - - * deps: bytes@3.1.1 - * deps: http-errors@1.8.1 - - deps: inherits@2.0.4 - - deps: toidentifier@1.0.1 - - deps: setprototypeof@1.2.0 - * deps: qs@6.9.6 - * deps: raw-body@2.4.2 - - deps: bytes@3.1.1 - - deps: http-errors@1.8.1 - * deps: safe-buffer@5.2.1 - * deps: type-is@~1.6.18 - -1.19.0 / 2019-04-25 -=================== - - * deps: bytes@3.1.0 - - Add petabyte (`pb`) support - * deps: http-errors@1.7.2 - - Set constructor name when possible - - deps: setprototypeof@1.1.1 - - deps: statuses@'>= 1.5.0 < 2' - * deps: iconv-lite@0.4.24 - - Added encoding MIK - * deps: qs@6.7.0 - - Fix parsing array brackets after index - * deps: raw-body@2.4.0 - - deps: bytes@3.1.0 - - deps: http-errors@1.7.2 - - deps: iconv-lite@0.4.24 - * deps: type-is@~1.6.17 - - deps: mime-types@~2.1.24 - - perf: prevent internal `throw` on invalid type - -1.18.3 / 2018-05-14 -=================== - - * Fix stack trace for strict json parse error - * deps: depd@~1.1.2 - - perf: remove argument reassignment - * deps: http-errors@~1.6.3 - - deps: depd@~1.1.2 - - deps: setprototypeof@1.1.0 - - deps: statuses@'>= 1.3.1 < 2' - * deps: iconv-lite@0.4.23 - - Fix loading encoding with year appended - - Fix deprecation warnings on Node.js 10+ - * deps: qs@6.5.2 - * deps: raw-body@2.3.3 - - deps: http-errors@1.6.3 - - deps: iconv-lite@0.4.23 - * deps: type-is@~1.6.16 - - deps: mime-types@~2.1.18 - -1.18.2 / 2017-09-22 -=================== - - * deps: debug@2.6.9 - * perf: remove argument reassignment - -1.18.1 / 2017-09-12 -=================== - - * deps: content-type@~1.0.4 - - perf: remove argument reassignment - - perf: skip parameter parsing when no parameters - * deps: iconv-lite@0.4.19 - - Fix ISO-8859-1 regression - - Update Windows-1255 - * deps: qs@6.5.1 - - Fix parsing & compacting very deep objects - * deps: raw-body@2.3.2 - - deps: iconv-lite@0.4.19 - -1.18.0 / 2017-09-08 -=================== - - * Fix JSON strict violation error to match native parse error - * Include the `body` property on verify errors - * Include the `type` property on all generated errors - * Use `http-errors` to set status code on errors - * deps: bytes@3.0.0 - * deps: debug@2.6.8 - * deps: depd@~1.1.1 - - Remove unnecessary `Buffer` loading - * deps: http-errors@~1.6.2 - - deps: depd@1.1.1 - * deps: iconv-lite@0.4.18 - - Add support for React Native - - Add a warning if not loaded as utf-8 - - Fix CESU-8 decoding in Node.js 8 - - Improve speed of ISO-8859-1 encoding - * deps: qs@6.5.0 - * deps: raw-body@2.3.1 - - Use `http-errors` for standard emitted errors - - deps: bytes@3.0.0 - - deps: iconv-lite@0.4.18 - - perf: skip buffer decoding on overage chunk - * perf: prevent internal `throw` when missing charset - -1.17.2 / 2017-05-17 -=================== - - * deps: debug@2.6.7 - - Fix `DEBUG_MAX_ARRAY_LENGTH` - - deps: ms@2.0.0 - * deps: type-is@~1.6.15 - - deps: mime-types@~2.1.15 - -1.17.1 / 2017-03-06 -=================== - - * deps: qs@6.4.0 - - Fix regression parsing keys starting with `[` - -1.17.0 / 2017-03-01 -=================== - - * deps: http-errors@~1.6.1 - - Make `message` property enumerable for `HttpError`s - - deps: setprototypeof@1.0.3 - * deps: qs@6.3.1 - - Fix compacting nested arrays - -1.16.1 / 2017-02-10 -=================== - - * deps: debug@2.6.1 - - Fix deprecation messages in WebStorm and other editors - - Undeprecate `DEBUG_FD` set to `1` or `2` - -1.16.0 / 2017-01-17 -=================== - - * deps: debug@2.6.0 - - Allow colors in workers - - Deprecated `DEBUG_FD` environment variable - - Fix error when running under React Native - - Use same color for same namespace - - deps: ms@0.7.2 - * deps: http-errors@~1.5.1 - - deps: inherits@2.0.3 - - deps: setprototypeof@1.0.2 - - deps: statuses@'>= 1.3.1 < 2' - * deps: iconv-lite@0.4.15 - - Added encoding MS-31J - - Added encoding MS-932 - - Added encoding MS-936 - - Added encoding MS-949 - - Added encoding MS-950 - - Fix GBK/GB18030 handling of Euro character - * deps: qs@6.2.1 - - Fix array parsing from skipping empty values - * deps: raw-body@~2.2.0 - - deps: iconv-lite@0.4.15 - * deps: type-is@~1.6.14 - - deps: mime-types@~2.1.13 - -1.15.2 / 2016-06-19 -=================== - - * deps: bytes@2.4.0 - * deps: content-type@~1.0.2 - - perf: enable strict mode - * deps: http-errors@~1.5.0 - - Use `setprototypeof` module to replace `__proto__` setting - - deps: statuses@'>= 1.3.0 < 2' - - perf: enable strict mode - * deps: qs@6.2.0 - * deps: raw-body@~2.1.7 - - deps: bytes@2.4.0 - - perf: remove double-cleanup on happy path - * deps: type-is@~1.6.13 - - deps: mime-types@~2.1.11 - -1.15.1 / 2016-05-05 -=================== - - * deps: bytes@2.3.0 - - Drop partial bytes on all parsed units - - Fix parsing byte string that looks like hex - * deps: raw-body@~2.1.6 - - deps: bytes@2.3.0 - * deps: type-is@~1.6.12 - - deps: mime-types@~2.1.10 - -1.15.0 / 2016-02-10 -=================== - - * deps: http-errors@~1.4.0 - - Add `HttpError` export, for `err instanceof createError.HttpError` - - deps: inherits@2.0.1 - - deps: statuses@'>= 1.2.1 < 2' - * deps: qs@6.1.0 - * deps: type-is@~1.6.11 - - deps: mime-types@~2.1.9 - -1.14.2 / 2015-12-16 -=================== - - * deps: bytes@2.2.0 - * deps: iconv-lite@0.4.13 - * deps: qs@5.2.0 - * deps: raw-body@~2.1.5 - - deps: bytes@2.2.0 - - deps: iconv-lite@0.4.13 - * deps: type-is@~1.6.10 - - deps: mime-types@~2.1.8 - -1.14.1 / 2015-09-27 -=================== - - * Fix issue where invalid charset results in 400 when `verify` used - * deps: iconv-lite@0.4.12 - - Fix CESU-8 decoding in Node.js 4.x - * deps: raw-body@~2.1.4 - - Fix masking critical errors from `iconv-lite` - - deps: iconv-lite@0.4.12 - * deps: type-is@~1.6.9 - - deps: mime-types@~2.1.7 - -1.14.0 / 2015-09-16 -=================== - - * Fix JSON strict parse error to match syntax errors - * Provide static `require` analysis in `urlencoded` parser - * deps: depd@~1.1.0 - - Support web browser loading - * deps: qs@5.1.0 - * deps: raw-body@~2.1.3 - - Fix sync callback when attaching data listener causes sync read - * deps: type-is@~1.6.8 - - Fix type error when given invalid type to match against - - deps: mime-types@~2.1.6 - -1.13.3 / 2015-07-31 -=================== - - * deps: type-is@~1.6.6 - - deps: mime-types@~2.1.4 - -1.13.2 / 2015-07-05 -=================== - - * deps: iconv-lite@0.4.11 - * deps: qs@4.0.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix user-visible incompatibilities from 3.1.0 - - Fix various parsing edge cases - * deps: raw-body@~2.1.2 - - Fix error stack traces to skip `makeError` - - deps: iconv-lite@0.4.11 - * deps: type-is@~1.6.4 - - deps: mime-types@~2.1.2 - - perf: enable strict mode - - perf: remove argument reassignment - -1.13.1 / 2015-06-16 -=================== - - * deps: qs@2.4.2 - - Downgraded from 3.1.0 because of user-visible incompatibilities - -1.13.0 / 2015-06-14 -=================== - - * Add `statusCode` property on `Error`s, in addition to `status` - * Change `type` default to `application/json` for JSON parser - * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser - * Provide static `require` analysis - * Use the `http-errors` module to generate errors - * deps: bytes@2.1.0 - - Slight optimizations - * deps: iconv-lite@0.4.10 - - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails - - Leading BOM is now removed when decoding - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * deps: qs@3.1.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix various parsing edge cases - - Parsed object now has `null` prototype - * deps: raw-body@~2.1.1 - - Use `unpipe` module for unpiping requests - - deps: iconv-lite@0.4.10 - * deps: type-is@~1.6.3 - - deps: mime-types@~2.1.1 - - perf: reduce try block size - - perf: remove bitwise operations - * perf: enable strict mode - * perf: remove argument reassignment - * perf: remove delete call - -1.12.4 / 2015-05-10 -=================== - - * deps: debug@~2.2.0 - * deps: qs@2.4.2 - - Fix allowing parameters like `constructor` - * deps: on-finished@~2.2.1 - * deps: raw-body@~2.0.1 - - Fix a false-positive when unpiping in Node.js 0.8 - - deps: bytes@2.0.1 - * deps: type-is@~1.6.2 - - deps: mime-types@~2.0.11 - -1.12.3 / 2015-04-15 -=================== - - * Slight efficiency improvement when not debugging - * deps: depd@~1.0.1 - * deps: iconv-lite@0.4.8 - - Add encoding alias UNICODE-1-1-UTF-7 - * deps: raw-body@1.3.4 - - Fix hanging callback if request aborts during read - - deps: iconv-lite@0.4.8 - -1.12.2 / 2015-03-16 -=================== - - * deps: qs@2.4.1 - - Fix error when parameter `hasOwnProperty` is present - -1.12.1 / 2015-03-15 -=================== - - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: type-is@~1.6.1 - - deps: mime-types@~2.0.10 - -1.12.0 / 2015-02-13 -=================== - - * add `debug` messages - * accept a function for the `type` option - * use `content-type` to parse `Content-Type` headers - * deps: iconv-lite@0.4.7 - - Gracefully support enumerables on `Object.prototype` - * deps: raw-body@1.3.3 - - deps: iconv-lite@0.4.7 - * deps: type-is@~1.6.0 - - fix argument reassignment - - fix false-positives in `hasBody` `Transfer-Encoding` check - - support wildcard for both type and subtype (`*/*`) - - deps: mime-types@~2.0.9 - -1.11.0 / 2015-01-30 -=================== - - * make internal `extended: true` depth limit infinity - * deps: type-is@~1.5.6 - - deps: mime-types@~2.0.8 - -1.10.2 / 2015-01-20 -=================== - - * deps: iconv-lite@0.4.6 - - Fix rare aliases of single-byte encodings - * deps: raw-body@1.3.2 - - deps: iconv-lite@0.4.6 - -1.10.1 / 2015-01-01 -=================== - - * deps: on-finished@~2.2.0 - * deps: type-is@~1.5.5 - - deps: mime-types@~2.0.7 - -1.10.0 / 2014-12-02 -=================== - - * make internal `extended: true` array limit dynamic - -1.9.3 / 2014-11-21 -================== - - * deps: iconv-lite@0.4.5 - - Fix Windows-31J and X-SJIS encoding support - * deps: qs@2.3.3 - - Fix `arrayLimit` behavior - * deps: raw-body@1.3.1 - - deps: iconv-lite@0.4.5 - * deps: type-is@~1.5.3 - - deps: mime-types@~2.0.3 - -1.9.2 / 2014-10-27 -================== - - * deps: qs@2.3.2 - - Fix parsing of mixed objects and values - -1.9.1 / 2014-10-22 -================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - * deps: qs@2.3.0 - - Fix parsing of mixed implicit and explicit arrays - * deps: type-is@~1.5.2 - - deps: mime-types@~2.0.2 - -1.9.0 / 2014-09-24 -================== - - * include the charset in "unsupported charset" error message - * include the encoding in "unsupported content encoding" error message - * deps: depd@~1.0.0 - -1.8.4 / 2014-09-23 -================== - - * fix content encoding to be case-insensitive - -1.8.3 / 2014-09-19 -================== - - * deps: qs@2.2.4 - - Fix issue with object keys starting with numbers truncated - -1.8.2 / 2014-09-15 -================== - - * deps: depd@0.4.5 - -1.8.1 / 2014-09-07 -================== - - * deps: media-typer@0.3.0 - * deps: type-is@~1.5.1 - -1.8.0 / 2014-09-05 -================== - - * make empty-body-handling consistent between chunked requests - - empty `json` produces `{}` - - empty `raw` produces `new Buffer(0)` - - empty `text` produces `''` - - empty `urlencoded` produces `{}` - * deps: qs@2.2.3 - - Fix issue where first empty value in array is discarded - * deps: type-is@~1.5.0 - - fix `hasbody` to be true for `content-length: 0` - -1.7.0 / 2014-09-01 -================== - - * add `parameterLimit` option to `urlencoded` parser - * change `urlencoded` extended array limit to 100 - * respond with 413 when over `parameterLimit` in `urlencoded` - -1.6.7 / 2014-08-29 -================== - - * deps: qs@2.2.2 - - Remove unnecessary cloning - -1.6.6 / 2014-08-27 -================== - - * deps: qs@2.2.0 - - Array parsing fix - - Performance improvements - -1.6.5 / 2014-08-16 -================== - - * deps: on-finished@2.1.0 - -1.6.4 / 2014-08-14 -================== - - * deps: qs@1.2.2 - -1.6.3 / 2014-08-10 -================== - - * deps: qs@1.2.1 - -1.6.2 / 2014-08-07 -================== - - * deps: qs@1.2.0 - - Fix parsing array of objects - -1.6.1 / 2014-08-06 -================== - - * deps: qs@1.1.0 - - Accept urlencoded square brackets - - Accept empty values in implicit array notation - -1.6.0 / 2014-08-05 -================== - - * deps: qs@1.0.2 - - Complete rewrite - - Limits array length to 20 - - Limits object depth to 5 - - Limits parameters to 1,000 - -1.5.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -1.5.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -1.5.0 / 2014-07-20 -================== - - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: iconv-lite@0.4.4 - - Added encoding UTF-7 - * deps: raw-body@1.3.0 - - deps: iconv-lite@0.4.4 - - Added encoding UTF-7 - - Fix `Cannot switch to old mode now` error on Node.js 0.10+ - * deps: type-is@~1.3.2 - -1.4.3 / 2014-06-19 -================== - - * deps: type-is@1.3.1 - - fix global variable leak - -1.4.2 / 2014-06-19 -================== - - * deps: type-is@1.3.0 - - improve type parsing - -1.4.1 / 2014-06-19 -================== - - * fix urlencoded extended deprecation message - -1.4.0 / 2014-06-19 -================== - - * add `text` parser - * add `raw` parser - * check accepted charset in content-type (accepts utf-8) - * check accepted encoding in content-encoding (accepts identity) - * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed - * deprecate `urlencoded()` without provided `extended` option - * lazy-load urlencoded parsers - * parsers split into files for reduced mem usage - * support gzip and deflate bodies - - set `inflate: false` to turn off - * deps: raw-body@1.2.2 - - Support all encodings from `iconv-lite` - -1.3.1 / 2014-06-11 -================== - - * deps: type-is@1.2.1 - - Switch dependency from mime to mime-types@1.0.0 - -1.3.0 / 2014-05-31 -================== - - * add `extended` option to urlencoded parser - -1.2.2 / 2014-05-27 -================== - - * deps: raw-body@1.1.6 - - assert stream encoding on node.js 0.8 - - assert stream encoding on node.js < 0.10.6 - - deps: bytes@1 - -1.2.1 / 2014-05-26 -================== - - * invoke `next(err)` after request fully read - - prevents hung responses and socket hang ups - -1.2.0 / 2014-05-11 -================== - - * add `verify` option - * deps: type-is@1.2.0 - - support suffix matching - -1.1.2 / 2014-05-11 -================== - - * improve json parser speed - -1.1.1 / 2014-05-11 -================== - - * fix repeated limit parsing with every request - -1.1.0 / 2014-05-10 -================== - - * add `type` option - * deps: pin for safety and consistency - -1.0.2 / 2014-04-14 -================== - - * use `type-is` module - -1.0.1 / 2014-03-20 -================== - - * lower default limits to 100kb diff --git a/node_modules/body-parser/LICENSE b/node_modules/body-parser/LICENSE deleted file mode 100644 index 386b7b69..00000000 --- a/node_modules/body-parser/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/body-parser/README.md b/node_modules/body-parser/README.md deleted file mode 100644 index c507cbb0..00000000 --- a/node_modules/body-parser/README.md +++ /dev/null @@ -1,464 +0,0 @@ -# body-parser - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Build Status][github-actions-ci-image]][github-actions-ci-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Node.js body parsing middleware. - -Parse incoming request bodies in a middleware before your handlers, available -under the `req.body` property. - -**Note** As `req.body`'s shape is based on user-controlled input, all -properties and values in this object are untrusted and should be validated -before trusting. For example, `req.body.foo.toString()` may fail in multiple -ways, for example the `foo` property may not be there or may not be a string, -and `toString` may not be a function and instead a string or other user input. - -[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/). - -_This does not handle multipart bodies_, due to their complex and typically -large nature. For multipart bodies, you may be interested in the following -modules: - - * [busboy](https://www.npmjs.org/package/busboy#readme) and - [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme) - * [multiparty](https://www.npmjs.org/package/multiparty#readme) and - [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme) - * [formidable](https://www.npmjs.org/package/formidable#readme) - * [multer](https://www.npmjs.org/package/multer#readme) - -This module provides the following parsers: - - * [JSON body parser](#bodyparserjsonoptions) - * [Raw body parser](#bodyparserrawoptions) - * [Text body parser](#bodyparsertextoptions) - * [URL-encoded form body parser](#bodyparserurlencodedoptions) - -Other body parsers you might be interested in: - -- [body](https://www.npmjs.org/package/body#readme) -- [co-body](https://www.npmjs.org/package/co-body#readme) - -## Installation - -```sh -$ npm install body-parser -``` - -## API - -```js -var bodyParser = require('body-parser') -``` - -The `bodyParser` object exposes various factories to create middlewares. All -middlewares will populate the `req.body` property with the parsed body when -the `Content-Type` request header matches the `type` option, or an empty -object (`{}`) if there was no body to parse, the `Content-Type` was not matched, -or an error occurred. - -The various errors returned by this module are described in the -[errors section](#errors). - -### bodyParser.json([options]) - -Returns middleware that only parses `json` and only looks at requests where -the `Content-Type` header matches the `type` option. This parser accepts any -Unicode encoding of the body and supports automatic inflation of `gzip` and -`deflate` encodings. - -A new `body` object containing the parsed data is populated on the `request` -object after the middleware (i.e. `req.body`). - -#### Options - -The `json` function takes an optional `options` object that may contain any of -the following keys: - -##### inflate - -When set to `true`, then deflated (compressed) bodies will be inflated; when -`false`, deflated bodies are rejected. Defaults to `true`. - -##### limit - -Controls the maximum request body size. If this is a number, then the value -specifies the number of bytes; if it is a string, the value is passed to the -[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults -to `'100kb'`. - -##### reviver - -The `reviver` option is passed directly to `JSON.parse` as the second -argument. You can find more information on this argument -[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter). - -##### strict - -When set to `true`, will only accept arrays and objects; when `false` will -accept anything `JSON.parse` accepts. Defaults to `true`. - -##### type - -The `type` option is used to determine what media type the middleware will -parse. This option can be a string, array of strings, or a function. If not a -function, `type` option is passed directly to the -[type-is](https://www.npmjs.org/package/type-is#readme) library and this can -be an extension name (like `json`), a mime type (like `application/json`), or -a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type` -option is called as `fn(req)` and the request is parsed if it returns a truthy -value. Defaults to `application/json`. - -##### verify - -The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, -where `buf` is a `Buffer` of the raw request body and `encoding` is the -encoding of the request. The parsing can be aborted by throwing an error. - -### bodyParser.raw([options]) - -Returns middleware that parses all bodies as a `Buffer` and only looks at -requests where the `Content-Type` header matches the `type` option. This -parser supports automatic inflation of `gzip` and `deflate` encodings. - -A new `body` object containing the parsed data is populated on the `request` -object after the middleware (i.e. `req.body`). This will be a `Buffer` object -of the body. - -#### Options - -The `raw` function takes an optional `options` object that may contain any of -the following keys: - -##### inflate - -When set to `true`, then deflated (compressed) bodies will be inflated; when -`false`, deflated bodies are rejected. Defaults to `true`. - -##### limit - -Controls the maximum request body size. If this is a number, then the value -specifies the number of bytes; if it is a string, the value is passed to the -[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults -to `'100kb'`. - -##### type - -The `type` option is used to determine what media type the middleware will -parse. This option can be a string, array of strings, or a function. -If not a function, `type` option is passed directly to the -[type-is](https://www.npmjs.org/package/type-is#readme) library and this -can be an extension name (like `bin`), a mime type (like -`application/octet-stream`), or a mime type with a wildcard (like `*/*` or -`application/*`). If a function, the `type` option is called as `fn(req)` -and the request is parsed if it returns a truthy value. Defaults to -`application/octet-stream`. - -##### verify - -The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, -where `buf` is a `Buffer` of the raw request body and `encoding` is the -encoding of the request. The parsing can be aborted by throwing an error. - -### bodyParser.text([options]) - -Returns middleware that parses all bodies as a string and only looks at -requests where the `Content-Type` header matches the `type` option. This -parser supports automatic inflation of `gzip` and `deflate` encodings. - -A new `body` string containing the parsed data is populated on the `request` -object after the middleware (i.e. `req.body`). This will be a string of the -body. - -#### Options - -The `text` function takes an optional `options` object that may contain any of -the following keys: - -##### defaultCharset - -Specify the default character set for the text content if the charset is not -specified in the `Content-Type` header of the request. Defaults to `utf-8`. - -##### inflate - -When set to `true`, then deflated (compressed) bodies will be inflated; when -`false`, deflated bodies are rejected. Defaults to `true`. - -##### limit - -Controls the maximum request body size. If this is a number, then the value -specifies the number of bytes; if it is a string, the value is passed to the -[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults -to `'100kb'`. - -##### type - -The `type` option is used to determine what media type the middleware will -parse. This option can be a string, array of strings, or a function. If not -a function, `type` option is passed directly to the -[type-is](https://www.npmjs.org/package/type-is#readme) library and this can -be an extension name (like `txt`), a mime type (like `text/plain`), or a mime -type with a wildcard (like `*/*` or `text/*`). If a function, the `type` -option is called as `fn(req)` and the request is parsed if it returns a -truthy value. Defaults to `text/plain`. - -##### verify - -The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, -where `buf` is a `Buffer` of the raw request body and `encoding` is the -encoding of the request. The parsing can be aborted by throwing an error. - -### bodyParser.urlencoded([options]) - -Returns middleware that only parses `urlencoded` bodies and only looks at -requests where the `Content-Type` header matches the `type` option. This -parser accepts only UTF-8 encoding of the body and supports automatic -inflation of `gzip` and `deflate` encodings. - -A new `body` object containing the parsed data is populated on the `request` -object after the middleware (i.e. `req.body`). This object will contain -key-value pairs, where the value can be a string or array (when `extended` is -`false`), or any type (when `extended` is `true`). - -#### Options - -The `urlencoded` function takes an optional `options` object that may contain -any of the following keys: - -##### extended - -The `extended` option allows to choose between parsing the URL-encoded data -with the `querystring` library (when `false`) or the `qs` library (when -`true`). The "extended" syntax allows for rich objects and arrays to be -encoded into the URL-encoded format, allowing for a JSON-like experience -with URL-encoded. For more information, please -[see the qs library](https://www.npmjs.org/package/qs#readme). - -Defaults to `true`, but using the default has been deprecated. Please -research into the difference between `qs` and `querystring` and choose the -appropriate setting. - -##### inflate - -When set to `true`, then deflated (compressed) bodies will be inflated; when -`false`, deflated bodies are rejected. Defaults to `true`. - -##### limit - -Controls the maximum request body size. If this is a number, then the value -specifies the number of bytes; if it is a string, the value is passed to the -[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults -to `'100kb'`. - -##### parameterLimit - -The `parameterLimit` option controls the maximum number of parameters that -are allowed in the URL-encoded data. If a request contains more parameters -than this value, a 413 will be returned to the client. Defaults to `1000`. - -##### type - -The `type` option is used to determine what media type the middleware will -parse. This option can be a string, array of strings, or a function. If not -a function, `type` option is passed directly to the -[type-is](https://www.npmjs.org/package/type-is#readme) library and this can -be an extension name (like `urlencoded`), a mime type (like -`application/x-www-form-urlencoded`), or a mime type with a wildcard (like -`*/x-www-form-urlencoded`). If a function, the `type` option is called as -`fn(req)` and the request is parsed if it returns a truthy value. Defaults -to `application/x-www-form-urlencoded`. - -##### verify - -The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`, -where `buf` is a `Buffer` of the raw request body and `encoding` is the -encoding of the request. The parsing can be aborted by throwing an error. - -## Errors - -The middlewares provided by this module create errors using the -[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors -will typically have a `status`/`statusCode` property that contains the suggested -HTTP response code, an `expose` property to determine if the `message` property -should be displayed to the client, a `type` property to determine the type of -error without matching against the `message`, and a `body` property containing -the read body, if available. - -The following are the common errors created, though any error can come through -for various reasons. - -### content encoding unsupported - -This error will occur when the request had a `Content-Encoding` header that -contained an encoding but the "inflation" option was set to `false`. The -`status` property is set to `415`, the `type` property is set to -`'encoding.unsupported'`, and the `charset` property will be set to the -encoding that is unsupported. - -### entity parse failed - -This error will occur when the request contained an entity that could not be -parsed by the middleware. The `status` property is set to `400`, the `type` -property is set to `'entity.parse.failed'`, and the `body` property is set to -the entity value that failed parsing. - -### entity verify failed - -This error will occur when the request contained an entity that could not be -failed verification by the defined `verify` option. The `status` property is -set to `403`, the `type` property is set to `'entity.verify.failed'`, and the -`body` property is set to the entity value that failed verification. - -### request aborted - -This error will occur when the request is aborted by the client before reading -the body has finished. The `received` property will be set to the number of -bytes received before the request was aborted and the `expected` property is -set to the number of expected bytes. The `status` property is set to `400` -and `type` property is set to `'request.aborted'`. - -### request entity too large - -This error will occur when the request body's size is larger than the "limit" -option. The `limit` property will be set to the byte limit and the `length` -property will be set to the request body's length. The `status` property is -set to `413` and the `type` property is set to `'entity.too.large'`. - -### request size did not match content length - -This error will occur when the request's length did not match the length from -the `Content-Length` header. This typically occurs when the request is malformed, -typically when the `Content-Length` header was calculated based on characters -instead of bytes. The `status` property is set to `400` and the `type` property -is set to `'request.size.invalid'`. - -### stream encoding should not be set - -This error will occur when something called the `req.setEncoding` method prior -to this middleware. This module operates directly on bytes only and you cannot -call `req.setEncoding` when using this module. The `status` property is set to -`500` and the `type` property is set to `'stream.encoding.set'`. - -### stream is not readable - -This error will occur when the request is no longer readable when this middleware -attempts to read it. This typically means something other than a middleware from -this module read the request body already and the middleware was also configured to -read the same request. The `status` property is set to `500` and the `type` -property is set to `'stream.not.readable'`. - -### too many parameters - -This error will occur when the content of the request exceeds the configured -`parameterLimit` for the `urlencoded` parser. The `status` property is set to -`413` and the `type` property is set to `'parameters.too.many'`. - -### unsupported charset "BOGUS" - -This error will occur when the request had a charset parameter in the -`Content-Type` header, but the `iconv-lite` module does not support it OR the -parser does not support it. The charset is contained in the message as well -as in the `charset` property. The `status` property is set to `415`, the -`type` property is set to `'charset.unsupported'`, and the `charset` property -is set to the charset that is unsupported. - -### unsupported content encoding "bogus" - -This error will occur when the request had a `Content-Encoding` header that -contained an unsupported encoding. The encoding is contained in the message -as well as in the `encoding` property. The `status` property is set to `415`, -the `type` property is set to `'encoding.unsupported'`, and the `encoding` -property is set to the encoding that is unsupported. - -## Examples - -### Express/Connect top-level generic - -This example demonstrates adding a generic JSON and URL-encoded parser as a -top-level middleware, which will parse the bodies of all incoming requests. -This is the simplest setup. - -```js -var express = require('express') -var bodyParser = require('body-parser') - -var app = express() - -// parse application/x-www-form-urlencoded -app.use(bodyParser.urlencoded({ extended: false })) - -// parse application/json -app.use(bodyParser.json()) - -app.use(function (req, res) { - res.setHeader('Content-Type', 'text/plain') - res.write('you posted:\n') - res.end(JSON.stringify(req.body, null, 2)) -}) -``` - -### Express route-specific - -This example demonstrates adding body parsers specifically to the routes that -need them. In general, this is the most recommended way to use body-parser with -Express. - -```js -var express = require('express') -var bodyParser = require('body-parser') - -var app = express() - -// create application/json parser -var jsonParser = bodyParser.json() - -// create application/x-www-form-urlencoded parser -var urlencodedParser = bodyParser.urlencoded({ extended: false }) - -// POST /login gets urlencoded bodies -app.post('/login', urlencodedParser, function (req, res) { - res.send('welcome, ' + req.body.username) -}) - -// POST /api/users gets JSON bodies -app.post('/api/users', jsonParser, function (req, res) { - // create user in req.body -}) -``` - -### Change accepted type for parsers - -All the parsers accept a `type` option which allows you to change the -`Content-Type` that the middleware will parse. - -```js -var express = require('express') -var bodyParser = require('body-parser') - -var app = express() - -// parse various different custom JSON types as JSON -app.use(bodyParser.json({ type: 'application/*+json' })) - -// parse some custom thing into a Buffer -app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) - -// parse an HTML body into a string -app.use(bodyParser.text({ type: 'text/html' })) -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/body-parser.svg -[npm-url]: https://npmjs.org/package/body-parser -[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg -[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master -[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg -[downloads-url]: https://npmjs.org/package/body-parser -[github-actions-ci-image]: https://img.shields.io/github/workflow/status/expressjs/body-parser/ci/master?label=ci -[github-actions-ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml diff --git a/node_modules/body-parser/SECURITY.md b/node_modules/body-parser/SECURITY.md deleted file mode 100644 index 9694d429..00000000 --- a/node_modules/body-parser/SECURITY.md +++ /dev/null @@ -1,25 +0,0 @@ -# Security Policies and Procedures - -## Reporting a Bug - -The Express team and community take all security bugs seriously. Thank you -for improving the security of Express. We appreciate your efforts and -responsible disclosure and will make every effort to acknowledge your -contributions. - -Report security bugs by emailing the current owner(s) of `body-parser`. This -information can be found in the npm registry using the command -`npm owner ls body-parser`. -If unsure or unable to get the information from the above, open an issue -in the [project issue tracker](https://github.com/expressjs/body-parser/issues) -asking for the current contact information. - -To ensure the timely response to your report, please ensure that the entirety -of the report is contained within the email body and not solely behind a web -link or an attachment. - -At least one owner will acknowledge your email within 48 hours, and will send a -more detailed response within 48 hours indicating the next steps in handling -your report. After the initial reply to your report, the owners will -endeavor to keep you informed of the progress towards a fix and full -announcement, and may ask for additional information or guidance. diff --git a/node_modules/body-parser/index.js b/node_modules/body-parser/index.js deleted file mode 100644 index bb24d739..00000000 --- a/node_modules/body-parser/index.js +++ /dev/null @@ -1,156 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var deprecate = require('depd')('body-parser') - -/** - * Cache of loaded parsers. - * @private - */ - -var parsers = Object.create(null) - -/** - * @typedef Parsers - * @type {function} - * @property {function} json - * @property {function} raw - * @property {function} text - * @property {function} urlencoded - */ - -/** - * Module exports. - * @type {Parsers} - */ - -exports = module.exports = deprecate.function(bodyParser, - 'bodyParser: use individual json/urlencoded middlewares') - -/** - * JSON parser. - * @public - */ - -Object.defineProperty(exports, 'json', { - configurable: true, - enumerable: true, - get: createParserGetter('json') -}) - -/** - * Raw parser. - * @public - */ - -Object.defineProperty(exports, 'raw', { - configurable: true, - enumerable: true, - get: createParserGetter('raw') -}) - -/** - * Text parser. - * @public - */ - -Object.defineProperty(exports, 'text', { - configurable: true, - enumerable: true, - get: createParserGetter('text') -}) - -/** - * URL-encoded parser. - * @public - */ - -Object.defineProperty(exports, 'urlencoded', { - configurable: true, - enumerable: true, - get: createParserGetter('urlencoded') -}) - -/** - * Create a middleware to parse json and urlencoded bodies. - * - * @param {object} [options] - * @return {function} - * @deprecated - * @public - */ - -function bodyParser (options) { - // use default type for parsers - var opts = Object.create(options || null, { - type: { - configurable: true, - enumerable: true, - value: undefined, - writable: true - } - }) - - var _urlencoded = exports.urlencoded(opts) - var _json = exports.json(opts) - - return function bodyParser (req, res, next) { - _json(req, res, function (err) { - if (err) return next(err) - _urlencoded(req, res, next) - }) - } -} - -/** - * Create a getter for loading a parser. - * @private - */ - -function createParserGetter (name) { - return function get () { - return loadParser(name) - } -} - -/** - * Load a parser module. - * @private - */ - -function loadParser (parserName) { - var parser = parsers[parserName] - - if (parser !== undefined) { - return parser - } - - // this uses a switch for static require analysis - switch (parserName) { - case 'json': - parser = require('./lib/types/json') - break - case 'raw': - parser = require('./lib/types/raw') - break - case 'text': - parser = require('./lib/types/text') - break - case 'urlencoded': - parser = require('./lib/types/urlencoded') - break - } - - // store to prevent invoking require() - return (parsers[parserName] = parser) -} diff --git a/node_modules/body-parser/lib/read.js b/node_modules/body-parser/lib/read.js deleted file mode 100644 index fce6283f..00000000 --- a/node_modules/body-parser/lib/read.js +++ /dev/null @@ -1,205 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var createError = require('http-errors') -var destroy = require('destroy') -var getBody = require('raw-body') -var iconv = require('iconv-lite') -var onFinished = require('on-finished') -var unpipe = require('unpipe') -var zlib = require('zlib') - -/** - * Module exports. - */ - -module.exports = read - -/** - * Read a request into a buffer and parse. - * - * @param {object} req - * @param {object} res - * @param {function} next - * @param {function} parse - * @param {function} debug - * @param {object} options - * @private - */ - -function read (req, res, next, parse, debug, options) { - var length - var opts = options - var stream - - // flag as parsed - req._body = true - - // read options - var encoding = opts.encoding !== null - ? opts.encoding - : null - var verify = opts.verify - - try { - // get the content stream - stream = contentstream(req, debug, opts.inflate) - length = stream.length - stream.length = undefined - } catch (err) { - return next(err) - } - - // set raw-body options - opts.length = length - opts.encoding = verify - ? null - : encoding - - // assert charset is supported - if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { - return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { - charset: encoding.toLowerCase(), - type: 'charset.unsupported' - })) - } - - // read body - debug('read body') - getBody(stream, opts, function (error, body) { - if (error) { - var _error - - if (error.type === 'encoding.unsupported') { - // echo back charset - _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { - charset: encoding.toLowerCase(), - type: 'charset.unsupported' - }) - } else { - // set status code on error - _error = createError(400, error) - } - - // unpipe from stream and destroy - if (stream !== req) { - unpipe(req) - destroy(stream, true) - } - - // read off entire request - dump(req, function onfinished () { - next(createError(400, _error)) - }) - return - } - - // verify - if (verify) { - try { - debug('verify body') - verify(req, res, body, encoding) - } catch (err) { - next(createError(403, err, { - body: body, - type: err.type || 'entity.verify.failed' - })) - return - } - } - - // parse - var str = body - try { - debug('parse body') - str = typeof body !== 'string' && encoding !== null - ? iconv.decode(body, encoding) - : body - req.body = parse(str) - } catch (err) { - next(createError(400, err, { - body: str, - type: err.type || 'entity.parse.failed' - })) - return - } - - next() - }) -} - -/** - * Get the content stream of the request. - * - * @param {object} req - * @param {function} debug - * @param {boolean} [inflate=true] - * @return {object} - * @api private - */ - -function contentstream (req, debug, inflate) { - var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() - var length = req.headers['content-length'] - var stream - - debug('content-encoding "%s"', encoding) - - if (inflate === false && encoding !== 'identity') { - throw createError(415, 'content encoding unsupported', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } - - switch (encoding) { - case 'deflate': - stream = zlib.createInflate() - debug('inflate body') - req.pipe(stream) - break - case 'gzip': - stream = zlib.createGunzip() - debug('gunzip body') - req.pipe(stream) - break - case 'identity': - stream = req - stream.length = length - break - default: - throw createError(415, 'unsupported content encoding "' + encoding + '"', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } - - return stream -} - -/** - * Dump the contents of a request. - * - * @param {object} req - * @param {function} callback - * @api private - */ - -function dump (req, callback) { - if (onFinished.isFinished(req)) { - callback(null) - } else { - onFinished(req, callback) - req.resume() - } -} diff --git a/node_modules/body-parser/lib/types/json.js b/node_modules/body-parser/lib/types/json.js deleted file mode 100644 index c2745be3..00000000 --- a/node_modules/body-parser/lib/types/json.js +++ /dev/null @@ -1,236 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var bytes = require('bytes') -var contentType = require('content-type') -var createError = require('http-errors') -var debug = require('debug')('body-parser:json') -var read = require('../read') -var typeis = require('type-is') - -/** - * Module exports. - */ - -module.exports = json - -/** - * RegExp to match the first non-space in a string. - * - * Allowed whitespace is defined in RFC 7159: - * - * ws = *( - * %x20 / ; Space - * %x09 / ; Horizontal tab - * %x0A / ; Line feed or New line - * %x0D ) ; Carriage return - */ - -var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex - -/** - * Create a middleware to parse JSON bodies. - * - * @param {object} [options] - * @return {function} - * @public - */ - -function json (options) { - var opts = options || {} - - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var inflate = opts.inflate !== false - var reviver = opts.reviver - var strict = opts.strict !== false - var type = opts.type || 'application/json' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (body) { - if (body.length === 0) { - // special-case empty json body, as it's a common client-side mistake - // TODO: maybe make this configurable or part of "strict" option - return {} - } - - if (strict) { - var first = firstchar(body) - - if (first !== '{' && first !== '[') { - debug('strict violation') - throw createStrictSyntaxError(body, first) - } - } - - try { - debug('parse json') - return JSON.parse(body, reviver) - } catch (e) { - throw normalizeJsonSyntaxError(e, { - message: e.message, - stack: e.stack - }) - } - } - - return function jsonParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // assert charset per RFC 7159 sec 8.1 - var charset = getCharset(req) || 'utf-8' - if (charset.slice(0, 4) !== 'utf-') { - debug('invalid charset') - next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { - charset: charset, - type: 'charset.unsupported' - })) - return - } - - // read - read(req, res, next, parse, debug, { - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Create strict violation syntax error matching native error. - * - * @param {string} str - * @param {string} char - * @return {Error} - * @private - */ - -function createStrictSyntaxError (str, char) { - var index = str.indexOf(char) - var partial = index !== -1 - ? str.substring(0, index) + '#' - : '' - - try { - JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') - } catch (e) { - return normalizeJsonSyntaxError(e, { - message: e.message.replace('#', char), - stack: e.stack - }) - } -} - -/** - * Get the first non-whitespace character in a string. - * - * @param {string} str - * @return {function} - * @private - */ - -function firstchar (str) { - var match = FIRST_CHAR_REGEXP.exec(str) - - return match - ? match[1] - : undefined -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Normalize a SyntaxError for JSON.parse. - * - * @param {SyntaxError} error - * @param {object} obj - * @return {SyntaxError} - */ - -function normalizeJsonSyntaxError (error, obj) { - var keys = Object.getOwnPropertyNames(error) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - if (key !== 'stack' && key !== 'message') { - delete error[key] - } - } - - // replace stack before message for Node.js 0.10 and below - error.stack = obj.stack.replace(error.message, obj.message) - error.message = obj.message - - return error -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} diff --git a/node_modules/body-parser/lib/types/raw.js b/node_modules/body-parser/lib/types/raw.js deleted file mode 100644 index f5d1b674..00000000 --- a/node_modules/body-parser/lib/types/raw.js +++ /dev/null @@ -1,101 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - */ - -var bytes = require('bytes') -var debug = require('debug')('body-parser:raw') -var read = require('../read') -var typeis = require('type-is') - -/** - * Module exports. - */ - -module.exports = raw - -/** - * Create a middleware to parse raw bodies. - * - * @param {object} [options] - * @return {function} - * @api public - */ - -function raw (options) { - var opts = options || {} - - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'application/octet-stream' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (buf) { - return buf - } - - return function rawParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // read - read(req, res, next, parse, debug, { - encoding: null, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} diff --git a/node_modules/body-parser/lib/types/text.js b/node_modules/body-parser/lib/types/text.js deleted file mode 100644 index 083a0090..00000000 --- a/node_modules/body-parser/lib/types/text.js +++ /dev/null @@ -1,121 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - */ - -var bytes = require('bytes') -var contentType = require('content-type') -var debug = require('debug')('body-parser:text') -var read = require('../read') -var typeis = require('type-is') - -/** - * Module exports. - */ - -module.exports = text - -/** - * Create a middleware to parse text bodies. - * - * @param {object} [options] - * @return {function} - * @api public - */ - -function text (options) { - var opts = options || {} - - var defaultCharset = opts.defaultCharset || 'utf-8' - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'text/plain' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (buf) { - return buf - } - - return function textParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // get charset - var charset = getCharset(req) || defaultCharset - - // read - read(req, res, next, parse, debug, { - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} diff --git a/node_modules/body-parser/lib/types/urlencoded.js b/node_modules/body-parser/lib/types/urlencoded.js deleted file mode 100644 index b2ca8f16..00000000 --- a/node_modules/body-parser/lib/types/urlencoded.js +++ /dev/null @@ -1,284 +0,0 @@ -/*! - * body-parser - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var bytes = require('bytes') -var contentType = require('content-type') -var createError = require('http-errors') -var debug = require('debug')('body-parser:urlencoded') -var deprecate = require('depd')('body-parser') -var read = require('../read') -var typeis = require('type-is') - -/** - * Module exports. - */ - -module.exports = urlencoded - -/** - * Cache of parser modules. - */ - -var parsers = Object.create(null) - -/** - * Create a middleware to parse urlencoded bodies. - * - * @param {object} [options] - * @return {function} - * @public - */ - -function urlencoded (options) { - var opts = options || {} - - // notice because option default will flip in next major - if (opts.extended === undefined) { - deprecate('undefined extended: provide extended option') - } - - var extended = opts.extended !== false - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'application/x-www-form-urlencoded' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate query parser - var queryparse = extended - ? extendedparser(opts) - : simpleparser(opts) - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (body) { - return body.length - ? queryparse(body) - : {} - } - - return function urlencodedParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // assert charset - var charset = getCharset(req) || 'utf-8' - if (charset !== 'utf-8') { - debug('invalid charset') - next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { - charset: charset, - type: 'charset.unsupported' - })) - return - } - - // read - read(req, res, next, parse, debug, { - debug: debug, - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the extended query parser. - * - * @param {object} options - */ - -function extendedparser (options) { - var parameterLimit = options.parameterLimit !== undefined - ? options.parameterLimit - : 1000 - var parse = parser('qs') - - if (isNaN(parameterLimit) || parameterLimit < 1) { - throw new TypeError('option parameterLimit must be a positive number') - } - - if (isFinite(parameterLimit)) { - parameterLimit = parameterLimit | 0 - } - - return function queryparse (body) { - var paramCount = parameterCount(body, parameterLimit) - - if (paramCount === undefined) { - debug('too many parameters') - throw createError(413, 'too many parameters', { - type: 'parameters.too.many' - }) - } - - var arrayLimit = Math.max(100, paramCount) - - debug('parse extended urlencoding') - return parse(body, { - allowPrototypes: true, - arrayLimit: arrayLimit, - depth: Infinity, - parameterLimit: parameterLimit - }) - } -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Count the number of parameters, stopping once limit reached - * - * @param {string} body - * @param {number} limit - * @api private - */ - -function parameterCount (body, limit) { - var count = 0 - var index = 0 - - while ((index = body.indexOf('&', index)) !== -1) { - count++ - index++ - - if (count === limit) { - return undefined - } - } - - return count -} - -/** - * Get parser for module name dynamically. - * - * @param {string} name - * @return {function} - * @api private - */ - -function parser (name) { - var mod = parsers[name] - - if (mod !== undefined) { - return mod.parse - } - - // this uses a switch for static require analysis - switch (name) { - case 'qs': - mod = require('qs') - break - case 'querystring': - mod = require('querystring') - break - } - - // store to prevent invoking require() - parsers[name] = mod - - return mod.parse -} - -/** - * Get the simple query parser. - * - * @param {object} options - */ - -function simpleparser (options) { - var parameterLimit = options.parameterLimit !== undefined - ? options.parameterLimit - : 1000 - var parse = parser('querystring') - - if (isNaN(parameterLimit) || parameterLimit < 1) { - throw new TypeError('option parameterLimit must be a positive number') - } - - if (isFinite(parameterLimit)) { - parameterLimit = parameterLimit | 0 - } - - return function queryparse (body) { - var paramCount = parameterCount(body, parameterLimit) - - if (paramCount === undefined) { - debug('too many parameters') - throw createError(413, 'too many parameters', { - type: 'parameters.too.many' - }) - } - - debug('parse urlencoding') - return parse(body, undefined, undefined, { maxKeys: parameterLimit }) - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} diff --git a/node_modules/body-parser/package.json b/node_modules/body-parser/package.json deleted file mode 100644 index 9cd2ccbb..00000000 --- a/node_modules/body-parser/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "body-parser", - "description": "Node.js body parsing middleware", - "version": "1.20.1", - "contributors": [ - "Douglas Christopher Wilson ", - "Jonathan Ong (http://jongleberry.com)" - ], - "license": "MIT", - "repository": "expressjs/body-parser", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "devDependencies": { - "eslint": "8.24.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-markdown": "3.0.0", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "6.0.1", - "eslint-plugin-standard": "4.1.0", - "methods": "1.1.2", - "mocha": "10.0.0", - "nyc": "15.1.0", - "safe-buffer": "5.2.1", - "supertest": "6.3.0" - }, - "files": [ - "lib/", - "LICENSE", - "HISTORY.md", - "SECURITY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - } -} diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE deleted file mode 100644 index de322667..00000000 --- a/node_modules/brace-expansion/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 6b4e0e16..00000000 --- a/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# 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 deleted file mode 100644 index 0478be81..00000000 --- a/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,201 +0,0 @@ -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 deleted file mode 100644 index a18faa8f..00000000 --- a/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "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/CHANGELOG.md b/node_modules/braces/CHANGELOG.md deleted file mode 100644 index 36f798b0..00000000 --- a/node_modules/braces/CHANGELOG.md +++ /dev/null @@ -1,184 +0,0 @@ -# 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. - -
- -## [3.0.0] - 2018-04-08 - -v3.0 is a complete refactor, resulting in a faster, smaller codebase, with fewer deps, and a more accurate parser and compiler. - -**Breaking Changes** - -- The undocumented `.makeRe` method was removed - -**Non-breaking changes** - -- Caching was removed - -## [2.3.2] - 2018-04-08 - -- start refactoring -- cover sets -- better range handling - -## [2.3.1] - 2018-02-17 - -- Remove unnecessary escape in Regex. (#14) - -## [2.3.0] - 2017-10-19 - -- minor code reorganization -- optimize regex -- expose `maxLength` option - -## [2.2.1] - 2017-05-30 - -- don't condense when braces contain extglobs - -## [2.2.0] - 2017-05-28 - -- ensure word boundaries are preserved -- fixes edge case where extglob characters precede a brace pattern - -## [2.1.1] - 2017-04-27 - -- use snapdragon-node -- handle edge case -- optimizations, lint - -## [2.0.4] - 2017-04-11 - -- pass opts to compiler -- minor optimization in create method -- re-write parser handlers to remove negation regex - -## [2.0.3] - 2016-12-10 - -- use split-string -- clear queue at the end -- adds sequences example -- add unit tests - -## [2.0.2] - 2016-10-21 - -- fix comma handling in nested extglobs - -## [2.0.1] - 2016-10-20 - -- add comments -- more tests, ensure quotes are stripped - -## [2.0.0] - 2016-10-19 - -- don't expand braces inside character classes -- add quantifier pattern - -## [1.8.5] - 2016-05-21 - -- Refactor (#10) - -## [1.8.4] - 2016-04-20 - -- fixes https://github.com/jonschlinkert/micromatch/issues/66 - -## [1.8.0] - 2015-03-18 - -- adds exponent examples, tests -- fixes the first example in https://github.com/jonschlinkert/micromatch/issues/38 - -## [1.6.0] - 2015-01-30 - -- optimizations, `bash` mode: -- improve path escaping - -## [1.5.0] - 2015-01-28 - -- Merge pull request #5 from eush77/lib-files - -## [1.4.0] - 2015-01-24 - -- add extglob tests -- externalize exponent function -- better whitespace handling - -## [1.3.0] - 2015-01-24 - -- make regex patterns explicity - -## [1.1.0] - 2015-01-11 - -- don't create a match group with `makeRe` - -## [1.0.0] - 2014-12-23 - -- Merge commit '97b05f5544f8348736a8efaecf5c32bbe3e2ad6e' -- support empty brace syntax -- better bash coverage -- better support for regex strings - -## [0.1.4] - 2014-11-14 - -- improve recognition of bad args, recognize mismatched argument types -- support escaping -- remove pathname-expansion -- support whitespace in patterns - -## [0.1.0] - -- first commit - -[2.3.2]: https://github.com/micromatch/braces/compare/2.3.1...2.3.2 -[2.3.1]: https://github.com/micromatch/braces/compare/2.3.0...2.3.1 -[2.3.0]: https://github.com/micromatch/braces/compare/2.2.1...2.3.0 -[2.2.1]: https://github.com/micromatch/braces/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/micromatch/braces/compare/2.1.1...2.2.0 -[2.1.1]: https://github.com/micromatch/braces/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/micromatch/braces/compare/2.0.4...2.1.0 -[2.0.4]: https://github.com/micromatch/braces/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/micromatch/braces/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/micromatch/braces/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/micromatch/braces/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/micromatch/braces/compare/1.8.5...2.0.0 -[1.8.5]: https://github.com/micromatch/braces/compare/1.8.4...1.8.5 -[1.8.4]: https://github.com/micromatch/braces/compare/1.8.0...1.8.4 -[1.8.0]: https://github.com/micromatch/braces/compare/1.6.0...1.8.0 -[1.6.0]: https://github.com/micromatch/braces/compare/1.5.0...1.6.0 -[1.5.0]: https://github.com/micromatch/braces/compare/1.4.0...1.5.0 -[1.4.0]: https://github.com/micromatch/braces/compare/1.3.0...1.4.0 -[1.3.0]: https://github.com/micromatch/braces/compare/1.2.0...1.3.0 -[1.2.0]: https://github.com/micromatch/braces/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/micromatch/braces/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/micromatch/braces/compare/0.1.4...1.0.0 -[0.1.4]: https://github.com/micromatch/braces/compare/0.1.0...0.1.4 - -[Unreleased]: https://github.com/micromatch/braces/compare/0.1.0...HEAD -[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog \ No newline at end of file diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE deleted file mode 100644 index d32ab442..00000000 --- a/node_modules/braces/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index cba2f600..00000000 --- a/node_modules/braces/README.md +++ /dev/null @@ -1,593 +0,0 @@ -# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![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) - -> 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 -``` - -## v3.0.0 Released!! - -See the [changelog](CHANGELOG.md) for details. - -## Why use braces? - -Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. - -* **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** - The parser and compiler are easy to maintain and update when edge cases crop up. -* **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). -* **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). -* [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` -* [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` -* [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` -* [Supports escaping](#escaping) - To prevent evaluation of special characters. - -## Usage - -The main export is a function that takes one or more brace `patterns` and `options`. - -```js -const braces = require('braces'); -// braces(patterns[, options]); - -console.log(braces(['{01..05}', '{a..e}'])); -//=> ['(0[1-5])', '([a-e])'] - -console.log(braces(['{01..05}', '{a..e}'], { expand: true })); -//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] -``` - -### Brace Expansion vs. Compilation - -By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. - -**Compiled** - -```js -console.log(braces('a/{x,y,z}/b')); -//=> ['a/(x|y|z)/b'] -console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); -//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] -``` - -**Expanded** - -Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): - -```js -console.log(braces('a/{x,y,z}/b', { expand: true })); -//=> ['a/x/b', 'a/y/b', 'a/z/b'] - -console.log(braces.expand('{01..10}')); -//=> ['01','02','03','04','05','06','07','08','09','10'] -``` - -### Lists - -Expand lists (like Bash "sets"): - -```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 - -Expand ranges of characters (like Bash "sequences"): - -```js -console.log(braces.expand('{1..3}')); // ['1', '2', '3'] -console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] -console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] -console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] - -// supports zero-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'] -``` - -See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. - -### Steppped ranges - -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 (alternatively you can use the `braces.expand()` method, which does the same thing). - -```js -console.log(braces('a/{b,c}/d', { expand: true })); -//=> [ 'a/b/d', 'a/c/d' ] -``` - -### options.nodupes - -**Type**: `Boolean` - -**Default**: `undefined` - -**Description**: Remove duplicates from the returned array. - -### options.rangeLimit - -**Type**: `Number` - -**Default**: `1000` - -**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. - -You can customize `options.rangeLimit` or set it 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. - -**Example: Transforming non-numeric values** - -```js -const alpha = braces.expand('x/{a..e}/y', { - transform(value, index) { - // When non-numeric values are passed, "value" is a character code. - return 'foo/' + String.fromCharCode(value) + '-' + index; - } -}); -console.log(alpha); -//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] -``` - -**Example: Transforming numeric values** - -```js -const numeric = braces.expand('{1..5}', { - transform(value) { - // when numeric values are passed, "value" is a number - return 'foo/' + value * 2; - } -}); -console.log(numeric); -//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] -``` - -### 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 -const 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][]** | -| --- | --- | --- | -| `{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][]** | -| --- | --- | --- | -| `{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 - -Braces is more accurate, without sacrificing performance. - -```bash -# range (expanded) - braces x 29,040 ops/sec ±3.69% (91 runs sampled)) - minimatch x 4,735 ops/sec ±1.28% (90 runs sampled) - -# range (optimized for regex) - braces x 382,878 ops/sec ±0.56% (94 runs sampled) - minimatch x 1,040 ops/sec ±0.44% (93 runs sampled) - -# nested ranges (expanded) - braces x 19,744 ops/sec ±2.27% (92 runs sampled)) - minimatch x 4,579 ops/sec ±0.50% (93 runs sampled) - -# nested ranges (optimized for regex) - braces x 246,019 ops/sec ±2.02% (93 runs sampled) - minimatch x 1,028 ops/sec ±0.39% (94 runs sampled) - -# set (expanded) - braces x 138,641 ops/sec ±0.53% (95 runs sampled) - minimatch x 219,582 ops/sec ±0.98% (94 runs sampled) - -# set (optimized for regex) - braces x 388,408 ops/sec ±0.41% (95 runs sampled) - minimatch x 44,724 ops/sec ±0.91% (89 runs sampled) - -# nested sets (expanded) - braces x 84,966 ops/sec ±0.48% (94 runs sampled) - minimatch x 140,720 ops/sec ±0.37% (95 runs sampled) - -# nested sets (optimized for regex) - braces x 263,340 ops/sec ±2.06% (92 runs sampled) - minimatch x 28,714 ops/sec ±0.40% (90 runs sampled) -``` - -## 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** | -| --- | --- | -| 197 | [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) | -| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -### License - -Copyright © 2019, [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.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js deleted file mode 100644 index 0eee0f56..00000000 --- a/node_modules/braces/index.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; - -const stringify = require('./lib/stringify'); -const compile = require('./lib/compile'); -const expand = require('./lib/expand'); -const parse = require('./lib/parse'); - -/** - * Expand the given pattern or create a regex-compatible string. - * - * ```js - * const braces = require('braces'); - * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] - * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {String} - * @api public - */ - -const braces = (input, options = {}) => { - let output = []; - - if (Array.isArray(input)) { - for (let pattern of input) { - let result = braces.create(pattern, options); - if (Array.isArray(result)) { - output.push(...result); - } else { - output.push(result); - } - } - } else { - output = [].concat(braces.create(input, options)); - } - - if (options && options.expand === true && options.nodupes === true) { - output = [...new Set(output)]; - } - return output; -}; - -/** - * Parse the given `str` with the given `options`. - * - * ```js - * // braces.parse(pattern, [, options]); - * const ast = braces.parse('a/{b,c}/d'); - * console.log(ast); - * ``` - * @param {String} pattern Brace pattern to parse - * @param {Object} options - * @return {Object} Returns an AST - * @api public - */ - -braces.parse = (input, options = {}) => parse(input, options); - -/** - * Creates a braces string from an AST, or an AST node. - * - * ```js - * const braces = require('braces'); - * let ast = braces.parse('foo/{a,b}/bar'); - * console.log(stringify(ast.nodes[2])); //=> '{a,b}' - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.stringify = (input, options = {}) => { - if (typeof input === 'string') { - return stringify(braces.parse(input, options), options); - } - return stringify(input, options); -}; - -/** - * Compiles a brace pattern into a regex-compatible, optimized string. - * This method is called by the main [braces](#braces) function by default. - * - * ```js - * const braces = require('braces'); - * console.log(braces.compile('a/{b,c}/d')); - * //=> ['a/(b|c)/d'] - * ``` - * @param {String} `input` Brace pattern or AST. - * @param {Object} `options` - * @return {Array} Returns an array of expanded values. - * @api public - */ - -braces.compile = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - return compile(input, options); -}; - -/** - * 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 [.compile](#compile) instead. - * - * ```js - * const 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 = (input, options = {}) => { - if (typeof input === 'string') { - input = braces.parse(input, options); - } - - let result = expand(input, options); - - // filter out empty strings if specified - if (options.noempty === true) { - result = result.filter(Boolean); - } - - // filter out duplicates if specified - if (options.nodupes === true) { - result = [...new Set(result)]; - } - - return result; -}; - -/** - * 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 - * const 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 = (input, options = {}) => { - if (input === '' || input.length < 3) { - return [input]; - } - - return options.expand !== true - ? braces.compile(input, options) - : braces.expand(input, options); -}; - -/** - * Expose "braces" - */ - -module.exports = braces; diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js deleted file mode 100644 index 3e984a4b..00000000 --- a/node_modules/braces/lib/compile.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -const fill = require('fill-range'); -const utils = require('./utils'); - -const compile = (ast, options = {}) => { - let walk = (node, parent = {}) => { - let invalidBlock = utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let invalid = invalidBlock === true || invalidNode === true; - let prefix = options.escapeInvalid === true ? '\\' : ''; - let output = ''; - - if (node.isOpen === true) { - return prefix + node.value; - } - if (node.isClose === true) { - return prefix + node.value; - } - - if (node.type === 'open') { - return invalid ? (prefix + node.value) : '('; - } - - if (node.type === 'close') { - return invalid ? (prefix + node.value) : ')'; - } - - if (node.type === 'comma') { - return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); - } - - if (node.value) { - return node.value; - } - - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); - let range = fill(...args, { ...options, wrap: false, toRegex: true }); - - if (range.length !== 0) { - return args.length > 1 && range.length > 1 ? `(${range})` : range; - } - } - - if (node.nodes) { - for (let child of node.nodes) { - output += walk(child, node); - } - } - return output; - }; - - return walk(ast); -}; - -module.exports = compile; diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js deleted file mode 100644 index a9379436..00000000 --- a/node_modules/braces/lib/constants.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -module.exports = { - MAX_LENGTH: 1024 * 64, - - // Digits - CHAR_0: '0', /* 0 */ - CHAR_9: '9', /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 'A', /* A */ - CHAR_LOWERCASE_A: 'a', /* a */ - CHAR_UPPERCASE_Z: 'Z', /* Z */ - CHAR_LOWERCASE_Z: 'z', /* z */ - - CHAR_LEFT_PARENTHESES: '(', /* ( */ - CHAR_RIGHT_PARENTHESES: ')', /* ) */ - - CHAR_ASTERISK: '*', /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: '&', /* & */ - CHAR_AT: '@', /* @ */ - CHAR_BACKSLASH: '\\', /* \ */ - CHAR_BACKTICK: '`', /* ` */ - CHAR_CARRIAGE_RETURN: '\r', /* \r */ - CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ - CHAR_COLON: ':', /* : */ - CHAR_COMMA: ',', /* , */ - CHAR_DOLLAR: '$', /* . */ - CHAR_DOT: '.', /* . */ - CHAR_DOUBLE_QUOTE: '"', /* " */ - CHAR_EQUAL: '=', /* = */ - CHAR_EXCLAMATION_MARK: '!', /* ! */ - CHAR_FORM_FEED: '\f', /* \f */ - CHAR_FORWARD_SLASH: '/', /* / */ - CHAR_HASH: '#', /* # */ - CHAR_HYPHEN_MINUS: '-', /* - */ - CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ - CHAR_LEFT_CURLY_BRACE: '{', /* { */ - CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ - CHAR_LINE_FEED: '\n', /* \n */ - CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ - CHAR_PERCENT: '%', /* % */ - CHAR_PLUS: '+', /* + */ - CHAR_QUESTION_MARK: '?', /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ - CHAR_RIGHT_CURLY_BRACE: '}', /* } */ - CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ - CHAR_SEMICOLON: ';', /* ; */ - CHAR_SINGLE_QUOTE: '\'', /* ' */ - CHAR_SPACE: ' ', /* */ - CHAR_TAB: '\t', /* \t */ - CHAR_UNDERSCORE: '_', /* _ */ - CHAR_VERTICAL_LINE: '|', /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ -}; diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js deleted file mode 100644 index 376c748a..00000000 --- a/node_modules/braces/lib/expand.js +++ /dev/null @@ -1,113 +0,0 @@ -'use strict'; - -const fill = require('fill-range'); -const stringify = require('./stringify'); -const utils = require('./utils'); - -const append = (queue = '', stash = '', enclose = false) => { - let result = []; - - queue = [].concat(queue); - stash = [].concat(stash); - - if (!stash.length) return queue; - if (!queue.length) { - return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; - } - - for (let item of queue) { - if (Array.isArray(item)) { - for (let value of item) { - result.push(append(value, stash, enclose)); - } - } else { - for (let ele of stash) { - if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; - result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); - } - } - } - return utils.flatten(result); -}; - -const expand = (ast, options = {}) => { - let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; - - let walk = (node, parent = {}) => { - node.queue = []; - - let p = parent; - let q = parent.queue; - - while (p.type !== 'brace' && p.type !== 'root' && p.parent) { - p = p.parent; - q = p.queue; - } - - if (node.invalid || node.dollar) { - q.push(append(q.pop(), stringify(node, options))); - return; - } - - if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { - q.push(append(q.pop(), ['{}'])); - return; - } - - if (node.nodes && node.ranges > 0) { - let args = utils.reduce(node.nodes); - - if (utils.exceedsLimit(...args, options.step, rangeLimit)) { - throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); - } - - let range = fill(...args, options); - if (range.length === 0) { - range = stringify(node, options); - } - - q.push(append(q.pop(), range)); - node.nodes = []; - return; - } - - let enclose = utils.encloseBrace(node); - let queue = node.queue; - let block = node; - - while (block.type !== 'brace' && block.type !== 'root' && block.parent) { - block = block.parent; - queue = block.queue; - } - - for (let i = 0; i < node.nodes.length; i++) { - let child = node.nodes[i]; - - if (child.type === 'comma' && node.type === 'brace') { - if (i === 1) queue.push(''); - queue.push(''); - continue; - } - - if (child.type === 'close') { - q.push(append(q.pop(), queue, enclose)); - continue; - } - - if (child.value && child.type !== 'open') { - queue.push(append(queue.pop(), child.value)); - continue; - } - - if (child.nodes) { - walk(child, node); - } - } - - return queue; - }; - - return utils.flatten(walk(ast)); -}; - -module.exports = expand; diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js deleted file mode 100644 index 145ea264..00000000 --- a/node_modules/braces/lib/parse.js +++ /dev/null @@ -1,333 +0,0 @@ -'use strict'; - -const stringify = require('./stringify'); - -/** - * Constants - */ - -const { - MAX_LENGTH, - CHAR_BACKSLASH, /* \ */ - CHAR_BACKTICK, /* ` */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_RIGHT_SQUARE_BRACKET, /* ] */ - CHAR_DOUBLE_QUOTE, /* " */ - CHAR_SINGLE_QUOTE, /* ' */ - CHAR_NO_BREAK_SPACE, - CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = require('./constants'); - -/** - * parse - */ - -const parse = (input, options = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - let opts = options || {}; - let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - if (input.length > max) { - throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); - } - - let ast = { type: 'root', input, nodes: [] }; - let stack = [ast]; - let block = ast; - let prev = ast; - let brackets = 0; - let length = input.length; - let index = 0; - let depth = 0; - let value; - let memo = {}; - - /** - * Helpers - */ - - const advance = () => input[index++]; - const push = node => { - if (node.type === 'text' && prev.type === 'dot') { - prev.type = 'text'; - } - - if (prev && prev.type === 'text' && node.type === 'text') { - prev.value += node.value; - return; - } - - block.nodes.push(node); - node.parent = block; - node.prev = prev; - prev = node; - return node; - }; - - push({ type: 'bos' }); - - while (index < length) { - block = stack[stack.length - 1]; - value = advance(); - - /** - * Invalid chars - */ - - if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { - continue; - } - - /** - * Escaped chars - */ - - if (value === CHAR_BACKSLASH) { - push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); - continue; - } - - /** - * Right square bracket (literal): ']' - */ - - if (value === CHAR_RIGHT_SQUARE_BRACKET) { - push({ type: 'text', value: '\\' + value }); - continue; - } - - /** - * Left square bracket: '[' - */ - - if (value === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - - let closed = true; - let next; - - while (index < length && (next = advance())) { - value += next; - - if (next === CHAR_LEFT_SQUARE_BRACKET) { - brackets++; - continue; - } - - if (next === CHAR_BACKSLASH) { - value += advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - brackets--; - - if (brackets === 0) { - break; - } - } - } - - push({ type: 'text', value }); - continue; - } - - /** - * Parentheses - */ - - if (value === CHAR_LEFT_PARENTHESES) { - block = push({ type: 'paren', nodes: [] }); - stack.push(block); - push({ type: 'text', value }); - continue; - } - - if (value === CHAR_RIGHT_PARENTHESES) { - if (block.type !== 'paren') { - push({ type: 'text', value }); - continue; - } - block = stack.pop(); - push({ type: 'text', value }); - block = stack[stack.length - 1]; - continue; - } - - /** - * Quotes: '|"|` - */ - - if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { - let open = value; - let next; - - if (options.keepQuotes !== true) { - value = ''; - } - - while (index < length && (next = advance())) { - if (next === CHAR_BACKSLASH) { - value += next + advance(); - continue; - } - - if (next === open) { - if (options.keepQuotes === true) value += next; - break; - } - - value += next; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Left curly brace: '{' - */ - - if (value === CHAR_LEFT_CURLY_BRACE) { - depth++; - - let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; - let brace = { - type: 'brace', - open: true, - close: false, - dollar, - depth, - commas: 0, - ranges: 0, - nodes: [] - }; - - block = push(brace); - stack.push(block); - push({ type: 'open', value }); - continue; - } - - /** - * Right curly brace: '}' - */ - - if (value === CHAR_RIGHT_CURLY_BRACE) { - if (block.type !== 'brace') { - push({ type: 'text', value }); - continue; - } - - let type = 'close'; - block = stack.pop(); - block.close = true; - - push({ type, value }); - depth--; - - block = stack[stack.length - 1]; - continue; - } - - /** - * Comma: ',' - */ - - if (value === CHAR_COMMA && depth > 0) { - if (block.ranges > 0) { - block.ranges = 0; - let open = block.nodes.shift(); - block.nodes = [open, { type: 'text', value: stringify(block) }]; - } - - push({ type: 'comma', value }); - block.commas++; - continue; - } - - /** - * Dot: '.' - */ - - if (value === CHAR_DOT && depth > 0 && block.commas === 0) { - let siblings = block.nodes; - - if (depth === 0 || siblings.length === 0) { - push({ type: 'text', value }); - continue; - } - - if (prev.type === 'dot') { - block.range = []; - prev.value += value; - prev.type = 'range'; - - if (block.nodes.length !== 3 && block.nodes.length !== 5) { - block.invalid = true; - block.ranges = 0; - prev.type = 'text'; - continue; - } - - block.ranges++; - block.args = []; - continue; - } - - if (prev.type === 'range') { - siblings.pop(); - - let before = siblings[siblings.length - 1]; - before.value += prev.value + value; - prev = before; - block.ranges--; - continue; - } - - push({ type: 'dot', value }); - continue; - } - - /** - * Text - */ - - push({ type: 'text', value }); - } - - // Mark imbalanced braces and brackets as invalid - do { - block = stack.pop(); - - if (block.type !== 'root') { - block.nodes.forEach(node => { - if (!node.nodes) { - if (node.type === 'open') node.isOpen = true; - if (node.type === 'close') node.isClose = true; - if (!node.nodes) node.type = 'text'; - node.invalid = true; - } - }); - - // get the location of the block on parent.nodes (block's siblings) - let parent = stack[stack.length - 1]; - let index = parent.nodes.indexOf(block); - // replace the (invalid) block with it's nodes - parent.nodes.splice(index, 1, ...block.nodes); - } - } while (stack.length > 0); - - push({ type: 'eos' }); - return ast; -}; - -module.exports = parse; diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js deleted file mode 100644 index 414b7bcc..00000000 --- a/node_modules/braces/lib/stringify.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -const utils = require('./utils'); - -module.exports = (ast, options = {}) => { - let stringify = (node, parent = {}) => { - let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); - let invalidNode = node.invalid === true && options.escapeInvalid === true; - let output = ''; - - if (node.value) { - if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { - return '\\' + node.value; - } - return node.value; - } - - if (node.value) { - return node.value; - } - - if (node.nodes) { - for (let child of node.nodes) { - output += stringify(child); - } - } - return output; - }; - - return stringify(ast); -}; - diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js deleted file mode 100644 index e3551a67..00000000 --- a/node_modules/braces/lib/utils.js +++ /dev/null @@ -1,112 +0,0 @@ -'use strict'; - -exports.isInteger = num => { - if (typeof num === 'number') { - return Number.isInteger(num); - } - if (typeof num === 'string' && num.trim() !== '') { - return Number.isInteger(Number(num)); - } - return false; -}; - -/** - * Find a node of the given type - */ - -exports.find = (node, type) => node.nodes.find(node => node.type === type); - -/** - * Find a node of the given type - */ - -exports.exceedsLimit = (min, max, step = 1, limit) => { - if (limit === false) return false; - if (!exports.isInteger(min) || !exports.isInteger(max)) return false; - return ((Number(max) - Number(min)) / Number(step)) >= limit; -}; - -/** - * Escape the given node with '\\' before node.value - */ - -exports.escapeNode = (block, n = 0, type) => { - let node = block.nodes[n]; - if (!node) return; - - if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { - if (node.escaped !== true) { - node.value = '\\' + node.value; - node.escaped = true; - } - } -}; - -/** - * Returns true if the given brace node should be enclosed in literal braces - */ - -exports.encloseBrace = node => { - if (node.type !== 'brace') return false; - if ((node.commas >> 0 + node.ranges >> 0) === 0) { - node.invalid = true; - return true; - } - return false; -}; - -/** - * Returns true if a brace node is invalid. - */ - -exports.isInvalidBrace = block => { - if (block.type !== 'brace') return false; - if (block.invalid === true || block.dollar) return true; - if ((block.commas >> 0 + block.ranges >> 0) === 0) { - block.invalid = true; - return true; - } - if (block.open !== true || block.close !== true) { - block.invalid = true; - return true; - } - return false; -}; - -/** - * Returns true if a node is an open or close node - */ - -exports.isOpenOrClose = node => { - if (node.type === 'open' || node.type === 'close') { - return true; - } - return node.open === true || node.close === true; -}; - -/** - * Reduce an array of text nodes. - */ - -exports.reduce = nodes => nodes.reduce((acc, node) => { - if (node.type === 'text') acc.push(node.value); - if (node.type === 'range') node.type = 'text'; - return acc; -}, []); - -/** - * Flatten an array - */ - -exports.flatten = (...args) => { - const result = []; - const flat = arr => { - for (let i = 0; i < arr.length; i++) { - let ele = arr[i]; - Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); - } - return result; - }; - flat(args); - return result; -}; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json deleted file mode 100644 index 3f52e346..00000000 --- a/node_modules/braces/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "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": "3.0.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": ">=8" - }, - "scripts": { - "test": "mocha", - "benchmark": "node benchmark" - }, - "dependencies": { - "fill-range": "^7.0.1" - }, - "devDependencies": { - "ansi-colors": "^3.2.4", - "bash-path": "^2.0.1", - "gulp-format-md": "^2.0.0", - "mocha": "^6.1.1" - }, - "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" - ] - } -} diff --git a/node_modules/bytes/History.md b/node_modules/bytes/History.md deleted file mode 100644 index d60ce0e6..00000000 --- a/node_modules/bytes/History.md +++ /dev/null @@ -1,97 +0,0 @@ -3.1.2 / 2022-01-27 -================== - - * Fix return value for un-parsable strings - -3.1.1 / 2021-11-15 -================== - - * Fix "thousandsSeparator" incorrecting formatting fractional part - -3.1.0 / 2019-01-22 -================== - - * Add petabyte (`pb`) support - -3.0.0 / 2017-08-31 -================== - - * Change "kB" to "KB" in format output - * Remove support for Node.js 0.6 - * Remove support for ComponentJS - -2.5.0 / 2017-03-24 -================== - - * Add option "unit" - -2.4.0 / 2016-06-01 -================== - - * Add option "unitSeparator" - -2.3.0 / 2016-02-15 -================== - - * Drop partial bytes on all parsed units - * Fix non-finite numbers to `.format` to return `null` - * Fix parsing byte string that looks like hex - * perf: hoist regular expressions - -2.2.0 / 2015-11-13 -================== - - * add option "decimalPlaces" - * add option "fixedDecimals" - -2.1.0 / 2015-05-21 -================== - - * add `.format` export - * add `.parse` export - -2.0.2 / 2015-05-20 -================== - - * remove map recreation - * remove unnecessary object construction - -2.0.1 / 2015-05-07 -================== - - * fix browserify require - * remove node.extend dependency - -2.0.0 / 2015-04-12 -================== - - * add option "case" - * add option "thousandsSeparator" - * return "null" on invalid parse input - * support proper round-trip: bytes(bytes(num)) === num - * units no longer case sensitive when parsing - -1.0.0 / 2014-05-05 -================== - - * add negative support. fixes #6 - -0.3.0 / 2014-03-19 -================== - - * added terabyte support - -0.2.1 / 2013-04-01 -================== - - * add .component - -0.2.0 / 2012-10-28 -================== - - * bytes(200).should.eql('200b') - -0.1.0 / 2012-07-04 -================== - - * add bytes to string conversion [yields] diff --git a/node_modules/bytes/LICENSE b/node_modules/bytes/LICENSE deleted file mode 100644 index 63e95a96..00000000 --- a/node_modules/bytes/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015 Jed Watson - -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/bytes/Readme.md b/node_modules/bytes/Readme.md deleted file mode 100644 index 5790e23e..00000000 --- a/node_modules/bytes/Readme.md +++ /dev/null @@ -1,152 +0,0 @@ -# Bytes utility - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Build Status][ci-image]][ci-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa. - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```bash -$ npm install bytes -``` - -## Usage - -```js -var bytes = require('bytes'); -``` - -#### bytes(number|string value, [options]): number|string|null - -Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`. - -**Arguments** - -| Name | Type | Description | -|---------|----------|--------------------| -| value | `number`|`string` | Number value to format or string value to parse | -| options | `Object` | Conversion options for `format` | - -**Returns** - -| Name | Type | Description | -|---------|------------------|-------------------------------------------------| -| results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. | - -**Example** - -```js -bytes(1024); -// output: '1KB' - -bytes('1KB'); -// output: 1024 -``` - -#### bytes.format(number value, [options]): string|null - -Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is - rounded. - -**Arguments** - -| Name | Type | Description | -|---------|----------|--------------------| -| value | `number` | Value in bytes | -| options | `Object` | Conversion options | - -**Options** - -| Property | Type | Description | -|-------------------|--------|-----------------------------------------------------------------------------------------| -| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. | -| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` | -| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. | -| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). | -| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. | - -**Returns** - -| Name | Type | Description | -|---------|------------------|-------------------------------------------------| -| results | `string`|`null` | Return null upon error. String value otherwise. | - -**Example** - -```js -bytes.format(1024); -// output: '1KB' - -bytes.format(1000); -// output: '1000B' - -bytes.format(1000, {thousandsSeparator: ' '}); -// output: '1 000B' - -bytes.format(1024 * 1.7, {decimalPlaces: 0}); -// output: '2KB' - -bytes.format(1024, {unitSeparator: ' '}); -// output: '1 KB' -``` - -#### bytes.parse(string|number value): number|null - -Parse the string value into an integer in bytes. If no unit is given, or `value` -is a number, it is assumed the value is in bytes. - -Supported units and abbreviations are as follows and are case-insensitive: - - * `b` for bytes - * `kb` for kilobytes - * `mb` for megabytes - * `gb` for gigabytes - * `tb` for terabytes - * `pb` for petabytes - -The units are in powers of two, not ten. This means 1kb = 1024b according to this parser. - -**Arguments** - -| Name | Type | Description | -|---------------|--------|--------------------| -| value | `string`|`number` | String to parse, or number in bytes. | - -**Returns** - -| Name | Type | Description | -|---------|-------------|-------------------------| -| results | `number`|`null` | Return null upon error. Value in bytes otherwise. | - -**Example** - -```js -bytes.parse('1KB'); -// output: 1024 - -bytes.parse('1024'); -// output: 1024 - -bytes.parse(1024); -// output: 1024 -``` - -## License - -[MIT](LICENSE) - -[ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci -[ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci -[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master -[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master -[downloads-image]: https://badgen.net/npm/dm/bytes -[downloads-url]: https://npmjs.org/package/bytes -[npm-image]: https://badgen.net/npm/v/bytes -[npm-url]: https://npmjs.org/package/bytes diff --git a/node_modules/bytes/index.js b/node_modules/bytes/index.js deleted file mode 100644 index 6f2d0f89..00000000 --- a/node_modules/bytes/index.js +++ /dev/null @@ -1,170 +0,0 @@ -/*! - * bytes - * Copyright(c) 2012-2014 TJ Holowaychuk - * Copyright(c) 2015 Jed Watson - * MIT Licensed - */ - -'use strict'; - -/** - * Module exports. - * @public - */ - -module.exports = bytes; -module.exports.format = format; -module.exports.parse = parse; - -/** - * Module variables. - * @private - */ - -var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; - -var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; - -var map = { - b: 1, - kb: 1 << 10, - mb: 1 << 20, - gb: 1 << 30, - tb: Math.pow(1024, 4), - pb: Math.pow(1024, 5), -}; - -var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i; - -/** - * Convert the given value in bytes into a string or parse to string to an integer in bytes. - * - * @param {string|number} value - * @param {{ - * case: [string], - * decimalPlaces: [number] - * fixedDecimals: [boolean] - * thousandsSeparator: [string] - * unitSeparator: [string] - * }} [options] bytes options. - * - * @returns {string|number|null} - */ - -function bytes(value, options) { - if (typeof value === 'string') { - return parse(value); - } - - if (typeof value === 'number') { - return format(value, options); - } - - return null; -} - -/** - * Format the given value in bytes into a string. - * - * If the value is negative, it is kept as such. If it is a float, - * it is rounded. - * - * @param {number} value - * @param {object} [options] - * @param {number} [options.decimalPlaces=2] - * @param {number} [options.fixedDecimals=false] - * @param {string} [options.thousandsSeparator=] - * @param {string} [options.unit=] - * @param {string} [options.unitSeparator=] - * - * @returns {string|null} - * @public - */ - -function format(value, options) { - if (!Number.isFinite(value)) { - return null; - } - - var mag = Math.abs(value); - var thousandsSeparator = (options && options.thousandsSeparator) || ''; - var unitSeparator = (options && options.unitSeparator) || ''; - var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; - var fixedDecimals = Boolean(options && options.fixedDecimals); - var unit = (options && options.unit) || ''; - - if (!unit || !map[unit.toLowerCase()]) { - if (mag >= map.pb) { - unit = 'PB'; - } else if (mag >= map.tb) { - unit = 'TB'; - } else if (mag >= map.gb) { - unit = 'GB'; - } else if (mag >= map.mb) { - unit = 'MB'; - } else if (mag >= map.kb) { - unit = 'KB'; - } else { - unit = 'B'; - } - } - - var val = value / map[unit.toLowerCase()]; - var str = val.toFixed(decimalPlaces); - - if (!fixedDecimals) { - str = str.replace(formatDecimalsRegExp, '$1'); - } - - if (thousandsSeparator) { - str = str.split('.').map(function (s, i) { - return i === 0 - ? s.replace(formatThousandsRegExp, thousandsSeparator) - : s - }).join('.'); - } - - return str + unitSeparator + unit; -} - -/** - * Parse the string value into an integer in bytes. - * - * If no unit is given, it is assumed the value is in bytes. - * - * @param {number|string} val - * - * @returns {number|null} - * @public - */ - -function parse(val) { - if (typeof val === 'number' && !isNaN(val)) { - return val; - } - - if (typeof val !== 'string') { - return null; - } - - // Test if the string passed is valid - var results = parseRegExp.exec(val); - var floatValue; - var unit = 'b'; - - if (!results) { - // Nothing could be extracted from the given string - floatValue = parseInt(val, 10); - unit = 'b' - } else { - // Retrieve the value and the unit - floatValue = parseFloat(results[1]); - unit = results[4].toLowerCase(); - } - - if (isNaN(floatValue)) { - return null; - } - - return Math.floor(map[unit] * floatValue); -} diff --git a/node_modules/bytes/package.json b/node_modules/bytes/package.json deleted file mode 100644 index f2b6a8b0..00000000 --- a/node_modules/bytes/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "bytes", - "description": "Utility to parse a string bytes to bytes and vice-versa", - "version": "3.1.2", - "author": "TJ Holowaychuk (http://tjholowaychuk.com)", - "contributors": [ - "Jed Watson ", - "Théo FIDRY " - ], - "license": "MIT", - "keywords": [ - "byte", - "bytes", - "utility", - "parse", - "parser", - "convert", - "converter" - ], - "repository": "visionmedia/bytes.js", - "devDependencies": { - "eslint": "7.32.0", - "eslint-plugin-markdown": "2.2.1", - "mocha": "9.2.0", - "nyc": "15.1.0" - }, - "files": [ - "History.md", - "LICENSE", - "Readme.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --check-leaks --reporter spec", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - } -} diff --git a/node_modules/call-bind/.eslintignore b/node_modules/call-bind/.eslintignore deleted file mode 100644 index 404abb22..00000000 --- a/node_modules/call-bind/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -coverage/ diff --git a/node_modules/call-bind/.eslintrc b/node_modules/call-bind/.eslintrc deleted file mode 100644 index e5d3c9a9..00000000 --- a/node_modules/call-bind/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "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 deleted file mode 100644 index c70c2ecd..00000000 --- a/node_modules/call-bind/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# 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 deleted file mode 100644 index 1826526e..00000000 --- a/node_modules/call-bind/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "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 deleted file mode 100644 index 62a37279..00000000 --- a/node_modules/call-bind/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# 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.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11 - -### Commits - -- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d) - -## [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 deleted file mode 100644 index 48f05d01..00000000 --- a/node_modules/call-bind/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 53649eb4..00000000 --- a/node_modules/call-bind/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# call-bind -Robustly `.call.bind()` a function. diff --git a/node_modules/call-bind/callBound.js b/node_modules/call-bind/callBound.js deleted file mode 100644 index 8374adfd..00000000 --- a/node_modules/call-bind/callBound.js +++ /dev/null @@ -1,15 +0,0 @@ -'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 deleted file mode 100644 index 6fa3e4af..00000000 --- a/node_modules/call-bind/index.js +++ /dev/null @@ -1,47 +0,0 @@ -'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) { - // original length, plus the receiver, minus any additional arguments (after the receiver) - $defineProperty( - func, - 'length', - { value: 1 + $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 deleted file mode 100644 index 4360556a..00000000 --- a/node_modules/call-bind/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "call-bind", - "version": "1.0.2", - "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 deleted file mode 100644 index 209ce3cc..00000000 --- a/node_modules/call-bind/test/callBound.js +++ /dev/null @@ -1,55 +0,0 @@ -'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 deleted file mode 100644 index bf6769c7..00000000 --- a/node_modules/call-bind/test/index.js +++ /dev/null @@ -1,66 +0,0 @@ -'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 + 1, '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, '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 - 1, '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/camel-case/LICENSE b/node_modules/camel-case/LICENSE deleted file mode 100644 index 983fbe8a..00000000 --- a/node_modules/camel-case/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/camel-case/camel-case.d.ts b/node_modules/camel-case/camel-case.d.ts deleted file mode 100644 index 782ef3b5..00000000 --- a/node_modules/camel-case/camel-case.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare function camelCase (value: string, locale?: string, mergeNumbers?: boolean): string; - -export = camelCase; diff --git a/node_modules/camel-case/camel-case.js b/node_modules/camel-case/camel-case.js deleted file mode 100644 index 1be652e0..00000000 --- a/node_modules/camel-case/camel-case.js +++ /dev/null @@ -1,23 +0,0 @@ -var upperCase = require('upper-case') -var noCase = require('no-case') - -/** - * Camel case a string. - * - * @param {string} value - * @param {string} [locale] - * @return {string} - */ -module.exports = function (value, locale, mergeNumbers) { - var result = noCase(value, locale) - - // Replace periods between numeric entities with an underscore. - if (!mergeNumbers) { - result = result.replace(/ (?=\d)/g, '_') - } - - // Replace spaces between words with an upper cased character. - return result.replace(/ (.)/g, function (m, $1) { - return upperCase($1, locale) - }) -} diff --git a/node_modules/camel-case/package.json b/node_modules/camel-case/package.json deleted file mode 100644 index 725b39b0..00000000 --- a/node_modules/camel-case/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "camel-case", - "version": "3.0.0", - "description": "Camel case a string", - "main": "camel-case.js", - "typings": "camel-case.d.ts", - "files": [ - "camel-case.js", - "camel-case.d.ts", - "LICENSE" - ], - "scripts": { - "lint": "standard", - "test-spec": "mocha -- -R spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -R spec --bail", - "test": "npm run lint && npm run test-cov" - }, - "repository": { - "type": "git", - "url": "git://github.com/blakeembrey/camel-case.git" - }, - "keywords": [ - "camel", - "case", - "camelcase", - "camel-case", - "dash", - "hyphen", - "dot", - "underscore", - "lodash", - "separator", - "string", - "text", - "convert" - ], - "author": { - "name": "Blake Embrey", - "email": "hello@blakeembrey.com", - "url": "http://blakeembrey.me" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/blakeembrey/camel-case/issues" - }, - "homepage": "https://github.com/blakeembrey/camel-case", - "devDependencies": { - "istanbul": "^0.4.3", - "mocha": "^2.2.1", - "standard": "^7.1.2" - }, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } -} diff --git a/node_modules/caseless/LICENSE b/node_modules/caseless/LICENSE deleted file mode 100644 index 61789f4a..00000000 --- a/node_modules/caseless/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index e5077a21..00000000 --- a/node_modules/caseless/README.md +++ /dev/null @@ -1,45 +0,0 @@ -## 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 deleted file mode 100644 index b194734e..00000000 --- a/node_modules/caseless/index.js +++ /dev/null @@ -1,67 +0,0 @@ -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 deleted file mode 100644 index f55196cc..00000000 --- a/node_modules/caseless/test.js +++ /dev/null @@ -1,67 +0,0 @@ -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.d.ts b/node_modules/chalk/index.d.ts deleted file mode 100644 index 9cd88f38..00000000 --- a/node_modules/chalk/index.d.ts +++ /dev/null @@ -1,415 +0,0 @@ -/** -Basic foreground colors. - -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) -*/ -declare type ForegroundColor = - | 'black' - | 'red' - | 'green' - | 'yellow' - | 'blue' - | 'magenta' - | 'cyan' - | 'white' - | 'gray' - | 'grey' - | 'blackBright' - | 'redBright' - | 'greenBright' - | 'yellowBright' - | 'blueBright' - | 'magentaBright' - | 'cyanBright' - | 'whiteBright'; - -/** -Basic background colors. - -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) -*/ -declare type BackgroundColor = - | 'bgBlack' - | 'bgRed' - | 'bgGreen' - | 'bgYellow' - | 'bgBlue' - | 'bgMagenta' - | 'bgCyan' - | 'bgWhite' - | 'bgGray' - | 'bgGrey' - | 'bgBlackBright' - | 'bgRedBright' - | 'bgGreenBright' - | 'bgYellowBright' - | 'bgBlueBright' - | 'bgMagentaBright' - | 'bgCyanBright' - | 'bgWhiteBright'; - -/** -Basic colors. - -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) -*/ -declare type Color = ForegroundColor | BackgroundColor; - -declare type Modifiers = - | 'reset' - | 'bold' - | 'dim' - | 'italic' - | 'underline' - | 'inverse' - | 'hidden' - | 'strikethrough' - | 'visible'; - -declare namespace chalk { - /** - Levels: - - `0` - All colors disabled. - - `1` - Basic 16 colors support. - - `2` - ANSI 256 colors support. - - `3` - Truecolor 16 million colors support. - */ - type Level = 0 | 1 | 2 | 3; - - interface Options { - /** - Specify the color support for Chalk. - - By default, color support is automatically detected based on the environment. - - Levels: - - `0` - All colors disabled. - - `1` - Basic 16 colors support. - - `2` - ANSI 256 colors support. - - `3` - Truecolor 16 million colors support. - */ - level?: Level; - } - - /** - Return a new Chalk instance. - */ - type Instance = new (options?: Options) => Chalk; - - /** - Detect whether the terminal supports color. - */ - interface ColorSupport { - /** - The color level used by Chalk. - */ - level: Level; - - /** - Return whether Chalk supports basic 16 colors. - */ - hasBasic: boolean; - - /** - Return whether Chalk supports ANSI 256 colors. - */ - has256: boolean; - - /** - Return whether Chalk supports Truecolor 16 million colors. - */ - has16m: boolean; - } - - interface ChalkFunction { - /** - Use a template string. - - @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) - - @example - ``` - import chalk = require('chalk'); - - log(chalk` - CPU: {red ${cpu.totalPercent}%} - RAM: {green ${ram.used / ram.total * 100}%} - DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} - `); - ``` - - @example - ``` - import chalk = require('chalk'); - - log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) - ``` - */ - (text: TemplateStringsArray, ...placeholders: unknown[]): string; - - (...text: unknown[]): string; - } - - interface Chalk extends ChalkFunction { - /** - Return a new Chalk instance. - */ - Instance: Instance; - - /** - The color support for Chalk. - - By default, color support is automatically detected based on the environment. - - Levels: - - `0` - All colors disabled. - - `1` - Basic 16 colors support. - - `2` - ANSI 256 colors support. - - `3` - Truecolor 16 million colors support. - */ - level: Level; - - /** - Use HEX value to set text color. - - @param color - Hexadecimal value representing the desired color. - - @example - ``` - import chalk = require('chalk'); - - chalk.hex('#DEADED'); - ``` - */ - hex(color: string): Chalk; - - /** - Use keyword color value to set text color. - - @param color - Keyword value representing the desired color. - - @example - ``` - import chalk = require('chalk'); - - chalk.keyword('orange'); - ``` - */ - keyword(color: string): Chalk; - - /** - Use RGB values to set text color. - */ - rgb(red: number, green: number, blue: number): Chalk; - - /** - Use HSL values to set text color. - */ - hsl(hue: number, saturation: number, lightness: number): Chalk; - - /** - Use HSV values to set text color. - */ - hsv(hue: number, saturation: number, value: number): Chalk; - - /** - Use HWB values to set text color. - */ - hwb(hue: number, whiteness: number, blackness: number): Chalk; - - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. - - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - */ - ansi(code: number): Chalk; - - /** - Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. - */ - ansi256(index: number): Chalk; - - /** - Use HEX value to set background color. - - @param color - Hexadecimal value representing the desired color. - - @example - ``` - import chalk = require('chalk'); - - chalk.bgHex('#DEADED'); - ``` - */ - bgHex(color: string): Chalk; - - /** - Use keyword color value to set background color. - - @param color - Keyword value representing the desired color. - - @example - ``` - import chalk = require('chalk'); - - chalk.bgKeyword('orange'); - ``` - */ - bgKeyword(color: string): Chalk; - - /** - Use RGB values to set background color. - */ - bgRgb(red: number, green: number, blue: number): Chalk; - - /** - Use HSL values to set background color. - */ - bgHsl(hue: number, saturation: number, lightness: number): Chalk; - - /** - Use HSV values to set background color. - */ - bgHsv(hue: number, saturation: number, value: number): Chalk; - - /** - Use HWB values to set background color. - */ - bgHwb(hue: number, whiteness: number, blackness: number): Chalk; - - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. - - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - Use the foreground code, not the background code (for example, not 41, nor 101). - */ - bgAnsi(code: number): Chalk; - - /** - Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. - */ - bgAnsi256(index: number): Chalk; - - /** - Modifier: Resets the current color chain. - */ - readonly reset: Chalk; - - /** - Modifier: Make text bold. - */ - readonly bold: Chalk; - - /** - Modifier: Emitting only a small amount of light. - */ - readonly dim: Chalk; - - /** - Modifier: Make text italic. (Not widely supported) - */ - readonly italic: Chalk; - - /** - Modifier: Make text underline. (Not widely supported) - */ - readonly underline: Chalk; - - /** - Modifier: Inverse background and foreground colors. - */ - readonly inverse: Chalk; - - /** - Modifier: Prints the text, but makes it invisible. - */ - readonly hidden: Chalk; - - /** - Modifier: Puts a horizontal line through the center of the text. (Not widely supported) - */ - readonly strikethrough: Chalk; - - /** - Modifier: Prints the text only when Chalk has a color support level > 0. - Can be useful for things that are purely cosmetic. - */ - readonly visible: Chalk; - - readonly black: Chalk; - readonly red: Chalk; - readonly green: Chalk; - readonly yellow: Chalk; - readonly blue: Chalk; - readonly magenta: Chalk; - readonly cyan: Chalk; - readonly white: Chalk; - - /* - Alias for `blackBright`. - */ - readonly gray: Chalk; - - /* - Alias for `blackBright`. - */ - readonly grey: Chalk; - - readonly blackBright: Chalk; - readonly redBright: Chalk; - readonly greenBright: Chalk; - readonly yellowBright: Chalk; - readonly blueBright: Chalk; - readonly magentaBright: Chalk; - readonly cyanBright: Chalk; - readonly whiteBright: Chalk; - - readonly bgBlack: Chalk; - readonly bgRed: Chalk; - readonly bgGreen: Chalk; - readonly bgYellow: Chalk; - readonly bgBlue: Chalk; - readonly bgMagenta: Chalk; - readonly bgCyan: Chalk; - readonly bgWhite: Chalk; - - /* - Alias for `bgBlackBright`. - */ - readonly bgGray: Chalk; - - /* - Alias for `bgBlackBright`. - */ - readonly bgGrey: Chalk; - - readonly bgBlackBright: Chalk; - readonly bgRedBright: Chalk; - readonly bgGreenBright: Chalk; - readonly bgYellowBright: Chalk; - readonly bgBlueBright: Chalk; - readonly bgMagentaBright: Chalk; - readonly bgCyanBright: Chalk; - readonly bgWhiteBright: Chalk; - } -} - -/** -Main Chalk object that allows to chain styles together. -Call the last one as a method with a string argument. -Order doesn't matter, and later styles take precedent in case of a conflict. -This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. -*/ -declare const chalk: chalk.Chalk & chalk.ChalkFunction & { - supportsColor: chalk.ColorSupport | false; - Level: chalk.Level; - Color: Color; - ForegroundColor: ForegroundColor; - BackgroundColor: BackgroundColor; - Modifiers: Modifiers; - stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false}; -}; - -export = chalk; diff --git a/node_modules/chalk/license b/node_modules/chalk/license deleted file mode 100644 index e7af2f77..00000000 --- a/node_modules/chalk/license +++ /dev/null @@ -1,9 +0,0 @@ -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/node_modules/has-flag/index.d.ts b/node_modules/chalk/node_modules/has-flag/index.d.ts deleted file mode 100644 index a0a48c89..00000000 --- a/node_modules/chalk/node_modules/has-flag/index.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** -Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag. - -@param flag - CLI flag to look for. The `--` prefix is optional. -@param argv - CLI arguments. Default: `process.argv`. -@returns Whether the flag exists. - -@example -``` -// $ ts-node foo.ts -f --unicorn --foo=bar -- --rainbow - -// foo.ts -import hasFlag = require('has-flag'); - -hasFlag('unicorn'); -//=> true - -hasFlag('--unicorn'); -//=> true - -hasFlag('f'); -//=> true - -hasFlag('-f'); -//=> true - -hasFlag('foo=bar'); -//=> true - -hasFlag('foo'); -//=> false - -hasFlag('rainbow'); -//=> false -``` -*/ -declare function hasFlag(flag: string, argv?: string[]): boolean; - -export = hasFlag; diff --git a/node_modules/chalk/node_modules/has-flag/index.js b/node_modules/chalk/node_modules/has-flag/index.js deleted file mode 100644 index b6f80b1f..00000000 --- a/node_modules/chalk/node_modules/has-flag/index.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports = (flag, argv = process.argv) => { - const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const position = argv.indexOf(prefix + flag); - const terminatorPosition = argv.indexOf('--'); - return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); -}; diff --git a/node_modules/chalk/node_modules/has-flag/license b/node_modules/chalk/node_modules/has-flag/license deleted file mode 100644 index e7af2f77..00000000 --- a/node_modules/chalk/node_modules/has-flag/license +++ /dev/null @@ -1,9 +0,0 @@ -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/node_modules/has-flag/package.json b/node_modules/chalk/node_modules/has-flag/package.json deleted file mode 100644 index a9cba4b8..00000000 --- a/node_modules/chalk/node_modules/has-flag/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "has-flag", - "version": "4.0.0", - "description": "Check if argv has a specific flag", - "license": "MIT", - "repository": "sindresorhus/has-flag", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "has", - "check", - "detect", - "contains", - "find", - "flag", - "cli", - "command-line", - "argv", - "process", - "arg", - "args", - "argument", - "arguments", - "getopt", - "minimist", - "optimist" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/node_modules/chalk/node_modules/has-flag/readme.md b/node_modules/chalk/node_modules/has-flag/readme.md deleted file mode 100644 index 3f72dff2..00000000 --- a/node_modules/chalk/node_modules/has-flag/readme.md +++ /dev/null @@ -1,89 +0,0 @@ -# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag) - -> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag - -Correctly stops looking after an `--` argument terminator. - ---- - -
- - 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 has-flag -``` - - -## Usage - -```js -// foo.js -const hasFlag = require('has-flag'); - -hasFlag('unicorn'); -//=> true - -hasFlag('--unicorn'); -//=> true - -hasFlag('f'); -//=> true - -hasFlag('-f'); -//=> true - -hasFlag('foo=bar'); -//=> true - -hasFlag('foo'); -//=> false - -hasFlag('rainbow'); -//=> false -``` - -``` -$ node foo.js -f --unicorn --foo=bar -- --rainbow -``` - - -## API - -### hasFlag(flag, [argv]) - -Returns a boolean for whether the flag exists. - -#### flag - -Type: `string` - -CLI flag to look for. The `--` prefix is optional. - -#### argv - -Type: `string[]`
-Default: `process.argv` - -CLI arguments. - - -## 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 © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/chalk/node_modules/supports-color/browser.js b/node_modules/chalk/node_modules/supports-color/browser.js deleted file mode 100644 index 62afa3a7..00000000 --- a/node_modules/chalk/node_modules/supports-color/browser.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -module.exports = { - stdout: false, - stderr: false -}; diff --git a/node_modules/chalk/node_modules/supports-color/index.js b/node_modules/chalk/node_modules/supports-color/index.js deleted file mode 100644 index 6fada390..00000000 --- a/node_modules/chalk/node_modules/supports-color/index.js +++ /dev/null @@ -1,135 +0,0 @@ -'use strict'; -const os = require('os'); -const tty = require('tty'); -const hasFlag = require('has-flag'); - -const {env} = process; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false') || - hasFlag('color=never')) { - forceColor = 0; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = 1; -} - -if ('FORCE_COLOR' in env) { - if (env.FORCE_COLOR === 'true') { - forceColor = 1; - } else if (env.FORCE_COLOR === 'false') { - forceColor = 0; - } else { - forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); - } -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(haveStream, streamIsTTY) { - if (forceColor === 0) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (haveStream && !streamIsTTY && forceColor === undefined) { - return 0; - } - - const min = forceColor || 0; - - if (env.TERM === 'dumb') { - return min; - } - - if (process.platform === 'win32') { - // 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(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', 'GITHUB_ACTIONS', 'BUILDKITE'].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; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream, stream && stream.isTTY); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: translateLevel(supportsColor(true, tty.isatty(1))), - stderr: translateLevel(supportsColor(true, tty.isatty(2))) -}; diff --git a/node_modules/chalk/node_modules/supports-color/license b/node_modules/chalk/node_modules/supports-color/license deleted file mode 100644 index e7af2f77..00000000 --- a/node_modules/chalk/node_modules/supports-color/license +++ /dev/null @@ -1,9 +0,0 @@ -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/node_modules/supports-color/package.json b/node_modules/chalk/node_modules/supports-color/package.json deleted file mode 100644 index f7182edc..00000000 --- a/node_modules/chalk/node_modules/supports-color/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "supports-color", - "version": "7.2.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": ">=8" - }, - "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": "^4.0.0" - }, - "devDependencies": { - "ava": "^1.4.1", - "import-fresh": "^3.0.0", - "xo": "^0.24.0" - }, - "browser": "browser.js" -} diff --git a/node_modules/chalk/node_modules/supports-color/readme.md b/node_modules/chalk/node_modules/supports-color/readme.md deleted file mode 100644 index 36542285..00000000 --- a/node_modules/chalk/node_modules/supports-color/readme.md +++ /dev/null @@ -1,76 +0,0 @@ -# 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. - -For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) 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-) - - ---- - -
- - 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. -
-
- ---- diff --git a/node_modules/chalk/package.json b/node_modules/chalk/package.json deleted file mode 100644 index 47c23f29..00000000 --- a/node_modules/chalk/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "chalk", - "version": "4.1.2", - "description": "Terminal string styling done right", - "license": "MIT", - "repository": "chalk/chalk", - "funding": "https://github.com/chalk/chalk?sponsor=1", - "main": "source", - "engines": { - "node": ">=10" - }, - "scripts": { - "test": "xo && nyc ava && tsd", - "bench": "matcha benchmark.js" - }, - "files": [ - "source", - "index.d.ts" - ], - "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": "^4.1.0", - "supports-color": "^7.1.0" - }, - "devDependencies": { - "ava": "^2.4.0", - "coveralls": "^3.0.7", - "execa": "^4.0.0", - "import-fresh": "^3.1.0", - "matcha": "^0.7.0", - "nyc": "^15.0.0", - "resolve-from": "^5.0.0", - "tsd": "^0.7.4", - "xo": "^0.28.2" - }, - "xo": { - "rules": { - "unicorn/prefer-string-slice": "off", - "unicorn/prefer-includes": "off", - "@typescript-eslint/member-ordering": "off", - "no-redeclare": "off", - "unicorn/string-content": "off", - "unicorn/better-regex": "off" - } - } -} diff --git a/node_modules/chalk/readme.md b/node_modules/chalk/readme.md deleted file mode 100644 index a055d21c..00000000 --- a/node_modules/chalk/readme.md +++ /dev/null @@ -1,341 +0,0 @@ -

-
-
- 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) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](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) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) - - - -
- ---- - - - ---- - -
- -## 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 ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020 - -## 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 deleted file mode 100644 index aaae4173..00000000 --- a/node_modules/psl/data/rules.json +++ /dev/null @@ -1,9376 +0,0 @@ -[ -"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", -"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", -"bet.ar", -"com.ar", -"coop.ar", -"edu.ar", -"gob.ar", -"gov.ar", -"int.ar", -"mil.ar", -"musica.ar", -"mutual.ar", -"net.ar", -"org.ar", -"senasa.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", -"sth.ac.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", -"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", -"app.br", -"arq.br", -"art.br", -"ato.br", -"b.br", -"barueri.br", -"belem.br", -"bhz.br", -"bib.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", -"coz.br", -"cri.br", -"cuiaba.br", -"curitiba.br", -"def.br", -"des.br", -"det.br", -"dev.br", -"ecn.br", -"eco.br", -"edu.br", -"emp.br", -"enf.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", -"geo.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", -"log.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", -"rep.br", -"ribeirao.br", -"rio.br", -"riobranco.br", -"riopreto.br", -"salvador.br", -"sampa.br", -"santamaria.br", -"santoandre.br", -"saobernardo.br", -"saogonca.br", -"seg.br", -"sjc.br", -"slg.br", -"slz.br", -"sorocaba.br", -"srv.br", -"taxi.br", -"tc.br", -"tec.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", -"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", -"com.cv", -"edu.cv", -"int.cv", -"nome.cv", -"org.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", -"mil.cy", -"net.cy", -"org.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", -"art.dz", -"asso.dz", -"com.dz", -"edu.dz", -"gov.dz", -"org.dz", -"net.dz", -"pol.dz", -"soc.dz", -"tm.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", -"com.fm", -"edu.fm", -"net.fm", -"org.fm", -"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", -"edu.gd", -"gov.gd", -"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", -"com.ky", -"edu.ky", -"net.ky", -"org.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", -"biz.my", -"com.my", -"edu.my", -"gov.my", -"mil.my", -"name.my", -"net.my", -"org.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", -"me.ss", -"net.ss", -"org.ss", -"sch.ss", -"st", -"co.st", -"com.st", -"consulado.st", -"edu.st", -"embaixada.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", -"info.tn", -"intl.tn", -"mincom.tn", -"nat.tn", -"net.tn", -"org.tn", -"perso.tn", -"tourism.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", -"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.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", -"bib.ve", -"co.ve", -"com.ve", -"e12.ve", -"edu.ve", -"firm.ve", -"gob.ve", -"gov.ve", -"info.ve", -"int.ve", -"mil.ve", -"net.ve", -"nom.ve", -"org.ve", -"rar.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", -"com.ye", -"edu.ye", -"gov.ye", -"net.ye", -"mil.ye", -"org.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", -"afl", -"africa", -"agakhan", -"agency", -"aig", -"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", -"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", -"cash", -"casino", -"catering", -"catholic", -"cba", -"cbn", -"cbre", -"cbs", -"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", -"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", -"dunlop", -"dupont", -"durban", -"dvag", -"dvr", -"earth", -"eat", -"eco", -"edeka", -"education", -"email", -"emerck", -"energy", -"engineer", -"engineering", -"enterprises", -"epson", -"equipment", -"ericsson", -"erni", -"esq", -"estate", -"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", -"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", -"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", -"international", -"intuit", -"investments", -"ipiranga", -"irish", -"ismaili", -"ist", -"istanbul", -"itau", -"itv", -"jaguar", -"java", -"jcb", -"jeep", -"jetzt", -"jewelry", -"jio", -"jll", -"jmp", -"jnj", -"joburg", -"jot", -"joy", -"jpmorgan", -"jprs", -"juegos", -"juniper", -"kaufen", -"kddi", -"kerryhotels", -"kerrylogistics", -"kerryproperties", -"kfh", -"kia", -"kids", -"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", -"llc", -"llp", -"loan", -"loans", -"locker", -"locus", -"loft", -"lol", -"london", -"lotte", -"lotto", -"love", -"lpl", -"lplfinancial", -"ltd", -"ltda", -"lundbeck", -"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", -"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", -"music", -"mutual", -"nab", -"nagoya", -"natura", -"navy", -"nba", -"nec", -"netbank", -"netflix", -"network", -"neustar", -"new", -"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", -"office", -"okinawa", -"olayan", -"olayangroup", -"oldnavy", -"ollo", -"omega", -"one", -"ong", -"onl", -"online", -"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", -"racing", -"radio", -"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", -"ril", -"rio", -"rip", -"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", -"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", -"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", -"srl", -"stada", -"staples", -"star", -"statebank", -"statefarm", -"stc", -"stcgroup", -"stockholm", -"storage", -"store", -"stream", -"studio", -"study", -"style", -"sucks", -"supplies", -"supply", -"support", -"surf", -"surgery", -"suzuki", -"swatch", -"swiss", -"sydney", -"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", -"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", -"611.to", -"graphox.us", -"*.devcdnaccesso.com", -"adobeaemcloud.com", -"*.dev.adobeaemcloud.com", -"hlx.live", -"adobeaemcloud.net", -"hlx.page", -"hlx3.page", -"beep.pl", -"airkitapps.com", -"airkitapps-au.com", -"airkitapps.eu", -"aivencloud.com", -"barsy.ca", -"*.compute.estate", -"*.alces.network", -"kasserver.com", -"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", -"awsglobalaccelerator.com", -"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", -"t3l3p0rt.net", -"tele.amune.org", -"apigee.io", -"siiites.com", -"appspacehosted.com", -"appspaceusercontent.com", -"appudo.net", -"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", -"cdn.prod.atlassian-dev.net", -"translated.page", -"myfritz.net", -"onavstack.net", -"*.awdev.ca", -"*.advisor.ws", -"ecommerce-shop.pl", -"b-data.io", -"backplaneapp.io", -"balena-devices.com", -"rs.ba", -"*.banzai.cloud", -"app.banzaicloud.io", -"*.backyards.banzaicloud.io", -"base.ec", -"official.ec", -"buyshop.jp", -"fashionstore.jp", -"handcrafted.jp", -"kawaiishop.jp", -"supersale.jp", -"theshop.jp", -"shopselect.net", -"base.shop", -"*.beget.app", -"betainabox.com", -"bnr.la", -"bitbucket.io", -"blackbaudcdn.net", -"of.je", -"bluebite.io", -"boomla.net", -"boutir.com", -"boxfuse.io", -"square7.ch", -"bplaced.com", -"bplaced.de", -"square7.de", -"bplaced.net", -"square7.net", -"shop.brendly.rs", -"browsersafetymark.io", -"uk0.bigv.io", -"dh.bytemark.co.uk", -"vm.bytemark.co.uk", -"cafjs.com", -"mycd.eu", -"drr.ac", -"uwu.ai", -"carrd.co", -"crd.co", -"ju.mp", -"ae.org", -"br.com", -"cn.com", -"com.de", -"com.se", -"de.com", -"eu.com", -"gb.net", -"hu.net", -"jp.net", -"jpn.com", -"mex.com", -"ru.com", -"sa.com", -"se.net", -"uk.com", -"uk.net", -"us.com", -"za.bz", -"za.com", -"ar.com", -"hu.com", -"kr.com", -"no.com", -"qc.com", -"uy.com", -"africa.com", -"gr.com", -"in.net", -"web.in", -"us.org", -"co.com", -"aus.basketball", -"nz.basketball", -"radio.am", -"radio.fm", -"c.la", -"certmgr.org", -"cx.ua", -"discourse.group", -"discourse.team", -"cleverapps.io", -"clerk.app", -"clerkstage.app", -"*.lcl.dev", -"*.lclstage.dev", -"*.stg.dev", -"*.stgstage.dev", -"clickrising.net", -"c66.me", -"cloud66.ws", -"cloud66.zone", -"jdevcloud.com", -"wpdevcloud.com", -"cloudaccess.host", -"freesite.host", -"cloudaccess.net", -"cloudcontrolled.com", -"cloudcontrolapp.com", -"*.cloudera.site", -"pages.dev", -"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", -"cnpy.gdn", -"codeberg.page", -"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", -"curv.dev", -"*.customer-oci.com", -"*.oci.customer-oci.com", -"*.ocp.customer-oci.com", -"*.ocs.customer-oci.com", -"cyon.link", -"cyon.site", -"fnwk.site", -"folionetwork.site", -"platform0.app", -"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", -"dyndns.dappnode.io", -"*.dapps.earth", -"*.bzz.dapps.earth", -"builtwithdark.com", -"demo.datadetect.com", -"instance.datadetect.com", -"edgestack.me", -"ddns5.com", -"debian.net", -"deno.dev", -"deno-staging.dev", -"dedyn.io", -"deta.app", -"deta.dev", -"*.rss.my.id", -"*.diher.solutions", -"discordsays.com", -"discordsez.com", -"jozi.biz", -"dnshome.de", -"online.th", -"shop.th", -"drayddns.com", -"shoparena.pl", -"dreamhosters.com", -"mydrobo.com", -"drud.io", -"drud.us", -"duckdns.org", -"bip.sh", -"bitbridge.net", -"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", -"ondigitalocean.app", -"*.digitaloceanspaces.com", -"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", -"eero.online", -"eero-stage.online", -"elementor.cloud", -"elementor.cool", -"en-root.fr", -"mytuleap.com", -"tuleap-partners.com", -"encr.app", -"encoreapi.com", -"onred.one", -"staging.onred.one", -"eu.encoway.cloud", -"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", -"eurodir.ru", -"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", -"onfabrica.com", -"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", -"edgecompute.app", -"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", -"fastvps-server.com", -"fastvps.host", -"myfast.host", -"fastvps.site", -"myfast.space", -"fedorainfracloud.org", -"fedorapeople.org", -"cloud.fedoraproject.org", -"app.os.fedoraproject.org", -"app.os.stg.fedoraproject.org", -"conn.uk", -"copro.uk", -"hosp.uk", -"mydobiss.com", -"fh-muenster.io", -"filegear.me", -"filegear-au.me", -"filegear-de.me", -"filegear-gb.me", -"filegear-ie.me", -"filegear-jp.me", -"filegear-sg.me", -"firebaseapp.com", -"fireweb.app", -"flap.id", -"onflashdrive.app", -"fldrv.com", -"fly.dev", -"edgeapp.net", -"shw.io", -"flynnhosting.net", -"forgeblocks.com", -"id.forgerock.io", -"framer.app", -"framercanvas.com", -"*.frusky.de", -"ravpage.co.il", -"0e.vc", -"freebox-os.com", -"freeboxos.com", -"fbx-os.fr", -"fbxos.fr", -"freebox-os.fr", -"freeboxos.fr", -"freedesktop.org", -"freemyip.com", -"wien.funkfeuer.at", -"*.futurecms.at", -"*.ex.futurecms.at", -"*.in.futurecms.at", -"futurehosting.at", -"futuremailing.at", -"*.ex.ortsinfo.at", -"*.kunden.ortsinfo.at", -"*.statics.cloud", -"independent-commission.uk", -"independent-inquest.uk", -"independent-inquiry.uk", -"independent-panel.uk", -"independent-review.uk", -"public-inquiry.uk", -"royal-commission.uk", -"campaign.gov.uk", -"service.gov.uk", -"api.gov.uk", -"gehirn.ne.jp", -"usercontent.jp", -"gentapps.com", -"gentlentapis.com", -"lab.ms", -"cdn-edges.net", -"ghost.io", -"gsj.bz", -"githubusercontent.com", -"githubpreview.dev", -"github.io", -"gitlab.io", -"gitapp.si", -"gitpage.si", -"glitch.me", -"nog.community", -"co.ro", -"shop.ro", -"lolipop.io", -"angry.jp", -"babyblue.jp", -"babymilk.jp", -"backdrop.jp", -"bambina.jp", -"bitter.jp", -"blush.jp", -"boo.jp", -"boy.jp", -"boyfriend.jp", -"but.jp", -"candypop.jp", -"capoo.jp", -"catfood.jp", -"cheap.jp", -"chicappa.jp", -"chillout.jp", -"chips.jp", -"chowder.jp", -"chu.jp", -"ciao.jp", -"cocotte.jp", -"coolblog.jp", -"cranky.jp", -"cutegirl.jp", -"daa.jp", -"deca.jp", -"deci.jp", -"digick.jp", -"egoism.jp", -"fakefur.jp", -"fem.jp", -"flier.jp", -"floppy.jp", -"fool.jp", -"frenchkiss.jp", -"girlfriend.jp", -"girly.jp", -"gloomy.jp", -"gonna.jp", -"greater.jp", -"hacca.jp", -"heavy.jp", -"her.jp", -"hiho.jp", -"hippy.jp", -"holy.jp", -"hungry.jp", -"icurus.jp", -"itigo.jp", -"jellybean.jp", -"kikirara.jp", -"kill.jp", -"kilo.jp", -"kuron.jp", -"littlestar.jp", -"lolipopmc.jp", -"lolitapunk.jp", -"lomo.jp", -"lovepop.jp", -"lovesick.jp", -"main.jp", -"mods.jp", -"mond.jp", -"mongolian.jp", -"moo.jp", -"namaste.jp", -"nikita.jp", -"nobushi.jp", -"noor.jp", -"oops.jp", -"parallel.jp", -"parasite.jp", -"pecori.jp", -"peewee.jp", -"penne.jp", -"pepper.jp", -"perma.jp", -"pigboat.jp", -"pinoko.jp", -"punyu.jp", -"pupu.jp", -"pussycat.jp", -"pya.jp", -"raindrop.jp", -"readymade.jp", -"sadist.jp", -"schoolbus.jp", -"secret.jp", -"staba.jp", -"stripper.jp", -"sub.jp", -"sunnyday.jp", -"thick.jp", -"tonkotsu.jp", -"under.jp", -"upper.jp", -"velvet.jp", -"verse.jp", -"versus.jp", -"vivian.jp", -"watson.jp", -"weblike.jp", -"whitesnow.jp", -"zombie.jp", -"heteml.net", -"cloudapps.digital", -"london.cloudapps.digital", -"pymnt.uk", -"homeoffice.gov.uk", -"ro.im", -"goip.de", -"run.app", -"a.run.app", -"web.app", -"*.0emm.com", -"appspot.com", -"*.r.appspot.com", -"codespot.com", -"googleapis.com", -"googlecode.com", -"pagespeedmobilizer.com", -"publishproxy.com", -"withgoogle.com", -"withyoutube.com", -"*.gateway.dev", -"cloud.goog", -"translate.goog", -"*.usercontent.goog", -"cloudfunctions.net", -"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", -"goupile.fr", -"gov.nl", -"awsmppl.com", -"günstigbestellen.de", -"günstigliefern.de", -"fin.ci", -"free.hr", -"caa.li", -"ua.rs", -"conf.se", -"hs.zone", -"hs.run", -"hashbang.sh", -"hasura.app", -"hasura-app.io", -"pages.it.hs-heilbronn.de", -"hepforge.org", -"herokuapp.com", -"herokussl.com", -"ravendb.cloud", -"myravendb.com", -"ravendb.community", -"ravendb.me", -"development.run", -"ravendb.run", -"homesklep.pl", -"secaas.hk", -"hoplix.shop", -"orx.biz", -"biz.gl", -"col.ng", -"firm.ng", -"gen.ng", -"ltd.ng", -"ngo.ng", -"edu.scot", -"sch.so", -"hostyhosting.io", -"häkkinen.fi", -"*.moonscale.io", -"moonscale.net", -"iki.fi", -"ibxos.it", -"iliadboxos.it", -"impertrixcdn.com", -"impertrix.com", -"smushcdn.com", -"wphostedmail.com", -"wpmucdn.com", -"tempurl.host", -"wpmudev.host", -"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", -"na4u.ru", -"iopsys.se", -"ipifony.net", -"iservschule.de", -"mein-iserv.de", -"schulplattform.de", -"schulserver.de", -"test-iserv.de", -"iserv.dev", -"iobb.net", -"mel.cloudlets.com.au", -"cloud.interhostsolutions.be", -"users.scale.virtualcloud.com.br", -"mycloud.by", -"alp1.ae.flow.ch", -"appengine.flow.ch", -"es-1.axarnet.cloud", -"diadem.cloud", -"vip.jelastic.cloud", -"jele.cloud", -"it1.eur.aruba.jenv-aruba.cloud", -"it1.jenv-aruba.cloud", -"keliweb.cloud", -"cs.keliweb.cloud", -"oxa.cloud", -"tn.oxa.cloud", -"uk.oxa.cloud", -"primetel.cloud", -"uk.primetel.cloud", -"ca.reclaim.cloud", -"uk.reclaim.cloud", -"us.reclaim.cloud", -"ch.trendhosting.cloud", -"de.trendhosting.cloud", -"jele.club", -"amscompute.com", -"clicketcloud.com", -"dopaas.com", -"hidora.com", -"paas.hosted-by-previder.com", -"rag-cloud.hosteur.com", -"rag-cloud-ch.hosteur.com", -"jcloud.ik-server.com", -"jcloud-ver-jpc.ik-server.com", -"demo.jelastic.com", -"kilatiron.com", -"paas.massivegrid.com", -"jed.wafaicloud.com", -"lon.wafaicloud.com", -"ryd.wafaicloud.com", -"j.scaleforce.com.cy", -"jelastic.dogado.eu", -"fi.cloudplatform.fi", -"demo.datacenter.fi", -"paas.datacenter.fi", -"jele.host", -"mircloud.host", -"paas.beebyte.io", -"sekd1.beebyteapp.io", -"jele.io", -"cloud-fr1.unispace.io", -"jc.neen.it", -"cloud.jelastic.open.tim.it", -"jcloud.kz", -"upaas.kazteleport.kz", -"cloudjiffy.net", -"fra1-de.cloudjiffy.net", -"west1-us.cloudjiffy.net", -"jls-sto1.elastx.net", -"jls-sto2.elastx.net", -"jls-sto3.elastx.net", -"faststacks.net", -"fr-1.paas.massivegrid.net", -"lon-1.paas.massivegrid.net", -"lon-2.paas.massivegrid.net", -"ny-1.paas.massivegrid.net", -"ny-2.paas.massivegrid.net", -"sg-1.paas.massivegrid.net", -"jelastic.saveincloud.net", -"nordeste-idc.saveincloud.net", -"j.scaleforce.net", -"jelastic.tsukaeru.net", -"sdscloud.pl", -"unicloud.pl", -"mircloud.ru", -"jelastic.regruhosting.ru", -"enscaled.sg", -"jele.site", -"jelastic.team", -"orangecloud.tn", -"j.layershift.co.uk", -"phx.enscaled.us", -"mircloud.us", -"myjino.ru", -"*.hosting.myjino.ru", -"*.landing.myjino.ru", -"*.spectrum.myjino.ru", -"*.vps.myjino.ru", -"jotelulu.cloud", -"*.triton.zone", -"*.cns.joyent.com", -"js.org", -"kaas.gg", -"khplay.nl", -"ktistory.com", -"kapsi.fi", -"keymachine.de", -"kinghost.net", -"uni5.net", -"knightpoint.systems", -"koobin.events", -"oya.to", -"kuleuven.cloud", -"ezproxy.kuleuven.be", -"co.krd", -"edu.krd", -"krellian.net", -"webthings.io", -"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", -"linkyard.cloud", -"linkyard-cloud.ch", -"members.linode.com", -"*.nodebalancer.linode.com", -"*.linodeobjects.com", -"ip.linodeusercontent.com", -"we.bs", -"*.user.localcert.dev", -"localzone.xyz", -"loginline.app", -"loginline.dev", -"loginline.io", -"loginline.services", -"loginline.site", -"servers.run", -"lohmus.me", -"krasnik.pl", -"leczna.pl", -"lubartow.pl", -"lublin.pl", -"poniatowa.pl", -"swidnik.pl", -"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.ro", -"barsy.shop", -"barsy.site", -"barsy.support", -"barsy.uk", -"*.magentosite.cloud", -"mayfirst.info", -"mayfirst.org", -"hb.cldmail.ru", -"cn.vu", -"mazeplay.com", -"mcpe.me", -"mcdir.me", -"mcdir.ru", -"mcpre.ru", -"vps.mcdir.ru", -"mediatech.by", -"mediatech.dev", -"hra.health", -"miniserver.com", -"memset.net", -"messerli.app", -"*.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", -"azurestaticapps.net", -"1.azurestaticapps.net", -"centralus.azurestaticapps.net", -"eastasia.azurestaticapps.net", -"eastus2.azurestaticapps.net", -"westeurope.azurestaticapps.net", -"westus2.azurestaticapps.net", -"csx.cc", -"mintere.site", -"forte.id", -"mozilla-iot.org", -"bmoattachments.org", -"net.ru", -"org.ru", -"pp.ru", -"hostedpi.com", -"customer.mythic-beasts.com", -"caracal.mythic-beasts.com", -"fentiger.mythic-beasts.com", -"lynx.mythic-beasts.com", -"ocelot.mythic-beasts.com", -"oncilla.mythic-beasts.com", -"onza.mythic-beasts.com", -"sphinx.mythic-beasts.com", -"vs.mythic-beasts.com", -"x.mythic-beasts.com", -"yali.mythic-beasts.com", -"cust.retrosnub.co.uk", -"ui.nabu.casa", -"pony.club", -"of.fashion", -"in.london", -"of.london", -"from.marketing", -"with.marketing", -"for.men", -"repair.men", -"and.mom", -"for.mom", -"for.one", -"under.one", -"for.sale", -"that.win", -"from.work", -"to.work", -"cloud.nospamproxy.com", -"netlify.app", -"4u.com", -"ngrok.io", -"nh-serv.co.uk", -"nfshost.com", -"*.developer.app", -"noop.app", -"*.northflank.app", -"*.build.run", -"*.code.run", -"*.database.run", -"*.migration.run", -"noticeable.news", -"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", -"pcloud.host", -"nyc.mn", -"static.observableusercontent.com", -"cya.gg", -"omg.lol", -"cloudycluster.net", -"omniwe.site", -"service.one", -"nid.io", -"opensocial.site", -"opencraft.hosting", -"orsites.com", -"operaunite.com", -"tech.orange", -"authgear-staging.com", -"authgearapps.com", -"skygearapp.com", -"outsystemscloud.com", -"*.webpaas.ovh.net", -"*.hosting.ovh.net", -"ownprovider.com", -"own.pm", -"*.owo.codes", -"ox.rs", -"oy.lc", -"pgfog.com", -"pagefrontapp.com", -"pagexl.com", -"*.paywhirl.com", -"bar0.net", -"bar1.net", -"bar2.net", -"rdv.to", -"art.pl", -"gliwice.pl", -"krakow.pl", -"poznan.pl", -"wroc.pl", -"zakopane.pl", -"pantheonsite.io", -"gotpantheon.com", -"mypep.link", -"perspecta.cloud", -"lk3.ru", -"on-web.fr", -"bc.platform.sh", -"ent.platform.sh", -"eu.platform.sh", -"us.platform.sh", -"*.platformsh.site", -"*.tst.site", -"platter-app.com", -"platter-app.dev", -"platterp.us", -"pdns.page", -"plesk.page", -"pleskns.com", -"dyn53.io", -"onporter.run", -"co.bn", -"postman-echo.com", -"pstmn.io", -"mock.pstmn.io", -"httpbin.org", -"prequalifyme.today", -"xen.prgmr.com", -"priv.at", -"prvcy.page", -"*.dweb.link", -"protonet.io", -"chirurgiens-dentistes-en-france.fr", -"byen.site", -"pubtls.org", -"pythonanywhere.com", -"eu.pythonanywhere.com", -"qoto.io", -"qualifioapp.com", -"qbuser.com", -"cloudsite.builders", -"instances.spawn.cc", -"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", -"g.vbrplsbx.io", -"*.on-k3s.io", -"*.on-rancher.cloud", -"*.on-rio.io", -"readthedocs.io", -"rhcloud.com", -"app.render.com", -"onrender.com", -"repl.co", -"id.repl.co", -"repl.run", -"resindevice.io", -"devices.resinstaging.io", -"hzc.io", -"wellbeingzone.eu", -"wellbeingzone.co.uk", -"adimo.co.uk", -"itcouldbewor.se", -"git-pages.rit.edu", -"rocky.page", -"биз.рус", -"ком.рус", -"крым.рус", -"мир.рус", -"мск.рус", -"орг.рус", -"самара.рус", -"сочи.рус", -"спб.рус", -"я.рус", -"*.builder.code.com", -"*.dev-builder.code.com", -"*.stg-builder.code.com", -"sandcats.io", -"logoip.de", -"logoip.com", -"fr-par-1.baremetal.scw.cloud", -"fr-par-2.baremetal.scw.cloud", -"nl-ams-1.baremetal.scw.cloud", -"fnc.fr-par.scw.cloud", -"functions.fnc.fr-par.scw.cloud", -"k8s.fr-par.scw.cloud", -"nodes.k8s.fr-par.scw.cloud", -"s3.fr-par.scw.cloud", -"s3-website.fr-par.scw.cloud", -"whm.fr-par.scw.cloud", -"priv.instances.scw.cloud", -"pub.instances.scw.cloud", -"k8s.scw.cloud", -"k8s.nl-ams.scw.cloud", -"nodes.k8s.nl-ams.scw.cloud", -"s3.nl-ams.scw.cloud", -"s3-website.nl-ams.scw.cloud", -"whm.nl-ams.scw.cloud", -"k8s.pl-waw.scw.cloud", -"nodes.k8s.pl-waw.scw.cloud", -"s3.pl-waw.scw.cloud", -"s3-website.pl-waw.scw.cloud", -"scalebook.scw.cloud", -"smartlabeling.scw.cloud", -"dedibox.fr", -"schokokeks.net", -"gov.scot", -"service.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", -"seidat.net", -"sellfy.store", -"senseering.net", -"minisite.ms", -"magnet.page", -"biz.ua", -"co.ua", -"pp.ua", -"shiftcrypto.dev", -"shiftcrypto.io", -"shiftedit.io", -"myshopblocks.com", -"myshopify.com", -"shopitsite.com", -"shopware.store", -"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", -"small-web.org", -"vp4.me", -"try-snowplow.com", -"srht.site", -"stackhero-network.com", -"musician.io", -"novecore.site", -"static.land", -"dev.static.land", -"sites.static.land", -"storebase.store", -"vps-host.net", -"atl.jelastic.vps-host.net", -"njs.jelastic.vps-host.net", -"ric.jelastic.vps-host.net", -"playstation-cloud.com", -"apps.lair.io", -"*.stolos.io", -"spacekit.io", -"customer.speedpartner.de", -"myspreadshop.at", -"myspreadshop.com.au", -"myspreadshop.be", -"myspreadshop.ca", -"myspreadshop.ch", -"myspreadshop.com", -"myspreadshop.de", -"myspreadshop.dk", -"myspreadshop.es", -"myspreadshop.fi", -"myspreadshop.fr", -"myspreadshop.ie", -"myspreadshop.it", -"myspreadshop.net", -"myspreadshop.nl", -"myspreadshop.no", -"myspreadshop.pl", -"myspreadshop.se", -"myspreadshop.co.uk", -"api.stdlib.com", -"storj.farm", -"utwente.io", -"soc.srcf.net", -"user.srcf.net", -"temp-dns.com", -"supabase.co", -"supabase.in", -"supabase.net", -"su.paba.se", -"*.s5y.io", -"*.sensiosite.cloud", -"syncloud.it", -"dscloud.biz", -"direct.quickconnect.cn", -"dsmynas.com", -"familyds.com", -"diskstation.me", -"dscloud.me", -"i234.me", -"myds.me", -"synology.me", -"dscloud.mobi", -"dsmynas.net", -"familyds.net", -"dsmynas.org", -"familyds.org", -"vpnplus.to", -"direct.quickconnect.to", -"tabitorder.co.il", -"taifun-dns.de", -"beta.tailscale.net", -"ts.net", -"gda.pl", -"gdansk.pl", -"gdynia.pl", -"med.pl", -"sopot.pl", -"site.tb-hosting.com", -"edugit.io", -"s3.teckids.org", -"telebit.app", -"telebit.io", -"*.telebit.xyz", -"gwiddle.co.uk", -"*.firenet.ch", -"*.svc.firenet.ch", -"reservd.com", -"thingdustdata.com", -"cust.dev.thingdust.io", -"cust.disrec.thingdust.io", -"cust.prod.thingdust.io", -"cust.testing.thingdust.io", -"reservd.dev.thingdust.io", -"reservd.disrec.thingdust.io", -"reservd.testing.thingdust.io", -"tickets.io", -"arvo.network", -"azimuth.network", -"tlon.network", -"torproject.net", -"pages.torproject.net", -"bloxcms.com", -"townnews-staging.com", -"tbits.me", -"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", -"site.transip.me", -"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", -"typedream.app", -"pro.typeform.com", -"uber.space", -"*.uberspace.de", -"hk.com", -"hk.org", -"ltd.hk", -"inc.hk", -"name.pm", -"sch.tf", -"biz.wf", -"sch.wf", -"org.yt", -"virtualuser.de", -"virtual-user.de", -"upli.io", -"urown.cloud", -"dnsupdate.info", -"lib.de.us", -"2038.io", -"vercel.app", -"vercel.dev", -"now.sh", -"router.management", -"v-info.info", -"voorloper.cloud", -"neko.am", -"nyaa.am", -"be.ax", -"cat.ax", -"es.ax", -"eu.ax", -"gg.ax", -"mc.ax", -"us.ax", -"xy.ax", -"nl.ci", -"xx.gl", -"app.gp", -"blog.gt", -"de.gt", -"to.gt", -"be.gy", -"cc.hn", -"blog.kg", -"io.kg", -"jp.kg", -"tv.kg", -"uk.kg", -"us.kg", -"de.ls", -"at.md", -"de.md", -"jp.md", -"to.md", -"indie.porn", -"vxl.sh", -"ch.tc", -"me.tc", -"we.tc", -"nyan.to", -"at.vg", -"blog.vu", -"dev.vu", -"me.vu", -"v.ua", -"*.vultrobjects.com", -"wafflecell.com", -"*.webhare.dev", -"reserve-online.net", -"reserve-online.com", -"bookonline.app", -"hotelwithflight.com", -"wedeploy.io", -"wedeploy.me", -"wedeploy.sh", -"remotewd.com", -"pages.wiardweb.com", -"wmflabs.org", -"toolforge.org", -"wmcloud.org", -"panel.gg", -"daemon.panel.gg", -"messwithdns.com", -"woltlab-demo.com", -"myforum.community", -"community-pro.de", -"diskussionsbereich.de", -"community-pro.net", -"meinforum.net", -"affinitylottery.org.uk", -"raffleentry.org.uk", -"weeklylottery.org.uk", -"wpenginepowered.com", -"js.wpenginepowered.com", -"wixsite.com", -"editorx.io", -"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", -"ynh.fr", -"nohost.me", -"noho.st", -"za.net", -"za.org", -"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 deleted file mode 100644 index 2e967dfe..00000000 --- a/node_modules/psl/dist/psl.js +++ /dev/null @@ -1,10187 +0,0 @@ -(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){(function (){ -/*! 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)}).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 deleted file mode 100644 index cbcd8eb3..00000000 --- a/node_modules/psl/dist/psl.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define([],a):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}(function(){return function e(s,n,t){function m(o,a){if(!n[o]){if(!s[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(u)return u(o,!0);throw(a=new Error("Cannot find module '"+o+"'")).code="MODULE_NOT_FOUND",a}i=n[o]={exports:{}},s[o][0].call(i.exports,function(a){return m(s[o][1][a]||a)},i,i.exports,e,s,n,t)}return n[o].exports}for(var u="function"==typeof require&&require,a=0;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},l=j-1,y=Math.floor,f=String.fromCharCode;function v(a){throw new RangeError(c[a])}function k(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="",i=(1>>10&1023|55296),a=56320|1023&a),o+=f(a)}).join("")}function z(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function x(a,o,i){var e=0;for(a=i?y(a/m):a>>1,a+=y(a/o);l*b>>1y((d-p)/n))&&v("overflow"),p+=m*n,!(m<(m=t<=l?1:l+b<=t?b:t-l));t+=j)n>y(d/(m=j-m))&&v("overflow"),n*=m;l=x(p-s,o=u.length+1,0==s),y(p/o)>d-c&&v("overflow"),c+=y(p/o),p%=o,u.splice(p++,0,c)}return h(u)}function A(a){for(var o,i,e,s,n,t,m,u,r,p,c=[],l=(a=w(a)).length,k=128,g=72,h=o=0;hy((d-o)/(u=i+1))&&v("overflow"),o+=(s-k)*u,k=s,h=0;hd&&v("overflow"),m==k){for(n=o,t=j;!(n<(r=t<=g?1:g+b<=t?b:t-g));t+=j)c.push(f(z(r+(p=n-r)%(r=j-r),0))),n=y(p/r);c.push(f(z(n,0))),g=x(o,u,i==e),o=0,++i}++o,++k}return c.join("")}if(s={version:"1.4.1",ucs2:{decode:w,encode:h},decode:q,encode:A,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+A(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?q(a.slice(4).toLowerCase()):a})}},o&&i)if(_.exports==o)i.exports=s;else for(n in s)s.hasOwnProperty(n)&&(o[n]=s[n]);else a.punycode=s}.call(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 deleted file mode 100644 index da7bc121..00000000 --- a/node_modules/psl/index.js +++ /dev/null @@ -1,269 +0,0 @@ -/*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 deleted file mode 100644 index baddd50b..00000000 --- a/node_modules/psl/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "psl", - "version": "1.9.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": { - "lint": "eslint .", - "test": "mocha test/*.spec.js", - "test:browserstack": "node test/browserstack.js", - "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": { - "browserify": "^17.0.0", - "browserslist-browserstack": "^3.1.1", - "browserstack-local": "^1.5.1", - "chai": "^4.3.6", - "commit-and-pr": "^1.0.4", - "eslint": "^8.19.0", - "JSONStream": "^1.3.5", - "mocha": "^7.2.0", - "porch": "^2.0.0", - "request": "^2.88.2", - "selenium-webdriver": "^4.3.0", - "serve-handler": "^6.1.3", - "uglify-js": "^3.16.2", - "watchify": "^4.0.0" - } -} diff --git a/node_modules/pstree.remy/.travis.yml b/node_modules/pstree.remy/.travis.yml deleted file mode 100644 index 5bf093ee..00000000 --- a/node_modules/pstree.remy/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -cache: - directories: - - ~/.npm -notifications: - email: false -node_js: - - '8' diff --git a/node_modules/pstree.remy/LICENSE b/node_modules/pstree.remy/LICENSE deleted file mode 100644 index e83bea65..00000000 --- a/node_modules/pstree.remy/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -The MIT License (MIT) -Copyright © 2019 Remy Sharp, https://remysharp.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/pstree.remy/README.md b/node_modules/pstree.remy/README.md deleted file mode 100644 index 5f44c629..00000000 --- a/node_modules/pstree.remy/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# pstree.remy - -> Cross platform ps-tree (including unix flavours without ps) - -## Installation - -```shel -npm install pstree.remy -``` - -## Usage - -```js -const psTree = psTree require('pstree.remy'); - -psTree(PID, (err, pids) => { - if (err) { - console.error(err); - } - console.log(pids) -}); - -console.log(psTree.hasPS - ? "This platform has the ps shell command" - : "This platform does not have the ps shell command"); -``` diff --git a/node_modules/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js deleted file mode 100644 index 743e9979..00000000 --- a/node_modules/pstree.remy/lib/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const exec = require('child_process').exec; -const tree = require('./tree'); -const utils = require('./utils'); -var hasPS = true; - -// discover if the OS has `ps`, and therefore can use psTree -exec('ps', (error) => { - module.exports.hasPS = hasPS = !error; -}); - -module.exports = function main(pid, callback) { - if (typeof pid === 'number') { - pid = pid.toString(); - } - - if (hasPS && !process.env.NO_PS) { - return tree(pid, callback); - } - - utils - .getStat() - .then(utils.tree) - .then((tree) => utils.pidsForTree(tree, pid)) - .then((res) => - callback( - null, - res.map((p) => p.PID) - ) - ) - .catch((error) => callback(error)); -}; - -if (!module.parent) { - module.exports(process.argv[2], (e, pids) => console.log(pids)); -} - -module.exports.hasPS = hasPS; diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js deleted file mode 100644 index bac7cce6..00000000 --- a/node_modules/pstree.remy/lib/tree.js +++ /dev/null @@ -1,37 +0,0 @@ -const spawn = require('child_process').spawn; - -module.exports = function (rootPid, callback) { - const pidsOfInterest = new Set([parseInt(rootPid, 10)]); - var output = ''; - - // *nix - const ps = spawn('ps', ['-A', '-o', 'ppid,pid']); - ps.stdout.on('data', (data) => { - output += data.toString('ascii'); - }); - - ps.on('close', () => { - try { - const res = output - .split('\n') - .slice(1) - .map((_) => _.trim()) - .reduce((acc, line) => { - const pids = line.split(/\s+/); - const ppid = parseInt(pids[0], 10); - - if (pidsOfInterest.has(ppid)) { - const pid = parseInt(pids[1], 10); - acc.push(pid); - pidsOfInterest.add(pid); - } - - return acc; - }, []); - - callback(null, res); - } catch (e) { - callback(e, null); - } - }); -}; diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js deleted file mode 100644 index 8fa5719e..00000000 --- a/node_modules/pstree.remy/lib/utils.js +++ /dev/null @@ -1,53 +0,0 @@ -const spawn = require('child_process').spawn; - -module.exports = { tree, pidsForTree, getStat }; - -function getStat() { - return new Promise((resolve) => { - const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`; - const spawned = spawn('sh', ['-c', command], { - stdio: ['pipe', 'pipe', 'pipe'], - }); - - var res = ''; - spawned.stdout.on('data', (data) => (res += data)); - spawned.on('close', () => resolve(res)); - }); -} - -function template(s) { - var stat = null; - // 'pid', 'comm', 'state', 'ppid', 'pgrp' - // %d (%s) %c %d %d - s.replace( - /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g, - (all, PID, COMMAND, STAT, PPID) => { - stat = { PID, COMMAND, PPID, STAT }; - } - ); - - return stat; -} - -function tree(stats) { - const processes = stats.split('\n').map(template).filter(Boolean); - - return processes; -} - -function pidsForTree(tree, pid) { - if (typeof pid === 'number') { - pid = pid.toString(); - } - const parents = [pid]; - const pids = []; - - tree.forEach((proc) => { - if (parents.indexOf(proc.PPID) !== -1) { - parents.push(proc.PID); - pids.push(proc); - } - }); - - return pids; -} diff --git a/node_modules/pstree.remy/package.json b/node_modules/pstree.remy/package.json deleted file mode 100644 index 35c70683..00000000 --- a/node_modules/pstree.remy/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "pstree.remy", - "version": "1.1.8", - "main": "lib/index.js", - "prettier": { - "trailingComma": "es5", - "semi": true, - "singleQuote": true - }, - "scripts": { - "test": "tap tests/*.test.js", - "_prepublish": "npm test" - }, - "keywords": [ - "ps", - "pstree", - "ps tree" - ], - "author": "Remy Sharp", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/remy/pstree.git" - }, - "devDependencies": { - "tap": "^11.0.0" - }, - "directories": { - "test": "tests" - }, - "dependencies": {}, - "description": "Collects the full tree of processes from /proc" -} diff --git a/node_modules/pstree.remy/tests/fixtures/index.js b/node_modules/pstree.remy/tests/fixtures/index.js deleted file mode 100644 index 4cdbcb1b..00000000 --- a/node_modules/pstree.remy/tests/fixtures/index.js +++ /dev/null @@ -1,13 +0,0 @@ -const spawn = require('child_process').spawn; -function run() { - spawn( - 'sh', - ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'], - { - stdio: 'pipe', - } - ); -} - -var runCallCount = process.argv[2] || 1; -for (var i = 0; i < runCallCount; i++) run(); diff --git a/node_modules/pstree.remy/tests/fixtures/out1 b/node_modules/pstree.remy/tests/fixtures/out1 deleted file mode 100644 index abfe5810..00000000 --- a/node_modules/pstree.remy/tests/fixtures/out1 +++ /dev/null @@ -1,10 +0,0 @@ -1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0 -15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0 -16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0 -27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0 -28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0 -39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0 -45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0 -cat: /proc/50/stat: No such file or directory -cat: /proc/51/stat: No such file or directory -52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0 diff --git a/node_modules/pstree.remy/tests/fixtures/out2 b/node_modules/pstree.remy/tests/fixtures/out2 deleted file mode 100644 index 3b31137d..00000000 --- a/node_modules/pstree.remy/tests/fixtures/out2 +++ /dev/null @@ -1,29 +0,0 @@ -cat: /proc/4087/stat: No such file or directory -cat: /proc/4088/stat: No such file or directory -1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0 -1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0 -194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 -265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0 -359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 -363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 -4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0 -4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0 -4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0 -4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0 -4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0 -4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0 -4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0 -4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0 -50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0 -79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 -83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0 -94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/node_modules/pstree.remy/tests/index.test.js b/node_modules/pstree.remy/tests/index.test.js deleted file mode 100644 index 50096b95..00000000 --- a/node_modules/pstree.remy/tests/index.test.js +++ /dev/null @@ -1,51 +0,0 @@ -const tap = require('tap'); -const test = tap.test; -const readFile = require('fs').readFileSync; -const spawn = require('child_process').spawn; -const pstree = require('../'); -const { tree, pidsForTree, getStat } = require('../lib/utils'); - -if (process.platform !== 'darwin') { - test('reads from /proc', async (t) => { - const ps = await getStat(); - t.ok(ps.split('\n').length > 1); - }); -} - -test('tree for live env', async (t) => { - const pid = 4079; - const fixture = readFile(__dirname + '/fixtures/out2', 'utf8'); - const ps = await tree(fixture); - t.deepEqual( - pidsForTree(ps, pid).map((_) => _.PID), - ['4080'] - ); -}); - -function testTree(t, runCallCount) { - const sub = spawn('node', [`${__dirname}/fixtures/index.js`, runCallCount], { - stdio: 'pipe', - }); - setTimeout(() => { - const pid = sub.pid; - - pstree(pid, (error, pids) => { - pids.concat([pid]).forEach((p) => { - spawn('kill', ['-s', 'SIGTERM', p]); - }); - - // the fixture launches `sh` which launches node which is why we - // are looking for two processes. - // Important: IDKW but MacOS seems to skip the `sh` process. no idea. - t.equal(pids.length, runCallCount * 2); - t.end(); - }); - }, 1000); -} - -test('can read full process tree', (t) => { - testTree(t, 1); -}); -test('can read full process tree with multiple processes', (t) => { - testTree(t, 2); -}); diff --git a/node_modules/punycode/LICENSE-MIT.txt b/node_modules/punycode/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7e..00000000 --- a/node_modules/punycode/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 72b632cd..00000000 --- a/node_modules/punycode/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# Punycode.js [![punycode on npm](https://img.shields.io/npm/v/punycode)](https://www.npmjs.com/package/emoji-test-regex-pattern) [![](https://data.jsdelivr.com/v1/package/npm/punycode/badge)](https://www.jsdelivr.com/package/npm/punycode) - -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). - -This project provides a CommonJS module that uses ES2015+ features and JavaScript module, which work in modern Node.js versions and browsers. For the old Punycode.js version that offers the same functionality in a UMD build with support for older pre-ES2015 runtimes, including Rhino, Ringo, and Narwhal, see [v1.4.1](https://github.com/mathiasbynens/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/): - -> ⚠️ Note that userland modules don't hide core modules. -> For example, `require('punycode')` still imports the deprecated core module even if you executed `npm install punycode`. -> Use `require('punycode/')` to import userland modules rather than core modules. - -```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 deleted file mode 100644 index 9d0790b2..00000000 --- a/node_modules/punycode/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "punycode", - "version": "2.3.0", - "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/mathiasbynens/punycode.js.git" - }, - "bugs": "https://github.com/mathiasbynens/punycode.js/issues", - "files": [ - "LICENSE-MIT.txt", - "punycode.js", - "punycode.es6.js" - ], - "scripts": { - "test": "mocha tests", - "build": "node scripts/prepublish.js" - }, - "devDependencies": { - "codecov": "^1.0.1", - "istanbul": "^0.4.1", - "mocha": "^10.2.0" - }, - "jspm": { - "map": { - "./punycode.js": { - "node": "@node/punycode" - } - } - } -} diff --git a/node_modules/punycode/punycode.es6.js b/node_modules/punycode/punycode.es6.js deleted file mode 100644 index 244e1bfb..00000000 --- a/node_modules/punycode/punycode.es6.js +++ /dev/null @@ -1,444 +0,0 @@ -'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-\x7F]/; // Note: U+007F DEL is excluded too. -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, callback) { - const result = []; - let length = array.length; - while (length--) { - result[length] = callback(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 {String} A new string of characters returned by the callback - * function. - */ -function mapDomain(domain, callback) { - const parts = domain.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] + '@'; - domain = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - domain = domain.replace(regexSeparators, '\x2E'); - const labels = domain.split('.'); - const encoded = map(labels, callback).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 = codePoints => String.fromCodePoint(...codePoints); - -/** - * 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 && codePoint < 0x3A) { - return 26 + (codePoint - 0x30); - } - if (codePoint >= 0x41 && codePoint < 0x5B) { - return codePoint - 0x41; - } - if (codePoint >= 0x61 && codePoint < 0x7B) { - 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`. - const 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) { - error('invalid-input'); - } - if (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. - const 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)); - } - } - - const 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 deleted file mode 100644 index 752b98a9..00000000 --- a/node_modules/punycode/punycode.js +++ /dev/null @@ -1,443 +0,0 @@ -'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-\x7F]/; // Note: U+007F DEL is excluded too. -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, callback) { - const result = []; - let length = array.length; - while (length--) { - result[length] = callback(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 {String} A new string of characters returned by the callback - * function. - */ -function mapDomain(domain, callback) { - const parts = domain.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] + '@'; - domain = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - domain = domain.replace(regexSeparators, '\x2E'); - const labels = domain.split('.'); - const encoded = map(labels, callback).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 = codePoints => String.fromCodePoint(...codePoints); - -/** - * 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 && codePoint < 0x3A) { - return 26 + (codePoint - 0x30); - } - if (codePoint >= 0x41 && codePoint < 0x5B) { - return codePoint - 0x41; - } - if (codePoint >= 0x61 && codePoint < 0x7B) { - 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`. - const 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) { - error('invalid-input'); - } - if (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. - const 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)); - } - } - - const 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 deleted file mode 100644 index 2f084445..00000000 --- a/node_modules/qs/.editorconfig +++ /dev/null @@ -1,43 +0,0 @@ -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 = 160 -quote_type = single - -[test/*] -max_line_length = off - -[LICENSE.md] -indent_size = 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 - -[coverage/**/*] -indent_size = off -indent_style = off -indent = off -max_line_length = off - -[.nycrc] -indent_style = tab diff --git a/node_modules/qs/.eslintrc b/node_modules/qs/.eslintrc deleted file mode 100644 index 35220cd9..00000000 --- a/node_modules/qs/.eslintrc +++ /dev/null @@ -1,38 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", - - "ignorePatterns": [ - "dist/", - ], - - "rules": { - "complexity": 0, - "consistent-return": 1, - "func-name-matching": 0, - "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], - "indent": [2, 4], - "max-lines-per-function": [2, { "max": 150 }], - "max-params": [2, 16], - "max-statements": [2, 53], - "multiline-comment-style": 0, - "no-continue": 1, - "no-magic-numbers": 0, - "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], - }, - - "overrides": [ - { - "files": "test/**", - "rules": { - "function-paren-newline": 0, - "max-lines-per-function": 0, - "max-statements": 0, - "no-buffer-constructor": 0, - "no-extend-native": 0, - "no-throw-literal": 0, - }, - }, - ], -} diff --git a/node_modules/qs/.github/FUNDING.yml b/node_modules/qs/.github/FUNDING.yml deleted file mode 100644 index 0355f4f5..00000000 --- a/node_modules/qs/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# 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/qs -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 a single custom sponsorship URL diff --git a/node_modules/qs/.nycrc b/node_modules/qs/.nycrc deleted file mode 100644 index 1d57cabe..00000000 --- a/node_modules/qs/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "all": true, - "check-coverage": false, - "reporter": ["text-summary", "text", "html", "json"], - "lines": 86, - "statements": 85.93, - "functions": 82.43, - "branches": 76.06, - "exclude": [ - "coverage", - "dist" - ] -} diff --git a/node_modules/qs/CHANGELOG.md b/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 37b1d3f0..00000000 --- a/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,546 +0,0 @@ -## **6.11.0 -- [New] [Fix] `stringify`: revert 0e903c0; add `commaRoundTrip` option (#442) -- [readme] fix version badge - -## **6.10.5** -- [Fix] `stringify`: with `arrayFormat: comma`, properly include an explicit `[]` on a single-item array (#434) - -## **6.10.4** -- [Fix] `stringify`: with `arrayFormat: comma`, include an explicit `[]` on a single-item array (#441) -- [meta] use `npmignore` to autogenerate an npmignore file -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-symbol`, `object-inspect`, `tape` - -## **6.10.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [actions] reuse common workflows -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `tape` - -## **6.10.2** -- [Fix] `stringify`: actually fix cyclic references (#426) -- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] add note and links for coercing primitive values (#408) -- [actions] update codecov uploader -- [actions] update workflows -- [Tests] clean up stringify tests slightly -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `safe-publish-latest`, `tape` - -## **6.10.1** -- [Fix] `stringify`: avoid exception on repeated object values (#402) - -## **6.10.0** -- [New] `stringify`: throw on cycles, instead of an infinite loop (#395, #394, #393) -- [New] `parse`: add `allowSparse` option for collapsing arrays with missing indices (#312) -- [meta] fix README.md (#399) -- [meta] only run `npm run dist` in publish, not install -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-symbols`, `tape` -- [Tests] fix tests on node v0.6 -- [Tests] use `ljharb/actions/node/install` instead of `ljharb/actions/node/run` -- [Tests] Revert "[meta] ignore eclint transitive audit warning" - -## **6.9.7** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] add note and links for coercing primitive values (#408) -- [Tests] clean up stringify tests slightly -- [meta] fix README.md (#399) -- Revert "[meta] ignore eclint transitive audit warning" -- [actions] backport actions from main -- [Dev Deps] backport updates from main - -## **6.9.6** -- [Fix] restore `dist` dir; mistakenly removed in d4f6c32 - -## **6.9.5** -- [Fix] `stringify`: do not encode parens for RFC1738 -- [Fix] `stringify`: fix arrayFormat comma with empty array/objects (#350) -- [Refactor] `format`: remove `util.assign` call -- [meta] add "Allow Edits" workflow; update rebase workflow -- [actions] switch Automatic Rebase workflow to `pull_request_target` event -- [Tests] `stringify`: add tests for #378 -- [Tests] migrate tests to Github Actions -- [Tests] run `nyc` on all tests; use `tape` runner -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `mkdirp`, `object-inspect`, `tape`; add `aud` - -## **6.9.4** -- [Fix] `stringify`: when `arrayFormat` is `comma`, respect `serializeDate` (#364) -- [Refactor] `stringify`: reduce branching (part of #350) -- [Refactor] move `maybeMap` to `utils` -- [Dev Deps] update `browserify`, `tape` - -## **6.9.3** -- [Fix] proper comma parsing of URL-encoded commas (#361) -- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) - -## **6.9.2** -- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) -- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) -- [meta] ignore eclint transitive audit warning -- [meta] fix indentation in package.json -- [meta] add tidelift marketing copy -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `has-symbols`, `tape`, `mkdirp`, `iconv-lite` -- [actions] add automatic rebasing / merge commit blocking - -## **6.9.1** -- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) -- [Fix] `parse`: with comma true, do not split non-string values (#334) -- [meta] add `funding` field -- [Dev Deps] update `eslint`, `@ljharb/eslint-config` -- [Tests] use shared travis-ci config - -## **6.9.0** -- [New] `parse`/`stringify`: Pass extra key/value argument to `decoder` (#333) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `evalmd` -- [Tests] `parse`: add passing `arrayFormat` tests -- [Tests] add `posttest` using `npx aud` to run `npm audit` without a lockfile -- [Tests] up to `node` `v12.10`, `v11.15`, `v10.16`, `v8.16` -- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray - -## **6.8.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Tests] clean up stringify tests slightly -- [Docs] add note and links for coercing primitive values (#408) -- [meta] fix README.md (#399) -- [actions] backport actions from main -- [Dev Deps] backport updates from main -- [Refactor] `stringify`: reduce branching -- [meta] do not publish workflow files - -## **6.8.2** -- [Fix] proper comma parsing of URL-encoded commas (#361) -- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) - -## **6.8.1** -- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) -- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) -- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) -- [fix] `parse`: with comma true, do not split non-string values (#334) -- [meta] add tidelift marketing copy -- [meta] add `funding` field -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `safe-publish-latest`, `evalmd`, `has-symbols`, `iconv-lite`, `mkdirp`, `object-inspect` -- [Tests] `parse`: add passing `arrayFormat` tests -- [Tests] use shared travis-ci configs -- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray -- [actions] add automatic rebasing / merge commit blocking - -## **6.8.0** -- [New] add `depth=false` to preserve the original key; [Fix] `depth=0` should preserve the original key (#326) -- [New] [Fix] stringify symbols and bigints -- [Fix] ensure node 0.12 can stringify Symbols -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Refactor] `formats`: tiny bit of cleanup. -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `safe-publish-latest`, `iconv-lite`, `tape` -- [Tests] add tests for `depth=0` and `depth=false` behavior, both current and intuitive/intended (#326) -- [Tests] use `eclint` instead of `editorconfig-tools` -- [docs] readme: add security note -- [meta] add github sponsorship -- [meta] add FUNDING.yml -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause - -## **6.7.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] `stringify`: avoid encoding arrayformat comma when `encodeValuesOnly = true` (#424) -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] add note and links for coercing primitive values (#408) -- [meta] fix README.md (#399) -- [meta] do not publish workflow files -- [actions] backport actions from main -- [Dev Deps] backport updates from main -- [Tests] use `nyc` for coverage -- [Tests] clean up stringify tests slightly - -## **6.7.2** -- [Fix] proper comma parsing of URL-encoded commas (#361) -- [Fix] parses comma delimited array while having percent-encoded comma treated as normal text (#336) - -## **6.7.1** -- [Fix] `parse`: Fix parsing array from object with `comma` true (#359) -- [Fix] `parse`: with comma true, handle field that holds an array of arrays (#335) -- [fix] `parse`: with comma true, do not split non-string values (#334) -- [Fix] `parse`: throw a TypeError instead of an Error for bad charset (#349) -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Refactor] `formats`: tiny bit of cleanup. -- readme: add security note -- [meta] add tidelift marketing copy -- [meta] add `funding` field -- [meta] add FUNDING.yml -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `safe-publish-latest`, `evalmd`, `iconv-lite`, `mkdirp`, `object-inspect`, `browserify` -- [Tests] `parse`: add passing `arrayFormat` tests -- [Tests] use shared travis-ci configs -- [Tests] `Buffer.from` in node v5.0-v5.9 and v4.0-v4.4 requires a TypedArray -- [Tests] add tests for `depth=0` and `depth=false` behavior, both current and intuitive/intended -- [Tests] use `eclint` instead of `editorconfig-tools` -- [actions] add automatic rebasing / merge commit blocking - -## **6.7.0** -- [New] `stringify`/`parse`: add `comma` as an `arrayFormat` option (#276, #219) -- [Fix] correctly parse nested arrays (#212) -- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source, also with an array source -- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` -- [Refactor] `utils`: `isBuffer`: small tweak; add tests -- [Refactor] use cached `Array.isArray` -- [Refactor] `parse`/`stringify`: make a function to normalize the options -- [Refactor] `utils`: reduce observable [[Get]]s -- [Refactor] `stringify`/`utils`: cache `Array.isArray` -- [Tests] always use `String(x)` over `x.toString()` -- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 -- [Tests] temporarily allow coverage to fail - -## **6.6.1** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] correctly parse nested arrays -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [Robustness] `stringify`: cache `Object.prototype.hasOwnProperty` -- [Refactor] `formats`: tiny bit of cleanup. -- [Refactor] `utils`: `isBuffer`: small tweak; add tests -- [Refactor]: `stringify`/`utils`: cache `Array.isArray` -- [Refactor] `utils`: reduce observable [[Get]]s -- [Refactor] use cached `Array.isArray` -- [Refactor] `parse`/`stringify`: make a function to normalize the options -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] do not publish workflow files -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause -- [meta] add FUNDING.yml -- [meta] Fixes typo in CHANGELOG.md -- [actions] backport actions from main -- [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10 -- [Tests] always use `String(x)` over `x.toString()` -- [Dev Deps] backport from main - -## **6.6.0** -- [New] Add support for iso-8859-1, utf8 "sentinel" and numeric entities (#268) -- [New] move two-value combine to a `utils` function (#189) -- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` (#260) -- [Fix] `stringify`: do not crash in an obscure combo of `interpretNumericEntities`, a bad custom `decoder`, & `iso-8859-1` -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) -- [Refactor] `parse`: only need to reassign the var once -- [Refactor] `parse`/`stringify`: clean up `charset` options checking; fix defaults -- [Refactor] add missing defaults -- [Refactor] `parse`: one less `concat` call -- [Refactor] `utils`: `compactQueue`: make it explicitly side-effecting -- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`, `iconv-lite`, `safe-publish-latest`, `tape` -- [Tests] up to `node` `v10.10`, `v9.11`, `v8.12`, `v6.14`, `v4.9`; pin included builds to LTS - -## **6.5.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] correctly parse nested arrays -- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Refactor] `utils`: reduce observable [[Get]]s -- [Refactor] use cached `Array.isArray` -- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) -- [Refactor] `parse`: only need to reassign the var once -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] Clean up license text so it’s properly detected as BSD-3-Clause -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] add FUNDING.yml -- [actions] backport actions from main -- [Tests] always use `String(x)` over `x.toString()` -- [Tests] remove nonexistent tape option -- [Dev Deps] backport from main - -## **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.1** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Fix] use `safer-buffer` instead of `Buffer` constructor -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [Refactor] use cached `Array.isArray` -- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause -- [meta] add FUNDING.yml -- [actions] backport actions from main -- [Tests] remove nonexistent tape option -- [Dev Deps] backport from main - -## **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.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [Refactor] use cached `Array.isArray` -- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause -- [meta] add FUNDING.yml -- [actions] backport actions from main -- [Tests] use `safer-buffer` instead of `Buffer` constructor -- [Tests] remove nonexistent tape option -- [Dev Deps] backport from main - -## **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.4** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Fix] `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [Refactor] use cached `Array.isArray` -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] Clean up license text so it’s properly detected as BSD-3-Clause -- [meta] add FUNDING.yml -- [actions] backport actions from main -- [Tests] use `safer-buffer` instead of `Buffer` constructor -- [Tests] remove nonexistent tape option -- [Dev Deps] backport from main - -## **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.md b/node_modules/qs/LICENSE.md deleted file mode 100644 index fecf6b69..00000000 --- a/node_modules/qs/LICENSE.md +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/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: - -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 the copyright holder 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/qs/README.md b/node_modules/qs/README.md deleted file mode 100644 index 11be8531..00000000 --- a/node_modules/qs/README.md +++ /dev/null @@ -1,625 +0,0 @@ -# qs [![Version Badge][npm-version-svg]][package-url] - -[![github actions][actions-image]][actions-url] -[![coverage][codecov-image]][codecov-url] -[![dependency status][deps-svg]][deps-url] -[![dev dependency status][dev-deps-svg]][dev-deps-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] - -[![npm badge][npm-badge-png]][package-url] - -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' } }); -``` - -If you have to deal with legacy browsers or services, there's -also support for decoding percent-encoded octets as iso-8859-1: - -```javascript -var oldCharset = qs.parse('a=%A7', { charset: 'iso-8859-1' }); -assert.deepEqual(oldCharset, { a: '§' }); -``` - -Some services add an initial `utf8=✓` value to forms so that old -Internet Explorer versions are more likely to submit the form as -utf-8. Additionally, the server can check the value against wrong -encodings of the checkmark character and detect that a query string -or `application/x-www-form-urlencoded` body was *not* sent as -utf-8, eg. if the form had an `accept-charset` parameter or the -containing page had a different character set. - -**qs** supports this mechanism via the `charsetSentinel` option. -If specified, the `utf8` parameter will be omitted from the -returned object. It will be used to switch to `iso-8859-1`/`utf-8` -mode depending on how the checkmark is encoded. - -**Important**: When you specify both the `charset` option and the -`charsetSentinel` option, the `charset` will be overridden when -the request contains a `utf8` parameter from which the actual -charset can be deduced. In that sense the `charset` will behave -as the default charset rather than the authoritative charset. - -```javascript -var detectedAsUtf8 = qs.parse('utf8=%E2%9C%93&a=%C3%B8', { - charset: 'iso-8859-1', - charsetSentinel: true -}); -assert.deepEqual(detectedAsUtf8, { a: 'ø' }); - -// Browsers encode the checkmark as ✓ when submitting as iso-8859-1: -var detectedAsIso8859_1 = qs.parse('utf8=%26%2310003%3B&a=%F8', { - charset: 'utf-8', - charsetSentinel: true -}); -assert.deepEqual(detectedAsIso8859_1, { a: 'ø' }); -``` - -If you want to decode the `&#...;` syntax to the actual character, -you can specify the `interpretNumericEntities` option as well: - -```javascript -var detectedAsIso8859_1 = qs.parse('a=%26%239786%3B', { - charset: 'iso-8859-1', - interpretNumericEntities: true -}); -assert.deepEqual(detectedAsIso8859_1, { a: '☺' }); -``` - -It also works when the charset has been detected in `charsetSentinel` -mode. - -### 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'] }); -``` - -You may also use `allowSparse` option to parse sparse arrays: - -```javascript -var sparseArray = qs.parse('a[1]=2&a[3]=5', { allowSparse: true }); -assert.deepEqual(sparseArray, { a: [, '2', , '5'] }); -``` - -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. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. - -```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' }] }); -``` - -Some people use comma to join array, **qs** can parse it: -```javascript -var arraysOfObjects = qs.parse('a=b,c', { comma: true }) -assert.deepEqual(arraysOfObjects, { a: ['b', 'c'] }) -``` -(_this cannot convert nested objects, such as `a={b:1},{c:d}`_) - -### Parsing primitive/scalar values (numbers, booleans, null, etc) - -By default, all values are parsed as strings. This behavior will not change and is explained in [issue #91](https://github.com/ljharb/qs/issues/91). - -```javascript -var primitiveValues = qs.parse('a=15&b=true&c=null'); -assert.deepEqual(primitiveValues, { a: '15', b: 'true', c: 'null' }); -``` - -If you wish to auto-convert values which look like numbers, booleans, and other values into their primitive counterparts, you can use the [query-types Express JS middleware](https://github.com/xpepermint/query-types) which will auto-convert all request query parameters. - -### 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 -}}) -``` - -You can encode keys and values using different logic by using the type argument provided to the encoder: - -```javascript -var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) { - if (type === 'key') { - return // Encoded key - } else if (type === 'value') { - return // Encoded value - } -}}) -``` - -The type argument is also provided to the decoder: - -```javascript -var decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) { - if (type === 'key') { - return // Decoded key - } else if (type === 'value') { - return // Decoded value - } -}}) -``` - -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' -qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'comma' }) -// 'a=b,c' -``` - -Note: when using `arrayFormat` set to `'comma'`, you can also pass the `commaRoundTrip` option set to `true` or `false`, to append `[]` on single-item arrays, so that they can round trip through a parse. - -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'); -``` - -If you're communicating with legacy systems, you can switch to `iso-8859-1` -using the `charset` option: - -```javascript -var iso = qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }); -assert.equal(iso, '%E6=%E6'); -``` - -Characters that don't exist in `iso-8859-1` will be converted to numeric -entities, similar to what browsers do: - -```javascript -var numeric = qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }); -assert.equal(numeric, 'a=%26%239786%3B'); -``` - -You can use the `charsetSentinel` option to announce the character by -including an `utf8=✓` parameter with the proper encoding if the checkmark, -similar to what Ruby on Rails and others do when submitting forms. - -```javascript -var sentinel = qs.stringify({ a: '☺' }, { charsetSentinel: true }); -assert.equal(sentinel, 'utf8=%E2%9C%93&a=%E2%98%BA'); - -var isoSentinel = qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }); -assert.equal(isoSentinel, 'utf8=%26%2310003%3B&a=%E6'); -``` - -### Dealing with special character sets - -By default the encoding and decoding of characters is done in `utf-8`, -and `iso-8859-1` support is also built in via the `charset` parameter. - -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'); -``` - -## Security - -Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. - -## qs for enterprise - -Available as part of the Tidelift Subscription - -The maintainers of qs 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-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - -[package-url]: https://npmjs.org/package/qs -[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg -[deps-svg]: https://david-dm.org/ljharb/qs.svg -[deps-url]: https://david-dm.org/ljharb/qs -[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg -[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies -[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true -[license-image]: https://img.shields.io/npm/l/qs.svg -[license-url]: LICENSE -[downloads-image]: https://img.shields.io/npm/dm/qs.svg -[downloads-url]: https://npm-stat.com/charts.html?package=qs -[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg -[codecov-url]: https://app.codecov.io/gh/ljharb/qs/ -[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs -[actions-url]: https://github.com/ljharb/qs/actions diff --git a/node_modules/qs/dist/qs.js b/node_modules/qs/dist/qs.js deleted file mode 100644 index 1c620a48..00000000 --- a/node_modules/qs/dist/qs.js +++ /dev/null @@ -1,2054 +0,0 @@ -(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 -1) { - return val.split(','); - } - - return val; -}; - -// This is what browsers will submit when the ✓ character occurs in an -// application/x-www-form-urlencoded body and the encoding of the page containing -// the form is iso-8859-1, or when the submitted form has an accept-charset -// attribute of iso-8859-1. Presumably also with other charsets that do not contain -// the ✓ character, such as us-ascii. -var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') - -// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. -var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') - -var parseValues = function parseQueryStringValues(str, options) { - var obj = {}; - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - var skipIndex = -1; // Keep track of where the utf8 sentinel was found - var i; - - var charset = options.charset; - if (options.charsetSentinel) { - for (i = 0; i < parts.length; ++i) { - if (parts[i].indexOf('utf8=') === 0) { - if (parts[i] === charsetSentinel) { - charset = 'utf-8'; - } else if (parts[i] === isoSentinel) { - charset = 'iso-8859-1'; - } - skipIndex = i; - i = parts.length; // The eslint settings do not allow break; - } - } - } - - for (i = 0; i < parts.length; ++i) { - if (i === skipIndex) { - continue; - } - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder, charset, 'key'); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); - val = utils.maybeMap( - parseArrayValue(part.slice(pos + 1), options), - function (encodedVal) { - return options.decoder(encodedVal, defaults.decoder, charset, 'value'); - } - ); - } - - if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { - val = interpretNumericEntities(val); - } - - if (part.indexOf('[]=') > -1) { - val = isArray(val) ? [val] : val; - } - - if (has.call(obj, key)) { - obj[key] = utils.combine(obj[key], val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function (chain, val, options, valuesParsed) { - var leaf = valuesParsed ? val : parseArrayValue(val, options); - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]' && options.parseArrays) { - 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 (!options.parseArrays && cleanRoot === '') { - obj = { 0: leaf }; - } else if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else if (cleanRoot !== '__proto__') { - obj[cleanRoot] = leaf; - } - } - - leaf = obj; - } - - return leaf; -}; - -var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { - 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 = options.depth > 0 && 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 (options.depth > 0 && (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, valuesParsed); -}; - -var normalizeParseOptions = function normalizeParseOptions(opts) { - if (!opts) { - return defaults; - } - - if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } - var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; - - return { - allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, - allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, - allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, - arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, - decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, - delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, - // eslint-disable-next-line no-implicit-coercion, no-extra-parens - depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, - ignoreQueryPrefix: opts.ignoreQueryPrefix === true, - interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, - parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, - parseArrays: opts.parseArrays !== false, - plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; -}; - -module.exports = function (str, opts) { - var options = normalizeParseOptions(opts); - - 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, typeof str === 'string'); - obj = utils.merge(obj, newObj, options); - } - - if (options.allowSparse === true) { - return obj; - } - - return utils.compact(obj); -}; - -},{"./utils":5}],4:[function(require,module,exports){ -'use strict'; - -var getSideChannel = require('side-channel'); -var utils = require('./utils'); -var formats = require('./formats'); -var has = Object.prototype.hasOwnProperty; - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - comma: 'comma', - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var isArray = Array.isArray; -var split = String.prototype.split; -var push = Array.prototype.push; -var pushToArray = function (arr, valueOrArray) { - push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); -}; - -var toISO = Date.prototype.toISOString; - -var defaultFormat = formats['default']; -var defaults = { - addQueryPrefix: false, - allowDots: false, - charset: 'utf-8', - charsetSentinel: false, - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - format: defaultFormat, - formatter: formats.formatters[defaultFormat], - // deprecated - indices: false, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var isNonNullishPrimitive = function isNonNullishPrimitive(v) { - return typeof v === 'string' - || typeof v === 'number' - || typeof v === 'boolean' - || typeof v === 'symbol' - || typeof v === 'bigint'; -}; - -var sentinel = {}; - -var stringify = function stringify( - object, - prefix, - generateArrayPrefix, - commaRoundTrip, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - sideChannel -) { - var obj = object; - - var tmpSc = sideChannel; - var step = 0; - var findFlag = false; - while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { - // Where object last appeared in the ref tree - var pos = tmpSc.get(object); - step += 1; - if (typeof pos !== 'undefined') { - if (pos === step) { - throw new RangeError('Cyclic object value'); - } else { - findFlag = true; // Break while - } - } - if (typeof tmpSc.get(sentinel) === 'undefined') { - step = 0; - } - } - - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (generateArrayPrefix === 'comma' && isArray(obj)) { - obj = utils.maybeMap(obj, function (value) { - if (value instanceof Date) { - return serializeDate(value); - } - return value; - }); - } - - if (obj === null) { - if (strictNullHandling) { - return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; - } - - obj = ''; - } - - if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { - if (encoder) { - var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); - if (generateArrayPrefix === 'comma' && encodeValuesOnly) { - var valuesArray = split.call(String(obj), ','); - var valuesJoined = ''; - for (var i = 0; i < valuesArray.length; ++i) { - valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); - } - return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; - } - return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (generateArrayPrefix === 'comma' && isArray(obj)) { - // we need to join elements in - objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; - } else if (isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; - - for (var j = 0; j < objKeys.length; ++j) { - var key = objKeys[j]; - var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; - - if (skipNulls && value === null) { - continue; - } - - var keyPrefix = isArray(obj) - ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix - : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); - - sideChannel.set(object, step); - var valueSideChannel = getSideChannel(); - valueSideChannel.set(sentinel, sideChannel); - pushToArray(values, stringify( - value, - keyPrefix, - generateArrayPrefix, - commaRoundTrip, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - valueSideChannel - )); - } - - return values; -}; - -var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { - if (!opts) { - return defaults; - } - - if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - var charset = opts.charset || defaults.charset; - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } - - var format = formats['default']; - if (typeof opts.format !== 'undefined') { - if (!has.call(formats.formatters, opts.format)) { - throw new TypeError('Unknown format option provided.'); - } - format = opts.format; - } - var formatter = formats.formatters[format]; - - var filter = defaults.filter; - if (typeof opts.filter === 'function' || isArray(opts.filter)) { - filter = opts.filter; - } - - return { - addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, - allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, - encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, - encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, - encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, - filter: filter, - format: format, - formatter: formatter, - serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, - skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, - sort: typeof opts.sort === 'function' ? opts.sort : null, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = normalizeStringifyOptions(opts); - - var objKeys; - var filter; - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (opts && opts.arrayFormat in arrayPrefixGenerators) { - arrayFormat = opts.arrayFormat; - } else if (opts && 'indices' in opts) { - arrayFormat = opts.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { - throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); - } - var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (options.sort) { - objKeys.sort(options.sort); - } - - var sideChannel = getSideChannel(); - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (options.skipNulls && obj[key] === null) { - continue; - } - pushToArray(keys, stringify( - obj[key], - key, - generateArrayPrefix, - commaRoundTrip, - options.strictNullHandling, - options.skipNulls, - options.encode ? options.encoder : null, - options.filter, - options.sort, - options.allowDots, - options.serializeDate, - options.format, - options.formatter, - options.encodeValuesOnly, - options.charset, - sideChannel - )); - } - - var joined = keys.join(options.delimiter); - var prefix = options.addQueryPrefix === true ? '?' : ''; - - if (options.charsetSentinel) { - if (options.charset === 'iso-8859-1') { - // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark - prefix += 'utf8=%26%2310003%3B&'; - } else { - // encodeURIComponent('✓') - prefix += 'utf8=%E2%9C%93&'; - } - } - - return joined.length > 0 ? prefix + joined : ''; -}; - -},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){ -'use strict'; - -var formats = require('./formats'); - -var has = Object.prototype.hasOwnProperty; -var isArray = Array.isArray; - -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) { - while (queue.length > 1) { - var item = queue.pop(); - var obj = item.obj[item.prop]; - - if (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; - } - } -}; - -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) { - /* eslint no-param-reassign: 0 */ - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (isArray(target)) { - target.push(source); - } else if (target && typeof target === 'object') { - if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (!target || typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (isArray(target) && !isArray(source)) { - mergeTarget = arrayToObject(target, options); - } - - if (isArray(target) && isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - var targetItem = target[i]; - if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { - target[i] = merge(targetItem, 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, decoder, charset) { - var strWithoutPlus = str.replace(/\+/g, ' '); - if (charset === 'iso-8859-1') { - // unescape never throws, no try...catch needed: - return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); - } - // utf-8 - try { - return decodeURIComponent(strWithoutPlus); - } catch (e) { - return strWithoutPlus; - } -}; - -var encode = function encode(str, defaultEncoder, charset, kind, format) { - // 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 = str; - if (typeof str === 'symbol') { - string = Symbol.prototype.toString.call(str); - } else if (typeof str !== 'string') { - string = String(str); - } - - if (charset === 'iso-8859-1') { - return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { - return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; - }); - } - - 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 - || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) - ) { - 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)); - /* eslint operator-linebreak: [2, "before"] */ - 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); - } - } - } - - compactQueue(queue); - - return value; -}; - -var isRegExp = function isRegExp(obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -var isBuffer = function isBuffer(obj) { - if (!obj || typeof obj !== 'object') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; - -var combine = function combine(a, b) { - return [].concat(a, b); -}; - -var maybeMap = function maybeMap(val, fn) { - if (isArray(val)) { - var mapped = []; - for (var i = 0; i < val.length; i += 1) { - mapped.push(fn(val[i])); - } - return mapped; - } - return fn(val); -}; - -module.exports = { - arrayToObject: arrayToObject, - assign: assign, - combine: combine, - compact: compact, - decode: decode, - encode: encode, - isBuffer: isBuffer, - isRegExp: isRegExp, - maybeMap: maybeMap, - merge: merge -}; - -},{"./formats":1}],6:[function(require,module,exports){ - -},{}],7:[function(require,module,exports){ -'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; -}; - -},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){ -'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) { - // original length, plus the receiver, minus any additional arguments (after the receiver) - $defineProperty( - func, - 'length', - { value: 1 + $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; -} - -},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){ -'use strict'; - -/* eslint no-invalid-this: 1 */ - -var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; -var slice = Array.prototype.slice; -var toStr = Object.prototype.toString; -var funcType = '[object Function]'; - -module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.call(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slice.call(arguments, 1); - - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - args.concat(slice.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - } else { - return target.apply( - that, - args.concat(slice.call(arguments)) - ); - } - }; - - var boundLength = Math.max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs.push('$' + i); - } - - bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); - - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } - - return bound; -}; - -},{}],10:[function(require,module,exports){ -'use strict'; - -var implementation = require('./implementation'); - -module.exports = Function.prototype.bind || implementation; - -},{"./implementation":9}],11:[function(require,module,exports){ -'use strict'; - -var undefined; - -var $SyntaxError = SyntaxError; -var $Function = Function; -var $TypeError = TypeError; - -// eslint-disable-next-line consistent-return -var getEvalledConstructor = function (expressionSyntax) { - try { - return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); - } catch (e) {} -}; - -var $gOPD = Object.getOwnPropertyDescriptor; -if ($gOPD) { - try { - $gOPD({}, ''); - } catch (e) { - $gOPD = null; // this is IE 8, which has a broken gOPD - } -} - -var throwTypeError = function () { - throw new $TypeError(); -}; -var ThrowTypeError = $gOPD - ? (function () { - try { - // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties - arguments.callee; // IE 8 does not throw here - return throwTypeError; - } catch (calleeThrows) { - try { - // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') - return $gOPD(arguments, 'callee').get; - } catch (gOPDthrows) { - return throwTypeError; - } - } - }()) - : throwTypeError; - -var hasSymbols = require('has-symbols')(); - -var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto - -var needsEval = {}; - -var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array); - -var INTRINSICS = { - '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, - '%Array%': Array, - '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, - '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined, - '%AsyncFromSyncIteratorPrototype%': undefined, - '%AsyncFunction%': needsEval, - '%AsyncGenerator%': needsEval, - '%AsyncGeneratorFunction%': needsEval, - '%AsyncIteratorPrototype%': needsEval, - '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, - '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, - '%Boolean%': Boolean, - '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, - '%Date%': Date, - '%decodeURI%': decodeURI, - '%decodeURIComponent%': decodeURIComponent, - '%encodeURI%': encodeURI, - '%encodeURIComponent%': encodeURIComponent, - '%Error%': Error, - '%eval%': eval, // eslint-disable-line no-eval - '%EvalError%': EvalError, - '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, - '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, - '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, - '%Function%': $Function, - '%GeneratorFunction%': needsEval, - '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, - '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, - '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, - '%isFinite%': isFinite, - '%isNaN%': isNaN, - '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined, - '%JSON%': typeof JSON === 'object' ? JSON : undefined, - '%Map%': typeof Map === 'undefined' ? undefined : Map, - '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()), - '%Math%': Math, - '%Number%': Number, - '%Object%': Object, - '%parseFloat%': parseFloat, - '%parseInt%': parseInt, - '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, - '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, - '%RangeError%': RangeError, - '%ReferenceError%': ReferenceError, - '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, - '%RegExp%': RegExp, - '%Set%': typeof Set === 'undefined' ? undefined : Set, - '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()), - '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, - '%String%': String, - '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined, - '%Symbol%': hasSymbols ? Symbol : undefined, - '%SyntaxError%': $SyntaxError, - '%ThrowTypeError%': ThrowTypeError, - '%TypedArray%': TypedArray, - '%TypeError%': $TypeError, - '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, - '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, - '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, - '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, - '%URIError%': URIError, - '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, - '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, - '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet -}; - -var doEval = function doEval(name) { - var value; - if (name === '%AsyncFunction%') { - value = getEvalledConstructor('async function () {}'); - } else if (name === '%GeneratorFunction%') { - value = getEvalledConstructor('function* () {}'); - } else if (name === '%AsyncGeneratorFunction%') { - value = getEvalledConstructor('async function* () {}'); - } else if (name === '%AsyncGenerator%') { - var fn = doEval('%AsyncGeneratorFunction%'); - if (fn) { - value = fn.prototype; - } - } else if (name === '%AsyncIteratorPrototype%') { - var gen = doEval('%AsyncGenerator%'); - if (gen) { - value = getProto(gen.prototype); - } - } - - INTRINSICS[name] = value; - - return value; -}; - -var LEGACY_ALIASES = { - '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], - '%ArrayPrototype%': ['Array', 'prototype'], - '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], - '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], - '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], - '%ArrayProto_values%': ['Array', 'prototype', 'values'], - '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], - '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], - '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], - '%BooleanPrototype%': ['Boolean', 'prototype'], - '%DataViewPrototype%': ['DataView', 'prototype'], - '%DatePrototype%': ['Date', 'prototype'], - '%ErrorPrototype%': ['Error', 'prototype'], - '%EvalErrorPrototype%': ['EvalError', 'prototype'], - '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], - '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], - '%FunctionPrototype%': ['Function', 'prototype'], - '%Generator%': ['GeneratorFunction', 'prototype'], - '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], - '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], - '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], - '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], - '%JSONParse%': ['JSON', 'parse'], - '%JSONStringify%': ['JSON', 'stringify'], - '%MapPrototype%': ['Map', 'prototype'], - '%NumberPrototype%': ['Number', 'prototype'], - '%ObjectPrototype%': ['Object', 'prototype'], - '%ObjProto_toString%': ['Object', 'prototype', 'toString'], - '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], - '%PromisePrototype%': ['Promise', 'prototype'], - '%PromiseProto_then%': ['Promise', 'prototype', 'then'], - '%Promise_all%': ['Promise', 'all'], - '%Promise_reject%': ['Promise', 'reject'], - '%Promise_resolve%': ['Promise', 'resolve'], - '%RangeErrorPrototype%': ['RangeError', 'prototype'], - '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], - '%RegExpPrototype%': ['RegExp', 'prototype'], - '%SetPrototype%': ['Set', 'prototype'], - '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], - '%StringPrototype%': ['String', 'prototype'], - '%SymbolPrototype%': ['Symbol', 'prototype'], - '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], - '%TypedArrayPrototype%': ['TypedArray', 'prototype'], - '%TypeErrorPrototype%': ['TypeError', 'prototype'], - '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], - '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], - '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], - '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], - '%URIErrorPrototype%': ['URIError', 'prototype'], - '%WeakMapPrototype%': ['WeakMap', 'prototype'], - '%WeakSetPrototype%': ['WeakSet', 'prototype'] -}; - -var bind = require('function-bind'); -var hasOwn = require('has'); -var $concat = bind.call(Function.call, Array.prototype.concat); -var $spliceApply = bind.call(Function.apply, Array.prototype.splice); -var $replace = bind.call(Function.call, String.prototype.replace); -var $strSlice = bind.call(Function.call, String.prototype.slice); - -/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ -var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; -var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ -var stringToPath = function stringToPath(string) { - var first = $strSlice(string, 0, 1); - var last = $strSlice(string, -1); - if (first === '%' && last !== '%') { - throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); - } else if (last === '%' && first !== '%') { - throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); - } - var result = []; - $replace(string, rePropName, function (match, number, quote, subString) { - result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; - }); - return result; -}; -/* end adaptation */ - -var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { - var intrinsicName = name; - var alias; - if (hasOwn(LEGACY_ALIASES, intrinsicName)) { - alias = LEGACY_ALIASES[intrinsicName]; - intrinsicName = '%' + alias[0] + '%'; - } - - if (hasOwn(INTRINSICS, intrinsicName)) { - var value = INTRINSICS[intrinsicName]; - if (value === needsEval) { - value = doEval(intrinsicName); - } - if (typeof value === 'undefined' && !allowMissing) { - throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); - } - - return { - alias: alias, - name: intrinsicName, - value: value - }; - } - - throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); -}; - -module.exports = function GetIntrinsic(name, allowMissing) { - if (typeof name !== 'string' || name.length === 0) { - throw new $TypeError('intrinsic name must be a non-empty string'); - } - if (arguments.length > 1 && typeof allowMissing !== 'boolean') { - throw new $TypeError('"allowMissing" argument must be a boolean'); - } - - var parts = stringToPath(name); - var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; - - var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); - var intrinsicRealName = intrinsic.name; - var value = intrinsic.value; - var skipFurtherCaching = false; - - var alias = intrinsic.alias; - if (alias) { - intrinsicBaseName = alias[0]; - $spliceApply(parts, $concat([0, 1], alias)); - } - - for (var i = 1, isOwn = true; i < parts.length; i += 1) { - var part = parts[i]; - var first = $strSlice(part, 0, 1); - var last = $strSlice(part, -1); - if ( - ( - (first === '"' || first === "'" || first === '`') - || (last === '"' || last === "'" || last === '`') - ) - && first !== last - ) { - throw new $SyntaxError('property names with quotes must have matching quotes'); - } - if (part === 'constructor' || !isOwn) { - skipFurtherCaching = true; - } - - intrinsicBaseName += '.' + part; - intrinsicRealName = '%' + intrinsicBaseName + '%'; - - if (hasOwn(INTRINSICS, intrinsicRealName)) { - value = INTRINSICS[intrinsicRealName]; - } else if (value != null) { - if (!(part in value)) { - if (!allowMissing) { - throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); - } - return void undefined; - } - if ($gOPD && (i + 1) >= parts.length) { - var desc = $gOPD(value, part); - isOwn = !!desc; - - // By convention, when a data property is converted to an accessor - // property to emulate a data property that does not suffer from - // the override mistake, that accessor's getter is marked with - // an `originalValue` property. Here, when we detect this, we - // uphold the illusion by pretending to see that original data - // property, i.e., returning the value rather than the getter - // itself. - if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { - value = desc.get; - } else { - value = value[part]; - } - } else { - isOwn = hasOwn(value, part); - value = value[part]; - } - - if (isOwn && !skipFurtherCaching) { - INTRINSICS[intrinsicRealName] = value; - } - } - } - return value; -}; - -},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){ -'use strict'; - -var origSymbol = typeof Symbol !== 'undefined' && Symbol; -var hasSymbolSham = require('./shams'); - -module.exports = function hasNativeSymbols() { - if (typeof origSymbol !== 'function') { return false; } - if (typeof Symbol !== 'function') { return false; } - if (typeof origSymbol('foo') !== 'symbol') { return false; } - if (typeof Symbol('bar') !== 'symbol') { return false; } - - return hasSymbolSham(); -}; - -},{"./shams":13}],13:[function(require,module,exports){ -'use strict'; - -/* eslint complexity: [2, 18], max-statements: [2, 33] */ -module.exports = function hasSymbols() { - if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } - if (typeof Symbol.iterator === 'symbol') { return true; } - - var obj = {}; - var sym = Symbol('test'); - var symObj = Object(sym); - if (typeof sym === 'string') { return false; } - - if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } - if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } - - // temp disabled per https://github.com/ljharb/object.assign/issues/17 - // if (sym instanceof Symbol) { return false; } - // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 - // if (!(symObj instanceof Symbol)) { return false; } - - // if (typeof Symbol.prototype.toString !== 'function') { return false; } - // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } - - var symVal = 42; - obj[sym] = symVal; - for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop - if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } - - if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } - - var syms = Object.getOwnPropertySymbols(obj); - if (syms.length !== 1 || syms[0] !== sym) { return false; } - - if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } - - if (typeof Object.getOwnPropertyDescriptor === 'function') { - var descriptor = Object.getOwnPropertyDescriptor(obj, sym); - if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } - } - - return true; -}; - -},{}],14:[function(require,module,exports){ -'use strict'; - -var bind = require('function-bind'); - -module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); - -},{"function-bind":10}],15:[function(require,module,exports){ -var hasMap = typeof Map === 'function' && Map.prototype; -var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; -var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; -var mapForEach = hasMap && Map.prototype.forEach; -var hasSet = typeof Set === 'function' && Set.prototype; -var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; -var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; -var setForEach = hasSet && Set.prototype.forEach; -var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; -var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; -var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; -var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; -var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; -var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; -var booleanValueOf = Boolean.prototype.valueOf; -var objectToString = Object.prototype.toString; -var functionToString = Function.prototype.toString; -var $match = String.prototype.match; -var $slice = String.prototype.slice; -var $replace = String.prototype.replace; -var $toUpperCase = String.prototype.toUpperCase; -var $toLowerCase = String.prototype.toLowerCase; -var $test = RegExp.prototype.test; -var $concat = Array.prototype.concat; -var $join = Array.prototype.join; -var $arrSlice = Array.prototype.slice; -var $floor = Math.floor; -var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; -var gOPS = Object.getOwnPropertySymbols; -var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; -var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; -// ie, `has-tostringtag/shams -var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') - ? Symbol.toStringTag - : null; -var isEnumerable = Object.prototype.propertyIsEnumerable; - -var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( - [].__proto__ === Array.prototype // eslint-disable-line no-proto - ? function (O) { - return O.__proto__; // eslint-disable-line no-proto - } - : null -); - -function addNumericSeparator(num, str) { - if ( - num === Infinity - || num === -Infinity - || num !== num - || (num && num > -1000 && num < 1000) - || $test.call(/e/, str) - ) { - return str; - } - var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; - if (typeof num === 'number') { - var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) - if (int !== num) { - var intStr = String(int); - var dec = $slice.call(str, intStr.length + 1); - return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); - } - } - return $replace.call(str, sepRegex, '$&_'); -} - -var utilInspect = require('./util.inspect'); -var inspectCustom = utilInspect.custom; -var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; - -module.exports = function inspect_(obj, options, depth, seen) { - var opts = options || {}; - - if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { - throw new TypeError('option "quoteStyle" must be "single" or "double"'); - } - if ( - has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' - ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity - : opts.maxStringLength !== null - ) - ) { - throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); - } - var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; - if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { - throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); - } - - if ( - has(opts, 'indent') - && opts.indent !== null - && opts.indent !== '\t' - && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) - ) { - throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); - } - if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { - throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); - } - var numericSeparator = opts.numericSeparator; - - if (typeof obj === 'undefined') { - return 'undefined'; - } - if (obj === null) { - return 'null'; - } - if (typeof obj === 'boolean') { - return obj ? 'true' : 'false'; - } - - if (typeof obj === 'string') { - return inspectString(obj, opts); - } - if (typeof obj === 'number') { - if (obj === 0) { - return Infinity / obj > 0 ? '0' : '-0'; - } - var str = String(obj); - return numericSeparator ? addNumericSeparator(obj, str) : str; - } - if (typeof obj === 'bigint') { - var bigIntStr = String(obj) + 'n'; - return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; - } - - var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; - if (typeof depth === 'undefined') { depth = 0; } - if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { - return isArray(obj) ? '[Array]' : '[Object]'; - } - - var indent = getIndent(opts, depth); - - if (typeof seen === 'undefined') { - seen = []; - } else if (indexOf(seen, obj) >= 0) { - return '[Circular]'; - } - - function inspect(value, from, noIndent) { - if (from) { - seen = $arrSlice.call(seen); - seen.push(from); - } - if (noIndent) { - var newOpts = { - depth: opts.depth - }; - if (has(opts, 'quoteStyle')) { - newOpts.quoteStyle = opts.quoteStyle; - } - return inspect_(value, newOpts, depth + 1, seen); - } - return inspect_(value, opts, depth + 1, seen); - } - - if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable - var name = nameOf(obj); - var keys = arrObjKeys(obj, inspect); - return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); - } - if (isSymbol(obj)) { - var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); - return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; - } - if (isElement(obj)) { - var s = '<' + $toLowerCase.call(String(obj.nodeName)); - var attrs = obj.attributes || []; - for (var i = 0; i < attrs.length; i++) { - s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); - } - s += '>'; - if (obj.childNodes && obj.childNodes.length) { s += '...'; } - s += ''; - return s; - } - if (isArray(obj)) { - if (obj.length === 0) { return '[]'; } - var xs = arrObjKeys(obj, inspect); - if (indent && !singleLineValues(xs)) { - return '[' + indentedJoin(xs, indent) + ']'; - } - return '[ ' + $join.call(xs, ', ') + ' ]'; - } - if (isError(obj)) { - var parts = arrObjKeys(obj, inspect); - if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { - return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; - } - if (parts.length === 0) { return '[' + String(obj) + ']'; } - return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; - } - if (typeof obj === 'object' && customInspect) { - if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { - return utilInspect(obj, { depth: maxDepth - depth }); - } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { - return obj.inspect(); - } - } - if (isMap(obj)) { - var mapParts = []; - mapForEach.call(obj, function (value, key) { - mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); - }); - return collectionOf('Map', mapSize.call(obj), mapParts, indent); - } - if (isSet(obj)) { - var setParts = []; - setForEach.call(obj, function (value) { - setParts.push(inspect(value, obj)); - }); - return collectionOf('Set', setSize.call(obj), setParts, indent); - } - if (isWeakMap(obj)) { - return weakCollectionOf('WeakMap'); - } - if (isWeakSet(obj)) { - return weakCollectionOf('WeakSet'); - } - if (isWeakRef(obj)) { - return weakCollectionOf('WeakRef'); - } - if (isNumber(obj)) { - return markBoxed(inspect(Number(obj))); - } - if (isBigInt(obj)) { - return markBoxed(inspect(bigIntValueOf.call(obj))); - } - if (isBoolean(obj)) { - return markBoxed(booleanValueOf.call(obj)); - } - if (isString(obj)) { - return markBoxed(inspect(String(obj))); - } - if (!isDate(obj) && !isRegExp(obj)) { - var ys = arrObjKeys(obj, inspect); - var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; - var protoTag = obj instanceof Object ? '' : 'null prototype'; - var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; - var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; - var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); - if (ys.length === 0) { return tag + '{}'; } - if (indent) { - return tag + '{' + indentedJoin(ys, indent) + '}'; - } - return tag + '{ ' + $join.call(ys, ', ') + ' }'; - } - return String(obj); -}; - -function wrapQuotes(s, defaultStyle, opts) { - var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; - return quoteChar + s + quoteChar; -} - -function quote(s) { - return $replace.call(String(s), /"/g, '"'); -} - -function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } -function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - -// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives -function isSymbol(obj) { - if (hasShammedSymbols) { - return obj && typeof obj === 'object' && obj instanceof Symbol; - } - if (typeof obj === 'symbol') { - return true; - } - if (!obj || typeof obj !== 'object' || !symToString) { - return false; - } - try { - symToString.call(obj); - return true; - } catch (e) {} - return false; -} - -function isBigInt(obj) { - if (!obj || typeof obj !== 'object' || !bigIntValueOf) { - return false; - } - try { - bigIntValueOf.call(obj); - return true; - } catch (e) {} - return false; -} - -var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; -function has(obj, key) { - return hasOwn.call(obj, key); -} - -function toStr(obj) { - return objectToString.call(obj); -} - -function nameOf(f) { - if (f.name) { return f.name; } - var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); - if (m) { return m[1]; } - return null; -} - -function indexOf(xs, x) { - if (xs.indexOf) { return xs.indexOf(x); } - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) { return i; } - } - return -1; -} - -function isMap(x) { - if (!mapSize || !x || typeof x !== 'object') { - return false; - } - try { - mapSize.call(x); - try { - setSize.call(x); - } catch (s) { - return true; - } - return x instanceof Map; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; -} - -function isWeakMap(x) { - if (!weakMapHas || !x || typeof x !== 'object') { - return false; - } - try { - weakMapHas.call(x, weakMapHas); - try { - weakSetHas.call(x, weakSetHas); - } catch (s) { - return true; - } - return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; -} - -function isWeakRef(x) { - if (!weakRefDeref || !x || typeof x !== 'object') { - return false; - } - try { - weakRefDeref.call(x); - return true; - } catch (e) {} - return false; -} - -function isSet(x) { - if (!setSize || !x || typeof x !== 'object') { - return false; - } - try { - setSize.call(x); - try { - mapSize.call(x); - } catch (m) { - return true; - } - return x instanceof Set; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; -} - -function isWeakSet(x) { - if (!weakSetHas || !x || typeof x !== 'object') { - return false; - } - try { - weakSetHas.call(x, weakSetHas); - try { - weakMapHas.call(x, weakMapHas); - } catch (s) { - return true; - } - return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 - } catch (e) {} - return false; -} - -function isElement(x) { - if (!x || typeof x !== 'object') { return false; } - if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { - return true; - } - return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; -} - -function inspectString(str, opts) { - if (str.length > opts.maxStringLength) { - var remaining = str.length - opts.maxStringLength; - var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); - return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; - } - // eslint-disable-next-line no-control-regex - var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); - return wrapQuotes(s, 'single', opts); -} - -function lowbyte(c) { - var n = c.charCodeAt(0); - var x = { - 8: 'b', - 9: 't', - 10: 'n', - 12: 'f', - 13: 'r' - }[n]; - if (x) { return '\\' + x; } - return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); -} - -function markBoxed(str) { - return 'Object(' + str + ')'; -} - -function weakCollectionOf(type) { - return type + ' { ? }'; -} - -function collectionOf(type, size, entries, indent) { - var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); - return type + ' (' + size + ') {' + joinedEntries + '}'; -} - -function singleLineValues(xs) { - for (var i = 0; i < xs.length; i++) { - if (indexOf(xs[i], '\n') >= 0) { - return false; - } - } - return true; -} - -function getIndent(opts, depth) { - var baseIndent; - if (opts.indent === '\t') { - baseIndent = '\t'; - } else if (typeof opts.indent === 'number' && opts.indent > 0) { - baseIndent = $join.call(Array(opts.indent + 1), ' '); - } else { - return null; - } - return { - base: baseIndent, - prev: $join.call(Array(depth + 1), baseIndent) - }; -} - -function indentedJoin(xs, indent) { - if (xs.length === 0) { return ''; } - var lineJoiner = '\n' + indent.prev + indent.base; - return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; -} - -function arrObjKeys(obj, inspect) { - var isArr = isArray(obj); - var xs = []; - if (isArr) { - xs.length = obj.length; - for (var i = 0; i < obj.length; i++) { - xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; - } - } - var syms = typeof gOPS === 'function' ? gOPS(obj) : []; - var symMap; - if (hasShammedSymbols) { - symMap = {}; - for (var k = 0; k < syms.length; k++) { - symMap['$' + syms[k]] = syms[k]; - } - } - - for (var key in obj) { // eslint-disable-line no-restricted-syntax - if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue - if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue - if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { - // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section - continue; // eslint-disable-line no-restricted-syntax, no-continue - } else if ($test.call(/[^\w$]/, key)) { - xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); - } else { - xs.push(key + ': ' + inspect(obj[key], obj)); - } - } - if (typeof gOPS === 'function') { - for (var j = 0; j < syms.length; j++) { - if (isEnumerable.call(obj, syms[j])) { - xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); - } - } - } - return xs; -} - -},{"./util.inspect":6}],16:[function(require,module,exports){ -'use strict'; - -var GetIntrinsic = require('get-intrinsic'); -var callBound = require('call-bind/callBound'); -var inspect = require('object-inspect'); - -var $TypeError = GetIntrinsic('%TypeError%'); -var $WeakMap = GetIntrinsic('%WeakMap%', true); -var $Map = GetIntrinsic('%Map%', true); - -var $weakMapGet = callBound('WeakMap.prototype.get', true); -var $weakMapSet = callBound('WeakMap.prototype.set', true); -var $weakMapHas = callBound('WeakMap.prototype.has', true); -var $mapGet = callBound('Map.prototype.get', true); -var $mapSet = callBound('Map.prototype.set', true); -var $mapHas = callBound('Map.prototype.has', true); - -/* - * This function traverses the list returning the node corresponding to the - * given key. - * - * That node is also moved to the head of the list, so that if it's accessed - * again we don't need to traverse the whole list. By doing so, all the recently - * used nodes can be accessed relatively quickly. - */ -var listGetNode = function (list, key) { // eslint-disable-line consistent-return - for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { - if (curr.key === key) { - prev.next = curr.next; - curr.next = list.next; - list.next = curr; // eslint-disable-line no-param-reassign - return curr; - } - } -}; - -var listGet = function (objects, key) { - var node = listGetNode(objects, key); - return node && node.value; -}; -var listSet = function (objects, key, value) { - var node = listGetNode(objects, key); - if (node) { - node.value = value; - } else { - // Prepend the new node to the beginning of the list - objects.next = { // eslint-disable-line no-param-reassign - key: key, - next: objects.next, - value: value - }; - } -}; -var listHas = function (objects, key) { - return !!listGetNode(objects, key); -}; - -module.exports = function getSideChannel() { - var $wm; - var $m; - var $o; - var channel = { - assert: function (key) { - if (!channel.has(key)) { - throw new $TypeError('Side channel does not contain ' + inspect(key)); - } - }, - get: function (key) { // eslint-disable-line consistent-return - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapGet($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapGet($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listGet($o, key); - } - } - }, - has: function (key) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapHas($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapHas($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listHas($o, key); - } - } - return false; - }, - set: function (key, value) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if (!$wm) { - $wm = new $WeakMap(); - } - $weakMapSet($wm, key, value); - } else if ($Map) { - if (!$m) { - $m = new $Map(); - } - $mapSet($m, key, value); - } else { - if (!$o) { - /* - * Initialize the linked list as an empty node, so that we don't have - * to special-case handling of the first node: we can always refer to - * it as (previous node).next, instead of something like (list).head - */ - $o = { key: {}, next: null }; - } - listSet($o, key, value); - } - } - }; - return channel; -}; - -},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2) -}); diff --git a/node_modules/qs/lib/formats.js b/node_modules/qs/lib/formats.js deleted file mode 100644 index f36cf206..00000000 --- a/node_modules/qs/lib/formats.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -var replace = String.prototype.replace; -var percentTwenties = /%20/g; - -var Format = { - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' -}; - -module.exports = { - 'default': Format.RFC3986, - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return String(value); - } - }, - RFC1738: Format.RFC1738, - RFC3986: Format.RFC3986 -}; diff --git a/node_modules/qs/lib/index.js b/node_modules/qs/lib/index.js deleted file mode 100644 index 0d6a97dc..00000000 --- a/node_modules/qs/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -var stringify = require('./stringify'); -var parse = require('./parse'); -var formats = require('./formats'); - -module.exports = { - formats: formats, - parse: parse, - stringify: stringify -}; diff --git a/node_modules/qs/lib/parse.js b/node_modules/qs/lib/parse.js deleted file mode 100644 index a4ac4fa0..00000000 --- a/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,263 +0,0 @@ -'use strict'; - -var utils = require('./utils'); - -var has = Object.prototype.hasOwnProperty; -var isArray = Array.isArray; - -var defaults = { - allowDots: false, - allowPrototypes: false, - allowSparse: false, - arrayLimit: 20, - charset: 'utf-8', - charsetSentinel: false, - comma: false, - decoder: utils.decode, - delimiter: '&', - depth: 5, - ignoreQueryPrefix: false, - interpretNumericEntities: false, - parameterLimit: 1000, - parseArrays: true, - plainObjects: false, - strictNullHandling: false -}; - -var interpretNumericEntities = function (str) { - return str.replace(/&#(\d+);/g, function ($0, numberStr) { - return String.fromCharCode(parseInt(numberStr, 10)); - }); -}; - -var parseArrayValue = function (val, options) { - if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { - return val.split(','); - } - - return val; -}; - -// This is what browsers will submit when the ✓ character occurs in an -// application/x-www-form-urlencoded body and the encoding of the page containing -// the form is iso-8859-1, or when the submitted form has an accept-charset -// attribute of iso-8859-1. Presumably also with other charsets that do not contain -// the ✓ character, such as us-ascii. -var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') - -// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. -var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') - -var parseValues = function parseQueryStringValues(str, options) { - var obj = {}; - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - var skipIndex = -1; // Keep track of where the utf8 sentinel was found - var i; - - var charset = options.charset; - if (options.charsetSentinel) { - for (i = 0; i < parts.length; ++i) { - if (parts[i].indexOf('utf8=') === 0) { - if (parts[i] === charsetSentinel) { - charset = 'utf-8'; - } else if (parts[i] === isoSentinel) { - charset = 'iso-8859-1'; - } - skipIndex = i; - i = parts.length; // The eslint settings do not allow break; - } - } - } - - for (i = 0; i < parts.length; ++i) { - if (i === skipIndex) { - continue; - } - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder, charset, 'key'); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); - val = utils.maybeMap( - parseArrayValue(part.slice(pos + 1), options), - function (encodedVal) { - return options.decoder(encodedVal, defaults.decoder, charset, 'value'); - } - ); - } - - if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { - val = interpretNumericEntities(val); - } - - if (part.indexOf('[]=') > -1) { - val = isArray(val) ? [val] : val; - } - - if (has.call(obj, key)) { - obj[key] = utils.combine(obj[key], val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function (chain, val, options, valuesParsed) { - var leaf = valuesParsed ? val : parseArrayValue(val, options); - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]' && options.parseArrays) { - 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 (!options.parseArrays && cleanRoot === '') { - obj = { 0: leaf }; - } else if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else if (cleanRoot !== '__proto__') { - obj[cleanRoot] = leaf; - } - } - - leaf = obj; - } - - return leaf; -}; - -var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { - 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 = options.depth > 0 && 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 (options.depth > 0 && (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, valuesParsed); -}; - -var normalizeParseOptions = function normalizeParseOptions(opts) { - if (!opts) { - return defaults; - } - - if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } - var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; - - return { - allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, - allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, - allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, - arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, - decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, - delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, - // eslint-disable-next-line no-implicit-coercion, no-extra-parens - depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, - ignoreQueryPrefix: opts.ignoreQueryPrefix === true, - interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, - parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, - parseArrays: opts.parseArrays !== false, - plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; -}; - -module.exports = function (str, opts) { - var options = normalizeParseOptions(opts); - - 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, typeof str === 'string'); - obj = utils.merge(obj, newObj, options); - } - - if (options.allowSparse === true) { - return obj; - } - - return utils.compact(obj); -}; diff --git a/node_modules/qs/lib/stringify.js b/node_modules/qs/lib/stringify.js deleted file mode 100644 index 48ec0306..00000000 --- a/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,326 +0,0 @@ -'use strict'; - -var getSideChannel = require('side-channel'); -var utils = require('./utils'); -var formats = require('./formats'); -var has = Object.prototype.hasOwnProperty; - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - comma: 'comma', - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var isArray = Array.isArray; -var split = String.prototype.split; -var push = Array.prototype.push; -var pushToArray = function (arr, valueOrArray) { - push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); -}; - -var toISO = Date.prototype.toISOString; - -var defaultFormat = formats['default']; -var defaults = { - addQueryPrefix: false, - allowDots: false, - charset: 'utf-8', - charsetSentinel: false, - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - format: defaultFormat, - formatter: formats.formatters[defaultFormat], - // deprecated - indices: false, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var isNonNullishPrimitive = function isNonNullishPrimitive(v) { - return typeof v === 'string' - || typeof v === 'number' - || typeof v === 'boolean' - || typeof v === 'symbol' - || typeof v === 'bigint'; -}; - -var sentinel = {}; - -var stringify = function stringify( - object, - prefix, - generateArrayPrefix, - commaRoundTrip, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - sideChannel -) { - var obj = object; - - var tmpSc = sideChannel; - var step = 0; - var findFlag = false; - while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { - // Where object last appeared in the ref tree - var pos = tmpSc.get(object); - step += 1; - if (typeof pos !== 'undefined') { - if (pos === step) { - throw new RangeError('Cyclic object value'); - } else { - findFlag = true; // Break while - } - } - if (typeof tmpSc.get(sentinel) === 'undefined') { - step = 0; - } - } - - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (generateArrayPrefix === 'comma' && isArray(obj)) { - obj = utils.maybeMap(obj, function (value) { - if (value instanceof Date) { - return serializeDate(value); - } - return value; - }); - } - - if (obj === null) { - if (strictNullHandling) { - return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; - } - - obj = ''; - } - - if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { - if (encoder) { - var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); - if (generateArrayPrefix === 'comma' && encodeValuesOnly) { - var valuesArray = split.call(String(obj), ','); - var valuesJoined = ''; - for (var i = 0; i < valuesArray.length; ++i) { - valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); - } - return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; - } - return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (generateArrayPrefix === 'comma' && isArray(obj)) { - // we need to join elements in - objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; - } else if (isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; - - for (var j = 0; j < objKeys.length; ++j) { - var key = objKeys[j]; - var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; - - if (skipNulls && value === null) { - continue; - } - - var keyPrefix = isArray(obj) - ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix - : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); - - sideChannel.set(object, step); - var valueSideChannel = getSideChannel(); - valueSideChannel.set(sentinel, sideChannel); - pushToArray(values, stringify( - value, - keyPrefix, - generateArrayPrefix, - commaRoundTrip, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - valueSideChannel - )); - } - - return values; -}; - -var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { - if (!opts) { - return defaults; - } - - if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - var charset = opts.charset || defaults.charset; - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } - - var format = formats['default']; - if (typeof opts.format !== 'undefined') { - if (!has.call(formats.formatters, opts.format)) { - throw new TypeError('Unknown format option provided.'); - } - format = opts.format; - } - var formatter = formats.formatters[format]; - - var filter = defaults.filter; - if (typeof opts.filter === 'function' || isArray(opts.filter)) { - filter = opts.filter; - } - - return { - addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, - allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, - encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, - encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, - encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, - filter: filter, - format: format, - formatter: formatter, - serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, - skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, - sort: typeof opts.sort === 'function' ? opts.sort : null, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = normalizeStringifyOptions(opts); - - var objKeys; - var filter; - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (opts && opts.arrayFormat in arrayPrefixGenerators) { - arrayFormat = opts.arrayFormat; - } else if (opts && 'indices' in opts) { - arrayFormat = opts.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { - throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); - } - var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (options.sort) { - objKeys.sort(options.sort); - } - - var sideChannel = getSideChannel(); - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (options.skipNulls && obj[key] === null) { - continue; - } - pushToArray(keys, stringify( - obj[key], - key, - generateArrayPrefix, - commaRoundTrip, - options.strictNullHandling, - options.skipNulls, - options.encode ? options.encoder : null, - options.filter, - options.sort, - options.allowDots, - options.serializeDate, - options.format, - options.formatter, - options.encodeValuesOnly, - options.charset, - sideChannel - )); - } - - var joined = keys.join(options.delimiter); - var prefix = options.addQueryPrefix === true ? '?' : ''; - - if (options.charsetSentinel) { - if (options.charset === 'iso-8859-1') { - // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark - prefix += 'utf8=%26%2310003%3B&'; - } else { - // encodeURIComponent('✓') - prefix += 'utf8=%E2%9C%93&'; - } - } - - return joined.length > 0 ? prefix + joined : ''; -}; diff --git a/node_modules/qs/lib/utils.js b/node_modules/qs/lib/utils.js deleted file mode 100644 index 1e545381..00000000 --- a/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,252 +0,0 @@ -'use strict'; - -var formats = require('./formats'); - -var has = Object.prototype.hasOwnProperty; -var isArray = Array.isArray; - -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) { - while (queue.length > 1) { - var item = queue.pop(); - var obj = item.obj[item.prop]; - - if (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; - } - } -}; - -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) { - /* eslint no-param-reassign: 0 */ - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (isArray(target)) { - target.push(source); - } else if (target && typeof target === 'object') { - if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (!target || typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (isArray(target) && !isArray(source)) { - mergeTarget = arrayToObject(target, options); - } - - if (isArray(target) && isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - var targetItem = target[i]; - if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { - target[i] = merge(targetItem, 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, decoder, charset) { - var strWithoutPlus = str.replace(/\+/g, ' '); - if (charset === 'iso-8859-1') { - // unescape never throws, no try...catch needed: - return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); - } - // utf-8 - try { - return decodeURIComponent(strWithoutPlus); - } catch (e) { - return strWithoutPlus; - } -}; - -var encode = function encode(str, defaultEncoder, charset, kind, format) { - // 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 = str; - if (typeof str === 'symbol') { - string = Symbol.prototype.toString.call(str); - } else if (typeof str !== 'string') { - string = String(str); - } - - if (charset === 'iso-8859-1') { - return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { - return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; - }); - } - - 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 - || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) - ) { - 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)); - /* eslint operator-linebreak: [2, "before"] */ - 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); - } - } - } - - compactQueue(queue); - - return value; -}; - -var isRegExp = function isRegExp(obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -var isBuffer = function isBuffer(obj) { - if (!obj || typeof obj !== 'object') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; - -var combine = function combine(a, b) { - return [].concat(a, b); -}; - -var maybeMap = function maybeMap(val, fn) { - if (isArray(val)) { - var mapped = []; - for (var i = 0; i < val.length; i += 1) { - mapped.push(fn(val[i])); - } - return mapped; - } - return fn(val); -}; - -module.exports = { - arrayToObject: arrayToObject, - assign: assign, - combine: combine, - compact: compact, - decode: decode, - encode: encode, - isBuffer: isBuffer, - isRegExp: isRegExp, - maybeMap: maybeMap, - merge: merge -}; diff --git a/node_modules/qs/package.json b/node_modules/qs/package.json deleted file mode 100644 index 2ff42f37..00000000 --- a/node_modules/qs/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "qs", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/ljharb/qs", - "version": "6.11.0", - "repository": { - "type": "git", - "url": "https://github.com/ljharb/qs.git" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "main": "lib/index.js", - "contributors": [ - { - "name": "Jordan Harband", - "email": "ljharb@gmail.com", - "url": "http://ljharb.codes" - } - ], - "keywords": [ - "querystring", - "qs", - "query", - "url", - "parse", - "stringify" - ], - "engines": { - "node": ">=0.6" - }, - "dependencies": { - "side-channel": "^1.0.4" - }, - "devDependencies": { - "@ljharb/eslint-config": "^21.0.0", - "aud": "^2.0.0", - "browserify": "^16.5.2", - "eclint": "^2.8.1", - "eslint": "=8.8.0", - "evalmd": "^0.0.19", - "for-each": "^0.3.3", - "has-symbols": "^1.0.3", - "iconv-lite": "^0.5.1", - "in-publish": "^2.0.1", - "mkdirp": "^0.5.5", - "npmignore": "^0.3.0", - "nyc": "^10.3.2", - "object-inspect": "^1.12.2", - "qs-iconv": "^1.0.4", - "safe-publish-latest": "^2.0.0", - "safer-buffer": "^2.1.2", - "tape": "^5.5.3" - }, - "scripts": { - "prepack": "npmignore --auto --commentLines=autogenerated", - "prepublishOnly": "safe-publish-latest && npm run dist", - "prepublish": "not-in-publish || npm run prepublishOnly", - "pretest": "npm run --silent readme && npm run --silent lint", - "test": "npm run tests-only", - "tests-only": "nyc tape 'test/**/*.js'", - "posttest": "aud --production", - "readme": "evalmd README.md", - "postlint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)", - "lint": "eslint --ext=js,mjs .", - "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "license": "BSD-3-Clause", - "publishConfig": { - "ignore": [ - "!dist/*", - "bower.json", - "component.json", - ".github/workflows" - ] - } -} diff --git a/node_modules/qs/test/parse.js b/node_modules/qs/test/parse.js deleted file mode 100644 index 7d7b4dd8..00000000 --- a/node_modules/qs/test/parse.js +++ /dev/null @@ -1,855 +0,0 @@ -'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('arrayFormat: brackets allows only explicit arrays', function (st) { - st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'brackets' }), { a: 'b,c' }); - st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'brackets' }), { a: ['b', 'c'] }); - st.end(); - }); - - t.test('arrayFormat: indices allows only indexed arrays', function (st) { - st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'indices' }), { a: 'b,c' }); - st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'indices' }), { a: ['b', 'c'] }); - st.end(); - }); - - t.test('arrayFormat: comma allows only comma-separated arrays', function (st) { - st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'comma' }), { a: 'b,c' }); - st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'comma' }), { a: ['b', 'c'] }); - st.end(); - }); - - t.test('arrayFormat: repeat allows only repeated values', function (st) { - st.deepEqual(qs.parse('a[]=b&a[]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b,c', { arrayFormat: 'repeat' }), { a: 'b,c' }); - st.deepEqual(qs.parse('a=b&a=c', { arrayFormat: 'repeat' }), { a: ['b', 'c'] }); - 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.test('uses original key when depth = 0', function (st) { - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { depth: 0 }), { 'a[0]': 'b', 'a[1]': 'c' }); - st.deepEqual(qs.parse('a[0][0]=b&a[0][1]=c&a[1]=d&e=2', { depth: 0 }), { 'a[0][0]': 'b', 'a[0][1]': 'c', 'a[1]': 'd', e: '2' }); - st.end(); - }); - - t.test('uses original key when depth = false', function (st) { - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { depth: false }), { 'a[0]': 'b', 'a[1]': 'c' }); - st.deepEqual(qs.parse('a[0][0]=b&a[0][1]=c&a[1]=d&e=2', { depth: false }), { 'a[0][0]': 'b', 'a[0][1]': 'c', 'a[1]': 'd', e: '2' }); - 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.deepEqual(qs.parse('a[20]=a'), { a: ['a'] }); - st.deepEqual(qs.parse('a[21]=a'), { 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 sparse arrays', function (st) { - /* eslint no-sparse-arrays: 0 */ - st.deepEqual(qs.parse('a[4]=1&a[1]=2', { allowSparse: true }), { a: [, '2', , , '1'] }); - st.deepEqual(qs.parse('a[1][b][2][c]=1', { allowSparse: true }), { a: [, { b: [, , { c: '1' }] }] }); - st.deepEqual(qs.parse('a[1][2][3][c]=1', { allowSparse: true }), { a: [, [, , [, , , { c: '1' }]]] }); - st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { allowSparse: true }), { 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('parses jquery-param strings', function (st) { - // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' - var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; - var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; - st.deepEqual(qs.parse(encoded), expected); - 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', 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) { - var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); - st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); - st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); - - var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); - st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); - st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); - - 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 string with comma as array divider', function (st) { - st.deepEqual(qs.parse('foo=bar,tee', { comma: true }), { foo: ['bar', 'tee'] }); - st.deepEqual(qs.parse('foo[bar]=coffee,tee', { comma: true }), { foo: { bar: ['coffee', 'tee'] } }); - st.deepEqual(qs.parse('foo=', { comma: true }), { foo: '' }); - st.deepEqual(qs.parse('foo', { comma: true }), { foo: '' }); - st.deepEqual(qs.parse('foo', { comma: true, strictNullHandling: true }), { foo: null }); - - // test cases inversed from from stringify tests - st.deepEqual(qs.parse('a[0]=c'), { a: ['c'] }); - st.deepEqual(qs.parse('a[]=c'), { a: ['c'] }); - st.deepEqual(qs.parse('a[]=c', { comma: true }), { a: ['c'] }); - - st.deepEqual(qs.parse('a[0]=c&a[1]=d'), { a: ['c', 'd'] }); - st.deepEqual(qs.parse('a[]=c&a[]=d'), { a: ['c', 'd'] }); - st.deepEqual(qs.parse('a=c,d', { comma: true }), { a: ['c', 'd'] }); - - st.end(); - }); - - t.test('parses values with comma as array divider', function (st) { - st.deepEqual(qs.parse({ foo: 'bar,tee' }, { comma: false }), { foo: 'bar,tee' }); - st.deepEqual(qs.parse({ foo: 'bar,tee' }, { comma: true }), { foo: ['bar', 'tee'] }); - st.end(); - }); - - t.test('use number decoder, parses string that has one number with comma option enabled', function (st) { - var decoder = function (str, defaultDecoder, charset, type) { - if (!isNaN(Number(str))) { - return parseFloat(str); - } - return defaultDecoder(str, defaultDecoder, charset, type); - }; - - st.deepEqual(qs.parse('foo=1', { comma: true, decoder: decoder }), { foo: 1 }); - st.deepEqual(qs.parse('foo=0', { comma: true, decoder: decoder }), { foo: 0 }); - - st.end(); - }); - - t.test('parses brackets holds array of arrays when having two parts of strings with comma as array divider', function (st) { - st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=4,5,6', { comma: true }), { foo: [['1', '2', '3'], ['4', '5', '6']] }); - st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=', { comma: true }), { foo: [['1', '2', '3'], ''] }); - st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=,', { comma: true }), { foo: [['1', '2', '3'], ['', '']] }); - st.deepEqual(qs.parse('foo[]=1,2,3&foo[]=a', { comma: true }), { foo: [['1', '2', '3'], 'a'] }); - - st.end(); - }); - - t.test('parses comma delimited array while having percent-encoded comma treated as normal text', function (st) { - st.deepEqual(qs.parse('foo=a%2Cb', { comma: true }), { foo: 'a,b' }); - st.deepEqual(qs.parse('foo=a%2C%20b,d', { comma: true }), { foo: ['a, b', 'd'] }); - st.deepEqual(qs.parse('foo=a%2C%20b,c%2C%20d', { comma: true }), { foo: ['a, b', 'c, d'] }); - - 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 }), - { __proto__: null, a: { __proto__: null, b: 'c', toString: true } }, - 'can overwrite prototype with plainObjects true' - ); - - st.end(); - }); - - t.test('dunder proto is ignored', function (st) { - var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42'; - var result = qs.parse(payload, { allowPrototypes: true }); - - st.deepEqual( - result, - { - categories: { - length: '42' - } - }, - 'silent [[Prototype]] payload' - ); - - var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true }); - - st.deepEqual( - plainResult, - { - __proto__: null, - categories: { - __proto__: null, - length: '42' - } - }, - 'silent [[Prototype]] payload: plain objects' - ); - - var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true }); - - st.notOk(Array.isArray(query.categories), 'is not an array'); - st.notOk(query.categories instanceof Array, 'is not instanceof an array'); - st.deepEqual(query.categories, { some: { json: 'toInject' } }); - st.equal(JSON.stringify(query.categories), '{"some":{"json":"toInject"}}', 'stringifies as a non-array'); - - st.deepEqual( - qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }), - { - foo: { - bar: 'stuffs' - } - }, - 'hidden values' - ); - - st.deepEqual( - qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }), - { - __proto__: null, - foo: { - __proto__: null, - bar: 'stuffs' - } - }, - 'hidden values: plain objects' - ); - - 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 String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); - } - }), { 県: '大阪府' }); - 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.test('throws if an invalid charset is specified', function (st) { - st['throws'](function () { - qs.parse('a=b', { charset: 'foobar' }); - }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); - st.end(); - }); - - t.test('parses an iso-8859-1 string if asked to', function (st) { - st.deepEqual(qs.parse('%A2=%BD', { charset: 'iso-8859-1' }), { '¢': '½' }); - st.end(); - }); - - var urlEncodedCheckmarkInUtf8 = '%E2%9C%93'; - var urlEncodedOSlashInUtf8 = '%C3%B8'; - var urlEncodedNumCheckmark = '%26%2310003%3B'; - var urlEncodedNumSmiley = '%26%239786%3B'; - - t.test('prefers an utf-8 charset specified by the utf8 sentinel to a default charset of iso-8859-1', function (st) { - st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'iso-8859-1' }), { ø: 'ø' }); - st.end(); - }); - - t.test('prefers an iso-8859-1 charset specified by the utf8 sentinel to a default charset of utf-8', function (st) { - st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { 'ø': 'ø' }); - st.end(); - }); - - t.test('does not require the utf8 sentinel to be defined before the parameters whose decoding it affects', function (st) { - st.deepEqual(qs.parse('a=' + urlEncodedOSlashInUtf8 + '&utf8=' + urlEncodedNumCheckmark, { charsetSentinel: true, charset: 'utf-8' }), { a: 'ø' }); - st.end(); - }); - - t.test('should ignore an utf8 sentinel with an unknown value', function (st) { - st.deepEqual(qs.parse('utf8=foo&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true, charset: 'utf-8' }), { ø: 'ø' }); - st.end(); - }); - - t.test('uses the utf8 sentinel to switch to utf-8 when no default charset is given', function (st) { - st.deepEqual(qs.parse('utf8=' + urlEncodedCheckmarkInUtf8 + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { ø: 'ø' }); - st.end(); - }); - - t.test('uses the utf8 sentinel to switch to iso-8859-1 when no default charset is given', function (st) { - st.deepEqual(qs.parse('utf8=' + urlEncodedNumCheckmark + '&' + urlEncodedOSlashInUtf8 + '=' + urlEncodedOSlashInUtf8, { charsetSentinel: true }), { 'ø': 'ø' }); - st.end(); - }); - - t.test('interprets numeric entities in iso-8859-1 when `interpretNumericEntities`', function (st) { - st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1', interpretNumericEntities: true }), { foo: '☺' }); - st.end(); - }); - - t.test('handles a custom decoder returning `null`, in the `iso-8859-1` charset, when `interpretNumericEntities`', function (st) { - st.deepEqual(qs.parse('foo=&bar=' + urlEncodedNumSmiley, { - charset: 'iso-8859-1', - decoder: function (str, defaultDecoder, charset) { - return str ? defaultDecoder(str, defaultDecoder, charset) : null; - }, - interpretNumericEntities: true - }), { foo: null, bar: '☺' }); - st.end(); - }); - - t.test('does not interpret numeric entities in iso-8859-1 when `interpretNumericEntities` is absent', function (st) { - st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1' }), { foo: '☺' }); - st.end(); - }); - - t.test('does not interpret numeric entities when the charset is utf-8, even when `interpretNumericEntities`', function (st) { - st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'utf-8', interpretNumericEntities: true }), { foo: '☺' }); - st.end(); - }); - - t.test('does not interpret %uXXXX syntax in iso-8859-1 mode', function (st) { - st.deepEqual(qs.parse('%u263A=%u263A', { charset: 'iso-8859-1' }), { '%u263A': '%u263A' }); - st.end(); - }); - - t.test('allows for decoding keys and values differently', function (st) { - var decoder = function (str, defaultDecoder, charset, type) { - if (type === 'key') { - return defaultDecoder(str, defaultDecoder, charset, type).toLowerCase(); - } - if (type === 'value') { - return defaultDecoder(str, defaultDecoder, charset, type).toUpperCase(); - } - throw 'this should never happen! type: ' + type; - }; - - st.deepEqual(qs.parse('KeY=vAlUe', { decoder: decoder }), { key: 'VALUE' }); - st.end(); - }); - - t.end(); -}); diff --git a/node_modules/qs/test/stringify.js b/node_modules/qs/test/stringify.js deleted file mode 100644 index f0cdfefa..00000000 --- a/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,909 +0,0 @@ -'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; -var hasSymbols = require('has-symbols'); -var hasBigInt = typeof BigInt === 'function'; - -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('stringifies falsy values', function (st) { - st.equal(qs.stringify(undefined), ''); - st.equal(qs.stringify(null), ''); - st.equal(qs.stringify(null, { strictNullHandling: true }), ''); - st.equal(qs.stringify(false), ''); - st.equal(qs.stringify(0), ''); - st.end(); - }); - - t.test('stringifies symbols', { skip: !hasSymbols() }, function (st) { - st.equal(qs.stringify(Symbol.iterator), ''); - st.equal(qs.stringify([Symbol.iterator]), '0=Symbol%28Symbol.iterator%29'); - st.equal(qs.stringify({ a: Symbol.iterator }), 'a=Symbol%28Symbol.iterator%29'); - st.equal( - qs.stringify({ a: [Symbol.iterator] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), - 'a[]=Symbol%28Symbol.iterator%29' - ); - st.end(); - }); - - t.test('stringifies bigints', { skip: !hasBigInt }, function (st) { - var three = BigInt(3); - var encodeWithN = function (value, defaultEncoder, charset) { - var result = defaultEncoder(value, defaultEncoder, charset); - return typeof value === 'bigint' ? result + 'n' : result; - }; - st.equal(qs.stringify(three), ''); - st.equal(qs.stringify([three]), '0=3'); - st.equal(qs.stringify([three], { encoder: encodeWithN }), '0=3n'); - st.equal(qs.stringify({ a: three }), 'a=3'); - st.equal(qs.stringify({ a: three }, { encoder: encodeWithN }), 'a=3n'); - st.equal( - qs.stringify({ a: [three] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), - 'a[]=3' - ); - st.equal( - qs.stringify({ a: [three] }, { encodeValuesOnly: true, encoder: encodeWithN, arrayFormat: 'brackets' }), - 'a[]=3n' - ); - 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 nested falsy values', function (st) { - st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); - st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); - st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); - 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'] }, { arrayFormat: 'comma' }), - 'a=b%2Cc%2Cd', - 'comma => comma' - ); - 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 an array value with one item vs multiple items', function (st) { - st.test('non-array item', function (s2t) { - s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a=c'); - s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a=c'); - s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c'); - s2t.equal(qs.stringify({ a: 'c' }, { encodeValuesOnly: true }), 'a=c'); - - s2t.end(); - }); - - st.test('array with a single item', function (s2t) { - s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[0]=c'); - s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[]=c'); - s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c'); - s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true, arrayFormat: 'comma', commaRoundTrip: true }), 'a[]=c'); // so it parses back as an array - s2t.equal(qs.stringify({ a: ['c'] }, { encodeValuesOnly: true }), 'a[0]=c'); - - s2t.end(); - }); - - st.test('array with multiple items', function (s2t) { - s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[0]=c&a[1]=d'); - s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[]=c&a[]=d'); - s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a=c,d'); - s2t.equal(qs.stringify({ a: ['c', 'd'] }, { encodeValuesOnly: true }), 'a[0]=c&a[1]=d'); - - s2t.end(); - }); - - st.end(); - }); - - t.test('stringifies a nested array value', function (st) { - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[b][0]=c&a[b][1]=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[b][]=c&a[b][]=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c,d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true }), 'a[b][0]=c&a[b][1]=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, encodeValuesOnly: true, 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, encodeValuesOnly: true, arrayFormat: 'brackets' } - ), - 'a.b[]=c&a.b[]=d', - 'brackets: stringifies with dots + brackets' - ); - st.equal( - qs.stringify( - { a: { b: ['c', 'd'] } }, - { allowDots: true, encodeValuesOnly: true, arrayFormat: 'comma' } - ), - 'a.b=c,d', - 'comma: stringifies with dots + comma' - ); - st.equal( - qs.stringify( - { a: { b: ['c', 'd'] } }, - { allowDots: true, encodeValuesOnly: true } - ), - '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', // a[0][b]=c - 'indices => brackets' - ); - st.equal( - qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), - 'a%5B%5D%5Bb%5D=c', // a[][b]=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] }, { encodeValuesOnly: true, arrayFormat: 'indices' }), - 'a[0][b]=1&a[1]=2&a[2]=3', - 'indices => indices' - ); - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), - 'a[][b]=1&a[]=2&a[]=3', - 'brackets => brackets' - ); - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'comma' }), - '???', - 'brackets => brackets', - { skip: 'TODO: figure out what this should do' } - ); - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true }), - '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 an empty array in different arrayFormat', function (st) { - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false }), 'b[0]=&c=c'); - // arrayFormat default - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices' }), 'b[0]=&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets' }), 'b[]=&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat' }), 'b=&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma' }), 'b=&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', commaRoundTrip: true }), 'b[]=&c=c'); - // with strictNullHandling - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices', strictNullHandling: true }), 'b[0]&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets', strictNullHandling: true }), 'b[]&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat', strictNullHandling: true }), 'b&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', strictNullHandling: true }), 'b&c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', strictNullHandling: true, commaRoundTrip: true }), 'b[]&c=c'); - // with skipNulls - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'indices', skipNulls: true }), 'c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'brackets', skipNulls: true }), 'c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'repeat', skipNulls: true }), 'c=c'); - st.equal(qs.stringify({ a: [], b: [null], c: 'c' }, { encode: false, arrayFormat: 'comma', skipNulls: true }), 'c=c'); - - 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('does not 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('does not crash when parsing circular references', function (st) { - var a = {}; - a.b = a; - - st['throws']( - function () { qs.stringify({ 'foo[bar]': 'baz', 'foo[baz]': a }); }, - /RangeError: Cyclic object value/, - 'cyclic values throw' - ); - - var circular = { - a: 'value' - }; - circular.a = circular; - st['throws']( - function () { qs.stringify(circular); }, - /RangeError: Cyclic object value/, - 'cyclic values throw' - ); - - var arr = ['a']; - st.doesNotThrow( - function () { qs.stringify({ x: arr, y: arr }); }, - 'non-cyclic values do not throw' - ); - - st.end(); - }); - - t.test('non-circular duplicated references can still work', function (st) { - var hourOfDay = { - 'function': 'hour_of_day' - }; - - var p1 = { - 'function': 'gte', - arguments: [hourOfDay, 0] - }; - var p2 = { - 'function': 'lte', - arguments: [hourOfDay, 23] - }; - - st.equal( - qs.stringify({ filters: { $and: [p1, p2] } }, { encodeValuesOnly: true }), - 'filters[$and][0][function]=gte&filters[$and][0][arguments][0][function]=hour_of_day&filters[$and][0][arguments][1]=0&filters[$and][1][function]=lte&filters[$and][1][arguments][0][function]=hour_of_day&filters[$and][1][arguments][1]=23' - ); - - 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.equal(qs.stringify({ a: SaferBuffer.from('a b') }, { - encoder: function (buffer) { - return buffer; - } - }), 'a=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.equal( - qs.stringify( - { a: [date] }, - { - serializeDate: function (d) { return d.getTime(); }, - arrayFormat: 'comma' - } - ), - 'a=' + date.getTime(), - 'works with arrayFormat comma' - ); - st.equal( - qs.stringify( - { a: [date] }, - { - serializeDate: function (d) { return d.getTime(); }, - arrayFormat: 'comma', - commaRoundTrip: true - } - ), - 'a%5B%5D=' + date.getTime(), - 'works with arrayFormat comma' - ); - - st.end(); - }); - - t.test('RFC 1738 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC1738 }), 'a+b=a+b'); - - st.equal(qs.stringify({ 'foo(ref)': 'bar' }, { format: qs.formats.RFC1738 }), 'foo(ref)=bar'); - - 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC3986 }), 'a%20b=a%20b'); - - st.end(); - }); - - t.test('Backward compatibility to RFC 3986', function (st) { - st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); - st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }), 'a%20b=a%20b'); - - 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('throws if an invalid charset is specified', function (st) { - st['throws'](function () { - qs.stringify({ a: 'b' }, { charset: 'foobar' }); - }, new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined')); - st.end(); - }); - - t.test('respects a charset of iso-8859-1', function (st) { - st.equal(qs.stringify({ æ: 'æ' }, { charset: 'iso-8859-1' }), '%E6=%E6'); - st.end(); - }); - - t.test('encodes unrepresentable chars as numeric entities in iso-8859-1 mode', function (st) { - st.equal(qs.stringify({ a: '☺' }, { charset: 'iso-8859-1' }), 'a=%26%239786%3B'); - st.end(); - }); - - t.test('respects an explicit charset of utf-8 (the default)', function (st) { - st.equal(qs.stringify({ a: 'æ' }, { charset: 'utf-8' }), 'a=%C3%A6'); - st.end(); - }); - - t.test('adds the right sentinel when instructed to and the charset is utf-8', function (st) { - st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'utf-8' }), 'utf8=%E2%9C%93&a=%C3%A6'); - st.end(); - }); - - t.test('adds the right sentinel when instructed to and the charset is iso-8859-1', function (st) { - st.equal(qs.stringify({ a: 'æ' }, { charsetSentinel: true, charset: 'iso-8859-1' }), 'utf8=%26%2310003%3B&a=%E6'); - st.end(); - }); - - t.test('does not mutate the options argument', function (st) { - var options = {}; - qs.stringify({}, options); - st.deepEqual(options, {}); - st.end(); - }); - - t.test('strictNullHandling works with custom filter', function (st) { - var filter = function (prefix, value) { - return value; - }; - - var options = { strictNullHandling: true, filter: filter }; - st.equal(qs.stringify({ key: null }, options), 'key'); - st.end(); - }); - - t.test('strictNullHandling works with null serializeDate', function (st) { - var serializeDate = function () { - return null; - }; - var options = { strictNullHandling: true, serializeDate: serializeDate }; - var date = new Date(); - st.equal(qs.stringify({ key: date }, options), 'key'); - st.end(); - }); - - t.test('allows for encoding keys and values differently', function (st) { - var encoder = function (str, defaultEncoder, charset, type) { - if (type === 'key') { - return defaultEncoder(str, defaultEncoder, charset, type).toLowerCase(); - } - if (type === 'value') { - return defaultEncoder(str, defaultEncoder, charset, type).toUpperCase(); - } - throw 'this should never happen! type: ' + type; - }; - - st.deepEqual(qs.stringify({ KeY: 'vAlUe' }, { encoder: encoder }), 'key=VALUE'); - st.end(); - }); - - t.test('objects inside arrays', function (st) { - var obj = { a: { b: { c: 'd', e: 'f' } } }; - var withArray = { a: { b: [{ c: 'd', e: 'f' }] } }; - - st.equal(qs.stringify(obj, { encode: false }), 'a[b][c]=d&a[b][e]=f', 'no array, no arrayFormat'); - st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'bracket' }), 'a[b][c]=d&a[b][e]=f', 'no array, bracket'); - st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'indices' }), 'a[b][c]=d&a[b][e]=f', 'no array, indices'); - st.equal(qs.stringify(obj, { encode: false, arrayFormat: 'comma' }), 'a[b][c]=d&a[b][e]=f', 'no array, comma'); - - st.equal(qs.stringify(withArray, { encode: false }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, no arrayFormat'); - st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'bracket' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, bracket'); - st.equal(qs.stringify(withArray, { encode: false, arrayFormat: 'indices' }), 'a[b][0][c]=d&a[b][0][e]=f', 'array, indices'); - st.equal( - qs.stringify(withArray, { encode: false, arrayFormat: 'comma' }), - '???', - 'array, comma', - { skip: 'TODO: figure out what this should do' } - ); - - st.end(); - }); - - t.test('stringifies sparse arrays', function (st) { - /* eslint no-sparse-arrays: 0 */ - st.equal(qs.stringify({ a: [, '2', , , '1'] }, { encodeValuesOnly: true }), 'a[1]=2&a[4]=1'); - st.equal(qs.stringify({ a: [, { b: [, , { c: '1' }] }] }, { encodeValuesOnly: true }), 'a[1][b][2][c]=1'); - st.equal(qs.stringify({ a: [, [, , [, , , { c: '1' }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c]=1'); - st.equal(qs.stringify({ a: [, [, , [, , , { c: [, '1'] }]]] }, { encodeValuesOnly: true }), 'a[1][2][3][c][1]=1'); - - st.end(); - }); - - t.end(); -}); diff --git a/node_modules/qs/test/utils.js b/node_modules/qs/test/utils.js deleted file mode 100644 index aa84dfdc..00000000 --- a/node_modules/qs/test/utils.js +++ /dev/null @@ -1,136 +0,0 @@ -'use strict'; - -var test = require('tape'); -var inspect = require('object-inspect'); -var SaferBuffer = require('safer-buffer').Buffer; -var forEach = require('for-each'); -var utils = require('../lib/utils'); - -test('merge()', function (t) { - t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); - - t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); - - 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'] }); - - var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); - t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); - - t.test( - 'avoids invoking array setters unnecessarily', - { skip: typeof Object.defineProperty !== 'function' }, - function (st) { - var setCount = 0; - var getCount = 0; - var observed = []; - Object.defineProperty(observed, 0, { - get: function () { - getCount += 1; - return { bar: 'baz' }; - }, - set: function () { setCount += 1; } - }); - utils.merge(observed, [null]); - st.equal(setCount, 0); - st.equal(getCount, 1); - observed[0] = observed[0]; // eslint-disable-line no-self-assign - st.equal(setCount, 1); - st.equal(getCount, 2); - st.end(); - } - ); - - 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(); -}); - -test('combine()', function (t) { - t.test('both arrays', function (st) { - var a = [1]; - var b = [2]; - var combined = utils.combine(a, b); - - st.deepEqual(a, [1], 'a is not mutated'); - st.deepEqual(b, [2], 'b is not mutated'); - st.notEqual(a, combined, 'a !== combined'); - st.notEqual(b, combined, 'b !== combined'); - st.deepEqual(combined, [1, 2], 'combined is a + b'); - - st.end(); - }); - - t.test('one array, one non-array', function (st) { - var aN = 1; - var a = [aN]; - var bN = 2; - var b = [bN]; - - var combinedAnB = utils.combine(aN, b); - st.deepEqual(b, [bN], 'b is not mutated'); - st.notEqual(aN, combinedAnB, 'aN + b !== aN'); - st.notEqual(a, combinedAnB, 'aN + b !== a'); - st.notEqual(bN, combinedAnB, 'aN + b !== bN'); - st.notEqual(b, combinedAnB, 'aN + b !== b'); - st.deepEqual([1, 2], combinedAnB, 'first argument is array-wrapped when not an array'); - - var combinedABn = utils.combine(a, bN); - st.deepEqual(a, [aN], 'a is not mutated'); - st.notEqual(aN, combinedABn, 'a + bN !== aN'); - st.notEqual(a, combinedABn, 'a + bN !== a'); - st.notEqual(bN, combinedABn, 'a + bN !== bN'); - st.notEqual(b, combinedABn, 'a + bN !== b'); - st.deepEqual([1, 2], combinedABn, 'second argument is array-wrapped when not an array'); - - st.end(); - }); - - t.test('neither is an array', function (st) { - var combined = utils.combine(1, 2); - st.notEqual(1, combined, '1 + 2 !== 1'); - st.notEqual(2, combined, '1 + 2 !== 2'); - st.deepEqual([1, 2], combined, 'both arguments are array-wrapped when not an array'); - - st.end(); - }); - - t.end(); -}); - -test('isBuffer()', function (t) { - forEach([null, undefined, true, false, '', 'abc', 42, 0, NaN, {}, [], function () {}, /a/g], function (x) { - t.equal(utils.isBuffer(x), false, inspect(x) + ' is not a buffer'); - }); - - var fakeBuffer = { constructor: Buffer }; - t.equal(utils.isBuffer(fakeBuffer), false, 'fake buffer is not a buffer'); - - var saferBuffer = SaferBuffer.from('abc'); - t.equal(utils.isBuffer(saferBuffer), true, 'SaferBuffer instance is a buffer'); - - var buffer = Buffer.from && Buffer.alloc ? Buffer.from('abc') : new Buffer('abc'); - t.equal(utils.isBuffer(buffer), true, 'real Buffer instance is a buffer'); - t.end(); -}); diff --git a/node_modules/range-parser/HISTORY.md b/node_modules/range-parser/HISTORY.md deleted file mode 100644 index 70a973d8..00000000 --- a/node_modules/range-parser/HISTORY.md +++ /dev/null @@ -1,56 +0,0 @@ -1.2.1 / 2019-05-10 -================== - - * Improve error when `str` is not a string - -1.2.0 / 2016-06-01 -================== - - * Add `combine` option to combine overlapping ranges - -1.1.0 / 2016-05-13 -================== - - * Fix incorrectly returning -1 when there is at least one valid range - * perf: remove internal function - -1.0.3 / 2015-10-29 -================== - - * perf: enable strict mode - -1.0.2 / 2014-09-08 -================== - - * Support Node.js 0.6 - -1.0.1 / 2014-09-07 -================== - - * Move repository to jshttp - -1.0.0 / 2013-12-11 -================== - - * Add repository to package.json - * Add MIT license - -0.0.4 / 2012-06-17 -================== - - * Change ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * Fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * Add `.type` - -0.0.1 / 2012-06-11 -================== - - * Initial release diff --git a/node_modules/range-parser/LICENSE b/node_modules/range-parser/LICENSE deleted file mode 100644 index 35999543..00000000 --- a/node_modules/range-parser/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 TJ Holowaychuk -Copyright (c) 2015-2016 Douglas Christopher Wilson - -```js -var parseRange = require('range-parser') -``` - -### parseRange(size, header, options) - -Parse the given `header` string where `size` is the maximum size of the resource. -An array of ranges will be returned or negative numbers indicating an error parsing. - - * `-2` signals a malformed header string - * `-1` signals an unsatisfiable range - - - -```js -// parse header from request -var range = parseRange(size, req.headers.range) - -// the type of the range -if (range.type === 'bytes') { - // the ranges - range.forEach(function (r) { - // do something with r.start and r.end - }) -} -``` - -#### Options - -These properties are accepted in the options object. - -##### combine - -Specifies if overlapping & adjacent ranges should be combined, defaults to `false`. -When `true`, ranges will be combined and returned as if they were specified that -way in the header. - - - -```js -parseRange(100, 'bytes=50-55,0-10,5-10,56-60', { combine: true }) -// => [ -// { start: 0, end: 10 }, -// { start: 50, end: 60 } -// ] -``` - -## License - -[MIT](LICENSE) - -[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/range-parser/master -[coveralls-url]: https://coveralls.io/r/jshttp/range-parser?branch=master -[node-image]: https://badgen.net/npm/node/range-parser -[node-url]: https://nodejs.org/en/download -[npm-downloads-image]: https://badgen.net/npm/dm/range-parser -[npm-url]: https://npmjs.org/package/range-parser -[npm-version-image]: https://badgen.net/npm/v/range-parser -[travis-image]: https://badgen.net/travis/jshttp/range-parser/master -[travis-url]: https://travis-ci.org/jshttp/range-parser diff --git a/node_modules/range-parser/index.js b/node_modules/range-parser/index.js deleted file mode 100644 index b7dc5c0f..00000000 --- a/node_modules/range-parser/index.js +++ /dev/null @@ -1,162 +0,0 @@ -/*! - * range-parser - * Copyright(c) 2012-2014 TJ Holowaychuk - * Copyright(c) 2015-2016 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = rangeParser - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @param {Object} [options] - * @return {Array} - * @public - */ - -function rangeParser (size, str, options) { - if (typeof str !== 'string') { - throw new TypeError('argument str must be a string') - } - - var index = str.indexOf('=') - - if (index === -1) { - return -2 - } - - // split the range string - var arr = str.slice(index + 1).split(',') - var ranges = [] - - // add ranges type - ranges.type = str.slice(0, index) - - // parse all ranges - for (var i = 0; i < arr.length; i++) { - var range = arr[i].split('-') - var start = parseInt(range[0], 10) - var end = parseInt(range[1], 10) - - // -nnn - if (isNaN(start)) { - start = size - end - end = size - 1 - // nnn- - } else if (isNaN(end)) { - end = size - 1 - } - - // limit last-byte-pos to current length - if (end > size - 1) { - end = size - 1 - } - - // invalid or unsatisifiable - if (isNaN(start) || isNaN(end) || start > end || start < 0) { - continue - } - - // add range - ranges.push({ - start: start, - end: end - }) - } - - if (ranges.length < 1) { - // unsatisifiable - return -1 - } - - return options && options.combine - ? combineRanges(ranges) - : ranges -} - -/** - * Combine overlapping & adjacent ranges. - * @private - */ - -function combineRanges (ranges) { - var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart) - - for (var j = 0, i = 1; i < ordered.length; i++) { - var range = ordered[i] - var current = ordered[j] - - if (range.start > current.end + 1) { - // next range - ordered[++j] = range - } else if (range.end > current.end) { - // extend range - current.end = range.end - current.index = Math.min(current.index, range.index) - } - } - - // trim ordered array - ordered.length = j + 1 - - // generate combined range - var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) - - // copy ranges type - combined.type = ranges.type - - return combined -} - -/** - * Map function to add index value to ranges. - * @private - */ - -function mapWithIndex (range, index) { - return { - start: range.start, - end: range.end, - index: index - } -} - -/** - * Map function to remove index value from ranges. - * @private - */ - -function mapWithoutIndex (range) { - return { - start: range.start, - end: range.end - } -} - -/** - * Sort function to sort ranges by index. - * @private - */ - -function sortByRangeIndex (a, b) { - return a.index - b.index -} - -/** - * Sort function to sort ranges by start position. - * @private - */ - -function sortByRangeStart (a, b) { - return a.start - b.start -} diff --git a/node_modules/range-parser/package.json b/node_modules/range-parser/package.json deleted file mode 100644 index abea6d85..00000000 --- a/node_modules/range-parser/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "range-parser", - "author": "TJ Holowaychuk (http://tjholowaychuk.com)", - "description": "Range header field string parser", - "version": "1.2.1", - "contributors": [ - "Douglas Christopher Wilson ", - "James Wyatt Cready ", - "Jonathan Ong (http://jongleberry.com)" - ], - "license": "MIT", - "keywords": [ - "range", - "parser", - "http" - ], - "repository": "jshttp/range-parser", - "devDependencies": { - "deep-equal": "1.0.1", - "eslint": "5.16.0", - "eslint-config-standard": "12.0.0", - "eslint-plugin-markdown": "1.0.0", - "eslint-plugin-import": "2.17.2", - "eslint-plugin-node": "8.0.1", - "eslint-plugin-promise": "4.1.1", - "eslint-plugin-standard": "4.0.0", - "mocha": "6.1.4", - "nyc": "14.1.1" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "test-travis": "nyc --reporter=text npm test" - } -} diff --git a/node_modules/raw-body/HISTORY.md b/node_modules/raw-body/HISTORY.md deleted file mode 100644 index 0b6b8373..00000000 --- a/node_modules/raw-body/HISTORY.md +++ /dev/null @@ -1,303 +0,0 @@ -2.5.1 / 2022-02-28 -================== - - * Fix error on early async hooks implementations - -2.5.0 / 2022-02-21 -================== - - * Prevent loss of async hooks context - * Prevent hanging when stream is not readable - * deps: http-errors@2.0.0 - - deps: depd@2.0.0 - - deps: statuses@2.0.1 - -2.4.3 / 2022-02-14 -================== - - * deps: bytes@3.1.2 - -2.4.2 / 2021-11-16 -================== - - * deps: bytes@3.1.1 - * deps: http-errors@1.8.1 - - deps: setprototypeof@1.2.0 - - deps: toidentifier@1.0.1 - -2.4.1 / 2019-06-25 -================== - - * deps: http-errors@1.7.3 - - deps: inherits@2.0.4 - -2.4.0 / 2019-04-17 -================== - - * deps: bytes@3.1.0 - - Add petabyte (`pb`) support - * deps: http-errors@1.7.2 - - Set constructor name when possible - - deps: setprototypeof@1.1.1 - - deps: statuses@'>= 1.5.0 < 2' - * deps: iconv-lite@0.4.24 - - Added encoding MIK - -2.3.3 / 2018-05-08 -================== - - * deps: http-errors@1.6.3 - - deps: depd@~1.1.2 - - deps: setprototypeof@1.1.0 - - deps: statuses@'>= 1.3.1 < 2' - * deps: iconv-lite@0.4.23 - - Fix loading encoding with year appended - - Fix deprecation warnings on Node.js 10+ - -2.3.2 / 2017-09-09 -================== - - * deps: iconv-lite@0.4.19 - - Fix ISO-8859-1 regression - - Update Windows-1255 - -2.3.1 / 2017-09-07 -================== - - * deps: bytes@3.0.0 - * deps: http-errors@1.6.2 - - deps: depd@1.1.1 - * perf: skip buffer decoding on overage chunk - -2.3.0 / 2017-08-04 -================== - - * Add TypeScript definitions - * Use `http-errors` for standard emitted errors - * deps: bytes@2.5.0 - * deps: iconv-lite@0.4.18 - - Add support for React Native - - Add a warning if not loaded as utf-8 - - Fix CESU-8 decoding in Node.js 8 - - Improve speed of ISO-8859-1 encoding - -2.2.0 / 2017-01-02 -================== - - * deps: iconv-lite@0.4.15 - - Added encoding MS-31J - - Added encoding MS-932 - - Added encoding MS-936 - - Added encoding MS-949 - - Added encoding MS-950 - - Fix GBK/GB18030 handling of Euro character - -2.1.7 / 2016-06-19 -================== - - * deps: bytes@2.4.0 - * perf: remove double-cleanup on happy path - -2.1.6 / 2016-03-07 -================== - - * deps: bytes@2.3.0 - - Drop partial bytes on all parsed units - - Fix parsing byte string that looks like hex - -2.1.5 / 2015-11-30 -================== - - * deps: bytes@2.2.0 - * deps: iconv-lite@0.4.13 - -2.1.4 / 2015-09-27 -================== - - * Fix masking critical errors from `iconv-lite` - * deps: iconv-lite@0.4.12 - - Fix CESU-8 decoding in Node.js 4.x - -2.1.3 / 2015-09-12 -================== - - * Fix sync callback when attaching data listener causes sync read - - Node.js 0.10 compatibility issue - -2.1.2 / 2015-07-05 -================== - - * Fix error stack traces to skip `makeError` - * deps: iconv-lite@0.4.11 - - Add encoding CESU-8 - -2.1.1 / 2015-06-14 -================== - - * Use `unpipe` module for unpiping requests - -2.1.0 / 2015-05-28 -================== - - * deps: iconv-lite@0.4.10 - - Improved UTF-16 endianness detection - - Leading BOM is now removed when decoding - - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails - -2.0.2 / 2015-05-21 -================== - - * deps: bytes@2.1.0 - - Slight optimizations - -2.0.1 / 2015-05-10 -================== - - * Fix a false-positive when unpiping in Node.js 0.8 - -2.0.0 / 2015-05-08 -================== - - * Return a promise without callback instead of thunk - * deps: bytes@2.0.1 - - units no longer case sensitive when parsing - -1.3.4 / 2015-04-15 -================== - - * Fix hanging callback if request aborts during read - * deps: iconv-lite@0.4.8 - - Add encoding alias UNICODE-1-1-UTF-7 - -1.3.3 / 2015-02-08 -================== - - * deps: iconv-lite@0.4.7 - - Gracefully support enumerables on `Object.prototype` - -1.3.2 / 2015-01-20 -================== - - * deps: iconv-lite@0.4.6 - - Fix rare aliases of single-byte encodings - -1.3.1 / 2014-11-21 -================== - - * deps: iconv-lite@0.4.5 - - Fix Windows-31J and X-SJIS encoding support - -1.3.0 / 2014-07-20 -================== - - * Fully unpipe the stream on error - - Fixes `Cannot switch to old mode now` error on Node.js 0.10+ - -1.2.3 / 2014-07-20 -================== - - * deps: iconv-lite@0.4.4 - - Added encoding UTF-7 - -1.2.2 / 2014-06-19 -================== - - * Send invalid encoding error to callback - -1.2.1 / 2014-06-15 -================== - - * deps: iconv-lite@0.4.3 - - Added encodings UTF-16BE and UTF-16 with BOM - -1.2.0 / 2014-06-13 -================== - - * Passing string as `options` interpreted as encoding - * Support all encodings from `iconv-lite` - -1.1.7 / 2014-06-12 -================== - - * use `string_decoder` module from npm - -1.1.6 / 2014-05-27 -================== - - * check encoding for old streams1 - * support node.js < 0.10.6 - -1.1.5 / 2014-05-14 -================== - - * bump bytes - -1.1.4 / 2014-04-19 -================== - - * allow true as an option - * bump bytes - -1.1.3 / 2014-03-02 -================== - - * fix case when length=null - -1.1.2 / 2013-12-01 -================== - - * be less strict on state.encoding check - -1.1.1 / 2013-11-27 -================== - - * add engines - -1.1.0 / 2013-11-27 -================== - - * add err.statusCode and err.type - * allow for encoding option to be true - * pause the stream instead of dumping on error - * throw if the stream's encoding is set - -1.0.1 / 2013-11-19 -================== - - * dont support streams1, throw if dev set encoding - -1.0.0 / 2013-11-17 -================== - - * rename `expected` option to `length` - -0.2.0 / 2013-11-15 -================== - - * republish - -0.1.1 / 2013-11-15 -================== - - * use bytes - -0.1.0 / 2013-11-11 -================== - - * generator support - -0.0.3 / 2013-10-10 -================== - - * update repo - -0.0.2 / 2013-09-14 -================== - - * dump stream on bad headers - * listen to events after defining received and buffers - -0.0.1 / 2013-09-14 -================== - - * Initial release diff --git a/node_modules/raw-body/LICENSE b/node_modules/raw-body/LICENSE deleted file mode 100644 index 1029a7a7..00000000 --- a/node_modules/raw-body/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2014 Jonathan Ong -Copyright (c) 2014-2022 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/raw-body/README.md b/node_modules/raw-body/README.md deleted file mode 100644 index 695c6607..00000000 --- a/node_modules/raw-body/README.md +++ /dev/null @@ -1,223 +0,0 @@ -# raw-body - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build status][github-actions-ci-image]][github-actions-ci-url] -[![Test coverage][coveralls-image]][coveralls-url] - -Gets the entire buffer of a stream either as a `Buffer` or a string. -Validates the stream's length against an expected length and maximum limit. -Ideal for parsing request bodies. - -## Install - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install raw-body -``` - -### TypeScript - -This module includes a [TypeScript](https://www.typescriptlang.org/) -declaration file to enable auto complete in compatible editors and type -information for TypeScript projects. This module depends on the Node.js -types, so install `@types/node`: - -```sh -$ npm install @types/node -``` - -## API - -```js -var getRawBody = require('raw-body') -``` - -### getRawBody(stream, [options], [callback]) - -**Returns a promise if no callback specified and global `Promise` exists.** - -Options: - -- `length` - The length of the stream. - If the contents of the stream do not add up to this length, - an `400` error code is returned. -- `limit` - The byte limit of the body. - This is the number of bytes or any string format supported by - [bytes](https://www.npmjs.com/package/bytes), - for example `1000`, `'500kb'` or `'3mb'`. - If the body ends up being larger than this limit, - a `413` error code is returned. -- `encoding` - The encoding to use to decode the body into a string. - By default, a `Buffer` instance will be returned when no encoding is specified. - Most likely, you want `utf-8`, so setting `encoding` to `true` will decode as `utf-8`. - You can use any type of encoding supported by [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme). - -You can also pass a string in place of options to just specify the encoding. - -If an error occurs, the stream will be paused, everything unpiped, -and you are responsible for correctly disposing the stream. -For HTTP requests, you may need to finish consuming the stream if -you want to keep the socket open for future requests. For streams -that use file descriptors, you should `stream.destroy()` or -`stream.close()` to prevent leaks. - -## Errors - -This module creates errors depending on the error condition during reading. -The error may be an error from the underlying Node.js implementation, but is -otherwise an error created by this module, which has the following attributes: - - * `limit` - the limit in bytes - * `length` and `expected` - the expected length of the stream - * `received` - the received bytes - * `encoding` - the invalid encoding - * `status` and `statusCode` - the corresponding status code for the error - * `type` - the error type - -### Types - -The errors from this module have a `type` property which allows for the programmatic -determination of the type of error returned. - -#### encoding.unsupported - -This error will occur when the `encoding` option is specified, but the value does -not map to an encoding supported by the [iconv-lite](https://www.npmjs.org/package/iconv-lite#readme) -module. - -#### entity.too.large - -This error will occur when the `limit` option is specified, but the stream has -an entity that is larger. - -#### request.aborted - -This error will occur when the request stream is aborted by the client before -reading the body has finished. - -#### request.size.invalid - -This error will occur when the `length` option is specified, but the stream has -emitted more bytes. - -#### stream.encoding.set - -This error will occur when the given stream has an encoding set on it, making it -a decoded stream. The stream should not have an encoding set and is expected to -emit `Buffer` objects. - -#### stream.not.readable - -This error will occur when the given stream is not readable. - -## Examples - -### Simple Express example - -```js -var contentType = require('content-type') -var express = require('express') -var getRawBody = require('raw-body') - -var app = express() - -app.use(function (req, res, next) { - getRawBody(req, { - length: req.headers['content-length'], - limit: '1mb', - encoding: contentType.parse(req).parameters.charset - }, function (err, string) { - if (err) return next(err) - req.text = string - next() - }) -}) - -// now access req.text -``` - -### Simple Koa example - -```js -var contentType = require('content-type') -var getRawBody = require('raw-body') -var koa = require('koa') - -var app = koa() - -app.use(function * (next) { - this.text = yield getRawBody(this.req, { - length: this.req.headers['content-length'], - limit: '1mb', - encoding: contentType.parse(this.req).parameters.charset - }) - yield next -}) - -// now access this.text -``` - -### Using as a promise - -To use this library as a promise, simply omit the `callback` and a promise is -returned, provided that a global `Promise` is defined. - -```js -var getRawBody = require('raw-body') -var http = require('http') - -var server = http.createServer(function (req, res) { - getRawBody(req) - .then(function (buf) { - res.statusCode = 200 - res.end(buf.length + ' bytes submitted') - }) - .catch(function (err) { - res.statusCode = 500 - res.end(err.message) - }) -}) - -server.listen(3000) -``` - -### Using with TypeScript - -```ts -import * as getRawBody from 'raw-body'; -import * as http from 'http'; - -const server = http.createServer((req, res) => { - getRawBody(req) - .then((buf) => { - res.statusCode = 200; - res.end(buf.length + ' bytes submitted'); - }) - .catch((err) => { - res.statusCode = err.statusCode; - res.end(err.message); - }); -}); - -server.listen(3000); -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/raw-body.svg -[npm-url]: https://npmjs.org/package/raw-body -[node-version-image]: https://img.shields.io/node/v/raw-body.svg -[node-version-url]: https://nodejs.org/en/download/ -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/raw-body/master.svg -[coveralls-url]: https://coveralls.io/r/stream-utils/raw-body?branch=master -[downloads-image]: https://img.shields.io/npm/dm/raw-body.svg -[downloads-url]: https://npmjs.org/package/raw-body -[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/raw-body/ci/master?label=ci -[github-actions-ci-url]: https://github.com/jshttp/stream-utils/raw-body?query=workflow%3Aci diff --git a/node_modules/raw-body/SECURITY.md b/node_modules/raw-body/SECURITY.md deleted file mode 100644 index 2421efc4..00000000 --- a/node_modules/raw-body/SECURITY.md +++ /dev/null @@ -1,24 +0,0 @@ -# Security Policies and Procedures - -## Reporting a Bug - -The `raw-body` team and community take all security bugs seriously. Thank you -for improving the security of Express. We appreciate your efforts and -responsible disclosure and will make every effort to acknowledge your -contributions. - -Report security bugs by emailing the current owners of `raw-body`. This information -can be found in the npm registry using the command `npm owner ls raw-body`. -If unsure or unable to get the information from the above, open an issue -in the [project issue tracker](https://github.com/stream-utils/raw-body/issues) -asking for the current contact information. - -To ensure the timely response to your report, please ensure that the entirety -of the report is contained within the email body and not solely behind a web -link or an attachment. - -At least one owner will acknowledge your email within 48 hours, and will send a -more detailed response within 48 hours indicating the next steps in handling -your report. After the initial reply to your report, the owners will -endeavor to keep you informed of the progress towards a fix and full -announcement, and may ask for additional information or guidance. diff --git a/node_modules/raw-body/index.d.ts b/node_modules/raw-body/index.d.ts deleted file mode 100644 index dcbbebd4..00000000 --- a/node_modules/raw-body/index.d.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Readable } from 'stream'; - -declare namespace getRawBody { - export type Encoding = string | true; - - export interface Options { - /** - * The expected length of the stream. - */ - length?: number | string | null; - /** - * The byte limit of the body. This is the number of bytes or any string - * format supported by `bytes`, for example `1000`, `'500kb'` or `'3mb'`. - */ - limit?: number | string | null; - /** - * The encoding to use to decode the body into a string. By default, a - * `Buffer` instance will be returned when no encoding is specified. Most - * likely, you want `utf-8`, so setting encoding to `true` will decode as - * `utf-8`. You can use any type of encoding supported by `iconv-lite`. - */ - encoding?: Encoding | null; - } - - export interface RawBodyError extends Error { - /** - * The limit in bytes. - */ - limit?: number; - /** - * The expected length of the stream. - */ - length?: number; - expected?: number; - /** - * The received bytes. - */ - received?: number; - /** - * The encoding. - */ - encoding?: string; - /** - * The corresponding status code for the error. - */ - status: number; - statusCode: number; - /** - * The error type. - */ - type: string; - } -} - -/** - * Gets the entire buffer of a stream either as a `Buffer` or a string. - * Validates the stream's length against an expected length and maximum - * limit. Ideal for parsing request bodies. - */ -declare function getRawBody( - stream: Readable, - callback: (err: getRawBody.RawBodyError, body: Buffer) => void -): void; - -declare function getRawBody( - stream: Readable, - options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding, - callback: (err: getRawBody.RawBodyError, body: string) => void -): void; - -declare function getRawBody( - stream: Readable, - options: getRawBody.Options, - callback: (err: getRawBody.RawBodyError, body: Buffer) => void -): void; - -declare function getRawBody( - stream: Readable, - options: (getRawBody.Options & { encoding: getRawBody.Encoding }) | getRawBody.Encoding -): Promise; - -declare function getRawBody( - stream: Readable, - options?: getRawBody.Options -): Promise; - -export = getRawBody; diff --git a/node_modules/raw-body/index.js b/node_modules/raw-body/index.js deleted file mode 100644 index a8f537f3..00000000 --- a/node_modules/raw-body/index.js +++ /dev/null @@ -1,329 +0,0 @@ -/*! - * raw-body - * Copyright(c) 2013-2014 Jonathan Ong - * Copyright(c) 2014-2022 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var asyncHooks = tryRequireAsyncHooks() -var bytes = require('bytes') -var createError = require('http-errors') -var iconv = require('iconv-lite') -var unpipe = require('unpipe') - -/** - * Module exports. - * @public - */ - -module.exports = getRawBody - -/** - * Module variables. - * @private - */ - -var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: / - -/** - * Get the decoder for a given encoding. - * - * @param {string} encoding - * @private - */ - -function getDecoder (encoding) { - if (!encoding) return null - - try { - return iconv.getDecoder(encoding) - } catch (e) { - // error getting decoder - if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e - - // the encoding was not found - throw createError(415, 'specified encoding unsupported', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } -} - -/** - * Get the raw body of a stream (typically HTTP). - * - * @param {object} stream - * @param {object|string|function} [options] - * @param {function} [callback] - * @public - */ - -function getRawBody (stream, options, callback) { - var done = callback - var opts = options || {} - - if (options === true || typeof options === 'string') { - // short cut for encoding - opts = { - encoding: options - } - } - - if (typeof options === 'function') { - done = options - opts = {} - } - - // validate callback is a function, if provided - if (done !== undefined && typeof done !== 'function') { - throw new TypeError('argument callback must be a function') - } - - // require the callback without promises - if (!done && !global.Promise) { - throw new TypeError('argument callback is required') - } - - // get encoding - var encoding = opts.encoding !== true - ? opts.encoding - : 'utf-8' - - // convert the limit to an integer - var limit = bytes.parse(opts.limit) - - // convert the expected length to an integer - var length = opts.length != null && !isNaN(opts.length) - ? parseInt(opts.length, 10) - : null - - if (done) { - // classic callback style - return readStream(stream, encoding, length, limit, wrap(done)) - } - - return new Promise(function executor (resolve, reject) { - readStream(stream, encoding, length, limit, function onRead (err, buf) { - if (err) return reject(err) - resolve(buf) - }) - }) -} - -/** - * Halt a stream. - * - * @param {Object} stream - * @private - */ - -function halt (stream) { - // unpipe everything from the stream - unpipe(stream) - - // pause stream - if (typeof stream.pause === 'function') { - stream.pause() - } -} - -/** - * Read the data from the stream. - * - * @param {object} stream - * @param {string} encoding - * @param {number} length - * @param {number} limit - * @param {function} callback - * @public - */ - -function readStream (stream, encoding, length, limit, callback) { - var complete = false - var sync = true - - // check the length and limit options. - // note: we intentionally leave the stream paused, - // so users should handle the stream themselves. - if (limit !== null && length !== null && length > limit) { - return done(createError(413, 'request entity too large', { - expected: length, - length: length, - limit: limit, - type: 'entity.too.large' - })) - } - - // streams1: assert request encoding is buffer. - // streams2+: assert the stream encoding is buffer. - // stream._decoder: streams1 - // state.encoding: streams2 - // state.decoder: streams2, specifically < 0.10.6 - var state = stream._readableState - if (stream._decoder || (state && (state.encoding || state.decoder))) { - // developer error - return done(createError(500, 'stream encoding should not be set', { - type: 'stream.encoding.set' - })) - } - - if (typeof stream.readable !== 'undefined' && !stream.readable) { - return done(createError(500, 'stream is not readable', { - type: 'stream.not.readable' - })) - } - - var received = 0 - var decoder - - try { - decoder = getDecoder(encoding) - } catch (err) { - return done(err) - } - - var buffer = decoder - ? '' - : [] - - // attach listeners - stream.on('aborted', onAborted) - stream.on('close', cleanup) - stream.on('data', onData) - stream.on('end', onEnd) - stream.on('error', onEnd) - - // mark sync section complete - sync = false - - function done () { - var args = new Array(arguments.length) - - // copy arguments - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - // mark complete - complete = true - - if (sync) { - process.nextTick(invokeCallback) - } else { - invokeCallback() - } - - function invokeCallback () { - cleanup() - - if (args[0]) { - // halt the stream on error - halt(stream) - } - - callback.apply(null, args) - } - } - - function onAborted () { - if (complete) return - - done(createError(400, 'request aborted', { - code: 'ECONNABORTED', - expected: length, - length: length, - received: received, - type: 'request.aborted' - })) - } - - function onData (chunk) { - if (complete) return - - received += chunk.length - - if (limit !== null && received > limit) { - done(createError(413, 'request entity too large', { - limit: limit, - received: received, - type: 'entity.too.large' - })) - } else if (decoder) { - buffer += decoder.write(chunk) - } else { - buffer.push(chunk) - } - } - - function onEnd (err) { - if (complete) return - if (err) return done(err) - - if (length !== null && received !== length) { - done(createError(400, 'request size did not match content length', { - expected: length, - length: length, - received: received, - type: 'request.size.invalid' - })) - } else { - var string = decoder - ? buffer + (decoder.end() || '') - : Buffer.concat(buffer) - done(null, string) - } - } - - function cleanup () { - buffer = null - - stream.removeListener('aborted', onAborted) - stream.removeListener('data', onData) - stream.removeListener('end', onEnd) - stream.removeListener('error', onEnd) - stream.removeListener('close', cleanup) - } -} - -/** - * Try to require async_hooks - * @private - */ - -function tryRequireAsyncHooks () { - try { - return require('async_hooks') - } catch (e) { - return {} - } -} - -/** - * Wrap function with async resource, if possible. - * AsyncResource.bind static method backported. - * @private - */ - -function wrap (fn) { - var res - - // create anonymous resource - if (asyncHooks.AsyncResource) { - res = new asyncHooks.AsyncResource(fn.name || 'bound-anonymous-fn') - } - - // incompatible node.js - if (!res || !res.runInAsyncScope) { - return fn - } - - // return bound function - return res.runInAsyncScope.bind(res, fn, null) -} diff --git a/node_modules/raw-body/package.json b/node_modules/raw-body/package.json deleted file mode 100644 index 50fc90ad..00000000 --- a/node_modules/raw-body/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "raw-body", - "description": "Get and validate the raw body of a readable stream.", - "version": "2.5.1", - "author": "Jonathan Ong (http://jongleberry.com)", - "contributors": [ - "Douglas Christopher Wilson ", - "Raynos " - ], - "license": "MIT", - "repository": "stream-utils/raw-body", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "devDependencies": { - "bluebird": "3.7.2", - "eslint": "7.32.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.4", - "eslint-plugin-markdown": "2.2.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "5.2.0", - "eslint-plugin-standard": "4.1.0", - "mocha": "9.2.1", - "nyc": "15.1.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.8" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "SECURITY.md", - "index.d.ts", - "index.js" - ], - "scripts": { - "lint": "eslint .", - "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/", - "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - } -} diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE deleted file mode 100644 index 037cbb4e..00000000 --- a/node_modules/readdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.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/readdirp/README.md b/node_modules/readdirp/README.md deleted file mode 100644 index 465593c9..00000000 --- a/node_modules/readdirp/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp) - -Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**. - - -```sh -npm install readdirp -``` - -```javascript -const readdirp = require('readdirp'); - -// Use streams to achieve small RAM & CPU footprint. -// 1) Streams example with for-await. -for await (const entry of readdirp('.')) { - const {path} = entry; - console.log(`${JSON.stringify({path})}`); -} - -// 2) Streams example, non for-await. -// Print out all JS files along with their size within the current folder & subfolders. -readdirp('.', {fileFilter: '*.js', alwaysStat: true}) - .on('data', (entry) => { - const {path, stats: {size}} = entry; - console.log(`${JSON.stringify({path, size})}`); - }) - // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted - .on('warn', error => console.error('non-fatal error', error)) - .on('error', error => console.error('fatal error', error)) - .on('end', () => console.log('done')); - -// 3) Promise example. More RAM and CPU than streams / for-await. -const files = await readdirp.promise('.'); -console.log(files.map(file => file.path)); - -// Other options. -readdirp('test', { - fileFilter: '*.js', - directoryFilter: ['!.git', '!*modules'] - // directoryFilter: (di) => di.basename.length === 9 - type: 'files_directories', - depth: 1 -}); -``` - -For more examples, check out `examples` directory. - -## API - -`const stream = readdirp(root[, options])` — **Stream API** - -- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo) -- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`). -- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir. -- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user. -- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed. -- `on('end')` — we are done. Called when all entries were found and no more will be emitted. -- `on('close')` — stream is destroyed via `stream.destroy()`. - 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](https://nodejs.org/api/stream.html) - or the [stream-handbook](https://github.com/substack/stream-handbook) - -`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo). - -First argument is awalys `root`, path in which to start reading and recursing into subdirectories. - -### options - -- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings. - - **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 [picomatch](https://github.com/micromatch/picomatch), 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. -- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into. -- `depth: 5`: depth at which to stop recursing even if more subdirectories are found -- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes. -- `alwaysStat: false`: always return `stats` property for every file. Default is `false`, readdirp will return `Dirent` entries. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0. -- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat` - -### `EntryInfo` - -Has the following properties: - -- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root) -- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found -- `basename: 'react.js'`: name of the file/directory -- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false` -- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true` - -## Changelog - -- 3.5 (Oct 13, 2020) disallows recursive directory-based symlinks. - Before, it could have entered infinite loop. -- 3.4 (Mar 19, 2020) adds support for directory-based symlinks. -- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping. -- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic. -- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions". -- 3.0 brings huge performance improvements and stream backpressure support. -- Upgrading 2.x to 3.x: - - Signature changed from `readdirp(options)` to `readdirp(root, options)` - - Replaced callback API with promise API. - - Renamed `entryType` option to `type` - - Renamed `entryType: 'both'` to `'files_directories'` - - `EntryInfo` - - Renamed `stat` to `stats` - - Emitted only when `alwaysStat: true` - - `dirent` is emitted instead of `stats` by default with `alwaysStat: false` - - Renamed `name` to `basename` - - Removed `parentDir` and `fullParentDir` properties -- Supported node.js versions: - - 3.x: node 8+ - - 2.x: node 0.6+ - -## License - -Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller () - -MIT License, see [LICENSE](LICENSE) file. diff --git a/node_modules/readdirp/index.d.ts b/node_modules/readdirp/index.d.ts deleted file mode 100644 index cbbd76ca..00000000 --- a/node_modules/readdirp/index.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -// TypeScript Version: 3.2 - -/// - -import * as fs from 'fs'; -import { Readable } from 'stream'; - -declare namespace readdir { - interface EntryInfo { - path: string; - fullPath: string; - basename: string; - stats?: fs.Stats; - dirent?: fs.Dirent; - } - - interface ReaddirpOptions { - root?: string; - fileFilter?: string | string[] | ((entry: EntryInfo) => boolean); - directoryFilter?: string | string[] | ((entry: EntryInfo) => boolean); - type?: 'files' | 'directories' | 'files_directories' | 'all'; - lstat?: boolean; - depth?: number; - alwaysStat?: boolean; - } - - interface ReaddirpStream extends Readable, AsyncIterable { - read(): EntryInfo; - [Symbol.asyncIterator](): AsyncIterableIterator; - } - - function promise( - root: string, - options?: ReaddirpOptions - ): Promise; -} - -declare function readdir( - root: string, - options?: readdir.ReaddirpOptions -): readdir.ReaddirpStream; - -export = readdir; diff --git a/node_modules/readdirp/index.js b/node_modules/readdirp/index.js deleted file mode 100644 index cf739b2d..00000000 --- a/node_modules/readdirp/index.js +++ /dev/null @@ -1,287 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const { Readable } = require('stream'); -const sysPath = require('path'); -const { promisify } = require('util'); -const picomatch = require('picomatch'); - -const readdir = promisify(fs.readdir); -const stat = promisify(fs.stat); -const lstat = promisify(fs.lstat); -const realpath = promisify(fs.realpath); - -/** - * @typedef {Object} EntryInfo - * @property {String} path - * @property {String} fullPath - * @property {fs.Stats=} stats - * @property {fs.Dirent=} dirent - * @property {String} basename - */ - -const BANG = '!'; -const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR'; -const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]); -const FILE_TYPE = 'files'; -const DIR_TYPE = 'directories'; -const FILE_DIR_TYPE = 'files_directories'; -const EVERYTHING_TYPE = 'all'; -const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; - -const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code); -const [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10)); -const wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5)); - -const normalizeFilter = filter => { - if (filter === undefined) return; - if (typeof filter === 'function') return filter; - - if (typeof filter === 'string') { - const glob = picomatch(filter.trim()); - return entry => glob(entry.basename); - } - - if (Array.isArray(filter)) { - const positive = []; - const negative = []; - for (const item of filter) { - const trimmed = item.trim(); - if (trimmed.charAt(0) === BANG) { - negative.push(picomatch(trimmed.slice(1))); - } else { - positive.push(picomatch(trimmed)); - } - } - - if (negative.length > 0) { - if (positive.length > 0) { - return entry => - positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename)); - } - return entry => !negative.some(f => f(entry.basename)); - } - return entry => positive.some(f => f(entry.basename)); - } -}; - -class ReaddirpStream extends Readable { - static get defaultOptions() { - return { - root: '.', - /* eslint-disable no-unused-vars */ - fileFilter: (path) => true, - directoryFilter: (path) => true, - /* eslint-enable no-unused-vars */ - type: FILE_TYPE, - lstat: false, - depth: 2147483648, - alwaysStat: false - }; - } - - constructor(options = {}) { - super({ - objectMode: true, - autoDestroy: true, - highWaterMark: options.highWaterMark || 4096 - }); - const opts = { ...ReaddirpStream.defaultOptions, ...options }; - const { root, type } = opts; - - this._fileFilter = normalizeFilter(opts.fileFilter); - this._directoryFilter = normalizeFilter(opts.directoryFilter); - - const statMethod = opts.lstat ? lstat : stat; - // Use bigint stats if it's windows and stat() supports options (node 10+). - if (wantBigintFsStats) { - this._stat = path => statMethod(path, { bigint: true }); - } else { - this._stat = statMethod; - } - - this._maxDepth = opts.depth; - this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); - this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); - this._wantsEverything = type === EVERYTHING_TYPE; - this._root = sysPath.resolve(root); - this._isDirent = ('Dirent' in fs) && !opts.alwaysStat; - this._statsProp = this._isDirent ? 'dirent' : 'stats'; - this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent }; - - // Launch stream with one parent, the root dir. - this.parents = [this._exploreDir(root, 1)]; - this.reading = false; - this.parent = undefined; - } - - async _read(batch) { - if (this.reading) return; - this.reading = true; - - try { - while (!this.destroyed && batch > 0) { - const { path, depth, files = [] } = this.parent || {}; - - if (files.length > 0) { - const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path)); - for (const entry of await Promise.all(slice)) { - if (this.destroyed) return; - - const entryType = await this._getEntryType(entry); - if (entryType === 'directory' && this._directoryFilter(entry)) { - if (depth <= this._maxDepth) { - this.parents.push(this._exploreDir(entry.fullPath, depth + 1)); - } - - if (this._wantsDir) { - this.push(entry); - batch--; - } - } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) { - if (this._wantsFile) { - this.push(entry); - batch--; - } - } - } - } else { - const parent = this.parents.pop(); - if (!parent) { - this.push(null); - break; - } - this.parent = await parent; - if (this.destroyed) return; - } - } - } catch (error) { - this.destroy(error); - } finally { - this.reading = false; - } - } - - async _exploreDir(path, depth) { - let files; - try { - files = await readdir(path, this._rdOptions); - } catch (error) { - this._onError(error); - } - return { files, depth, path }; - } - - async _formatEntry(dirent, path) { - let entry; - try { - const basename = this._isDirent ? dirent.name : dirent; - const fullPath = sysPath.resolve(sysPath.join(path, basename)); - entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename }; - entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); - } catch (err) { - this._onError(err); - } - return entry; - } - - _onError(err) { - if (isNormalFlowError(err) && !this.destroyed) { - this.emit('warn', err); - } else { - this.destroy(err); - } - } - - async _getEntryType(entry) { - // entry may be undefined, because a warning or an error were emitted - // and the statsProp is undefined - const stats = entry && entry[this._statsProp]; - if (!stats) { - return; - } - if (stats.isFile()) { - return 'file'; - } - if (stats.isDirectory()) { - return 'directory'; - } - if (stats && stats.isSymbolicLink()) { - const full = entry.fullPath; - try { - const entryRealPath = await realpath(full); - const entryRealPathStats = await lstat(entryRealPath); - if (entryRealPathStats.isFile()) { - return 'file'; - } - if (entryRealPathStats.isDirectory()) { - const len = entryRealPath.length; - if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) { - const recursiveError = new Error( - `Circular symlink detected: "${full}" points to "${entryRealPath}"` - ); - recursiveError.code = RECURSIVE_ERROR_CODE; - return this._onError(recursiveError); - } - return 'directory'; - } - } catch (error) { - this._onError(error); - } - } - } - - _includeAsFile(entry) { - const stats = entry && entry[this._statsProp]; - - return stats && this._wantsEverything && !stats.isDirectory(); - } -} - -/** - * @typedef {Object} ReaddirpArguments - * @property {Function=} fileFilter - * @property {Function=} directoryFilter - * @property {String=} type - * @property {Number=} depth - * @property {String=} root - * @property {Boolean=} lstat - * @property {Boolean=} bigint - */ - -/** - * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. - * @param {String} root Root directory - * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth - */ -const readdirp = (root, options = {}) => { - let type = options.entryType || options.type; - if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility - if (type) options.type = type; - if (!root) { - throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)'); - } else if (typeof root !== 'string') { - throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)'); - } else if (type && !ALL_TYPES.includes(type)) { - throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`); - } - - options.root = root; - return new ReaddirpStream(options); -}; - -const readdirpPromise = (root, options = {}) => { - return new Promise((resolve, reject) => { - const files = []; - readdirp(root, options) - .on('data', entry => files.push(entry)) - .on('end', () => resolve(files)) - .on('error', error => reject(error)); - }); -}; - -readdirp.promise = readdirpPromise; -readdirp.ReaddirpStream = ReaddirpStream; -readdirp.default = readdirp; - -module.exports = readdirp; diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json deleted file mode 100644 index dba53888..00000000 --- a/node_modules/readdirp/package.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "name": "readdirp", - "description": "Recursive version of fs.readdir with streaming API.", - "version": "3.6.0", - "homepage": "https://github.com/paulmillr/readdirp", - "repository": { - "type": "git", - "url": "git://github.com/paulmillr/readdirp.git" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/paulmillr/readdirp/issues" - }, - "author": "Thorsten Lorenz (thlorenz.com)", - "contributors": [ - "Thorsten Lorenz (thlorenz.com)", - "Paul Miller (https://paulmillr.com)" - ], - "main": "index.js", - "engines": { - "node": ">=8.10.0" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "recursive", - "fs", - "stream", - "streams", - "readdir", - "filesystem", - "find", - "filter" - ], - "scripts": { - "dtslint": "dtslint", - "nyc": "nyc", - "mocha": "mocha --exit", - "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", - "test": "npm run lint && nyc npm run mocha" - }, - "dependencies": { - "picomatch": "^2.2.1" - }, - "devDependencies": { - "@types/node": "^14", - "chai": "^4.2", - "chai-subset": "^1.6", - "dtslint": "^3.3.0", - "eslint": "^7.0.0", - "mocha": "^7.1.1", - "nyc": "^15.0.0", - "rimraf": "^3.0.0", - "typescript": "^4.0.3" - }, - "nyc": { - "reporter": [ - "html", - "text" - ] - }, - "eslintConfig": { - "root": true, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 9, - "sourceType": "script" - }, - "env": { - "node": true, - "es6": true - }, - "rules": { - "array-callback-return": "error", - "no-empty": [ - "error", - { - "allowEmptyCatch": true - } - ], - "no-else-return": [ - "error", - { - "allowElseIf": false - } - ], - "no-lonely-if": "error", - "no-var": "error", - "object-shorthand": "error", - "prefer-arrow-callback": [ - "error", - { - "allowNamedFunctions": true - } - ], - "prefer-const": [ - "error", - { - "ignoreReadBeforeAssign": true - } - ], - "prefer-destructuring": [ - "error", - { - "object": true, - "array": false - } - ], - "prefer-spread": "error", - "prefer-template": "error", - "radix": "error", - "semi": "error", - "strict": "error", - "quotes": [ - "error", - "single" - ] - } - } -} diff --git a/node_modules/relateurl/README.md b/node_modules/relateurl/README.md deleted file mode 100644 index fb65fca3..00000000 --- a/node_modules/relateurl/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# relateurl [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][david-image]][david-url] - -> Minify URLs by converting them from absolute to relative. - -If you were to use this library on a website like `http://example.com/dir1/dir1-1/`, you would get results such as: - -| Before | After | -| :------------------------------------------ | :----------------------------------- | -| `http://example.com/dir1/dir1-2/index.html` | `../dir1-2/` | -| `http://example.com/dir2/dir2-1/` | `/dir2/dir2-1/` | -| `http://example.com/dir1/dir1-1/` | ` ` | -| `https://example.com/dir1/dir1-1/` | `https://example.com/dir1/dir1-1/` | -| `http://google.com:80/dir/` | `//google.com/dir/` | -| `../../../../../../../../#anchor` | `/#anchor` | - -**All string parsing.** *No* directory browsing. It is thoroughly tested, very fast and lightweight with zero external dependencies. - -## Getting Started - -This utility requires [Node.js](http://nodejs.org/) `>= 0.10`. To install, type this at the command line: -``` -npm install relateurl --save-dev -``` - -### Options - -#### options.defaultPorts -Type: `Object` -Default value: `{ftp:21, http:80, https:443}` - -Extend the list with any ports you need. Any URLs containing these default ports will have them removed. Example: `http://example.com:80/` will become `http://example.com/`. - -#### options.directoryIndexes -Type: `Array` -Default value: `["index.html"]` - -Extend the list with any resources you need. Works with [`options.removeDirectoryIndexes`](#options.removeDirectoryIndexes). - -#### options.ignore_www -Type: `Boolean` -Default value: `false` - -This will, for example, consider any domains containing `http://www.example.com/` to be related to any that contain `http://example.com/`. - -#### options.output -Type: constant or `String` -Choices: `RelateUrl.ABSOLUTE`,`RelateUrl.PATH_RELATIVE`,`RelateUrl.ROOT_RELATIVE`,`RelateUrl.SHORTEST` -Choices: `"absolute"`,`"pathRelative"`,`"rootRelative"`,`"shortest"` -Default value: `RelateUrl.SHORTEST` - -`RelateUrl.ABSOLUTE` will produce an absolute URL. Overrides [`options.schemeRelative`](#options.schemeRelative) with a value of `false`. -`RelateUrl.PATH_RELATIVE` will produce something like `../child-of-parent/etc/`. -`RelateUrl.ROOT_RELATIVE` will produce something like `/child-of-root/etc/`. -`RelateUrl.SHORTEST` will choose whichever is shortest between root- and path-relative. - -#### options.rejectedSchemes -Type: `Array` -Default value: `["data","javascript","mailto"]` - -Extend the list with any additional schemes. Example: `javascript:something` will not be modified. - -#### options.removeAuth -Type: `Boolean` -Default value: `false` - -Remove user authentication information from the output URL. - -#### options.removeDirectoryIndexes -Type: `Boolean` -Default value: `true` - -Remove any resources that match any found in [`options.directoryIndexes`](#options.directoryIndexes). - -#### options.removeEmptyQueries -Type: `Boolean` -Default value: `false` - -Remove empty query variables. Example: `http://domain.com/?var1&var2=&var3=asdf` will become `http://domain.com/?var3=adsf`. This does not apply to unrelated URLs (with other protocols, auths, hosts and/or ports). - -#### options.removeRootTrailingSlash -Type: `Boolean` -Default value: `true` - -Remove trailing slashes from root paths. Example: `http://domain.com/?var` will become `http://domain.com?var` while `http://domain.com/dir/?var` will not be modified. - -#### options.schemeRelative -Type: `Boolean` -Default value: `true` - -Output URLs relative to the scheme. Example: `http://example.com/` will become `//example.com/`. - -#### options.site -Type: `String` -Default value: `undefined` - -An options-based version of the [`from`](#examples) argument. If both are specified, `from` takes priority. - -#### options.slashesDenoteHost -Type: `Boolean` -Default value: `true` - -Passed to Node's [`url.parse`](http://nodejs.org/api/url.html#url_url_parse_urlstr_parsequerystring_slashesdenotehost). - -### Examples -This library can be used as a [function for single-use](#single-instance) or as a [class for multiple conversions](#reusable-instances). - -Upon successful conversion, a `String` will be returned. If an issue is encountered while parsing `from`, an error will be thrown. - -#### Single Instance -```js -var RelateUrl = require("relateurl"); - -var result = RelateUrl.relate(from, to, options); -``` - -#### Reusable Instances -```js -var RelateUrl = require("relateurl"); - -var instance = new RelateUrl(from, options); - -var result1 = instance.relate(to1); -var result2 = instance.relate(to2, customOptions); -var result3 = instance.relate(to3); -``` - -## FAQ -1. **Why bother writing/using this?** -To aid in further minifying HTML, mainly for the purpose of faster page loads and SEO. It's been integrated into [HTMLMinifier](https://github.com/kangax/html-minifier). - -2. **Why not just use Node's `url.parse`, `url.resolve` and `path.relative`?** -`url.parse` *is* used, but `url.resolve` and `path.relative` are both slower and less powerful than this library. - - -## Release History -* 0.2.7 Node v6 support -* 0.2.6 minor enhancements -* 0.2.5 added `options.removeRootTrailingSlash` -* 0.2.4 added `options.site` -* 0.2.3 added browserify npm-script -* 0.2.2 removed task runner -* 0.2.1 shorten resource- and query-relative URLs, test variations list with other site URLs -* 0.2.0 code cleanup, `options.removeEmptyQueries=true` only applied to unrelated URLs -* 0.1.0 initial release - - -## Roadmap -* 0.2.8 check if queries are the same, regardless of param order -* 0.2.8 possible [scheme exclusions](http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml) such as `tel:` -* 0.2.8 decipher and return invalid input (special cases) to complete test suite -* 0.3.0 test `options.slashesDenoteHost=false`, add something like `options.externalDirectoryIndexes=[]` for external sites - - -[npm-image]: https://img.shields.io/npm/v/relateurl.svg -[npm-url]: https://npmjs.org/package/relateurl -[travis-image]: https://img.shields.io/travis/stevenvachon/relateurl.svg -[travis-url]: https://travis-ci.org/stevenvachon/relateurl -[david-image]: https://img.shields.io/david/stevenvachon/relateurl.svg -[david-url]: https://david-dm.org/stevenvachon/relateurl diff --git a/node_modules/relateurl/lib/constants.js b/node_modules/relateurl/lib/constants.js deleted file mode 100644 index d4cc8dd6..00000000 --- a/node_modules/relateurl/lib/constants.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; - -module.exports = -{ - // Output - ABSOLUTE: "absolute", - PATH_RELATIVE: "pathRelative", - ROOT_RELATIVE: "rootRelative", - SHORTEST: "shortest" -}; diff --git a/node_modules/relateurl/lib/format.js b/node_modules/relateurl/lib/format.js deleted file mode 100644 index 4dd5ddc0..00000000 --- a/node_modules/relateurl/lib/format.js +++ /dev/null @@ -1,174 +0,0 @@ -"use strict"; - -var constants = require("./constants"); - - - -function formatAuth(urlObj, options) -{ - if (urlObj.auth && !options.removeAuth && (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE)) - { - return urlObj.auth + "@"; - } - - return ""; -} - - - -function formatHash(urlObj, options) -{ - return urlObj.hash ? urlObj.hash : ""; -} - - - -function formatHost(urlObj, options) -{ - if (urlObj.host.full && (urlObj.extra.relation.maximumAuth || options.output===constants.ABSOLUTE)) - { - return urlObj.host.full; - } - - return ""; -} - - - -function formatPath(urlObj, options) -{ - var str = ""; - - var absolutePath = urlObj.path.absolute.string; - var relativePath = urlObj.path.relative.string; - var resource = showResource(urlObj, options); - - if (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE || options.output===constants.ROOT_RELATIVE) - { - str = absolutePath; - } - else if (relativePath.length<=absolutePath.length && options.output===constants.SHORTEST || options.output===constants.PATH_RELATIVE) - { - str = relativePath; - - if (str === "") - { - var query = showQuery(urlObj,options) && !!getQuery(urlObj,options); - - if (urlObj.extra.relation.maximumPath && !resource) - { - str = "./"; - } - else if (urlObj.extra.relation.overridesQuery && !resource && !query) - { - str = "./"; - } - } - } - else - { - str = absolutePath; - } - - if ( str==="/" && !resource && options.removeRootTrailingSlash && (!urlObj.extra.relation.minimumPort || options.output===constants.ABSOLUTE) ) - { - str = ""; - } - - return str; -} - - - -function formatPort(urlObj, options) -{ - if (urlObj.port && !urlObj.extra.portIsDefault && urlObj.extra.relation.maximumHost) - { - return ":" + urlObj.port; - } - - return ""; -} - - - -function formatQuery(urlObj, options) -{ - return showQuery(urlObj,options) ? getQuery(urlObj, options) : ""; -} - - - -function formatResource(urlObj, options) -{ - return showResource(urlObj,options) ? urlObj.resource : ""; -} - - - -function formatScheme(urlObj, options) -{ - var str = ""; - - if (urlObj.extra.relation.maximumHost || options.output===constants.ABSOLUTE) - { - if (!urlObj.extra.relation.minimumScheme || !options.schemeRelative || options.output===constants.ABSOLUTE) - { - str += urlObj.scheme + "://"; - } - else - { - str += "//"; - } - } - - return str; -} - - - -function formatUrl(urlObj, options) -{ - var url = ""; - - url += formatScheme(urlObj, options); - url += formatAuth(urlObj, options); - url += formatHost(urlObj, options); - url += formatPort(urlObj, options); - url += formatPath(urlObj, options); - url += formatResource(urlObj, options); - url += formatQuery(urlObj, options); - url += formatHash(urlObj, options); - - return url; -} - - - -function getQuery(urlObj, options) -{ - var stripQuery = options.removeEmptyQueries && urlObj.extra.relation.minimumPort; - - return urlObj.query.string[ stripQuery ? "stripped" : "full" ]; -} - - - -function showQuery(urlObj, options) -{ - return !urlObj.extra.relation.minimumQuery || options.output===constants.ABSOLUTE || options.output===constants.ROOT_RELATIVE; -} - - - -function showResource(urlObj, options) -{ - var removeIndex = options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex; - var removeMatchingResource = urlObj.extra.relation.minimumResource && options.output!==constants.ABSOLUTE && options.output!==constants.ROOT_RELATIVE; - - return !!urlObj.resource && !removeMatchingResource && !removeIndex; -} - - - -module.exports = formatUrl; diff --git a/node_modules/relateurl/lib/index.js b/node_modules/relateurl/lib/index.js deleted file mode 100644 index 714237d5..00000000 --- a/node_modules/relateurl/lib/index.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; - -var constants = require("./constants"); -var formatUrl = require("./format"); -var getOptions = require("./options"); -var objUtils = require("./util/object"); -var parseUrl = require("./parse"); -var relateUrl = require("./relate"); - - - -function RelateUrl(from, options) -{ - this.options = getOptions(options, - { - defaultPorts: {ftp:21, http:80, https:443}, - directoryIndexes: ["index.html"], - ignore_www: false, - output: RelateUrl.SHORTEST, - rejectedSchemes: ["data","javascript","mailto"], - removeAuth: false, - removeDirectoryIndexes: true, - removeEmptyQueries: false, - removeRootTrailingSlash: true, - schemeRelative: true, - site: undefined, - slashesDenoteHost: true - }); - - this.from = parseUrl.from(from, this.options, null); -} - - - -/* - Usage: instance=new RelateUrl(); instance.relate(); -*/ -RelateUrl.prototype.relate = function(from, to, options) -{ - // relate(to,options) - if ( objUtils.isPlainObject(to) ) - { - options = to; - to = from; - from = null; - } - // relate(to) - else if (!to) - { - to = from; - from = null; - } - - options = getOptions(options, this.options); - from = from || options.site; - from = parseUrl.from(from, options, this.from); - - if (!from || !from.href) - { - throw new Error("from value not defined."); - } - else if (from.extra.hrefInfo.minimumPathOnly) - { - throw new Error("from value supplied is not absolute: "+from.href); - } - - to = parseUrl.to(to, options); - - if (to.valid===false) return to.href; - - to = relateUrl(from, to, options); - to = formatUrl(to, options); - - return to; -} - - - -/* - Usage: RelateUrl.relate(); -*/ -RelateUrl.relate = function(from, to, options) -{ - return new RelateUrl().relate(from, to, options); -} - - - -// Make constants accessible from API -objUtils.shallowMerge(RelateUrl, constants); - - - -module.exports = RelateUrl; diff --git a/node_modules/relateurl/lib/options.js b/node_modules/relateurl/lib/options.js deleted file mode 100644 index fe8910f7..00000000 --- a/node_modules/relateurl/lib/options.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; - -var objUtils = require("./util/object"); - - - -function getOptions(options, defaults) -{ - if ( objUtils.isPlainObject(options) ) - { - var newOptions = {}; - - for (var i in defaults) - { - if ( defaults.hasOwnProperty(i) ) - { - if (options[i] !== undefined) - { - newOptions[i] = mergeOption(options[i], defaults[i]); - } - else - { - newOptions[i] = defaults[i]; - } - } - } - - return newOptions; - } - else - { - return defaults; - } -} - - - -function mergeOption(newValues, defaultValues) -{ - if (defaultValues instanceof Object && newValues instanceof Object) - { - if (defaultValues instanceof Array && newValues instanceof Array) - { - return defaultValues.concat(newValues); - } - else - { - return objUtils.shallowMerge(newValues, defaultValues); - } - } - - return newValues; -} - - - -module.exports = getOptions; diff --git a/node_modules/relateurl/lib/parse/host.js b/node_modules/relateurl/lib/parse/host.js deleted file mode 100644 index 21f04ff9..00000000 --- a/node_modules/relateurl/lib/parse/host.js +++ /dev/null @@ -1,26 +0,0 @@ -"use strict"; - -function parseHost(urlObj, options) -{ - // TWEAK :: condition only for speed optimization - if (options.ignore_www) - { - var host = urlObj.host.full; - - if (host) - { - var stripped = host; - - if (host.indexOf("www.") === 0) - { - stripped = host.substr(4); - } - - urlObj.host.stripped = stripped; - } - } -} - - - -module.exports = parseHost; diff --git a/node_modules/relateurl/lib/parse/hrefInfo.js b/node_modules/relateurl/lib/parse/hrefInfo.js deleted file mode 100644 index 8cac2bd8..00000000 --- a/node_modules/relateurl/lib/parse/hrefInfo.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; - -function hrefInfo(urlObj) -{ - var minimumPathOnly = (!urlObj.scheme && !urlObj.auth && !urlObj.host.full && !urlObj.port); - var minimumResourceOnly = (minimumPathOnly && !urlObj.path.absolute.string); - var minimumQueryOnly = (minimumResourceOnly && !urlObj.resource); - var minimumHashOnly = (minimumQueryOnly && !urlObj.query.string.full.length); - var empty = (minimumHashOnly && !urlObj.hash); - - urlObj.extra.hrefInfo.minimumPathOnly = minimumPathOnly; - urlObj.extra.hrefInfo.minimumResourceOnly = minimumResourceOnly; - urlObj.extra.hrefInfo.minimumQueryOnly = minimumQueryOnly; - urlObj.extra.hrefInfo.minimumHashOnly = minimumHashOnly; - urlObj.extra.hrefInfo.empty = empty; -} - - - -module.exports = hrefInfo; diff --git a/node_modules/relateurl/lib/parse/index.js b/node_modules/relateurl/lib/parse/index.js deleted file mode 100644 index 9f367781..00000000 --- a/node_modules/relateurl/lib/parse/index.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -var hrefInfo = require("./hrefInfo"); -var parseHost = require("./host"); -var parsePath = require("./path"); -var parsePort = require("./port"); -var parseQuery = require("./query"); -var parseUrlString = require("./urlstring"); -var pathUtils = require("../util/path"); - - - -function parseFromUrl(url, options, fallback) -{ - if (url) - { - var urlObj = parseUrl(url, options); - - // Because the following occurs in the relate stage for "to" URLs, - // such had to be mostly duplicated here - - var pathArray = pathUtils.resolveDotSegments(urlObj.path.absolute.array); - - urlObj.path.absolute.array = pathArray; - urlObj.path.absolute.string = "/" + pathUtils.join(pathArray); - - return urlObj; - } - else - { - return fallback; - } -} - - - -function parseUrl(url, options) -{ - var urlObj = parseUrlString(url, options); - - if (urlObj.valid===false) return urlObj; - - parseHost(urlObj, options); - parsePort(urlObj, options); - parsePath(urlObj, options); - parseQuery(urlObj, options); - hrefInfo(urlObj); - - return urlObj; -} - - - -module.exports = -{ - from: parseFromUrl, - to: parseUrl -}; diff --git a/node_modules/relateurl/lib/parse/path.js b/node_modules/relateurl/lib/parse/path.js deleted file mode 100644 index 093c00c6..00000000 --- a/node_modules/relateurl/lib/parse/path.js +++ /dev/null @@ -1,100 +0,0 @@ -"use strict"; - -function isDirectoryIndex(resource, options) -{ - var verdict = false; - - options.directoryIndexes.every( function(index) - { - if (index === resource) - { - verdict = true; - return false; - } - - return true; - }); - - return verdict; -} - - - -function parsePath(urlObj, options) -{ - var path = urlObj.path.absolute.string; - - if (path) - { - var lastSlash = path.lastIndexOf("/"); - - if (lastSlash > -1) - { - if (++lastSlash < path.length) - { - var resource = path.substr(lastSlash); - - if (resource!=="." && resource!=="..") - { - urlObj.resource = resource; - path = path.substr(0, lastSlash); - } - else - { - path += "/"; - } - } - - urlObj.path.absolute.string = path; - urlObj.path.absolute.array = splitPath(path); - } - else if (path==="." || path==="..") - { - // "..?var", "..#anchor", etc ... not "..index.html" - path += "/"; - - urlObj.path.absolute.string = path; - urlObj.path.absolute.array = splitPath(path); - } - else - { - // Resource-only - urlObj.resource = path; - urlObj.path.absolute.string = null; - } - - urlObj.extra.resourceIsIndex = isDirectoryIndex(urlObj.resource, options); - } - // Else: query/hash-only or empty -} - - - -function splitPath(path) -{ - // TWEAK :: condition only for speed optimization - if (path !== "/") - { - var cleaned = []; - - path.split("/").forEach( function(dir) - { - // Cleanup -- splitting "/dir/" becomes ["","dir",""] - if (dir !== "") - { - cleaned.push(dir); - } - }); - - return cleaned; - } - else - { - // Faster to skip the above block and just create an array - return []; - } -} - - - -module.exports = parsePath; diff --git a/node_modules/relateurl/lib/parse/port.js b/node_modules/relateurl/lib/parse/port.js deleted file mode 100644 index 8c4ee2e8..00000000 --- a/node_modules/relateurl/lib/parse/port.js +++ /dev/null @@ -1,32 +0,0 @@ -"use strict"; - -function parsePort(urlObj, options) -{ - var defaultPort = -1; - - for (var i in options.defaultPorts) - { - if ( i===urlObj.scheme && options.defaultPorts.hasOwnProperty(i) ) - { - defaultPort = options.defaultPorts[i]; - break; - } - } - - if (defaultPort > -1) - { - // Force same type as urlObj.port - defaultPort = defaultPort.toString(); - - if (urlObj.port === null) - { - urlObj.port = defaultPort; - } - - urlObj.extra.portIsDefault = (urlObj.port === defaultPort); - } -} - - - -module.exports = parsePort; diff --git a/node_modules/relateurl/lib/parse/query.js b/node_modules/relateurl/lib/parse/query.js deleted file mode 100644 index dbb85045..00000000 --- a/node_modules/relateurl/lib/parse/query.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -var hasOwnProperty = Object.prototype.hasOwnProperty; - - - -function parseQuery(urlObj, options) -{ - urlObj.query.string.full = stringify(urlObj.query.object, false); - - // TWEAK :: condition only for speed optimization - if (options.removeEmptyQueries) - { - urlObj.query.string.stripped = stringify(urlObj.query.object, true); - } -} - - - -function stringify(queryObj, removeEmptyQueries) -{ - var count = 0; - var str = ""; - - for (var i in queryObj) - { - if ( i!=="" && hasOwnProperty.call(queryObj, i)===true ) - { - var value = queryObj[i]; - - if (value !== "" || !removeEmptyQueries) - { - str += (++count===1) ? "?" : "&"; - - i = encodeURIComponent(i); - - if (value !== "") - { - str += i +"="+ encodeURIComponent(value).replace(/%20/g,"+"); - } - else - { - str += i; - } - } - } - } - - return str; -} - - - -module.exports = parseQuery; diff --git a/node_modules/relateurl/lib/parse/urlstring.js b/node_modules/relateurl/lib/parse/urlstring.js deleted file mode 100644 index ca4d7d43..00000000 --- a/node_modules/relateurl/lib/parse/urlstring.js +++ /dev/null @@ -1,146 +0,0 @@ -"use strict"; - -var _parseUrl = require("url").parse; - - - -/* - Customize the URL object that Node generates - because: - - * necessary data for later - * urlObj.host is useless - * urlObj.hostname is too long - * urlObj.path is useless - * urlObj.pathname is too long - * urlObj.protocol is inaccurate; should be called "scheme" - * urlObj.search is mostly useless -*/ -function clean(urlObj) -{ - var scheme = urlObj.protocol; - - if (scheme) - { - // Remove ":" suffix - if (scheme.indexOf(":") === scheme.length-1) - { - scheme = scheme.substr(0, scheme.length-1); - } - } - - urlObj.host = - { - // TODO :: unescape(encodeURIComponent(s)) ? ... http://ecmanaut.blogspot.ca/2006/07/encoding-decoding-utf8-in-javascript.html - full: urlObj.hostname, - stripped: null - }; - - urlObj.path = - { - absolute: - { - array: null, - string: urlObj.pathname - }, - relative: - { - array: null, - string: null - } - }; - - urlObj.query = - { - object: urlObj.query, - string: - { - full: null, - stripped: null - } - }; - - urlObj.extra = - { - hrefInfo: - { - minimumPathOnly: null, - minimumResourceOnly: null, - minimumQueryOnly: null, - minimumHashOnly: null, - empty: null, - - separatorOnlyQuery: urlObj.search==="?" - }, - portIsDefault: null, - relation: - { - maximumScheme: null, - maximumAuth: null, - maximumHost: null, - maximumPort: null, - maximumPath: null, - maximumResource: null, - maximumQuery: null, - maximumHash: null, - - minimumScheme: null, - minimumAuth: null, - minimumHost: null, - minimumPort: null, - minimumPath: null, - minimumResource: null, - minimumQuery: null, - minimumHash: null, - - overridesQuery: null - }, - resourceIsIndex: null, - slashes: urlObj.slashes - }; - - urlObj.resource = null; - urlObj.scheme = scheme; - delete urlObj.hostname; - delete urlObj.pathname; - delete urlObj.protocol; - delete urlObj.search; - delete urlObj.slashes; - - return urlObj; -} - - - -function validScheme(url, options) -{ - var valid = true; - - options.rejectedSchemes.every( function(rejectedScheme) - { - valid = !(url.indexOf(rejectedScheme+":") === 0); - - // Break loop - return valid; - }); - - return valid; -} - - - -function parseUrlString(url, options) -{ - if ( validScheme(url,options) ) - { - return clean( _parseUrl(url, true, options.slashesDenoteHost) ); - } - else - { - return {href:url, valid:false}; - } -} - - - -module.exports = parseUrlString; diff --git a/node_modules/relateurl/lib/relate/absolutize.js b/node_modules/relateurl/lib/relate/absolutize.js deleted file mode 100644 index 2b535a59..00000000 --- a/node_modules/relateurl/lib/relate/absolutize.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; - -var findRelation = require("./findRelation"); -var objUtils = require("../util/object"); -var pathUtils = require("../util/path"); - - - -function absolutize(urlObj, siteUrlObj, options) -{ - findRelation.upToPath(urlObj, siteUrlObj, options); - - // Fill in relative URLs - if (urlObj.extra.relation.minimumScheme) urlObj.scheme = siteUrlObj.scheme; - if (urlObj.extra.relation.minimumAuth) urlObj.auth = siteUrlObj.auth; - if (urlObj.extra.relation.minimumHost) urlObj.host = objUtils.clone(siteUrlObj.host); - if (urlObj.extra.relation.minimumPort) copyPort(urlObj, siteUrlObj); - if (urlObj.extra.relation.minimumScheme) copyPath(urlObj, siteUrlObj); - - // Check remaining relativeness now that path has been copied and/or resolved - findRelation.pathOn(urlObj, siteUrlObj, options); - - // Fill in relative URLs - if (urlObj.extra.relation.minimumResource) copyResource(urlObj, siteUrlObj); - if (urlObj.extra.relation.minimumQuery) urlObj.query = objUtils.clone(siteUrlObj.query); - if (urlObj.extra.relation.minimumHash) urlObj.hash = siteUrlObj.hash; -} - - - -/* - Get an absolute path that's relative to site url. -*/ -function copyPath(urlObj, siteUrlObj) -{ - if (urlObj.extra.relation.maximumHost || !urlObj.extra.hrefInfo.minimumResourceOnly) - { - var pathArray = urlObj.path.absolute.array; - var pathString = "/"; - - // If not erroneous URL - if (pathArray) - { - // If is relative path - if (urlObj.extra.hrefInfo.minimumPathOnly && urlObj.path.absolute.string.indexOf("/")!==0) - { - // Append path to site path - pathArray = siteUrlObj.path.absolute.array.concat(pathArray); - } - - pathArray = pathUtils.resolveDotSegments(pathArray); - pathString += pathUtils.join(pathArray); - } - else - { - pathArray = []; - } - - urlObj.path.absolute.array = pathArray; - urlObj.path.absolute.string = pathString; - } - else - { - // Resource-, query- or hash-only or empty - urlObj.path = objUtils.clone(siteUrlObj.path); - } -} - - - -function copyPort(urlObj, siteUrlObj) -{ - urlObj.port = siteUrlObj.port; - - urlObj.extra.portIsDefault = siteUrlObj.extra.portIsDefault; -} - - - -function copyResource(urlObj, siteUrlObj) -{ - urlObj.resource = siteUrlObj.resource; - - urlObj.extra.resourceIsIndex = siteUrlObj.extra.resourceIsIndex; -} - - - -module.exports = absolutize; diff --git a/node_modules/relateurl/lib/relate/findRelation.js b/node_modules/relateurl/lib/relate/findRelation.js deleted file mode 100644 index c5423c3c..00000000 --- a/node_modules/relateurl/lib/relate/findRelation.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; - -function findRelation_upToPath(urlObj, siteUrlObj, options) -{ - // Path- or root-relative URL - var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly; - - // Matching scheme, scheme-relative or path-only - var minimumScheme = (urlObj.scheme===siteUrlObj.scheme || !urlObj.scheme); - - // Matching auth, ignoring auth or path-only - var minimumAuth = minimumScheme && (urlObj.auth===siteUrlObj.auth || options.removeAuth || pathOnly); - - // Matching host or path-only - var www = options.ignore_www ? "stripped" : "full"; - var minimumHost = minimumAuth && (urlObj.host[www]===siteUrlObj.host[www] || pathOnly); - - // Matching port or path-only - var minimumPort = minimumHost && (urlObj.port===siteUrlObj.port || pathOnly); - - urlObj.extra.relation.minimumScheme = minimumScheme; - urlObj.extra.relation.minimumAuth = minimumAuth; - urlObj.extra.relation.minimumHost = minimumHost; - urlObj.extra.relation.minimumPort = minimumPort; - - urlObj.extra.relation.maximumScheme = !minimumScheme || minimumScheme && !minimumAuth; - urlObj.extra.relation.maximumAuth = !minimumScheme || minimumScheme && !minimumHost; - urlObj.extra.relation.maximumHost = !minimumScheme || minimumScheme && !minimumPort; -} - - - -function findRelation_pathOn(urlObj, siteUrlObj, options) -{ - var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly; - var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly; - var empty = urlObj.extra.hrefInfo.empty; // not required, but self-documenting - - // From upToPath() - var minimumPort = urlObj.extra.relation.minimumPort; - var minimumScheme = urlObj.extra.relation.minimumScheme; - - // Matching port and path - var minimumPath = minimumPort && urlObj.path.absolute.string===siteUrlObj.path.absolute.string; - - // Matching resource or query/hash-only or empty - var matchingResource = (urlObj.resource===siteUrlObj.resource || !urlObj.resource && siteUrlObj.extra.resourceIsIndex) || (options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex && !siteUrlObj.resource); - var minimumResource = minimumPath && (matchingResource || queryOnly || hashOnly || empty); - - // Matching query or hash-only/empty - var query = options.removeEmptyQueries ? "stripped" : "full"; - var urlQuery = urlObj.query.string[query]; - var siteUrlQuery = siteUrlObj.query.string[query]; - var minimumQuery = (minimumResource && !!urlQuery && urlQuery===siteUrlQuery) || ((hashOnly || empty) && !urlObj.extra.hrefInfo.separatorOnlyQuery); - - var minimumHash = minimumQuery && urlObj.hash===siteUrlObj.hash; - - urlObj.extra.relation.minimumPath = minimumPath; - urlObj.extra.relation.minimumResource = minimumResource; - urlObj.extra.relation.minimumQuery = minimumQuery; - urlObj.extra.relation.minimumHash = minimumHash; - - urlObj.extra.relation.maximumPort = !minimumScheme || minimumScheme && !minimumPath; - urlObj.extra.relation.maximumPath = !minimumScheme || minimumScheme && !minimumResource; - urlObj.extra.relation.maximumResource = !minimumScheme || minimumScheme && !minimumQuery; - urlObj.extra.relation.maximumQuery = !minimumScheme || minimumScheme && !minimumHash; - urlObj.extra.relation.maximumHash = !minimumScheme || minimumScheme && !minimumHash; // there's nothing after hash, so it's the same as maximumQuery - - // Matching path and/or resource with existing but non-matching site query - urlObj.extra.relation.overridesQuery = minimumPath && urlObj.extra.relation.maximumResource && !minimumQuery && !!siteUrlQuery; -} - - - -module.exports = -{ - pathOn: findRelation_pathOn, - upToPath: findRelation_upToPath -}; diff --git a/node_modules/relateurl/lib/relate/index.js b/node_modules/relateurl/lib/relate/index.js deleted file mode 100644 index f9083818..00000000 --- a/node_modules/relateurl/lib/relate/index.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; - -var absolutize = require("./absolutize"); -var relativize = require("./relativize"); - - - -function relateUrl(siteUrlObj, urlObj, options) -{ - absolutize(urlObj, siteUrlObj, options); - relativize(urlObj, siteUrlObj, options); - - return urlObj; -} - - - -module.exports = relateUrl; diff --git a/node_modules/relateurl/lib/relate/relativize.js b/node_modules/relateurl/lib/relate/relativize.js deleted file mode 100644 index 9af9a101..00000000 --- a/node_modules/relateurl/lib/relate/relativize.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; - -var pathUtils = require("../util/path"); - - - -/* - Get a path relative to the site path. -*/ -function relatePath(absolutePath, siteAbsolutePath) -{ - var relativePath = []; - - // At this point, it's related to the host/port - var related = true; - var parentIndex = -1; - - // Find parents - siteAbsolutePath.forEach( function(siteAbsoluteDir, i) - { - if (related) - { - if (absolutePath[i] !== siteAbsoluteDir) - { - related = false; - } - else - { - parentIndex = i; - } - } - - if (!related) - { - // Up one level - relativePath.push(".."); - } - }); - - // Form path - absolutePath.forEach( function(dir, i) - { - if (i > parentIndex) - { - relativePath.push(dir); - } - }); - - return relativePath; -} - - - -function relativize(urlObj, siteUrlObj, options) -{ - if (urlObj.extra.relation.minimumScheme) - { - var pathArray = relatePath(urlObj.path.absolute.array, siteUrlObj.path.absolute.array); - - urlObj.path.relative.array = pathArray; - urlObj.path.relative.string = pathUtils.join(pathArray); - } -} - - - -module.exports = relativize; diff --git a/node_modules/relateurl/lib/util/devlog.js b/node_modules/relateurl/lib/util/devlog.js deleted file mode 100644 index 086bdc94..00000000 --- a/node_modules/relateurl/lib/util/devlog.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -var inspect = require("util").inspect; - - - -function log(data) -{ - console.log( inspect(data, {depth:null, colors:true}) ); -} - - - -function logAll(data) -{ - console.log( inspect(data, {depth:null, showHidden:true, colors:true}) ); -} - - - -module.exports = -{ - log: log, - logAll: logAll -}; diff --git a/node_modules/relateurl/lib/util/object.js b/node_modules/relateurl/lib/util/object.js deleted file mode 100644 index 8eab7940..00000000 --- a/node_modules/relateurl/lib/util/object.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; - -/* - Deep-clone an object. -*/ -function clone(obj) -{ - if (obj instanceof Object) - { - var clonedObj = (obj instanceof Array) ? [] : {}; - - for (var i in obj) - { - if ( obj.hasOwnProperty(i) ) - { - clonedObj[i] = clone( obj[i] ); - } - } - - return clonedObj; - } - - return obj; -} - - - -/* - https://github.com/jonschlinkert/is-plain-object -*/ -function isPlainObject(obj) -{ - return !!obj && typeof obj==="object" && obj.constructor===Object; -} - - - -/* - Shallow-merge two objects. -*/ -function shallowMerge(target, source) -{ - if (target instanceof Object && source instanceof Object) - { - for (var i in source) - { - if ( source.hasOwnProperty(i) ) - { - target[i] = source[i]; - } - } - } - - return target; -} - - - -module.exports = -{ - clone: clone, - isPlainObject: isPlainObject, - shallowMerge: shallowMerge -}; diff --git a/node_modules/relateurl/lib/util/path.js b/node_modules/relateurl/lib/util/path.js deleted file mode 100644 index f1e9d119..00000000 --- a/node_modules/relateurl/lib/util/path.js +++ /dev/null @@ -1,49 +0,0 @@ -"use strict"; - -function joinPath(pathArray) -{ - if (pathArray.length > 0) - { - return pathArray.join("/") + "/"; - } - else - { - return ""; - } -} - - - -function resolveDotSegments(pathArray) -{ - var pathAbsolute = []; - - pathArray.forEach( function(dir) - { - if (dir !== "..") - { - if (dir !== ".") - { - pathAbsolute.push(dir); - } - } - else - { - // Remove parent - if (pathAbsolute.length > 0) - { - pathAbsolute.splice(pathAbsolute.length-1, 1); - } - } - }); - - return pathAbsolute; -} - - - -module.exports = -{ - join: joinPath, - resolveDotSegments: resolveDotSegments -}; diff --git a/node_modules/relateurl/license b/node_modules/relateurl/license deleted file mode 100644 index b760007a..00000000 --- a/node_modules/relateurl/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Steven Vachon (svachon.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/relateurl/package.json b/node_modules/relateurl/package.json deleted file mode 100644 index f4b236a7..00000000 --- a/node_modules/relateurl/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "relateurl", - "description": "Minify URLs by converting them from absolute to relative.", - "version": "0.2.7", - "license": "MIT", - "homepage": "https://github.com/stevenvachon/relateurl", - "author": { - "name": "Steven Vachon", - "email": "contact@svachon.com", - "url": "http://www.svachon.com/" - }, - "main": "lib", - "repository": { - "type": "git", - "url": "git://github.com/stevenvachon/relateurl.git" - }, - "bugs": { - "url": "https://github.com/stevenvachon/relateurl/issues" - }, - "devDependencies": { - "browserify": "^13.0.1", - "chai": "^3.5.0", - "mocha": "^2.5.3", - "uglify-js": "^2.7.0" - }, - "engines": { - "node": ">= 0.10" - }, - "scripts": { - "browserify": "browserify lib/ --standalone RelateUrl | uglifyjs --compress --mangle -o relateurl-browser.js", - "test": "mocha test/ --bail --reporter spec --check-leaks" - }, - "files": [ - "lib", - "license" - ], - "keywords": [ - "uri", - "url", - "minifier", - "minify", - "lint", - "relative", - "absolute" - ] -} diff --git a/node_modules/request/CHANGELOG.md b/node_modules/request/CHANGELOG.md deleted file mode 100644 index d3ffcd00..00000000 --- a/node_modules/request/CHANGELOG.md +++ /dev/null @@ -1,717 +0,0 @@ -## 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 deleted file mode 100644 index a4a9aee0..00000000 --- a/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 9da0eb7d..00000000 --- a/node_modules/request/README.md +++ /dev/null @@ -1,1133 +0,0 @@ -# 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 deleted file mode 100755 index d50f9917..00000000 --- a/node_modules/request/index.js +++ /dev/null @@ -1,155 +0,0 @@ -// 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/lib/auth.js b/node_modules/request/lib/auth.js deleted file mode 100644 index 02f20386..00000000 --- a/node_modules/request/lib/auth.js +++ /dev/null @@ -1,167 +0,0 @@ -'use strict' - -var caseless = require('caseless') -var uuid = require('uuid/v4') -var helpers = require('./helpers') - -var md5 = helpers.md5 -var toBase64 = helpers.toBase64 - -function Auth (request) { - // define all public properties here - this.request = request - this.hasAuth = false - this.sentAuth = false - this.bearerToken = null - this.user = null - this.pass = null -} - -Auth.prototype.basic = function (user, pass, sendImmediately) { - var self = this - if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { - self.request.emit('error', new Error('auth() received invalid user or password')) - } - self.user = user - self.pass = pass - self.hasAuth = true - var header = user + ':' + (pass || '') - if (sendImmediately || typeof sendImmediately === 'undefined') { - var authHeader = 'Basic ' + toBase64(header) - self.sentAuth = true - return authHeader - } -} - -Auth.prototype.bearer = function (bearer, sendImmediately) { - var self = this - self.bearerToken = bearer - self.hasAuth = true - if (sendImmediately || typeof sendImmediately === 'undefined') { - if (typeof bearer === 'function') { - bearer = bearer() - } - var authHeader = 'Bearer ' + (bearer || '') - self.sentAuth = true - return authHeader - } -} - -Auth.prototype.digest = function (method, path, authHeader) { - // TODO: More complete implementation of RFC 2617. - // - handle challenge.domain - // - support qop="auth-int" only - // - handle Authentication-Info (not necessarily?) - // - check challenge.stale (not necessarily?) - // - increase nc (not necessarily?) - // For reference: - // http://tools.ietf.org/html/rfc2617#section-3 - // https://github.com/bagder/curl/blob/master/lib/http_digest.c - - var self = this - - var challenge = {} - var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi - while (true) { - var match = re.exec(authHeader) - if (!match) { - break - } - challenge[match[1]] = match[2] || match[3] - } - - /** - * RFC 2617: handle both MD5 and MD5-sess algorithms. - * - * If the algorithm directive's value is "MD5" or unspecified, then HA1 is - * HA1=MD5(username:realm:password) - * If the algorithm directive's value is "MD5-sess", then HA1 is - * HA1=MD5(MD5(username:realm:password):nonce:cnonce) - */ - var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) { - var ha1 = md5(user + ':' + realm + ':' + pass) - if (algorithm && algorithm.toLowerCase() === 'md5-sess') { - return md5(ha1 + ':' + nonce + ':' + cnonce) - } else { - return ha1 - } - } - - var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' - var nc = qop && '00000001' - var cnonce = qop && uuid().replace(/-/g, '') - var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce) - var ha2 = md5(method + ':' + path) - var digestResponse = qop - ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) - : md5(ha1 + ':' + challenge.nonce + ':' + ha2) - var authValues = { - username: self.user, - realm: challenge.realm, - nonce: challenge.nonce, - uri: path, - qop: qop, - response: digestResponse, - nc: nc, - cnonce: cnonce, - algorithm: challenge.algorithm, - opaque: challenge.opaque - } - - authHeader = [] - for (var k in authValues) { - if (authValues[k]) { - if (k === 'qop' || k === 'nc' || k === 'algorithm') { - authHeader.push(k + '=' + authValues[k]) - } else { - authHeader.push(k + '="' + authValues[k] + '"') - } - } - } - authHeader = 'Digest ' + authHeader.join(', ') - self.sentAuth = true - return authHeader -} - -Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) { - var self = this - var request = self.request - - var authHeader - if (bearer === undefined && user === undefined) { - self.request.emit('error', new Error('no auth mechanism defined')) - } else if (bearer !== undefined) { - authHeader = self.bearer(bearer, sendImmediately) - } else { - authHeader = self.basic(user, pass, sendImmediately) - } - if (authHeader) { - request.setHeader('authorization', authHeader) - } -} - -Auth.prototype.onResponse = function (response) { - var self = this - var request = self.request - - if (!self.hasAuth || self.sentAuth) { return null } - - var c = caseless(response.headers) - - var authHeader = c.get('www-authenticate') - var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() - request.debug('reauth', authVerb) - - switch (authVerb) { - case 'basic': - return self.basic(self.user, self.pass, true) - - case 'bearer': - return self.bearer(self.bearerToken, true) - - case 'digest': - return self.digest(request.method, request.path, authHeader) - } -} - -exports.Auth = Auth diff --git a/node_modules/request/lib/cookies.js b/node_modules/request/lib/cookies.js deleted file mode 100644 index bd5d46be..00000000 --- a/node_modules/request/lib/cookies.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -var tough = require('tough-cookie') - -var Cookie = tough.Cookie -var CookieJar = tough.CookieJar - -exports.parse = function (str) { - if (str && str.uri) { - str = str.uri - } - if (typeof str !== 'string') { - throw new Error('The cookie function only accepts STRING as param') - } - return Cookie.parse(str, {loose: true}) -} - -// Adapt the sometimes-Async api of tough.CookieJar to our requirements -function RequestJar (store) { - var self = this - self._jar = new CookieJar(store, {looseMode: true}) -} -RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) { - var self = this - return self._jar.setCookieSync(cookieOrStr, uri, options || {}) -} -RequestJar.prototype.getCookieString = function (uri) { - var self = this - return self._jar.getCookieStringSync(uri) -} -RequestJar.prototype.getCookies = function (uri) { - var self = this - return self._jar.getCookiesSync(uri) -} - -exports.jar = function (store) { - return new RequestJar(store) -} diff --git a/node_modules/request/lib/getProxyFromURI.js b/node_modules/request/lib/getProxyFromURI.js deleted file mode 100644 index 0b9b18e5..00000000 --- a/node_modules/request/lib/getProxyFromURI.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict' - -function formatHostname (hostname) { - // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' - return hostname.replace(/^\.*/, '.').toLowerCase() -} - -function parseNoProxyZone (zone) { - zone = zone.trim().toLowerCase() - - var zoneParts = zone.split(':', 2) - var zoneHost = formatHostname(zoneParts[0]) - var zonePort = zoneParts[1] - var hasPort = zone.indexOf(':') > -1 - - return {hostname: zoneHost, port: zonePort, hasPort: hasPort} -} - -function uriInNoProxy (uri, noProxy) { - var port = uri.port || (uri.protocol === 'https:' ? '443' : '80') - var hostname = formatHostname(uri.hostname) - var noProxyList = noProxy.split(',') - - // iterate through the noProxyList until it finds a match. - return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { - var isMatchedAt = hostname.indexOf(noProxyZone.hostname) - var hostnameMatched = ( - isMatchedAt > -1 && - (isMatchedAt === hostname.length - noProxyZone.hostname.length) - ) - - if (noProxyZone.hasPort) { - return (port === noProxyZone.port) && hostnameMatched - } - - return hostnameMatched - }) -} - -function getProxyFromURI (uri) { - // Decide the proper request proxy to use based on the request URI object and the - // environmental variables (NO_PROXY, HTTP_PROXY, etc.) - // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html) - - var noProxy = process.env.NO_PROXY || process.env.no_proxy || '' - - // if the noProxy is a wildcard then return null - - if (noProxy === '*') { - return null - } - - // if the noProxy is not empty and the uri is found return null - - if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { - return null - } - - // Check for HTTP or HTTPS Proxy in environment Else default to null - - if (uri.protocol === 'http:') { - return process.env.HTTP_PROXY || - process.env.http_proxy || null - } - - if (uri.protocol === 'https:') { - return process.env.HTTPS_PROXY || - process.env.https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy || null - } - - // if none of that works, return null - // (What uri protocol are you using then?) - - return null -} - -module.exports = getProxyFromURI diff --git a/node_modules/request/lib/har.js b/node_modules/request/lib/har.js deleted file mode 100644 index 0dedee44..00000000 --- a/node_modules/request/lib/har.js +++ /dev/null @@ -1,205 +0,0 @@ -'use strict' - -var fs = require('fs') -var qs = require('querystring') -var validate = require('har-validator') -var extend = require('extend') - -function Har (request) { - this.request = request -} - -Har.prototype.reducer = function (obj, pair) { - // new property ? - if (obj[pair.name] === undefined) { - obj[pair.name] = pair.value - return obj - } - - // existing? convert to array - var arr = [ - obj[pair.name], - pair.value - ] - - obj[pair.name] = arr - - return obj -} - -Har.prototype.prep = function (data) { - // construct utility properties - data.queryObj = {} - data.headersObj = {} - data.postData.jsonObj = false - data.postData.paramsObj = false - - // construct query objects - if (data.queryString && data.queryString.length) { - data.queryObj = data.queryString.reduce(this.reducer, {}) - } - - // construct headers objects - if (data.headers && data.headers.length) { - // loweCase header keys - data.headersObj = data.headers.reduceRight(function (headers, header) { - headers[header.name] = header.value - return headers - }, {}) - } - - // construct Cookie header - if (data.cookies && data.cookies.length) { - var cookies = data.cookies.map(function (cookie) { - return cookie.name + '=' + cookie.value - }) - - if (cookies.length) { - data.headersObj.cookie = cookies.join('; ') - } - } - - // prep body - function some (arr) { - return arr.some(function (type) { - return data.postData.mimeType.indexOf(type) === 0 - }) - } - - if (some([ - 'multipart/mixed', - 'multipart/related', - 'multipart/form-data', - 'multipart/alternative'])) { - // reset values - data.postData.mimeType = 'multipart/form-data' - } else if (some([ - 'application/x-www-form-urlencoded'])) { - if (!data.postData.params) { - data.postData.text = '' - } else { - data.postData.paramsObj = data.postData.params.reduce(this.reducer, {}) - - // always overwrite - data.postData.text = qs.stringify(data.postData.paramsObj) - } - } else if (some([ - 'text/json', - 'text/x-json', - 'application/json', - 'application/x-json'])) { - data.postData.mimeType = 'application/json' - - if (data.postData.text) { - try { - data.postData.jsonObj = JSON.parse(data.postData.text) - } catch (e) { - this.request.debug(e) - - // force back to text/plain - data.postData.mimeType = 'text/plain' - } - } - } - - return data -} - -Har.prototype.options = function (options) { - // skip if no har property defined - if (!options.har) { - return options - } - - var har = {} - extend(har, options.har) - - // only process the first entry - if (har.log && har.log.entries) { - har = har.log.entries[0] - } - - // add optional properties to make validation successful - har.url = har.url || options.url || options.uri || options.baseUrl || '/' - har.httpVersion = har.httpVersion || 'HTTP/1.1' - har.queryString = har.queryString || [] - har.headers = har.headers || [] - har.cookies = har.cookies || [] - har.postData = har.postData || {} - har.postData.mimeType = har.postData.mimeType || 'application/octet-stream' - - har.bodySize = 0 - har.headersSize = 0 - har.postData.size = 0 - - if (!validate.request(har)) { - return options - } - - // clean up and get some utility properties - var req = this.prep(har) - - // construct new options - if (req.url) { - options.url = req.url - } - - if (req.method) { - options.method = req.method - } - - if (Object.keys(req.queryObj).length) { - options.qs = req.queryObj - } - - if (Object.keys(req.headersObj).length) { - options.headers = req.headersObj - } - - function test (type) { - return req.postData.mimeType.indexOf(type) === 0 - } - if (test('application/x-www-form-urlencoded')) { - options.form = req.postData.paramsObj - } else if (test('application/json')) { - if (req.postData.jsonObj) { - options.body = req.postData.jsonObj - options.json = true - } - } else if (test('multipart/form-data')) { - options.formData = {} - - req.postData.params.forEach(function (param) { - var attachment = {} - - if (!param.fileName && !param.contentType) { - options.formData[param.name] = param.value - return - } - - // attempt to read from disk! - if (param.fileName && !param.value) { - attachment.value = fs.createReadStream(param.fileName) - } else if (param.value) { - attachment.value = param.value - } - - if (param.fileName) { - attachment.options = { - filename: param.fileName, - contentType: param.contentType ? param.contentType : null - } - } - - options.formData[param.name] = attachment - }) - } else { - if (req.postData.text) { - options.body = req.postData.text - } - } - - return options -} - -exports.Har = Har diff --git a/node_modules/request/lib/hawk.js b/node_modules/request/lib/hawk.js deleted file mode 100644 index de48a985..00000000 --- a/node_modules/request/lib/hawk.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict' - -var crypto = require('crypto') - -function randomString (size) { - var bits = (size + 1) * 6 - var buffer = crypto.randomBytes(Math.ceil(bits / 8)) - var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') - return string.slice(0, size) -} - -function calculatePayloadHash (payload, algorithm, contentType) { - var hash = crypto.createHash(algorithm) - hash.update('hawk.1.payload\n') - hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\n') - hash.update(payload || '') - hash.update('\n') - return hash.digest('base64') -} - -exports.calculateMac = function (credentials, opts) { - var normalized = 'hawk.1.header\n' + - opts.ts + '\n' + - opts.nonce + '\n' + - (opts.method || '').toUpperCase() + '\n' + - opts.resource + '\n' + - opts.host.toLowerCase() + '\n' + - opts.port + '\n' + - (opts.hash || '') + '\n' - - if (opts.ext) { - normalized = normalized + opts.ext.replace('\\', '\\\\').replace('\n', '\\n') - } - - normalized = normalized + '\n' - - if (opts.app) { - normalized = normalized + opts.app + '\n' + (opts.dlg || '') + '\n' - } - - var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized) - var digest = hmac.digest('base64') - return digest -} - -exports.header = function (uri, method, opts) { - var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000) - var credentials = opts.credentials - if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) { - return '' - } - - if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) { - return '' - } - - var artifacts = { - ts: timestamp, - nonce: opts.nonce || randomString(6), - method: method, - resource: uri.pathname + (uri.search || ''), - host: uri.hostname, - port: uri.port || (uri.protocol === 'http:' ? 80 : 443), - hash: opts.hash, - ext: opts.ext, - app: opts.app, - dlg: opts.dlg - } - - if (!artifacts.hash && (opts.payload || opts.payload === '')) { - artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType) - } - - var mac = exports.calculateMac(credentials, artifacts) - - var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '' - var header = 'Hawk id="' + credentials.id + - '", ts="' + artifacts.ts + - '", nonce="' + artifacts.nonce + - (artifacts.hash ? '", hash="' + artifacts.hash : '') + - (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : '') + - '", mac="' + mac + '"' - - if (artifacts.app) { - header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"' - } - - return header -} diff --git a/node_modules/request/lib/helpers.js b/node_modules/request/lib/helpers.js deleted file mode 100644 index 8b2a7e6e..00000000 --- a/node_modules/request/lib/helpers.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict' - -var jsonSafeStringify = require('json-stringify-safe') -var crypto = require('crypto') -var Buffer = require('safe-buffer').Buffer - -var defer = typeof setImmediate === 'undefined' - ? process.nextTick - : setImmediate - -function paramsHaveRequestBody (params) { - return ( - params.body || - params.requestBodyStream || - (params.json && typeof params.json !== 'boolean') || - params.multipart - ) -} - -function safeStringify (obj, replacer) { - var ret - try { - ret = JSON.stringify(obj, replacer) - } catch (e) { - ret = jsonSafeStringify(obj, replacer) - } - return ret -} - -function md5 (str) { - return crypto.createHash('md5').update(str).digest('hex') -} - -function isReadStream (rs) { - return rs.readable && rs.path && rs.mode -} - -function toBase64 (str) { - return Buffer.from(str || '', 'utf8').toString('base64') -} - -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} - -function version () { - var numbers = process.version.replace('v', '').split('.') - return { - major: parseInt(numbers[0], 10), - minor: parseInt(numbers[1], 10), - patch: parseInt(numbers[2], 10) - } -} - -exports.paramsHaveRequestBody = paramsHaveRequestBody -exports.safeStringify = safeStringify -exports.md5 = md5 -exports.isReadStream = isReadStream -exports.toBase64 = toBase64 -exports.copy = copy -exports.version = version -exports.defer = defer diff --git a/node_modules/request/lib/multipart.js b/node_modules/request/lib/multipart.js deleted file mode 100644 index 6a009bc1..00000000 --- a/node_modules/request/lib/multipart.js +++ /dev/null @@ -1,112 +0,0 @@ -'use strict' - -var uuid = require('uuid/v4') -var CombinedStream = require('combined-stream') -var isstream = require('isstream') -var Buffer = require('safe-buffer').Buffer - -function Multipart (request) { - this.request = request - this.boundary = uuid() - this.chunked = false - this.body = null -} - -Multipart.prototype.isChunked = function (options) { - var self = this - var chunked = false - var parts = options.data || options - - if (!parts.forEach) { - self.request.emit('error', new Error('Argument error, options.multipart.')) - } - - if (options.chunked !== undefined) { - chunked = options.chunked - } - - if (self.request.getHeader('transfer-encoding') === 'chunked') { - chunked = true - } - - if (!chunked) { - parts.forEach(function (part) { - if (typeof part.body === 'undefined') { - self.request.emit('error', new Error('Body attribute missing in multipart.')) - } - if (isstream(part.body)) { - chunked = true - } - }) - } - - return chunked -} - -Multipart.prototype.setHeaders = function (chunked) { - var self = this - - if (chunked && !self.request.hasHeader('transfer-encoding')) { - self.request.setHeader('transfer-encoding', 'chunked') - } - - var header = self.request.getHeader('content-type') - - if (!header || header.indexOf('multipart') === -1) { - self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) - } else { - if (header.indexOf('boundary') !== -1) { - self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1') - } else { - self.request.setHeader('content-type', header + '; boundary=' + self.boundary) - } - } -} - -Multipart.prototype.build = function (parts, chunked) { - var self = this - var body = chunked ? new CombinedStream() : [] - - function add (part) { - if (typeof part === 'number') { - part = part.toString() - } - return chunked ? body.append(part) : body.push(Buffer.from(part)) - } - - if (self.request.preambleCRLF) { - add('\r\n') - } - - parts.forEach(function (part) { - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - if (key === 'body') { return } - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - add(preamble) - add(part.body) - add('\r\n') - }) - add('--' + self.boundary + '--') - - if (self.request.postambleCRLF) { - add('\r\n') - } - - return body -} - -Multipart.prototype.onRequest = function (options) { - var self = this - - var chunked = self.isChunked(options) - var parts = options.data || options - - self.setHeaders(chunked) - self.chunked = chunked - self.body = self.build(parts, chunked) -} - -exports.Multipart = Multipart diff --git a/node_modules/request/lib/oauth.js b/node_modules/request/lib/oauth.js deleted file mode 100644 index 96de72b8..00000000 --- a/node_modules/request/lib/oauth.js +++ /dev/null @@ -1,148 +0,0 @@ -'use strict' - -var url = require('url') -var qs = require('qs') -var caseless = require('caseless') -var uuid = require('uuid/v4') -var oauth = require('oauth-sign') -var crypto = require('crypto') -var Buffer = require('safe-buffer').Buffer - -function OAuth (request) { - this.request = request - this.params = null -} - -OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) { - var oa = {} - for (var i in _oauth) { - oa['oauth_' + i] = _oauth[i] - } - if (!oa.oauth_version) { - oa.oauth_version = '1.0' - } - if (!oa.oauth_timestamp) { - oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString() - } - if (!oa.oauth_nonce) { - oa.oauth_nonce = uuid().replace(/-/g, '') - } - if (!oa.oauth_signature_method) { - oa.oauth_signature_method = 'HMAC-SHA1' - } - - var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase - delete oa.oauth_consumer_secret - delete oa.oauth_private_key - - var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase - delete oa.oauth_token_secret - - var realm = oa.oauth_realm - delete oa.oauth_realm - delete oa.oauth_transport_method - - var baseurl = uri.protocol + '//' + uri.host + uri.pathname - var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&')) - - oa.oauth_signature = oauth.sign( - oa.oauth_signature_method, - method, - baseurl, - params, - consumer_secret_or_private_key, // eslint-disable-line camelcase - token_secret // eslint-disable-line camelcase - ) - - if (realm) { - oa.realm = realm - } - - return oa -} - -OAuth.prototype.buildBodyHash = function (_oauth, body) { - if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) { - this.request.emit('error', new Error('oauth: ' + _oauth.signature_method + - ' signature_method not supported with body_hash signing.')) - } - - var shasum = crypto.createHash('sha1') - shasum.update(body || '') - var sha1 = shasum.digest('hex') - - return Buffer.from(sha1, 'hex').toString('base64') -} - -OAuth.prototype.concatParams = function (oa, sep, wrap) { - wrap = wrap || '' - - var params = Object.keys(oa).filter(function (i) { - return i !== 'realm' && i !== 'oauth_signature' - }).sort() - - if (oa.realm) { - params.splice(0, 0, 'realm') - } - params.push('oauth_signature') - - return params.map(function (i) { - return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap - }).join(sep) -} - -OAuth.prototype.onRequest = function (_oauth) { - var self = this - self.params = _oauth - - var uri = self.request.uri || {} - var method = self.request.method || '' - var headers = caseless(self.request.headers) - var body = self.request.body || '' - var qsLib = self.request.qsLib || qs - - var form - var query - var contentType = headers.get('content-type') || '' - var formContentType = 'application/x-www-form-urlencoded' - var transport = _oauth.transport_method || 'header' - - if (contentType.slice(0, formContentType.length) === formContentType) { - contentType = formContentType - form = body - } - if (uri.query) { - query = uri.query - } - if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) { - self.request.emit('error', new Error('oauth: transport_method of body requires POST ' + - 'and content-type ' + formContentType)) - } - - if (!form && typeof _oauth.body_hash === 'boolean') { - _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString()) - } - - var oa = self.buildParams(_oauth, uri, method, query, form, qsLib) - - switch (transport) { - case 'header': - self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"')) - break - - case 'query': - var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&') - self.request.uri = url.parse(href) - self.request.path = self.request.uri.path - break - - case 'body': - self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&') - break - - default: - self.request.emit('error', new Error('oauth: transport_method invalid')) - } -} - -exports.OAuth = OAuth diff --git a/node_modules/request/lib/querystring.js b/node_modules/request/lib/querystring.js deleted file mode 100644 index 4a32cd14..00000000 --- a/node_modules/request/lib/querystring.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict' - -var qs = require('qs') -var querystring = require('querystring') - -function Querystring (request) { - this.request = request - this.lib = null - this.useQuerystring = null - this.parseOptions = null - this.stringifyOptions = null -} - -Querystring.prototype.init = function (options) { - if (this.lib) { return } - - this.useQuerystring = options.useQuerystring - this.lib = (this.useQuerystring ? querystring : qs) - - this.parseOptions = options.qsParseOptions || {} - this.stringifyOptions = options.qsStringifyOptions || {} -} - -Querystring.prototype.stringify = function (obj) { - return (this.useQuerystring) - ? this.rfc3986(this.lib.stringify(obj, - this.stringifyOptions.sep || null, - this.stringifyOptions.eq || null, - this.stringifyOptions)) - : this.lib.stringify(obj, this.stringifyOptions) -} - -Querystring.prototype.parse = function (str) { - return (this.useQuerystring) - ? this.lib.parse(str, - this.parseOptions.sep || null, - this.parseOptions.eq || null, - this.parseOptions) - : this.lib.parse(str, this.parseOptions) -} - -Querystring.prototype.rfc3986 = function (str) { - return str.replace(/[!'()*]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) -} - -Querystring.prototype.unescape = querystring.unescape - -exports.Querystring = Querystring diff --git a/node_modules/request/lib/redirect.js b/node_modules/request/lib/redirect.js deleted file mode 100644 index b9150e77..00000000 --- a/node_modules/request/lib/redirect.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict' - -var url = require('url') -var isUrl = /^https?:/ - -function Redirect (request) { - this.request = request - this.followRedirect = true - this.followRedirects = true - this.followAllRedirects = false - this.followOriginalHttpMethod = false - this.allowRedirect = function () { return true } - this.maxRedirects = 10 - this.redirects = [] - this.redirectsFollowed = 0 - this.removeRefererHeader = false -} - -Redirect.prototype.onRequest = function (options) { - var self = this - - if (options.maxRedirects !== undefined) { - self.maxRedirects = options.maxRedirects - } - if (typeof options.followRedirect === 'function') { - self.allowRedirect = options.followRedirect - } - if (options.followRedirect !== undefined) { - self.followRedirects = !!options.followRedirect - } - if (options.followAllRedirects !== undefined) { - self.followAllRedirects = options.followAllRedirects - } - if (self.followRedirects || self.followAllRedirects) { - self.redirects = self.redirects || [] - } - if (options.removeRefererHeader !== undefined) { - self.removeRefererHeader = options.removeRefererHeader - } - if (options.followOriginalHttpMethod !== undefined) { - self.followOriginalHttpMethod = options.followOriginalHttpMethod - } -} - -Redirect.prototype.redirectTo = function (response) { - var self = this - var request = self.request - - var redirectTo = null - if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { - var location = response.caseless.get('location') - request.debug('redirect', location) - - if (self.followAllRedirects) { - redirectTo = location - } else if (self.followRedirects) { - switch (request.method) { - case 'PATCH': - case 'PUT': - case 'POST': - case 'DELETE': - // Do not follow redirects - break - default: - redirectTo = location - break - } - } - } else if (response.statusCode === 401) { - var authHeader = request._auth.onResponse(response) - if (authHeader) { - request.setHeader('authorization', authHeader) - redirectTo = request.uri - } - } - return redirectTo -} - -Redirect.prototype.onResponse = function (response) { - var self = this - var request = self.request - - var redirectTo = self.redirectTo(response) - if (!redirectTo || !self.allowRedirect.call(request, response)) { - return false - } - - request.debug('redirect to', redirectTo) - - // ignore any potential response body. it cannot possibly be useful - // to us at this point. - // response.resume should be defined, but check anyway before calling. Workaround for browserify. - if (response.resume) { - response.resume() - } - - if (self.redirectsFollowed >= self.maxRedirects) { - request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href)) - return false - } - self.redirectsFollowed += 1 - - if (!isUrl.test(redirectTo)) { - redirectTo = url.resolve(request.uri.href, redirectTo) - } - - var uriPrev = request.uri - request.uri = url.parse(redirectTo) - - // handle the case where we change protocol from https to http or vice versa - if (request.uri.protocol !== uriPrev.protocol) { - delete request.agent - } - - self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }) - - if (self.followAllRedirects && request.method !== 'HEAD' && - response.statusCode !== 401 && response.statusCode !== 307) { - request.method = self.followOriginalHttpMethod ? request.method : 'GET' - } - // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete request.src - delete request.req - delete request._started - if (response.statusCode !== 401 && response.statusCode !== 307) { - // Remove parameters from the previous response, unless this is the second request - // for a server that requires digest authentication. - delete request.body - delete request._form - if (request.headers) { - request.removeHeader('host') - request.removeHeader('content-type') - request.removeHeader('content-length') - if (request.uri.hostname !== request.originalHost.split(':')[0]) { - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of curl: - // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710 - request.removeHeader('authorization') - } - } - } - - if (!self.removeRefererHeader) { - request.setHeader('referer', uriPrev.href) - } - - request.emit('redirect') - - request.init() - - return true -} - -exports.Redirect = Redirect diff --git a/node_modules/request/lib/tunnel.js b/node_modules/request/lib/tunnel.js deleted file mode 100644 index 4479003f..00000000 --- a/node_modules/request/lib/tunnel.js +++ /dev/null @@ -1,175 +0,0 @@ -'use strict' - -var url = require('url') -var tunnel = require('tunnel-agent') - -var defaultProxyHeaderWhiteList = [ - 'accept', - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept-ranges', - 'cache-control', - 'content-encoding', - 'content-language', - 'content-location', - 'content-md5', - 'content-range', - 'content-type', - 'connection', - 'date', - 'expect', - 'max-forwards', - 'pragma', - 'referer', - 'te', - 'user-agent', - 'via' -] - -var defaultProxyHeaderExclusiveList = [ - 'proxy-authorization' -] - -function constructProxyHost (uriObject) { - var port = uriObject.port - var protocol = uriObject.protocol - var proxyHost = uriObject.hostname + ':' - - if (port) { - proxyHost += port - } else if (protocol === 'https:') { - proxyHost += '443' - } else { - proxyHost += '80' - } - - return proxyHost -} - -function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) { - var whiteList = proxyHeaderWhiteList - .reduce(function (set, header) { - set[header.toLowerCase()] = true - return set - }, {}) - - return Object.keys(headers) - .filter(function (header) { - return whiteList[header.toLowerCase()] - }) - .reduce(function (set, header) { - set[header] = headers[header] - return set - }, {}) -} - -function constructTunnelOptions (request, proxyHeaders) { - var proxy = request.proxy - - var tunnelOptions = { - proxy: { - host: proxy.hostname, - port: +proxy.port, - proxyAuth: proxy.auth, - headers: proxyHeaders - }, - headers: request.headers, - ca: request.ca, - cert: request.cert, - key: request.key, - passphrase: request.passphrase, - pfx: request.pfx, - ciphers: request.ciphers, - rejectUnauthorized: request.rejectUnauthorized, - secureOptions: request.secureOptions, - secureProtocol: request.secureProtocol - } - - return tunnelOptions -} - -function constructTunnelFnName (uri, proxy) { - var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http') - var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http') - return [uriProtocol, proxyProtocol].join('Over') -} - -function getTunnelFn (request) { - var uri = request.uri - var proxy = request.proxy - var tunnelFnName = constructTunnelFnName(uri, proxy) - return tunnel[tunnelFnName] -} - -function Tunnel (request) { - this.request = request - this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList - this.proxyHeaderExclusiveList = [] - if (typeof request.tunnel !== 'undefined') { - this.tunnelOverride = request.tunnel - } -} - -Tunnel.prototype.isEnabled = function () { - var self = this - var request = self.request - // Tunnel HTTPS by default. Allow the user to override this setting. - - // If self.tunnelOverride is set (the user specified a value), use it. - if (typeof self.tunnelOverride !== 'undefined') { - return self.tunnelOverride - } - - // If the destination is HTTPS, tunnel. - if (request.uri.protocol === 'https:') { - return true - } - - // Otherwise, do not use tunnel. - return false -} - -Tunnel.prototype.setup = function (options) { - var self = this - var request = self.request - - options = options || {} - - if (typeof request.proxy === 'string') { - request.proxy = url.parse(request.proxy) - } - - if (!request.proxy || !request.tunnel) { - return false - } - - // Setup Proxy Header Exclusive List and White List - if (options.proxyHeaderWhiteList) { - self.proxyHeaderWhiteList = options.proxyHeaderWhiteList - } - if (options.proxyHeaderExclusiveList) { - self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList - } - - var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) - var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) - - // Setup Proxy Headers and Proxy Headers Host - // Only send the Proxy White Listed Header names - var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList) - proxyHeaders.host = constructProxyHost(request.uri) - - proxyHeaderExclusiveList.forEach(request.removeHeader, request) - - // Set Agent from Tunnel Data - var tunnelFn = getTunnelFn(request) - var tunnelOptions = constructTunnelOptions(request, proxyHeaders) - request.agent = tunnelFn(tunnelOptions) - - return true -} - -Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList -Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList -exports.Tunnel = Tunnel diff --git a/node_modules/request/node_modules/qs/.editorconfig b/node_modules/request/node_modules/qs/.editorconfig deleted file mode 100644 index 2f084445..00000000 --- a/node_modules/request/node_modules/qs/.editorconfig +++ /dev/null @@ -1,43 +0,0 @@ -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 = 160 -quote_type = single - -[test/*] -max_line_length = off - -[LICENSE.md] -indent_size = 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 - -[coverage/**/*] -indent_size = off -indent_style = off -indent = off -max_line_length = off - -[.nycrc] -indent_style = tab diff --git a/node_modules/request/node_modules/qs/.eslintrc b/node_modules/request/node_modules/qs/.eslintrc deleted file mode 100644 index 3f848996..00000000 --- a/node_modules/request/node_modules/qs/.eslintrc +++ /dev/null @@ -1,37 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", - - "ignorePatterns": [ - "dist/", - ], - - "rules": { - "complexity": 0, - "consistent-return": 1, - "func-name-matching": 0, - "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], - "indent": [2, 4], - "max-lines-per-function": 0, - "max-params": [2, 12], - "max-statements": [2, 45], - "multiline-comment-style": 0, - "no-continue": 1, - "no-magic-numbers": 0, - "no-param-reassign": 1, - "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], - }, - - "overrides": [ - { - "files": "test/**", - "rules": { - "max-lines-per-function": 0, - "max-statements": 0, - "no-extend-native": 0, - "function-paren-newline": 0, - }, - }, - ], -} diff --git a/node_modules/request/node_modules/qs/.github/FUNDING.yml b/node_modules/request/node_modules/qs/.github/FUNDING.yml deleted file mode 100644 index 0355f4f5..00000000 --- a/node_modules/request/node_modules/qs/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# 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/qs -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 a single custom sponsorship URL diff --git a/node_modules/request/node_modules/qs/.nycrc b/node_modules/request/node_modules/qs/.nycrc deleted file mode 100644 index 1d57cabe..00000000 --- a/node_modules/request/node_modules/qs/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "all": true, - "check-coverage": false, - "reporter": ["text-summary", "text", "html", "json"], - "lines": 86, - "statements": 85.93, - "functions": 82.43, - "branches": 76.06, - "exclude": [ - "coverage", - "dist" - ] -} diff --git a/node_modules/request/node_modules/qs/CHANGELOG.md b/node_modules/request/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 849c92ea..00000000 --- a/node_modules/request/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,250 +0,0 @@ -## **6.5.3** -- [Fix] `parse`: ignore `__proto__` keys (#428) -- [Fix]` `utils.merge`: avoid a crash with a null target and a truthy non-array source -- [Fix] correctly parse nested arrays -- [Fix] `stringify`: fix a crash with `strictNullHandling` and a custom `filter`/`serializeDate` (#279) -- [Fix] `utils`: `merge`: fix crash when `source` is a truthy primitive & no options are provided -- [Fix] when `parseArrays` is false, properly handle keys ending in `[]` -- [Fix] fix for an impossible situation: when the formatter is called with a non-string value -- [Fix] `utils.merge`: avoid a crash with a null target and an array source -- [Refactor] `utils`: reduce observable [[Get]]s -- [Refactor] use cached `Array.isArray` -- [Refactor] `stringify`: Avoid arr = arr.concat(...), push to the existing instance (#269) -- [Refactor] `parse`: only need to reassign the var once -- [Robustness] `stringify`: avoid relying on a global `undefined` (#427) -- [readme] remove travis badge; add github actions/codecov badges; update URLs -- [Docs] Clean up license text so it’s properly detected as BSD-3-Clause -- [Docs] Clarify the need for "arrayLimit" option -- [meta] fix README.md (#399) -- [meta] add FUNDING.yml -- [actions] backport actions from main -- [Tests] always use `String(x)` over `x.toString()` -- [Tests] remove nonexistent tape option -- [Dev Deps] backport from main - -## **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/request/node_modules/qs/LICENSE.md b/node_modules/request/node_modules/qs/LICENSE.md deleted file mode 100644 index fecf6b69..00000000 --- a/node_modules/request/node_modules/qs/LICENSE.md +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/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: - -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 the copyright holder 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/request/node_modules/qs/README.md b/node_modules/request/node_modules/qs/README.md deleted file mode 100644 index 20fb9cad..00000000 --- a/node_modules/request/node_modules/qs/README.md +++ /dev/null @@ -1,510 +0,0 @@ -# qs [![Version Badge][2]][1] - -[![github actions][actions-image]][actions-url] -[![coverage][codecov-image]][codecov-url] -[![dependency status][deps-svg]][deps-url] -[![dev dependency status][dev-deps-svg]][dev-deps-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] - -[![npm badge][npm-badge-png]][package-url] - -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. This is needed to handle cases when someone sent, for example, `a[999999999]` and it will take significant time to iterate over this huge array. - -```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 -}}) -``` - -You can encode keys and values using different logic by using the type argument provided to the encoder: - -```javascript -var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str, defaultEncoder, charset, type) { - if (type === 'key') { - return // Encoded key - } else if (type === 'value') { - return // Encoded value - } -}}) -``` - -The type argument is also provided to the decoder: - -```javascript -var decoded = qs.parse('x=z', { decoder: function (str, defaultDecoder, charset, type) { - if (type === 'key') { - return // Decoded key - } else if (type === 'value') { - return // Decoded value - } -}}) -``` - -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'); -``` - -## Security - -Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. - -## qs for enterprise - -Available as part of the Tidelift Subscription - -The maintainers of qs 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-qs?utm_source=npm-qs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - -[package-url]: https://npmjs.org/package/qs -[npm-version-svg]: https://versionbadg.es/ljharb/qs.svg -[deps-svg]: https://david-dm.org/ljharb/qs.svg -[deps-url]: https://david-dm.org/ljharb/qs -[dev-deps-svg]: https://david-dm.org/ljharb/qs/dev-status.svg -[dev-deps-url]: https://david-dm.org/ljharb/qs#info=devDependencies -[npm-badge-png]: https://nodei.co/npm/qs.png?downloads=true&stars=true -[license-image]: https://img.shields.io/npm/l/qs.svg -[license-url]: LICENSE -[downloads-image]: https://img.shields.io/npm/dm/qs.svg -[downloads-url]: https://npm-stat.com/charts.html?package=qs -[codecov-image]: https://codecov.io/gh/ljharb/qs/branch/main/graphs/badge.svg -[codecov-url]: https://app.codecov.io/gh/ljharb/qs/ -[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/qs -[actions-url]: https://github.com/ljharb/qs/actions diff --git a/node_modules/request/node_modules/qs/bower.json b/node_modules/request/node_modules/qs/bower.json deleted file mode 100644 index 7a582762..00000000 --- a/node_modules/request/node_modules/qs/bower.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "qs", - "main": "dist/qs.js", - "homepage": "https://github.com/hapijs/qs", - "authors": [ - "Nathan LaFreniere " - ], - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/node_modules/request/node_modules/qs/component.json b/node_modules/request/node_modules/qs/component.json deleted file mode 100644 index dd13558f..00000000 --- a/node_modules/request/node_modules/qs/component.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "qs", - "repository": "ljharb/qs", - "description": "query-string parser / stringifier with nesting support", - "version": "6.5.3", - "keywords": ["querystring", "query", "parser"], - "main": "lib/index.js", - "scripts": [ - "lib/index.js", - "lib/parse.js", - "lib/stringify.js", - "lib/utils.js" - ], - "license": "BSD-3-Clause" -} diff --git a/node_modules/request/node_modules/qs/dist/qs.js b/node_modules/request/node_modules/qs/dist/qs.js deleted file mode 100644 index 9f54e3fb..00000000 --- a/node_modules/request/node_modules/qs/dist/qs.js +++ /dev/null @@ -1,648 +0,0 @@ -(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 === '[]' && options.parseArrays) { - 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 (!options.parseArrays && cleanRoot === '') { - obj = { 0: leaf }; - } else if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else if (cleanRoot !== '__proto__') { - 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) { - return prefix + '[]'; - }, - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var isArray = Array.isArray; -var push = Array.prototype.push; -var pushToArray = function (arr, valueOrArray) { - push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify( - 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); - } - - 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 (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 (isArray(obj)) { - pushToArray(values, stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } else { - pushToArray(values, 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 && typeof 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 (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; - } - pushToArray(keys, 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 (target && typeof target === 'object') { - if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (!target || 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)) { - var targetItem = target[i]; - if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { - target[i] = merge(targetItem, 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)); - /* eslint operator-linebreak: [2, "before"] */ - 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/request/node_modules/qs/lib/formats.js b/node_modules/request/node_modules/qs/lib/formats.js deleted file mode 100644 index 702da12e..00000000 --- a/node_modules/request/node_modules/qs/lib/formats.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -var replace = String.prototype.replace; -var percentTwenties = /%20/g; - -module.exports = { - 'default': 'RFC3986', - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return String(value); - } - }, - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' -}; diff --git a/node_modules/request/node_modules/qs/lib/index.js b/node_modules/request/node_modules/qs/lib/index.js deleted file mode 100644 index 0d6a97dc..00000000 --- a/node_modules/request/node_modules/qs/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -var stringify = require('./stringify'); -var parse = require('./parse'); -var formats = require('./formats'); - -module.exports = { - formats: formats, - parse: parse, - stringify: stringify -}; diff --git a/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/request/node_modules/qs/lib/parse.js deleted file mode 100644 index cb7127d9..00000000 --- a/node_modules/request/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,175 +0,0 @@ -'use strict'; - -var utils = require('./utils'); - -var has = Object.prototype.hasOwnProperty; - -var defaults = { - allowDots: false, - allowPrototypes: false, - arrayLimit: 20, - decoder: utils.decode, - delimiter: '&', - depth: 5, - parameterLimit: 1000, - plainObjects: false, - strictNullHandling: false -}; - -var parseValues = function parseQueryStringValues(str, options) { - var obj = {}; - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - - for (var i = 0; i < parts.length; ++i) { - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder); - val = options.decoder(part.slice(pos + 1), defaults.decoder); - } - if (has.call(obj, key)) { - obj[key] = [].concat(obj[key]).concat(val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function (chain, val, options) { - var leaf = val; - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]' && options.parseArrays) { - 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 (!options.parseArrays && cleanRoot === '') { - obj = { 0: leaf }; - } else if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else if (cleanRoot !== '__proto__') { - 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); -}; diff --git a/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/request/node_modules/qs/lib/stringify.js deleted file mode 100644 index 12a96e65..00000000 --- a/node_modules/request/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,217 +0,0 @@ -'use strict'; - -var utils = require('./utils'); -var formats = require('./formats'); - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var isArray = Array.isArray; -var push = Array.prototype.push; -var pushToArray = function (arr, valueOrArray) { - push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify( - 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); - } - - 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 (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 (isArray(obj)) { - pushToArray(values, stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } else { - pushToArray(values, 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 && typeof 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 (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; - } - pushToArray(keys, 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 : ''; -}; diff --git a/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/request/node_modules/qs/lib/utils.js deleted file mode 100644 index 6592e206..00000000 --- a/node_modules/request/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,215 +0,0 @@ -'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 (target && typeof target === 'object') { - if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (!target || 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)) { - var targetItem = target[i]; - if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { - target[i] = merge(targetItem, 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)); - /* eslint operator-linebreak: [2, "before"] */ - 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 -}; diff --git a/node_modules/request/node_modules/qs/package.json b/node_modules/request/node_modules/qs/package.json deleted file mode 100644 index cc651b82..00000000 --- a/node_modules/request/node_modules/qs/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "qs", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/ljharb/qs", - "version": "6.5.3", - "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" - }, - "devDependencies": { - "@ljharb/eslint-config": "^20.1.0", - "aud": "^1.1.5", - "browserify": "^16.5.2", - "eclint": "^2.8.1", - "eslint": "^8.6.0", - "evalmd": "^0.0.17", - "iconv-lite": "^0.4.24", - "in-publish": "^2.0.1", - "mkdirp": "^0.5.1", - "nyc": "^10.3.2", - "qs-iconv": "^1.0.4", - "safe-publish-latest": "^2.0.0", - "safer-buffer": "^2.1.2", - "tape": "^5.4.0" - }, - "scripts": { - "prepublishOnly": "safe-publish-latest && npm run dist", - "prepublish": "not-in-publish || npm run prepublishOnly", - "pretest": "npm run --silent readme && npm run --silent lint", - "test": "npm run --silent tests-only", - "tests-only": "nyc tape 'test/**/*.js'", - "posttest": "aud --production", - "readme": "evalmd README.md", - "postlint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git')", - "lint": "eslint --ext=js,mjs .", - "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "license": "BSD-3-Clause" -} diff --git a/node_modules/request/node_modules/qs/test/index.js b/node_modules/request/node_modules/qs/test/index.js deleted file mode 100644 index 5e6bc8fb..00000000 --- a/node_modules/request/node_modules/qs/test/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -require('./parse'); - -require('./stringify'); - -require('./utils'); diff --git a/node_modules/request/node_modules/qs/test/parse.js b/node_modules/request/node_modules/qs/test/parse.js deleted file mode 100644 index 7c198380..00000000 --- a/node_modules/request/node_modules/qs/test/parse.js +++ /dev/null @@ -1,649 +0,0 @@ -'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('parses jquery-param strings', function (st) { - // readable = 'filter[0][]=int1&filter[0][]==&filter[0][]=77&filter[]=and&filter[2][]=int2&filter[2][]==&filter[2][]=8' - var encoded = 'filter%5B0%5D%5B%5D=int1&filter%5B0%5D%5B%5D=%3D&filter%5B0%5D%5B%5D=77&filter%5B%5D=and&filter%5B2%5D%5B%5D=int2&filter%5B2%5D%5B%5D=%3D&filter%5B2%5D%5B%5D=8'; - var expected = { filter: [['int1', '=', '77'], 'and', ['int2', '=', '8']] }; - st.deepEqual(qs.parse(encoded), expected); - 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', 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) { - var indices = qs.parse('a[0]=b&a[1]=c', { parseArrays: false }); - st.deepEqual(indices, { a: { 0: 'b', 1: 'c' } }); - st.equal(Array.isArray(indices.a), false, 'parseArrays:false, indices case is not an array'); - - var emptyBrackets = qs.parse('a[]=b', { parseArrays: false }); - st.deepEqual(emptyBrackets, { a: { 0: 'b' } }); - st.equal(Array.isArray(emptyBrackets.a), false, 'parseArrays:false, empty brackets case is not an array'); - - 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 }), - { __proto__: null, a: { __proto__: null, b: 'c', toString: true } }, - 'can overwrite prototype with plainObjects true' - ); - - st.end(); - }); - - t.test('dunder proto is ignored', function (st) { - var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42'; - var result = qs.parse(payload, { allowPrototypes: true }); - - st.deepEqual( - result, - { - categories: { - length: '42' - } - }, - 'silent [[Prototype]] payload' - ); - - var plainResult = qs.parse(payload, { allowPrototypes: true, plainObjects: true }); - - st.deepEqual( - plainResult, - { - __proto__: null, - categories: { - __proto__: null, - length: '42' - } - }, - 'silent [[Prototype]] payload: plain objects' - ); - - var query = qs.parse('categories[__proto__]=cats&categories[__proto__]=dogs&categories[some][json]=toInject', { allowPrototypes: true }); - - st.notOk(Array.isArray(query.categories), 'is not an array'); - st.notOk(query.categories instanceof Array, 'is not instanceof an array'); - st.deepEqual(query.categories, { some: { json: 'toInject' } }); - st.equal(JSON.stringify(query.categories), '{"some":{"json":"toInject"}}', 'stringifies as a non-array'); - - st.deepEqual( - qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true }), - { - foo: { - bar: 'stuffs' - } - }, - 'hidden values' - ); - - st.deepEqual( - qs.parse('foo[__proto__][hidden]=value&foo[bar]=stuffs', { allowPrototypes: true, plainObjects: true }), - { - __proto__: null, - foo: { - __proto__: null, - bar: 'stuffs' - } - }, - 'hidden values: plain objects' - ); - - 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 String(iconv.decode(SaferBuffer.from(result), 'shift_jis')); - } - }), { 県: '大阪府' }); - 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/request/node_modules/qs/test/stringify.js b/node_modules/request/node_modules/qs/test/stringify.js deleted file mode 100644 index 08f78430..00000000 --- a/node_modules/request/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,642 +0,0 @@ -'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('stringifies falsy values', function (st) { - st.equal(qs.stringify(undefined), ''); - st.equal(qs.stringify(null), ''); - st.equal(qs.stringify(null, { strictNullHandling: true }), ''); - st.equal(qs.stringify(false), ''); - st.equal(qs.stringify(0), ''); - 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 nested falsy values', function (st) { - st.equal(qs.stringify({ a: { b: { c: null } } }), 'a%5Bb%5D%5Bc%5D='); - st.equal(qs.stringify({ a: { b: { c: null } } }, { strictNullHandling: true }), 'a%5Bb%5D%5Bc%5D'); - st.equal(qs.stringify({ a: { b: { c: false } } }), 'a%5Bb%5D%5Bc%5D=false'); - 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.equal(qs.stringify({ a: SaferBuffer.from('a b') }, { - encoder: function (buffer) { - return buffer; - } - }), 'a=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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC1738 }), 'a+b=a+b'); - 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.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }, { format: qs.formats.RFC3986 }), 'a%20b=a%20b'); - st.end(); - }); - - t.test('Backward compatibility to RFC 3986', function (st) { - st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); - st.equal(qs.stringify({ 'a b': SaferBuffer.from('a b') }), 'a%20b=a%20b'); - 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.test('strictNullHandling works with custom filter', function (st) { - var filter = function (prefix, value) { - return value; - }; - - var options = { strictNullHandling: true, filter: filter }; - st.equal(qs.stringify({ key: null }, options), 'key'); - st.end(); - }); - - t.test('strictNullHandling works with null serializeDate', function (st) { - var serializeDate = function () { - return null; - }; - var options = { strictNullHandling: true, serializeDate: serializeDate }; - var date = new Date(); - st.equal(qs.stringify({ key: date }, options), 'key'); - st.end(); - }); - - t.end(); -}); diff --git a/node_modules/request/node_modules/qs/test/utils.js b/node_modules/request/node_modules/qs/test/utils.js deleted file mode 100644 index 2bfe03a6..00000000 --- a/node_modules/request/node_modules/qs/test/utils.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -var test = require('tape'); -var utils = require('../lib/utils'); - -test('merge()', function (t) { - t.deepEqual(utils.merge(null, true), [null, true], 'merges true into null'); - - t.deepEqual(utils.merge(null, [42]), [null, 42], 'merges null into an array'); - - 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'] }); - - var noOptionsNonObjectSource = utils.merge({ foo: 'baz' }, 'bar'); - t.deepEqual(noOptionsNonObjectSource, { foo: 'baz', bar: true }); - - t.test( - 'avoids invoking array setters unnecessarily', - { skip: typeof Object.defineProperty !== 'function' }, - function (st) { - var setCount = 0; - var getCount = 0; - var observed = []; - Object.defineProperty(observed, 0, { - get: function () { - getCount += 1; - return { bar: 'baz' }; - }, - set: function () { setCount += 1; } - }); - utils.merge(observed, [null]); - st.equal(setCount, 0); - st.equal(getCount, 1); - observed[0] = observed[0]; // eslint-disable-line no-self-assign - st.equal(setCount, 1); - st.equal(getCount, 2); - st.end(); - } - ); - - 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/request/package.json b/node_modules/request/package.json deleted file mode 100644 index cbb2f2ed..00000000 --- a/node_modules/request/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "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 deleted file mode 100644 index 198b7609..00000000 --- a/node_modules/request/request.js +++ /dev/null @@ -1,1553 +0,0 @@ -'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/safe-buffer/LICENSE b/node_modules/safe-buffer/LICENSE deleted file mode 100644 index 0c068cee..00000000 --- a/node_modules/safe-buffer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index e9a81afd..00000000 --- a/node_modules/safe-buffer/README.md +++ /dev/null @@ -1,584 +0,0 @@ -# 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 deleted file mode 100644 index e9fed809..00000000 --- a/node_modules/safe-buffer/index.d.ts +++ /dev/null @@ -1,187 +0,0 @@ -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 deleted file mode 100644 index f8d3ec98..00000000 --- a/node_modules/safe-buffer/index.js +++ /dev/null @@ -1,65 +0,0 @@ -/*! 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 deleted file mode 100644 index f2869e25..00000000 --- a/node_modules/safe-buffer/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "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/safer-buffer/LICENSE b/node_modules/safer-buffer/LICENSE deleted file mode 100644 index 4fe9e6f1..00000000 --- a/node_modules/safer-buffer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 68d86bab..00000000 --- a/node_modules/safer-buffer/Porting-Buffer.md +++ /dev/null @@ -1,268 +0,0 @@ -# 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 deleted file mode 100644 index 14b08229..00000000 --- a/node_modules/safer-buffer/Readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# 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 deleted file mode 100644 index ca41fdc5..00000000 --- a/node_modules/safer-buffer/dangerous.js +++ /dev/null @@ -1,58 +0,0 @@ -/* 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 deleted file mode 100644 index d452b04a..00000000 --- a/node_modules/safer-buffer/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "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 deleted file mode 100644 index 37c7e1aa..00000000 --- a/node_modules/safer-buffer/safer.js +++ /dev/null @@ -1,77 +0,0 @@ -/* 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 deleted file mode 100644 index 7ed2777c..00000000 --- a/node_modules/safer-buffer/tests.js +++ /dev/null @@ -1,406 +0,0 @@ -/* 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/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md deleted file mode 100644 index 66304fdd..00000000 --- a/node_modules/semver/CHANGELOG.md +++ /dev/null @@ -1,39 +0,0 @@ -# changes log - -## 5.7 - -* Add `minVersion` method - -## 5.6 - -* Move boolean `loose` param to an options object, with - backwards-compatibility protection. -* Add ability to opt out of special prerelease version handling with - the `includePrerelease` option flag. - -## 5.5 - -* Add version coercion capabilities - -## 5.4 - -* Add intersection checking - -## 5.3 - -* Add `minSatisfying` method - -## 5.2 - -* Add `prerelease(v)` that returns prerelease components - -## 5.1 - -* Add Backus-Naur for ranges -* Remove excessively cute inspection methods - -## 5.0 - -* Remove AMD/Browserified build artifacts -* Fix ltr and gtr when using the `*` range -* Fix for range `*` with a prerelease identifier diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/semver/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index f8dfa5a0..00000000 --- a/node_modules/semver/README.md +++ /dev/null @@ -1,412 +0,0 @@ -semver(1) -- The semantic versioner for npm -=========================================== - -## Install - -```bash -npm install --save semver -```` - -## Usage - -As a node module: - -```js -const 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 -semver.minVersion('>=1.0.0') // '1.0.0' -semver.valid(semver.coerce('v2')) // '2.0.0' -semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' -``` - -As a command-line utility: - -``` -$ semver -h - -A JavaScript implementation of the https://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 - --p --include-prerelease - Always include prerelease versions in range matching - --c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - -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. - -Note that this behavior can be suppressed (treating all prerelease -versions as if they were normal versions, for the purpose of range -matching) by setting the `includePrerelease` flag on the options -object to any -[functions](https://github.com/npm/node-semver#functions) that do -range matching. - -#### 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: - -```bash -$ semver 1.2.3 -i prerelease --preid beta -1.2.4-beta.0 -``` - -Which then can be used to increment further: - -```bash -$ 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 `options` object argument. All -options in this object are `false` by default. The options supported -are: - -- `loose` Be more forgiving about not-quite-valid semver strings. - (Any resulting output will always be 100% strict compliant, of - course.) For backwards compatibility reasons, if the `options` - argument is a boolean value instead of an object, it is interpreted - to be the `loose` param. -- `includePrerelease` Set to suppress the [default - behavior](https://github.com/npm/node-semver#prerelease-tags) of - excluding prerelease tagged versions from ranges unless they are - explicitly opted into. - -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. -* `intersects(r1, r2, loose)`: Return true if the two supplied ranges - or comparators intersect. -* `parse(v)`: Attempt to parse a string as a semantic version, returning either - a `SemVer` object or `null`. - -### 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. - -### Comparators - -* `intersects(comparator)`: Return true if the comparators intersect - -### 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. -* `minVersion(range)`: Return the lowest version that can possibly match - the given range. -* `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`.) -* `intersects(range)`: Return true if any of the ranges comparators intersect - -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. - -### Coercion - -* `coerce(version)`: Coerces a string to semver if possible - -This aims to provide a very forgiving translation of a non-semver string to -semver. It looks for the first digit in a string, and consumes all -remaining characters which satisfy at least a partial semver (e.g., `1`, -`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer -versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All -surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes -`3.4.0`). Only text which lacks digits will fail coercion (`version one` -is not valid). The maximum length for any semver component considered for -coercion is 16 characters; longer components will be ignored -(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any -semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value -components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver deleted file mode 100755 index 801e77f1..00000000 --- a/node_modules/semver/bin/semver +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env node -// Standalone semver comparison program. -// Exits successfully and prints matching version(s) if -// any supplied version is valid and passes all tests. - -var argv = process.argv.slice(2) - -var versions = [] - -var range = [] - -var inc = null - -var version = require('../package.json').version - -var loose = false - -var includePrerelease = false - -var coerce = false - -var identifier - -var semver = require('../semver') - -var reverse = false - -var options = {} - -main() - -function main () { - if (!argv.length) return help() - while (argv.length) { - var a = argv.shift() - var indexOfEqualSign = a.indexOf('=') - if (indexOfEqualSign !== -1) { - a = a.slice(0, indexOfEqualSign) - argv.unshift(a.slice(indexOfEqualSign + 1)) - } - switch (a) { - case '-rv': case '-rev': case '--rev': case '--reverse': - reverse = true - break - case '-l': case '--loose': - loose = true - break - case '-p': case '--include-prerelease': - includePrerelease = true - break - case '-v': case '--version': - versions.push(argv.shift()) - break - case '-i': case '--inc': case '--increment': - switch (argv[0]) { - case 'major': case 'minor': case 'patch': case 'prerelease': - case 'premajor': case 'preminor': case 'prepatch': - inc = argv.shift() - break - default: - inc = 'patch' - break - } - break - case '--preid': - identifier = argv.shift() - break - case '-r': case '--range': - range.push(argv.shift()) - break - case '-c': case '--coerce': - coerce = true - break - case '-h': case '--help': case '-?': - return help() - default: - versions.push(a) - break - } - } - - var options = { loose: loose, includePrerelease: includePrerelease } - - versions = versions.map(function (v) { - return coerce ? (semver.coerce(v) || { version: v }).version : v - }).filter(function (v) { - return semver.valid(v) - }) - if (!versions.length) return fail() - if (inc && (versions.length !== 1 || range.length)) { return failInc() } - - for (var i = 0, l = range.length; i < l; i++) { - versions = versions.filter(function (v) { - return semver.satisfies(v, range[i], options) - }) - if (!versions.length) return fail() - } - return success(versions) -} - -function failInc () { - console.error('--inc can only be used on a single version with no range') - fail() -} - -function fail () { process.exit(1) } - -function success () { - var compare = reverse ? 'rcompare' : 'compare' - versions.sort(function (a, b) { - return semver[compare](a, b, options) - }).map(function (v) { - return semver.clean(v, options) - }).map(function (v) { - return inc ? semver.inc(v, inc, options, identifier) : v - }).forEach(function (v, i, _) { console.log(v) }) -} - -function help () { - console.log(['SemVer ' + version, - '', - 'A JavaScript implementation of the https://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', - '', - '-p --include-prerelease', - ' Always include prerelease versions in range matching', - '', - '-c --coerce', - ' Coerce a string into SemVer if possible', - ' (does not imply --loose)', - '', - '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.' - ].join('\n')) -} diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json deleted file mode 100644 index 69d2db16..00000000 --- a/node_modules/semver/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "semver", - "version": "5.7.1", - "description": "The semantic version parser used by npm.", - "main": "semver.js", - "scripts": { - "test": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "devDependencies": { - "tap": "^13.0.0-rc.18" - }, - "license": "ISC", - "repository": "https://github.com/npm/node-semver", - "bin": { - "semver": "./bin/semver" - }, - "files": [ - "bin", - "range.bnf", - "semver.js" - ], - "tap": { - "check-coverage": true - } -} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf deleted file mode 100644 index d4c6ae0d..00000000 --- a/node_modules/semver/range.bnf +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index d315d5d6..00000000 --- a/node_modules/semver/semver.js +++ /dev/null @@ -1,1483 +0,0 @@ -exports = module.exports = SemVer - -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) - } -} else { - 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 || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 - -// 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] + '$' - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' - -// 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, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null -} - -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} - -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.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, options) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - - var m = version.trim().match(options.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.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return this.compareMain(other) || this.comparePre(other) -} - -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - 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.options) - } - - // 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) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} - -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 a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -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(new SemVer(b, loose)) -} - -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) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError('Invalid operator: ' + op) - } -} - -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.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.options.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.options.loose) - } -} - -Comparator.prototype.toString = function () { - return this.value -} - -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY) { - return true - } - - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } - - return cmp(version, this.operator, this.semver, this.options) -} - -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - var rangeTmp - - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) - } - - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) - - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan -} - -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - return new Range(range.value, options) - } - - if (!(this instanceof Range)) { - return new Range(range, options) - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // 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.options.loose - range = range.trim() - // `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, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.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, this.options) - }, this) - - return set -} - -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} - -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).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, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - 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, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} - -function replaceTilde (comp, options) { - var r = options.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) - 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, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') -} - -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.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 (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, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') -} - -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.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) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - 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 { - 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, options) { - debug('replaceStars', comp, options) - // 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.options) - } - - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} - -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // 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 (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, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} - -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} - -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} - -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) - - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } - - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } - - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] - - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } - }) - } - - if (minver && range.test(minver)) { - return minver - } - - return null -} - -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).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, options) { - return outside(version, range, '<', options) -} - -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} - -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) - - 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, options)) { - 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, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - 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, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} - -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} - -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - var match = version.match(re[COERCE]) - - if (match == null) { - return null - } - - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) -} diff --git a/node_modules/send/HISTORY.md b/node_modules/send/HISTORY.md deleted file mode 100644 index a7397749..00000000 --- a/node_modules/send/HISTORY.md +++ /dev/null @@ -1,521 +0,0 @@ -0.18.0 / 2022-03-23 -=================== - - * Fix emitted 416 error missing headers property - * Limit the headers removed for 304 response - * deps: depd@2.0.0 - - Replace internal `eval` usage with `Function` constructor - - Use instance methods on `process` to check for listeners - * deps: destroy@1.2.0 - * deps: http-errors@2.0.0 - - deps: depd@2.0.0 - - deps: statuses@2.0.1 - * deps: on-finished@2.4.1 - * deps: statuses@2.0.1 - -0.17.2 / 2021-12-11 -=================== - - * pref: ignore empty http tokens - * deps: http-errors@1.8.1 - - deps: inherits@2.0.4 - - deps: toidentifier@1.0.1 - - deps: setprototypeof@1.2.0 - * deps: ms@2.1.3 - -0.17.1 / 2019-05-10 -=================== - - * Set stricter CSP header in redirect & error responses - * deps: range-parser@~1.2.1 - -0.17.0 / 2019-05-03 -=================== - - * deps: http-errors@~1.7.2 - - Set constructor name when possible - - Use `toidentifier` module to make class names - - deps: depd@~1.1.2 - - deps: setprototypeof@1.1.1 - - deps: statuses@'>= 1.5.0 < 2' - * deps: mime@1.6.0 - - Add extensions for JPEG-2000 images - - Add new `font/*` types from IANA - - Add WASM mapping - - Update `.bdoc` to `application/bdoc` - - Update `.bmp` to `image/bmp` - - Update `.m4a` to `audio/mp4` - - Update `.rtf` to `application/rtf` - - Update `.wav` to `audio/wav` - - Update `.xml` to `application/xml` - - Update generic extensions to `application/octet-stream`: - `.deb`, `.dll`, `.dmg`, `.exe`, `.iso`, `.msi` - - Use mime-score module to resolve extension conflicts - * deps: ms@2.1.1 - - Add `week`/`w` support - - Fix negative number handling - * deps: statuses@~1.5.0 - * perf: remove redundant `path.normalize` call - -0.16.2 / 2018-02-07 -=================== - - * Fix incorrect end tag in default error & redirects - * deps: depd@~1.1.2 - - perf: remove argument reassignment - * deps: encodeurl@~1.0.2 - - Fix encoding `%` as last character - * deps: statuses@~1.4.0 - -0.16.1 / 2017-09-29 -=================== - - * Fix regression in edge-case behavior for empty `path` - -0.16.0 / 2017-09-27 -=================== - - * Add `immutable` option - * Fix missing `` in default error & redirects - * Use instance methods on steam to check for listeners - * deps: mime@1.4.1 - - Add 70 new types for file extensions - - Set charset as "UTF-8" for .js and .json - * perf: improve path validation speed - -0.15.6 / 2017-09-22 -=================== - - * deps: debug@2.6.9 - * perf: improve `If-Match` token parsing - -0.15.5 / 2017-09-20 -=================== - - * deps: etag@~1.8.1 - - perf: replace regular expression with substring - * deps: fresh@0.5.2 - - Fix handling of modified headers with invalid dates - - perf: improve ETag match loop - - perf: improve `If-None-Match` token parsing - -0.15.4 / 2017-08-05 -=================== - - * deps: debug@2.6.8 - * deps: depd@~1.1.1 - - Remove unnecessary `Buffer` loading - * deps: http-errors@~1.6.2 - - deps: depd@1.1.1 - -0.15.3 / 2017-05-16 -=================== - - * deps: debug@2.6.7 - - deps: ms@2.0.0 - * deps: ms@2.0.0 - -0.15.2 / 2017-04-26 -=================== - - * deps: debug@2.6.4 - - Fix `DEBUG_MAX_ARRAY_LENGTH` - - deps: ms@0.7.3 - * deps: ms@1.0.0 - -0.15.1 / 2017-03-04 -=================== - - * Fix issue when `Date.parse` does not return `NaN` on invalid date - * Fix strict violation in broken environments - -0.15.0 / 2017-02-25 -=================== - - * Support `If-Match` and `If-Unmodified-Since` headers - * Add `res` and `path` arguments to `directory` event - * Remove usage of `res._headers` private field - - Improves compatibility with Node.js 8 nightly - * Send complete HTML document in redirect & error responses - * Set default CSP header in redirect & error responses - * Use `res.getHeaderNames()` when available - * Use `res.headersSent` when available - * deps: debug@2.6.1 - - Allow colors in workers - - Deprecated `DEBUG_FD` environment variable set to `3` or higher - - Fix error when running under React Native - - Use same color for same namespace - - deps: ms@0.7.2 - * deps: etag@~1.8.0 - * deps: fresh@0.5.0 - - Fix false detection of `no-cache` request directive - - Fix incorrect result when `If-None-Match` has both `*` and ETags - - Fix weak `ETag` matching to match spec - - perf: delay reading header values until needed - - perf: enable strict mode - - perf: hoist regular expressions - - perf: remove duplicate conditional - - perf: remove unnecessary boolean coercions - - perf: skip checking modified time if ETag check failed - - perf: skip parsing `If-None-Match` when no `ETag` header - - perf: use `Date.parse` instead of `new Date` - * deps: http-errors@~1.6.1 - - Make `message` property enumerable for `HttpError`s - - deps: setprototypeof@1.0.3 - -0.14.2 / 2017-01-23 -=================== - - * deps: http-errors@~1.5.1 - - deps: inherits@2.0.3 - - deps: setprototypeof@1.0.2 - - deps: statuses@'>= 1.3.1 < 2' - * deps: ms@0.7.2 - * deps: statuses@~1.3.1 - -0.14.1 / 2016-06-09 -=================== - - * Fix redirect error when `path` contains raw non-URL characters - * Fix redirect when `path` starts with multiple forward slashes - -0.14.0 / 2016-06-06 -=================== - - * Add `acceptRanges` option - * Add `cacheControl` option - * Attempt to combine multiple ranges into single range - * Correctly inherit from `Stream` class - * Fix `Content-Range` header in 416 responses when using `start`/`end` options - * Fix `Content-Range` header missing from default 416 responses - * Ignore non-byte `Range` headers - * deps: http-errors@~1.5.0 - - Add `HttpError` export, for `err instanceof createError.HttpError` - - Support new code `421 Misdirected Request` - - Use `setprototypeof` module to replace `__proto__` setting - - deps: inherits@2.0.1 - - deps: statuses@'>= 1.3.0 < 2' - - perf: enable strict mode - * deps: range-parser@~1.2.0 - - Fix incorrectly returning -1 when there is at least one valid range - - perf: remove internal function - * deps: statuses@~1.3.0 - - Add `421 Misdirected Request` - - perf: enable strict mode - * perf: remove argument reassignment - -0.13.2 / 2016-03-05 -=================== - - * Fix invalid `Content-Type` header when `send.mime.default_type` unset - -0.13.1 / 2016-01-16 -=================== - - * deps: depd@~1.1.0 - - Support web browser loading - - perf: enable strict mode - * deps: destroy@~1.0.4 - - perf: enable strict mode - * deps: escape-html@~1.0.3 - - perf: enable strict mode - - perf: optimize string replacement - - perf: use faster string coercion - * deps: range-parser@~1.0.3 - - perf: enable strict mode - -0.13.0 / 2015-06-16 -=================== - - * Allow Node.js HTTP server to set `Date` response header - * Fix incorrectly removing `Content-Location` on 304 response - * Improve the default redirect response headers - * Send appropriate headers on default error response - * Use `http-errors` for standard emitted errors - * Use `statuses` instead of `http` module for status messages - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Improve stat performance by removing hashing - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * perf: enable strict mode - * perf: remove unnecessary array allocations - -0.12.3 / 2015-05-13 -=================== - - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: ms@0.7.1 - - Prevent extraordinarily long inputs - * deps: on-finished@~2.2.1 - -0.12.2 / 2015-03-13 -=================== - - * Throw errors early for invalid `extensions` or `index` options - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - -0.12.1 / 2015-02-17 -=================== - - * Fix regression sending zero-length files - -0.12.0 / 2015-02-16 -=================== - - * Always read the stat size from the file - * Fix mutating passed-in `options` - * deps: mime@1.3.4 - -0.11.1 / 2015-01-20 -=================== - - * Fix `root` path disclosure - -0.11.0 / 2015-01-05 -=================== - - * deps: debug@~2.1.1 - * deps: etag@~1.5.1 - - deps: crc@3.2.1 - * deps: ms@0.7.0 - - Add `milliseconds` - - Add `msecs` - - Add `secs` - - Add `mins` - - Add `hrs` - - Add `yrs` - * deps: on-finished@~2.2.0 - -0.10.1 / 2014-10-22 -=================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - -0.10.0 / 2014-10-15 -=================== - - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - -0.9.3 / 2014-09-24 -================== - - * deps: etag@~1.4.0 - - Support "fake" stats objects - -0.9.2 / 2014-09-15 -================== - - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: range-parser@~1.0.2 - -0.9.1 / 2014-09-07 -================== - - * deps: fresh@0.2.4 - -0.9.0 / 2014-09-07 -================== - - * Add `lastModified` option - * Use `etag` to generate `ETag` header - * deps: debug@~2.0.0 - -0.8.5 / 2014-09-04 -================== - - * Fix malicious path detection for empty string path - -0.8.4 / 2014-09-04 -================== - - * Fix a path traversal issue when using `root` - -0.8.3 / 2014-08-16 -================== - - * deps: destroy@1.0.3 - - renamed from dethroy - * deps: on-finished@2.1.0 - -0.8.2 / 2014-08-14 -================== - - * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: dethroy@1.0.2 - -0.8.1 / 2014-08-05 -================== - - * Fix `extensions` behavior when file already has extension - -0.8.0 / 2014-08-05 -================== - - * Add `extensions` option - -0.7.4 / 2014-08-04 -================== - - * Fix serving index files without root dir - -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/send/LICENSE b/node_modules/send/LICENSE deleted file mode 100644 index b6ea1c1f..00000000 --- a/node_modules/send/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2022 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/send/README.md b/node_modules/send/README.md deleted file mode 100644 index fadf8383..00000000 --- a/node_modules/send/README.md +++ /dev/null @@ -1,327 +0,0 @@ -# send - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Linux Build][github-actions-ci-image]][github-actions-ci-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Send is a library for streaming files from the file system as a http response -supporting partial responses (Ranges), conditional-GET negotiation (If-Match, -If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage, -and granular events which may be leveraged to take appropriate actions in your -application or framework. - -Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static). - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```bash -$ npm install send -``` - -## API - -```js -var send = require('send') -``` - -### send(req, path, [options]) - -Create a new `SendStream` for the given path to send to a `res`. The `req` is -the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded, -not the actual file-system path). - -#### Options - -##### acceptRanges - -Enable or disable accepting ranged requests, defaults to true. -Disabling this will not send `Accept-Ranges` and ignore the contents -of the `Range` request header. - -##### cacheControl - -Enable or disable setting `Cache-Control` response header, defaults to -true. Disabling this will ignore the `immutable` and `maxAge` options. - -##### dotfiles - -Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -The default value is _similar_ to `'ignore'`, with the exception that -this default will not ignore the files within a directory that begins -with a dot, for backward-compatibility. - -##### end - -Byte offset at which the stream ends, defaults to the length of the file -minus 1. The end is inclusive in the stream, meaning `end: 3` will include -the 4th byte in the stream. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -If a given file doesn't exist, try appending one of the given extensions, -in the given order. By default, this is disabled (set to `false`). An -example value that will serve extension-less HTML files: `['html', 'htm']`. -This is skipped if the requested file already has an extension. - -##### immutable - -Enable or disable the `immutable` directive in the `Cache-Control` response -header, defaults to `false`. If set to `true`, the `maxAge` option should -also be specified to enable caching. The `immutable` directive will prevent -supported clients from making conditional requests during the life of the -`maxAge` option to check if the file has changed. - -##### index - -By default send supports "index.html" files, to disable this -set `false` or to supply a new index pass a string or an array -in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. -This can also be a string accepted by the -[ms](https://www.npmjs.org/package/ms#readme) module. - -##### root - -Serve files relative to `path`. - -##### start - -Byte offset at which the stream starts, defaults to 0. The start is inclusive, -meaning `start: 2` will include the 3rd byte in the stream. - -#### Events - -The `SendStream` is an event emitter and will emit the following events: - - - `error` an error occurred `(err)` - - `directory` a directory was requested `(res, path)` - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -#### .pipe - -The `pipe` method is used to pipe the response into the Node.js HTTP response -object, typically `send(req, path, options).pipe(res)`. - -### .mime - -The `mime` export is the global instance of of the -[`mime` npm module](https://www.npmjs.com/package/mime). - -This is used to configure the MIME types that are associated with file extensions -as well as other options for how to resolve the MIME type of a file (like the -default type to use for an unknown file extension). - -## Error-handling - -By default when no `error` listeners are present an automatic response will be -made, otherwise you have full control over the response, aka you may show a 5xx -page etc. - -## Caching - -It does _not_ perform internal caching, you should use a reverse proxy cache -such as Varnish for this, or those fancy things called CDNs. If your -application is small enough that it would benefit from single-node memory -caching, it's small enough that it does not need caching at all ;). - -## Debugging - -To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## Examples - -### Serve a specific file - -This simple example will send a specific file to all requests. - -```js -var http = require('http') -var send = require('send') - -var server = http.createServer(function onRequest (req, res) { - send(req, '/path/to/index.html') - .pipe(res) -}) - -server.listen(3000) -``` - -### Serve all files from a directory - -This simple example will just serve up all the files in a -given directory as the top-level. For example, a request -`GET /foo.txt` will send back `/www/public/foo.txt`. - -```js -var http = require('http') -var parseUrl = require('parseurl') -var send = require('send') - -var server = http.createServer(function onRequest (req, res) { - send(req, parseUrl(req).pathname, { root: '/www/public' }) - .pipe(res) -}) - -server.listen(3000) -``` - -### Custom file types - -```js -var http = require('http') -var parseUrl = require('parseurl') -var send = require('send') - -// Default unknown types to text/plain -send.mime.default_type = 'text/plain' - -// Add a custom type -send.mime.define({ - 'application/x-my-type': ['x-mt', 'x-mtt'] -}) - -var server = http.createServer(function onRequest (req, res) { - send(req, parseUrl(req).pathname, { root: '/www/public' }) - .pipe(res) -}) - -server.listen(3000) -``` - -### Custom directory index view - -This is a example of serving up a structure of directories with a -custom function to render a listing of a directory. - -```js -var http = require('http') -var fs = require('fs') -var parseUrl = require('parseurl') -var send = require('send') - -// Transfer arbitrary files from within /www/example.com/public/* -// with a custom handler for directory listing -var server = http.createServer(function onRequest (req, res) { - send(req, parseUrl(req).pathname, { index: false, root: '/www/public' }) - .once('directory', directory) - .pipe(res) -}) - -server.listen(3000) - -// Custom directory handler -function directory (res, path) { - var stream = this - - // redirect to trailing slash for consistent url - if (!stream.hasTrailingSlash()) { - return stream.redirect(path) - } - - // get directory list - fs.readdir(path, function onReaddir (err, list) { - if (err) return stream.error(err) - - // render an index for the directory - res.setHeader('Content-Type', 'text/plain; charset=UTF-8') - res.end(list.join('\n') + '\n') - }) -} -``` - -### Serving from a root directory with custom error-handling - -```js -var http = require('http') -var parseUrl = require('parseurl') -var send = require('send') - -var server = http.createServer(function onRequest (req, res) { - // your custom error-handling logic: - function error (err) { - res.statusCode = err.status || 500 - res.end(err.message) - } - - // your custom headers - function headers (res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment') - } - - // your custom directory handling logic: - function redirect () { - res.statusCode = 301 - res.setHeader('Location', req.url + '/') - res.end('Redirecting to ' + req.url + '/') - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, parseUrl(req).pathname, { root: '/www/public' }) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res) -}) - -server.listen(3000) -``` - -## License - -[MIT](LICENSE) - -[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/send/master?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send -[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master -[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master -[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=linux -[github-actions-ci-url]: https://github.com/pillarjs/send/actions/workflows/ci.yml -[node-image]: https://badgen.net/npm/node/send -[node-url]: https://nodejs.org/en/download/ -[npm-downloads-image]: https://badgen.net/npm/dm/send -[npm-url]: https://npmjs.org/package/send -[npm-version-image]: https://badgen.net/npm/v/send diff --git a/node_modules/send/SECURITY.md b/node_modules/send/SECURITY.md deleted file mode 100644 index 46b48f7b..00000000 --- a/node_modules/send/SECURITY.md +++ /dev/null @@ -1,24 +0,0 @@ -# Security Policies and Procedures - -## Reporting a Bug - -The `send` team and community take all security bugs seriously. Thank you -for improving the security of Express. We appreciate your efforts and -responsible disclosure and will make every effort to acknowledge your -contributions. - -Report security bugs by emailing the current owner(s) of `send`. This information -can be found in the npm registry using the command `npm owner ls send`. -If unsure or unable to get the information from the above, open an issue -in the [project issue tracker](https://github.com/pillarjs/send/issues) -asking for the current contact information. - -To ensure the timely response to your report, please ensure that the entirety -of the report is contained within the email body and not solely behind a web -link or an attachment. - -At least one owner will acknowledge your email within 48 hours, and will send a -more detailed response within 48 hours indicating the next steps in handling -your report. After the initial reply to your report, the owners will -endeavor to keep you informed of the progress towards a fix and full -announcement, and may ask for additional information or guidance. diff --git a/node_modules/send/index.js b/node_modules/send/index.js deleted file mode 100644 index 89afd7e5..00000000 --- a/node_modules/send/index.js +++ /dev/null @@ -1,1143 +0,0 @@ -/*! - * send - * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2014-2022 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var createError = require('http-errors') -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var destroy = require('destroy') -var encodeUrl = require('encodeurl') -var escapeHtml = require('escape-html') -var etag = require('etag') -var fresh = require('fresh') -var fs = require('fs') -var mime = require('mime') -var ms = require('ms') -var onFinished = require('on-finished') -var parseRange = require('range-parser') -var path = require('path') -var statuses = require('statuses') -var Stream = require('stream') -var util = require('util') - -/** - * Path function references. - * @private - */ - -var extname = path.extname -var join = path.join -var normalize = path.normalize -var resolve = path.resolve -var sep = path.sep - -/** - * Regular expression for identifying a bytes Range header. - * @private - */ - -var BYTES_RANGE_REGEXP = /^ *bytes=/ - -/** - * Maximum value allowed for the max age. - * @private - */ - -var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year - -/** - * Regular expression to match a path with a directory up component. - * @private - */ - -var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/ - -/** - * Module exports. - * @public - */ - -module.exports = send -module.exports.mime = mime - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {object} req - * @param {string} path - * @param {object} [options] - * @return {SendStream} - * @public - */ - -function send (req, path, options) { - return new SendStream(req, path, options) -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {object} [options] - * @private - */ - -function SendStream (req, path, options) { - Stream.call(this) - - var opts = options || {} - - this.options = opts - this.path = path - this.req = req - - this._acceptRanges = opts.acceptRanges !== undefined - ? Boolean(opts.acceptRanges) - : true - - this._cacheControl = opts.cacheControl !== undefined - ? Boolean(opts.cacheControl) - : true - - this._etag = opts.etag !== undefined - ? Boolean(opts.etag) - : true - - this._dotfiles = opts.dotfiles !== undefined - ? opts.dotfiles - : 'ignore' - - if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(opts.hidden) - - if (opts.hidden !== undefined) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (opts.dotfiles === undefined) { - this._dotfiles = undefined - } - - this._extensions = opts.extensions !== undefined - ? normalizeList(opts.extensions, 'extensions option') - : [] - - this._immutable = opts.immutable !== undefined - ? Boolean(opts.immutable) - : false - - this._index = opts.index !== undefined - ? normalizeList(opts.index, 'index option') - : ['index.html'] - - this._lastModified = opts.lastModified !== undefined - ? Boolean(opts.lastModified) - : true - - this._maxage = opts.maxAge || opts.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) - : 0 - - this._root = opts.root - ? resolve(opts.root) - : null - - if (!this._root && opts.from) { - this.from(opts.from) - } -} - -/** - * Inherits from `Stream`. - */ - -util.inherits(SendStream, Stream) - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag (val) { - this._etag = Boolean(val) - debug('etag %s', this._etag) - return this -}, 'send.etag: pass etag as option') - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden (val) { - this._hidden = Boolean(val) - this._dotfiles = undefined - debug('hidden %s', this._hidden) - return this -}, 'send.hidden: use dotfiles option') - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index (paths) { - var index = !paths ? [] : normalizeList(paths, 'paths argument') - debug('index %o', paths) - this._index = index - return this -}, 'send.index: pass index as option') - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function root (path) { - this._root = resolve(String(path)) - debug('root %s', this._root) - return this -} - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option') - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option') - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) { - this._maxage = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) - : 0 - debug('max-age %d', this._maxage) - return this -}, 'send.maxage: pass maxAge as option') - -/** - * Emit error with `status`. - * - * @param {number} status - * @param {Error} [err] - * @private - */ - -SendStream.prototype.error = function error (status, err) { - // emit if listeners instead of responding - if (hasListeners(this, 'error')) { - return this.emit('error', createHttpError(status, err)) - } - - var res = this.res - var msg = statuses.message[status] || String(status) - var doc = createHtmlDocument('Error', escapeHtml(msg)) - - // clear existing headers - clearHeaders(res) - - // add error headers - if (err && err.headers) { - setHeaders(res, err.headers) - } - - // send basic response - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'none'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.end(doc) -} - -/** - * Check if the pathname ends with "/". - * - * @return {boolean} - * @private - */ - -SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () { - return this.path[this.path.length - 1] === '/' -} - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function isConditionalGET () { - return this.req.headers['if-match'] || - this.req.headers['if-unmodified-since'] || - this.req.headers['if-none-match'] || - this.req.headers['if-modified-since'] -} - -/** - * Check if the request preconditions failed. - * - * @return {boolean} - * @private - */ - -SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () { - var req = this.req - var res = this.res - - // if-match - var match = req.headers['if-match'] - if (match) { - var etag = res.getHeader('ETag') - return !etag || (match !== '*' && parseTokenList(match).every(function (match) { - return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag - })) - } - - // if-unmodified-since - var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since']) - if (!isNaN(unmodifiedSince)) { - var lastModified = parseHttpDate(res.getHeader('Last-Modified')) - return isNaN(lastModified) || lastModified > unmodifiedSince - } - - return false -} - -/** - * Strip various content header fields for a change in entity. - * - * @private - */ - -SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () { - var res = this.res - - res.removeHeader('Content-Encoding') - res.removeHeader('Content-Language') - res.removeHeader('Content-Length') - res.removeHeader('Content-Range') - res.removeHeader('Content-Type') -} - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function notModified () { - var res = this.res - debug('not modified') - this.removeContentHeaderFields() - res.statusCode = 304 - res.end() -} - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent () { - var err = new Error('Can\'t set headers after they are sent.') - debug('headers already sent') - this.error(500, err) -} - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function isCachable () { - var statusCode = this.res.statusCode - return (statusCode >= 200 && statusCode < 300) || - statusCode === 304 -} - -/** - * Handle stat() error. - * - * @param {Error} error - * @private - */ - -SendStream.prototype.onStatError = function onStatError (error) { - switch (error.code) { - case 'ENAMETOOLONG': - case 'ENOENT': - case 'ENOTDIR': - this.error(404, error) - break - default: - this.error(500, error) - break - } -} - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function isFresh () { - return fresh(this.req.headers, { - etag: this.res.getHeader('ETag'), - 'last-modified': this.res.getHeader('Last-Modified') - }) -} - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh () { - var ifRange = this.req.headers['if-range'] - - if (!ifRange) { - return true - } - - // if-range as etag - if (ifRange.indexOf('"') !== -1) { - var etag = this.res.getHeader('ETag') - return Boolean(etag && ifRange.indexOf(etag) !== -1) - } - - // if-range as modified date - var lastModified = this.res.getHeader('Last-Modified') - return parseHttpDate(lastModified) <= parseHttpDate(ifRange) -} - -/** - * Redirect to path. - * - * @param {string} path - * @private - */ - -SendStream.prototype.redirect = function redirect (path) { - var res = this.res - - if (hasListeners(this, 'directory')) { - this.emit('directory', res, path) - return - } - - if (this.hasTrailingSlash()) { - this.error(403) - return - } - - var loc = encodeUrl(collapseLeadingSlashes(this.path + '/')) - var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + - escapeHtml(loc) + '') - - // redirect - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'none'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(doc) -} - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function pipe (res) { - // root path - var root = this._root - - // references - this.res = res - - // decode the path - var path = decode(this.path) - if (path === -1) { - this.error(400) - return res - } - - // null byte(s) - if (~path.indexOf('\0')) { - this.error(400) - return res - } - - var parts - if (root !== null) { - // normalize - if (path) { - path = normalize('.' + sep + path) - } - - // malicious path - if (UP_PATH_REGEXP.test(path)) { - debug('malicious path "%s"', path) - this.error(403) - return res - } - - // explode path parts - parts = path.split(sep) - - // join / normalize from optional root dir - path = normalize(join(root, path)) - } else { - // ".." is malicious without "root" - if (UP_PATH_REGEXP.test(path)) { - debug('malicious path "%s"', path) - this.error(403) - return res - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - this.error(403) - return res - case 'ignore': - default: - this.error(404) - return res - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path) - return res - } - - this.sendFile(path) - return res -} - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function send (path, stat) { - var len = stat.size - var options = this.options - var opts = {} - var res = this.res - var req = this.req - var ranges = req.headers.range - var offset = options.start || 0 - - if (headersSent(res)) { - // impossible to send now - this.headersAlreadySent() - return - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat) - - // set content-type - this.type(path) - - // conditional GET support - if (this.isConditionalGET()) { - if (this.isPreconditionFailure()) { - this.error(412) - return - } - - if (this.isCachable() && this.isFresh()) { - this.notModified() - return - } - } - - // adjust len to start/end options - len = Math.max(0, len - offset) - if (options.end !== undefined) { - var bytes = options.end - offset + 1 - if (len > bytes) len = bytes - } - - // Range support - if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) { - // parse - ranges = parseRange(len, ranges, { - combine: true - }) - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale') - ranges = -2 - } - - // unsatisfiable - if (ranges === -1) { - debug('range unsatisfiable') - - // Content-Range - res.setHeader('Content-Range', contentRange('bytes', len)) - - // 416 Requested Range Not Satisfiable - return this.error(416, { - headers: { 'Content-Range': res.getHeader('Content-Range') } - }) - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (ranges !== -2 && ranges.length === 1) { - debug('range %j', ranges) - - // Content-Range - res.statusCode = 206 - res.setHeader('Content-Range', contentRange('bytes', len, ranges[0])) - - // adjust for requested range - offset += ranges[0].start - len = ranges[0].end - ranges[0].start + 1 - } - } - - // clone options - for (var prop in options) { - opts[prop] = options[prop] - } - - // set read options - opts.start = offset - opts.end = Math.max(offset, offset + len - 1) - - // content-length - res.setHeader('Content-Length', len) - - // HEAD support - if (req.method === 'HEAD') { - res.end() - return - } - - this.stream(path, opts) -} - -/** - * Transfer file for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendFile = function sendFile (path) { - var i = 0 - var self = this - - debug('stat "%s"', path) - fs.stat(path, function onstat (err, stat) { - if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) { - // not found, check extensions - return next(err) - } - if (err) return self.onStatError(err) - if (stat.isDirectory()) return self.redirect(path) - self.emit('file', path, stat) - self.send(path, stat) - }) - - function next (err) { - if (self._extensions.length <= i) { - return err - ? self.onStatError(err) - : self.error(404) - } - - var p = path + '.' + self._extensions[i++] - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } -} - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex (path) { - var i = -1 - var self = this - - function next (err) { - if (++i >= self._index.length) { - if (err) return self.onStatError(err) - return self.error(404) - } - - var p = join(path, self._index[i]) - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } - - next() -} - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function stream (path, options) { - var self = this - var res = this.res - - // pipe - var stream = fs.createReadStream(path, options) - this.emit('stream', stream) - stream.pipe(res) - - // cleanup - function cleanup () { - destroy(stream, true) - } - - // response finished, cleanup - onFinished(res, cleanup) - - // error handling - stream.on('error', function onerror (err) { - // clean up stream early - cleanup() - - // error - self.onStatError(err) - }) - - // end - stream.on('end', function onend () { - self.emit('end') - }) -} - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function type (path) { - var res = this.res - - if (res.getHeader('Content-Type')) return - - var type = mime.lookup(path) - - if (!type) { - debug('no content-type') - return - } - - var charset = mime.charsets.lookup(type) - - debug('content-type %s', type) - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')) -} - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader (path, stat) { - var res = this.res - - this.emit('headers', res, path, stat) - - if (this._acceptRanges && !res.getHeader('Accept-Ranges')) { - debug('accept ranges') - res.setHeader('Accept-Ranges', 'bytes') - } - - if (this._cacheControl && !res.getHeader('Cache-Control')) { - var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000) - - if (this._immutable) { - cacheControl += ', immutable' - } - - debug('cache-control %s', cacheControl) - res.setHeader('Cache-Control', cacheControl) - } - - if (this._lastModified && !res.getHeader('Last-Modified')) { - var modified = stat.mtime.toUTCString() - debug('modified %s', modified) - res.setHeader('Last-Modified', modified) - } - - if (this._etag && !res.getHeader('ETag')) { - var val = etag(stat) - debug('etag %s', val) - res.setHeader('ETag', val) - } -} - -/** - * Clear all headers from a response. - * - * @param {object} res - * @private - */ - -function clearHeaders (res) { - var headers = getHeaderNames(res) - - for (var i = 0; i < headers.length; i++) { - res.removeHeader(headers[i]) - } -} - -/** - * Collapse all leading slashes into a single slash - * - * @param {string} str - * @private - */ -function collapseLeadingSlashes (str) { - for (var i = 0; i < str.length; i++) { - if (str[i] !== '/') { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile (parts) { - for (var i = 0; i < parts.length; i++) { - var part = parts[i] - if (part.length > 1 && part[0] === '.') { - return true - } - } - - return false -} - -/** - * Create a Content-Range header. - * - * @param {string} type - * @param {number} size - * @param {array} [range] - */ - -function contentRange (type, size, range) { - return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size -} - -/** - * Create a minimal HTML document. - * - * @param {string} title - * @param {string} body - * @private - */ - -function createHtmlDocument (title, body) { - return '\n' + - '\n' + - '\n' + - '\n' + - '' + title + '\n' + - '\n' + - '\n' + - '
' + body + '
\n' + - '\n' + - '\n' -} - -/** - * Create a HttpError object from simple arguments. - * - * @param {number} status - * @param {Error|object} err - * @private - */ - -function createHttpError (status, err) { - if (!err) { - return createError(status) - } - - return err instanceof Error - ? createError(status, err, { expose: false }) - : createError(status, err) -} - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -function decode (path) { - try { - return decodeURIComponent(path) - } catch (err) { - return -1 - } -} - -/** - * Get the header names on a respnse. - * - * @param {object} res - * @returns {array[string]} - * @private - */ - -function getHeaderNames (res) { - return typeof res.getHeaderNames !== 'function' - ? Object.keys(res._headers || {}) - : res.getHeaderNames() -} - -/** - * Determine if emitter has listeners of a given type. - * - * The way to do this check is done three different ways in Node.js >= 0.8 - * so this consolidates them into a minimal set using instance methods. - * - * @param {EventEmitter} emitter - * @param {string} type - * @returns {boolean} - * @private - */ - -function hasListeners (emitter, type) { - var count = typeof emitter.listenerCount !== 'function' - ? emitter.listeners(type).length - : emitter.listenerCount(type) - - return count > 0 -} - -/** - * Determine if the response headers have been sent. - * - * @param {object} res - * @returns {boolean} - * @private - */ - -function headersSent (res) { - return typeof res.headersSent !== 'boolean' - ? Boolean(res._header) - : res.headersSent -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @param {string} name - * @private - */ - -function normalizeList (val, name) { - var list = [].concat(val || []) - - for (var i = 0; i < list.length; i++) { - if (typeof list[i] !== 'string') { - throw new TypeError(name + ' must be array of strings or false') - } - } - - return list -} - -/** - * Parse an HTTP Date into a number. - * - * @param {string} date - * @private - */ - -function parseHttpDate (date) { - var timestamp = date && Date.parse(date) - - return typeof timestamp === 'number' - ? timestamp - : NaN -} - -/** - * Parse a HTTP token list. - * - * @param {string} str - * @private - */ - -function parseTokenList (str) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = str.length; i < len; i++) { - switch (str.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - if (start !== end) { - list.push(str.substring(start, end)) - } - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - if (start !== end) { - list.push(str.substring(start, end)) - } - - return list -} - -/** - * Set an object of headers on a response. - * - * @param {object} res - * @param {object} headers - * @private - */ - -function setHeaders (res, headers) { - var keys = Object.keys(headers) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - res.setHeader(key, headers[key]) - } -} diff --git a/node_modules/send/node_modules/ms/index.js b/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index ea734fb7..00000000 --- a/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var w = d * 7; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function (val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); -} diff --git a/node_modules/send/node_modules/ms/license.md b/node_modules/send/node_modules/ms/license.md deleted file mode 100644 index fa5d39b6..00000000 --- a/node_modules/send/node_modules/ms/license.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2020 Vercel, Inc. - -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/send/node_modules/ms/package.json b/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 49971890..00000000 --- a/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "ms", - "version": "2.1.3", - "description": "Tiny millisecond conversion utility", - "repository": "vercel/ms", - "main": "./index", - "files": [ - "index.js" - ], - "scripts": { - "precommit": "lint-staged", - "lint": "eslint lib/* bin/*", - "test": "mocha tests.js" - }, - "eslintConfig": { - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - } - }, - "lint-staged": { - "*.js": [ - "npm run lint", - "prettier --single-quote --write", - "git add" - ] - }, - "license": "MIT", - "devDependencies": { - "eslint": "4.18.2", - "expect.js": "0.3.1", - "husky": "0.14.3", - "lint-staged": "5.0.0", - "mocha": "4.0.1", - "prettier": "2.0.5" - } -} diff --git a/node_modules/send/node_modules/ms/readme.md b/node_modules/send/node_modules/ms/readme.md deleted file mode 100644 index 0fc1abb3..00000000 --- a/node_modules/send/node_modules/ms/readme.md +++ /dev/null @@ -1,59 +0,0 @@ -# ms - -![CI](https://github.com/vercel/ms/workflows/CI/badge.svg) - -Use this package to easily convert various time formats to milliseconds. - -## Examples - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('1y') // 31557600000 -ms('100') // 100 -ms('-3 days') // -259200000 -ms('-1h') // -3600000 -ms('-200') // -200 -``` - -### Convert from Milliseconds - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(-3 * 60000) // "-3m" -ms(ms('10 hours')) // "10h" -``` - -### Time Format Written-Out - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(-3 * 60000, { long: true }) // "-3 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -## Features - -- Works both in [Node.js](https://nodejs.org) and in the browser -- If a number is supplied to `ms`, a string with a unit is returned -- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) -- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned - -## Related Packages - -- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. - -## Caught a Bug? - -1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device -2. Link the package to the global module directory: `npm link` -3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! - -As always, you can run the tests using: `npm test` diff --git a/node_modules/send/package.json b/node_modules/send/package.json deleted file mode 100644 index 7f269d51..00000000 --- a/node_modules/send/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.18.0", - "author": "TJ Holowaychuk ", - "contributors": [ - "Douglas Christopher Wilson ", - "James Wyatt Cready ", - "Jesús Leganés Combarro " - ], - "license": "MIT", - "repository": "pillarjs/send", - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "devDependencies": { - "after": "0.8.2", - "eslint": "7.32.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.4", - "eslint-plugin-markdown": "2.2.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "5.2.0", - "eslint-plugin-standard": "4.1.0", - "mocha": "9.2.2", - "nyc": "15.1.0", - "supertest": "6.2.2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "SECURITY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --check-leaks --reporter spec --bail", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - } -} diff --git a/node_modules/serve-static/HISTORY.md b/node_modules/serve-static/HISTORY.md deleted file mode 100644 index 6b584563..00000000 --- a/node_modules/serve-static/HISTORY.md +++ /dev/null @@ -1,471 +0,0 @@ -1.15.0 / 2022-03-24 -=================== - - * deps: send@0.18.0 - - Fix emitted 416 error missing headers property - - Limit the headers removed for 304 response - - deps: depd@2.0.0 - - deps: destroy@1.2.0 - - deps: http-errors@2.0.0 - - deps: on-finished@2.4.1 - - deps: statuses@2.0.1 - -1.14.2 / 2021-12-15 -=================== - - * deps: send@0.17.2 - - deps: http-errors@1.8.1 - - deps: ms@2.1.3 - - pref: ignore empty http tokens - -1.14.1 / 2019-05-10 -=================== - - * Set stricter CSP header in redirect response - * deps: send@0.17.1 - - deps: range-parser@~1.2.1 - -1.14.0 / 2019-05-07 -=================== - - * deps: parseurl@~1.3.3 - * deps: send@0.17.0 - - deps: http-errors@~1.7.2 - - deps: mime@1.6.0 - - deps: ms@2.1.1 - - deps: statuses@~1.5.0 - - perf: remove redundant `path.normalize` call - -1.13.2 / 2018-02-07 -=================== - - * Fix incorrect end tag in redirects - * deps: encodeurl@~1.0.2 - - Fix encoding `%` as last character - * deps: send@0.16.2 - - deps: depd@~1.1.2 - - deps: encodeurl@~1.0.2 - - deps: statuses@~1.4.0 - -1.13.1 / 2017-09-29 -=================== - - * Fix regression when `root` is incorrectly set to a file - * deps: send@0.16.1 - -1.13.0 / 2017-09-27 -=================== - - * deps: send@0.16.0 - - Add 70 new types for file extensions - - Add `immutable` option - - Fix missing `` in default error & redirects - - Set charset as "UTF-8" for .js and .json - - Use instance methods on steam to check for listeners - - deps: mime@1.4.1 - - perf: improve path validation speed - -1.12.6 / 2017-09-22 -=================== - - * deps: send@0.15.6 - - deps: debug@2.6.9 - - perf: improve `If-Match` token parsing - * perf: improve slash collapsing - -1.12.5 / 2017-09-21 -=================== - - * deps: parseurl@~1.3.2 - - perf: reduce overhead for full URLs - - perf: unroll the "fast-path" `RegExp` - * deps: send@0.15.5 - - Fix handling of modified headers with invalid dates - - deps: etag@~1.8.1 - - deps: fresh@0.5.2 - -1.12.4 / 2017-08-05 -=================== - - * deps: send@0.15.4 - - deps: debug@2.6.8 - - deps: depd@~1.1.1 - - deps: http-errors@~1.6.2 - -1.12.3 / 2017-05-16 -=================== - - * deps: send@0.15.3 - - deps: debug@2.6.7 - -1.12.2 / 2017-04-26 -=================== - - * deps: send@0.15.2 - - deps: debug@2.6.4 - -1.12.1 / 2017-03-04 -=================== - - * deps: send@0.15.1 - - Fix issue when `Date.parse` does not return `NaN` on invalid date - - Fix strict violation in broken environments - -1.12.0 / 2017-02-25 -=================== - - * Send complete HTML document in redirect response - * Set default CSP header in redirect response - * deps: send@0.15.0 - - Fix false detection of `no-cache` request directive - - Fix incorrect result when `If-None-Match` has both `*` and ETags - - Fix weak `ETag` matching to match spec - - Remove usage of `res._headers` private field - - Support `If-Match` and `If-Unmodified-Since` headers - - Use `res.getHeaderNames()` when available - - Use `res.headersSent` when available - - deps: debug@2.6.1 - - deps: etag@~1.8.0 - - deps: fresh@0.5.0 - - deps: http-errors@~1.6.1 - -1.11.2 / 2017-01-23 -=================== - - * deps: send@0.14.2 - - deps: http-errors@~1.5.1 - - deps: ms@0.7.2 - - deps: statuses@~1.3.1 - -1.11.1 / 2016-06-10 -=================== - - * Fix redirect error when `req.url` contains raw non-URL characters - * deps: send@0.14.1 - -1.11.0 / 2016-06-07 -=================== - - * Use status code 301 for redirects - * deps: send@0.14.0 - - Add `acceptRanges` option - - Add `cacheControl` option - - Attempt to combine multiple ranges into single range - - Correctly inherit from `Stream` class - - Fix `Content-Range` header in 416 responses when using `start`/`end` options - - Fix `Content-Range` header missing from default 416 responses - - Ignore non-byte `Range` headers - - deps: http-errors@~1.5.0 - - deps: range-parser@~1.2.0 - - deps: statuses@~1.3.0 - - perf: remove argument reassignment - -1.10.3 / 2016-05-30 -=================== - - * deps: send@0.13.2 - - Fix invalid `Content-Type` header when `send.mime.default_type` unset - -1.10.2 / 2016-01-19 -=================== - - * deps: parseurl@~1.3.1 - - perf: enable strict mode - -1.10.1 / 2016-01-16 -=================== - - * deps: escape-html@~1.0.3 - - perf: enable strict mode - - perf: optimize string replacement - - perf: use faster string coercion - * deps: send@0.13.1 - - deps: depd@~1.1.0 - - deps: destroy@~1.0.4 - - deps: escape-html@~1.0.3 - - deps: range-parser@~1.0.3 - -1.10.0 / 2015-06-17 -=================== - - * Add `fallthrough` option - - Allows declaring this middleware is the final destination - - Provides better integration with Express patterns - * Fix reading options from options prototype - * Improve the default redirect response headers - * deps: escape-html@1.0.2 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * perf: enable strict mode - * perf: remove argument reassignment - -1.9.3 / 2015-05-14 -================== - - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -1.9.2 / 2015-03-14 -================== - - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -1.9.1 / 2015-02-17 -================== - - * deps: send@0.12.1 - - Fix regression sending zero-length files - -1.9.0 / 2015-02-16 -================== - - * deps: send@0.12.0 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -1.8.1 / 2015-01-20 -================== - - * Fix redirect loop in Node.js 0.11.14 - * deps: send@0.11.1 - - Fix root path disclosure - -1.8.0 / 2015-01-05 -================== - - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -1.7.2 / 2015-01-02 -================== - - * Fix potential open redirect when mounted at root - -1.7.1 / 2014-10-22 -================== - - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -1.7.0 / 2014-10-15 -================== - - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -1.6.5 / 2015-02-04 -================== - - * Fix potential open redirect when mounted at root - - Back-ported from v1.7.2 - -1.6.4 / 2014-10-08 -================== - - * Fix redirect loop when index file serving disabled - -1.6.3 / 2014-09-24 -================== - - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -1.6.2 / 2014-09-15 -================== - - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -1.6.1 / 2014-09-07 -================== - - * deps: send@0.9.1 - - deps: fresh@0.2.4 - -1.6.0 / 2014-09-07 -================== - - * deps: send@0.9.0 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - -1.5.4 / 2014-09-04 -================== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -1.5.3 / 2014-08-17 -================== - - * deps: send@0.8.3 - -1.5.2 / 2014-08-14 -================== - - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -1.5.1 / 2014-08-09 -================== - - * Fix parsing of weird `req.originalUrl` values - * deps: parseurl@~1.3.0 - * deps: utils-merge@1.0.0 - -1.5.0 / 2014-08-05 -================== - - * deps: send@0.8.1 - - Add `extensions` option - -1.4.4 / 2014-08-04 -================== - - * deps: send@0.7.4 - - Fix serving index files without root dir - -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/node_modules/serve-static/LICENSE b/node_modules/serve-static/LICENSE deleted file mode 100644 index cbe62e8e..00000000 --- a/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/serve-static/README.md b/node_modules/serve-static/README.md deleted file mode 100644 index 262d944a..00000000 --- a/node_modules/serve-static/README.md +++ /dev/null @@ -1,257 +0,0 @@ -# serve-static - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Linux Build][github-actions-ci-image]][github-actions-ci-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -## Install - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### acceptRanges - -Enable or disable accepting ranged requests, defaults to true. -Disabling this will not send `Accept-Ranges` and ignore the contents -of the `Range` request header. - -##### cacheControl - -Enable or disable setting `Cache-Control` response header, defaults to -true. Disabling this will ignore the `immutable` and `maxAge` options. - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when set -to "deny"). - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Deny a request for a dotfile and 403/`next()`. - - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`. - -The default value is similar to `'ignore'`, with the exception that this -default will not ignore the files within a directory that begins with a dot. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -Set file extension fallbacks. When set, if a file is not found, the given -extensions will be added to the file name and search for. The first that -exists will be served. Example: `['html', 'htm']`. - -The default value is `false`. - -##### fallthrough - -Set the middleware to have client errors fall-through as just unhandled -requests, otherwise forward a client error. The difference is that client -errors like a bad request or a request to a non-existent file will cause -this middleware to simply `next()` to your next middleware when this value -is `true`. When this value is `false`, these errors (even 404s), will invoke -`next(err)`. - -Typically `true` is desired such that multiple physical directories can be -mapped to the same web address or for routes to fill in non-existent files. - -The value `false` can be used if this middleware is mounted at a path that -is designed to be strictly a single file system directory, which allows for -short-circuiting 404s for less overhead. This middleware will also reply to -all methods. - -The default value is `true`. - -##### immutable - -Enable or disable the `immutable` directive in the `Cache-Control` response -header, defaults to `false`. If set to `true`, the `maxAge` option should -also be specified to enable caching. The `immutable` directive will prevent -supported clients from making conditional requests during the life of the -`maxAge` option to check if the file has changed. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. Alterations to the headers need to -occur synchronously. The function is called as `fn(res, path, stat)`, where -the arguments are: - - - `res` the response object - - `path` the file path that is being sent - - `stat` the stat object of the file that is being sent - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', { index: ['index.html', 'index.htm'] }) - -// Create server -var server = http.createServer(function onRequest (req, res) { - serve(req, res, finalhandler(req, res)) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files as downloads - -```js -var contentDisposition = require('content-disposition') -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', { - index: false, - setHeaders: setHeaders -}) - -// Set header to force download -function setHeaders (res, path) { - res.setHeader('Content-Disposition', contentDisposition(path)) -} - -// Create server -var server = http.createServer(function onRequest (req, res) { - serve(req, res, finalhandler(req, res)) -}) - -// Listen -server.listen(3000) -``` - -### Serving using express - -#### Simple - -This is a simple example of using Express. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', { index: ['default.html', 'default.htm'] })) -app.listen(3000) -``` - -#### Multiple roots - -This example shows a simple way to search through multiple directories. -Files are searched for in `public-optimized/` first, then `public/` second -as a fallback. - -```js -var express = require('express') -var path = require('path') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(path.join(__dirname, 'public-optimized'))) -app.use(serveStatic(path.join(__dirname, 'public'))) -app.listen(3000) -``` - -#### Different settings for paths - -This example shows how to set a different max age depending on the served -file type. In this example, HTML files are not cached, while everything else -is for 1 day. - -```js -var express = require('express') -var path = require('path') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(path.join(__dirname, 'public'), { - maxAge: '1d', - setHeaders: setCustomCacheControl -})) - -app.listen(3000) - -function setCustomCacheControl (res, path) { - if (serveStatic.mime.lookup(path) === 'text/html') { - // Custom Cache-Control for HTML files - res.setHeader('Cache-Control', 'public, max-age=0') - } -} -``` - -## License - -[MIT](LICENSE) - -[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/serve-static/master?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static -[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master -[coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master -[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/serve-static/master?label=linux -[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions/workflows/ci.yml -[node-image]: https://badgen.net/npm/node/serve-static -[node-url]: https://nodejs.org/en/download/ -[npm-downloads-image]: https://badgen.net/npm/dm/serve-static -[npm-url]: https://npmjs.org/package/serve-static -[npm-version-image]: https://badgen.net/npm/v/serve-static diff --git a/node_modules/serve-static/index.js b/node_modules/serve-static/index.js deleted file mode 100644 index b7d3984c..00000000 --- a/node_modules/serve-static/index.js +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var encodeUrl = require('encodeurl') -var escapeHtml = require('escape-html') -var parseUrl = require('parseurl') -var resolve = require('path').resolve -var send = require('send') -var url = require('url') - -/** - * Module exports. - * @public - */ - -module.exports = serveStatic -module.exports.mime = send.mime - -/** - * @param {string} root - * @param {object} [options] - * @return {function} - * @public - */ - -function serveStatic (root, options) { - if (!root) { - throw new TypeError('root path required') - } - - if (typeof root !== 'string') { - throw new TypeError('root path must be a string') - } - - // copy options object - var opts = Object.create(options || null) - - // fall-though - var fallthrough = opts.fallthrough !== false - - // default redirect - var redirect = opts.redirect !== false - - // headers listener - var setHeaders = opts.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - opts.maxage = opts.maxage || opts.maxAge || 0 - opts.root = resolve(root) - - // construct directory listener - var onDirectory = redirect - ? createRedirectDirectoryListener() - : createNotFoundDirectoryListener() - - return function serveStatic (req, res, next) { - if (req.method !== 'GET' && req.method !== 'HEAD') { - if (fallthrough) { - return next() - } - - // method not allowed - res.statusCode = 405 - res.setHeader('Allow', 'GET, HEAD') - res.setHeader('Content-Length', '0') - res.end() - return - } - - var forwardError = !fallthrough - var originalUrl = parseUrl.original(req) - var path = parseUrl(req).pathname - - // make sure redirect occurs at mount - if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - // add directory handler - stream.on('directory', onDirectory) - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // add file listener for fallthrough - if (fallthrough) { - stream.on('file', function onFile () { - // once file is determined, always forward error - forwardError = true - }) - } - - // forward errors - stream.on('error', function error (err) { - if (forwardError || !(err.statusCode < 500)) { - next(err) - return - } - - next() - }) - - // pipe - stream.pipe(res) - } -} - -/** - * Collapse all leading slashes into a single slash - * @private - */ -function collapseLeadingSlashes (str) { - for (var i = 0; i < str.length; i++) { - if (str.charCodeAt(i) !== 0x2f /* / */) { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - -/** - * Create a minimal HTML document. - * - * @param {string} title - * @param {string} body - * @private - */ - -function createHtmlDocument (title, body) { - return '\n' + - '\n' + - '\n' + - '\n' + - '' + title + '\n' + - '\n' + - '\n' + - '
' + body + '
\n' + - '\n' + - '\n' -} - -/** - * Create a directory listener that just 404s. - * @private - */ - -function createNotFoundDirectoryListener () { - return function notFound () { - this.error(404) - } -} - -/** - * Create a directory listener that performs a redirect. - * @private - */ - -function createRedirectDirectoryListener () { - return function redirect (res) { - if (this.hasTrailingSlash()) { - this.error(404) - return - } - - // get original URL - var originalUrl = parseUrl.original(this.req) - - // append trailing slash - originalUrl.path = null - originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') - - // reformat the URL - var loc = encodeUrl(url.format(originalUrl)) - var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + - escapeHtml(loc) + '') - - // send redirect response - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'none'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(doc) - } -} diff --git a/node_modules/serve-static/package.json b/node_modules/serve-static/package.json deleted file mode 100644 index 9d935f5d..00000000 --- a/node_modules/serve-static/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.15.0", - "author": "Douglas Christopher Wilson ", - "license": "MIT", - "repository": "expressjs/serve-static", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "devDependencies": { - "eslint": "7.32.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.4", - "eslint-plugin-markdown": "2.2.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "5.2.0", - "eslint-plugin-standard": "4.1.0", - "mocha": "9.2.2", - "nyc": "15.1.0", - "safe-buffer": "5.2.1", - "supertest": "6.2.2" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "version": "node scripts/version-history.js && git add HISTORY.md" - } -} diff --git a/node_modules/setprototypeof/LICENSE b/node_modules/setprototypeof/LICENSE deleted file mode 100644 index 61afa2f1..00000000 --- a/node_modules/setprototypeof/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2015, Wes Todd - -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/setprototypeof/README.md b/node_modules/setprototypeof/README.md deleted file mode 100644 index 791eeff0..00000000 --- a/node_modules/setprototypeof/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Polyfill for `Object.setPrototypeOf` - -[![NPM Version](https://img.shields.io/npm/v/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) -[![NPM Downloads](https://img.shields.io/npm/dm/setprototypeof.svg)](https://npmjs.org/package/setprototypeof) -[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](https://github.com/standard/standard) - -A simple cross platform implementation to set the prototype of an instianted object. Supports all modern browsers and at least back to IE8. - -## Usage: - -``` -$ npm install --save setprototypeof -``` - -```javascript -var setPrototypeOf = require('setprototypeof') - -var obj = {} -setPrototypeOf(obj, { - foo: function () { - return 'bar' - } -}) -obj.foo() // bar -``` - -TypeScript is also supported: - -```typescript -import setPrototypeOf from 'setprototypeof' -``` diff --git a/node_modules/setprototypeof/index.d.ts b/node_modules/setprototypeof/index.d.ts deleted file mode 100644 index f108ecd0..00000000 --- a/node_modules/setprototypeof/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare function setPrototypeOf(o: any, proto: object | null): any; -export = setPrototypeOf; diff --git a/node_modules/setprototypeof/index.js b/node_modules/setprototypeof/index.js deleted file mode 100644 index c5270551..00000000 --- a/node_modules/setprototypeof/index.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -/* eslint no-proto: 0 */ -module.exports = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties) - -function setProtoOf (obj, proto) { - obj.__proto__ = proto - return obj -} - -function mixinProperties (obj, proto) { - for (var prop in proto) { - if (!Object.prototype.hasOwnProperty.call(obj, prop)) { - obj[prop] = proto[prop] - } - } - return obj -} diff --git a/node_modules/setprototypeof/package.json b/node_modules/setprototypeof/package.json deleted file mode 100644 index f20915be..00000000 --- a/node_modules/setprototypeof/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "setprototypeof", - "version": "1.2.0", - "description": "A small polyfill for Object.setprototypeof", - "main": "index.js", - "typings": "index.d.ts", - "scripts": { - "test": "standard && mocha", - "testallversions": "npm run node010 && npm run node4 && npm run node6 && npm run node9 && npm run node11", - "testversion": "docker run -it --rm -v $(PWD):/usr/src/app -w /usr/src/app node:${NODE_VER} npm install mocha@${MOCHA_VER:-latest} && npm t", - "node010": "NODE_VER=0.10 MOCHA_VER=3 npm run testversion", - "node4": "NODE_VER=4 npm run testversion", - "node6": "NODE_VER=6 npm run testversion", - "node9": "NODE_VER=9 npm run testversion", - "node11": "NODE_VER=11 npm run testversion", - "prepublishOnly": "npm t", - "postpublish": "git push origin && git push origin --tags" - }, - "repository": { - "type": "git", - "url": "https://github.com/wesleytodd/setprototypeof.git" - }, - "keywords": [ - "polyfill", - "object", - "setprototypeof" - ], - "author": "Wes Todd", - "license": "ISC", - "bugs": { - "url": "https://github.com/wesleytodd/setprototypeof/issues" - }, - "homepage": "https://github.com/wesleytodd/setprototypeof", - "devDependencies": { - "mocha": "^6.1.4", - "standard": "^13.0.2" - } -} diff --git a/node_modules/setprototypeof/test/index.js b/node_modules/setprototypeof/test/index.js deleted file mode 100644 index afeb4ddb..00000000 --- a/node_modules/setprototypeof/test/index.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' -/* eslint-env mocha */ -/* eslint no-proto: 0 */ -var assert = require('assert') -var setPrototypeOf = require('..') - -describe('setProtoOf(obj, proto)', function () { - it('should merge objects', function () { - var obj = { a: 1, b: 2 } - var proto = { b: 3, c: 4 } - var mergeObj = setPrototypeOf(obj, proto) - - if (Object.getPrototypeOf) { - assert.strictEqual(Object.getPrototypeOf(obj), proto) - } else if ({ __proto__: [] } instanceof Array) { - assert.strictEqual(obj.__proto__, proto) - } else { - assert.strictEqual(obj.a, 1) - assert.strictEqual(obj.b, 2) - assert.strictEqual(obj.c, 4) - } - assert.strictEqual(mergeObj, obj) - }) -}) diff --git a/node_modules/side-channel/.eslintignore b/node_modules/side-channel/.eslintignore deleted file mode 100644 index 404abb22..00000000 --- a/node_modules/side-channel/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -coverage/ diff --git a/node_modules/side-channel/.eslintrc b/node_modules/side-channel/.eslintrc deleted file mode 100644 index 850ac1fa..00000000 --- a/node_modules/side-channel/.eslintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", - - "rules": { - "max-lines-per-function": 0, - "max-params": 0, - "new-cap": [2, { "capIsNewExceptions": ["GetIntrinsic"] }], - }, -} diff --git a/node_modules/side-channel/.github/FUNDING.yml b/node_modules/side-channel/.github/FUNDING.yml deleted file mode 100644 index 2a94840c..00000000 --- a/node_modules/side-channel/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# 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/side-channel -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/side-channel/.nycrc b/node_modules/side-channel/.nycrc deleted file mode 100644 index 1826526e..00000000 --- a/node_modules/side-channel/.nycrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "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/side-channel/CHANGELOG.md b/node_modules/side-channel/CHANGELOG.md deleted file mode 100644 index a3d161fa..00000000 --- a/node_modules/side-channel/CHANGELOG.md +++ /dev/null @@ -1,65 +0,0 @@ -# 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.4](https://github.com/ljharb/side-channel/compare/v1.0.3...v1.0.4) - 2020-12-29 - -### Commits - -- [Tests] migrate tests to Github Actions [`10909cb`](https://github.com/ljharb/side-channel/commit/10909cbf8ce9c0bf96f604cf13d7ffd5a22c2d40) -- [Refactor] Use a linked list rather than an array, and move accessed nodes to the beginning [`195613f`](https://github.com/ljharb/side-channel/commit/195613f28b5c1e6072ef0b61b5beebaf2b6a304e) -- [meta] do not publish github action workflow files [`290ec29`](https://github.com/ljharb/side-channel/commit/290ec29cd21a60585145b4a7237ec55228c52c27) -- [Tests] run `nyc` on all tests; use `tape` runner [`ea6d030`](https://github.com/ljharb/side-channel/commit/ea6d030ff3fe6be2eca39e859d644c51ecd88869) -- [actions] add "Allow Edits" workflow [`d464d8f`](https://github.com/ljharb/side-channel/commit/d464d8fe52b5eddf1504a0ed97f0941a90f32c15) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog` [`02daca8`](https://github.com/ljharb/side-channel/commit/02daca87c6809821c97be468d1afa2f5ef447383) -- [Refactor] use `call-bind` and `get-intrinsic` instead of `es-abstract` [`e09d481`](https://github.com/ljharb/side-channel/commit/e09d481528452ebafa5cdeae1af665c35aa2deee) -- [Deps] update `object.assign` [`ee83aa8`](https://github.com/ljharb/side-channel/commit/ee83aa81df313b5e46319a63adb05cf0c179079a) -- [actions] update rebase action to use checkout v2 [`7726b0b`](https://github.com/ljharb/side-channel/commit/7726b0b058b632fccea709f58960871defaaa9d7) - -## [v1.0.3](https://github.com/ljharb/side-channel/compare/v1.0.2...v1.0.3) - 2020-08-23 - -### Commits - -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`1f10561`](https://github.com/ljharb/side-channel/commit/1f105611ef3acf32dec8032ae5c0baa5e56bb868) -- [Deps] update `es-abstract`, `object-inspect` [`bc20159`](https://github.com/ljharb/side-channel/commit/bc201597949a505e37cef9eaf24c7010831e6f03) -- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`b9b2b22`](https://github.com/ljharb/side-channel/commit/b9b2b225f9e0ea72a6ec2b89348f0bd690bc9ed1) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`7055ab4`](https://github.com/ljharb/side-channel/commit/7055ab4de0860606efd2003674a74f1fe6ebc07e) -- [Dev Deps] update `auto-changelog`; add `aud` [`d278c37`](https://github.com/ljharb/side-channel/commit/d278c37d08227be4f84aa769fcd919e73feeba40) -- [actions] switch Automatic Rebase workflow to `pull_request_target` event [`3bcf982`](https://github.com/ljharb/side-channel/commit/3bcf982faa122745b39c33ce83d32fdf003741c6) -- [Tests] only audit prod deps [`18d01c4`](https://github.com/ljharb/side-channel/commit/18d01c4015b82a3d75044c4d5ba7917b2eac01ec) -- [Deps] update `es-abstract` [`6ab096d`](https://github.com/ljharb/side-channel/commit/6ab096d9de2b482cf5e0717e34e212f5b2b9bc9a) -- [Dev Deps] update `tape` [`9dc174c`](https://github.com/ljharb/side-channel/commit/9dc174cc651dfd300b4b72da936a0a7eda5f9452) -- [Deps] update `es-abstract` [`431d0f0`](https://github.com/ljharb/side-channel/commit/431d0f0ff11fbd2ae6f3115582a356d3a1cfce82) -- [Deps] update `es-abstract` [`49869fd`](https://github.com/ljharb/side-channel/commit/49869fd323bf4453f0ba515c0fb265cf5ab7b932) -- [meta] Add package.json to package's exports [`77d9cdc`](https://github.com/ljharb/side-channel/commit/77d9cdceb2a9e47700074f2ae0c0a202e7dac0d4) - -## [v1.0.2](https://github.com/ljharb/side-channel/compare/v1.0.1...v1.0.2) - 2019-12-20 - -### Commits - -- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`4a526df`](https://github.com/ljharb/side-channel/commit/4a526df44e4701566ed001ec78546193f818b082) -- [Deps] update `es-abstract` [`d4f6e62`](https://github.com/ljharb/side-channel/commit/d4f6e629b6fb93a07415db7f30d3c90fd7f264fe) - -## [v1.0.1](https://github.com/ljharb/side-channel/compare/v1.0.0...v1.0.1) - 2019-12-01 - -### Commits - -- [Fix] add missing "exports" [`d212907`](https://github.com/ljharb/side-channel/commit/d2129073abf0701a5343bf28aa2145617604dc2e) - -## v1.0.0 - 2019-12-01 - -### Commits - -- Initial implementation [`dbebd3a`](https://github.com/ljharb/side-channel/commit/dbebd3a4b5ed64242f9a6810efe7c4214cd8cde4) -- Initial tests [`73bdefe`](https://github.com/ljharb/side-channel/commit/73bdefe568c9076cf8c0b8719bc2141aec0e19b8) -- Initial commit [`43c03e1`](https://github.com/ljharb/side-channel/commit/43c03e1c2849ec50a87b7a5cd76238a62b0b8770) -- npm init [`5c090a7`](https://github.com/ljharb/side-channel/commit/5c090a765d66a5527d9889b89aeff78dee91348c) -- [meta] add `auto-changelog` [`a5c4e56`](https://github.com/ljharb/side-channel/commit/a5c4e5675ec02d5eb4d84b4243aeea2a1d38fbec) -- [actions] add automatic rebasing / merge commit blocking [`bab1683`](https://github.com/ljharb/side-channel/commit/bab1683d8f9754b086e94397699fdc645e0d7077) -- [meta] add `funding` field; create FUNDING.yml [`63d7aea`](https://github.com/ljharb/side-channel/commit/63d7aeaf34f5650650ae97ca4b9fae685bd0937c) -- [Tests] add `npm run lint` [`46a5a81`](https://github.com/ljharb/side-channel/commit/46a5a81705cd2664f83df232c01dbbf2ee952885) -- Only apps should have lockfiles [`8b16b03`](https://github.com/ljharb/side-channel/commit/8b16b0305f00895d90c4e2e5773c854cfea0e448) -- [meta] add `safe-publish-latest` [`2f098ef`](https://github.com/ljharb/side-channel/commit/2f098ef092a39399cfe548b19a1fc03c2fd2f490) diff --git a/node_modules/side-channel/LICENSE b/node_modules/side-channel/LICENSE deleted file mode 100644 index 3900dd7e..00000000 --- a/node_modules/side-channel/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 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/side-channel/README.md b/node_modules/side-channel/README.md deleted file mode 100644 index 7fa4f068..00000000 --- a/node_modules/side-channel/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# side-channel -Store information about any JS value in a side channel. Uses WeakMap if available. diff --git a/node_modules/side-channel/index.js b/node_modules/side-channel/index.js deleted file mode 100644 index f1c48264..00000000 --- a/node_modules/side-channel/index.js +++ /dev/null @@ -1,124 +0,0 @@ -'use strict'; - -var GetIntrinsic = require('get-intrinsic'); -var callBound = require('call-bind/callBound'); -var inspect = require('object-inspect'); - -var $TypeError = GetIntrinsic('%TypeError%'); -var $WeakMap = GetIntrinsic('%WeakMap%', true); -var $Map = GetIntrinsic('%Map%', true); - -var $weakMapGet = callBound('WeakMap.prototype.get', true); -var $weakMapSet = callBound('WeakMap.prototype.set', true); -var $weakMapHas = callBound('WeakMap.prototype.has', true); -var $mapGet = callBound('Map.prototype.get', true); -var $mapSet = callBound('Map.prototype.set', true); -var $mapHas = callBound('Map.prototype.has', true); - -/* - * This function traverses the list returning the node corresponding to the - * given key. - * - * That node is also moved to the head of the list, so that if it's accessed - * again we don't need to traverse the whole list. By doing so, all the recently - * used nodes can be accessed relatively quickly. - */ -var listGetNode = function (list, key) { // eslint-disable-line consistent-return - for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { - if (curr.key === key) { - prev.next = curr.next; - curr.next = list.next; - list.next = curr; // eslint-disable-line no-param-reassign - return curr; - } - } -}; - -var listGet = function (objects, key) { - var node = listGetNode(objects, key); - return node && node.value; -}; -var listSet = function (objects, key, value) { - var node = listGetNode(objects, key); - if (node) { - node.value = value; - } else { - // Prepend the new node to the beginning of the list - objects.next = { // eslint-disable-line no-param-reassign - key: key, - next: objects.next, - value: value - }; - } -}; -var listHas = function (objects, key) { - return !!listGetNode(objects, key); -}; - -module.exports = function getSideChannel() { - var $wm; - var $m; - var $o; - var channel = { - assert: function (key) { - if (!channel.has(key)) { - throw new $TypeError('Side channel does not contain ' + inspect(key)); - } - }, - get: function (key) { // eslint-disable-line consistent-return - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapGet($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapGet($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listGet($o, key); - } - } - }, - has: function (key) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapHas($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapHas($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listHas($o, key); - } - } - return false; - }, - set: function (key, value) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if (!$wm) { - $wm = new $WeakMap(); - } - $weakMapSet($wm, key, value); - } else if ($Map) { - if (!$m) { - $m = new $Map(); - } - $mapSet($m, key, value); - } else { - if (!$o) { - /* - * Initialize the linked list as an empty node, so that we don't have - * to special-case handling of the first node: we can always refer to - * it as (previous node).next, instead of something like (list).head - */ - $o = { key: {}, next: null }; - } - listSet($o, key, value); - } - } - }; - return channel; -}; diff --git a/node_modules/side-channel/package.json b/node_modules/side-channel/package.json deleted file mode 100644 index a3e33f66..00000000 --- a/node_modules/side-channel/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "side-channel", - "version": "1.0.4", - "description": "Store information about any JS value in a side channel. Uses WeakMap if available.", - "main": "index.js", - "exports": { - "./package.json": "./package.json", - ".": [ - { - "default": "./index.js" - }, - "./index.js" - ] - }, - "scripts": { - "prepublish": "safe-publish-latest", - "lint": "eslint .", - "pretest": "npm run lint", - "tests-only": "nyc tape 'test/**/*.js'", - "test": "npm run tests-only", - "posttest": "npx 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/side-channel.git" - }, - "keywords": [ - "weakmap", - "map", - "side", - "channel", - "metadata" - ], - "author": "Jordan Harband ", - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/ljharb/side-channel/issues" - }, - "homepage": "https://github.com/ljharb/side-channel#readme", - "devDependencies": { - "@ljharb/eslint-config": "^17.3.0", - "aud": "^1.1.3", - "auto-changelog": "^2.2.1", - "eslint": "^7.16.0", - "nyc": "^10.3.2", - "safe-publish-latest": "^1.1.4", - "tape": "^5.0.1" - }, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "auto-changelog": { - "output": "CHANGELOG.md", - "template": "keepachangelog", - "unreleased": false, - "commitLimit": false, - "backfillLimit": false, - "hideCredit": true - } -} diff --git a/node_modules/side-channel/test/index.js b/node_modules/side-channel/test/index.js deleted file mode 100644 index 3b92ef7e..00000000 --- a/node_modules/side-channel/test/index.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -var test = require('tape'); - -var getSideChannel = require('../'); - -test('export', function (t) { - t.equal(typeof getSideChannel, 'function', 'is a function'); - t.equal(getSideChannel.length, 0, 'takes no arguments'); - - var channel = getSideChannel(); - t.ok(channel, 'is truthy'); - t.equal(typeof channel, 'object', 'is an object'); - - t.end(); -}); - -test('assert', function (t) { - var channel = getSideChannel(); - t['throws']( - function () { channel.assert({}); }, - TypeError, - 'nonexistent value throws' - ); - - var o = {}; - channel.set(o, 'data'); - t.doesNotThrow(function () { channel.assert(o); }, 'existent value noops'); - - t.end(); -}); - -test('has', function (t) { - var channel = getSideChannel(); - var o = []; - - t.equal(channel.has(o), false, 'nonexistent value yields false'); - - channel.set(o, 'foo'); - t.equal(channel.has(o), true, 'existent value yields true'); - - t.end(); -}); - -test('get', function (t) { - var channel = getSideChannel(); - var o = {}; - t.equal(channel.get(o), undefined, 'nonexistent value yields undefined'); - - var data = {}; - channel.set(o, data); - t.equal(channel.get(o), data, '"get" yields data set by "set"'); - - t.end(); -}); - -test('set', function (t) { - var channel = getSideChannel(); - var o = function () {}; - t.equal(channel.get(o), undefined, 'value not set'); - - channel.set(o, 42); - t.equal(channel.get(o), 42, 'value was set'); - - channel.set(o, Infinity); - t.equal(channel.get(o), Infinity, 'value was set again'); - - var o2 = {}; - channel.set(o2, 17); - t.equal(channel.get(o), Infinity, 'o is not modified'); - t.equal(channel.get(o2), 17, 'o2 is set'); - - channel.set(o, 14); - t.equal(channel.get(o), 14, 'o is modified'); - t.equal(channel.get(o2), 17, 'o2 is not modified'); - - t.end(); -}); diff --git a/node_modules/simple-update-notifier/LICENSE b/node_modules/simple-update-notifier/LICENSE deleted file mode 100644 index 1e0b0c11..00000000 --- a/node_modules/simple-update-notifier/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Alex Brazier - -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/simple-update-notifier/README.md b/node_modules/simple-update-notifier/README.md deleted file mode 100644 index ec177944..00000000 --- a/node_modules/simple-update-notifier/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# simple-update-notifier [![GitHub stars](https://img.shields.io/github/stars/alexbrazier/simple-update-notifier?label=Star%20Project&style=social)](https://github.com/alexbrazier/simple-update-notifier/stargazers) - -[![CI](https://github.com/alexbrazier/simple-update-notifier/workflows/Build%20and%20Deploy/badge.svg)](https://github.com/alexbrazier/simple-update-notifier/actions) -[![Dependencies](https://img.shields.io/librariesio/release/npm/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier?activeTab=dependencies) -[![npm](https://img.shields.io/npm/v/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) -[![npm bundle size](https://img.shields.io/bundlephobia/min/simple-update-notifier)](https://bundlephobia.com/result?p=simple-update-notifier) -[![npm downloads](https://img.shields.io/npm/dw/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) -[![License](https://img.shields.io/npm/l/simple-update-notifier)](./LICENSE) - -Simple update notifier to check for npm updates for cli applications. - -Demo in terminal showing an update is required - -Checks for updates for an npm module and outputs to the command line if there is one available. The result is cached for the specified time so it doesn't check every time the app runs. - -## Install - -```bash -npm install simple-update-notifier -OR -yarn add simple-update-notifier -``` - -## Usage - -```js -import updateNotifier from 'simple-update-notifier'; -import packageJson from './package.json' assert { type: 'json' }; - -updateNotifier({ pkg: packageJson }); -``` - -### Options - -#### pkg - -Type: `object` - -##### name - -_Required_\ -Type: `string` - -##### version - -_Required_\ -Type: `string` - -#### updateCheckInterval - -Type: `number`\ -Default: `1000 * 60 * 60 * 24` _(1 day)_ - -How often to check for updates. - -#### shouldNotifyInNpmScript - -Type: `boolean`\ -Default: `false` - -Allows notification to be shown when running as an npm script. - -#### distTag - -Type: `string`\ -Default: `'latest'` - -Which [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages) to use to find the latest version. - -#### alwaysRun - -Type: `boolean`\ -Default: `false` - -When set, `updateCheckInterval` will not be respected and a check for an update will always be performed. - -#### debug - -Type: `boolean`\ -Default: `false` - -When set, logs explaining the decision will be output to `stderr` whenever the module opts to not print an update notification diff --git a/node_modules/simple-update-notifier/build/index.d.ts b/node_modules/simple-update-notifier/build/index.d.ts deleted file mode 100644 index 60f53e05..00000000 --- a/node_modules/simple-update-notifier/build/index.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -interface IUpdate { - pkg: { - name: string; - version: string; - }; - updateCheckInterval?: number; - shouldNotifyInNpmScript?: boolean; - distTag?: string; - alwaysRun?: boolean; - debug?: boolean; -} -declare const simpleUpdateNotifier: (args: IUpdate) => Promise; -export { simpleUpdateNotifier as default }; diff --git a/node_modules/simple-update-notifier/build/index.js b/node_modules/simple-update-notifier/build/index.js deleted file mode 100644 index 3dd2076c..00000000 --- a/node_modules/simple-update-notifier/build/index.js +++ /dev/null @@ -1,217 +0,0 @@ -'use strict'; - -var process$1 = require('process'); -var semver = require('semver'); -var os = require('os'); -var path = require('path'); -var fs = require('fs'); -var https = require('https'); - -function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - -var process__default = /*#__PURE__*/_interopDefaultLegacy(process$1); -var semver__default = /*#__PURE__*/_interopDefaultLegacy(semver); -var os__default = /*#__PURE__*/_interopDefaultLegacy(os); -var path__default = /*#__PURE__*/_interopDefaultLegacy(path); -var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); -var https__default = /*#__PURE__*/_interopDefaultLegacy(https); - -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -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. -***************************************************************************** */ - -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var packageJson = process__default["default"].env.npm_package_json; -var userAgent = process__default["default"].env.npm_config_user_agent; -var isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); -var isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); -var isNpm = isNpm6 || isNpm7; -var isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); -var isNpmOrYarn = isNpm || isYarn; - -var homeDirectory = os__default["default"].homedir(); -var configDir = process.env.XDG_CONFIG_HOME || - path__default["default"].join(homeDirectory, '.config', 'simple-update-notifier'); -var getConfigFile = function (packageName) { - return path__default["default"].join(configDir, "".concat(packageName.replace('@', '').replace('/', '__'), ".json")); -}; -var createConfigDir = function () { - if (!fs__default["default"].existsSync(configDir)) { - fs__default["default"].mkdirSync(configDir, { recursive: true }); - } -}; -var getLastUpdate = function (packageName) { - var configFile = getConfigFile(packageName); - try { - if (!fs__default["default"].existsSync(configFile)) { - return undefined; - } - var file = JSON.parse(fs__default["default"].readFileSync(configFile, 'utf8')); - return file.lastUpdateCheck; - } - catch (_a) { - return undefined; - } -}; -var saveLastUpdate = function (packageName) { - var configFile = getConfigFile(packageName); - fs__default["default"].writeFileSync(configFile, JSON.stringify({ lastUpdateCheck: new Date().getTime() })); -}; - -var getDistVersion = function (packageName, distTag) { return __awaiter(void 0, void 0, void 0, function () { - var url; - return __generator(this, function (_a) { - url = "https://registry.npmjs.org/-/package/".concat(packageName, "/dist-tags"); - return [2 /*return*/, new Promise(function (resolve, reject) { - https__default["default"] - .get(url, function (res) { - var body = ''; - res.on('data', function (chunk) { return (body += chunk); }); - res.on('end', function () { - try { - var json = JSON.parse(body); - var version = json[distTag]; - if (!version) { - reject(new Error('Error getting version')); - } - resolve(version); - } - catch (_a) { - reject(new Error('Could not parse version response')); - } - }); - }) - .on('error', function (err) { return reject(err); }); - })]; - }); -}); }; - -var hasNewVersion = function (_a) { - var pkg = _a.pkg, _b = _a.updateCheckInterval, updateCheckInterval = _b === void 0 ? 1000 * 60 * 60 * 24 : _b, _c = _a.distTag, distTag = _c === void 0 ? 'latest' : _c, alwaysRun = _a.alwaysRun, debug = _a.debug; - return __awaiter(void 0, void 0, void 0, function () { - var lastUpdateCheck, latestVersion; - return __generator(this, function (_d) { - switch (_d.label) { - case 0: - createConfigDir(); - lastUpdateCheck = getLastUpdate(pkg.name); - if (!(alwaysRun || - !lastUpdateCheck || - lastUpdateCheck < new Date().getTime() - updateCheckInterval)) return [3 /*break*/, 2]; - return [4 /*yield*/, getDistVersion(pkg.name, distTag)]; - case 1: - latestVersion = _d.sent(); - saveLastUpdate(pkg.name); - if (semver__default["default"].gt(latestVersion, pkg.version)) { - return [2 /*return*/, latestVersion]; - } - else if (debug) { - console.error("Latest version (".concat(latestVersion, ") not newer than current version (").concat(pkg.version, ")")); - } - return [3 /*break*/, 3]; - case 2: - if (debug) { - console.error("Too recent to check for a new update. simpleUpdateNotifier() interval set to ".concat(updateCheckInterval, "ms but only ").concat(new Date().getTime() - lastUpdateCheck, "ms since last check.")); - } - _d.label = 3; - case 3: return [2 /*return*/, false]; - } - }); - }); -}; - -var borderedText = function (text) { - var lines = text.split('\n'); - var width = Math.max.apply(Math, lines.map(function (l) { return l.length; })); - var res = ["\u250C".concat('─'.repeat(width + 2), "\u2510")]; - for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) { - var line = lines_1[_i]; - res.push("\u2502 ".concat(line.padEnd(width), " \u2502")); - } - res.push("\u2514".concat('─'.repeat(width + 2), "\u2518")); - return res.join('\n'); -}; - -var simpleUpdateNotifier = function (args) { return __awaiter(void 0, void 0, void 0, function () { - var latestVersion, err_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!args.alwaysRun && - (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))) { - if (args.debug) { - console.error('Opting out of running simpleUpdateNotifier()'); - } - return [2 /*return*/]; - } - _a.label = 1; - case 1: - _a.trys.push([1, 3, , 4]); - return [4 /*yield*/, hasNewVersion(args)]; - case 2: - latestVersion = _a.sent(); - if (latestVersion) { - console.error(borderedText("New version of ".concat(args.pkg.name, " available!\nCurrent Version: ").concat(args.pkg.version, "\nLatest Version: ").concat(latestVersion))); - } - return [3 /*break*/, 4]; - case 3: - err_1 = _a.sent(); - // Catch any network errors or cache writing errors so module doesn't cause a crash - if (args.debug && err_1 instanceof Error) { - console.error('Unexpected error in simpleUpdateNotifier():', err_1); - } - return [3 /*break*/, 4]; - case 4: return [2 /*return*/]; - } - }); -}); }; - -module.exports = simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/node_modules/.bin/semver b/node_modules/simple-update-notifier/node_modules/.bin/semver deleted file mode 120000 index 5aaadf42..00000000 --- a/node_modules/simple-update-notifier/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver.js \ No newline at end of file diff --git a/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md b/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md deleted file mode 100644 index d366696b..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -# changes log - -## 6.3.0 - -* Expose the token enum on the exports - -## 6.2.0 - -* Coerce numbers to strings when passed to semver.coerce() -* Add `rtl` option to coerce from right to left - -## 6.1.3 - -* Handle X-ranges properly in includePrerelease mode - -## 6.1.2 - -* Do not throw when testing invalid version strings - -## 6.1.1 - -* Add options support for semver.coerce() -* Handle undefined version passed to Range.test - -## 6.1.0 - -* Add semver.compareBuild function -* Support `*` in semver.intersects - -## 6.0 - -* Fix `intersects` logic. - - This is technically a bug fix, but since it is also a change to behavior - that may require users updating their code, it is marked as a major - version increment. - -## 5.7 - -* Add `minVersion` method - -## 5.6 - -* Move boolean `loose` param to an options object, with - backwards-compatibility protection. -* Add ability to opt out of special prerelease version handling with - the `includePrerelease` option flag. - -## 5.5 - -* Add version coercion capabilities - -## 5.4 - -* Add intersection checking - -## 5.3 - -* Add `minSatisfying` method - -## 5.2 - -* Add `prerelease(v)` that returns prerelease components - -## 5.1 - -* Add Backus-Naur for ranges -* Remove excessively cute inspection methods - -## 5.0 - -* Remove AMD/Browserified build artifacts -* Fix ltr and gtr when using the `*` range -* Fix for range `*` with a prerelease identifier diff --git a/node_modules/simple-update-notifier/node_modules/semver/LICENSE b/node_modules/simple-update-notifier/node_modules/semver/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -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/simple-update-notifier/node_modules/semver/README.md b/node_modules/simple-update-notifier/node_modules/semver/README.md deleted file mode 100644 index 15464585..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/README.md +++ /dev/null @@ -1,499 +0,0 @@ -semver(1) -- The semantic versioner for npm -=========================================== - -## Install - -```bash -npm install semver -```` - -## Usage - -As a node module: - -```js -const 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 -semver.minVersion('>=1.0.0') // '1.0.0' -semver.valid(semver.coerce('v2')) // '2.0.0' -semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' -``` - -As a command-line utility: - -``` -$ semver -h - -A JavaScript implementation of the https://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 - --p --include-prerelease - Always include prerelease versions in range matching - --c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - ---rtl - Coerce version strings right to left - ---ltr - Coerce version strings left to right (default) - -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. - -Note that this behavior can be suppressed (treating all prerelease -versions as if they were normal versions, for the purpose of range -matching) by setting the `includePrerelease` flag on the options -object to any -[functions](https://github.com/npm/node-semver#functions) that do -range matching. - -#### 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: - -```bash -$ semver 1.2.3 -i prerelease --preid beta -1.2.4-beta.0 -``` - -Which then can be used to increment further: - -```bash -$ 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 element 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 `options` object argument. All -options in this object are `false` by default. The options supported -are: - -- `loose` Be more forgiving about not-quite-valid semver strings. - (Any resulting output will always be 100% strict compliant, of - course.) For backwards compatibility reasons, if the `options` - argument is a boolean value instead of an object, it is interpreted - to be the `loose` param. -- `includePrerelease` Set to suppress the [default - behavior](https://github.com/npm/node-semver#prerelease-tags) of - excluding prerelease tagged versions from ranges unless they are - explicitly opted into. - -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. -* `intersects(r1, r2, loose)`: Return true if the two supplied ranges - or comparators intersect. -* `parse(v)`: Attempt to parse a string as a semantic version, returning either - a `SemVer` object or `null`. - -### 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()`. -* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions - are equal. Sorts in ascending order if passed to `Array.sort()`. - `v2` is greater. Sorts in ascending order if 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. - -### Comparators - -* `intersects(comparator)`: Return true if the comparators intersect - -### 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. -* `minVersion(range)`: Return the lowest version that can possibly match - the given range. -* `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`.) -* `intersects(range)`: Return true if any of the ranges comparators intersect - -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. - -### Coercion - -* `coerce(version, options)`: Coerces a string to semver if possible - -This aims to provide a very forgiving translation of a non-semver string to -semver. It looks for the first digit in a string, and consumes all -remaining characters which satisfy at least a partial semver (e.g., `1`, -`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer -versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All -surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes -`3.4.0`). Only text which lacks digits will fail coercion (`version one` -is not valid). The maximum length for any semver component considered for -coercion is 16 characters; longer components will be ignored -(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any -semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value -components are invalid (`9999999999999999.4.7.4` is likely invalid). - -If the `options.rtl` flag is set, then `coerce` will return the right-most -coercible tuple that does not share an ending index with a longer coercible -tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not -`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of -any other overlapping SemVer tuple. - -### Clean - -* `clean(version)`: Clean a string to be a valid semver if possible - -This will return a cleaned and trimmed semver version. If the provided -version is not valid a null will be returned. This does not work for -ranges. - -ex. -* `s.clean(' = v 2.1.5foo')`: `null` -* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` -* `s.clean(' = v 2.1.5-foo')`: `null` -* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` -* `s.clean('=v2.1.5')`: `'2.1.5'` -* `s.clean(' =v2.1.5')`: `2.1.5` -* `s.clean(' 2.1.5 ')`: `'2.1.5'` -* `s.clean('~1.0.0')`: `null` - -## Exported Modules - - - -You may pull in just the part of this semver utility that you need, if you -are sensitive to packing and tree-shaking concerns. The main -`require('semver')` export uses getter functions to lazily load the parts -of the API that are used. - -The following modules are available: - -* `require('semver')` -* `require('semver/classes')` -* `require('semver/classes/comparator')` -* `require('semver/classes/range')` -* `require('semver/classes/semver')` -* `require('semver/functions/clean')` -* `require('semver/functions/cmp')` -* `require('semver/functions/coerce')` -* `require('semver/functions/compare')` -* `require('semver/functions/compare-build')` -* `require('semver/functions/compare-loose')` -* `require('semver/functions/diff')` -* `require('semver/functions/eq')` -* `require('semver/functions/gt')` -* `require('semver/functions/gte')` -* `require('semver/functions/inc')` -* `require('semver/functions/lt')` -* `require('semver/functions/lte')` -* `require('semver/functions/major')` -* `require('semver/functions/minor')` -* `require('semver/functions/neq')` -* `require('semver/functions/parse')` -* `require('semver/functions/patch')` -* `require('semver/functions/prerelease')` -* `require('semver/functions/rcompare')` -* `require('semver/functions/rsort')` -* `require('semver/functions/satisfies')` -* `require('semver/functions/sort')` -* `require('semver/functions/valid')` -* `require('semver/ranges/gtr')` -* `require('semver/ranges/intersects')` -* `require('semver/ranges/ltr')` -* `require('semver/ranges/max-satisfying')` -* `require('semver/ranges/min-satisfying')` -* `require('semver/ranges/min-version')` -* `require('semver/ranges/outside')` -* `require('semver/ranges/to-comparators')` -* `require('semver/ranges/valid')` diff --git a/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js b/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js deleted file mode 100755 index 73fe2953..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/bin/semver.js +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env node -// Standalone semver comparison program. -// Exits successfully and prints matching version(s) if -// any supplied version is valid and passes all tests. - -const argv = process.argv.slice(2) - -let versions = [] - -const range = [] - -let inc = null - -const version = require('../package.json').version - -let loose = false - -let includePrerelease = false - -let coerce = false - -let rtl = false - -let identifier - -const semver = require('../') - -let reverse = false - -const options = {} - -const main = () => { - if (!argv.length) return help() - while (argv.length) { - let a = argv.shift() - const indexOfEqualSign = a.indexOf('=') - if (indexOfEqualSign !== -1) { - a = a.slice(0, indexOfEqualSign) - argv.unshift(a.slice(indexOfEqualSign + 1)) - } - switch (a) { - case '-rv': case '-rev': case '--rev': case '--reverse': - reverse = true - break - case '-l': case '--loose': - loose = true - break - case '-p': case '--include-prerelease': - includePrerelease = true - break - case '-v': case '--version': - versions.push(argv.shift()) - break - case '-i': case '--inc': case '--increment': - switch (argv[0]) { - case 'major': case 'minor': case 'patch': case 'prerelease': - case 'premajor': case 'preminor': case 'prepatch': - inc = argv.shift() - break - default: - inc = 'patch' - break - } - break - case '--preid': - identifier = argv.shift() - break - case '-r': case '--range': - range.push(argv.shift()) - break - case '-c': case '--coerce': - coerce = true - break - case '--rtl': - rtl = true - break - case '--ltr': - rtl = false - break - case '-h': case '--help': case '-?': - return help() - default: - versions.push(a) - break - } - } - - const options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl } - - versions = versions.map((v) => { - return coerce ? (semver.coerce(v, options) || { version: v }).version : v - }).filter((v) => { - return semver.valid(v) - }) - if (!versions.length) return fail() - if (inc && (versions.length !== 1 || range.length)) { return failInc() } - - for (let i = 0, l = range.length; i < l; i++) { - versions = versions.filter((v) => { - return semver.satisfies(v, range[i], options) - }) - if (!versions.length) return fail() - } - return success(versions) -} - - -const failInc = () => { - console.error('--inc can only be used on a single version with no range') - fail() -} - -const fail = () => process.exit(1) - -const success = () => { - const compare = reverse ? 'rcompare' : 'compare' - versions.sort((a, b) => { - return semver[compare](a, b, options) - }).map((v) => { - return semver.clean(v, options) - }).map((v) => { - return inc ? semver.inc(v, inc, options, identifier) : v - }).forEach((v, i, _) => { console.log(v) }) -} - -const help = () => console.log( -`SemVer ${version} - -A JavaScript implementation of the https://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 - --p --include-prerelease - Always include prerelease versions in range matching - --c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - ---rtl - Coerce version strings right to left - ---ltr - Coerce version strings left to right (default) - -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.`) - -main() diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js b/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js deleted file mode 100644 index 3595792d..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/classes/comparator.js +++ /dev/null @@ -1,139 +0,0 @@ -const ANY = Symbol('SemVer ANY') -// hoisted class for cyclic dependency -class Comparator { - static get ANY () { - return ANY - } - constructor (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) - } - - parse (comp) { - const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - const m = comp.match(r) - - if (!m) { - throw new TypeError(`Invalid comparator: ${comp}`) - } - - this.operator = m[1] !== undefined ? 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.options.loose) - } - } - - toString () { - return this.value - } - - test (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY || version === ANY) { - return true - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - return cmp(version, this.operator, this.semver, this.options) - } - - intersects (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (this.operator === '') { - if (this.value === '') { - return true - } - return new Range(comp.value, options).test(this.value) - } else if (comp.operator === '') { - if (comp.value === '') { - return true - } - return new Range(this.value, options).test(comp.semver) - } - - const sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - const sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - const sameSemVer = this.semver.version === comp.semver.version - const differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - const oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<') - const oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>') - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ) - } -} - -module.exports = Comparator - -const {re, t} = require('../internal/re') -const cmp = require('../functions/cmp') -const debug = require('../internal/debug') -const SemVer = require('./semver') -const Range = require('./range') diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/index.js b/node_modules/simple-update-notifier/node_modules/semver/classes/index.js deleted file mode 100644 index 198b84d6..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/classes/index.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - SemVer: require('./semver.js'), - Range: require('./range.js'), - Comparator: require('./comparator.js') -} diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/range.js b/node_modules/simple-update-notifier/node_modules/semver/classes/range.js deleted file mode 100644 index 90876c38..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/classes/range.js +++ /dev/null @@ -1,448 +0,0 @@ -// hoisted class for cyclic dependency -class Range { - constructor (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (range instanceof Range) { - if ( - range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease - ) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - // just put it in the set and return - this.raw = range.value - this.set = [[range]] - this.format() - return this - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range - .split(/\s*\|\|\s*/) - // map the range to a 2d array of comparators - .map(range => this.parseRange(range.trim())) - // throw out any comparator lists that are empty - // this generally means that it was not a valid range, which is allowed - // in loose mode, but will still throw if the WHOLE range is invalid. - .filter(c => c.length) - - if (!this.set.length) { - throw new TypeError(`Invalid SemVer Range: ${range}`) - } - - this.format() - } - - format () { - this.range = this.set - .map((comps) => { - return comps.join(' ').trim() - }) - .join('||') - .trim() - return this.range - } - - toString () { - return this.range - } - - parseRange (range) { - const loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.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[t.COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[t.COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[t.TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[t.CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] - return range - .split(' ') - .map(comp => parseComparator(comp, this.options)) - .join(' ') - .split(/\s+/) - // in loose mode, throw out any that are not valid comparators - .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) - .map(comp => new Comparator(comp, this.options)) - } - - intersects (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some((thisComparators) => { - return ( - isSatisfiable(thisComparators, options) && - range.set.some((rangeComparators) => { - return ( - isSatisfiable(rangeComparators, options) && - thisComparators.every((thisComparator) => { - return rangeComparators.every((rangeComparator) => { - return thisComparator.intersects(rangeComparator, options) - }) - }) - ) - }) - ) - }) - } - - // if ANY of the sets match ALL of its comparators, then pass - test (version) { - if (!version) { - return false - } - - if (typeof version === 'string') { - try { - version = new SemVer(version, this.options) - } catch (er) { - return false - } - } - - for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false - } -} -module.exports = Range - -const Comparator = require('./comparator') -const debug = require('../internal/debug') -const SemVer = require('./semver') -const { - re, - t, - comparatorTrimReplace, - tildeTrimReplace, - caretTrimReplace -} = require('../internal/re') - -// take a set of comparators and determine whether there -// exists a version which can satisfy it -const isSatisfiable = (comparators, options) => { - let result = true - const remainingComparators = comparators.slice() - let testComparator = remainingComparators.pop() - - while (result && remainingComparators.length) { - result = remainingComparators.every((otherComparator) => { - return testComparator.intersects(otherComparator, options) - }) - - testComparator = remainingComparators.pop() - } - - return result -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -const parseComparator = (comp, options) => { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -const isX = id => !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 -const replaceTildes = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceTilde(comp, options) - }).join(' ') - -const replaceTilde = (comp, options) => { - const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] - return comp.replace(r, (_, M, m, p, pr) => { - debug('tilde', comp, _, M, m, p, pr) - let 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) - 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 -const replaceCarets = (comp, options) => - comp.trim().split(/\s+/).map((comp) => { - return replaceCaret(comp, options) - }).join(' ') - -const replaceCaret = (comp, options) => { - debug('caret', comp, options) - const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] - return comp.replace(r, (_, M, m, p, pr) => { - debug('caret', comp, _, M, m, p, pr) - let 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 (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 - }) -} - -const replaceXRanges = (comp, options) => { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map((comp) => { - return replaceXRange(comp, options) - }).join(' ') -} - -const replaceXRange = (comp, options) => { - comp = comp.trim() - const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] - return comp.replace(r, (ret, gtlt, M, m, p, pr) => { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - const xM = isX(M) - const xm = xM || isX(m) - const xp = xm || isX(p) - const anyX = xp - - if (gtlt === '=' && anyX) { - gtlt = '' - } - - // if we're including prereleases in the match, then we need - // to fix this to -0, the lowest possible prerelease value - pr = options.includePrerelease ? '-0' : '' - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0-0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - 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}${pr}` - } else if (xm) { - ret = `>=${M}.0.0${pr} <${+M + 1}.0.0${pr}` - } else if (xp) { - ret = `>=${M}.${m}.0${pr - } <${M}.${+m + 1}.0${pr}` - } - - 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. -const replaceStars = (comp, options) => { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[t.STAR], '') -} - -// This function is passed to string.replace(re[t.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 -const 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() -} - -const testSet = (set, version, options) => { - for (let i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // 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 (let i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === Comparator.ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - const 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 -} diff --git a/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js b/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js deleted file mode 100644 index 73247ad2..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/classes/semver.js +++ /dev/null @@ -1,290 +0,0 @@ -const debug = require('../internal/debug') -const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants') -const { re, t } = require('../internal/re') - -const { compareIdentifiers } = require('../internal/identifiers') -class SemVer { - constructor (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === !!options.loose && - version.includePrerelease === !!options.includePrerelease) { - 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` - ) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - // this isn't actually relevant for versions, but keep it so that we - // don't run into trouble passing this.options around. - this.includePrerelease = !!options.includePrerelease - - const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.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((id) => { - if (/^[0-9]+$/.test(id)) { - const num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } - - this.build = m[5] ? m[5].split('.') : [] - this.format() - } - - format () { - this.version = `${this.major}.${this.minor}.${this.patch}` - if (this.prerelease.length) { - this.version += `-${this.prerelease.join('.')}` - } - return this.version - } - - toString () { - return this.version - } - - compare (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - if (typeof other === 'string' && other === this.version) { - return 0 - } - other = new SemVer(other, this.options) - } - - if (other.version === this.version) { - return 0 - } - - return this.compareMain(other) || this.comparePre(other) - } - - compareMain (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ) - } - - comparePre (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - // 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 - } - - let i = 0 - do { - const a = this.prerelease[i] - const 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) - } - - compareBuild (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - let i = 0 - do { - const a = this.build[i] - const b = other.build[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. - inc (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 { - let 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 - } -} - -module.exports = SemVer diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js b/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js deleted file mode 100644 index 811fe6b8..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/clean.js +++ /dev/null @@ -1,6 +0,0 @@ -const parse = require('./parse') -const clean = (version, options) => { - const s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} -module.exports = clean diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js b/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js deleted file mode 100644 index 3b89db77..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/cmp.js +++ /dev/null @@ -1,48 +0,0 @@ -const eq = require('./eq') -const neq = require('./neq') -const gt = require('./gt') -const gte = require('./gte') -const lt = require('./lt') -const lte = require('./lte') - -const cmp = (a, op, b, loose) => { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError(`Invalid operator: ${op}`) - } -} -module.exports = cmp diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js b/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js deleted file mode 100644 index 106ca71c..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/coerce.js +++ /dev/null @@ -1,51 +0,0 @@ -const SemVer = require('../classes/semver') -const parse = require('./parse') -const {re, t} = require('../internal/re') - -const coerce = (version, options) => { - if (version instanceof SemVer) { - return version - } - - if (typeof version === 'number') { - version = String(version) - } - - if (typeof version !== 'string') { - return null - } - - options = options || {} - - let match = null - if (!options.rtl) { - match = version.match(re[t.COERCE]) - } else { - // Find the right-most coercible string that does not share - // a terminus with a more left-ward coercible string. - // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' - // - // Walk through the string checking with a /g regexp - // Manually set the index so as to pick up overlapping matches. - // Stop when we get a match that ends at the string end, since no - // coercible string can be more right-ward without the same terminus. - let next - while ((next = re[t.COERCERTL].exec(version)) && - (!match || match.index + match[0].length !== version.length) - ) { - if (!match || - next.index + next[0].length !== match.index + match[0].length) { - match = next - } - re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length - } - // leave it in a clean state - re[t.COERCERTL].lastIndex = -1 - } - - if (match === null) - return null - - return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options) -} -module.exports = coerce diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js deleted file mode 100644 index 9eb881be..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-build.js +++ /dev/null @@ -1,7 +0,0 @@ -const SemVer = require('../classes/semver') -const compareBuild = (a, b, loose) => { - const versionA = new SemVer(a, loose) - const versionB = new SemVer(b, loose) - return versionA.compare(versionB) || versionA.compareBuild(versionB) -} -module.exports = compareBuild diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js deleted file mode 100644 index 4881fbe0..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/compare-loose.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const compareLoose = (a, b) => compare(a, b, true) -module.exports = compareLoose diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js b/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js deleted file mode 100644 index 748b7afa..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/compare.js +++ /dev/null @@ -1,5 +0,0 @@ -const SemVer = require('../classes/semver') -const compare = (a, b, loose) => - new SemVer(a, loose).compare(new SemVer(b, loose)) - -module.exports = compare diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js b/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js deleted file mode 100644 index 1493666e..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/diff.js +++ /dev/null @@ -1,25 +0,0 @@ -const parse = require('./parse') -const eq = require('./eq') - -const diff = (version1, version2) => { - if (eq(version1, version2)) { - return null - } else { - const v1 = parse(version1) - const v2 = parse(version2) - let prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (const key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} -module.exports = diff diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js b/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js deleted file mode 100644 index 271fed97..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/eq.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const eq = (a, b, loose) => compare(a, b, loose) === 0 -module.exports = eq diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js b/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js deleted file mode 100644 index d9b2156d..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/gt.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const gt = (a, b, loose) => compare(a, b, loose) > 0 -module.exports = gt diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js b/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js deleted file mode 100644 index 5aeaa634..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/gte.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const gte = (a, b, loose) => compare(a, b, loose) >= 0 -module.exports = gte diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js b/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js deleted file mode 100644 index aa4d83ab..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/inc.js +++ /dev/null @@ -1,15 +0,0 @@ -const SemVer = require('../classes/semver') - -const inc = (version, release, options, identifier) => { - if (typeof (options) === 'string') { - identifier = options - options = undefined - } - - try { - return new SemVer(version, options).inc(release, identifier).version - } catch (er) { - return null - } -} -module.exports = inc diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js b/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js deleted file mode 100644 index b440ab7d..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/lt.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const lt = (a, b, loose) => compare(a, b, loose) < 0 -module.exports = lt diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js b/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js deleted file mode 100644 index 6dcc9565..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/lte.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const lte = (a, b, loose) => compare(a, b, loose) <= 0 -module.exports = lte diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/major.js b/node_modules/simple-update-notifier/node_modules/semver/functions/major.js deleted file mode 100644 index 4283165e..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/major.js +++ /dev/null @@ -1,3 +0,0 @@ -const SemVer = require('../classes/semver') -const major = (a, loose) => new SemVer(a, loose).major -module.exports = major diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js b/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js deleted file mode 100644 index 57b3455f..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/minor.js +++ /dev/null @@ -1,3 +0,0 @@ -const SemVer = require('../classes/semver') -const minor = (a, loose) => new SemVer(a, loose).minor -module.exports = minor diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js b/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js deleted file mode 100644 index f944c015..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/neq.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const neq = (a, b, loose) => compare(a, b, loose) !== 0 -module.exports = neq diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js b/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js deleted file mode 100644 index 457fee04..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/parse.js +++ /dev/null @@ -1,37 +0,0 @@ -const {MAX_LENGTH} = require('../internal/constants') -const { re, t } = require('../internal/re') -const SemVer = require('../classes/semver') - -const parse = (version, options) => { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - const r = options.loose ? re[t.LOOSE] : re[t.FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -module.exports = parse diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js b/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js deleted file mode 100644 index 63afca25..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/patch.js +++ /dev/null @@ -1,3 +0,0 @@ -const SemVer = require('../classes/semver') -const patch = (a, loose) => new SemVer(a, loose).patch -module.exports = patch diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js b/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js deleted file mode 100644 index 06aa1324..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/prerelease.js +++ /dev/null @@ -1,6 +0,0 @@ -const parse = require('./parse') -const prerelease = (version, options) => { - const parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} -module.exports = prerelease diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js b/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js deleted file mode 100644 index 0ac509e7..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/rcompare.js +++ /dev/null @@ -1,3 +0,0 @@ -const compare = require('./compare') -const rcompare = (a, b, loose) => compare(b, a, loose) -module.exports = rcompare diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js b/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js deleted file mode 100644 index 82404c5c..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/rsort.js +++ /dev/null @@ -1,3 +0,0 @@ -const compareBuild = require('./compare-build') -const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) -module.exports = rsort diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js b/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js deleted file mode 100644 index 50af1c19..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/satisfies.js +++ /dev/null @@ -1,10 +0,0 @@ -const Range = require('../classes/range') -const satisfies = (version, range, options) => { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} -module.exports = satisfies diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js b/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js deleted file mode 100644 index 4d10917a..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/sort.js +++ /dev/null @@ -1,3 +0,0 @@ -const compareBuild = require('./compare-build') -const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) -module.exports = sort diff --git a/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js b/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js deleted file mode 100644 index f27bae10..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/functions/valid.js +++ /dev/null @@ -1,6 +0,0 @@ -const parse = require('./parse') -const valid = (version, options) => { - const v = parse(version, options) - return v ? v.version : null -} -module.exports = valid diff --git a/node_modules/simple-update-notifier/node_modules/semver/index.js b/node_modules/simple-update-notifier/node_modules/semver/index.js deleted file mode 100644 index 068f8b4e..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/index.js +++ /dev/null @@ -1,64 +0,0 @@ -const lrCache = {} -const lazyRequire = (path, subkey) => { - const module = lrCache[path] || (lrCache[path] = require(path)) - return subkey ? module[subkey] : module -} - -const lazyExport = (key, path, subkey) => { - Object.defineProperty(exports, key, { - get: () => { - const res = lazyRequire(path, subkey) - Object.defineProperty(exports, key, { - value: res, - enumerable: true, - configurable: true - }) - return res - }, - configurable: true, - enumerable: true - }) -} - -lazyExport('re', './internal/re', 're') -lazyExport('src', './internal/re', 'src') -lazyExport('tokens', './internal/re', 't') -lazyExport('SEMVER_SPEC_VERSION', './internal/constants', 'SEMVER_SPEC_VERSION') -lazyExport('SemVer', './classes/semver') -lazyExport('compareIdentifiers', './internal/identifiers', 'compareIdentifiers') -lazyExport('rcompareIdentifiers', './internal/identifiers', 'rcompareIdentifiers') -lazyExport('parse', './functions/parse') -lazyExport('valid', './functions/valid') -lazyExport('clean', './functions/clean') -lazyExport('inc', './functions/inc') -lazyExport('diff', './functions/diff') -lazyExport('major', './functions/major') -lazyExport('minor', './functions/minor') -lazyExport('patch', './functions/patch') -lazyExport('prerelease', './functions/prerelease') -lazyExport('compare', './functions/compare') -lazyExport('rcompare', './functions/rcompare') -lazyExport('compareLoose', './functions/compare-loose') -lazyExport('compareBuild', './functions/compare-build') -lazyExport('sort', './functions/sort') -lazyExport('rsort', './functions/rsort') -lazyExport('gt', './functions/gt') -lazyExport('lt', './functions/lt') -lazyExport('eq', './functions/eq') -lazyExport('neq', './functions/neq') -lazyExport('gte', './functions/gte') -lazyExport('lte', './functions/lte') -lazyExport('cmp', './functions/cmp') -lazyExport('coerce', './functions/coerce') -lazyExport('Comparator', './classes/comparator') -lazyExport('Range', './classes/range') -lazyExport('satisfies', './functions/satisfies') -lazyExport('toComparators', './ranges/to-comparators') -lazyExport('maxSatisfying', './ranges/max-satisfying') -lazyExport('minSatisfying', './ranges/min-satisfying') -lazyExport('minVersion', './ranges/min-version') -lazyExport('validRange', './ranges/valid') -lazyExport('outside', './ranges/outside') -lazyExport('gtr', './ranges/gtr') -lazyExport('ltr', './ranges/ltr') -lazyExport('intersects', './ranges/intersects') diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js b/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js deleted file mode 100644 index 49df215a..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/internal/constants.js +++ /dev/null @@ -1,17 +0,0 @@ -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -const SEMVER_SPEC_VERSION = '2.0.0' - -const MAX_LENGTH = 256 -const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -const MAX_SAFE_COMPONENT_LENGTH = 16 - -module.exports = { - SEMVER_SPEC_VERSION, - MAX_LENGTH, - MAX_SAFE_INTEGER, - MAX_SAFE_COMPONENT_LENGTH -} diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js b/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js deleted file mode 100644 index 1c00e136..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/internal/debug.js +++ /dev/null @@ -1,9 +0,0 @@ -const debug = ( - typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG) -) ? (...args) => console.error('SEMVER', ...args) - : () => {} - -module.exports = debug diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js b/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js deleted file mode 100644 index ed130942..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/internal/identifiers.js +++ /dev/null @@ -1,23 +0,0 @@ -const numeric = /^[0-9]+$/ -const compareIdentifiers = (a, b) => { - const anum = numeric.test(a) - const bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) - -module.exports = { - compareIdentifiers, - rcompareIdentifiers -} diff --git a/node_modules/simple-update-notifier/node_modules/semver/internal/re.js b/node_modules/simple-update-notifier/node_modules/semver/internal/re.js deleted file mode 100644 index 0e8fb528..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/internal/re.js +++ /dev/null @@ -1,179 +0,0 @@ -const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants') -const debug = require('./debug') -exports = module.exports = {} - -// The actual regexps go on exports.re -const re = exports.re = [] -const src = exports.src = [] -const t = exports.t = {} -let R = 0 - -const createToken = (name, value, isGlobal) => { - const index = R++ - debug(index, value) - t[name] = index - src[index] = value - re[index] = new RegExp(value, isGlobal ? 'g' : undefined) -} - -// 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. - -createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') -createToken('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. - -createToken('NONNUMERICIDENTIFIER', '\\d*[a-zA-Z-][a-zA-Z0-9-]*') - -// ## Main Version -// Three dot-separated numeric identifiers. - -createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})\\.` + - `(${src[t.NUMERICIDENTIFIER]})`) - -createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + - `(${src[t.NUMERICIDENTIFIERLOOSE]})`) - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] -}|${src[t.NONNUMERICIDENTIFIER]})`) - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] -}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) - -createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] -}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -createToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+') - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] -}(?:\\.${src[t.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. - -createToken('FULLPLAIN', `v?${src[t.MAINVERSION] -}${src[t.PRERELEASE]}?${ - src[t.BUILD]}?`) - -createToken('FULL', `^${src[t.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. -createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] -}${src[t.PRERELEASELOOSE]}?${ - src[t.BUILD]}?`) - -createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) - -createToken('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. -createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) -createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) - -createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + - `(?:${src[t.PRERELEASE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + - `(?:${src[t.PRERELEASELOOSE]})?${ - src[t.BUILD]}?` + - `)?)?`) - -createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) -createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -createToken('COERCE', `${'(^|[^\\d])' + - '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + - `(?:$|[^\\d])`) -createToken('COERCERTL', src[t.COERCE], true) - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -createToken('LONETILDE', '(?:~>?)') - -createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) -exports.tildeTrimReplace = '$1~' - -createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) -createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -createToken('LONECARET', '(?:\\^)') - -createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) -exports.caretTrimReplace = '$1^' - -createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) -createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) -createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] -}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) -exports.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. -createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAIN]})` + - `\\s*$`) - -createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + - `\\s+-\\s+` + - `(${src[t.XRANGEPLAINLOOSE]})` + - `\\s*$`) - -// Star ranges basically just allow anything at all. -createToken('STAR', '(<|>)?=?\\s*\\*') diff --git a/node_modules/simple-update-notifier/node_modules/semver/package.json b/node_modules/simple-update-notifier/node_modules/semver/package.json deleted file mode 100644 index 88574c09..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "semver", - "version": "7.0.0", - "description": "The semantic version parser used by npm.", - "main": "index.js", - "scripts": { - "test": "tap", - "snap": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --follow-tags" - }, - "devDependencies": { - "tap": "^14.10.1" - }, - "license": "ISC", - "repository": "https://github.com/npm/node-semver", - "bin": { - "semver": "./bin/semver.js" - }, - "files": [ - "bin", - "range.bnf", - "classes", - "functions", - "internal", - "ranges", - "index.js" - ], - "tap": { - "check-coverage": true, - "coverage-map": "map.js" - } -} diff --git a/node_modules/simple-update-notifier/node_modules/semver/range.bnf b/node_modules/simple-update-notifier/node_modules/semver/range.bnf deleted file mode 100644 index d4c6ae0d..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/range.bnf +++ /dev/null @@ -1,16 +0,0 @@ -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/simple-update-notifier/node_modules/semver/ranges/gtr.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js deleted file mode 100644 index db7e3559..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/gtr.js +++ /dev/null @@ -1,4 +0,0 @@ -// Determine if version is greater than all the versions possible in the range. -const outside = require('./outside') -const gtr = (version, range, options) => outside(version, range, '>', options) -module.exports = gtr diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js deleted file mode 100644 index 3d1a6f31..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/intersects.js +++ /dev/null @@ -1,7 +0,0 @@ -const Range = require('../classes/range') -const intersects = (r1, r2, options) => { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} -module.exports = intersects diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js deleted file mode 100644 index 528a885e..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/ltr.js +++ /dev/null @@ -1,4 +0,0 @@ -const outside = require('./outside') -// Determine if version is less than all the versions possible in the range -const ltr = (version, range, options) => outside(version, range, '<', options) -module.exports = ltr diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js deleted file mode 100644 index 6e3d993c..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/max-satisfying.js +++ /dev/null @@ -1,25 +0,0 @@ -const SemVer = require('../classes/semver') -const Range = require('../classes/range') - -const maxSatisfying = (versions, range, options) => { - let max = null - let maxSV = null - let rangeObj = null - try { - rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach((v) => { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} -module.exports = maxSatisfying diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js deleted file mode 100644 index 9b60974e..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-satisfying.js +++ /dev/null @@ -1,24 +0,0 @@ -const SemVer = require('../classes/semver') -const Range = require('../classes/range') -const minSatisfying = (versions, range, options) => { - let min = null - let minSV = null - let rangeObj = null - try { - rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach((v) => { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} -module.exports = minSatisfying diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js deleted file mode 100644 index 7118d237..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/min-version.js +++ /dev/null @@ -1,57 +0,0 @@ -const SemVer = require('../classes/semver') -const Range = require('../classes/range') -const gt = require('../functions/gt') - -const minVersion = (range, loose) => { - range = new Range(range, loose) - - let minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } - - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } - - minver = null - for (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i] - - comparators.forEach((comparator) => { - // Clone to avoid manipulating the comparator's semver object. - const compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error(`Unexpected operation: ${comparator.operator}`) - } - }) - } - - if (minver && range.test(minver)) { - return minver - } - - return null -} -module.exports = minVersion diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js deleted file mode 100644 index e35ed117..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/outside.js +++ /dev/null @@ -1,80 +0,0 @@ -const SemVer = require('../classes/semver') -const Comparator = require('../classes/comparator') -const {ANY} = Comparator -const Range = require('../classes/range') -const satisfies = require('../functions/satisfies') -const gt = require('../functions/gt') -const lt = require('../functions/lt') -const lte = require('../functions/lte') -const gte = require('../functions/gte') - -const outside = (version, range, hilo, options) => { - version = new SemVer(version, options) - range = new Range(range, options) - - let 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, options)) { - 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 (let i = 0; i < range.set.length; ++i) { - const comparators = range.set[i] - - let high = null - let low = null - - comparators.forEach((comparator) => { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - 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 -} - -module.exports = outside diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js deleted file mode 100644 index 6c8bc7e6..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/to-comparators.js +++ /dev/null @@ -1,8 +0,0 @@ -const Range = require('../classes/range') - -// Mostly just for testing and legacy API reasons -const toComparators = (range, options) => - new Range(range, options).set - .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) - -module.exports = toComparators diff --git a/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js b/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js deleted file mode 100644 index 365f3568..00000000 --- a/node_modules/simple-update-notifier/node_modules/semver/ranges/valid.js +++ /dev/null @@ -1,11 +0,0 @@ -const Range = require('../classes/range') -const validRange = (range, options) => { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null - } -} -module.exports = validRange diff --git a/node_modules/simple-update-notifier/package.json b/node_modules/simple-update-notifier/package.json deleted file mode 100644 index 62f1da5c..00000000 --- a/node_modules/simple-update-notifier/package.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "simple-update-notifier", - "version": "1.1.0", - "description": "Simple update notifier to check for npm updates for cli applications", - "main": "build/index.js", - "types": "build/index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/alexbrazier/simple-update-notifier.git" - }, - "homepage": "https://github.com/alexbrazier/simple-update-notifier.git", - "author": "alexbrazier", - "license": "MIT", - "engines": { - "node": ">=8.10.0" - }, - "scripts": { - "test": "jest src --noStackTrace", - "build": "rollup -c rollup.config.js", - "prettier:check": "prettier --check src/**/*.ts", - "prettier": "prettier --write src/**/*.ts", - "eslint": "eslint src/**/*.ts", - "lint": "yarn prettier:check && yarn eslint", - "prepare": "yarn lint && yarn build", - "release": "release-it" - }, - "dependencies": { - "semver": "~7.0.0" - }, - "devDependencies": { - "@babel/preset-env": "^7.19.1", - "@babel/preset-typescript": "^7.17.12", - "@release-it/conventional-changelog": "^5.1.0", - "@types/jest": "^29.0.3", - "@types/node": "^18.7.18", - "@typescript-eslint/eslint-plugin": "^5.37.0", - "@typescript-eslint/parser": "^5.37.0", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "jest": "^29.0.3", - "prettier": "^2.7.1", - "release-it": "^15.4.2", - "rollup": "^2.79.0", - "rollup-plugin-ts": "^3.0.2", - "typescript": "^4.8.3" - }, - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, - "files": [ - "build", - "src" - ], - "release-it": { - "git": { - "commitMessage": "chore: release ${version}", - "tagName": "v${version}" - }, - "npm": { - "publish": true - }, - "github": { - "release": true - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": "angular", - "infile": "CHANGELOG.md" - } - } - }, - "eslintConfig": { - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "extends": [ - "prettier", - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "rules": { - "prettier/prettier": [ - "error", - { - "quoteProps": "consistent", - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "es5", - "useTabs": false - } - ] - } - } -} diff --git a/node_modules/simple-update-notifier/src/borderedText.ts b/node_modules/simple-update-notifier/src/borderedText.ts deleted file mode 100644 index 7145ac2f..00000000 --- a/node_modules/simple-update-notifier/src/borderedText.ts +++ /dev/null @@ -1,12 +0,0 @@ -const borderedText = (text: string) => { - const lines = text.split('\n'); - const width = Math.max(...lines.map((l) => l.length)); - const res = [`┌${'─'.repeat(width + 2)}┐`]; - for (const line of lines) { - res.push(`│ ${line.padEnd(width)} │`); - } - res.push(`└${'─'.repeat(width + 2)}┘`); - return res.join('\n'); -}; - -export default borderedText; diff --git a/node_modules/simple-update-notifier/src/cache.spec.ts b/node_modules/simple-update-notifier/src/cache.spec.ts deleted file mode 100644 index 49e1cb27..00000000 --- a/node_modules/simple-update-notifier/src/cache.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; - -createConfigDir(); - -jest.useFakeTimers().setSystemTime(new Date('2022-01-01')); - -const fakeTime = new Date('2022-01-01').getTime(); - -test('can save update then get the update details', () => { - saveLastUpdate('test'); - expect(getLastUpdate('test')).toBe(fakeTime); -}); - -test('prefixed module can save update then get the update details', () => { - saveLastUpdate('@alexbrazier/test'); - expect(getLastUpdate('@alexbrazier/test')).toBe(fakeTime); -}); diff --git a/node_modules/simple-update-notifier/src/cache.ts b/node_modules/simple-update-notifier/src/cache.ts deleted file mode 100644 index e11deba0..00000000 --- a/node_modules/simple-update-notifier/src/cache.ts +++ /dev/null @@ -1,44 +0,0 @@ -import os from 'os'; -import path from 'path'; -import fs from 'fs'; - -const homeDirectory = os.homedir(); -const configDir = - process.env.XDG_CONFIG_HOME || - path.join(homeDirectory, '.config', 'simple-update-notifier'); - -const getConfigFile = (packageName: string) => { - return path.join( - configDir, - `${packageName.replace('@', '').replace('/', '__')}.json` - ); -}; - -export const createConfigDir = () => { - if (!fs.existsSync(configDir)) { - fs.mkdirSync(configDir, { recursive: true }); - } -}; - -export const getLastUpdate = (packageName: string) => { - const configFile = getConfigFile(packageName); - - try { - if (!fs.existsSync(configFile)) { - return undefined; - } - const file = JSON.parse(fs.readFileSync(configFile, 'utf8')); - return file.lastUpdateCheck as number; - } catch { - return undefined; - } -}; - -export const saveLastUpdate = (packageName: string) => { - const configFile = getConfigFile(packageName); - - fs.writeFileSync( - configFile, - JSON.stringify({ lastUpdateCheck: new Date().getTime() }) - ); -}; diff --git a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts deleted file mode 100644 index b78a42e5..00000000 --- a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import Stream from 'stream'; -import https from 'https'; -import getDistVersion from './getDistVersion'; - -jest.mock('https', () => ({ - get: jest.fn(), -})); - -test('Valid response returns version', async () => { - const st = new Stream(); - (https.get as jest.Mock).mockImplementation((url, cb) => { - cb(st); - - st.emit('data', '{"latest":"1.0.0"}'); - st.emit('end'); - }); - - const version = await getDistVersion('test', 'latest'); - - expect(version).toEqual('1.0.0'); -}); - -test('Invalid response throws error', async () => { - const st = new Stream(); - (https.get as jest.Mock).mockImplementation((url, cb) => { - cb(st); - - st.emit('data', 'some invalid json'); - st.emit('end'); - }); - - expect(getDistVersion('test', 'latest')).rejects.toThrow( - 'Could not parse version response' - ); -}); diff --git a/node_modules/simple-update-notifier/src/getDistVersion.ts b/node_modules/simple-update-notifier/src/getDistVersion.ts deleted file mode 100644 index d474e1f9..00000000 --- a/node_modules/simple-update-notifier/src/getDistVersion.ts +++ /dev/null @@ -1,29 +0,0 @@ -import https from 'https'; - -const getDistVersion = async (packageName: string, distTag: string) => { - const url = `https://registry.npmjs.org/-/package/${packageName}/dist-tags`; - - return new Promise((resolve, reject) => { - https - .get(url, (res) => { - let body = ''; - - res.on('data', (chunk) => (body += chunk)); - res.on('end', () => { - try { - const json = JSON.parse(body); - const version = json[distTag]; - if (!version) { - reject(new Error('Error getting version')); - } - resolve(version); - } catch { - reject(new Error('Could not parse version response')); - } - }); - }) - .on('error', (err) => reject(err)); - }); -}; - -export default getDistVersion; diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts deleted file mode 100644 index af7ab22c..00000000 --- a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import hasNewVersion from './hasNewVersion'; -import { getLastUpdate } from './cache'; -import getDistVersion from './getDistVersion'; - -jest.mock('./getDistVersion', () => jest.fn().mockReturnValue('1.0.0')); -jest.mock('./cache', () => ({ - getLastUpdate: jest.fn().mockReturnValue(undefined), - createConfigDir: jest.fn(), - saveLastUpdate: jest.fn(), -})); - -const pkg = { name: 'test', version: '1.0.0' }; - -afterEach(() => jest.clearAllMocks()); - -const defaultArgs = { - pkg, - shouldNotifyInNpmScript: true, - alwaysRun: true, -}; - -test('it should not trigger update for same version', async () => { - const newVersion = await hasNewVersion(defaultArgs); - - expect(newVersion).toBe(false); -}); - -test('it should trigger update for patch version bump', async () => { - (getDistVersion as jest.Mock).mockReturnValue('1.0.1'); - - const newVersion = await hasNewVersion(defaultArgs); - - expect(newVersion).toBe('1.0.1'); -}); - -test('it should trigger update for minor version bump', async () => { - (getDistVersion as jest.Mock).mockReturnValue('1.1.0'); - - const newVersion = await hasNewVersion(defaultArgs); - - expect(newVersion).toBe('1.1.0'); -}); - -test('it should trigger update for major version bump', async () => { - (getDistVersion as jest.Mock).mockReturnValue('2.0.0'); - - const newVersion = await hasNewVersion(defaultArgs); - - expect(newVersion).toBe('2.0.0'); -}); - -test('it should not trigger update if version is lower', async () => { - (getDistVersion as jest.Mock).mockReturnValue('0.0.9'); - - const newVersion = await hasNewVersion(defaultArgs); - - expect(newVersion).toBe(false); -}); - -it('should trigger update check if last update older than config', async () => { - const TWO_WEEKS = new Date().getTime() - 1000 * 60 * 60 * 24 * 14; - (getLastUpdate as jest.Mock).mockReturnValue(TWO_WEEKS); - const newVersion = await hasNewVersion({ - pkg, - shouldNotifyInNpmScript: true, - }); - - expect(newVersion).toBe(false); - expect(getDistVersion).toHaveBeenCalled(); -}); - -it('should not trigger update check if last update is too recent', async () => { - const TWELVE_HOURS = new Date().getTime() - 1000 * 60 * 60 * 12; - (getLastUpdate as jest.Mock).mockReturnValue(TWELVE_HOURS); - const newVersion = await hasNewVersion({ - pkg, - shouldNotifyInNpmScript: true, - }); - - expect(newVersion).toBe(false); - expect(getDistVersion).not.toHaveBeenCalled(); -}); diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.ts b/node_modules/simple-update-notifier/src/hasNewVersion.ts deleted file mode 100644 index 31d5069f..00000000 --- a/node_modules/simple-update-notifier/src/hasNewVersion.ts +++ /dev/null @@ -1,40 +0,0 @@ -import semver from 'semver'; -import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; -import getDistVersion from './getDistVersion'; -import { IUpdate } from './types'; - -const hasNewVersion = async ({ - pkg, - updateCheckInterval = 1000 * 60 * 60 * 24, - distTag = 'latest', - alwaysRun, - debug, -}: IUpdate) => { - createConfigDir(); - const lastUpdateCheck = getLastUpdate(pkg.name); - if ( - alwaysRun || - !lastUpdateCheck || - lastUpdateCheck < new Date().getTime() - updateCheckInterval - ) { - const latestVersion = await getDistVersion(pkg.name, distTag); - saveLastUpdate(pkg.name); - if (semver.gt(latestVersion, pkg.version)) { - return latestVersion; - } else if (debug) { - console.error( - `Latest version (${latestVersion}) not newer than current version (${pkg.version})` - ); - } - } else if (debug) { - console.error( - `Too recent to check for a new update. simpleUpdateNotifier() interval set to ${updateCheckInterval}ms but only ${ - new Date().getTime() - lastUpdateCheck - }ms since last check.` - ); - } - - return false; -}; - -export default hasNewVersion; diff --git a/node_modules/simple-update-notifier/src/index.spec.ts b/node_modules/simple-update-notifier/src/index.spec.ts deleted file mode 100644 index 98ffb5a9..00000000 --- a/node_modules/simple-update-notifier/src/index.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import simpleUpdateNotifier from '.'; -import hasNewVersion from './hasNewVersion'; - -const consoleSpy = jest.spyOn(console, 'error'); - -jest.mock('./hasNewVersion', () => jest.fn().mockResolvedValue('2.0.0')); - -beforeEach(jest.clearAllMocks); - -test('it logs message if update is available', async () => { - await simpleUpdateNotifier({ - pkg: { name: 'test', version: '1.0.0' }, - alwaysRun: true, - }); - - expect(consoleSpy).toHaveBeenCalledTimes(1); -}); - -test('it does not log message if update is not available', async () => { - (hasNewVersion as jest.Mock).mockResolvedValue(false); - await simpleUpdateNotifier({ - pkg: { name: 'test', version: '2.0.0' }, - alwaysRun: true, - }); - - expect(consoleSpy).toHaveBeenCalledTimes(0); -}); diff --git a/node_modules/simple-update-notifier/src/index.ts b/node_modules/simple-update-notifier/src/index.ts deleted file mode 100644 index 2b0d2cfc..00000000 --- a/node_modules/simple-update-notifier/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import isNpmOrYarn from './isNpmOrYarn'; -import hasNewVersion from './hasNewVersion'; -import { IUpdate } from './types'; -import borderedText from './borderedText'; - -const simpleUpdateNotifier = async (args: IUpdate) => { - if ( - !args.alwaysRun && - (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript)) - ) { - if (args.debug) { - console.error('Opting out of running simpleUpdateNotifier()'); - } - return; - } - - try { - const latestVersion = await hasNewVersion(args); - if (latestVersion) { - console.error( - borderedText(`New version of ${args.pkg.name} available! -Current Version: ${args.pkg.version} -Latest Version: ${latestVersion}`) - ); - } - } catch (err) { - // Catch any network errors or cache writing errors so module doesn't cause a crash - if (args.debug && err instanceof Error) { - console.error('Unexpected error in simpleUpdateNotifier():', err); - } - } -}; - -export default simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts deleted file mode 100644 index ee4c8371..00000000 --- a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts +++ /dev/null @@ -1,12 +0,0 @@ -import process from 'process'; - -const packageJson = process.env.npm_package_json; -const userAgent = process.env.npm_config_user_agent; -const isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); -const isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); - -const isNpm = isNpm6 || isNpm7; -const isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); -const isNpmOrYarn = isNpm || isYarn; - -export default isNpmOrYarn; diff --git a/node_modules/simple-update-notifier/src/types.ts b/node_modules/simple-update-notifier/src/types.ts deleted file mode 100644 index c395eb00..00000000 --- a/node_modules/simple-update-notifier/src/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IUpdate { - pkg: { name: string; version: string }; - updateCheckInterval?: number; - shouldNotifyInNpmScript?: boolean; - distTag?: string; - alwaysRun?: boolean; - debug?: boolean; -} diff --git a/node_modules/source-map/CHANGELOG.md b/node_modules/source-map/CHANGELOG.md deleted file mode 100644 index 3a8c066c..00000000 --- a/node_modules/source-map/CHANGELOG.md +++ /dev/null @@ -1,301 +0,0 @@ -# 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 deleted file mode 100644 index ed1b7cf2..00000000 --- a/node_modules/source-map/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ - -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 deleted file mode 100644 index 32813394..00000000 --- a/node_modules/source-map/README.md +++ /dev/null @@ -1,729 +0,0 @@ -# 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/source-map/dist/source-map.debug.js b/node_modules/source-map/dist/source-map.debug.js deleted file mode 100644 index b5ab6382..00000000 --- a/node_modules/source-map/dist/source-map.debug.js +++ /dev/null @@ -1,3091 +0,0 @@ -(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/source-map/dist/source-map.js b/node_modules/source-map/dist/source-map.js deleted file mode 100644 index 4e630e29..00000000 --- a/node_modules/source-map/dist/source-map.js +++ /dev/null @@ -1,3090 +0,0 @@ -(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/source-map/dist/source-map.min.js b/node_modules/source-map/dist/source-map.min.js deleted file mode 100644 index f2a46bd0..00000000 --- a/node_modules/source-map/dist/source-map.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!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/source-map/lib/array-set.js b/node_modules/source-map/lib/array-set.js deleted file mode 100644 index fbd5c81c..00000000 --- a/node_modules/source-map/lib/array-set.js +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- 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 = require('./util'); -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; diff --git a/node_modules/source-map/lib/base64-vlq.js b/node_modules/source-map/lib/base64-vlq.js deleted file mode 100644 index 612b4040..00000000 --- a/node_modules/source-map/lib/base64-vlq.js +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- 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 = require('./base64'); - -// 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; -}; diff --git a/node_modules/source-map/lib/base64.js b/node_modules/source-map/lib/base64.js deleted file mode 100644 index 8aa86b30..00000000 --- a/node_modules/source-map/lib/base64.js +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- 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; -}; diff --git a/node_modules/source-map/lib/binary-search.js b/node_modules/source-map/lib/binary-search.js deleted file mode 100644 index 010ac941..00000000 --- a/node_modules/source-map/lib/binary-search.js +++ /dev/null @@ -1,111 +0,0 @@ -/* -*- 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; -}; diff --git a/node_modules/source-map/lib/mapping-list.js b/node_modules/source-map/lib/mapping-list.js deleted file mode 100644 index 06d1274a..00000000 --- a/node_modules/source-map/lib/mapping-list.js +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- 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 = require('./util'); - -/** - * 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; diff --git a/node_modules/source-map/lib/quick-sort.js b/node_modules/source-map/lib/quick-sort.js deleted file mode 100644 index 6a7caadb..00000000 --- a/node_modules/source-map/lib/quick-sort.js +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- 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); -}; diff --git a/node_modules/source-map/lib/source-map-consumer.js b/node_modules/source-map/lib/source-map-consumer.js deleted file mode 100644 index 6abcc280..00000000 --- a/node_modules/source-map/lib/source-map-consumer.js +++ /dev/null @@ -1,1082 +0,0 @@ -/* -*- 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 = require('./util'); -var binarySearch = require('./binary-search'); -var ArraySet = require('./array-set').ArraySet; -var base64VLQ = require('./base64-vlq'); -var quickSort = require('./quick-sort').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; diff --git a/node_modules/source-map/lib/source-map-generator.js b/node_modules/source-map/lib/source-map-generator.js deleted file mode 100644 index aff1e7fb..00000000 --- a/node_modules/source-map/lib/source-map-generator.js +++ /dev/null @@ -1,416 +0,0 @@ -/* -*- 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 = require('./base64-vlq'); -var util = require('./util'); -var ArraySet = require('./array-set').ArraySet; -var MappingList = require('./mapping-list').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; diff --git a/node_modules/source-map/lib/source-node.js b/node_modules/source-map/lib/source-node.js deleted file mode 100644 index d196a53f..00000000 --- a/node_modules/source-map/lib/source-node.js +++ /dev/null @@ -1,413 +0,0 @@ -/* -*- 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 = require('./source-map-generator').SourceMapGenerator; -var util = require('./util'); - -// 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; diff --git a/node_modules/source-map/lib/util.js b/node_modules/source-map/lib/util.js deleted file mode 100644 index 44e0e452..00000000 --- a/node_modules/source-map/lib/util.js +++ /dev/null @@ -1,417 +0,0 @@ -/* -*- 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; diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json deleted file mode 100644 index 048e3ae8..00000000 --- a/node_modules/source-map/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "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/source-map/source-map.js b/node_modules/source-map/source-map.js deleted file mode 100644 index bc88fe82..00000000 --- a/node_modules/source-map/source-map.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * 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/sshpk/.travis.yml b/node_modules/sshpk/.travis.yml deleted file mode 100644 index c3394c25..00000000 --- a/node_modules/sshpk/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -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/Jenkinsfile b/node_modules/sshpk/Jenkinsfile deleted file mode 100644 index cd0bf225..00000000 --- a/node_modules/sshpk/Jenkinsfile +++ /dev/null @@ -1,86 +0,0 @@ -@Library('jenkins-joylib@v1.0.8') _ - -pipeline { - - agent none - - options { - buildDiscarder(logRotator(numToKeepStr: '30')) - timestamps() - } - - stages { - stage('top') { - parallel { - stage('v0.10.48-zone') { - agent { - label joyCommonLabels(image_ver: '15.4.1') - } - tools { - nodejs 'sdcnode-v0.10.48-zone' - } - stages { - stage('check') { - steps{ - sh('make check') - } - } - stage('test') { - steps{ - sh('make test') - } - } - } - } - - stage('v4-zone') { - agent { - label joyCommonLabels(image_ver: '15.4.1') - } - tools { - nodejs 'sdcnode-v4-zone' - } - stages { - stage('check') { - steps{ - sh('make check') - } - } - stage('test') { - steps{ - sh('make test') - } - } - } - } - - stage('v6-zone64') { - agent { - label joyCommonLabels(image_ver: '18.4.0') - } - tools { - nodejs 'sdcnode-v6-zone64' - } - stages { - stage('check') { - steps{ - sh('make check') - } - } - stage('test') { - steps{ - sh('make test') - } - } - } - } - } - } - } - - post { - always { - joySlackNotifications() - } - } -} diff --git a/node_modules/sshpk/LICENSE b/node_modules/sshpk/LICENSE deleted file mode 100644 index f6d947d2..00000000 --- a/node_modules/sshpk/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -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 deleted file mode 100644 index 5740f74d..00000000 --- a/node_modules/sshpk/README.md +++ /dev/null @@ -1,804 +0,0 @@ -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/bin/sshpk-conv b/node_modules/sshpk/bin/sshpk-conv deleted file mode 100755 index e839ede5..00000000 --- a/node_modules/sshpk/bin/sshpk-conv +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env node -// -*- mode: js -*- -// vim: set filetype=javascript : -// Copyright 2018 Joyent, Inc. All rights reserved. - -var dashdash = require('dashdash'); -var sshpk = require('../lib/index'); -var fs = require('fs'); -var path = require('path'); -var tty = require('tty'); -var readline = require('readline'); -var getPassword = require('getpass').getPass; - -var options = [ - { - names: ['outformat', 't'], - type: 'string', - help: 'Output format' - }, - { - names: ['informat', 'T'], - type: 'string', - help: 'Input format' - }, - { - names: ['file', 'f'], - type: 'string', - help: 'Input file name (default stdin)' - }, - { - names: ['out', 'o'], - type: 'string', - help: 'Output file name (default stdout)' - }, - { - names: ['private', 'p'], - type: 'bool', - help: 'Produce a private key as output' - }, - { - names: ['derive', 'd'], - type: 'string', - help: 'Output a new key derived from this one, with given algo' - }, - { - names: ['identify', 'i'], - type: 'bool', - help: 'Print key metadata instead of converting' - }, - { - names: ['fingerprint', 'F'], - type: 'bool', - help: 'Output key fingerprint' - }, - { - names: ['hash', 'H'], - type: 'string', - help: 'Hash function to use for key fingeprint with -F' - }, - { - names: ['spki', 's'], - type: 'bool', - help: 'With -F, generates an SPKI fingerprint instead of SSH' - }, - { - names: ['comment', 'c'], - type: 'string', - help: 'Set key comment, if output format supports' - }, - { - names: ['help', 'h'], - type: 'bool', - help: 'Shows this help text' - } -]; - -if (require.main === module) { - var parser = dashdash.createParser({ - options: options - }); - - try { - var opts = parser.parse(process.argv); - } catch (e) { - console.error('sshpk-conv: error: %s', e.message); - process.exit(1); - } - - if (opts.help || opts._args.length > 1) { - var help = parser.help({}).trimRight(); - console.error('sshpk-conv: converts between SSH key formats\n'); - console.error(help); - console.error('\navailable key formats:'); - console.error(' - pem, pkcs1 eg id_rsa'); - console.error(' - ssh eg id_rsa.pub'); - console.error(' - pkcs8 format you want for openssl'); - console.error(' - openssh like output of ssh-keygen -o'); - console.error(' - rfc4253 raw OpenSSH wire format'); - console.error(' - dnssec dnssec-keygen format'); - console.error(' - putty PuTTY ppk format'); - console.error('\navailable fingerprint formats:'); - console.error(' - hex colon-separated hex for SSH'); - console.error(' straight hex for SPKI'); - console.error(' - base64 SHA256:* format from OpenSSH'); - process.exit(1); - } - - /* - * Key derivation can only be done on private keys, so use of the -d - * option necessarily implies -p. - */ - if (opts.derive) - opts.private = true; - - var inFile = process.stdin; - var inFileName = 'stdin'; - - var inFilePath; - if (opts.file) { - inFilePath = opts.file; - } else if (opts._args.length === 1) { - inFilePath = opts._args[0]; - } - - if (inFilePath) - inFileName = path.basename(inFilePath); - - try { - if (inFilePath) { - fs.accessSync(inFilePath, fs.R_OK); - inFile = fs.createReadStream(inFilePath); - } - } catch (e) { - ifError(e, 'error opening input file'); - } - - var outFile = process.stdout; - - try { - if (opts.out && !opts.identify) { - fs.accessSync(path.dirname(opts.out), fs.W_OK); - outFile = fs.createWriteStream(opts.out); - } - } catch (e) { - ifError(e, 'error opening output file'); - } - - var bufs = []; - inFile.on('readable', function () { - var data; - while ((data = inFile.read())) - bufs.push(data); - }); - var parseOpts = {}; - parseOpts.filename = inFileName; - inFile.on('end', function processKey() { - var buf = Buffer.concat(bufs); - var fmt = 'auto'; - if (opts.informat) - fmt = opts.informat; - var f = sshpk.parseKey; - if (opts.private) - f = sshpk.parsePrivateKey; - try { - var key = f(buf, fmt, parseOpts); - } catch (e) { - if (e.name === 'KeyEncryptedError') { - getPassword(function (err, pw) { - if (err) - ifError(err); - parseOpts.passphrase = pw; - processKey(); - }); - return; - } - ifError(e); - } - - if (opts.derive) - key = key.derive(opts.derive); - - if (opts.comment) - key.comment = opts.comment; - - if (opts.identify) { - var kind = 'public'; - if (sshpk.PrivateKey.isPrivateKey(key)) - kind = 'private'; - console.log('%s: a %d bit %s %s key', inFileName, - key.size, key.type.toUpperCase(), kind); - if (key.type === 'ecdsa') - console.log('ECDSA curve: %s', key.curve); - if (key.comment) - console.log('Comment: %s', key.comment); - console.log('SHA256 fingerprint: ' + - key.fingerprint('sha256').toString()); - console.log('MD5 fingerprint: ' + - key.fingerprint('md5').toString()); - console.log('SPKI-SHA256 fingerprint: ' + - key.fingerprint('sha256', 'spki').toString()); - process.exit(0); - return; - } - - if (opts.fingerprint) { - var hash = opts.hash; - var type = opts.spki ? 'spki' : 'ssh'; - var format = opts.outformat; - var fp = key.fingerprint(hash, type).toString(format); - outFile.write(fp); - outFile.write('\n'); - outFile.once('drain', function () { - process.exit(0); - }); - return; - } - - fmt = undefined; - if (opts.outformat) - fmt = opts.outformat; - outFile.write(key.toBuffer(fmt)); - if (fmt === 'ssh' || - (!opts.private && fmt === undefined)) - outFile.write('\n'); - outFile.once('drain', function () { - process.exit(0); - }); - }); -} - -function ifError(e, txt) { - if (txt) - txt = txt + ': '; - else - txt = ''; - console.error('sshpk-conv: ' + txt + e.name + ': ' + e.message); - if (process.env['DEBUG'] || process.env['V']) { - console.error(e.stack); - if (e.innerErr) - console.error(e.innerErr.stack); - } - process.exit(1); -} diff --git a/node_modules/sshpk/bin/sshpk-sign b/node_modules/sshpk/bin/sshpk-sign deleted file mode 100755 index 673fc986..00000000 --- a/node_modules/sshpk/bin/sshpk-sign +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env node -// -*- mode: js -*- -// vim: set filetype=javascript : -// Copyright 2015 Joyent, Inc. All rights reserved. - -var dashdash = require('dashdash'); -var sshpk = require('../lib/index'); -var fs = require('fs'); -var path = require('path'); -var getPassword = require('getpass').getPass; - -var options = [ - { - names: ['hash', 'H'], - type: 'string', - help: 'Hash algorithm (sha1, sha256, sha384, sha512)' - }, - { - names: ['verbose', 'v'], - type: 'bool', - help: 'Display verbose info about key and hash used' - }, - { - names: ['identity', 'i'], - type: 'string', - help: 'Path to key to use' - }, - { - names: ['file', 'f'], - type: 'string', - help: 'Input filename' - }, - { - names: ['out', 'o'], - type: 'string', - help: 'Output filename' - }, - { - names: ['format', 't'], - type: 'string', - help: 'Signature format (asn1, ssh, raw)' - }, - { - names: ['binary', 'b'], - type: 'bool', - help: 'Output raw binary instead of base64' - }, - { - names: ['help', 'h'], - type: 'bool', - help: 'Shows this help text' - } -]; - -var parseOpts = {}; - -if (require.main === module) { - var parser = dashdash.createParser({ - options: options - }); - - try { - var opts = parser.parse(process.argv); - } catch (e) { - console.error('sshpk-sign: error: %s', e.message); - process.exit(1); - } - - if (opts.help || opts._args.length > 1) { - var help = parser.help({}).trimRight(); - console.error('sshpk-sign: sign data using an SSH key\n'); - console.error(help); - process.exit(1); - } - - if (!opts.identity) { - var help = parser.help({}).trimRight(); - console.error('sshpk-sign: the -i or --identity option ' + - 'is required\n'); - console.error(help); - process.exit(1); - } - - var keyData = fs.readFileSync(opts.identity); - parseOpts.filename = opts.identity; - - run(); -} - -function run() { - var key; - try { - key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts); - } catch (e) { - if (e.name === 'KeyEncryptedError') { - getPassword(function (err, pw) { - parseOpts.passphrase = pw; - run(); - }); - return; - } - console.error('sshpk-sign: error loading private key "' + - opts.identity + '": ' + e.name + ': ' + e.message); - process.exit(1); - } - - var hash = opts.hash || key.defaultHashAlgorithm(); - - var signer; - try { - signer = key.createSign(hash); - } catch (e) { - console.error('sshpk-sign: error creating signer: ' + - e.name + ': ' + e.message); - process.exit(1); - } - - if (opts.verbose) { - console.error('sshpk-sign: using %s-%s with a %d bit key', - key.type, hash, key.size); - } - - var inFile = process.stdin; - var inFileName = 'stdin'; - - var inFilePath; - if (opts.file) { - inFilePath = opts.file; - } else if (opts._args.length === 1) { - inFilePath = opts._args[0]; - } - - if (inFilePath) - inFileName = path.basename(inFilePath); - - try { - if (inFilePath) { - fs.accessSync(inFilePath, fs.R_OK); - inFile = fs.createReadStream(inFilePath); - } - } catch (e) { - console.error('sshpk-sign: error opening input file' + - ': ' + e.name + ': ' + e.message); - process.exit(1); - } - - var outFile = process.stdout; - - try { - if (opts.out && !opts.identify) { - fs.accessSync(path.dirname(opts.out), fs.W_OK); - outFile = fs.createWriteStream(opts.out); - } - } catch (e) { - console.error('sshpk-sign: error opening output file' + - ': ' + e.name + ': ' + e.message); - process.exit(1); - } - - inFile.pipe(signer); - inFile.on('end', function () { - var sig; - try { - sig = signer.sign(); - } catch (e) { - console.error('sshpk-sign: error signing data: ' + - e.name + ': ' + e.message); - process.exit(1); - } - - var fmt = opts.format || 'asn1'; - var output; - try { - output = sig.toBuffer(fmt); - if (!opts.binary) - output = output.toString('base64'); - } catch (e) { - console.error('sshpk-sign: error converting signature' + - ' to ' + fmt + ' format: ' + e.name + ': ' + - e.message); - process.exit(1); - } - - outFile.write(output); - if (!opts.binary) - outFile.write('\n'); - outFile.once('drain', function () { - process.exit(0); - }); - }); -} diff --git a/node_modules/sshpk/bin/sshpk-verify b/node_modules/sshpk/bin/sshpk-verify deleted file mode 100755 index fc71a82c..00000000 --- a/node_modules/sshpk/bin/sshpk-verify +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env node -// -*- mode: js -*- -// vim: set filetype=javascript : -// Copyright 2015 Joyent, Inc. All rights reserved. - -var dashdash = require('dashdash'); -var sshpk = require('../lib/index'); -var fs = require('fs'); -var path = require('path'); -var Buffer = require('safer-buffer').Buffer; - -var options = [ - { - names: ['hash', 'H'], - type: 'string', - help: 'Hash algorithm (sha1, sha256, sha384, sha512)' - }, - { - names: ['verbose', 'v'], - type: 'bool', - help: 'Display verbose info about key and hash used' - }, - { - names: ['identity', 'i'], - type: 'string', - help: 'Path to (public) key to use' - }, - { - names: ['file', 'f'], - type: 'string', - help: 'Input filename' - }, - { - names: ['format', 't'], - type: 'string', - help: 'Signature format (asn1, ssh, raw)' - }, - { - names: ['signature', 's'], - type: 'string', - help: 'base64-encoded signature data' - }, - { - names: ['help', 'h'], - type: 'bool', - help: 'Shows this help text' - } -]; - -if (require.main === module) { - var parser = dashdash.createParser({ - options: options - }); - - try { - var opts = parser.parse(process.argv); - } catch (e) { - console.error('sshpk-verify: error: %s', e.message); - process.exit(3); - } - - if (opts.help || opts._args.length > 1) { - var help = parser.help({}).trimRight(); - console.error('sshpk-verify: sign data using an SSH key\n'); - console.error(help); - process.exit(3); - } - - if (!opts.identity) { - var help = parser.help({}).trimRight(); - console.error('sshpk-verify: the -i or --identity option ' + - 'is required\n'); - console.error(help); - process.exit(3); - } - - if (!opts.signature) { - var help = parser.help({}).trimRight(); - console.error('sshpk-verify: the -s or --signature option ' + - 'is required\n'); - console.error(help); - process.exit(3); - } - - var keyData = fs.readFileSync(opts.identity); - - var key; - try { - key = sshpk.parseKey(keyData); - } catch (e) { - console.error('sshpk-verify: error loading key "' + - opts.identity + '": ' + e.name + ': ' + e.message); - process.exit(2); - } - - var fmt = opts.format || 'asn1'; - var sigData = Buffer.from(opts.signature, 'base64'); - - var sig; - try { - sig = sshpk.parseSignature(sigData, key.type, fmt); - } catch (e) { - console.error('sshpk-verify: error parsing signature: ' + - e.name + ': ' + e.message); - process.exit(2); - } - - var hash = opts.hash || key.defaultHashAlgorithm(); - - var verifier; - try { - verifier = key.createVerify(hash); - } catch (e) { - console.error('sshpk-verify: error creating verifier: ' + - e.name + ': ' + e.message); - process.exit(2); - } - - if (opts.verbose) { - console.error('sshpk-verify: using %s-%s with a %d bit key', - key.type, hash, key.size); - } - - var inFile = process.stdin; - var inFileName = 'stdin'; - - var inFilePath; - if (opts.file) { - inFilePath = opts.file; - } else if (opts._args.length === 1) { - inFilePath = opts._args[0]; - } - - if (inFilePath) - inFileName = path.basename(inFilePath); - - try { - if (inFilePath) { - fs.accessSync(inFilePath, fs.R_OK); - inFile = fs.createReadStream(inFilePath); - } - } catch (e) { - console.error('sshpk-verify: error opening input file' + - ': ' + e.name + ': ' + e.message); - process.exit(2); - } - - inFile.pipe(verifier); - inFile.on('end', function () { - var ret; - try { - ret = verifier.verify(sig); - } catch (e) { - console.error('sshpk-verify: error verifying data: ' + - e.name + ': ' + e.message); - process.exit(1); - } - - if (ret) { - console.error('OK'); - process.exit(0); - } - - console.error('NOT OK'); - process.exit(1); - }); -} diff --git a/node_modules/sshpk/lib/algs.js b/node_modules/sshpk/lib/algs.js deleted file mode 100644 index 3b01e7d1..00000000 --- a/node_modules/sshpk/lib/algs.js +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -var Buffer = require('safer-buffer').Buffer; - -var algInfo = { - 'dsa': { - parts: ['p', 'q', 'g', 'y'], - sizePart: 'p' - }, - 'rsa': { - parts: ['e', 'n'], - sizePart: 'n' - }, - 'ecdsa': { - parts: ['curve', 'Q'], - sizePart: 'Q' - }, - 'ed25519': { - parts: ['A'], - sizePart: 'A' - } -}; -algInfo['curve25519'] = algInfo['ed25519']; - -var algPrivInfo = { - 'dsa': { - parts: ['p', 'q', 'g', 'y', 'x'] - }, - 'rsa': { - parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] - }, - 'ecdsa': { - parts: ['curve', 'Q', 'd'] - }, - 'ed25519': { - parts: ['A', 'k'] - } -}; -algPrivInfo['curve25519'] = algPrivInfo['ed25519']; - -var hashAlgs = { - 'md5': true, - 'sha1': true, - 'sha256': true, - 'sha384': true, - 'sha512': true -}; - -/* - * Taken from - * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf - */ -var curves = { - 'nistp256': { - size: 256, - pkcs8oid: '1.2.840.10045.3.1.7', - p: Buffer.from(('00' + - 'ffffffff 00000001 00000000 00000000' + - '00000000 ffffffff ffffffff ffffffff'). - replace(/ /g, ''), 'hex'), - a: Buffer.from(('00' + - 'FFFFFFFF 00000001 00000000 00000000' + - '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). - replace(/ /g, ''), 'hex'), - b: Buffer.from(( - '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + - '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). - replace(/ /g, ''), 'hex'), - s: Buffer.from(('00' + - 'c49d3608 86e70493 6a6678e1 139d26b7' + - '819f7e90'). - replace(/ /g, ''), 'hex'), - n: Buffer.from(('00' + - 'ffffffff 00000000 ffffffff ffffffff' + - 'bce6faad a7179e84 f3b9cac2 fc632551'). - replace(/ /g, ''), 'hex'), - G: Buffer.from(('04' + - '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + - '77037d81 2deb33a0 f4a13945 d898c296' + - '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + - '2bce3357 6b315ece cbb64068 37bf51f5'). - replace(/ /g, ''), 'hex') - }, - 'nistp384': { - size: 384, - pkcs8oid: '1.3.132.0.34', - p: Buffer.from(('00' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff fffffffe' + - 'ffffffff 00000000 00000000 ffffffff'). - replace(/ /g, ''), 'hex'), - a: Buffer.from(('00' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + - 'FFFFFFFF 00000000 00000000 FFFFFFFC'). - replace(/ /g, ''), 'hex'), - b: Buffer.from(( - 'b3312fa7 e23ee7e4 988e056b e3f82d19' + - '181d9c6e fe814112 0314088f 5013875a' + - 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). - replace(/ /g, ''), 'hex'), - s: Buffer.from(('00' + - 'a335926a a319a27a 1d00896a 6773a482' + - '7acdac73'). - replace(/ /g, ''), 'hex'), - n: Buffer.from(('00' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff c7634d81 f4372ddf' + - '581a0db2 48b0a77a ecec196a ccc52973'). - replace(/ /g, ''), 'hex'), - G: Buffer.from(('04' + - 'aa87ca22 be8b0537 8eb1c71e f320ad74' + - '6e1d3b62 8ba79b98 59f741e0 82542a38' + - '5502f25d bf55296c 3a545e38 72760ab7' + - '3617de4a 96262c6f 5d9e98bf 9292dc29' + - 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + - '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). - replace(/ /g, ''), 'hex') - }, - 'nistp521': { - size: 521, - pkcs8oid: '1.3.132.0.35', - p: Buffer.from(( - '01ffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffff').replace(/ /g, ''), 'hex'), - a: Buffer.from(('01FF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). - replace(/ /g, ''), 'hex'), - b: Buffer.from(('51' + - '953eb961 8e1c9a1f 929a21a0 b68540ee' + - 'a2da725b 99b315f3 b8b48991 8ef109e1' + - '56193951 ec7e937b 1652c0bd 3bb1bf07' + - '3573df88 3d2c34f1 ef451fd4 6b503f00'). - replace(/ /g, ''), 'hex'), - s: Buffer.from(('00' + - 'd09e8800 291cb853 96cc6717 393284aa' + - 'a0da64ba').replace(/ /g, ''), 'hex'), - n: Buffer.from(('01ff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff fffffffa' + - '51868783 bf2f966b 7fcc0148 f709a5d0' + - '3bb5c9b8 899c47ae bb6fb71e 91386409'). - replace(/ /g, ''), 'hex'), - G: Buffer.from(('04' + - '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + - '9c648139 053fb521 f828af60 6b4d3dba' + - 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + - '3348b3c1 856a429b f97e7e31 c2e5bd66' + - '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + - '98f54449 579b4468 17afbd17 273e662c' + - '97ee7299 5ef42640 c550b901 3fad0761' + - '353c7086 a272c240 88be9476 9fd16650'). - replace(/ /g, ''), 'hex') - } -}; - -module.exports = { - info: algInfo, - privInfo: algPrivInfo, - hashAlgs: hashAlgs, - curves: curves -}; diff --git a/node_modules/sshpk/lib/certificate.js b/node_modules/sshpk/lib/certificate.js deleted file mode 100644 index 69323570..00000000 --- a/node_modules/sshpk/lib/certificate.js +++ /dev/null @@ -1,410 +0,0 @@ -// Copyright 2016 Joyent, Inc. - -module.exports = Certificate; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('./algs'); -var crypto = require('crypto'); -var Fingerprint = require('./fingerprint'); -var Signature = require('./signature'); -var errs = require('./errors'); -var util = require('util'); -var utils = require('./utils'); -var Key = require('./key'); -var PrivateKey = require('./private-key'); -var Identity = require('./identity'); - -var formats = {}; -formats['openssh'] = require('./formats/openssh-cert'); -formats['x509'] = require('./formats/x509'); -formats['pem'] = require('./formats/x509-pem'); - -var CertificateParseError = errs.CertificateParseError; -var InvalidAlgorithmError = errs.InvalidAlgorithmError; - -function Certificate(opts) { - assert.object(opts, 'options'); - assert.arrayOfObject(opts.subjects, 'options.subjects'); - utils.assertCompatible(opts.subjects[0], Identity, [1, 0], - 'options.subjects'); - utils.assertCompatible(opts.subjectKey, Key, [1, 0], - 'options.subjectKey'); - utils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer'); - if (opts.issuerKey !== undefined) { - utils.assertCompatible(opts.issuerKey, Key, [1, 0], - 'options.issuerKey'); - } - assert.object(opts.signatures, 'options.signatures'); - assert.buffer(opts.serial, 'options.serial'); - assert.date(opts.validFrom, 'options.validFrom'); - assert.date(opts.validUntil, 'optons.validUntil'); - - assert.optionalArrayOfString(opts.purposes, 'options.purposes'); - - this._hashCache = {}; - - this.subjects = opts.subjects; - this.issuer = opts.issuer; - this.subjectKey = opts.subjectKey; - this.issuerKey = opts.issuerKey; - this.signatures = opts.signatures; - this.serial = opts.serial; - this.validFrom = opts.validFrom; - this.validUntil = opts.validUntil; - this.purposes = opts.purposes; -} - -Certificate.formats = formats; - -Certificate.prototype.toBuffer = function (format, options) { - if (format === undefined) - format = 'x509'; - assert.string(format, 'format'); - assert.object(formats[format], 'formats[format]'); - assert.optionalObject(options, 'options'); - - return (formats[format].write(this, options)); -}; - -Certificate.prototype.toString = function (format, options) { - if (format === undefined) - format = 'pem'; - return (this.toBuffer(format, options).toString()); -}; - -Certificate.prototype.fingerprint = function (algo) { - if (algo === undefined) - algo = 'sha256'; - assert.string(algo, 'algorithm'); - var opts = { - type: 'certificate', - hash: this.hash(algo), - algorithm: algo - }; - return (new Fingerprint(opts)); -}; - -Certificate.prototype.hash = function (algo) { - assert.string(algo, 'algorithm'); - algo = algo.toLowerCase(); - if (algs.hashAlgs[algo] === undefined) - throw (new InvalidAlgorithmError(algo)); - - if (this._hashCache[algo]) - return (this._hashCache[algo]); - - var hash = crypto.createHash(algo). - update(this.toBuffer('x509')).digest(); - this._hashCache[algo] = hash; - return (hash); -}; - -Certificate.prototype.isExpired = function (when) { - if (when === undefined) - when = new Date(); - return (!((when.getTime() >= this.validFrom.getTime()) && - (when.getTime() < this.validUntil.getTime()))); -}; - -Certificate.prototype.isSignedBy = function (issuerCert) { - utils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer'); - - if (!this.issuer.equals(issuerCert.subjects[0])) - return (false); - if (this.issuer.purposes && this.issuer.purposes.length > 0 && - this.issuer.purposes.indexOf('ca') === -1) { - return (false); - } - - return (this.isSignedByKey(issuerCert.subjectKey)); -}; - -Certificate.prototype.getExtension = function (keyOrOid) { - assert.string(keyOrOid, 'keyOrOid'); - var ext = this.getExtensions().filter(function (maybeExt) { - if (maybeExt.format === 'x509') - return (maybeExt.oid === keyOrOid); - if (maybeExt.format === 'openssh') - return (maybeExt.name === keyOrOid); - return (false); - })[0]; - return (ext); -}; - -Certificate.prototype.getExtensions = function () { - var exts = []; - var x509 = this.signatures.x509; - if (x509 && x509.extras && x509.extras.exts) { - x509.extras.exts.forEach(function (ext) { - ext.format = 'x509'; - exts.push(ext); - }); - } - var openssh = this.signatures.openssh; - if (openssh && openssh.exts) { - openssh.exts.forEach(function (ext) { - ext.format = 'openssh'; - exts.push(ext); - }); - } - return (exts); -}; - -Certificate.prototype.isSignedByKey = function (issuerKey) { - utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey'); - - if (this.issuerKey !== undefined) { - return (this.issuerKey. - fingerprint('sha512').matches(issuerKey)); - } - - var fmt = Object.keys(this.signatures)[0]; - var valid = formats[fmt].verify(this, issuerKey); - if (valid) - this.issuerKey = issuerKey; - return (valid); -}; - -Certificate.prototype.signWith = function (key) { - utils.assertCompatible(key, PrivateKey, [1, 2], 'key'); - var fmts = Object.keys(formats); - var didOne = false; - for (var i = 0; i < fmts.length; ++i) { - if (fmts[i] !== 'pem') { - var ret = formats[fmts[i]].sign(this, key); - if (ret === true) - didOne = true; - } - } - if (!didOne) { - throw (new Error('Failed to sign the certificate for any ' + - 'available certificate formats')); - } -}; - -Certificate.createSelfSigned = function (subjectOrSubjects, key, options) { - var subjects; - if (Array.isArray(subjectOrSubjects)) - subjects = subjectOrSubjects; - else - subjects = [subjectOrSubjects]; - - assert.arrayOfObject(subjects); - subjects.forEach(function (subject) { - utils.assertCompatible(subject, Identity, [1, 0], 'subject'); - }); - - utils.assertCompatible(key, PrivateKey, [1, 2], 'private key'); - - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - assert.optionalObject(options.validFrom, 'options.validFrom'); - assert.optionalObject(options.validUntil, 'options.validUntil'); - var validFrom = options.validFrom; - var validUntil = options.validUntil; - if (validFrom === undefined) - validFrom = new Date(); - if (validUntil === undefined) { - assert.optionalNumber(options.lifetime, 'options.lifetime'); - var lifetime = options.lifetime; - if (lifetime === undefined) - lifetime = 10*365*24*3600; - validUntil = new Date(); - validUntil.setTime(validUntil.getTime() + lifetime*1000); - } - assert.optionalBuffer(options.serial, 'options.serial'); - var serial = options.serial; - if (serial === undefined) - serial = Buffer.from('0000000000000001', 'hex'); - - var purposes = options.purposes; - if (purposes === undefined) - purposes = []; - - if (purposes.indexOf('signature') === -1) - purposes.push('signature'); - - /* Self-signed certs are always CAs. */ - if (purposes.indexOf('ca') === -1) - purposes.push('ca'); - if (purposes.indexOf('crl') === -1) - purposes.push('crl'); - - /* - * If we weren't explicitly given any other purposes, do the sensible - * thing and add some basic ones depending on the subject type. - */ - if (purposes.length <= 3) { - var hostSubjects = subjects.filter(function (subject) { - return (subject.type === 'host'); - }); - var userSubjects = subjects.filter(function (subject) { - return (subject.type === 'user'); - }); - if (hostSubjects.length > 0) { - if (purposes.indexOf('serverAuth') === -1) - purposes.push('serverAuth'); - } - if (userSubjects.length > 0) { - if (purposes.indexOf('clientAuth') === -1) - purposes.push('clientAuth'); - } - if (userSubjects.length > 0 || hostSubjects.length > 0) { - if (purposes.indexOf('keyAgreement') === -1) - purposes.push('keyAgreement'); - if (key.type === 'rsa' && - purposes.indexOf('encryption') === -1) - purposes.push('encryption'); - } - } - - var cert = new Certificate({ - subjects: subjects, - issuer: subjects[0], - subjectKey: key.toPublic(), - issuerKey: key.toPublic(), - signatures: {}, - serial: serial, - validFrom: validFrom, - validUntil: validUntil, - purposes: purposes - }); - cert.signWith(key); - - return (cert); -}; - -Certificate.create = - function (subjectOrSubjects, key, issuer, issuerKey, options) { - var subjects; - if (Array.isArray(subjectOrSubjects)) - subjects = subjectOrSubjects; - else - subjects = [subjectOrSubjects]; - - assert.arrayOfObject(subjects); - subjects.forEach(function (subject) { - utils.assertCompatible(subject, Identity, [1, 0], 'subject'); - }); - - utils.assertCompatible(key, Key, [1, 0], 'key'); - if (PrivateKey.isPrivateKey(key)) - key = key.toPublic(); - utils.assertCompatible(issuer, Identity, [1, 0], 'issuer'); - utils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key'); - - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - assert.optionalObject(options.validFrom, 'options.validFrom'); - assert.optionalObject(options.validUntil, 'options.validUntil'); - var validFrom = options.validFrom; - var validUntil = options.validUntil; - if (validFrom === undefined) - validFrom = new Date(); - if (validUntil === undefined) { - assert.optionalNumber(options.lifetime, 'options.lifetime'); - var lifetime = options.lifetime; - if (lifetime === undefined) - lifetime = 10*365*24*3600; - validUntil = new Date(); - validUntil.setTime(validUntil.getTime() + lifetime*1000); - } - assert.optionalBuffer(options.serial, 'options.serial'); - var serial = options.serial; - if (serial === undefined) - serial = Buffer.from('0000000000000001', 'hex'); - - var purposes = options.purposes; - if (purposes === undefined) - purposes = []; - - if (purposes.indexOf('signature') === -1) - purposes.push('signature'); - - if (options.ca === true) { - if (purposes.indexOf('ca') === -1) - purposes.push('ca'); - if (purposes.indexOf('crl') === -1) - purposes.push('crl'); - } - - var hostSubjects = subjects.filter(function (subject) { - return (subject.type === 'host'); - }); - var userSubjects = subjects.filter(function (subject) { - return (subject.type === 'user'); - }); - if (hostSubjects.length > 0) { - if (purposes.indexOf('serverAuth') === -1) - purposes.push('serverAuth'); - } - if (userSubjects.length > 0) { - if (purposes.indexOf('clientAuth') === -1) - purposes.push('clientAuth'); - } - if (userSubjects.length > 0 || hostSubjects.length > 0) { - if (purposes.indexOf('keyAgreement') === -1) - purposes.push('keyAgreement'); - if (key.type === 'rsa' && - purposes.indexOf('encryption') === -1) - purposes.push('encryption'); - } - - var cert = new Certificate({ - subjects: subjects, - issuer: issuer, - subjectKey: key, - issuerKey: issuerKey.toPublic(), - signatures: {}, - serial: serial, - validFrom: validFrom, - validUntil: validUntil, - purposes: purposes - }); - cert.signWith(issuerKey); - - return (cert); -}; - -Certificate.parse = function (data, format, options) { - if (typeof (data) !== 'string') - assert.buffer(data, 'data'); - if (format === undefined) - format = 'auto'; - assert.string(format, 'format'); - if (typeof (options) === 'string') - options = { filename: options }; - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - assert.optionalString(options.filename, 'options.filename'); - if (options.filename === undefined) - options.filename = '(unnamed)'; - - assert.object(formats[format], 'formats[format]'); - - try { - var k = formats[format].read(data, options); - return (k); - } catch (e) { - throw (new CertificateParseError(options.filename, format, e)); - } -}; - -Certificate.isCertificate = function (obj, ver) { - return (utils.isCompatible(obj, Certificate, ver)); -}; - -/* - * API versions for Certificate: - * [1,0] -- initial ver - * [1,1] -- openssh format now unpacks extensions - */ -Certificate.prototype._sshpkApiVersion = [1, 1]; - -Certificate._oldVersionDetect = function (obj) { - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/dhe.js b/node_modules/sshpk/lib/dhe.js deleted file mode 100644 index a3c8032c..00000000 --- a/node_modules/sshpk/lib/dhe.js +++ /dev/null @@ -1,397 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = { - DiffieHellman: DiffieHellman, - generateECDSA: generateECDSA, - generateED25519: generateED25519 -}; - -var assert = require('assert-plus'); -var crypto = require('crypto'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('./algs'); -var utils = require('./utils'); -var nacl = require('tweetnacl'); - -var Key = require('./key'); -var PrivateKey = require('./private-key'); - -var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined); - -var ecdh = require('ecc-jsbn'); -var ec = require('ecc-jsbn/lib/ec'); -var jsbn = require('jsbn').BigInteger; - -function DiffieHellman(key) { - utils.assertCompatible(key, Key, [1, 4], 'key'); - this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]); - this._algo = key.type; - this._curve = key.curve; - this._key = key; - if (key.type === 'dsa') { - if (!CRYPTO_HAVE_ECDH) { - throw (new Error('Due to bugs in the node 0.10 ' + - 'crypto API, node 0.12.x or later is required ' + - 'to use DH')); - } - this._dh = crypto.createDiffieHellman( - key.part.p.data, undefined, - key.part.g.data, undefined); - this._p = key.part.p; - this._g = key.part.g; - if (this._isPriv) - this._dh.setPrivateKey(key.part.x.data); - this._dh.setPublicKey(key.part.y.data); - - } else if (key.type === 'ecdsa') { - if (!CRYPTO_HAVE_ECDH) { - this._ecParams = new X9ECParameters(this._curve); - - if (this._isPriv) { - this._priv = new ECPrivate( - this._ecParams, key.part.d.data); - } - return; - } - - var curve = { - 'nistp256': 'prime256v1', - 'nistp384': 'secp384r1', - 'nistp521': 'secp521r1' - }[key.curve]; - this._dh = crypto.createECDH(curve); - if (typeof (this._dh) !== 'object' || - typeof (this._dh.setPrivateKey) !== 'function') { - CRYPTO_HAVE_ECDH = false; - DiffieHellman.call(this, key); - return; - } - if (this._isPriv) - this._dh.setPrivateKey(key.part.d.data); - this._dh.setPublicKey(key.part.Q.data); - - } else if (key.type === 'curve25519') { - if (this._isPriv) { - utils.assertCompatible(key, PrivateKey, [1, 5], 'key'); - this._priv = key.part.k.data; - } - - } else { - throw (new Error('DH not supported for ' + key.type + ' keys')); - } -} - -DiffieHellman.prototype.getPublicKey = function () { - if (this._isPriv) - return (this._key.toPublic()); - return (this._key); -}; - -DiffieHellman.prototype.getPrivateKey = function () { - if (this._isPriv) - return (this._key); - else - return (undefined); -}; -DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey; - -DiffieHellman.prototype._keyCheck = function (pk, isPub) { - assert.object(pk, 'key'); - if (!isPub) - utils.assertCompatible(pk, PrivateKey, [1, 3], 'key'); - utils.assertCompatible(pk, Key, [1, 4], 'key'); - - if (pk.type !== this._algo) { - throw (new Error('A ' + pk.type + ' key cannot be used in ' + - this._algo + ' Diffie-Hellman')); - } - - if (pk.curve !== this._curve) { - throw (new Error('A key from the ' + pk.curve + ' curve ' + - 'cannot be used with a ' + this._curve + - ' Diffie-Hellman')); - } - - if (pk.type === 'dsa') { - assert.deepEqual(pk.part.p, this._p, - 'DSA key prime does not match'); - assert.deepEqual(pk.part.g, this._g, - 'DSA key generator does not match'); - } -}; - -DiffieHellman.prototype.setKey = function (pk) { - this._keyCheck(pk); - - if (pk.type === 'dsa') { - this._dh.setPrivateKey(pk.part.x.data); - this._dh.setPublicKey(pk.part.y.data); - - } else if (pk.type === 'ecdsa') { - if (CRYPTO_HAVE_ECDH) { - this._dh.setPrivateKey(pk.part.d.data); - this._dh.setPublicKey(pk.part.Q.data); - } else { - this._priv = new ECPrivate( - this._ecParams, pk.part.d.data); - } - - } else if (pk.type === 'curve25519') { - var k = pk.part.k; - if (!pk.part.k) - k = pk.part.r; - this._priv = k.data; - if (this._priv[0] === 0x00) - this._priv = this._priv.slice(1); - this._priv = this._priv.slice(0, 32); - } - this._key = pk; - this._isPriv = true; -}; -DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey; - -DiffieHellman.prototype.computeSecret = function (otherpk) { - this._keyCheck(otherpk, true); - if (!this._isPriv) - throw (new Error('DH exchange has not been initialized with ' + - 'a private key yet')); - - var pub; - if (this._algo === 'dsa') { - return (this._dh.computeSecret( - otherpk.part.y.data)); - - } else if (this._algo === 'ecdsa') { - if (CRYPTO_HAVE_ECDH) { - return (this._dh.computeSecret( - otherpk.part.Q.data)); - } else { - pub = new ECPublic( - this._ecParams, otherpk.part.Q.data); - return (this._priv.deriveSharedSecret(pub)); - } - - } else if (this._algo === 'curve25519') { - pub = otherpk.part.A.data; - while (pub[0] === 0x00 && pub.length > 32) - pub = pub.slice(1); - var priv = this._priv; - assert.strictEqual(pub.length, 32); - assert.strictEqual(priv.length, 32); - - var secret = nacl.box.before(new Uint8Array(pub), - new Uint8Array(priv)); - - return (Buffer.from(secret)); - } - - throw (new Error('Invalid algorithm: ' + this._algo)); -}; - -DiffieHellman.prototype.generateKey = function () { - var parts = []; - var priv, pub; - if (this._algo === 'dsa') { - this._dh.generateKeys(); - - parts.push({name: 'p', data: this._p.data}); - parts.push({name: 'q', data: this._key.part.q.data}); - parts.push({name: 'g', data: this._g.data}); - parts.push({name: 'y', data: this._dh.getPublicKey()}); - parts.push({name: 'x', data: this._dh.getPrivateKey()}); - this._key = new PrivateKey({ - type: 'dsa', - parts: parts - }); - this._isPriv = true; - return (this._key); - - } else if (this._algo === 'ecdsa') { - if (CRYPTO_HAVE_ECDH) { - this._dh.generateKeys(); - - parts.push({name: 'curve', - data: Buffer.from(this._curve)}); - parts.push({name: 'Q', data: this._dh.getPublicKey()}); - parts.push({name: 'd', data: this._dh.getPrivateKey()}); - this._key = new PrivateKey({ - type: 'ecdsa', - curve: this._curve, - parts: parts - }); - this._isPriv = true; - return (this._key); - - } else { - var n = this._ecParams.getN(); - var r = new jsbn(crypto.randomBytes(n.bitLength())); - var n1 = n.subtract(jsbn.ONE); - priv = r.mod(n1).add(jsbn.ONE); - pub = this._ecParams.getG().multiply(priv); - - priv = Buffer.from(priv.toByteArray()); - pub = Buffer.from(this._ecParams.getCurve(). - encodePointHex(pub), 'hex'); - - this._priv = new ECPrivate(this._ecParams, priv); - - parts.push({name: 'curve', - data: Buffer.from(this._curve)}); - parts.push({name: 'Q', data: pub}); - parts.push({name: 'd', data: priv}); - - this._key = new PrivateKey({ - type: 'ecdsa', - curve: this._curve, - parts: parts - }); - this._isPriv = true; - return (this._key); - } - - } else if (this._algo === 'curve25519') { - var pair = nacl.box.keyPair(); - priv = Buffer.from(pair.secretKey); - pub = Buffer.from(pair.publicKey); - priv = Buffer.concat([priv, pub]); - assert.strictEqual(priv.length, 64); - assert.strictEqual(pub.length, 32); - - parts.push({name: 'A', data: pub}); - parts.push({name: 'k', data: priv}); - this._key = new PrivateKey({ - type: 'curve25519', - parts: parts - }); - this._isPriv = true; - return (this._key); - } - - throw (new Error('Invalid algorithm: ' + this._algo)); -}; -DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey; - -/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */ - -function X9ECParameters(name) { - var params = algs.curves[name]; - assert.object(params); - - var p = new jsbn(params.p); - var a = new jsbn(params.a); - var b = new jsbn(params.b); - var n = new jsbn(params.n); - var h = jsbn.ONE; - var curve = new ec.ECCurveFp(p, a, b); - var G = curve.decodePointHex(params.G.toString('hex')); - - this.curve = curve; - this.g = G; - this.n = n; - this.h = h; -} -X9ECParameters.prototype.getCurve = function () { return (this.curve); }; -X9ECParameters.prototype.getG = function () { return (this.g); }; -X9ECParameters.prototype.getN = function () { return (this.n); }; -X9ECParameters.prototype.getH = function () { return (this.h); }; - -function ECPublic(params, buffer) { - this._params = params; - if (buffer[0] === 0x00) - buffer = buffer.slice(1); - this._pub = params.getCurve().decodePointHex(buffer.toString('hex')); -} - -function ECPrivate(params, buffer) { - this._params = params; - this._priv = new jsbn(utils.mpNormalize(buffer)); -} -ECPrivate.prototype.deriveSharedSecret = function (pubKey) { - assert.ok(pubKey instanceof ECPublic); - var S = pubKey._pub.multiply(this._priv); - return (Buffer.from(S.getX().toBigInteger().toByteArray())); -}; - -function generateED25519() { - var pair = nacl.sign.keyPair(); - var priv = Buffer.from(pair.secretKey); - var pub = Buffer.from(pair.publicKey); - assert.strictEqual(priv.length, 64); - assert.strictEqual(pub.length, 32); - - var parts = []; - parts.push({name: 'A', data: pub}); - parts.push({name: 'k', data: priv.slice(0, 32)}); - var key = new PrivateKey({ - type: 'ed25519', - parts: parts - }); - return (key); -} - -/* Generates a new ECDSA private key on a given curve. */ -function generateECDSA(curve) { - var parts = []; - var key; - - if (CRYPTO_HAVE_ECDH) { - /* - * Node crypto doesn't expose key generation directly, but the - * ECDH instances can generate keys. It turns out this just - * calls into the OpenSSL generic key generator, and we can - * read its output happily without doing an actual DH. So we - * use that here. - */ - var osCurve = { - 'nistp256': 'prime256v1', - 'nistp384': 'secp384r1', - 'nistp521': 'secp521r1' - }[curve]; - - var dh = crypto.createECDH(osCurve); - dh.generateKeys(); - - parts.push({name: 'curve', - data: Buffer.from(curve)}); - parts.push({name: 'Q', data: dh.getPublicKey()}); - parts.push({name: 'd', data: dh.getPrivateKey()}); - - key = new PrivateKey({ - type: 'ecdsa', - curve: curve, - parts: parts - }); - return (key); - } else { - - var ecParams = new X9ECParameters(curve); - - /* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */ - var n = ecParams.getN(); - /* - * The crypto.randomBytes() function can only give us whole - * bytes, so taking a nod from X9.62, we round up. - */ - var cByteLen = Math.ceil((n.bitLength() + 64) / 8); - var c = new jsbn(crypto.randomBytes(cByteLen)); - - var n1 = n.subtract(jsbn.ONE); - var priv = c.mod(n1).add(jsbn.ONE); - var pub = ecParams.getG().multiply(priv); - - priv = Buffer.from(priv.toByteArray()); - pub = Buffer.from(ecParams.getCurve(). - encodePointHex(pub), 'hex'); - - parts.push({name: 'curve', data: Buffer.from(curve)}); - parts.push({name: 'Q', data: pub}); - parts.push({name: 'd', data: priv}); - - key = new PrivateKey({ - type: 'ecdsa', - curve: curve, - parts: parts - }); - return (key); - } -} diff --git a/node_modules/sshpk/lib/ed-compat.js b/node_modules/sshpk/lib/ed-compat.js deleted file mode 100644 index 70732e1f..00000000 --- a/node_modules/sshpk/lib/ed-compat.js +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - Verifier: Verifier, - Signer: Signer -}; - -var nacl = require('tweetnacl'); -var stream = require('stream'); -var util = require('util'); -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var Signature = require('./signature'); - -function Verifier(key, hashAlgo) { - if (hashAlgo.toLowerCase() !== 'sha512') - throw (new Error('ED25519 only supports the use of ' + - 'SHA-512 hashes')); - - this.key = key; - this.chunks = []; - - stream.Writable.call(this, {}); -} -util.inherits(Verifier, stream.Writable); - -Verifier.prototype._write = function (chunk, enc, cb) { - this.chunks.push(chunk); - cb(); -}; - -Verifier.prototype.update = function (chunk) { - if (typeof (chunk) === 'string') - chunk = Buffer.from(chunk, 'binary'); - this.chunks.push(chunk); -}; - -Verifier.prototype.verify = function (signature, fmt) { - var sig; - if (Signature.isSignature(signature, [2, 0])) { - if (signature.type !== 'ed25519') - return (false); - sig = signature.toBuffer('raw'); - - } else if (typeof (signature) === 'string') { - sig = Buffer.from(signature, 'base64'); - - } else if (Signature.isSignature(signature, [1, 0])) { - throw (new Error('signature was created by too old ' + - 'a version of sshpk and cannot be verified')); - } - - assert.buffer(sig); - return (nacl.sign.detached.verify( - new Uint8Array(Buffer.concat(this.chunks)), - new Uint8Array(sig), - new Uint8Array(this.key.part.A.data))); -}; - -function Signer(key, hashAlgo) { - if (hashAlgo.toLowerCase() !== 'sha512') - throw (new Error('ED25519 only supports the use of ' + - 'SHA-512 hashes')); - - this.key = key; - this.chunks = []; - - stream.Writable.call(this, {}); -} -util.inherits(Signer, stream.Writable); - -Signer.prototype._write = function (chunk, enc, cb) { - this.chunks.push(chunk); - cb(); -}; - -Signer.prototype.update = function (chunk) { - if (typeof (chunk) === 'string') - chunk = Buffer.from(chunk, 'binary'); - this.chunks.push(chunk); -}; - -Signer.prototype.sign = function () { - var sig = nacl.sign.detached( - new Uint8Array(Buffer.concat(this.chunks)), - new Uint8Array(Buffer.concat([ - this.key.part.k.data, this.key.part.A.data]))); - var sigBuf = Buffer.from(sig); - var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw'); - sigObj.hashAlgorithm = 'sha512'; - return (sigObj); -}; diff --git a/node_modules/sshpk/lib/errors.js b/node_modules/sshpk/lib/errors.js deleted file mode 100644 index 1cc09ec7..00000000 --- a/node_modules/sshpk/lib/errors.js +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -var assert = require('assert-plus'); -var util = require('util'); - -function FingerprintFormatError(fp, format) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, FingerprintFormatError); - this.name = 'FingerprintFormatError'; - this.fingerprint = fp; - this.format = format; - this.message = 'Fingerprint format is not supported, or is invalid: '; - if (fp !== undefined) - this.message += ' fingerprint = ' + fp; - if (format !== undefined) - this.message += ' format = ' + format; -} -util.inherits(FingerprintFormatError, Error); - -function InvalidAlgorithmError(alg) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, InvalidAlgorithmError); - this.name = 'InvalidAlgorithmError'; - this.algorithm = alg; - this.message = 'Algorithm "' + alg + '" is not supported'; -} -util.inherits(InvalidAlgorithmError, Error); - -function KeyParseError(name, format, innerErr) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, KeyParseError); - this.name = 'KeyParseError'; - this.format = format; - this.keyName = name; - this.innerErr = innerErr; - this.message = 'Failed to parse ' + name + ' as a valid ' + format + - ' format key: ' + innerErr.message; -} -util.inherits(KeyParseError, Error); - -function SignatureParseError(type, format, innerErr) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, SignatureParseError); - this.name = 'SignatureParseError'; - this.type = type; - this.format = format; - this.innerErr = innerErr; - this.message = 'Failed to parse the given data as a ' + type + - ' signature in ' + format + ' format: ' + innerErr.message; -} -util.inherits(SignatureParseError, Error); - -function CertificateParseError(name, format, innerErr) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, CertificateParseError); - this.name = 'CertificateParseError'; - this.format = format; - this.certName = name; - this.innerErr = innerErr; - this.message = 'Failed to parse ' + name + ' as a valid ' + format + - ' format certificate: ' + innerErr.message; -} -util.inherits(CertificateParseError, Error); - -function KeyEncryptedError(name, format) { - if (Error.captureStackTrace) - Error.captureStackTrace(this, KeyEncryptedError); - this.name = 'KeyEncryptedError'; - this.format = format; - this.keyName = name; - this.message = 'The ' + format + ' format key ' + name + ' is ' + - 'encrypted (password-protected), and no passphrase was ' + - 'provided in `options`'; -} -util.inherits(KeyEncryptedError, Error); - -module.exports = { - FingerprintFormatError: FingerprintFormatError, - InvalidAlgorithmError: InvalidAlgorithmError, - KeyParseError: KeyParseError, - SignatureParseError: SignatureParseError, - KeyEncryptedError: KeyEncryptedError, - CertificateParseError: CertificateParseError -}; diff --git a/node_modules/sshpk/lib/fingerprint.js b/node_modules/sshpk/lib/fingerprint.js deleted file mode 100644 index 0004b376..00000000 --- a/node_modules/sshpk/lib/fingerprint.js +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = Fingerprint; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('./algs'); -var crypto = require('crypto'); -var errs = require('./errors'); -var Key = require('./key'); -var PrivateKey = require('./private-key'); -var Certificate = require('./certificate'); -var utils = require('./utils'); - -var FingerprintFormatError = errs.FingerprintFormatError; -var InvalidAlgorithmError = errs.InvalidAlgorithmError; - -function Fingerprint(opts) { - assert.object(opts, 'options'); - assert.string(opts.type, 'options.type'); - assert.buffer(opts.hash, 'options.hash'); - assert.string(opts.algorithm, 'options.algorithm'); - - this.algorithm = opts.algorithm.toLowerCase(); - if (algs.hashAlgs[this.algorithm] !== true) - throw (new InvalidAlgorithmError(this.algorithm)); - - this.hash = opts.hash; - this.type = opts.type; - this.hashType = opts.hashType; -} - -Fingerprint.prototype.toString = function (format) { - if (format === undefined) { - if (this.algorithm === 'md5' || this.hashType === 'spki') - format = 'hex'; - else - format = 'base64'; - } - assert.string(format); - - switch (format) { - case 'hex': - if (this.hashType === 'spki') - return (this.hash.toString('hex')); - return (addColons(this.hash.toString('hex'))); - case 'base64': - if (this.hashType === 'spki') - return (this.hash.toString('base64')); - return (sshBase64Format(this.algorithm, - this.hash.toString('base64'))); - default: - throw (new FingerprintFormatError(undefined, format)); - } -}; - -Fingerprint.prototype.matches = function (other) { - assert.object(other, 'key or certificate'); - if (this.type === 'key' && this.hashType !== 'ssh') { - utils.assertCompatible(other, Key, [1, 7], 'key with spki'); - if (PrivateKey.isPrivateKey(other)) { - utils.assertCompatible(other, PrivateKey, [1, 6], - 'privatekey with spki support'); - } - } else if (this.type === 'key') { - utils.assertCompatible(other, Key, [1, 0], 'key'); - } else { - utils.assertCompatible(other, Certificate, [1, 0], - 'certificate'); - } - - var theirHash = other.hash(this.algorithm, this.hashType); - var theirHash2 = crypto.createHash(this.algorithm). - update(theirHash).digest('base64'); - - if (this.hash2 === undefined) - this.hash2 = crypto.createHash(this.algorithm). - update(this.hash).digest('base64'); - - return (this.hash2 === theirHash2); -}; - -/*JSSTYLED*/ -var base64RE = /^[A-Za-z0-9+\/=]+$/; -/*JSSTYLED*/ -var hexRE = /^[a-fA-F0-9]+$/; - -Fingerprint.parse = function (fp, options) { - assert.string(fp, 'fingerprint'); - - var alg, hash, enAlgs; - if (Array.isArray(options)) { - enAlgs = options; - options = {}; - } - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - if (options.enAlgs !== undefined) - enAlgs = options.enAlgs; - if (options.algorithms !== undefined) - enAlgs = options.algorithms; - assert.optionalArrayOfString(enAlgs, 'algorithms'); - - var hashType = 'ssh'; - if (options.hashType !== undefined) - hashType = options.hashType; - assert.string(hashType, 'options.hashType'); - - var parts = fp.split(':'); - if (parts.length == 2) { - alg = parts[0].toLowerCase(); - if (!base64RE.test(parts[1])) - throw (new FingerprintFormatError(fp)); - try { - hash = Buffer.from(parts[1], 'base64'); - } catch (e) { - throw (new FingerprintFormatError(fp)); - } - } else if (parts.length > 2) { - alg = 'md5'; - if (parts[0].toLowerCase() === 'md5') - parts = parts.slice(1); - parts = parts.map(function (p) { - while (p.length < 2) - p = '0' + p; - if (p.length > 2) - throw (new FingerprintFormatError(fp)); - return (p); - }); - parts = parts.join(''); - if (!hexRE.test(parts) || parts.length % 2 !== 0) - throw (new FingerprintFormatError(fp)); - try { - hash = Buffer.from(parts, 'hex'); - } catch (e) { - throw (new FingerprintFormatError(fp)); - } - } else { - if (hexRE.test(fp)) { - hash = Buffer.from(fp, 'hex'); - } else if (base64RE.test(fp)) { - hash = Buffer.from(fp, 'base64'); - } else { - throw (new FingerprintFormatError(fp)); - } - - switch (hash.length) { - case 32: - alg = 'sha256'; - break; - case 16: - alg = 'md5'; - break; - case 20: - alg = 'sha1'; - break; - case 64: - alg = 'sha512'; - break; - default: - throw (new FingerprintFormatError(fp)); - } - - /* Plain hex/base64: guess it's probably SPKI unless told. */ - if (options.hashType === undefined) - hashType = 'spki'; - } - - if (alg === undefined) - throw (new FingerprintFormatError(fp)); - - if (algs.hashAlgs[alg] === undefined) - throw (new InvalidAlgorithmError(alg)); - - if (enAlgs !== undefined) { - enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); }); - if (enAlgs.indexOf(alg) === -1) - throw (new InvalidAlgorithmError(alg)); - } - - return (new Fingerprint({ - algorithm: alg, - hash: hash, - type: options.type || 'key', - hashType: hashType - })); -}; - -function addColons(s) { - /*JSSTYLED*/ - return (s.replace(/(.{2})(?=.)/g, '$1:')); -} - -function base64Strip(s) { - /*JSSTYLED*/ - return (s.replace(/=*$/, '')); -} - -function sshBase64Format(alg, h) { - return (alg.toUpperCase() + ':' + base64Strip(h)); -} - -Fingerprint.isFingerprint = function (obj, ver) { - return (utils.isCompatible(obj, Fingerprint, ver)); -}; - -/* - * API versions for Fingerprint: - * [1,0] -- initial ver - * [1,1] -- first tagged ver - * [1,2] -- hashType and spki support - */ -Fingerprint.prototype._sshpkApiVersion = [1, 2]; - -Fingerprint._oldVersionDetect = function (obj) { - assert.func(obj.toString); - assert.func(obj.matches); - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/formats/auto.js b/node_modules/sshpk/lib/formats/auto.js deleted file mode 100644 index f32cd964..00000000 --- a/node_modules/sshpk/lib/formats/auto.js +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = { - read: read, - write: write -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); - -var pem = require('./pem'); -var ssh = require('./ssh'); -var rfc4253 = require('./rfc4253'); -var dnssec = require('./dnssec'); -var putty = require('./putty'); - -var DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1'; - -function read(buf, options) { - if (typeof (buf) === 'string') { - if (buf.trim().match(/^[-]+[ ]*BEGIN/)) - return (pem.read(buf, options)); - if (buf.match(/^\s*ssh-[a-z]/)) - return (ssh.read(buf, options)); - if (buf.match(/^\s*ecdsa-/)) - return (ssh.read(buf, options)); - if (buf.match(/^putty-user-key-file-2:/i)) - return (putty.read(buf, options)); - if (findDNSSECHeader(buf)) - return (dnssec.read(buf, options)); - buf = Buffer.from(buf, 'binary'); - } else { - assert.buffer(buf); - if (findPEMHeader(buf)) - return (pem.read(buf, options)); - if (findSSHHeader(buf)) - return (ssh.read(buf, options)); - if (findPuTTYHeader(buf)) - return (putty.read(buf, options)); - if (findDNSSECHeader(buf)) - return (dnssec.read(buf, options)); - } - if (buf.readUInt32BE(0) < buf.length) - return (rfc4253.read(buf, options)); - throw (new Error('Failed to auto-detect format of key')); -} - -function findPuTTYHeader(buf) { - var offset = 0; - while (offset < buf.length && - (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) - ++offset; - if (offset + 22 <= buf.length && - buf.slice(offset, offset + 22).toString('ascii').toLowerCase() === - 'putty-user-key-file-2:') - return (true); - return (false); -} - -function findSSHHeader(buf) { - var offset = 0; - while (offset < buf.length && - (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) - ++offset; - if (offset + 4 <= buf.length && - buf.slice(offset, offset + 4).toString('ascii') === 'ssh-') - return (true); - if (offset + 6 <= buf.length && - buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-') - return (true); - return (false); -} - -function findPEMHeader(buf) { - var offset = 0; - while (offset < buf.length && - (buf[offset] === 32 || buf[offset] === 10)) - ++offset; - if (buf[offset] !== 45) - return (false); - while (offset < buf.length && - (buf[offset] === 45)) - ++offset; - while (offset < buf.length && - (buf[offset] === 32)) - ++offset; - if (offset + 5 > buf.length || - buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN') - return (false); - return (true); -} - -function findDNSSECHeader(buf) { - // private case first - if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length) - return (false); - var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length); - if (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX) - return (true); - - // public-key RFC3110 ? - // 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...' - // skip any comment-lines - if (typeof (buf) !== 'string') { - buf = buf.toString('ascii'); - } - var lines = buf.split('\n'); - var line = 0; - /* JSSTYLED */ - while (lines[line].match(/^\;/)) - line++; - if (lines[line].toString('ascii').match(/\. IN KEY /)) - return (true); - if (lines[line].toString('ascii').match(/\. IN DNSKEY /)) - return (true); - return (false); -} - -function write(key, options) { - throw (new Error('"auto" format cannot be used for writing')); -} diff --git a/node_modules/sshpk/lib/formats/dnssec.js b/node_modules/sshpk/lib/formats/dnssec.js deleted file mode 100644 index a74ea9ce..00000000 --- a/node_modules/sshpk/lib/formats/dnssec.js +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = { - read: read, - write: write -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var utils = require('../utils'); -var SSHBuffer = require('../ssh-buffer'); -var Dhe = require('../dhe'); - -var supportedAlgos = { - 'rsa-sha1' : 5, - 'rsa-sha256' : 8, - 'rsa-sha512' : 10, - 'ecdsa-p256-sha256' : 13, - 'ecdsa-p384-sha384' : 14 - /* - * ed25519 is hypothetically supported with id 15 - * but the common tools available don't appear to be - * capable of generating/using ed25519 keys - */ -}; - -var supportedAlgosById = {}; -Object.keys(supportedAlgos).forEach(function (k) { - supportedAlgosById[supportedAlgos[k]] = k.toUpperCase(); -}); - -function read(buf, options) { - if (typeof (buf) !== 'string') { - assert.buffer(buf, 'buf'); - buf = buf.toString('ascii'); - } - var lines = buf.split('\n'); - if (lines[0].match(/^Private-key-format\: v1/)) { - var algElems = lines[1].split(' '); - var algoNum = parseInt(algElems[1], 10); - var algoName = algElems[2]; - if (!supportedAlgosById[algoNum]) - throw (new Error('Unsupported algorithm: ' + algoName)); - return (readDNSSECPrivateKey(algoNum, lines.slice(2))); - } - - // skip any comment-lines - var line = 0; - /* JSSTYLED */ - while (lines[line].match(/^\;/)) - line++; - // we should now have *one single* line left with our KEY on it. - if ((lines[line].match(/\. IN KEY /) || - lines[line].match(/\. IN DNSKEY /)) && lines[line+1].length === 0) { - return (readRFC3110(lines[line])); - } - throw (new Error('Cannot parse dnssec key')); -} - -function readRFC3110(keyString) { - var elems = keyString.split(' '); - //unused var flags = parseInt(elems[3], 10); - //unused var protocol = parseInt(elems[4], 10); - var algorithm = parseInt(elems[5], 10); - if (!supportedAlgosById[algorithm]) - throw (new Error('Unsupported algorithm: ' + algorithm)); - var base64key = elems.slice(6, elems.length).join(); - var keyBuffer = Buffer.from(base64key, 'base64'); - if (supportedAlgosById[algorithm].match(/^RSA-/)) { - // join the rest of the body into a single base64-blob - var publicExponentLen = keyBuffer.readUInt8(0); - if (publicExponentLen != 3 && publicExponentLen != 1) - throw (new Error('Cannot parse dnssec key: ' + - 'unsupported exponent length')); - - var publicExponent = keyBuffer.slice(1, publicExponentLen+1); - publicExponent = utils.mpNormalize(publicExponent); - var modulus = keyBuffer.slice(1+publicExponentLen); - modulus = utils.mpNormalize(modulus); - // now, make the key - var rsaKey = { - type: 'rsa', - parts: [] - }; - rsaKey.parts.push({ name: 'e', data: publicExponent}); - rsaKey.parts.push({ name: 'n', data: modulus}); - return (new Key(rsaKey)); - } - if (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' || - supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') { - var curve = 'nistp384'; - var size = 384; - if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) { - curve = 'nistp256'; - size = 256; - } - - var ecdsaKey = { - type: 'ecdsa', - curve: curve, - size: size, - parts: [ - {name: 'curve', data: Buffer.from(curve) }, - {name: 'Q', data: utils.ecNormalize(keyBuffer) } - ] - }; - return (new Key(ecdsaKey)); - } - throw (new Error('Unsupported algorithm: ' + - supportedAlgosById[algorithm])); -} - -function elementToBuf(e) { - return (Buffer.from(e.split(' ')[1], 'base64')); -} - -function readDNSSECRSAPrivateKey(elements) { - var rsaParams = {}; - elements.forEach(function (element) { - if (element.split(' ')[0] === 'Modulus:') - rsaParams['n'] = elementToBuf(element); - else if (element.split(' ')[0] === 'PublicExponent:') - rsaParams['e'] = elementToBuf(element); - else if (element.split(' ')[0] === 'PrivateExponent:') - rsaParams['d'] = elementToBuf(element); - else if (element.split(' ')[0] === 'Prime1:') - rsaParams['p'] = elementToBuf(element); - else if (element.split(' ')[0] === 'Prime2:') - rsaParams['q'] = elementToBuf(element); - else if (element.split(' ')[0] === 'Exponent1:') - rsaParams['dmodp'] = elementToBuf(element); - else if (element.split(' ')[0] === 'Exponent2:') - rsaParams['dmodq'] = elementToBuf(element); - else if (element.split(' ')[0] === 'Coefficient:') - rsaParams['iqmp'] = elementToBuf(element); - }); - // now, make the key - var key = { - type: 'rsa', - parts: [ - { name: 'e', data: utils.mpNormalize(rsaParams['e'])}, - { name: 'n', data: utils.mpNormalize(rsaParams['n'])}, - { name: 'd', data: utils.mpNormalize(rsaParams['d'])}, - { name: 'p', data: utils.mpNormalize(rsaParams['p'])}, - { name: 'q', data: utils.mpNormalize(rsaParams['q'])}, - { name: 'dmodp', - data: utils.mpNormalize(rsaParams['dmodp'])}, - { name: 'dmodq', - data: utils.mpNormalize(rsaParams['dmodq'])}, - { name: 'iqmp', - data: utils.mpNormalize(rsaParams['iqmp'])} - ] - }; - return (new PrivateKey(key)); -} - -function readDNSSECPrivateKey(alg, elements) { - if (supportedAlgosById[alg].match(/^RSA-/)) { - return (readDNSSECRSAPrivateKey(elements)); - } - if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' || - supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { - var d = Buffer.from(elements[0].split(' ')[1], 'base64'); - var curve = 'nistp384'; - var size = 384; - if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { - curve = 'nistp256'; - size = 256; - } - // DNSSEC generates the public-key on the fly (go calculate it) - var publicKey = utils.publicFromPrivateECDSA(curve, d); - var Q = publicKey.part['Q'].data; - var ecdsaKey = { - type: 'ecdsa', - curve: curve, - size: size, - parts: [ - {name: 'curve', data: Buffer.from(curve) }, - {name: 'd', data: d }, - {name: 'Q', data: Q } - ] - }; - return (new PrivateKey(ecdsaKey)); - } - throw (new Error('Unsupported algorithm: ' + supportedAlgosById[alg])); -} - -function dnssecTimestamp(date) { - var year = date.getFullYear() + ''; //stringify - var month = (date.getMonth() + 1); - var timestampStr = year + month + date.getUTCDate(); - timestampStr += '' + date.getUTCHours() + date.getUTCMinutes(); - timestampStr += date.getUTCSeconds(); - return (timestampStr); -} - -function rsaAlgFromOptions(opts) { - if (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1') - return ('5 (RSASHA1)'); - else if (opts.hashAlgo === 'sha256') - return ('8 (RSASHA256)'); - else if (opts.hashAlgo === 'sha512') - return ('10 (RSASHA512)'); - else - throw (new Error('Unknown or unsupported hash: ' + - opts.hashAlgo)); -} - -function writeRSA(key, options) { - // if we're missing parts, add them. - if (!key.part.dmodp || !key.part.dmodq) { - utils.addRSAMissing(key); - } - - var out = ''; - out += 'Private-key-format: v1.3\n'; - out += 'Algorithm: ' + rsaAlgFromOptions(options) + '\n'; - var n = utils.mpDenormalize(key.part['n'].data); - out += 'Modulus: ' + n.toString('base64') + '\n'; - var e = utils.mpDenormalize(key.part['e'].data); - out += 'PublicExponent: ' + e.toString('base64') + '\n'; - var d = utils.mpDenormalize(key.part['d'].data); - out += 'PrivateExponent: ' + d.toString('base64') + '\n'; - var p = utils.mpDenormalize(key.part['p'].data); - out += 'Prime1: ' + p.toString('base64') + '\n'; - var q = utils.mpDenormalize(key.part['q'].data); - out += 'Prime2: ' + q.toString('base64') + '\n'; - var dmodp = utils.mpDenormalize(key.part['dmodp'].data); - out += 'Exponent1: ' + dmodp.toString('base64') + '\n'; - var dmodq = utils.mpDenormalize(key.part['dmodq'].data); - out += 'Exponent2: ' + dmodq.toString('base64') + '\n'; - var iqmp = utils.mpDenormalize(key.part['iqmp'].data); - out += 'Coefficient: ' + iqmp.toString('base64') + '\n'; - // Assume that we're valid as-of now - var timestamp = new Date(); - out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; - out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; - out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; - return (Buffer.from(out, 'ascii')); -} - -function writeECDSA(key, options) { - var out = ''; - out += 'Private-key-format: v1.3\n'; - - if (key.curve === 'nistp256') { - out += 'Algorithm: 13 (ECDSAP256SHA256)\n'; - } else if (key.curve === 'nistp384') { - out += 'Algorithm: 14 (ECDSAP384SHA384)\n'; - } else { - throw (new Error('Unsupported curve')); - } - var base64Key = key.part['d'].data.toString('base64'); - out += 'PrivateKey: ' + base64Key + '\n'; - - // Assume that we're valid as-of now - var timestamp = new Date(); - out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; - out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; - out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; - - return (Buffer.from(out, 'ascii')); -} - -function write(key, options) { - if (PrivateKey.isPrivateKey(key)) { - if (key.type === 'rsa') { - return (writeRSA(key, options)); - } else if (key.type === 'ecdsa') { - return (writeECDSA(key, options)); - } else { - throw (new Error('Unsupported algorithm: ' + key.type)); - } - } else if (Key.isKey(key)) { - /* - * RFC3110 requires a keyname, and a keytype, which we - * don't really have a mechanism for specifying such - * additional metadata. - */ - throw (new Error('Format "dnssec" only supports ' + - 'writing private keys')); - } else { - throw (new Error('key is not a Key or PrivateKey')); - } -} diff --git a/node_modules/sshpk/lib/formats/openssh-cert.js b/node_modules/sshpk/lib/formats/openssh-cert.js deleted file mode 100644 index 766f3d39..00000000 --- a/node_modules/sshpk/lib/formats/openssh-cert.js +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = { - read: read, - verify: verify, - sign: sign, - signAsync: signAsync, - write: write, - - /* Internal private API */ - fromBuffer: fromBuffer, - toBuffer: toBuffer -}; - -var assert = require('assert-plus'); -var SSHBuffer = require('../ssh-buffer'); -var crypto = require('crypto'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var Identity = require('../identity'); -var rfc4253 = require('./rfc4253'); -var Signature = require('../signature'); -var utils = require('../utils'); -var Certificate = require('../certificate'); - -function verify(cert, key) { - /* - * We always give an issuerKey, so if our verify() is being called then - * there was no signature. Return false. - */ - return (false); -} - -var TYPES = { - 'user': 1, - 'host': 2 -}; -Object.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; }); - -var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/; - -function read(buf, options) { - if (Buffer.isBuffer(buf)) - buf = buf.toString('ascii'); - var parts = buf.trim().split(/[ \t\n]+/g); - if (parts.length < 2 || parts.length > 3) - throw (new Error('Not a valid SSH certificate line')); - - var algo = parts[0]; - var data = parts[1]; - - data = Buffer.from(data, 'base64'); - return (fromBuffer(data, algo)); -} - -function fromBuffer(data, algo, partial) { - var sshbuf = new SSHBuffer({ buffer: data }); - var innerAlgo = sshbuf.readString(); - if (algo !== undefined && innerAlgo !== algo) - throw (new Error('SSH certificate algorithm mismatch')); - if (algo === undefined) - algo = innerAlgo; - - var cert = {}; - cert.signatures = {}; - cert.signatures.openssh = {}; - - cert.signatures.openssh.nonce = sshbuf.readBuffer(); - - var key = {}; - var parts = (key.parts = []); - key.type = getAlg(algo); - - var partCount = algs.info[key.type].parts.length; - while (parts.length < partCount) - parts.push(sshbuf.readPart()); - assert.ok(parts.length >= 1, 'key must have at least one part'); - - var algInfo = algs.info[key.type]; - if (key.type === 'ecdsa') { - var res = ECDSA_ALGO.exec(algo); - assert.ok(res !== null); - assert.strictEqual(res[1], parts[0].data.toString()); - } - - for (var i = 0; i < algInfo.parts.length; ++i) { - parts[i].name = algInfo.parts[i]; - if (parts[i].name !== 'curve' && - algInfo.normalize !== false) { - var p = parts[i]; - p.data = utils.mpNormalize(p.data); - } - } - - cert.subjectKey = new Key(key); - - cert.serial = sshbuf.readInt64(); - - var type = TYPES[sshbuf.readInt()]; - assert.string(type, 'valid cert type'); - - cert.signatures.openssh.keyId = sshbuf.readString(); - - var principals = []; - var pbuf = sshbuf.readBuffer(); - var psshbuf = new SSHBuffer({ buffer: pbuf }); - while (!psshbuf.atEnd()) - principals.push(psshbuf.readString()); - if (principals.length === 0) - principals = ['*']; - - cert.subjects = principals.map(function (pr) { - if (type === 'user') - return (Identity.forUser(pr)); - else if (type === 'host') - return (Identity.forHost(pr)); - throw (new Error('Unknown identity type ' + type)); - }); - - cert.validFrom = int64ToDate(sshbuf.readInt64()); - cert.validUntil = int64ToDate(sshbuf.readInt64()); - - var exts = []; - var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); - var ext; - while (!extbuf.atEnd()) { - ext = { critical: true }; - ext.name = extbuf.readString(); - ext.data = extbuf.readBuffer(); - exts.push(ext); - } - extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); - while (!extbuf.atEnd()) { - ext = { critical: false }; - ext.name = extbuf.readString(); - ext.data = extbuf.readBuffer(); - exts.push(ext); - } - cert.signatures.openssh.exts = exts; - - /* reserved */ - sshbuf.readBuffer(); - - var signingKeyBuf = sshbuf.readBuffer(); - cert.issuerKey = rfc4253.read(signingKeyBuf); - - /* - * OpenSSH certs don't give the identity of the issuer, just their - * public key. So, we use an Identity that matches anything. The - * isSignedBy() function will later tell you if the key matches. - */ - cert.issuer = Identity.forHost('**'); - - var sigBuf = sshbuf.readBuffer(); - cert.signatures.openssh.signature = - Signature.parse(sigBuf, cert.issuerKey.type, 'ssh'); - - if (partial !== undefined) { - partial.remainder = sshbuf.remainder(); - partial.consumed = sshbuf._offset; - } - - return (new Certificate(cert)); -} - -function int64ToDate(buf) { - var i = buf.readUInt32BE(0) * 4294967296; - i += buf.readUInt32BE(4); - var d = new Date(); - d.setTime(i * 1000); - d.sourceInt64 = buf; - return (d); -} - -function dateToInt64(date) { - if (date.sourceInt64 !== undefined) - return (date.sourceInt64); - var i = Math.round(date.getTime() / 1000); - var upper = Math.floor(i / 4294967296); - var lower = Math.floor(i % 4294967296); - var buf = Buffer.alloc(8); - buf.writeUInt32BE(upper, 0); - buf.writeUInt32BE(lower, 4); - return (buf); -} - -function sign(cert, key) { - if (cert.signatures.openssh === undefined) - cert.signatures.openssh = {}; - try { - var blob = toBuffer(cert, true); - } catch (e) { - delete (cert.signatures.openssh); - return (false); - } - var sig = cert.signatures.openssh; - var hashAlgo = undefined; - if (key.type === 'rsa' || key.type === 'dsa') - hashAlgo = 'sha1'; - var signer = key.createSign(hashAlgo); - signer.write(blob); - sig.signature = signer.sign(); - return (true); -} - -function signAsync(cert, signer, done) { - if (cert.signatures.openssh === undefined) - cert.signatures.openssh = {}; - try { - var blob = toBuffer(cert, true); - } catch (e) { - delete (cert.signatures.openssh); - done(e); - return; - } - var sig = cert.signatures.openssh; - - signer(blob, function (err, signature) { - if (err) { - done(err); - return; - } - try { - /* - * This will throw if the signature isn't of a - * type/algo that can be used for SSH. - */ - signature.toBuffer('ssh'); - } catch (e) { - done(e); - return; - } - sig.signature = signature; - done(); - }); -} - -function write(cert, options) { - if (options === undefined) - options = {}; - - var blob = toBuffer(cert); - var out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64'); - if (options.comment) - out = out + ' ' + options.comment; - return (out); -} - - -function toBuffer(cert, noSig) { - assert.object(cert.signatures.openssh, 'signature for openssh format'); - var sig = cert.signatures.openssh; - - if (sig.nonce === undefined) - sig.nonce = crypto.randomBytes(16); - var buf = new SSHBuffer({}); - buf.writeString(getCertType(cert.subjectKey)); - buf.writeBuffer(sig.nonce); - - var key = cert.subjectKey; - var algInfo = algs.info[key.type]; - algInfo.parts.forEach(function (part) { - buf.writePart(key.part[part]); - }); - - buf.writeInt64(cert.serial); - - var type = cert.subjects[0].type; - assert.notStrictEqual(type, 'unknown'); - cert.subjects.forEach(function (id) { - assert.strictEqual(id.type, type); - }); - type = TYPES[type]; - buf.writeInt(type); - - if (sig.keyId === undefined) { - sig.keyId = cert.subjects[0].type + '_' + - (cert.subjects[0].uid || cert.subjects[0].hostname); - } - buf.writeString(sig.keyId); - - var sub = new SSHBuffer({}); - cert.subjects.forEach(function (id) { - if (type === TYPES.host) - sub.writeString(id.hostname); - else if (type === TYPES.user) - sub.writeString(id.uid); - }); - buf.writeBuffer(sub.toBuffer()); - - buf.writeInt64(dateToInt64(cert.validFrom)); - buf.writeInt64(dateToInt64(cert.validUntil)); - - var exts = sig.exts; - if (exts === undefined) - exts = []; - - var extbuf = new SSHBuffer({}); - exts.forEach(function (ext) { - if (ext.critical !== true) - return; - extbuf.writeString(ext.name); - extbuf.writeBuffer(ext.data); - }); - buf.writeBuffer(extbuf.toBuffer()); - - extbuf = new SSHBuffer({}); - exts.forEach(function (ext) { - if (ext.critical === true) - return; - extbuf.writeString(ext.name); - extbuf.writeBuffer(ext.data); - }); - buf.writeBuffer(extbuf.toBuffer()); - - /* reserved */ - buf.writeBuffer(Buffer.alloc(0)); - - sub = rfc4253.write(cert.issuerKey); - buf.writeBuffer(sub); - - if (!noSig) - buf.writeBuffer(sig.signature.toBuffer('ssh')); - - return (buf.toBuffer()); -} - -function getAlg(certType) { - if (certType === 'ssh-rsa-cert-v01@openssh.com') - return ('rsa'); - if (certType === 'ssh-dss-cert-v01@openssh.com') - return ('dsa'); - if (certType.match(ECDSA_ALGO)) - return ('ecdsa'); - if (certType === 'ssh-ed25519-cert-v01@openssh.com') - return ('ed25519'); - throw (new Error('Unsupported cert type ' + certType)); -} - -function getCertType(key) { - if (key.type === 'rsa') - return ('ssh-rsa-cert-v01@openssh.com'); - if (key.type === 'dsa') - return ('ssh-dss-cert-v01@openssh.com'); - if (key.type === 'ecdsa') - return ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com'); - if (key.type === 'ed25519') - return ('ssh-ed25519-cert-v01@openssh.com'); - throw (new Error('Unsupported key type ' + key.type)); -} diff --git a/node_modules/sshpk/lib/formats/pem.js b/node_modules/sshpk/lib/formats/pem.js deleted file mode 100644 index bbe78fcb..00000000 --- a/node_modules/sshpk/lib/formats/pem.js +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = { - read: read, - write: write -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var crypto = require('crypto'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); - -var pkcs1 = require('./pkcs1'); -var pkcs8 = require('./pkcs8'); -var sshpriv = require('./ssh-private'); -var rfc4253 = require('./rfc4253'); - -var errors = require('../errors'); - -var OID_PBES2 = '1.2.840.113549.1.5.13'; -var OID_PBKDF2 = '1.2.840.113549.1.5.12'; - -var OID_TO_CIPHER = { - '1.2.840.113549.3.7': '3des-cbc', - '2.16.840.1.101.3.4.1.2': 'aes128-cbc', - '2.16.840.1.101.3.4.1.42': 'aes256-cbc' -}; -var CIPHER_TO_OID = {}; -Object.keys(OID_TO_CIPHER).forEach(function (k) { - CIPHER_TO_OID[OID_TO_CIPHER[k]] = k; -}); - -var OID_TO_HASH = { - '1.2.840.113549.2.7': 'sha1', - '1.2.840.113549.2.9': 'sha256', - '1.2.840.113549.2.11': 'sha512' -}; -var HASH_TO_OID = {}; -Object.keys(OID_TO_HASH).forEach(function (k) { - HASH_TO_OID[OID_TO_HASH[k]] = k; -}); - -/* - * For reading we support both PKCS#1 and PKCS#8. If we find a private key, - * we just take the public component of it and use that. - */ -function read(buf, options, forceType) { - var input = buf; - if (typeof (buf) !== 'string') { - assert.buffer(buf, 'buf'); - buf = buf.toString('ascii'); - } - - var lines = buf.trim().split(/[\r\n]+/g); - - var m; - var si = -1; - while (!m && si < lines.length) { - m = lines[++si].match(/*JSSTYLED*/ - /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); - } - assert.ok(m, 'invalid PEM header'); - - var m2; - var ei = lines.length; - while (!m2 && ei > 0) { - m2 = lines[--ei].match(/*JSSTYLED*/ - /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); - } - assert.ok(m2, 'invalid PEM footer'); - - /* Begin and end banners must match key type */ - assert.equal(m[2], m2[2]); - var type = m[2].toLowerCase(); - - var alg; - if (m[1]) { - /* They also must match algorithms, if given */ - assert.equal(m[1], m2[1], 'PEM header and footer mismatch'); - alg = m[1].trim(); - } - - lines = lines.slice(si, ei + 1); - - var headers = {}; - while (true) { - lines = lines.slice(1); - m = lines[0].match(/*JSSTYLED*/ - /^([A-Za-z0-9-]+): (.+)$/); - if (!m) - break; - headers[m[1].toLowerCase()] = m[2]; - } - - /* Chop off the first and last lines */ - lines = lines.slice(0, -1).join(''); - buf = Buffer.from(lines, 'base64'); - - var cipher, key, iv; - if (headers['proc-type']) { - var parts = headers['proc-type'].split(','); - if (parts[0] === '4' && parts[1] === 'ENCRYPTED') { - if (typeof (options.passphrase) === 'string') { - options.passphrase = Buffer.from( - options.passphrase, 'utf-8'); - } - if (!Buffer.isBuffer(options.passphrase)) { - throw (new errors.KeyEncryptedError( - options.filename, 'PEM')); - } else { - parts = headers['dek-info'].split(','); - assert.ok(parts.length === 2); - cipher = parts[0].toLowerCase(); - iv = Buffer.from(parts[1], 'hex'); - key = utils.opensslKeyDeriv(cipher, iv, - options.passphrase, 1).key; - } - } - } - - if (alg && alg.toLowerCase() === 'encrypted') { - var eder = new asn1.BerReader(buf); - var pbesEnd; - eder.readSequence(); - - eder.readSequence(); - pbesEnd = eder.offset + eder.length; - - var method = eder.readOID(); - if (method !== OID_PBES2) { - throw (new Error('Unsupported PEM/PKCS8 encryption ' + - 'scheme: ' + method)); - } - - eder.readSequence(); /* PBES2-params */ - - eder.readSequence(); /* keyDerivationFunc */ - var kdfEnd = eder.offset + eder.length; - var kdfOid = eder.readOID(); - if (kdfOid !== OID_PBKDF2) - throw (new Error('Unsupported PBES2 KDF: ' + kdfOid)); - eder.readSequence(); - var salt = eder.readString(asn1.Ber.OctetString, true); - var iterations = eder.readInt(); - var hashAlg = 'sha1'; - if (eder.offset < kdfEnd) { - eder.readSequence(); - var hashAlgOid = eder.readOID(); - hashAlg = OID_TO_HASH[hashAlgOid]; - if (hashAlg === undefined) { - throw (new Error('Unsupported PBKDF2 hash: ' + - hashAlgOid)); - } - } - eder._offset = kdfEnd; - - eder.readSequence(); /* encryptionScheme */ - var cipherOid = eder.readOID(); - cipher = OID_TO_CIPHER[cipherOid]; - if (cipher === undefined) { - throw (new Error('Unsupported PBES2 cipher: ' + - cipherOid)); - } - iv = eder.readString(asn1.Ber.OctetString, true); - - eder._offset = pbesEnd; - buf = eder.readString(asn1.Ber.OctetString, true); - - if (typeof (options.passphrase) === 'string') { - options.passphrase = Buffer.from( - options.passphrase, 'utf-8'); - } - if (!Buffer.isBuffer(options.passphrase)) { - throw (new errors.KeyEncryptedError( - options.filename, 'PEM')); - } - - var cinfo = utils.opensshCipherInfo(cipher); - - cipher = cinfo.opensslName; - key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, - options.passphrase); - alg = undefined; - } - - if (cipher && key && iv) { - var cipherStream = crypto.createDecipheriv(cipher, key, iv); - var chunk, chunks = []; - cipherStream.once('error', function (e) { - if (e.toString().indexOf('bad decrypt') !== -1) { - throw (new Error('Incorrect passphrase ' + - 'supplied, could not decrypt key')); - } - throw (e); - }); - cipherStream.write(buf); - cipherStream.end(); - while ((chunk = cipherStream.read()) !== null) - chunks.push(chunk); - buf = Buffer.concat(chunks); - } - - /* The new OpenSSH internal format abuses PEM headers */ - if (alg && alg.toLowerCase() === 'openssh') - return (sshpriv.readSSHPrivate(type, buf, options)); - if (alg && alg.toLowerCase() === 'ssh2') - return (rfc4253.readType(type, buf, options)); - - var der = new asn1.BerReader(buf); - der.originalInput = input; - - /* - * All of the PEM file types start with a sequence tag, so chop it - * off here - */ - der.readSequence(); - - /* PKCS#1 type keys name an algorithm in the banner explicitly */ - if (alg) { - if (forceType) - assert.strictEqual(forceType, 'pkcs1'); - return (pkcs1.readPkcs1(alg, type, der)); - } else { - if (forceType) - assert.strictEqual(forceType, 'pkcs8'); - return (pkcs8.readPkcs8(alg, type, der)); - } -} - -function write(key, options, type) { - assert.object(key); - - var alg = { - 'ecdsa': 'EC', - 'rsa': 'RSA', - 'dsa': 'DSA', - 'ed25519': 'EdDSA' - }[key.type]; - var header; - - var der = new asn1.BerWriter(); - - if (PrivateKey.isPrivateKey(key)) { - if (type && type === 'pkcs8') { - header = 'PRIVATE KEY'; - pkcs8.writePkcs8(der, key); - } else { - if (type) - assert.strictEqual(type, 'pkcs1'); - header = alg + ' PRIVATE KEY'; - pkcs1.writePkcs1(der, key); - } - - } else if (Key.isKey(key)) { - if (type && type === 'pkcs1') { - header = alg + ' PUBLIC KEY'; - pkcs1.writePkcs1(der, key); - } else { - if (type) - assert.strictEqual(type, 'pkcs8'); - header = 'PUBLIC KEY'; - pkcs8.writePkcs8(der, key); - } - - } else { - throw (new Error('key is not a Key or PrivateKey')); - } - - var tmp = der.buffer.toString('base64'); - var len = tmp.length + (tmp.length / 64) + - 18 + 16 + header.length*2 + 10; - var buf = Buffer.alloc(len); - var o = 0; - o += buf.write('-----BEGIN ' + header + '-----\n', o); - for (var i = 0; i < tmp.length; ) { - var limit = i + 64; - if (limit > tmp.length) - limit = tmp.length; - o += buf.write(tmp.slice(i, limit), o); - buf[o++] = 10; - i = limit; - } - o += buf.write('-----END ' + header + '-----\n', o); - - return (buf.slice(0, o)); -} diff --git a/node_modules/sshpk/lib/formats/pkcs1.js b/node_modules/sshpk/lib/formats/pkcs1.js deleted file mode 100644 index bc485500..00000000 --- a/node_modules/sshpk/lib/formats/pkcs1.js +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - read: read, - readPkcs1: readPkcs1, - write: write, - writePkcs1: writePkcs1 -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); - -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var pem = require('./pem'); - -var pkcs8 = require('./pkcs8'); -var readECDSACurve = pkcs8.readECDSACurve; - -function read(buf, options) { - return (pem.read(buf, options, 'pkcs1')); -} - -function write(key, options) { - return (pem.write(key, options, 'pkcs1')); -} - -/* Helper to read in a single mpint */ -function readMPInt(der, nm) { - assert.strictEqual(der.peek(), asn1.Ber.Integer, - nm + ' is not an Integer'); - return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); -} - -function readPkcs1(alg, type, der) { - switch (alg) { - case 'RSA': - if (type === 'public') - return (readPkcs1RSAPublic(der)); - else if (type === 'private') - return (readPkcs1RSAPrivate(der)); - throw (new Error('Unknown key type: ' + type)); - case 'DSA': - if (type === 'public') - return (readPkcs1DSAPublic(der)); - else if (type === 'private') - return (readPkcs1DSAPrivate(der)); - throw (new Error('Unknown key type: ' + type)); - case 'EC': - case 'ECDSA': - if (type === 'private') - return (readPkcs1ECDSAPrivate(der)); - else if (type === 'public') - return (readPkcs1ECDSAPublic(der)); - throw (new Error('Unknown key type: ' + type)); - case 'EDDSA': - case 'EdDSA': - if (type === 'private') - return (readPkcs1EdDSAPrivate(der)); - throw (new Error(type + ' keys not supported with EdDSA')); - default: - throw (new Error('Unknown key algo: ' + alg)); - } -} - -function readPkcs1RSAPublic(der) { - // modulus and exponent - var n = readMPInt(der, 'modulus'); - var e = readMPInt(der, 'exponent'); - - // now, make the key - var key = { - type: 'rsa', - parts: [ - { name: 'e', data: e }, - { name: 'n', data: n } - ] - }; - - return (new Key(key)); -} - -function readPkcs1RSAPrivate(der) { - var version = readMPInt(der, 'version'); - assert.strictEqual(version[0], 0); - - // modulus then public exponent - var n = readMPInt(der, 'modulus'); - var e = readMPInt(der, 'public exponent'); - var d = readMPInt(der, 'private exponent'); - var p = readMPInt(der, 'prime1'); - var q = readMPInt(der, 'prime2'); - var dmodp = readMPInt(der, 'exponent1'); - var dmodq = readMPInt(der, 'exponent2'); - var iqmp = readMPInt(der, 'iqmp'); - - // now, make the key - var key = { - type: 'rsa', - parts: [ - { name: 'n', data: n }, - { name: 'e', data: e }, - { name: 'd', data: d }, - { name: 'iqmp', data: iqmp }, - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'dmodp', data: dmodp }, - { name: 'dmodq', data: dmodq } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs1DSAPrivate(der) { - var version = readMPInt(der, 'version'); - assert.strictEqual(version.readUInt8(0), 0); - - var p = readMPInt(der, 'p'); - var q = readMPInt(der, 'q'); - var g = readMPInt(der, 'g'); - var y = readMPInt(der, 'y'); - var x = readMPInt(der, 'x'); - - // now, make the key - var key = { - type: 'dsa', - parts: [ - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'g', data: g }, - { name: 'y', data: y }, - { name: 'x', data: x } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs1EdDSAPrivate(der) { - var version = readMPInt(der, 'version'); - assert.strictEqual(version.readUInt8(0), 1); - - // private key - var k = der.readString(asn1.Ber.OctetString, true); - - der.readSequence(0xa0); - var oid = der.readOID(); - assert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier'); - - der.readSequence(0xa1); - var A = utils.readBitString(der); - - var key = { - type: 'ed25519', - parts: [ - { name: 'A', data: utils.zeroPadToLength(A, 32) }, - { name: 'k', data: k } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs1DSAPublic(der) { - var y = readMPInt(der, 'y'); - var p = readMPInt(der, 'p'); - var q = readMPInt(der, 'q'); - var g = readMPInt(der, 'g'); - - var key = { - type: 'dsa', - parts: [ - { name: 'y', data: y }, - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'g', data: g } - ] - }; - - return (new Key(key)); -} - -function readPkcs1ECDSAPublic(der) { - der.readSequence(); - - var oid = der.readOID(); - assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey'); - - var curveOid = der.readOID(); - - var curve; - var curves = Object.keys(algs.curves); - for (var j = 0; j < curves.length; ++j) { - var c = curves[j]; - var cd = algs.curves[c]; - if (cd.pkcs8oid === curveOid) { - curve = c; - break; - } - } - assert.string(curve, 'a known ECDSA named curve'); - - var Q = der.readString(asn1.Ber.BitString, true); - Q = utils.ecNormalize(Q); - - var key = { - type: 'ecdsa', - parts: [ - { name: 'curve', data: Buffer.from(curve) }, - { name: 'Q', data: Q } - ] - }; - - return (new Key(key)); -} - -function readPkcs1ECDSAPrivate(der) { - var version = readMPInt(der, 'version'); - assert.strictEqual(version.readUInt8(0), 1); - - // private key - var d = der.readString(asn1.Ber.OctetString, true); - - der.readSequence(0xa0); - var curve = readECDSACurve(der); - assert.string(curve, 'a known elliptic curve'); - - der.readSequence(0xa1); - var Q = der.readString(asn1.Ber.BitString, true); - Q = utils.ecNormalize(Q); - - var key = { - type: 'ecdsa', - parts: [ - { name: 'curve', data: Buffer.from(curve) }, - { name: 'Q', data: Q }, - { name: 'd', data: d } - ] - }; - - return (new PrivateKey(key)); -} - -function writePkcs1(der, key) { - der.startSequence(); - - switch (key.type) { - case 'rsa': - if (PrivateKey.isPrivateKey(key)) - writePkcs1RSAPrivate(der, key); - else - writePkcs1RSAPublic(der, key); - break; - case 'dsa': - if (PrivateKey.isPrivateKey(key)) - writePkcs1DSAPrivate(der, key); - else - writePkcs1DSAPublic(der, key); - break; - case 'ecdsa': - if (PrivateKey.isPrivateKey(key)) - writePkcs1ECDSAPrivate(der, key); - else - writePkcs1ECDSAPublic(der, key); - break; - case 'ed25519': - if (PrivateKey.isPrivateKey(key)) - writePkcs1EdDSAPrivate(der, key); - else - writePkcs1EdDSAPublic(der, key); - break; - default: - throw (new Error('Unknown key algo: ' + key.type)); - } - - der.endSequence(); -} - -function writePkcs1RSAPublic(der, key) { - der.writeBuffer(key.part.n.data, asn1.Ber.Integer); - der.writeBuffer(key.part.e.data, asn1.Ber.Integer); -} - -function writePkcs1RSAPrivate(der, key) { - var ver = Buffer.from([0]); - der.writeBuffer(ver, asn1.Ber.Integer); - - der.writeBuffer(key.part.n.data, asn1.Ber.Integer); - der.writeBuffer(key.part.e.data, asn1.Ber.Integer); - der.writeBuffer(key.part.d.data, asn1.Ber.Integer); - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - if (!key.part.dmodp || !key.part.dmodq) - utils.addRSAMissing(key); - der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); - der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); - der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); -} - -function writePkcs1DSAPrivate(der, key) { - var ver = Buffer.from([0]); - der.writeBuffer(ver, asn1.Ber.Integer); - - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - der.writeBuffer(key.part.g.data, asn1.Ber.Integer); - der.writeBuffer(key.part.y.data, asn1.Ber.Integer); - der.writeBuffer(key.part.x.data, asn1.Ber.Integer); -} - -function writePkcs1DSAPublic(der, key) { - der.writeBuffer(key.part.y.data, asn1.Ber.Integer); - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - der.writeBuffer(key.part.g.data, asn1.Ber.Integer); -} - -function writePkcs1ECDSAPublic(der, key) { - der.startSequence(); - - der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */ - var curve = key.part.curve.data.toString(); - var curveOid = algs.curves[curve].pkcs8oid; - assert.string(curveOid, 'a known ECDSA named curve'); - der.writeOID(curveOid); - - der.endSequence(); - - var Q = utils.ecNormalize(key.part.Q.data, true); - der.writeBuffer(Q, asn1.Ber.BitString); -} - -function writePkcs1ECDSAPrivate(der, key) { - var ver = Buffer.from([1]); - der.writeBuffer(ver, asn1.Ber.Integer); - - der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); - - der.startSequence(0xa0); - var curve = key.part.curve.data.toString(); - var curveOid = algs.curves[curve].pkcs8oid; - assert.string(curveOid, 'a known ECDSA named curve'); - der.writeOID(curveOid); - der.endSequence(); - - der.startSequence(0xa1); - var Q = utils.ecNormalize(key.part.Q.data, true); - der.writeBuffer(Q, asn1.Ber.BitString); - der.endSequence(); -} - -function writePkcs1EdDSAPrivate(der, key) { - var ver = Buffer.from([1]); - der.writeBuffer(ver, asn1.Ber.Integer); - - der.writeBuffer(key.part.k.data, asn1.Ber.OctetString); - - der.startSequence(0xa0); - der.writeOID('1.3.101.112'); - der.endSequence(); - - der.startSequence(0xa1); - utils.writeBitString(der, key.part.A.data); - der.endSequence(); -} - -function writePkcs1EdDSAPublic(der, key) { - throw (new Error('Public keys are not supported for EdDSA PKCS#1')); -} diff --git a/node_modules/sshpk/lib/formats/pkcs8.js b/node_modules/sshpk/lib/formats/pkcs8.js deleted file mode 100644 index 2ca3ca7a..00000000 --- a/node_modules/sshpk/lib/formats/pkcs8.js +++ /dev/null @@ -1,631 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = { - read: read, - readPkcs8: readPkcs8, - write: write, - writePkcs8: writePkcs8, - pkcs8ToBuffer: pkcs8ToBuffer, - - readECDSACurve: readECDSACurve, - writeECDSACurve: writeECDSACurve -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var pem = require('./pem'); - -function read(buf, options) { - return (pem.read(buf, options, 'pkcs8')); -} - -function write(key, options) { - return (pem.write(key, options, 'pkcs8')); -} - -/* Helper to read in a single mpint */ -function readMPInt(der, nm) { - assert.strictEqual(der.peek(), asn1.Ber.Integer, - nm + ' is not an Integer'); - return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); -} - -function readPkcs8(alg, type, der) { - /* Private keys in pkcs#8 format have a weird extra int */ - if (der.peek() === asn1.Ber.Integer) { - assert.strictEqual(type, 'private', - 'unexpected Integer at start of public key'); - der.readString(asn1.Ber.Integer, true); - } - - der.readSequence(); - var next = der.offset + der.length; - - var oid = der.readOID(); - switch (oid) { - case '1.2.840.113549.1.1.1': - der._offset = next; - if (type === 'public') - return (readPkcs8RSAPublic(der)); - else - return (readPkcs8RSAPrivate(der)); - case '1.2.840.10040.4.1': - if (type === 'public') - return (readPkcs8DSAPublic(der)); - else - return (readPkcs8DSAPrivate(der)); - case '1.2.840.10045.2.1': - if (type === 'public') - return (readPkcs8ECDSAPublic(der)); - else - return (readPkcs8ECDSAPrivate(der)); - case '1.3.101.112': - if (type === 'public') { - return (readPkcs8EdDSAPublic(der)); - } else { - return (readPkcs8EdDSAPrivate(der)); - } - case '1.3.101.110': - if (type === 'public') { - return (readPkcs8X25519Public(der)); - } else { - return (readPkcs8X25519Private(der)); - } - default: - throw (new Error('Unknown key type OID ' + oid)); - } -} - -function readPkcs8RSAPublic(der) { - // bit string sequence - der.readSequence(asn1.Ber.BitString); - der.readByte(); - der.readSequence(); - - // modulus - var n = readMPInt(der, 'modulus'); - var e = readMPInt(der, 'exponent'); - - // now, make the key - var key = { - type: 'rsa', - source: der.originalInput, - parts: [ - { name: 'e', data: e }, - { name: 'n', data: n } - ] - }; - - return (new Key(key)); -} - -function readPkcs8RSAPrivate(der) { - der.readSequence(asn1.Ber.OctetString); - der.readSequence(); - - var ver = readMPInt(der, 'version'); - assert.equal(ver[0], 0x0, 'unknown RSA private key version'); - - // modulus then public exponent - var n = readMPInt(der, 'modulus'); - var e = readMPInt(der, 'public exponent'); - var d = readMPInt(der, 'private exponent'); - var p = readMPInt(der, 'prime1'); - var q = readMPInt(der, 'prime2'); - var dmodp = readMPInt(der, 'exponent1'); - var dmodq = readMPInt(der, 'exponent2'); - var iqmp = readMPInt(der, 'iqmp'); - - // now, make the key - var key = { - type: 'rsa', - parts: [ - { name: 'n', data: n }, - { name: 'e', data: e }, - { name: 'd', data: d }, - { name: 'iqmp', data: iqmp }, - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'dmodp', data: dmodp }, - { name: 'dmodq', data: dmodq } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs8DSAPublic(der) { - der.readSequence(); - - var p = readMPInt(der, 'p'); - var q = readMPInt(der, 'q'); - var g = readMPInt(der, 'g'); - - // bit string sequence - der.readSequence(asn1.Ber.BitString); - der.readByte(); - - var y = readMPInt(der, 'y'); - - // now, make the key - var key = { - type: 'dsa', - parts: [ - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'g', data: g }, - { name: 'y', data: y } - ] - }; - - return (new Key(key)); -} - -function readPkcs8DSAPrivate(der) { - der.readSequence(); - - var p = readMPInt(der, 'p'); - var q = readMPInt(der, 'q'); - var g = readMPInt(der, 'g'); - - der.readSequence(asn1.Ber.OctetString); - var x = readMPInt(der, 'x'); - - /* The pkcs#8 format does not include the public key */ - var y = utils.calculateDSAPublic(g, p, x); - - var key = { - type: 'dsa', - parts: [ - { name: 'p', data: p }, - { name: 'q', data: q }, - { name: 'g', data: g }, - { name: 'y', data: y }, - { name: 'x', data: x } - ] - }; - - return (new PrivateKey(key)); -} - -function readECDSACurve(der) { - var curveName, curveNames; - var j, c, cd; - - if (der.peek() === asn1.Ber.OID) { - var oid = der.readOID(); - - curveNames = Object.keys(algs.curves); - for (j = 0; j < curveNames.length; ++j) { - c = curveNames[j]; - cd = algs.curves[c]; - if (cd.pkcs8oid === oid) { - curveName = c; - break; - } - } - - } else { - // ECParameters sequence - der.readSequence(); - var version = der.readString(asn1.Ber.Integer, true); - assert.strictEqual(version[0], 1, 'ECDSA key not version 1'); - - var curve = {}; - - // FieldID sequence - der.readSequence(); - var fieldTypeOid = der.readOID(); - assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1', - 'ECDSA key is not from a prime-field'); - var p = curve.p = utils.mpNormalize( - der.readString(asn1.Ber.Integer, true)); - /* - * p always starts with a 1 bit, so count the zeros to get its - * real size. - */ - curve.size = p.length * 8 - utils.countZeros(p); - - // Curve sequence - der.readSequence(); - curve.a = utils.mpNormalize( - der.readString(asn1.Ber.OctetString, true)); - curve.b = utils.mpNormalize( - der.readString(asn1.Ber.OctetString, true)); - if (der.peek() === asn1.Ber.BitString) - curve.s = der.readString(asn1.Ber.BitString, true); - - // Combined Gx and Gy - curve.G = der.readString(asn1.Ber.OctetString, true); - assert.strictEqual(curve.G[0], 0x4, - 'uncompressed G is required'); - - curve.n = utils.mpNormalize( - der.readString(asn1.Ber.Integer, true)); - curve.h = utils.mpNormalize( - der.readString(asn1.Ber.Integer, true)); - assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' + - 'required'); - - curveNames = Object.keys(algs.curves); - var ks = Object.keys(curve); - for (j = 0; j < curveNames.length; ++j) { - c = curveNames[j]; - cd = algs.curves[c]; - var equal = true; - for (var i = 0; i < ks.length; ++i) { - var k = ks[i]; - if (cd[k] === undefined) - continue; - if (typeof (cd[k]) === 'object' && - cd[k].equals !== undefined) { - if (!cd[k].equals(curve[k])) { - equal = false; - break; - } - } else if (Buffer.isBuffer(cd[k])) { - if (cd[k].toString('binary') - !== curve[k].toString('binary')) { - equal = false; - break; - } - } else { - if (cd[k] !== curve[k]) { - equal = false; - break; - } - } - } - if (equal) { - curveName = c; - break; - } - } - } - return (curveName); -} - -function readPkcs8ECDSAPrivate(der) { - var curveName = readECDSACurve(der); - assert.string(curveName, 'a known elliptic curve'); - - der.readSequence(asn1.Ber.OctetString); - der.readSequence(); - - var version = readMPInt(der, 'version'); - assert.equal(version[0], 1, 'unknown version of ECDSA key'); - - var d = der.readString(asn1.Ber.OctetString, true); - var Q; - - if (der.peek() == 0xa0) { - der.readSequence(0xa0); - der._offset += der.length; - } - if (der.peek() == 0xa1) { - der.readSequence(0xa1); - Q = der.readString(asn1.Ber.BitString, true); - Q = utils.ecNormalize(Q); - } - - if (Q === undefined) { - var pub = utils.publicFromPrivateECDSA(curveName, d); - Q = pub.part.Q.data; - } - - var key = { - type: 'ecdsa', - parts: [ - { name: 'curve', data: Buffer.from(curveName) }, - { name: 'Q', data: Q }, - { name: 'd', data: d } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs8ECDSAPublic(der) { - var curveName = readECDSACurve(der); - assert.string(curveName, 'a known elliptic curve'); - - var Q = der.readString(asn1.Ber.BitString, true); - Q = utils.ecNormalize(Q); - - var key = { - type: 'ecdsa', - parts: [ - { name: 'curve', data: Buffer.from(curveName) }, - { name: 'Q', data: Q } - ] - }; - - return (new Key(key)); -} - -function readPkcs8EdDSAPublic(der) { - if (der.peek() === 0x00) - der.readByte(); - - var A = utils.readBitString(der); - - var key = { - type: 'ed25519', - parts: [ - { name: 'A', data: utils.zeroPadToLength(A, 32) } - ] - }; - - return (new Key(key)); -} - -function readPkcs8X25519Public(der) { - var A = utils.readBitString(der); - - var key = { - type: 'curve25519', - parts: [ - { name: 'A', data: utils.zeroPadToLength(A, 32) } - ] - }; - - return (new Key(key)); -} - -function readPkcs8EdDSAPrivate(der) { - if (der.peek() === 0x00) - der.readByte(); - - der.readSequence(asn1.Ber.OctetString); - var k = der.readString(asn1.Ber.OctetString, true); - k = utils.zeroPadToLength(k, 32); - - var A; - if (der.peek() === asn1.Ber.BitString) { - A = utils.readBitString(der); - A = utils.zeroPadToLength(A, 32); - } else { - A = utils.calculateED25519Public(k); - } - - var key = { - type: 'ed25519', - parts: [ - { name: 'A', data: utils.zeroPadToLength(A, 32) }, - { name: 'k', data: utils.zeroPadToLength(k, 32) } - ] - }; - - return (new PrivateKey(key)); -} - -function readPkcs8X25519Private(der) { - if (der.peek() === 0x00) - der.readByte(); - - der.readSequence(asn1.Ber.OctetString); - var k = der.readString(asn1.Ber.OctetString, true); - k = utils.zeroPadToLength(k, 32); - - var A = utils.calculateX25519Public(k); - - var key = { - type: 'curve25519', - parts: [ - { name: 'A', data: utils.zeroPadToLength(A, 32) }, - { name: 'k', data: utils.zeroPadToLength(k, 32) } - ] - }; - - return (new PrivateKey(key)); -} - -function pkcs8ToBuffer(key) { - var der = new asn1.BerWriter(); - writePkcs8(der, key); - return (der.buffer); -} - -function writePkcs8(der, key) { - der.startSequence(); - - if (PrivateKey.isPrivateKey(key)) { - var sillyInt = Buffer.from([0]); - der.writeBuffer(sillyInt, asn1.Ber.Integer); - } - - der.startSequence(); - switch (key.type) { - case 'rsa': - der.writeOID('1.2.840.113549.1.1.1'); - if (PrivateKey.isPrivateKey(key)) - writePkcs8RSAPrivate(key, der); - else - writePkcs8RSAPublic(key, der); - break; - case 'dsa': - der.writeOID('1.2.840.10040.4.1'); - if (PrivateKey.isPrivateKey(key)) - writePkcs8DSAPrivate(key, der); - else - writePkcs8DSAPublic(key, der); - break; - case 'ecdsa': - der.writeOID('1.2.840.10045.2.1'); - if (PrivateKey.isPrivateKey(key)) - writePkcs8ECDSAPrivate(key, der); - else - writePkcs8ECDSAPublic(key, der); - break; - case 'ed25519': - der.writeOID('1.3.101.112'); - if (PrivateKey.isPrivateKey(key)) - throw (new Error('Ed25519 private keys in pkcs8 ' + - 'format are not supported')); - writePkcs8EdDSAPublic(key, der); - break; - default: - throw (new Error('Unsupported key type: ' + key.type)); - } - - der.endSequence(); -} - -function writePkcs8RSAPrivate(key, der) { - der.writeNull(); - der.endSequence(); - - der.startSequence(asn1.Ber.OctetString); - der.startSequence(); - - var version = Buffer.from([0]); - der.writeBuffer(version, asn1.Ber.Integer); - - der.writeBuffer(key.part.n.data, asn1.Ber.Integer); - der.writeBuffer(key.part.e.data, asn1.Ber.Integer); - der.writeBuffer(key.part.d.data, asn1.Ber.Integer); - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - if (!key.part.dmodp || !key.part.dmodq) - utils.addRSAMissing(key); - der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); - der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); - der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); - - der.endSequence(); - der.endSequence(); -} - -function writePkcs8RSAPublic(key, der) { - der.writeNull(); - der.endSequence(); - - der.startSequence(asn1.Ber.BitString); - der.writeByte(0x00); - - der.startSequence(); - der.writeBuffer(key.part.n.data, asn1.Ber.Integer); - der.writeBuffer(key.part.e.data, asn1.Ber.Integer); - der.endSequence(); - - der.endSequence(); -} - -function writePkcs8DSAPrivate(key, der) { - der.startSequence(); - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - der.writeBuffer(key.part.g.data, asn1.Ber.Integer); - der.endSequence(); - - der.endSequence(); - - der.startSequence(asn1.Ber.OctetString); - der.writeBuffer(key.part.x.data, asn1.Ber.Integer); - der.endSequence(); -} - -function writePkcs8DSAPublic(key, der) { - der.startSequence(); - der.writeBuffer(key.part.p.data, asn1.Ber.Integer); - der.writeBuffer(key.part.q.data, asn1.Ber.Integer); - der.writeBuffer(key.part.g.data, asn1.Ber.Integer); - der.endSequence(); - der.endSequence(); - - der.startSequence(asn1.Ber.BitString); - der.writeByte(0x00); - der.writeBuffer(key.part.y.data, asn1.Ber.Integer); - der.endSequence(); -} - -function writeECDSACurve(key, der) { - var curve = algs.curves[key.curve]; - if (curve.pkcs8oid) { - /* This one has a name in pkcs#8, so just write the oid */ - der.writeOID(curve.pkcs8oid); - - } else { - // ECParameters sequence - der.startSequence(); - - var version = Buffer.from([1]); - der.writeBuffer(version, asn1.Ber.Integer); - - // FieldID sequence - der.startSequence(); - der.writeOID('1.2.840.10045.1.1'); // prime-field - der.writeBuffer(curve.p, asn1.Ber.Integer); - der.endSequence(); - - // Curve sequence - der.startSequence(); - var a = curve.p; - if (a[0] === 0x0) - a = a.slice(1); - der.writeBuffer(a, asn1.Ber.OctetString); - der.writeBuffer(curve.b, asn1.Ber.OctetString); - der.writeBuffer(curve.s, asn1.Ber.BitString); - der.endSequence(); - - der.writeBuffer(curve.G, asn1.Ber.OctetString); - der.writeBuffer(curve.n, asn1.Ber.Integer); - var h = curve.h; - if (!h) { - h = Buffer.from([1]); - } - der.writeBuffer(h, asn1.Ber.Integer); - - // ECParameters - der.endSequence(); - } -} - -function writePkcs8ECDSAPublic(key, der) { - writeECDSACurve(key, der); - der.endSequence(); - - var Q = utils.ecNormalize(key.part.Q.data, true); - der.writeBuffer(Q, asn1.Ber.BitString); -} - -function writePkcs8ECDSAPrivate(key, der) { - writeECDSACurve(key, der); - der.endSequence(); - - der.startSequence(asn1.Ber.OctetString); - der.startSequence(); - - var version = Buffer.from([1]); - der.writeBuffer(version, asn1.Ber.Integer); - - der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); - - der.startSequence(0xa1); - var Q = utils.ecNormalize(key.part.Q.data, true); - der.writeBuffer(Q, asn1.Ber.BitString); - der.endSequence(); - - der.endSequence(); - der.endSequence(); -} - -function writePkcs8EdDSAPublic(key, der) { - der.endSequence(); - - utils.writeBitString(der, key.part.A.data); -} - -function writePkcs8EdDSAPrivate(key, der) { - der.endSequence(); - - var k = utils.mpNormalize(key.part.k.data, true); - der.startSequence(asn1.Ber.OctetString); - der.writeBuffer(k, asn1.Ber.OctetString); - der.endSequence(); -} diff --git a/node_modules/sshpk/lib/formats/putty.js b/node_modules/sshpk/lib/formats/putty.js deleted file mode 100644 index e7b2add3..00000000 --- a/node_modules/sshpk/lib/formats/putty.js +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = { - read: read, - write: write -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var rfc4253 = require('./rfc4253'); -var Key = require('../key'); -var SSHBuffer = require('../ssh-buffer'); -var crypto = require('crypto'); -var PrivateKey = require('../private-key'); - -var errors = require('../errors'); - -// https://tartarus.org/~simon/putty-prerel-snapshots/htmldoc/AppendixC.html -function read(buf, options) { - var lines = buf.toString('ascii').split(/[\r\n]+/); - var found = false; - var parts; - var si = 0; - var formatVersion; - while (si < lines.length) { - parts = splitHeader(lines[si++]); - if (parts) { - formatVersion = { - 'putty-user-key-file-2': 2, - 'putty-user-key-file-3': 3 - }[parts[0].toLowerCase()]; - if (formatVersion) { - found = true; - break; - } - } - } - if (!found) { - throw (new Error('No PuTTY format first line found')); - } - var alg = parts[1]; - - parts = splitHeader(lines[si++]); - assert.equal(parts[0].toLowerCase(), 'encryption'); - var encryption = parts[1]; - - parts = splitHeader(lines[si++]); - assert.equal(parts[0].toLowerCase(), 'comment'); - var comment = parts[1]; - - parts = splitHeader(lines[si++]); - assert.equal(parts[0].toLowerCase(), 'public-lines'); - var publicLines = parseInt(parts[1], 10); - if (!isFinite(publicLines) || publicLines < 0 || - publicLines > lines.length) { - throw (new Error('Invalid public-lines count')); - } - - var publicBuf = Buffer.from( - lines.slice(si, si + publicLines).join(''), 'base64'); - var keyType = rfc4253.algToKeyType(alg); - var key = rfc4253.read(publicBuf); - if (key.type !== keyType) { - throw (new Error('Outer key algorithm mismatch')); - } - - si += publicLines; - if (lines[si]) { - parts = splitHeader(lines[si++]); - assert.equal(parts[0].toLowerCase(), 'private-lines'); - var privateLines = parseInt(parts[1], 10); - if (!isFinite(privateLines) || privateLines < 0 || - privateLines > lines.length) { - throw (new Error('Invalid private-lines count')); - } - - var privateBuf = Buffer.from( - lines.slice(si, si + privateLines).join(''), 'base64'); - - if (encryption !== 'none' && formatVersion === 3) { - throw new Error('Encrypted keys arenot supported for' + - ' PuTTY format version 3'); - } - - if (encryption === 'aes256-cbc') { - if (!options.passphrase) { - throw (new errors.KeyEncryptedError( - options.filename, 'PEM')); - } - - var iv = Buffer.alloc(16, 0); - var decipher = crypto.createDecipheriv( - 'aes-256-cbc', - derivePPK2EncryptionKey(options.passphrase), - iv); - decipher.setAutoPadding(false); - privateBuf = Buffer.concat([ - decipher.update(privateBuf), decipher.final()]); - } - - key = new PrivateKey(key); - if (key.type !== keyType) { - throw (new Error('Outer key algorithm mismatch')); - } - - var sshbuf = new SSHBuffer({buffer: privateBuf}); - var privateKeyParts; - if (alg === 'ssh-dss') { - privateKeyParts = [ { - name: 'x', - data: sshbuf.readBuffer() - }]; - } else if (alg === 'ssh-rsa') { - privateKeyParts = [ - { name: 'd', data: sshbuf.readBuffer() }, - { name: 'p', data: sshbuf.readBuffer() }, - { name: 'q', data: sshbuf.readBuffer() }, - { name: 'iqmp', data: sshbuf.readBuffer() } - ]; - } else if (alg.match(/^ecdsa-sha2-nistp/)) { - privateKeyParts = [ { - name: 'd', data: sshbuf.readBuffer() - } ]; - } else if (alg === 'ssh-ed25519') { - privateKeyParts = [ { - name: 'k', data: sshbuf.readBuffer() - } ]; - } else { - throw new Error('Unsupported PPK key type: ' + alg); - } - - key = new PrivateKey({ - type: key.type, - parts: key.parts.concat(privateKeyParts) - }); - } - - key.comment = comment; - return (key); -} - -function derivePPK2EncryptionKey(passphrase) { - var hash1 = crypto.createHash('sha1').update(Buffer.concat([ - Buffer.from([0, 0, 0, 0]), - Buffer.from(passphrase) - ])).digest(); - var hash2 = crypto.createHash('sha1').update(Buffer.concat([ - Buffer.from([0, 0, 0, 1]), - Buffer.from(passphrase) - ])).digest(); - return (Buffer.concat([hash1, hash2]).slice(0, 32)); -} - -function splitHeader(line) { - var idx = line.indexOf(':'); - if (idx === -1) - return (null); - var header = line.slice(0, idx); - ++idx; - while (line[idx] === ' ') - ++idx; - var rest = line.slice(idx); - return ([header, rest]); -} - -function write(key, options) { - assert.object(key); - if (!Key.isKey(key)) - throw (new Error('Must be a public key')); - - var alg = rfc4253.keyTypeToAlg(key); - var buf = rfc4253.write(key); - var comment = key.comment || ''; - - var b64 = buf.toString('base64'); - var lines = wrap(b64, 64); - - lines.unshift('Public-Lines: ' + lines.length); - lines.unshift('Comment: ' + comment); - lines.unshift('Encryption: none'); - lines.unshift('PuTTY-User-Key-File-2: ' + alg); - - return (Buffer.from(lines.join('\n') + '\n')); -} - -function wrap(txt, len) { - var lines = []; - var pos = 0; - while (pos < txt.length) { - lines.push(txt.slice(pos, pos + 64)); - pos += 64; - } - return (lines); -} diff --git a/node_modules/sshpk/lib/formats/rfc4253.js b/node_modules/sshpk/lib/formats/rfc4253.js deleted file mode 100644 index 52fddcb6..00000000 --- a/node_modules/sshpk/lib/formats/rfc4253.js +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - read: read.bind(undefined, false, undefined), - readType: read.bind(undefined, false), - write: write, - /* semi-private api, used by sshpk-agent */ - readPartial: read.bind(undefined, true), - - /* shared with ssh format */ - readInternal: read, - keyTypeToAlg: keyTypeToAlg, - algToKeyType: algToKeyType -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var SSHBuffer = require('../ssh-buffer'); - -function algToKeyType(alg) { - assert.string(alg); - if (alg === 'ssh-dss') - return ('dsa'); - else if (alg === 'ssh-rsa') - return ('rsa'); - else if (alg === 'ssh-ed25519') - return ('ed25519'); - else if (alg === 'ssh-curve25519') - return ('curve25519'); - else if (alg.match(/^ecdsa-sha2-/)) - return ('ecdsa'); - else - throw (new Error('Unknown algorithm ' + alg)); -} - -function keyTypeToAlg(key) { - assert.object(key); - if (key.type === 'dsa') - return ('ssh-dss'); - else if (key.type === 'rsa') - return ('ssh-rsa'); - else if (key.type === 'ed25519') - return ('ssh-ed25519'); - else if (key.type === 'curve25519') - return ('ssh-curve25519'); - else if (key.type === 'ecdsa') - return ('ecdsa-sha2-' + key.part.curve.data.toString()); - else - throw (new Error('Unknown key type ' + key.type)); -} - -function read(partial, type, buf, options) { - if (typeof (buf) === 'string') - buf = Buffer.from(buf); - assert.buffer(buf, 'buf'); - - var key = {}; - - var parts = key.parts = []; - var sshbuf = new SSHBuffer({buffer: buf}); - - var alg = sshbuf.readString(); - assert.ok(!sshbuf.atEnd(), 'key must have at least one part'); - - key.type = algToKeyType(alg); - - var partCount = algs.info[key.type].parts.length; - if (type && type === 'private') - partCount = algs.privInfo[key.type].parts.length; - - while (!sshbuf.atEnd() && parts.length < partCount) - parts.push(sshbuf.readPart()); - while (!partial && !sshbuf.atEnd()) - parts.push(sshbuf.readPart()); - - assert.ok(parts.length >= 1, - 'key must have at least one part'); - assert.ok(partial || sshbuf.atEnd(), - 'leftover bytes at end of key'); - - var Constructor = Key; - var algInfo = algs.info[key.type]; - if (type === 'private' || algInfo.parts.length !== parts.length) { - algInfo = algs.privInfo[key.type]; - Constructor = PrivateKey; - } - assert.strictEqual(algInfo.parts.length, parts.length); - - if (key.type === 'ecdsa') { - var res = /^ecdsa-sha2-(.+)$/.exec(alg); - assert.ok(res !== null); - assert.strictEqual(res[1], parts[0].data.toString()); - } - - var normalized = true; - for (var i = 0; i < algInfo.parts.length; ++i) { - var p = parts[i]; - p.name = algInfo.parts[i]; - /* - * OpenSSH stores ed25519 "private" keys as seed + public key - * concat'd together (k followed by A). We want to keep them - * separate for other formats that don't do this. - */ - if (key.type === 'ed25519' && p.name === 'k') - p.data = p.data.slice(0, 32); - - if (p.name !== 'curve' && algInfo.normalize !== false) { - var nd; - if (key.type === 'ed25519') { - nd = utils.zeroPadToLength(p.data, 32); - } else { - nd = utils.mpNormalize(p.data); - } - if (nd.toString('binary') !== - p.data.toString('binary')) { - p.data = nd; - normalized = false; - } - } - } - - if (normalized) - key._rfc4253Cache = sshbuf.toBuffer(); - - if (partial && typeof (partial) === 'object') { - partial.remainder = sshbuf.remainder(); - partial.consumed = sshbuf._offset; - } - - return (new Constructor(key)); -} - -function write(key, options) { - assert.object(key); - - var alg = keyTypeToAlg(key); - var i; - - var algInfo = algs.info[key.type]; - if (PrivateKey.isPrivateKey(key)) - algInfo = algs.privInfo[key.type]; - var parts = algInfo.parts; - - var buf = new SSHBuffer({}); - - buf.writeString(alg); - - for (i = 0; i < parts.length; ++i) { - var data = key.part[parts[i]].data; - if (algInfo.normalize !== false) { - if (key.type === 'ed25519') - data = utils.zeroPadToLength(data, 32); - else - data = utils.mpNormalize(data); - } - if (key.type === 'ed25519' && parts[i] === 'k') - data = Buffer.concat([data, key.part.A.data]); - buf.writeBuffer(data); - } - - return (buf.toBuffer()); -} diff --git a/node_modules/sshpk/lib/formats/ssh-private.js b/node_modules/sshpk/lib/formats/ssh-private.js deleted file mode 100644 index 5e7eed88..00000000 --- a/node_modules/sshpk/lib/formats/ssh-private.js +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - read: read, - readSSHPrivate: readSSHPrivate, - write: write -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var crypto = require('crypto'); - -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var pem = require('./pem'); -var rfc4253 = require('./rfc4253'); -var SSHBuffer = require('../ssh-buffer'); -var errors = require('../errors'); - -var bcrypt; - -function read(buf, options) { - return (pem.read(buf, options)); -} - -var MAGIC = 'openssh-key-v1'; - -function readSSHPrivate(type, buf, options) { - buf = new SSHBuffer({buffer: buf}); - - var magic = buf.readCString(); - assert.strictEqual(magic, MAGIC, 'bad magic string'); - - var cipher = buf.readString(); - var kdf = buf.readString(); - var kdfOpts = buf.readBuffer(); - - var nkeys = buf.readInt(); - if (nkeys !== 1) { - throw (new Error('OpenSSH-format key file contains ' + - 'multiple keys: this is unsupported.')); - } - - var pubKey = buf.readBuffer(); - - if (type === 'public') { - assert.ok(buf.atEnd(), 'excess bytes left after key'); - return (rfc4253.read(pubKey)); - } - - var privKeyBlob = buf.readBuffer(); - assert.ok(buf.atEnd(), 'excess bytes left after key'); - - var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); - switch (kdf) { - case 'none': - if (cipher !== 'none') { - throw (new Error('OpenSSH-format key uses KDF "none" ' + - 'but specifies a cipher other than "none"')); - } - break; - case 'bcrypt': - var salt = kdfOptsBuf.readBuffer(); - var rounds = kdfOptsBuf.readInt(); - var cinf = utils.opensshCipherInfo(cipher); - if (bcrypt === undefined) { - bcrypt = require('bcrypt-pbkdf'); - } - - if (typeof (options.passphrase) === 'string') { - options.passphrase = Buffer.from(options.passphrase, - 'utf-8'); - } - if (!Buffer.isBuffer(options.passphrase)) { - throw (new errors.KeyEncryptedError( - options.filename, 'OpenSSH')); - } - - var pass = new Uint8Array(options.passphrase); - var salti = new Uint8Array(salt); - /* Use the pbkdf to derive both the key and the IV. */ - var out = new Uint8Array(cinf.keySize + cinf.blockSize); - var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, - out, out.length, rounds); - if (res !== 0) { - throw (new Error('bcrypt_pbkdf function returned ' + - 'failure, parameters invalid')); - } - out = Buffer.from(out); - var ckey = out.slice(0, cinf.keySize); - var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); - var cipherStream = crypto.createDecipheriv(cinf.opensslName, - ckey, iv); - cipherStream.setAutoPadding(false); - var chunk, chunks = []; - cipherStream.once('error', function (e) { - if (e.toString().indexOf('bad decrypt') !== -1) { - throw (new Error('Incorrect passphrase ' + - 'supplied, could not decrypt key')); - } - throw (e); - }); - cipherStream.write(privKeyBlob); - cipherStream.end(); - while ((chunk = cipherStream.read()) !== null) - chunks.push(chunk); - privKeyBlob = Buffer.concat(chunks); - break; - default: - throw (new Error( - 'OpenSSH-format key uses unknown KDF "' + kdf + '"')); - } - - buf = new SSHBuffer({buffer: privKeyBlob}); - - var checkInt1 = buf.readInt(); - var checkInt2 = buf.readInt(); - if (checkInt1 !== checkInt2) { - throw (new Error('Incorrect passphrase supplied, could not ' + - 'decrypt key')); - } - - var ret = {}; - var key = rfc4253.readInternal(ret, 'private', buf.remainder()); - - buf.skip(ret.consumed); - - var comment = buf.readString(); - key.comment = comment; - - return (key); -} - -function write(key, options) { - var pubKey; - if (PrivateKey.isPrivateKey(key)) - pubKey = key.toPublic(); - else - pubKey = key; - - var cipher = 'none'; - var kdf = 'none'; - var kdfopts = Buffer.alloc(0); - var cinf = { blockSize: 8 }; - var passphrase; - if (options !== undefined) { - passphrase = options.passphrase; - if (typeof (passphrase) === 'string') - passphrase = Buffer.from(passphrase, 'utf-8'); - if (passphrase !== undefined) { - assert.buffer(passphrase, 'options.passphrase'); - assert.optionalString(options.cipher, 'options.cipher'); - cipher = options.cipher; - if (cipher === undefined) - cipher = 'aes128-ctr'; - cinf = utils.opensshCipherInfo(cipher); - kdf = 'bcrypt'; - } - } - - var privBuf; - if (PrivateKey.isPrivateKey(key)) { - privBuf = new SSHBuffer({}); - var checkInt = crypto.randomBytes(4).readUInt32BE(0); - privBuf.writeInt(checkInt); - privBuf.writeInt(checkInt); - privBuf.write(key.toBuffer('rfc4253')); - privBuf.writeString(key.comment || ''); - - var n = 1; - while (privBuf._offset % cinf.blockSize !== 0) - privBuf.writeChar(n++); - privBuf = privBuf.toBuffer(); - } - - switch (kdf) { - case 'none': - break; - case 'bcrypt': - var salt = crypto.randomBytes(16); - var rounds = 16; - var kdfssh = new SSHBuffer({}); - kdfssh.writeBuffer(salt); - kdfssh.writeInt(rounds); - kdfopts = kdfssh.toBuffer(); - - if (bcrypt === undefined) { - bcrypt = require('bcrypt-pbkdf'); - } - var pass = new Uint8Array(passphrase); - var salti = new Uint8Array(salt); - /* Use the pbkdf to derive both the key and the IV. */ - var out = new Uint8Array(cinf.keySize + cinf.blockSize); - var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, - out, out.length, rounds); - if (res !== 0) { - throw (new Error('bcrypt_pbkdf function returned ' + - 'failure, parameters invalid')); - } - out = Buffer.from(out); - var ckey = out.slice(0, cinf.keySize); - var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); - - var cipherStream = crypto.createCipheriv(cinf.opensslName, - ckey, iv); - cipherStream.setAutoPadding(false); - var chunk, chunks = []; - cipherStream.once('error', function (e) { - throw (e); - }); - cipherStream.write(privBuf); - cipherStream.end(); - while ((chunk = cipherStream.read()) !== null) - chunks.push(chunk); - privBuf = Buffer.concat(chunks); - break; - default: - throw (new Error('Unsupported kdf ' + kdf)); - } - - var buf = new SSHBuffer({}); - - buf.writeCString(MAGIC); - buf.writeString(cipher); /* cipher */ - buf.writeString(kdf); /* kdf */ - buf.writeBuffer(kdfopts); /* kdfoptions */ - - buf.writeInt(1); /* nkeys */ - buf.writeBuffer(pubKey.toBuffer('rfc4253')); - - if (privBuf) - buf.writeBuffer(privBuf); - - buf = buf.toBuffer(); - - var header; - if (PrivateKey.isPrivateKey(key)) - header = 'OPENSSH PRIVATE KEY'; - else - header = 'OPENSSH PUBLIC KEY'; - - var tmp = buf.toString('base64'); - var len = tmp.length + (tmp.length / 70) + - 18 + 16 + header.length*2 + 10; - buf = Buffer.alloc(len); - var o = 0; - o += buf.write('-----BEGIN ' + header + '-----\n', o); - for (var i = 0; i < tmp.length; ) { - var limit = i + 70; - if (limit > tmp.length) - limit = tmp.length; - o += buf.write(tmp.slice(i, limit), o); - buf[o++] = 10; - i = limit; - } - o += buf.write('-----END ' + header + '-----\n', o); - - return (buf.slice(0, o)); -} diff --git a/node_modules/sshpk/lib/formats/ssh.js b/node_modules/sshpk/lib/formats/ssh.js deleted file mode 100644 index c8e9c931..00000000 --- a/node_modules/sshpk/lib/formats/ssh.js +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - read: read, - write: write -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var rfc4253 = require('./rfc4253'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); - -var sshpriv = require('./ssh-private'); - -/*JSSTYLED*/ -var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; -/*JSSTYLED*/ -var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/; - -function read(buf, options) { - if (typeof (buf) !== 'string') { - assert.buffer(buf, 'buf'); - buf = buf.toString('ascii'); - } - - var trimmed = buf.trim().replace(/[\\\r]/g, ''); - var m = trimmed.match(SSHKEY_RE); - if (!m) - m = trimmed.match(SSHKEY_RE2); - assert.ok(m, 'key must match regex'); - - var type = rfc4253.algToKeyType(m[1]); - var kbuf = Buffer.from(m[2], 'base64'); - - /* - * This is a bit tricky. If we managed to parse the key and locate the - * key comment with the regex, then do a non-partial read and assert - * that we have consumed all bytes. If we couldn't locate the key - * comment, though, there may be whitespace shenanigans going on that - * have conjoined the comment to the rest of the key. We do a partial - * read in this case to try to make the best out of a sorry situation. - */ - var key; - var ret = {}; - if (m[4]) { - try { - key = rfc4253.read(kbuf); - - } catch (e) { - m = trimmed.match(SSHKEY_RE2); - assert.ok(m, 'key must match regex'); - kbuf = Buffer.from(m[2], 'base64'); - key = rfc4253.readInternal(ret, 'public', kbuf); - } - } else { - key = rfc4253.readInternal(ret, 'public', kbuf); - } - - assert.strictEqual(type, key.type); - - if (m[4] && m[4].length > 0) { - key.comment = m[4]; - - } else if (ret.consumed) { - /* - * Now the magic: trying to recover the key comment when it's - * gotten conjoined to the key or otherwise shenanigan'd. - * - * Work out how much base64 we used, then drop all non-base64 - * chars from the beginning up to this point in the the string. - * Then offset in this and try to make up for missing = chars. - */ - var data = m[2] + (m[3] ? m[3] : ''); - var realOffset = Math.ceil(ret.consumed / 3) * 4; - data = data.slice(0, realOffset - 2). /*JSSTYLED*/ - replace(/[^a-zA-Z0-9+\/=]/g, '') + - data.slice(realOffset - 2); - - var padding = ret.consumed % 3; - if (padding > 0 && - data.slice(realOffset - 1, realOffset) !== '=') - realOffset--; - while (data.slice(realOffset, realOffset + 1) === '=') - realOffset++; - - /* Finally, grab what we think is the comment & clean it up. */ - var trailer = data.slice(realOffset); - trailer = trailer.replace(/[\r\n]/g, ' '). - replace(/^\s+/, ''); - if (trailer.match(/^[a-zA-Z0-9]/)) - key.comment = trailer; - } - - return (key); -} - -function write(key, options) { - assert.object(key); - if (!Key.isKey(key)) - throw (new Error('Must be a public key')); - - var parts = []; - var alg = rfc4253.keyTypeToAlg(key); - parts.push(alg); - - var buf = rfc4253.write(key); - parts.push(buf.toString('base64')); - - if (key.comment) - parts.push(key.comment); - - return (Buffer.from(parts.join(' '))); -} diff --git a/node_modules/sshpk/lib/formats/x509-pem.js b/node_modules/sshpk/lib/formats/x509-pem.js deleted file mode 100644 index 3155ef0b..00000000 --- a/node_modules/sshpk/lib/formats/x509-pem.js +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2016 Joyent, Inc. - -var x509 = require('./x509'); - -module.exports = { - read: read, - verify: x509.verify, - sign: x509.sign, - write: write -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var pem = require('./pem'); -var Identity = require('../identity'); -var Signature = require('../signature'); -var Certificate = require('../certificate'); - -function read(buf, options) { - if (typeof (buf) !== 'string') { - assert.buffer(buf, 'buf'); - buf = buf.toString('ascii'); - } - - var lines = buf.trim().split(/[\r\n]+/g); - - var m; - var si = -1; - while (!m && si < lines.length) { - m = lines[++si].match(/*JSSTYLED*/ - /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/); - } - assert.ok(m, 'invalid PEM header'); - - var m2; - var ei = lines.length; - while (!m2 && ei > 0) { - m2 = lines[--ei].match(/*JSSTYLED*/ - /[-]+[ ]*END CERTIFICATE[ ]*[-]+/); - } - assert.ok(m2, 'invalid PEM footer'); - - lines = lines.slice(si, ei + 1); - - var headers = {}; - while (true) { - lines = lines.slice(1); - m = lines[0].match(/*JSSTYLED*/ - /^([A-Za-z0-9-]+): (.+)$/); - if (!m) - break; - headers[m[1].toLowerCase()] = m[2]; - } - - /* Chop off the first and last lines */ - lines = lines.slice(0, -1).join(''); - buf = Buffer.from(lines, 'base64'); - - return (x509.read(buf, options)); -} - -function write(cert, options) { - var dbuf = x509.write(cert, options); - - var header = 'CERTIFICATE'; - var tmp = dbuf.toString('base64'); - var len = tmp.length + (tmp.length / 64) + - 18 + 16 + header.length*2 + 10; - var buf = Buffer.alloc(len); - var o = 0; - o += buf.write('-----BEGIN ' + header + '-----\n', o); - for (var i = 0; i < tmp.length; ) { - var limit = i + 64; - if (limit > tmp.length) - limit = tmp.length; - o += buf.write(tmp.slice(i, limit), o); - buf[o++] = 10; - i = limit; - } - o += buf.write('-----END ' + header + '-----\n', o); - - return (buf.slice(0, o)); -} diff --git a/node_modules/sshpk/lib/formats/x509.js b/node_modules/sshpk/lib/formats/x509.js deleted file mode 100644 index 0144c444..00000000 --- a/node_modules/sshpk/lib/formats/x509.js +++ /dev/null @@ -1,752 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = { - read: read, - verify: verify, - sign: sign, - signAsync: signAsync, - write: write -}; - -var assert = require('assert-plus'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('../algs'); -var utils = require('../utils'); -var Key = require('../key'); -var PrivateKey = require('../private-key'); -var pem = require('./pem'); -var Identity = require('../identity'); -var Signature = require('../signature'); -var Certificate = require('../certificate'); -var pkcs8 = require('./pkcs8'); - -/* - * This file is based on RFC5280 (X.509). - */ - -/* Helper to read in a single mpint */ -function readMPInt(der, nm) { - assert.strictEqual(der.peek(), asn1.Ber.Integer, - nm + ' is not an Integer'); - return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); -} - -function verify(cert, key) { - var sig = cert.signatures.x509; - assert.object(sig, 'x509 signature'); - - var algParts = sig.algo.split('-'); - if (algParts[0] !== key.type) - return (false); - - var blob = sig.cache; - if (blob === undefined) { - var der = new asn1.BerWriter(); - writeTBSCert(cert, der); - blob = der.buffer; - } - - var verifier = key.createVerify(algParts[1]); - verifier.write(blob); - return (verifier.verify(sig.signature)); -} - -function Local(i) { - return (asn1.Ber.Context | asn1.Ber.Constructor | i); -} - -function Context(i) { - return (asn1.Ber.Context | i); -} - -var SIGN_ALGS = { - 'rsa-md5': '1.2.840.113549.1.1.4', - 'rsa-sha1': '1.2.840.113549.1.1.5', - 'rsa-sha256': '1.2.840.113549.1.1.11', - 'rsa-sha384': '1.2.840.113549.1.1.12', - 'rsa-sha512': '1.2.840.113549.1.1.13', - 'dsa-sha1': '1.2.840.10040.4.3', - 'dsa-sha256': '2.16.840.1.101.3.4.3.2', - 'ecdsa-sha1': '1.2.840.10045.4.1', - 'ecdsa-sha256': '1.2.840.10045.4.3.2', - 'ecdsa-sha384': '1.2.840.10045.4.3.3', - 'ecdsa-sha512': '1.2.840.10045.4.3.4', - 'ed25519-sha512': '1.3.101.112' -}; -Object.keys(SIGN_ALGS).forEach(function (k) { - SIGN_ALGS[SIGN_ALGS[k]] = k; -}); -SIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5'; -SIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1'; - -var EXTS = { - 'issuerKeyId': '2.5.29.35', - 'altName': '2.5.29.17', - 'basicConstraints': '2.5.29.19', - 'keyUsage': '2.5.29.15', - 'extKeyUsage': '2.5.29.37' -}; - -function read(buf, options) { - if (typeof (buf) === 'string') { - buf = Buffer.from(buf, 'binary'); - } - assert.buffer(buf, 'buf'); - - var der = new asn1.BerReader(buf); - - der.readSequence(); - if (Math.abs(der.length - der.remain) > 1) { - throw (new Error('DER sequence does not contain whole byte ' + - 'stream')); - } - - var tbsStart = der.offset; - der.readSequence(); - var sigOffset = der.offset + der.length; - var tbsEnd = sigOffset; - - if (der.peek() === Local(0)) { - der.readSequence(Local(0)); - var version = der.readInt(); - assert.ok(version <= 3, - 'only x.509 versions up to v3 supported'); - } - - var cert = {}; - cert.signatures = {}; - var sig = (cert.signatures.x509 = {}); - sig.extras = {}; - - cert.serial = readMPInt(der, 'serial'); - - der.readSequence(); - var after = der.offset + der.length; - var certAlgOid = der.readOID(); - var certAlg = SIGN_ALGS[certAlgOid]; - if (certAlg === undefined) - throw (new Error('unknown signature algorithm ' + certAlgOid)); - - der._offset = after; - cert.issuer = Identity.parseAsn1(der); - - der.readSequence(); - cert.validFrom = readDate(der); - cert.validUntil = readDate(der); - - cert.subjects = [Identity.parseAsn1(der)]; - - der.readSequence(); - after = der.offset + der.length; - cert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der); - der._offset = after; - - /* issuerUniqueID */ - if (der.peek() === Local(1)) { - der.readSequence(Local(1)); - sig.extras.issuerUniqueID = - buf.slice(der.offset, der.offset + der.length); - der._offset += der.length; - } - - /* subjectUniqueID */ - if (der.peek() === Local(2)) { - der.readSequence(Local(2)); - sig.extras.subjectUniqueID = - buf.slice(der.offset, der.offset + der.length); - der._offset += der.length; - } - - /* extensions */ - if (der.peek() === Local(3)) { - der.readSequence(Local(3)); - var extEnd = der.offset + der.length; - der.readSequence(); - - while (der.offset < extEnd) - readExtension(cert, buf, der); - - assert.strictEqual(der.offset, extEnd); - } - - assert.strictEqual(der.offset, sigOffset); - - der.readSequence(); - after = der.offset + der.length; - var sigAlgOid = der.readOID(); - var sigAlg = SIGN_ALGS[sigAlgOid]; - if (sigAlg === undefined) - throw (new Error('unknown signature algorithm ' + sigAlgOid)); - der._offset = after; - - var sigData = der.readString(asn1.Ber.BitString, true); - if (sigData[0] === 0) - sigData = sigData.slice(1); - var algParts = sigAlg.split('-'); - - sig.signature = Signature.parse(sigData, algParts[0], 'asn1'); - sig.signature.hashAlgorithm = algParts[1]; - sig.algo = sigAlg; - sig.cache = buf.slice(tbsStart, tbsEnd); - - return (new Certificate(cert)); -} - -function readDate(der) { - if (der.peek() === asn1.Ber.UTCTime) { - return (utcTimeToDate(der.readString(asn1.Ber.UTCTime))); - } else if (der.peek() === asn1.Ber.GeneralizedTime) { - return (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime))); - } else { - throw (new Error('Unsupported date format')); - } -} - -function writeDate(der, date) { - if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) { - der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime); - } else { - der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime); - } -} - -/* RFC5280, section 4.2.1.6 (GeneralName type) */ -var ALTNAME = { - OtherName: Local(0), - RFC822Name: Context(1), - DNSName: Context(2), - X400Address: Local(3), - DirectoryName: Local(4), - EDIPartyName: Local(5), - URI: Context(6), - IPAddress: Context(7), - OID: Context(8) -}; - -/* RFC5280, section 4.2.1.12 (KeyPurposeId) */ -var EXTPURPOSE = { - 'serverAuth': '1.3.6.1.5.5.7.3.1', - 'clientAuth': '1.3.6.1.5.5.7.3.2', - 'codeSigning': '1.3.6.1.5.5.7.3.3', - - /* See https://github.com/joyent/oid-docs/blob/master/root.md */ - 'joyentDocker': '1.3.6.1.4.1.38678.1.4.1', - 'joyentCmon': '1.3.6.1.4.1.38678.1.4.2' -}; -var EXTPURPOSE_REV = {}; -Object.keys(EXTPURPOSE).forEach(function (k) { - EXTPURPOSE_REV[EXTPURPOSE[k]] = k; -}); - -var KEYUSEBITS = [ - 'signature', 'identity', 'keyEncryption', - 'encryption', 'keyAgreement', 'ca', 'crl' -]; - -function readExtension(cert, buf, der) { - der.readSequence(); - var after = der.offset + der.length; - var extId = der.readOID(); - var id; - var sig = cert.signatures.x509; - if (!sig.extras.exts) - sig.extras.exts = []; - - var critical; - if (der.peek() === asn1.Ber.Boolean) - critical = der.readBoolean(); - - switch (extId) { - case (EXTS.basicConstraints): - der.readSequence(asn1.Ber.OctetString); - der.readSequence(); - var bcEnd = der.offset + der.length; - var ca = false; - if (der.peek() === asn1.Ber.Boolean) - ca = der.readBoolean(); - if (cert.purposes === undefined) - cert.purposes = []; - if (ca === true) - cert.purposes.push('ca'); - var bc = { oid: extId, critical: critical }; - if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer) - bc.pathLen = der.readInt(); - sig.extras.exts.push(bc); - break; - case (EXTS.extKeyUsage): - der.readSequence(asn1.Ber.OctetString); - der.readSequence(); - if (cert.purposes === undefined) - cert.purposes = []; - var ekEnd = der.offset + der.length; - while (der.offset < ekEnd) { - var oid = der.readOID(); - cert.purposes.push(EXTPURPOSE_REV[oid] || oid); - } - /* - * This is a bit of a hack: in the case where we have a cert - * that's only allowed to do serverAuth or clientAuth (and not - * the other), we want to make sure all our Subjects are of - * the right type. But we already parsed our Subjects and - * decided if they were hosts or users earlier (since it appears - * first in the cert). - * - * So we go through and mutate them into the right kind here if - * it doesn't match. This might not be hugely beneficial, as it - * seems that single-purpose certs are not often seen in the - * wild. - */ - if (cert.purposes.indexOf('serverAuth') !== -1 && - cert.purposes.indexOf('clientAuth') === -1) { - cert.subjects.forEach(function (ide) { - if (ide.type !== 'host') { - ide.type = 'host'; - ide.hostname = ide.uid || - ide.email || - ide.components[0].value; - } - }); - } else if (cert.purposes.indexOf('clientAuth') !== -1 && - cert.purposes.indexOf('serverAuth') === -1) { - cert.subjects.forEach(function (ide) { - if (ide.type !== 'user') { - ide.type = 'user'; - ide.uid = ide.hostname || - ide.email || - ide.components[0].value; - } - }); - } - sig.extras.exts.push({ oid: extId, critical: critical }); - break; - case (EXTS.keyUsage): - der.readSequence(asn1.Ber.OctetString); - var bits = der.readString(asn1.Ber.BitString, true); - var setBits = readBitField(bits, KEYUSEBITS); - setBits.forEach(function (bit) { - if (cert.purposes === undefined) - cert.purposes = []; - if (cert.purposes.indexOf(bit) === -1) - cert.purposes.push(bit); - }); - sig.extras.exts.push({ oid: extId, critical: critical, - bits: bits }); - break; - case (EXTS.altName): - der.readSequence(asn1.Ber.OctetString); - der.readSequence(); - var aeEnd = der.offset + der.length; - while (der.offset < aeEnd) { - switch (der.peek()) { - case ALTNAME.OtherName: - case ALTNAME.EDIPartyName: - der.readSequence(); - der._offset += der.length; - break; - case ALTNAME.OID: - der.readOID(ALTNAME.OID); - break; - case ALTNAME.RFC822Name: - /* RFC822 specifies email addresses */ - var email = der.readString(ALTNAME.RFC822Name); - id = Identity.forEmail(email); - if (!cert.subjects[0].equals(id)) - cert.subjects.push(id); - break; - case ALTNAME.DirectoryName: - der.readSequence(ALTNAME.DirectoryName); - id = Identity.parseAsn1(der); - if (!cert.subjects[0].equals(id)) - cert.subjects.push(id); - break; - case ALTNAME.DNSName: - var host = der.readString( - ALTNAME.DNSName); - id = Identity.forHost(host); - if (!cert.subjects[0].equals(id)) - cert.subjects.push(id); - break; - default: - der.readString(der.peek()); - break; - } - } - sig.extras.exts.push({ oid: extId, critical: critical }); - break; - default: - sig.extras.exts.push({ - oid: extId, - critical: critical, - data: der.readString(asn1.Ber.OctetString, true) - }); - break; - } - - der._offset = after; -} - -var UTCTIME_RE = - /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; -function utcTimeToDate(t) { - var m = t.match(UTCTIME_RE); - assert.ok(m, 'timestamps must be in UTC'); - var d = new Date(); - - var thisYear = d.getUTCFullYear(); - var century = Math.floor(thisYear / 100) * 100; - - var year = parseInt(m[1], 10); - if (thisYear % 100 < 50 && year >= 60) - year += (century - 1); - else - year += century; - d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10)); - d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); - if (m[6] && m[6].length > 0) - d.setUTCSeconds(parseInt(m[6], 10)); - return (d); -} - -var GTIME_RE = - /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; -function gTimeToDate(t) { - var m = t.match(GTIME_RE); - assert.ok(m); - var d = new Date(); - - d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, - parseInt(m[3], 10)); - d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); - if (m[6] && m[6].length > 0) - d.setUTCSeconds(parseInt(m[6], 10)); - return (d); -} - -function zeroPad(n, m) { - if (m === undefined) - m = 2; - var s = '' + n; - while (s.length < m) - s = '0' + s; - return (s); -} - -function dateToUTCTime(d) { - var s = ''; - s += zeroPad(d.getUTCFullYear() % 100); - s += zeroPad(d.getUTCMonth() + 1); - s += zeroPad(d.getUTCDate()); - s += zeroPad(d.getUTCHours()); - s += zeroPad(d.getUTCMinutes()); - s += zeroPad(d.getUTCSeconds()); - s += 'Z'; - return (s); -} - -function dateToGTime(d) { - var s = ''; - s += zeroPad(d.getUTCFullYear(), 4); - s += zeroPad(d.getUTCMonth() + 1); - s += zeroPad(d.getUTCDate()); - s += zeroPad(d.getUTCHours()); - s += zeroPad(d.getUTCMinutes()); - s += zeroPad(d.getUTCSeconds()); - s += 'Z'; - return (s); -} - -function sign(cert, key) { - if (cert.signatures.x509 === undefined) - cert.signatures.x509 = {}; - var sig = cert.signatures.x509; - - sig.algo = key.type + '-' + key.defaultHashAlgorithm(); - if (SIGN_ALGS[sig.algo] === undefined) - return (false); - - var der = new asn1.BerWriter(); - writeTBSCert(cert, der); - var blob = der.buffer; - sig.cache = blob; - - var signer = key.createSign(); - signer.write(blob); - cert.signatures.x509.signature = signer.sign(); - - return (true); -} - -function signAsync(cert, signer, done) { - if (cert.signatures.x509 === undefined) - cert.signatures.x509 = {}; - var sig = cert.signatures.x509; - - var der = new asn1.BerWriter(); - writeTBSCert(cert, der); - var blob = der.buffer; - sig.cache = blob; - - signer(blob, function (err, signature) { - if (err) { - done(err); - return; - } - sig.algo = signature.type + '-' + signature.hashAlgorithm; - if (SIGN_ALGS[sig.algo] === undefined) { - done(new Error('Invalid signing algorithm "' + - sig.algo + '"')); - return; - } - sig.signature = signature; - done(); - }); -} - -function write(cert, options) { - var sig = cert.signatures.x509; - assert.object(sig, 'x509 signature'); - - var der = new asn1.BerWriter(); - der.startSequence(); - if (sig.cache) { - der._ensure(sig.cache.length); - sig.cache.copy(der._buf, der._offset); - der._offset += sig.cache.length; - } else { - writeTBSCert(cert, der); - } - - der.startSequence(); - der.writeOID(SIGN_ALGS[sig.algo]); - if (sig.algo.match(/^rsa-/)) - der.writeNull(); - der.endSequence(); - - var sigData = sig.signature.toBuffer('asn1'); - var data = Buffer.alloc(sigData.length + 1); - data[0] = 0; - sigData.copy(data, 1); - der.writeBuffer(data, asn1.Ber.BitString); - der.endSequence(); - - return (der.buffer); -} - -function writeTBSCert(cert, der) { - var sig = cert.signatures.x509; - assert.object(sig, 'x509 signature'); - - der.startSequence(); - - der.startSequence(Local(0)); - der.writeInt(2); - der.endSequence(); - - der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer); - - der.startSequence(); - der.writeOID(SIGN_ALGS[sig.algo]); - if (sig.algo.match(/^rsa-/)) - der.writeNull(); - der.endSequence(); - - cert.issuer.toAsn1(der); - - der.startSequence(); - writeDate(der, cert.validFrom); - writeDate(der, cert.validUntil); - der.endSequence(); - - var subject = cert.subjects[0]; - var altNames = cert.subjects.slice(1); - subject.toAsn1(der); - - pkcs8.writePkcs8(der, cert.subjectKey); - - if (sig.extras && sig.extras.issuerUniqueID) { - der.writeBuffer(sig.extras.issuerUniqueID, Local(1)); - } - - if (sig.extras && sig.extras.subjectUniqueID) { - der.writeBuffer(sig.extras.subjectUniqueID, Local(2)); - } - - if (altNames.length > 0 || subject.type === 'host' || - (cert.purposes !== undefined && cert.purposes.length > 0) || - (sig.extras && sig.extras.exts)) { - der.startSequence(Local(3)); - der.startSequence(); - - var exts = []; - if (cert.purposes !== undefined && cert.purposes.length > 0) { - exts.push({ - oid: EXTS.basicConstraints, - critical: true - }); - exts.push({ - oid: EXTS.keyUsage, - critical: true - }); - exts.push({ - oid: EXTS.extKeyUsage, - critical: true - }); - } - exts.push({ oid: EXTS.altName }); - if (sig.extras && sig.extras.exts) - exts = sig.extras.exts; - - for (var i = 0; i < exts.length; ++i) { - der.startSequence(); - der.writeOID(exts[i].oid); - - if (exts[i].critical !== undefined) - der.writeBoolean(exts[i].critical); - - if (exts[i].oid === EXTS.altName) { - der.startSequence(asn1.Ber.OctetString); - der.startSequence(); - if (subject.type === 'host') { - der.writeString(subject.hostname, - Context(2)); - } - for (var j = 0; j < altNames.length; ++j) { - if (altNames[j].type === 'host') { - der.writeString( - altNames[j].hostname, - ALTNAME.DNSName); - } else if (altNames[j].type === - 'email') { - der.writeString( - altNames[j].email, - ALTNAME.RFC822Name); - } else { - /* - * Encode anything else as a - * DN style name for now. - */ - der.startSequence( - ALTNAME.DirectoryName); - altNames[j].toAsn1(der); - der.endSequence(); - } - } - der.endSequence(); - der.endSequence(); - } else if (exts[i].oid === EXTS.basicConstraints) { - der.startSequence(asn1.Ber.OctetString); - der.startSequence(); - var ca = (cert.purposes.indexOf('ca') !== -1); - var pathLen = exts[i].pathLen; - der.writeBoolean(ca); - if (pathLen !== undefined) - der.writeInt(pathLen); - der.endSequence(); - der.endSequence(); - } else if (exts[i].oid === EXTS.extKeyUsage) { - der.startSequence(asn1.Ber.OctetString); - der.startSequence(); - cert.purposes.forEach(function (purpose) { - if (purpose === 'ca') - return; - if (KEYUSEBITS.indexOf(purpose) !== -1) - return; - var oid = purpose; - if (EXTPURPOSE[purpose] !== undefined) - oid = EXTPURPOSE[purpose]; - der.writeOID(oid); - }); - der.endSequence(); - der.endSequence(); - } else if (exts[i].oid === EXTS.keyUsage) { - der.startSequence(asn1.Ber.OctetString); - /* - * If we parsed this certificate from a byte - * stream (i.e. we didn't generate it in sshpk) - * then we'll have a ".bits" property on the - * ext with the original raw byte contents. - * - * If we have this, use it here instead of - * regenerating it. This guarantees we output - * the same data we parsed, so signatures still - * validate. - */ - if (exts[i].bits !== undefined) { - der.writeBuffer(exts[i].bits, - asn1.Ber.BitString); - } else { - var bits = writeBitField(cert.purposes, - KEYUSEBITS); - der.writeBuffer(bits, - asn1.Ber.BitString); - } - der.endSequence(); - } else { - der.writeBuffer(exts[i].data, - asn1.Ber.OctetString); - } - - der.endSequence(); - } - - der.endSequence(); - der.endSequence(); - } - - der.endSequence(); -} - -/* - * Reads an ASN.1 BER bitfield out of the Buffer produced by doing - * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw - * contents of the BitString tag, which is a count of unused bits followed by - * the bits as a right-padded byte string. - * - * `bits` is the Buffer, `bitIndex` should contain an array of string names - * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec. - * - * Returns an array of Strings, the names of the bits that were set to 1. - */ -function readBitField(bits, bitIndex) { - var bitLen = 8 * (bits.length - 1) - bits[0]; - var setBits = {}; - for (var i = 0; i < bitLen; ++i) { - var byteN = 1 + Math.floor(i / 8); - var bit = 7 - (i % 8); - var mask = 1 << bit; - var bitVal = ((bits[byteN] & mask) !== 0); - var name = bitIndex[i]; - if (bitVal && typeof (name) === 'string') { - setBits[name] = true; - } - } - return (Object.keys(setBits)); -} - -/* - * `setBits` is an array of strings, containing the names for each bit that - * sould be set to 1. `bitIndex` is same as in `readBitField()`. - * - * Returns a Buffer, ready to be written out with `BerWriter#writeString()`. - */ -function writeBitField(setBits, bitIndex) { - var bitLen = bitIndex.length; - var blen = Math.ceil(bitLen / 8); - var unused = blen * 8 - bitLen; - var bits = Buffer.alloc(1 + blen); // zero-filled - bits[0] = unused; - for (var i = 0; i < bitLen; ++i) { - var byteN = 1 + Math.floor(i / 8); - var bit = 7 - (i % 8); - var mask = 1 << bit; - var name = bitIndex[i]; - if (name === undefined) - continue; - var bitVal = (setBits.indexOf(name) !== -1); - if (bitVal) { - bits[byteN] |= mask; - } - } - return (bits); -} diff --git a/node_modules/sshpk/lib/identity.js b/node_modules/sshpk/lib/identity.js deleted file mode 100644 index 7d75b667..00000000 --- a/node_modules/sshpk/lib/identity.js +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = Identity; - -var assert = require('assert-plus'); -var algs = require('./algs'); -var crypto = require('crypto'); -var Fingerprint = require('./fingerprint'); -var Signature = require('./signature'); -var errs = require('./errors'); -var util = require('util'); -var utils = require('./utils'); -var asn1 = require('asn1'); -var Buffer = require('safer-buffer').Buffer; - -/*JSSTYLED*/ -var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i; - -var oids = {}; -oids.cn = '2.5.4.3'; -oids.o = '2.5.4.10'; -oids.ou = '2.5.4.11'; -oids.l = '2.5.4.7'; -oids.s = '2.5.4.8'; -oids.c = '2.5.4.6'; -oids.sn = '2.5.4.4'; -oids.postalCode = '2.5.4.17'; -oids.serialNumber = '2.5.4.5'; -oids.street = '2.5.4.9'; -oids.x500UniqueIdentifier = '2.5.4.45'; -oids.role = '2.5.4.72'; -oids.telephoneNumber = '2.5.4.20'; -oids.description = '2.5.4.13'; -oids.dc = '0.9.2342.19200300.100.1.25'; -oids.uid = '0.9.2342.19200300.100.1.1'; -oids.mail = '0.9.2342.19200300.100.1.3'; -oids.title = '2.5.4.12'; -oids.gn = '2.5.4.42'; -oids.initials = '2.5.4.43'; -oids.pseudonym = '2.5.4.65'; -oids.emailAddress = '1.2.840.113549.1.9.1'; - -var unoids = {}; -Object.keys(oids).forEach(function (k) { - unoids[oids[k]] = k; -}); - -function Identity(opts) { - var self = this; - assert.object(opts, 'options'); - assert.arrayOfObject(opts.components, 'options.components'); - this.components = opts.components; - this.componentLookup = {}; - this.components.forEach(function (c) { - if (c.name && !c.oid) - c.oid = oids[c.name]; - if (c.oid && !c.name) - c.name = unoids[c.oid]; - if (self.componentLookup[c.name] === undefined) - self.componentLookup[c.name] = []; - self.componentLookup[c.name].push(c); - }); - if (this.componentLookup.cn && this.componentLookup.cn.length > 0) { - this.cn = this.componentLookup.cn[0].value; - } - assert.optionalString(opts.type, 'options.type'); - if (opts.type === undefined) { - if (this.components.length === 1 && - this.componentLookup.cn && - this.componentLookup.cn.length === 1 && - this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { - this.type = 'host'; - this.hostname = this.componentLookup.cn[0].value; - - } else if (this.componentLookup.dc && - this.components.length === this.componentLookup.dc.length) { - this.type = 'host'; - this.hostname = this.componentLookup.dc.map( - function (c) { - return (c.value); - }).join('.'); - - } else if (this.componentLookup.uid && - this.components.length === - this.componentLookup.uid.length) { - this.type = 'user'; - this.uid = this.componentLookup.uid[0].value; - - } else if (this.componentLookup.cn && - this.componentLookup.cn.length === 1 && - this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { - this.type = 'host'; - this.hostname = this.componentLookup.cn[0].value; - - } else if (this.componentLookup.uid && - this.componentLookup.uid.length === 1) { - this.type = 'user'; - this.uid = this.componentLookup.uid[0].value; - - } else if (this.componentLookup.mail && - this.componentLookup.mail.length === 1) { - this.type = 'email'; - this.email = this.componentLookup.mail[0].value; - - } else if (this.componentLookup.cn && - this.componentLookup.cn.length === 1) { - this.type = 'user'; - this.uid = this.componentLookup.cn[0].value; - - } else { - this.type = 'unknown'; - } - } else { - this.type = opts.type; - if (this.type === 'host') - this.hostname = opts.hostname; - else if (this.type === 'user') - this.uid = opts.uid; - else if (this.type === 'email') - this.email = opts.email; - else - throw (new Error('Unknown type ' + this.type)); - } -} - -Identity.prototype.toString = function () { - return (this.components.map(function (c) { - var n = c.name.toUpperCase(); - /*JSSTYLED*/ - n = n.replace(/=/g, '\\='); - var v = c.value; - /*JSSTYLED*/ - v = v.replace(/,/g, '\\,'); - return (n + '=' + v); - }).join(', ')); -}; - -Identity.prototype.get = function (name, asArray) { - assert.string(name, 'name'); - var arr = this.componentLookup[name]; - if (arr === undefined || arr.length === 0) - return (undefined); - if (!asArray && arr.length > 1) - throw (new Error('Multiple values for attribute ' + name)); - if (!asArray) - return (arr[0].value); - return (arr.map(function (c) { - return (c.value); - })); -}; - -Identity.prototype.toArray = function (idx) { - return (this.components.map(function (c) { - return ({ - name: c.name, - value: c.value - }); - })); -}; - -/* - * These are from X.680 -- PrintableString allowed chars are in section 37.4 - * table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to - * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006 - * (the basic ASCII character set). - */ -/* JSSTYLED */ -var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/; -/* JSSTYLED */ -var NOT_IA5 = /[^\x00-\x7f]/; - -Identity.prototype.toAsn1 = function (der, tag) { - der.startSequence(tag); - this.components.forEach(function (c) { - der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set); - der.startSequence(); - der.writeOID(c.oid); - /* - * If we fit in a PrintableString, use that. Otherwise use an - * IA5String or UTF8String. - * - * If this identity was parsed from a DN, use the ASN.1 types - * from the original representation (otherwise this might not - * be a full match for the original in some validators). - */ - if (c.asn1type === asn1.Ber.Utf8String || - c.value.match(NOT_IA5)) { - var v = Buffer.from(c.value, 'utf8'); - der.writeBuffer(v, asn1.Ber.Utf8String); - - } else if (c.asn1type === asn1.Ber.IA5String || - c.value.match(NOT_PRINTABLE)) { - der.writeString(c.value, asn1.Ber.IA5String); - - } else { - var type = asn1.Ber.PrintableString; - if (c.asn1type !== undefined) - type = c.asn1type; - der.writeString(c.value, type); - } - der.endSequence(); - der.endSequence(); - }); - der.endSequence(); -}; - -function globMatch(a, b) { - if (a === '**' || b === '**') - return (true); - var aParts = a.split('.'); - var bParts = b.split('.'); - if (aParts.length !== bParts.length) - return (false); - for (var i = 0; i < aParts.length; ++i) { - if (aParts[i] === '*' || bParts[i] === '*') - continue; - if (aParts[i] !== bParts[i]) - return (false); - } - return (true); -} - -Identity.prototype.equals = function (other) { - if (!Identity.isIdentity(other, [1, 0])) - return (false); - if (other.components.length !== this.components.length) - return (false); - for (var i = 0; i < this.components.length; ++i) { - if (this.components[i].oid !== other.components[i].oid) - return (false); - if (!globMatch(this.components[i].value, - other.components[i].value)) { - return (false); - } - } - return (true); -}; - -Identity.forHost = function (hostname) { - assert.string(hostname, 'hostname'); - return (new Identity({ - type: 'host', - hostname: hostname, - components: [ { name: 'cn', value: hostname } ] - })); -}; - -Identity.forUser = function (uid) { - assert.string(uid, 'uid'); - return (new Identity({ - type: 'user', - uid: uid, - components: [ { name: 'uid', value: uid } ] - })); -}; - -Identity.forEmail = function (email) { - assert.string(email, 'email'); - return (new Identity({ - type: 'email', - email: email, - components: [ { name: 'mail', value: email } ] - })); -}; - -Identity.parseDN = function (dn) { - assert.string(dn, 'dn'); - var parts = ['']; - var idx = 0; - var rem = dn; - while (rem.length > 0) { - var m; - /*JSSTYLED*/ - if ((m = /^,/.exec(rem)) !== null) { - parts[++idx] = ''; - rem = rem.slice(m[0].length); - /*JSSTYLED*/ - } else if ((m = /^\\,/.exec(rem)) !== null) { - parts[idx] += ','; - rem = rem.slice(m[0].length); - /*JSSTYLED*/ - } else if ((m = /^\\./.exec(rem)) !== null) { - parts[idx] += m[0]; - rem = rem.slice(m[0].length); - /*JSSTYLED*/ - } else if ((m = /^[^\\,]+/.exec(rem)) !== null) { - parts[idx] += m[0]; - rem = rem.slice(m[0].length); - } else { - throw (new Error('Failed to parse DN')); - } - } - var cmps = parts.map(function (c) { - c = c.trim(); - var eqPos = c.indexOf('='); - while (eqPos > 0 && c.charAt(eqPos - 1) === '\\') - eqPos = c.indexOf('=', eqPos + 1); - if (eqPos === -1) { - throw (new Error('Failed to parse DN')); - } - /*JSSTYLED*/ - var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '='); - var value = c.slice(eqPos + 1); - return ({ name: name, value: value }); - }); - return (new Identity({ components: cmps })); -}; - -Identity.fromArray = function (components) { - assert.arrayOfObject(components, 'components'); - components.forEach(function (cmp) { - assert.object(cmp, 'component'); - assert.string(cmp.name, 'component.name'); - if (!Buffer.isBuffer(cmp.value) && - !(typeof (cmp.value) === 'string')) { - throw (new Error('Invalid component value')); - } - }); - return (new Identity({ components: components })); -}; - -Identity.parseAsn1 = function (der, top) { - var components = []; - der.readSequence(top); - var end = der.offset + der.length; - while (der.offset < end) { - der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set); - var after = der.offset + der.length; - der.readSequence(); - var oid = der.readOID(); - var type = der.peek(); - var value; - switch (type) { - case asn1.Ber.PrintableString: - case asn1.Ber.IA5String: - case asn1.Ber.OctetString: - case asn1.Ber.T61String: - value = der.readString(type); - break; - case asn1.Ber.Utf8String: - value = der.readString(type, true); - value = value.toString('utf8'); - break; - case asn1.Ber.CharacterString: - case asn1.Ber.BMPString: - value = der.readString(type, true); - value = value.toString('utf16le'); - break; - default: - throw (new Error('Unknown asn1 type ' + type)); - } - components.push({ oid: oid, asn1type: type, value: value }); - der._offset = after; - } - der._offset = end; - return (new Identity({ - components: components - })); -}; - -Identity.isIdentity = function (obj, ver) { - return (utils.isCompatible(obj, Identity, ver)); -}; - -/* - * API versions for Identity: - * [1,0] -- initial ver - */ -Identity.prototype._sshpkApiVersion = [1, 0]; - -Identity._oldVersionDetect = function (obj) { - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/index.js b/node_modules/sshpk/lib/index.js deleted file mode 100644 index f76db791..00000000 --- a/node_modules/sshpk/lib/index.js +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -var Key = require('./key'); -var Fingerprint = require('./fingerprint'); -var Signature = require('./signature'); -var PrivateKey = require('./private-key'); -var Certificate = require('./certificate'); -var Identity = require('./identity'); -var errs = require('./errors'); - -module.exports = { - /* top-level classes */ - Key: Key, - parseKey: Key.parse, - Fingerprint: Fingerprint, - parseFingerprint: Fingerprint.parse, - Signature: Signature, - parseSignature: Signature.parse, - PrivateKey: PrivateKey, - parsePrivateKey: PrivateKey.parse, - generatePrivateKey: PrivateKey.generate, - Certificate: Certificate, - parseCertificate: Certificate.parse, - createSelfSignedCertificate: Certificate.createSelfSigned, - createCertificate: Certificate.create, - Identity: Identity, - identityFromDN: Identity.parseDN, - identityForHost: Identity.forHost, - identityForUser: Identity.forUser, - identityForEmail: Identity.forEmail, - identityFromArray: Identity.fromArray, - - /* errors */ - FingerprintFormatError: errs.FingerprintFormatError, - InvalidAlgorithmError: errs.InvalidAlgorithmError, - KeyParseError: errs.KeyParseError, - SignatureParseError: errs.SignatureParseError, - KeyEncryptedError: errs.KeyEncryptedError, - CertificateParseError: errs.CertificateParseError -}; diff --git a/node_modules/sshpk/lib/key.js b/node_modules/sshpk/lib/key.js deleted file mode 100644 index 706f8340..00000000 --- a/node_modules/sshpk/lib/key.js +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2018 Joyent, Inc. - -module.exports = Key; - -var assert = require('assert-plus'); -var algs = require('./algs'); -var crypto = require('crypto'); -var Fingerprint = require('./fingerprint'); -var Signature = require('./signature'); -var DiffieHellman = require('./dhe').DiffieHellman; -var errs = require('./errors'); -var utils = require('./utils'); -var PrivateKey = require('./private-key'); -var edCompat; - -try { - edCompat = require('./ed-compat'); -} catch (e) { - /* Just continue through, and bail out if we try to use it. */ -} - -var InvalidAlgorithmError = errs.InvalidAlgorithmError; -var KeyParseError = errs.KeyParseError; - -var formats = {}; -formats['auto'] = require('./formats/auto'); -formats['pem'] = require('./formats/pem'); -formats['pkcs1'] = require('./formats/pkcs1'); -formats['pkcs8'] = require('./formats/pkcs8'); -formats['rfc4253'] = require('./formats/rfc4253'); -formats['ssh'] = require('./formats/ssh'); -formats['ssh-private'] = require('./formats/ssh-private'); -formats['openssh'] = formats['ssh-private']; -formats['dnssec'] = require('./formats/dnssec'); -formats['putty'] = require('./formats/putty'); -formats['ppk'] = formats['putty']; - -function Key(opts) { - assert.object(opts, 'options'); - assert.arrayOfObject(opts.parts, 'options.parts'); - assert.string(opts.type, 'options.type'); - assert.optionalString(opts.comment, 'options.comment'); - - var algInfo = algs.info[opts.type]; - if (typeof (algInfo) !== 'object') - throw (new InvalidAlgorithmError(opts.type)); - - var partLookup = {}; - for (var i = 0; i < opts.parts.length; ++i) { - var part = opts.parts[i]; - partLookup[part.name] = part; - } - - this.type = opts.type; - this.parts = opts.parts; - this.part = partLookup; - this.comment = undefined; - this.source = opts.source; - - /* for speeding up hashing/fingerprint operations */ - this._rfc4253Cache = opts._rfc4253Cache; - this._hashCache = {}; - - var sz; - this.curve = undefined; - if (this.type === 'ecdsa') { - var curve = this.part.curve.data.toString(); - this.curve = curve; - sz = algs.curves[curve].size; - } else if (this.type === 'ed25519' || this.type === 'curve25519') { - sz = 256; - this.curve = 'curve25519'; - } else { - var szPart = this.part[algInfo.sizePart]; - sz = szPart.data.length; - sz = sz * 8 - utils.countZeros(szPart.data); - } - this.size = sz; -} - -Key.formats = formats; - -Key.prototype.toBuffer = function (format, options) { - if (format === undefined) - format = 'ssh'; - assert.string(format, 'format'); - assert.object(formats[format], 'formats[format]'); - assert.optionalObject(options, 'options'); - - if (format === 'rfc4253') { - if (this._rfc4253Cache === undefined) - this._rfc4253Cache = formats['rfc4253'].write(this); - return (this._rfc4253Cache); - } - - return (formats[format].write(this, options)); -}; - -Key.prototype.toString = function (format, options) { - return (this.toBuffer(format, options).toString()); -}; - -Key.prototype.hash = function (algo, type) { - assert.string(algo, 'algorithm'); - assert.optionalString(type, 'type'); - if (type === undefined) - type = 'ssh'; - algo = algo.toLowerCase(); - if (algs.hashAlgs[algo] === undefined) - throw (new InvalidAlgorithmError(algo)); - - var cacheKey = algo + '||' + type; - if (this._hashCache[cacheKey]) - return (this._hashCache[cacheKey]); - - var buf; - if (type === 'ssh') { - buf = this.toBuffer('rfc4253'); - } else if (type === 'spki') { - buf = formats.pkcs8.pkcs8ToBuffer(this); - } else { - throw (new Error('Hash type ' + type + ' not supported')); - } - var hash = crypto.createHash(algo).update(buf).digest(); - this._hashCache[cacheKey] = hash; - return (hash); -}; - -Key.prototype.fingerprint = function (algo, type) { - if (algo === undefined) - algo = 'sha256'; - if (type === undefined) - type = 'ssh'; - assert.string(algo, 'algorithm'); - assert.string(type, 'type'); - var opts = { - type: 'key', - hash: this.hash(algo, type), - algorithm: algo, - hashType: type - }; - return (new Fingerprint(opts)); -}; - -Key.prototype.defaultHashAlgorithm = function () { - var hashAlgo = 'sha1'; - if (this.type === 'rsa') - hashAlgo = 'sha256'; - if (this.type === 'dsa' && this.size > 1024) - hashAlgo = 'sha256'; - if (this.type === 'ed25519') - hashAlgo = 'sha512'; - if (this.type === 'ecdsa') { - if (this.size <= 256) - hashAlgo = 'sha256'; - else if (this.size <= 384) - hashAlgo = 'sha384'; - else - hashAlgo = 'sha512'; - } - return (hashAlgo); -}; - -Key.prototype.createVerify = function (hashAlgo) { - if (hashAlgo === undefined) - hashAlgo = this.defaultHashAlgorithm(); - assert.string(hashAlgo, 'hash algorithm'); - - /* ED25519 is not supported by OpenSSL, use a javascript impl. */ - if (this.type === 'ed25519' && edCompat !== undefined) - return (new edCompat.Verifier(this, hashAlgo)); - if (this.type === 'curve25519') - throw (new Error('Curve25519 keys are not suitable for ' + - 'signing or verification')); - - var v, nm, err; - try { - nm = hashAlgo.toUpperCase(); - v = crypto.createVerify(nm); - } catch (e) { - err = e; - } - if (v === undefined || (err instanceof Error && - err.message.match(/Unknown message digest/))) { - nm = 'RSA-'; - nm += hashAlgo.toUpperCase(); - v = crypto.createVerify(nm); - } - assert.ok(v, 'failed to create verifier'); - var oldVerify = v.verify.bind(v); - var key = this.toBuffer('pkcs8'); - var curve = this.curve; - var self = this; - v.verify = function (signature, fmt) { - if (Signature.isSignature(signature, [2, 0])) { - if (signature.type !== self.type) - return (false); - if (signature.hashAlgorithm && - signature.hashAlgorithm !== hashAlgo) - return (false); - if (signature.curve && self.type === 'ecdsa' && - signature.curve !== curve) - return (false); - return (oldVerify(key, signature.toBuffer('asn1'))); - - } else if (typeof (signature) === 'string' || - Buffer.isBuffer(signature)) { - return (oldVerify(key, signature, fmt)); - - /* - * Avoid doing this on valid arguments, walking the prototype - * chain can be quite slow. - */ - } else if (Signature.isSignature(signature, [1, 0])) { - throw (new Error('signature was created by too old ' + - 'a version of sshpk and cannot be verified')); - - } else { - throw (new TypeError('signature must be a string, ' + - 'Buffer, or Signature object')); - } - }; - return (v); -}; - -Key.prototype.createDiffieHellman = function () { - if (this.type === 'rsa') - throw (new Error('RSA keys do not support Diffie-Hellman')); - - return (new DiffieHellman(this)); -}; -Key.prototype.createDH = Key.prototype.createDiffieHellman; - -Key.parse = function (data, format, options) { - if (typeof (data) !== 'string') - assert.buffer(data, 'data'); - if (format === undefined) - format = 'auto'; - assert.string(format, 'format'); - if (typeof (options) === 'string') - options = { filename: options }; - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - assert.optionalString(options.filename, 'options.filename'); - if (options.filename === undefined) - options.filename = '(unnamed)'; - - assert.object(formats[format], 'formats[format]'); - - try { - var k = formats[format].read(data, options); - if (k instanceof PrivateKey) - k = k.toPublic(); - if (!k.comment) - k.comment = options.filename; - return (k); - } catch (e) { - if (e.name === 'KeyEncryptedError') - throw (e); - throw (new KeyParseError(options.filename, format, e)); - } -}; - -Key.isKey = function (obj, ver) { - return (utils.isCompatible(obj, Key, ver)); -}; - -/* - * API versions for Key: - * [1,0] -- initial ver, may take Signature for createVerify or may not - * [1,1] -- added pkcs1, pkcs8 formats - * [1,2] -- added auto, ssh-private, openssh formats - * [1,3] -- added defaultHashAlgorithm - * [1,4] -- added ed support, createDH - * [1,5] -- first explicitly tagged version - * [1,6] -- changed ed25519 part names - * [1,7] -- spki hash types - */ -Key.prototype._sshpkApiVersion = [1, 7]; - -Key._oldVersionDetect = function (obj) { - assert.func(obj.toBuffer); - assert.func(obj.fingerprint); - if (obj.createDH) - return ([1, 4]); - if (obj.defaultHashAlgorithm) - return ([1, 3]); - if (obj.formats['auto']) - return ([1, 2]); - if (obj.formats['pkcs1']) - return ([1, 1]); - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/private-key.js b/node_modules/sshpk/lib/private-key.js deleted file mode 100644 index 570e0543..00000000 --- a/node_modules/sshpk/lib/private-key.js +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2017 Joyent, Inc. - -module.exports = PrivateKey; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('./algs'); -var crypto = require('crypto'); -var Fingerprint = require('./fingerprint'); -var Signature = require('./signature'); -var errs = require('./errors'); -var util = require('util'); -var utils = require('./utils'); -var dhe = require('./dhe'); -var generateECDSA = dhe.generateECDSA; -var generateED25519 = dhe.generateED25519; -var edCompat = require('./ed-compat'); -var nacl = require('tweetnacl'); - -var Key = require('./key'); - -var InvalidAlgorithmError = errs.InvalidAlgorithmError; -var KeyParseError = errs.KeyParseError; -var KeyEncryptedError = errs.KeyEncryptedError; - -var formats = {}; -formats['auto'] = require('./formats/auto'); -formats['pem'] = require('./formats/pem'); -formats['pkcs1'] = require('./formats/pkcs1'); -formats['pkcs8'] = require('./formats/pkcs8'); -formats['rfc4253'] = require('./formats/rfc4253'); -formats['ssh-private'] = require('./formats/ssh-private'); -formats['openssh'] = formats['ssh-private']; -formats['ssh'] = formats['ssh-private']; -formats['dnssec'] = require('./formats/dnssec'); -formats['putty'] = require('./formats/putty'); - -function PrivateKey(opts) { - assert.object(opts, 'options'); - Key.call(this, opts); - - this._pubCache = undefined; -} -util.inherits(PrivateKey, Key); - -PrivateKey.formats = formats; - -PrivateKey.prototype.toBuffer = function (format, options) { - if (format === undefined) - format = 'pkcs1'; - assert.string(format, 'format'); - assert.object(formats[format], 'formats[format]'); - assert.optionalObject(options, 'options'); - - return (formats[format].write(this, options)); -}; - -PrivateKey.prototype.hash = function (algo, type) { - return (this.toPublic().hash(algo, type)); -}; - -PrivateKey.prototype.fingerprint = function (algo, type) { - return (this.toPublic().fingerprint(algo, type)); -}; - -PrivateKey.prototype.toPublic = function () { - if (this._pubCache) - return (this._pubCache); - - var algInfo = algs.info[this.type]; - var pubParts = []; - for (var i = 0; i < algInfo.parts.length; ++i) { - var p = algInfo.parts[i]; - pubParts.push(this.part[p]); - } - - this._pubCache = new Key({ - type: this.type, - source: this, - parts: pubParts - }); - if (this.comment) - this._pubCache.comment = this.comment; - return (this._pubCache); -}; - -PrivateKey.prototype.derive = function (newType) { - assert.string(newType, 'type'); - var priv, pub, pair; - - if (this.type === 'ed25519' && newType === 'curve25519') { - priv = this.part.k.data; - if (priv[0] === 0x00) - priv = priv.slice(1); - - pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); - pub = Buffer.from(pair.publicKey); - - return (new PrivateKey({ - type: 'curve25519', - parts: [ - { name: 'A', data: utils.mpNormalize(pub) }, - { name: 'k', data: utils.mpNormalize(priv) } - ] - })); - } else if (this.type === 'curve25519' && newType === 'ed25519') { - priv = this.part.k.data; - if (priv[0] === 0x00) - priv = priv.slice(1); - - pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); - pub = Buffer.from(pair.publicKey); - - return (new PrivateKey({ - type: 'ed25519', - parts: [ - { name: 'A', data: utils.mpNormalize(pub) }, - { name: 'k', data: utils.mpNormalize(priv) } - ] - })); - } - throw (new Error('Key derivation not supported from ' + this.type + - ' to ' + newType)); -}; - -PrivateKey.prototype.createVerify = function (hashAlgo) { - return (this.toPublic().createVerify(hashAlgo)); -}; - -PrivateKey.prototype.createSign = function (hashAlgo) { - if (hashAlgo === undefined) - hashAlgo = this.defaultHashAlgorithm(); - assert.string(hashAlgo, 'hash algorithm'); - - /* ED25519 is not supported by OpenSSL, use a javascript impl. */ - if (this.type === 'ed25519' && edCompat !== undefined) - return (new edCompat.Signer(this, hashAlgo)); - if (this.type === 'curve25519') - throw (new Error('Curve25519 keys are not suitable for ' + - 'signing or verification')); - - var v, nm, err; - try { - nm = hashAlgo.toUpperCase(); - v = crypto.createSign(nm); - } catch (e) { - err = e; - } - if (v === undefined || (err instanceof Error && - err.message.match(/Unknown message digest/))) { - nm = 'RSA-'; - nm += hashAlgo.toUpperCase(); - v = crypto.createSign(nm); - } - assert.ok(v, 'failed to create verifier'); - var oldSign = v.sign.bind(v); - var key = this.toBuffer('pkcs1'); - var type = this.type; - var curve = this.curve; - v.sign = function () { - var sig = oldSign(key); - if (typeof (sig) === 'string') - sig = Buffer.from(sig, 'binary'); - sig = Signature.parse(sig, type, 'asn1'); - sig.hashAlgorithm = hashAlgo; - sig.curve = curve; - return (sig); - }; - return (v); -}; - -PrivateKey.parse = function (data, format, options) { - if (typeof (data) !== 'string') - assert.buffer(data, 'data'); - if (format === undefined) - format = 'auto'; - assert.string(format, 'format'); - if (typeof (options) === 'string') - options = { filename: options }; - assert.optionalObject(options, 'options'); - if (options === undefined) - options = {}; - assert.optionalString(options.filename, 'options.filename'); - if (options.filename === undefined) - options.filename = '(unnamed)'; - - assert.object(formats[format], 'formats[format]'); - - try { - var k = formats[format].read(data, options); - assert.ok(k instanceof PrivateKey, 'key is not a private key'); - if (!k.comment) - k.comment = options.filename; - return (k); - } catch (e) { - if (e.name === 'KeyEncryptedError') - throw (e); - throw (new KeyParseError(options.filename, format, e)); - } -}; - -PrivateKey.isPrivateKey = function (obj, ver) { - return (utils.isCompatible(obj, PrivateKey, ver)); -}; - -PrivateKey.generate = function (type, options) { - if (options === undefined) - options = {}; - assert.object(options, 'options'); - - switch (type) { - case 'ecdsa': - if (options.curve === undefined) - options.curve = 'nistp256'; - assert.string(options.curve, 'options.curve'); - return (generateECDSA(options.curve)); - case 'ed25519': - return (generateED25519()); - default: - throw (new Error('Key generation not supported with key ' + - 'type "' + type + '"')); - } -}; - -/* - * API versions for PrivateKey: - * [1,0] -- initial ver - * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats - * [1,2] -- added defaultHashAlgorithm - * [1,3] -- added derive, ed, createDH - * [1,4] -- first tagged version - * [1,5] -- changed ed25519 part names and format - * [1,6] -- type arguments for hash() and fingerprint() - */ -PrivateKey.prototype._sshpkApiVersion = [1, 6]; - -PrivateKey._oldVersionDetect = function (obj) { - assert.func(obj.toPublic); - assert.func(obj.createSign); - if (obj.derive) - return ([1, 3]); - if (obj.defaultHashAlgorithm) - return ([1, 2]); - if (obj.formats['auto']) - return ([1, 1]); - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/signature.js b/node_modules/sshpk/lib/signature.js deleted file mode 100644 index aa8fdbb8..00000000 --- a/node_modules/sshpk/lib/signature.js +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = Signature; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var algs = require('./algs'); -var crypto = require('crypto'); -var errs = require('./errors'); -var utils = require('./utils'); -var asn1 = require('asn1'); -var SSHBuffer = require('./ssh-buffer'); - -var InvalidAlgorithmError = errs.InvalidAlgorithmError; -var SignatureParseError = errs.SignatureParseError; - -function Signature(opts) { - assert.object(opts, 'options'); - assert.arrayOfObject(opts.parts, 'options.parts'); - assert.string(opts.type, 'options.type'); - - var partLookup = {}; - for (var i = 0; i < opts.parts.length; ++i) { - var part = opts.parts[i]; - partLookup[part.name] = part; - } - - this.type = opts.type; - this.hashAlgorithm = opts.hashAlgo; - this.curve = opts.curve; - this.parts = opts.parts; - this.part = partLookup; -} - -Signature.prototype.toBuffer = function (format) { - if (format === undefined) - format = 'asn1'; - assert.string(format, 'format'); - - var buf; - var stype = 'ssh-' + this.type; - - switch (this.type) { - case 'rsa': - switch (this.hashAlgorithm) { - case 'sha256': - stype = 'rsa-sha2-256'; - break; - case 'sha512': - stype = 'rsa-sha2-512'; - break; - case 'sha1': - case undefined: - break; - default: - throw (new Error('SSH signature ' + - 'format does not support hash ' + - 'algorithm ' + this.hashAlgorithm)); - } - if (format === 'ssh') { - buf = new SSHBuffer({}); - buf.writeString(stype); - buf.writePart(this.part.sig); - return (buf.toBuffer()); - } else { - return (this.part.sig.data); - } - break; - - case 'ed25519': - if (format === 'ssh') { - buf = new SSHBuffer({}); - buf.writeString(stype); - buf.writePart(this.part.sig); - return (buf.toBuffer()); - } else { - return (this.part.sig.data); - } - break; - - case 'dsa': - case 'ecdsa': - var r, s; - if (format === 'asn1') { - var der = new asn1.BerWriter(); - der.startSequence(); - r = utils.mpNormalize(this.part.r.data); - s = utils.mpNormalize(this.part.s.data); - der.writeBuffer(r, asn1.Ber.Integer); - der.writeBuffer(s, asn1.Ber.Integer); - der.endSequence(); - return (der.buffer); - } else if (format === 'ssh' && this.type === 'dsa') { - buf = new SSHBuffer({}); - buf.writeString('ssh-dss'); - r = this.part.r.data; - if (r.length > 20 && r[0] === 0x00) - r = r.slice(1); - s = this.part.s.data; - if (s.length > 20 && s[0] === 0x00) - s = s.slice(1); - if ((this.hashAlgorithm && - this.hashAlgorithm !== 'sha1') || - r.length + s.length !== 40) { - throw (new Error('OpenSSH only supports ' + - 'DSA signatures with SHA1 hash')); - } - buf.writeBuffer(Buffer.concat([r, s])); - return (buf.toBuffer()); - } else if (format === 'ssh' && this.type === 'ecdsa') { - var inner = new SSHBuffer({}); - r = this.part.r.data; - inner.writeBuffer(r); - inner.writePart(this.part.s); - - buf = new SSHBuffer({}); - /* XXX: find a more proper way to do this? */ - var curve; - if (r[0] === 0x00) - r = r.slice(1); - var sz = r.length * 8; - if (sz === 256) - curve = 'nistp256'; - else if (sz === 384) - curve = 'nistp384'; - else if (sz === 528) - curve = 'nistp521'; - buf.writeString('ecdsa-sha2-' + curve); - buf.writeBuffer(inner.toBuffer()); - return (buf.toBuffer()); - } - throw (new Error('Invalid signature format')); - default: - throw (new Error('Invalid signature data')); - } -}; - -Signature.prototype.toString = function (format) { - assert.optionalString(format, 'format'); - return (this.toBuffer(format).toString('base64')); -}; - -Signature.parse = function (data, type, format) { - if (typeof (data) === 'string') - data = Buffer.from(data, 'base64'); - assert.buffer(data, 'data'); - assert.string(format, 'format'); - assert.string(type, 'type'); - - var opts = {}; - opts.type = type.toLowerCase(); - opts.parts = []; - - try { - assert.ok(data.length > 0, 'signature must not be empty'); - switch (opts.type) { - case 'rsa': - return (parseOneNum(data, type, format, opts)); - case 'ed25519': - return (parseOneNum(data, type, format, opts)); - - case 'dsa': - case 'ecdsa': - if (format === 'asn1') - return (parseDSAasn1(data, type, format, opts)); - else if (opts.type === 'dsa') - return (parseDSA(data, type, format, opts)); - else - return (parseECDSA(data, type, format, opts)); - - default: - throw (new InvalidAlgorithmError(type)); - } - - } catch (e) { - if (e instanceof InvalidAlgorithmError) - throw (e); - throw (new SignatureParseError(type, format, e)); - } -}; - -function parseOneNum(data, type, format, opts) { - if (format === 'ssh') { - try { - var buf = new SSHBuffer({buffer: data}); - var head = buf.readString(); - } catch (e) { - /* fall through */ - } - if (buf !== undefined) { - var msg = 'SSH signature does not match expected ' + - 'type (expected ' + type + ', got ' + head + ')'; - switch (head) { - case 'ssh-rsa': - assert.strictEqual(type, 'rsa', msg); - opts.hashAlgo = 'sha1'; - break; - case 'rsa-sha2-256': - assert.strictEqual(type, 'rsa', msg); - opts.hashAlgo = 'sha256'; - break; - case 'rsa-sha2-512': - assert.strictEqual(type, 'rsa', msg); - opts.hashAlgo = 'sha512'; - break; - case 'ssh-ed25519': - assert.strictEqual(type, 'ed25519', msg); - opts.hashAlgo = 'sha512'; - break; - default: - throw (new Error('Unknown SSH signature ' + - 'type: ' + head)); - } - var sig = buf.readPart(); - assert.ok(buf.atEnd(), 'extra trailing bytes'); - sig.name = 'sig'; - opts.parts.push(sig); - return (new Signature(opts)); - } - } - opts.parts.push({name: 'sig', data: data}); - return (new Signature(opts)); -} - -function parseDSAasn1(data, type, format, opts) { - var der = new asn1.BerReader(data); - der.readSequence(); - var r = der.readString(asn1.Ber.Integer, true); - var s = der.readString(asn1.Ber.Integer, true); - - opts.parts.push({name: 'r', data: utils.mpNormalize(r)}); - opts.parts.push({name: 's', data: utils.mpNormalize(s)}); - - return (new Signature(opts)); -} - -function parseDSA(data, type, format, opts) { - if (data.length != 40) { - var buf = new SSHBuffer({buffer: data}); - var d = buf.readBuffer(); - if (d.toString('ascii') === 'ssh-dss') - d = buf.readBuffer(); - assert.ok(buf.atEnd(), 'extra trailing bytes'); - assert.strictEqual(d.length, 40, 'invalid inner length'); - data = d; - } - opts.parts.push({name: 'r', data: data.slice(0, 20)}); - opts.parts.push({name: 's', data: data.slice(20, 40)}); - return (new Signature(opts)); -} - -function parseECDSA(data, type, format, opts) { - var buf = new SSHBuffer({buffer: data}); - - var r, s; - var inner = buf.readBuffer(); - var stype = inner.toString('ascii'); - if (stype.slice(0, 6) === 'ecdsa-') { - var parts = stype.split('-'); - assert.strictEqual(parts[0], 'ecdsa'); - assert.strictEqual(parts[1], 'sha2'); - opts.curve = parts[2]; - switch (opts.curve) { - case 'nistp256': - opts.hashAlgo = 'sha256'; - break; - case 'nistp384': - opts.hashAlgo = 'sha384'; - break; - case 'nistp521': - opts.hashAlgo = 'sha512'; - break; - default: - throw (new Error('Unsupported ECDSA curve: ' + - opts.curve)); - } - inner = buf.readBuffer(); - assert.ok(buf.atEnd(), 'extra trailing bytes on outer'); - buf = new SSHBuffer({buffer: inner}); - r = buf.readPart(); - } else { - r = {data: inner}; - } - - s = buf.readPart(); - assert.ok(buf.atEnd(), 'extra trailing bytes'); - - r.name = 'r'; - s.name = 's'; - - opts.parts.push(r); - opts.parts.push(s); - return (new Signature(opts)); -} - -Signature.isSignature = function (obj, ver) { - return (utils.isCompatible(obj, Signature, ver)); -}; - -/* - * API versions for Signature: - * [1,0] -- initial ver - * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent - * hashAlgorithm property - * [2,1] -- first tagged version - */ -Signature.prototype._sshpkApiVersion = [2, 1]; - -Signature._oldVersionDetect = function (obj) { - assert.func(obj.toBuffer); - if (obj.hasOwnProperty('hashAlgorithm')) - return ([2, 0]); - return ([1, 0]); -}; diff --git a/node_modules/sshpk/lib/ssh-buffer.js b/node_modules/sshpk/lib/ssh-buffer.js deleted file mode 100644 index 1dd286c8..00000000 --- a/node_modules/sshpk/lib/ssh-buffer.js +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = SSHBuffer; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; - -function SSHBuffer(opts) { - assert.object(opts, 'options'); - if (opts.buffer !== undefined) - assert.buffer(opts.buffer, 'options.buffer'); - - this._size = opts.buffer ? opts.buffer.length : 1024; - this._buffer = opts.buffer || Buffer.alloc(this._size); - this._offset = 0; -} - -SSHBuffer.prototype.toBuffer = function () { - return (this._buffer.slice(0, this._offset)); -}; - -SSHBuffer.prototype.atEnd = function () { - return (this._offset >= this._buffer.length); -}; - -SSHBuffer.prototype.remainder = function () { - return (this._buffer.slice(this._offset)); -}; - -SSHBuffer.prototype.skip = function (n) { - this._offset += n; -}; - -SSHBuffer.prototype.expand = function () { - this._size *= 2; - var buf = Buffer.alloc(this._size); - this._buffer.copy(buf, 0); - this._buffer = buf; -}; - -SSHBuffer.prototype.readPart = function () { - return ({data: this.readBuffer()}); -}; - -SSHBuffer.prototype.readBuffer = function () { - var len = this._buffer.readUInt32BE(this._offset); - this._offset += 4; - assert.ok(this._offset + len <= this._buffer.length, - 'length out of bounds at +0x' + this._offset.toString(16) + - ' (data truncated?)'); - var buf = this._buffer.slice(this._offset, this._offset + len); - this._offset += len; - return (buf); -}; - -SSHBuffer.prototype.readString = function () { - return (this.readBuffer().toString()); -}; - -SSHBuffer.prototype.readCString = function () { - var offset = this._offset; - while (offset < this._buffer.length && - this._buffer[offset] !== 0x00) - offset++; - assert.ok(offset < this._buffer.length, 'c string does not terminate'); - var str = this._buffer.slice(this._offset, offset).toString(); - this._offset = offset + 1; - return (str); -}; - -SSHBuffer.prototype.readInt = function () { - var v = this._buffer.readUInt32BE(this._offset); - this._offset += 4; - return (v); -}; - -SSHBuffer.prototype.readInt64 = function () { - assert.ok(this._offset + 8 < this._buffer.length, - 'buffer not long enough to read Int64'); - var v = this._buffer.slice(this._offset, this._offset + 8); - this._offset += 8; - return (v); -}; - -SSHBuffer.prototype.readChar = function () { - var v = this._buffer[this._offset++]; - return (v); -}; - -SSHBuffer.prototype.writeBuffer = function (buf) { - while (this._offset + 4 + buf.length > this._size) - this.expand(); - this._buffer.writeUInt32BE(buf.length, this._offset); - this._offset += 4; - buf.copy(this._buffer, this._offset); - this._offset += buf.length; -}; - -SSHBuffer.prototype.writeString = function (str) { - this.writeBuffer(Buffer.from(str, 'utf8')); -}; - -SSHBuffer.prototype.writeCString = function (str) { - while (this._offset + 1 + str.length > this._size) - this.expand(); - this._buffer.write(str, this._offset); - this._offset += str.length; - this._buffer[this._offset++] = 0; -}; - -SSHBuffer.prototype.writeInt = function (v) { - while (this._offset + 4 > this._size) - this.expand(); - this._buffer.writeUInt32BE(v, this._offset); - this._offset += 4; -}; - -SSHBuffer.prototype.writeInt64 = function (v) { - assert.buffer(v, 'value'); - if (v.length > 8) { - var lead = v.slice(0, v.length - 8); - for (var i = 0; i < lead.length; ++i) { - assert.strictEqual(lead[i], 0, - 'must fit in 64 bits of precision'); - } - v = v.slice(v.length - 8, v.length); - } - while (this._offset + 8 > this._size) - this.expand(); - v.copy(this._buffer, this._offset); - this._offset += 8; -}; - -SSHBuffer.prototype.writeChar = function (v) { - while (this._offset + 1 > this._size) - this.expand(); - this._buffer[this._offset++] = v; -}; - -SSHBuffer.prototype.writePart = function (p) { - this.writeBuffer(p.data); -}; - -SSHBuffer.prototype.write = function (buf) { - while (this._offset + buf.length > this._size) - this.expand(); - buf.copy(this._buffer, this._offset); - this._offset += buf.length; -}; diff --git a/node_modules/sshpk/lib/utils.js b/node_modules/sshpk/lib/utils.js deleted file mode 100644 index 6b83a322..00000000 --- a/node_modules/sshpk/lib/utils.js +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2015 Joyent, Inc. - -module.exports = { - bufferSplit: bufferSplit, - addRSAMissing: addRSAMissing, - calculateDSAPublic: calculateDSAPublic, - calculateED25519Public: calculateED25519Public, - calculateX25519Public: calculateX25519Public, - mpNormalize: mpNormalize, - mpDenormalize: mpDenormalize, - ecNormalize: ecNormalize, - countZeros: countZeros, - assertCompatible: assertCompatible, - isCompatible: isCompatible, - opensslKeyDeriv: opensslKeyDeriv, - opensshCipherInfo: opensshCipherInfo, - publicFromPrivateECDSA: publicFromPrivateECDSA, - zeroPadToLength: zeroPadToLength, - writeBitString: writeBitString, - readBitString: readBitString, - pbkdf2: pbkdf2 -}; - -var assert = require('assert-plus'); -var Buffer = require('safer-buffer').Buffer; -var PrivateKey = require('./private-key'); -var Key = require('./key'); -var crypto = require('crypto'); -var algs = require('./algs'); -var asn1 = require('asn1'); - -var ec = require('ecc-jsbn/lib/ec'); -var jsbn = require('jsbn').BigInteger; -var nacl = require('tweetnacl'); - -var MAX_CLASS_DEPTH = 3; - -function isCompatible(obj, klass, needVer) { - if (obj === null || typeof (obj) !== 'object') - return (false); - if (needVer === undefined) - needVer = klass.prototype._sshpkApiVersion; - if (obj instanceof klass && - klass.prototype._sshpkApiVersion[0] == needVer[0]) - return (true); - var proto = Object.getPrototypeOf(obj); - var depth = 0; - while (proto.constructor.name !== klass.name) { - proto = Object.getPrototypeOf(proto); - if (!proto || ++depth > MAX_CLASS_DEPTH) - return (false); - } - if (proto.constructor.name !== klass.name) - return (false); - var ver = proto._sshpkApiVersion; - if (ver === undefined) - ver = klass._oldVersionDetect(obj); - if (ver[0] != needVer[0] || ver[1] < needVer[1]) - return (false); - return (true); -} - -function assertCompatible(obj, klass, needVer, name) { - if (name === undefined) - name = 'object'; - assert.ok(obj, name + ' must not be null'); - assert.object(obj, name + ' must be an object'); - if (needVer === undefined) - needVer = klass.prototype._sshpkApiVersion; - if (obj instanceof klass && - klass.prototype._sshpkApiVersion[0] == needVer[0]) - return; - var proto = Object.getPrototypeOf(obj); - var depth = 0; - while (proto.constructor.name !== klass.name) { - proto = Object.getPrototypeOf(proto); - assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, - name + ' must be a ' + klass.name + ' instance'); - } - assert.strictEqual(proto.constructor.name, klass.name, - name + ' must be a ' + klass.name + ' instance'); - var ver = proto._sshpkApiVersion; - if (ver === undefined) - ver = klass._oldVersionDetect(obj); - assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], - name + ' must be compatible with ' + klass.name + ' klass ' + - 'version ' + needVer[0] + '.' + needVer[1]); -} - -var CIPHER_LEN = { - 'des-ede3-cbc': { key: 24, iv: 8 }, - 'aes-128-cbc': { key: 16, iv: 16 }, - 'aes-256-cbc': { key: 32, iv: 16 } -}; -var PKCS5_SALT_LEN = 8; - -function opensslKeyDeriv(cipher, salt, passphrase, count) { - assert.buffer(salt, 'salt'); - assert.buffer(passphrase, 'passphrase'); - assert.number(count, 'iteration count'); - - var clen = CIPHER_LEN[cipher]; - assert.object(clen, 'supported cipher'); - - salt = salt.slice(0, PKCS5_SALT_LEN); - - var D, D_prev, bufs; - var material = Buffer.alloc(0); - while (material.length < clen.key + clen.iv) { - bufs = []; - if (D_prev) - bufs.push(D_prev); - bufs.push(passphrase); - bufs.push(salt); - D = Buffer.concat(bufs); - for (var j = 0; j < count; ++j) - D = crypto.createHash('md5').update(D).digest(); - material = Buffer.concat([material, D]); - D_prev = D; - } - - return ({ - key: material.slice(0, clen.key), - iv: material.slice(clen.key, clen.key + clen.iv) - }); -} - -/* See: RFC2898 */ -function pbkdf2(hashAlg, salt, iterations, size, passphrase) { - var hkey = Buffer.alloc(salt.length + 4); - salt.copy(hkey); - - var gen = 0, ts = []; - var i = 1; - while (gen < size) { - var t = T(i++); - gen += t.length; - ts.push(t); - } - return (Buffer.concat(ts).slice(0, size)); - - function T(I) { - hkey.writeUInt32BE(I, hkey.length - 4); - - var hmac = crypto.createHmac(hashAlg, passphrase); - hmac.update(hkey); - - var Ti = hmac.digest(); - var Uc = Ti; - var c = 1; - while (c++ < iterations) { - hmac = crypto.createHmac(hashAlg, passphrase); - hmac.update(Uc); - Uc = hmac.digest(); - for (var x = 0; x < Ti.length; ++x) - Ti[x] ^= Uc[x]; - } - return (Ti); - } -} - -/* Count leading zero bits on a buffer */ -function countZeros(buf) { - var o = 0, obit = 8; - while (o < buf.length) { - var mask = (1 << obit); - if ((buf[o] & mask) === mask) - break; - obit--; - if (obit < 0) { - o++; - obit = 8; - } - } - return (o*8 + (8 - obit) - 1); -} - -function bufferSplit(buf, chr) { - assert.buffer(buf); - assert.string(chr); - - var parts = []; - var lastPart = 0; - var matches = 0; - for (var i = 0; i < buf.length; ++i) { - if (buf[i] === chr.charCodeAt(matches)) - ++matches; - else if (buf[i] === chr.charCodeAt(0)) - matches = 1; - else - matches = 0; - - if (matches >= chr.length) { - var newPart = i + 1; - parts.push(buf.slice(lastPart, newPart - matches)); - lastPart = newPart; - matches = 0; - } - } - if (lastPart <= buf.length) - parts.push(buf.slice(lastPart, buf.length)); - - return (parts); -} - -function ecNormalize(buf, addZero) { - assert.buffer(buf); - if (buf[0] === 0x00 && buf[1] === 0x04) { - if (addZero) - return (buf); - return (buf.slice(1)); - } else if (buf[0] === 0x04) { - if (!addZero) - return (buf); - } else { - while (buf[0] === 0x00) - buf = buf.slice(1); - if (buf[0] === 0x02 || buf[0] === 0x03) - throw (new Error('Compressed elliptic curve points ' + - 'are not supported')); - if (buf[0] !== 0x04) - throw (new Error('Not a valid elliptic curve point')); - if (!addZero) - return (buf); - } - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x0; - buf.copy(b, 1); - return (b); -} - -function readBitString(der, tag) { - if (tag === undefined) - tag = asn1.Ber.BitString; - var buf = der.readString(tag, true); - assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + - 'not supported (0x' + buf[0].toString(16) + ')'); - return (buf.slice(1)); -} - -function writeBitString(der, buf, tag) { - if (tag === undefined) - tag = asn1.Ber.BitString; - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - der.writeBuffer(b, tag); -} - -function mpNormalize(buf) { - assert.buffer(buf); - while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) - buf = buf.slice(1); - if ((buf[0] & 0x80) === 0x80) { - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - buf = b; - } - return (buf); -} - -function mpDenormalize(buf) { - assert.buffer(buf); - while (buf.length > 1 && buf[0] === 0x00) - buf = buf.slice(1); - return (buf); -} - -function zeroPadToLength(buf, len) { - assert.buffer(buf); - assert.number(len); - while (buf.length > len) { - assert.equal(buf[0], 0x00); - buf = buf.slice(1); - } - while (buf.length < len) { - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - buf = b; - } - return (buf); -} - -function bigintToMpBuf(bigint) { - var buf = Buffer.from(bigint.toByteArray()); - buf = mpNormalize(buf); - return (buf); -} - -function calculateDSAPublic(g, p, x) { - assert.buffer(g); - assert.buffer(p); - assert.buffer(x); - g = new jsbn(g); - p = new jsbn(p); - x = new jsbn(x); - var y = g.modPow(x, p); - var ybuf = bigintToMpBuf(y); - return (ybuf); -} - -function calculateED25519Public(k) { - assert.buffer(k); - - var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); - return (Buffer.from(kp.publicKey)); -} - -function calculateX25519Public(k) { - assert.buffer(k); - - var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); - return (Buffer.from(kp.publicKey)); -} - -function addRSAMissing(key) { - assert.object(key); - assertCompatible(key, PrivateKey, [1, 1]); - - var d = new jsbn(key.part.d.data); - var buf; - - if (!key.part.dmodp) { - var p = new jsbn(key.part.p.data); - var dmodp = d.mod(p.subtract(1)); - - buf = bigintToMpBuf(dmodp); - key.part.dmodp = {name: 'dmodp', data: buf}; - key.parts.push(key.part.dmodp); - } - if (!key.part.dmodq) { - var q = new jsbn(key.part.q.data); - var dmodq = d.mod(q.subtract(1)); - - buf = bigintToMpBuf(dmodq); - key.part.dmodq = {name: 'dmodq', data: buf}; - key.parts.push(key.part.dmodq); - } -} - -function publicFromPrivateECDSA(curveName, priv) { - assert.string(curveName, 'curveName'); - assert.buffer(priv); - var params = algs.curves[curveName]; - var p = new jsbn(params.p); - var a = new jsbn(params.a); - var b = new jsbn(params.b); - var curve = new ec.ECCurveFp(p, a, b); - var G = curve.decodePointHex(params.G.toString('hex')); - - var d = new jsbn(mpNormalize(priv)); - var pub = G.multiply(d); - pub = Buffer.from(curve.encodePointHex(pub), 'hex'); - - var parts = []; - parts.push({name: 'curve', data: Buffer.from(curveName)}); - parts.push({name: 'Q', data: pub}); - - var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); - return (key); -} - -function opensshCipherInfo(cipher) { - var inf = {}; - switch (cipher) { - case '3des-cbc': - inf.keySize = 24; - inf.blockSize = 8; - inf.opensslName = 'des-ede3-cbc'; - break; - case 'blowfish-cbc': - inf.keySize = 16; - inf.blockSize = 8; - inf.opensslName = 'bf-cbc'; - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'aes128-gcm@openssh.com': - inf.keySize = 16; - inf.blockSize = 16; - inf.opensslName = 'aes-128-' + cipher.slice(7, 10); - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'aes192-gcm@openssh.com': - inf.keySize = 24; - inf.blockSize = 16; - inf.opensslName = 'aes-192-' + cipher.slice(7, 10); - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'aes256-gcm@openssh.com': - inf.keySize = 32; - inf.blockSize = 16; - inf.opensslName = 'aes-256-' + cipher.slice(7, 10); - break; - default: - throw (new Error( - 'Unsupported openssl cipher "' + cipher + '"')); - } - return (inf); -} diff --git a/node_modules/sshpk/man/man1/sshpk-conv.1 b/node_modules/sshpk/man/man1/sshpk-conv.1 deleted file mode 100644 index 0887dce2..00000000 --- a/node_modules/sshpk/man/man1/sshpk-conv.1 +++ /dev/null @@ -1,135 +0,0 @@ -.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 deleted file mode 100644 index 749916ba..00000000 --- a/node_modules/sshpk/man/man1/sshpk-sign.1 +++ /dev/null @@ -1,81 +0,0 @@ -.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 deleted file mode 100644 index f79169d2..00000000 --- a/node_modules/sshpk/man/man1/sshpk-verify.1 +++ /dev/null @@ -1,68 +0,0 @@ -.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 deleted file mode 100644 index 967a8d3f..00000000 --- a/node_modules/sshpk/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "sshpk", - "version": "1.17.0", - "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/statuses/HISTORY.md b/node_modules/statuses/HISTORY.md deleted file mode 100644 index fa4556ef..00000000 --- a/node_modules/statuses/HISTORY.md +++ /dev/null @@ -1,82 +0,0 @@ -2.0.1 / 2021-01-03 -================== - - * Fix returning values from `Object.prototype` - -2.0.0 / 2020-04-19 -================== - - * Drop support for Node.js 0.6 - * Fix messaging casing of `418 I'm a Teapot` - * Remove code 306 - * Remove `status[code]` exports; use `status.message[code]` - * Remove `status[msg]` exports; use `status.code[msg]` - * Rename `425 Unordered Collection` to standard `425 Too Early` - * Rename `STATUS_CODES` export to `message` - * Return status message for `statuses(code)` when given code - -1.5.0 / 2018-03-27 -================== - - * Add `103 Early Hints` - -1.4.0 / 2017-10-20 -================== - - * Add `STATUS_CODES` export - -1.3.1 / 2016-11-11 -================== - - * Fix return type in JSDoc - -1.3.0 / 2016-05-17 -================== - - * Add `421 Misdirected Request` - * perf: enable strict mode - -1.2.1 / 2015-02-01 -================== - - * Fix message for status 451 - - `451 Unavailable For Legal Reasons` - -1.2.0 / 2014-09-28 -================== - - * Add `208 Already Repored` - * Add `226 IM Used` - * Add `306 (Unused)` - * Add `415 Unable For Legal Reasons` - * Add `508 Loop Detected` - -1.1.1 / 2014-09-24 -================== - - * Add missing 308 to `codes.json` - -1.1.0 / 2014-09-21 -================== - - * Add `codes.json` for universal support - -1.0.4 / 2014-08-20 -================== - - * Package cleanup - -1.0.3 / 2014-06-08 -================== - - * Add 308 to `.redirect` category - -1.0.2 / 2014-03-13 -================== - - * Add `.retry` category - -1.0.1 / 2014-03-12 -================== - - * Initial release diff --git a/node_modules/statuses/LICENSE b/node_modules/statuses/LICENSE deleted file mode 100644 index 28a31618..00000000 --- a/node_modules/statuses/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/statuses/README.md b/node_modules/statuses/README.md deleted file mode 100644 index 57967e6e..00000000 --- a/node_modules/statuses/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# statuses - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][ci-image]][ci-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -HTTP status utility for node. - -This module provides a list of status codes and messages sourced from -a few different projects: - - * The [IANA Status Code Registry](https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) - * The [Node.js project](https://nodejs.org/) - * The [NGINX project](https://www.nginx.com/) - * The [Apache HTTP Server project](https://httpd.apache.org/) - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install statuses -``` - -## API - - - -```js -var status = require('statuses') -``` - -### status(code) - -Returns the status message string for a known HTTP status code. The code -may be a number or a string. An error is thrown for an unknown status code. - - - -```js -status(403) // => 'Forbidden' -status('403') // => 'Forbidden' -status(306) // throws -``` - -### status(msg) - -Returns the numeric status code for a known HTTP status message. The message -is case-insensitive. An error is thrown for an unknown status message. - - - -```js -status('forbidden') // => 403 -status('Forbidden') // => 403 -status('foo') // throws -``` - -### status.codes - -Returns an array of all the status codes as `Integer`s. - -### status.code[msg] - -Returns the numeric status code for a known status message (in lower-case), -otherwise `undefined`. - - - -```js -status['not found'] // => 404 -``` - -### status.empty[code] - -Returns `true` if a status code expects an empty body. - - - -```js -status.empty[200] // => undefined -status.empty[204] // => true -status.empty[304] // => true -``` - -### status.message[code] - -Returns the string message for a known numeric status code, otherwise -`undefined`. This object is the same format as the -[Node.js http module `http.STATUS_CODES`](https://nodejs.org/dist/latest/docs/api/http.html#http_http_status_codes). - - - -```js -status.message[404] // => 'Not Found' -``` - -### status.redirect[code] - -Returns `true` if a status code is a valid redirect status. - - - -```js -status.redirect[200] // => undefined -status.redirect[301] // => true -``` - -### status.retry[code] - -Returns `true` if you should retry the rest. - - - -```js -status.retry[501] // => undefined -status.retry[503] // => true -``` - -## License - -[MIT](LICENSE) - -[ci-image]: https://badgen.net/github/checks/jshttp/statuses/master?label=ci -[ci-url]: https://github.com/jshttp/statuses/actions?query=workflow%3Aci -[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/statuses/master -[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master -[node-version-image]: https://badgen.net/npm/node/statuses -[node-version-url]: https://nodejs.org/en/download -[npm-downloads-image]: https://badgen.net/npm/dm/statuses -[npm-url]: https://npmjs.org/package/statuses -[npm-version-image]: https://badgen.net/npm/v/statuses diff --git a/node_modules/statuses/codes.json b/node_modules/statuses/codes.json deleted file mode 100644 index 1333ed10..00000000 --- a/node_modules/statuses/codes.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "100": "Continue", - "101": "Switching Protocols", - "102": "Processing", - "103": "Early Hints", - "200": "OK", - "201": "Created", - "202": "Accepted", - "203": "Non-Authoritative Information", - "204": "No Content", - "205": "Reset Content", - "206": "Partial Content", - "207": "Multi-Status", - "208": "Already Reported", - "226": "IM Used", - "300": "Multiple Choices", - "301": "Moved Permanently", - "302": "Found", - "303": "See Other", - "304": "Not Modified", - "305": "Use Proxy", - "307": "Temporary Redirect", - "308": "Permanent Redirect", - "400": "Bad Request", - "401": "Unauthorized", - "402": "Payment Required", - "403": "Forbidden", - "404": "Not Found", - "405": "Method Not Allowed", - "406": "Not Acceptable", - "407": "Proxy Authentication Required", - "408": "Request Timeout", - "409": "Conflict", - "410": "Gone", - "411": "Length Required", - "412": "Precondition Failed", - "413": "Payload Too Large", - "414": "URI Too Long", - "415": "Unsupported Media Type", - "416": "Range Not Satisfiable", - "417": "Expectation Failed", - "418": "I'm a Teapot", - "421": "Misdirected Request", - "422": "Unprocessable Entity", - "423": "Locked", - "424": "Failed Dependency", - "425": "Too Early", - "426": "Upgrade Required", - "428": "Precondition Required", - "429": "Too Many Requests", - "431": "Request Header Fields Too Large", - "451": "Unavailable For Legal Reasons", - "500": "Internal Server Error", - "501": "Not Implemented", - "502": "Bad Gateway", - "503": "Service Unavailable", - "504": "Gateway Timeout", - "505": "HTTP Version Not Supported", - "506": "Variant Also Negotiates", - "507": "Insufficient Storage", - "508": "Loop Detected", - "509": "Bandwidth Limit Exceeded", - "510": "Not Extended", - "511": "Network Authentication Required" -} diff --git a/node_modules/statuses/index.js b/node_modules/statuses/index.js deleted file mode 100644 index ea351c55..00000000 --- a/node_modules/statuses/index.js +++ /dev/null @@ -1,146 +0,0 @@ -/*! - * statuses - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var codes = require('./codes.json') - -/** - * Module exports. - * @public - */ - -module.exports = status - -// status code to message map -status.message = codes - -// status message (lower-case) to code map -status.code = createMessageToStatusCodeMap(codes) - -// array of status codes -status.codes = createStatusCodeList(codes) - -// status codes for redirects -status.redirect = { - 300: true, - 301: true, - 302: true, - 303: true, - 305: true, - 307: true, - 308: true -} - -// status codes for empty bodies -status.empty = { - 204: true, - 205: true, - 304: true -} - -// status codes for when you should retry the request -status.retry = { - 502: true, - 503: true, - 504: true -} - -/** - * Create a map of message to status code. - * @private - */ - -function createMessageToStatusCodeMap (codes) { - var map = {} - - Object.keys(codes).forEach(function forEachCode (code) { - var message = codes[code] - var status = Number(code) - - // populate map - map[message.toLowerCase()] = status - }) - - return map -} - -/** - * Create a list of all status codes. - * @private - */ - -function createStatusCodeList (codes) { - return Object.keys(codes).map(function mapCode (code) { - return Number(code) - }) -} - -/** - * Get the status code for given message. - * @private - */ - -function getStatusCode (message) { - var msg = message.toLowerCase() - - if (!Object.prototype.hasOwnProperty.call(status.code, msg)) { - throw new Error('invalid status message: "' + message + '"') - } - - return status.code[msg] -} - -/** - * Get the status message for given code. - * @private - */ - -function getStatusMessage (code) { - if (!Object.prototype.hasOwnProperty.call(status.message, code)) { - throw new Error('invalid status code: ' + code) - } - - return status.message[code] -} - -/** - * Get the status code. - * - * Given a number, this will throw if it is not a known status - * code, otherwise the code will be returned. Given a string, - * the string will be parsed for a number and return the code - * if valid, otherwise will lookup the code assuming this is - * the status message. - * - * @param {string|number} code - * @returns {number} - * @public - */ - -function status (code) { - if (typeof code === 'number') { - return getStatusMessage(code) - } - - if (typeof code !== 'string') { - throw new TypeError('code must be a number or string') - } - - // '403' - var n = parseInt(code, 10) - if (!isNaN(n)) { - return getStatusMessage(n) - } - - return getStatusCode(code) -} diff --git a/node_modules/statuses/package.json b/node_modules/statuses/package.json deleted file mode 100644 index 8c3e719b..00000000 --- a/node_modules/statuses/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "statuses", - "description": "HTTP status utility", - "version": "2.0.1", - "contributors": [ - "Douglas Christopher Wilson ", - "Jonathan Ong (http://jongleberry.com)" - ], - "repository": "jshttp/statuses", - "license": "MIT", - "keywords": [ - "http", - "status", - "code" - ], - "files": [ - "HISTORY.md", - "index.js", - "codes.json", - "LICENSE" - ], - "devDependencies": { - "csv-parse": "4.14.2", - "eslint": "7.17.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.22.1", - "eslint-plugin-markdown": "1.0.2", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "4.2.1", - "eslint-plugin-standard": "4.1.0", - "mocha": "8.2.1", - "nyc": "15.1.0", - "raw-body": "2.4.1", - "stream-to-array": "2.3.0" - }, - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "build": "node scripts/build.js", - "fetch": "node scripts/fetch-apache.js && node scripts/fetch-iana.js && node scripts/fetch-nginx.js && node scripts/fetch-node.js", - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "update": "npm run fetch && npm run build", - "version": "node scripts/version-history.js && git add HISTORY.md" - } -} diff --git a/node_modules/supports-color/browser.js b/node_modules/supports-color/browser.js deleted file mode 100644 index 62afa3a7..00000000 --- a/node_modules/supports-color/browser.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -module.exports = { - stdout: false, - stderr: false -}; diff --git a/node_modules/supports-color/index.js b/node_modules/supports-color/index.js deleted file mode 100644 index 1704131b..00000000 --- a/node_modules/supports-color/index.js +++ /dev/null @@ -1,131 +0,0 @@ -'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 deleted file mode 100644 index e7af2f77..00000000 --- a/node_modules/supports-color/license +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index ad199f5c..00000000 --- a/node_modules/supports-color/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "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 deleted file mode 100644 index f6e40195..00000000 --- a/node_modules/supports-color/readme.md +++ /dev/null @@ -1,66 +0,0 @@ -# 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/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE deleted file mode 100644 index 7cccaf9e..00000000 --- a/node_modules/to-regex-range/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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/to-regex-range/README.md b/node_modules/to-regex-range/README.md deleted file mode 100644 index 38887daf..00000000 --- a/node_modules/to-regex-range/README.md +++ /dev/null @@ -1,305 +0,0 @@ -# to-regex-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![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. - -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 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 -const toRegexRange = require('to-regex-range'); -const 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 07, 2019, this library runs [>1m test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are correct. - -Tests run in ~280ms on my MacBook Pro, 2.5 GHz Intel Core i7. - -### Optimized - -Generated regular expressions are 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 -const 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 -const source = toRegexRange('15', '95'); -//=> 1[5-9]|[2-8][0-9]|9[0-5] - -const regex = new RegExp(`^${source}$`); -console.log(regex.test('14')); //=> false -console.log(regex.test('50')); //=> true -console.log(regex.test('94')); //=> true -console.log(regex.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 relaxes matching for leading zeros when when ranges are zero-padded. - -```js -const source = toRegexRange('-0010', '0010'); -const regex = new RegExp(`^${source}$`); -console.log(regex.test('-10')); //=> true -console.log(regex.test('-010')); //=> true -console.log(regex.test('-0010')); //=> true -console.log(regex.test('10')); //=> true -console.log(regex.test('010')); //=> true -console.log(regex.test('0010')); //=> true -``` - -When `relaxZeros` is false, matching is strict: - -```js -const source = toRegexRange('-0010', '0010', { relaxZeros: false }); -const regex = new RegExp(`^${source}$`); -console.log(regex.test('-10')); //=> false -console.log(regex.test('-010')); //=> false -console.log(regex.test('-0010')); //=> true -console.log(regex.test('10')); //=> false -console.log(regex.test('010')); //=> false -console.log(regex.test('0010')); //=> true -``` - -## Examples - -| **Range** | **Result** | **Compile time** | -| --- | --- | --- | -| `toRegexRange(-10, 10)` | `-[1-9]\|-?10\|[0-9]` | _132μs_ | -| `toRegexRange(-100, -10)` | `-1[0-9]\|-[2-9][0-9]\|-100` | _50μs_ | -| `toRegexRange(-100, 100)` | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]` | _42μs_ | -| `toRegexRange(001, 100)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|100` | _109μs_ | -| `toRegexRange(001, 555)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _51μs_ | -| `toRegexRange(0010, 1000)` | `0{0,2}1[0-9]\|0{0,2}[2-9][0-9]\|0?[1-9][0-9]{2}\|1000` | _31μs_ | -| `toRegexRange(1, 50)` | `[1-9]\|[1-4][0-9]\|50` | _24μs_ | -| `toRegexRange(1, 55)` | `[1-9]\|[1-4][0-9]\|5[0-5]` | _23μs_ | -| `toRegexRange(1, 555)` | `[1-9]\|[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _30μs_ | -| `toRegexRange(1, 5555)` | `[1-9]\|[1-9][0-9]{1,2}\|[1-4][0-9]{3}\|5[0-4][0-9]{2}\|55[0-4][0-9]\|555[0-5]` | _43μ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]` | _38μs_ | -| `toRegexRange(29, 51)` | `29\|[34][0-9]\|5[01]` | _24μs_ | -| `toRegexRange(31, 877)` | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]` | _32μs_ | -| `toRegexRange(5, 5)` | `5` | _8μs_ | -| `toRegexRange(5, 6)` | `5\|6` | _11μs_ | -| `toRegexRange(1, 2)` | `1\|2` | _6μs_ | -| `toRegexRange(1, 5)` | `[1-5]` | _15μs_ | -| `toRegexRange(1, 10)` | `[1-9]\|10` | _22μs_ | -| `toRegexRange(1, 100)` | `[1-9]\|[1-9][0-9]\|100` | _25μs_ | -| `toRegexRange(1, 1000)` | `[1-9]\|[1-9][0-9]{1,2}\|1000` | _31μs_ | -| `toRegexRange(1, 10000)` | `[1-9]\|[1-9][0-9]{1,3}\|10000` | _34μs_ | -| `toRegexRange(1, 100000)` | `[1-9]\|[1-9][0-9]{1,4}\|100000` | _36μs_ | -| `toRegexRange(1, 1000000)` | `[1-9]\|[1-9][0-9]{1,5}\|1000000` | _42μs_ | -| `toRegexRange(1, 10000000)` | `[1-9]\|[1-9][0-9]{1,6}\|10000000` | _42μ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 - -
-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-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used… [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. 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/micromatch/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.") - -### Contributors - -| **Commits** | **Contributor** | -| --- | --- | -| 63 | [jonschlinkert](https://github.com/jonschlinkert) | -| 3 | [doowb](https://github.com/doowb) | -| 2 | [realityking](https://github.com/realityking) | - -### Author - -**Jon Schlinkert** - -* [GitHub Profile](https://github.com/jonschlinkert) -* [Twitter Profile](https://twitter.com/jonschlinkert) -* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) - -Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! - - - - - -### License - -Copyright © 2019, [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.8.0, on April 07, 2019._ \ No newline at end of file diff --git a/node_modules/to-regex-range/index.js b/node_modules/to-regex-range/index.js deleted file mode 100644 index 77fbaced..00000000 --- a/node_modules/to-regex-range/index.js +++ /dev/null @@ -1,288 +0,0 @@ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ - -'use strict'; - -const isNumber = require('is-number'); - -const toRegexRange = (min, max, options) => { - if (isNumber(min) === false) { - throw new TypeError('toRegexRange: expected the first argument to be a number'); - } - - if (max === void 0 || min === max) { - return String(min); - } - - if (isNumber(max) === false) { - throw new TypeError('toRegexRange: expected the second argument to be a number.'); - } - - let opts = { relaxZeros: true, ...options }; - if (typeof opts.strictZeros === 'boolean') { - opts.relaxZeros = opts.strictZeros === false; - } - - let relax = String(opts.relaxZeros); - let shorthand = String(opts.shorthand); - let capture = String(opts.capture); - let wrap = String(opts.wrap); - let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; - - if (toRegexRange.cache.hasOwnProperty(cacheKey)) { - return toRegexRange.cache[cacheKey].result; - } - - let a = Math.min(min, max); - let b = Math.max(min, max); - - if (Math.abs(a - b) === 1) { - let result = min + '|' + max; - if (opts.capture) { - return `(${result})`; - } - if (opts.wrap === false) { - return result; - } - return `(?:${result})`; - } - - let isPadded = hasPadding(min) || hasPadding(max); - let state = { min, max, a, b }; - let positives = []; - let negatives = []; - - if (isPadded) { - state.isPadded = isPadded; - state.maxLen = String(state.max).length; - } - - if (a < 0) { - let newMin = b < 0 ? Math.abs(b) : 1; - negatives = splitToPatterns(newMin, Math.abs(a), state, opts); - a = state.a = 0; - } - - if (b >= 0) { - positives = splitToPatterns(a, b, state, opts); - } - - state.negatives = negatives; - state.positives = positives; - state.result = collatePatterns(negatives, positives, opts); - - if (opts.capture === true) { - state.result = `(${state.result})`; - } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { - state.result = `(?:${state.result})`; - } - - toRegexRange.cache[cacheKey] = state; - return state.result; -}; - -function collatePatterns(neg, pos, options) { - let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; - let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; - let intersected = filterPatterns(neg, pos, '-?', true, options) || []; - let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); - return subpatterns.join('|'); -} - -function splitToRanges(min, max) { - let nines = 1; - let zeros = 1; - - let stop = countNines(min, nines); - let stops = new Set([max]); - - while (min <= stop && stop <= max) { - stops.add(stop); - nines += 1; - stop = countNines(min, nines); - } - - stop = countZeros(max + 1, zeros) - 1; - - while (min < stop && stop <= max) { - stops.add(stop); - zeros += 1; - stop = countZeros(max + 1, zeros) - 1; - } - - stops = [...stops]; - 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: start, count: [], digits: 0 }; - } - - let zipped = zip(start, stop); - let digits = zipped.length; - let pattern = ''; - let count = 0; - - for (let i = 0; i < digits; i++) { - let [startDigit, stopDigit] = zipped[i]; - - if (startDigit === stopDigit) { - pattern += startDigit; - - } else if (startDigit !== '0' || stopDigit !== '9') { - pattern += toCharacterClass(startDigit, stopDigit, options); - - } else { - count++; - } - } - - if (count) { - pattern += options.shorthand === true ? '\\d' : '[0-9]'; - } - - return { pattern, count: [count], digits }; -} - -function splitToPatterns(min, max, tok, options) { - let ranges = splitToRanges(min, max); - let tokens = []; - let start = min; - let prev; - - for (let i = 0; i < ranges.length; i++) { - let max = ranges[i]; - let obj = rangeToPattern(String(start), String(max), options); - let zeros = ''; - - if (!tok.isPadded && prev && prev.pattern === obj.pattern) { - if (prev.count.length > 1) { - prev.count.pop(); - } - - prev.count.push(obj.count[0]); - prev.string = prev.pattern + toQuantifier(prev.count); - start = max + 1; - continue; - } - - if (tok.isPadded) { - zeros = padZeros(max, tok, options); - } - - obj.string = zeros + obj.pattern + toQuantifier(obj.count); - tokens.push(obj); - start = max + 1; - prev = obj; - } - - return tokens; -} - -function filterPatterns(arr, comparison, prefix, intersection, options) { - let result = []; - - for (let ele of arr) { - let { string } = ele; - - // only push if _both_ are negative... - if (!intersection && !contains(comparison, 'string', string)) { - result.push(prefix + string); - } - - // or _both_ are positive - if (intersection && contains(comparison, 'string', string)) { - result.push(prefix + string); - } - } - return result; -} - -/** - * Zip strings - */ - -function zip(a, b) { - let arr = []; - for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); - return arr; -} - -function compare(a, b) { - return a > b ? 1 : b > a ? -1 : 0; -} - -function contains(arr, key, val) { - return arr.some(ele => ele[key] === val); -} - -function countNines(min, len) { - return Number(String(min).slice(0, -len) + '9'.repeat(len)); -} - -function countZeros(integer, zeros) { - return integer - (integer % Math.pow(10, zeros)); -} - -function toQuantifier(digits) { - let [start = 0, stop = ''] = digits; - if (stop || start > 1) { - return `{${start + (stop ? ',' + stop : '')}}`; - } - return ''; -} - -function toCharacterClass(a, b, options) { - return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; -} - -function hasPadding(str) { - return /^-?(0+)\d/.test(str); -} - -function padZeros(value, tok, options) { - if (!tok.isPadded) { - return value; - } - - let diff = Math.abs(tok.maxLen - String(value).length); - let relax = options.relaxZeros !== false; - - switch (diff) { - case 0: - return ''; - case 1: - return relax ? '0?' : '0'; - case 2: - return relax ? '0{0,2}' : '00'; - default: { - return relax ? `0{0,${diff}}` : `0{${diff}}`; - } - } -} - -/** - * Cache - */ - -toRegexRange.cache = {}; -toRegexRange.clearCache = () => (toRegexRange.cache = {}); - -/** - * Expose `toRegexRange` - */ - -module.exports = toRegexRange; diff --git a/node_modules/to-regex-range/package.json b/node_modules/to-regex-range/package.json deleted file mode 100644 index 4ef194f3..00000000 --- a/node_modules/to-regex-range/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "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": "5.0.1", - "homepage": "https://github.com/micromatch/to-regex-range", - "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "contributors": [ - "Jon Schlinkert (http://twitter.com/jonschlinkert)", - "Rouven Weßling (www.rouvenwessling.de)" - ], - "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": ">=8.0" - }, - "scripts": { - "test": "mocha" - }, - "dependencies": { - "is-number": "^7.0.0" - }, - "devDependencies": { - "fill-range": "^6.0.0", - "gulp-format-md": "^2.0.0", - "mocha": "^6.0.2", - "text-table": "^0.2.0", - "time-diff": "^0.3.1" - }, - "keywords": [ - "bash", - "date", - "expand", - "expansion", - "expression", - "glob", - "match", - "match date", - "match number", - "match numbers", - "match year", - "matches", - "matching", - "number", - "numbers", - "numerical", - "range", - "ranges", - "regex", - "regexp", - "regular", - "regular expression", - "sequence" - ], - "verb": { - "layout": "default", - "toc": false, - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - }, - "helpers": { - "examples": { - "displayName": "examples" - } - }, - "related": { - "list": [ - "expand-range", - "fill-range", - "micromatch", - "repeat-element", - "repeat-string" - ] - } - } -} diff --git a/node_modules/toidentifier/HISTORY.md b/node_modules/toidentifier/HISTORY.md deleted file mode 100644 index cb7cc892..00000000 --- a/node_modules/toidentifier/HISTORY.md +++ /dev/null @@ -1,9 +0,0 @@ -1.0.1 / 2021-11-14 -================== - - * pref: enable strict mode - -1.0.0 / 2018-07-09 -================== - - * Initial release diff --git a/node_modules/toidentifier/LICENSE b/node_modules/toidentifier/LICENSE deleted file mode 100644 index de22d159..00000000 --- a/node_modules/toidentifier/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/toidentifier/README.md b/node_modules/toidentifier/README.md deleted file mode 100644 index 57e8a78a..00000000 --- a/node_modules/toidentifier/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# toidentifier - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Build Status][github-actions-ci-image]][github-actions-ci-url] -[![Test Coverage][codecov-image]][codecov-url] - -> Convert a string of words to a JavaScript identifier - -## Install - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```bash -$ npm install toidentifier -``` - -## Example - -```js -var toIdentifier = require('toidentifier') - -console.log(toIdentifier('Bad Request')) -// => "BadRequest" -``` - -## API - -This CommonJS module exports a single default function: `toIdentifier`. - -### toIdentifier(string) - -Given a string as the argument, it will be transformed according to -the following rules and the new string will be returned: - -1. Split into words separated by space characters (`0x20`). -2. Upper case the first character of each word. -3. Join the words together with no separator. -4. Remove all non-word (`[0-9a-z_]`) characters. - -## License - -[MIT](LICENSE) - -[codecov-image]: https://img.shields.io/codecov/c/github/component/toidentifier.svg -[codecov-url]: https://codecov.io/gh/component/toidentifier -[downloads-image]: https://img.shields.io/npm/dm/toidentifier.svg -[downloads-url]: https://npmjs.org/package/toidentifier -[github-actions-ci-image]: https://img.shields.io/github/workflow/status/component/toidentifier/ci/master?label=ci -[github-actions-ci-url]: https://github.com/component/toidentifier?query=workflow%3Aci -[npm-image]: https://img.shields.io/npm/v/toidentifier.svg -[npm-url]: https://npmjs.org/package/toidentifier - - -## - -[npm]: https://www.npmjs.com/ - -[yarn]: https://yarnpkg.com/ diff --git a/node_modules/toidentifier/index.js b/node_modules/toidentifier/index.js deleted file mode 100644 index 9295d024..00000000 --- a/node_modules/toidentifier/index.js +++ /dev/null @@ -1,32 +0,0 @@ -/*! - * toidentifier - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = toIdentifier - -/** - * Trasform the given string into a JavaScript identifier - * - * @param {string} str - * @returns {string} - * @public - */ - -function toIdentifier (str) { - return str - .split(' ') - .map(function (token) { - return token.slice(0, 1).toUpperCase() + token.slice(1) - }) - .join('') - .replace(/[^ _0-9a-z]/gi, '') -} diff --git a/node_modules/toidentifier/package.json b/node_modules/toidentifier/package.json deleted file mode 100644 index 42db1a66..00000000 --- a/node_modules/toidentifier/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "toidentifier", - "description": "Convert a string of words to a JavaScript identifier", - "version": "1.0.1", - "author": "Douglas Christopher Wilson ", - "contributors": [ - "Douglas Christopher Wilson ", - "Nick Baugh (http://niftylettuce.com/)" - ], - "repository": "component/toidentifier", - "devDependencies": { - "eslint": "7.32.0", - "eslint-config-standard": "14.1.1", - "eslint-plugin-import": "2.25.3", - "eslint-plugin-markdown": "2.2.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-promise": "4.3.1", - "eslint-plugin-standard": "4.1.0", - "mocha": "9.1.3", - "nyc": "15.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "license": "MIT", - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "scripts": { - "lint": "eslint .", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "version": "node scripts/version-history.js && git add HISTORY.md" - } -} diff --git a/node_modules/touch/LICENSE b/node_modules/touch/LICENSE deleted file mode 100644 index 05eeeb88..00000000 --- a/node_modules/touch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -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/touch/README.md b/node_modules/touch/README.md deleted file mode 100644 index b5a361e6..00000000 --- a/node_modules/touch/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# node-touch - -For all your node touching needs. - -## Installing - -```bash -npm install touch -``` - -## CLI Usage: - -See `man touch` - -This package exports a binary called `nodetouch` that works mostly -like the unix builtin `touch(1)`. - -## API Usage: - -```javascript -var touch = require("touch") -``` - -Gives you the following functions: - -* `touch(filename, options, cb)` -* `touch.sync(filename, options)` -* `touch.ftouch(fd, options, cb)` -* `touch.ftouchSync(fd, options)` - -All the `options` objects are optional. - -All the async functions return a Promise. If a callback function is -provided, then it's attached to the Promise. - -## Options - -* `force` like `touch -f` Boolean -* `time` like `touch -t ` Can be a Date object, or any parseable - Date string, or epoch ms number. -* `atime` like `touch -a` Can be either a Boolean, or a Date. -* `mtime` like `touch -m` Can be either a Boolean, or a Date. -* `ref` like `touch -r ` Must be path to a file. -* `nocreate` like `touch -c` Boolean - -If neither `atime` nor `mtime` are set, then both values are set. If -one of them is set, then the other is not. - -## cli - -This package creates a `nodetouch` command line executable that works -very much like the unix builtin `touch(1)` diff --git a/node_modules/touch/bin/nodetouch.js b/node_modules/touch/bin/nodetouch.js deleted file mode 100755 index f78f0829..00000000 --- a/node_modules/touch/bin/nodetouch.js +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env node -const touch = require("../index.js") - -const usage = code => { - console[code ? 'error' : 'log']( - 'usage:\n' + - 'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...' - ) - process.exit(code) -} - -const singleFlags = { - a: 'atime', - m: 'mtime', - c: 'nocreate', - f: 'force' -} - -const singleOpts = { - r: 'ref', - t: 'time' -} - -const files = [] -const args = process.argv.slice(2) -const options = {} -for (let i = 0; i < args.length; i++) { - const arg = args[i] - if (!arg.match(/^-/)) { - files.push(arg) - continue - } - - // expand shorthands - if (arg.charAt(1) !== '-') { - const expand = [] - for (let f = 1; f < arg.length; f++) { - const fc = arg.charAt(f) - const sf = singleFlags[fc] - const so = singleOpts[fc] - if (sf) - expand.push('--' + sf) - else if (so) { - const soslice = arg.slice(f + 1) - const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice - expand.push('--' + so + soval) - f = arg.length - } else if (arg !== '-' + fc) - expand.push('-' + fc) - } - if (expand.length) { - args.splice.apply(args, [i, 1].concat(expand)) - i-- - continue - } - } - - const argsplit = arg.split('=') - const key = argsplit.shift().replace(/^\-\-/, '') - const val = argsplit.length ? argsplit.join('=') : null - - switch (key) { - case 'time': - const timestr = val || args[++i] - // [-t [[CC]YY]MMDDhhmm[.SS]] - const parsedtime = timestr.match( - /^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/ - ) - if (!parsedtime) { - console.error('touch: out of range or illegal ' + - 'time specification: ' + - '[[CC]YY]MMDDhhmm[.SS]') - process.exit(1) - } else { - const y = +parsedtime[1] - const year = parsedtime[2] ? y - : y <= 68 ? 2000 + y - : 1900 + y - - const MM = +parsedtime[4] - 1 - const dd = +parsedtime[5] - const hh = +parsedtime[6] - const mm = +parsedtime[7] - const ss = +parsedtime[8] - - options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss)) - } - continue - - case 'ref': - options.ref = val || args[++i] - continue - - case 'mtime': - case 'nocreate': - case 'atime': - case 'force': - options[key] = true - continue - - default: - console.error('touch: illegal option -- ' + arg) - usage(1) - } -} - -if (!files.length) - usage() - -process.exitCode = 0 -Promise.all(files.map(f => touch(f, options))) - .catch(er => process.exitCode = 1) diff --git a/node_modules/touch/index.js b/node_modules/touch/index.js deleted file mode 100644 index f942e42a..00000000 --- a/node_modules/touch/index.js +++ /dev/null @@ -1,224 +0,0 @@ -'use strict' - -const EE = require('events').EventEmitter -const cons = require('constants') -const fs = require('fs') - -module.exports = (f, options, cb) => { - if (typeof options === 'function') - cb = options, options = {} - - const p = new Promise((res, rej) => { - new Touch(validOpts(options, f, null)) - .on('done', res).on('error', rej) - }) - - return cb ? p.then(res => cb(null, res), cb) : p -} - -module.exports.sync = module.exports.touchSync = (f, options) => - (new TouchSync(validOpts(options, f, null)), undefined) - -module.exports.ftouch = (fd, options, cb) => { - if (typeof options === 'function') - cb = options, options = {} - - const p = new Promise((res, rej) => { - new Touch(validOpts(options, null, fd)) - .on('done', res).on('error', rej) - }) - - return cb ? p.then(res => cb(null, res), cb) : p -} - -module.exports.ftouchSync = (fd, opt) => - (new TouchSync(validOpts(opt, null, fd)), undefined) - -const validOpts = (options, path, fd) => { - options = Object.create(options || {}) - options.fd = fd - options.path = path - - // {mtime: true}, {ctime: true} - // If set to something else, then treat as epoch ms value - const now = parseInt(new Date(options.time || Date.now()).getTime() / 1000) - if (!options.atime && !options.mtime) - options.atime = options.mtime = now - else { - if (true === options.atime) - options.atime = now - - if (true === options.mtime) - options.mtime = now - } - - let oflags = 0 - if (!options.force) - oflags = oflags | cons.O_RDWR - - if (!options.nocreate) - oflags = oflags | cons.O_CREAT - - options.oflags = oflags - return options -} - -class Touch extends EE { - constructor (options) { - super(options) - this.fd = options.fd - this.path = options.path - this.atime = options.atime - this.mtime = options.mtime - this.ref = options.ref - this.nocreate = !!options.nocreate - this.force = !!options.force - this.closeAfter = options.closeAfter - this.oflags = options.oflags - this.options = options - - if (typeof this.fd !== 'number') { - this.closeAfter = true - this.open() - } else - this.onopen(null, this.fd) - } - - emit (ev, data) { - // we only emit when either done or erroring - // in both cases, need to close - this.close() - return super.emit(ev, data) - } - - close () { - if (typeof this.fd === 'number' && this.closeAfter) - fs.close(this.fd, () => {}) - } - - open () { - fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd)) - } - - onopen (er, fd) { - if (er) { - if (er.code === 'EISDIR') - this.onopen(null, null) - else if (er.code === 'ENOENT' && this.nocreate) - this.emit('done') - else - this.emit('error', er) - } else { - this.fd = fd - if (this.ref) - this.statref() - else if (!this.atime || !this.mtime) - this.fstat() - else - this.futimes() - } - } - - statref () { - fs.stat(this.ref, (er, st) => { - if (er) - this.emit('error', er) - else - this.onstatref(st) - }) - } - - onstatref (st) { - this.atime = this.atime && parseInt(st.atime.getTime()/1000, 10) - this.mtime = this.mtime && parseInt(st.mtime.getTime()/1000, 10) - if (!this.atime || !this.mtime) - this.fstat() - else - this.futimes() - } - - fstat () { - const stat = this.fd ? 'fstat' : 'stat' - const target = this.fd || this.path - fs[stat](target, (er, st) => { - if (er) - this.emit('error', er) - else - this.onfstat(st) - }) - } - - onfstat (st) { - if (typeof this.atime !== 'number') - this.atime = parseInt(st.atime.getTime()/1000, 10) - - if (typeof this.mtime !== 'number') - this.mtime = parseInt(st.mtime.getTime()/1000, 10) - - this.futimes() - } - - futimes () { - const utimes = this.fd ? 'futimes' : 'utimes' - const target = this.fd || this.path - fs[utimes](target, ''+this.atime, ''+this.mtime, er => { - if (er) - this.emit('error', er) - else - this.emit('done') - }) - } -} - -class TouchSync extends Touch { - open () { - try { - this.onopen(null, fs.openSync(this.path, this.oflags)) - } catch (er) { - this.onopen(er) - } - } - - statref () { - let threw = true - try { - this.onstatref(fs.statSync(this.ref)) - threw = false - } finally { - if (threw) - this.close() - } - } - - fstat () { - let threw = true - const stat = this.fd ? 'fstatSync' : 'statSync' - const target = this.fd || this.path - try { - this.onfstat(fs[stat](target)) - threw = false - } finally { - if (threw) - this.close() - } - } - - futimes () { - let threw = true - const utimes = this.fd ? 'futimesSync' : 'utimesSync' - const target = this.fd || this.path - try { - fs[utimes](target, this.atime, this.mtime) - threw = false - } finally { - if (threw) - this.close() - } - this.emit('done') - } - - close () { - if (typeof this.fd === 'number' && this.closeAfter) - try { fs.closeSync(this.fd) } catch (er) {} - } -} diff --git a/node_modules/touch/package.json b/node_modules/touch/package.json deleted file mode 100644 index 05608de3..00000000 --- a/node_modules/touch/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "name": "touch", - "description": "like touch(1) in node", - "version": "3.1.0", - "repository": "git://github.com/isaacs/node-touch.git", - "bin": { - "nodetouch": "./bin/nodetouch.js" - }, - "dependencies": { - "nopt": "~1.0.10" - }, - "license": "ISC", - "scripts": { - "test": "tap test/*.js --100 -J", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "devDependencies": { - "mutate-fs": "^1.1.0", - "tap": "^10.7.0" - }, - "files": [ - "index.js", - "bin/nodetouch.js" - ] -} diff --git a/node_modules/tough-cookie/LICENSE b/node_modules/tough-cookie/LICENSE deleted file mode 100644 index 22204e87..00000000 --- a/node_modules/tough-cookie/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index 656a2555..00000000 --- a/node_modules/tough-cookie/README.md +++ /dev/null @@ -1,527 +0,0 @@ -[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/lib/cookie.js b/node_modules/tough-cookie/lib/cookie.js deleted file mode 100644 index 32dc0f8d..00000000 --- a/node_modules/tough-cookie/lib/cookie.js +++ /dev/null @@ -1,1482 +0,0 @@ -/*! - * 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. - */ -'use strict'; -var net = require('net'); -var urlParse = require('url').parse; -var util = require('util'); -var pubsuffix = require('./pubsuffix-psl'); -var Store = require('./store').Store; -var MemoryCookieStore = require('./memstore').MemoryCookieStore; -var pathMatch = require('./pathMatch').pathMatch; -var VERSION = require('./version'); - -var punycode; -try { - punycode = require('punycode'); -} catch(e) { - console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization"); -} - -// From RFC6265 S4.1.1 -// note that it excludes \x3B ";" -var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; - -var CONTROL_CHARS = /[\x00-\x1F]/; - -// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in -// the "relaxed" mode, see: -// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60 -var TERMINATORS = ['\n', '\r', '\0']; - -// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' -// Note ';' is \x3B -var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; - -// date-time parsing constants (RFC6265 S5.1.1) - -var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; - -var MONTH_TO_NUM = { - jan:0, feb:1, mar:2, apr:3, may:4, jun:5, - jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 -}; -var NUM_TO_MONTH = [ - 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' -]; -var NUM_TO_DAY = [ - 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' -]; - -var MAX_TIME = 2147483647000; // 31-bit max -var MIN_TIME = 0; // 31-bit min - -/* - * Parses a Natural number (i.e., non-negative integer) with either the - * *DIGIT ( non-digit *OCTET ) - * or - * *DIGIT - * grammar (RFC6265 S5.1.1). - * - * The "trailingOK" boolean controls if the grammar accepts a - * "( non-digit *OCTET )" trailer. - */ -function parseDigits(token, minDigits, maxDigits, trailingOK) { - var count = 0; - while (count < token.length) { - var c = token.charCodeAt(count); - // "non-digit = %x00-2F / %x3A-FF" - if (c <= 0x2F || c >= 0x3A) { - break; - } - count++; - } - - // constrain to a minimum and maximum number of digits. - if (count < minDigits || count > maxDigits) { - return null; - } - - if (!trailingOK && count != token.length) { - return null; - } - - return parseInt(token.substr(0,count), 10); -} - -function parseTime(token) { - var parts = token.split(':'); - var result = [0,0,0]; - - /* RF6256 S5.1.1: - * time = hms-time ( non-digit *OCTET ) - * hms-time = time-field ":" time-field ":" time-field - * time-field = 1*2DIGIT - */ - - if (parts.length !== 3) { - return null; - } - - for (var i = 0; i < 3; i++) { - // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be - // followed by "( non-digit *OCTET )" so therefore the last time-field can - // have a trailer - var trailingOK = (i == 2); - var num = parseDigits(parts[i], 1, 2, trailingOK); - if (num === null) { - return null; - } - result[i] = num; - } - - return result; -} - -function parseMonth(token) { - token = String(token).substr(0,3).toLowerCase(); - var num = MONTH_TO_NUM[token]; - return num >= 0 ? num : null; -} - -/* - * RFC6265 S5.1.1 date parser (see RFC for full grammar) - */ -function parseDate(str) { - if (!str) { - return; - } - - /* RFC6265 S5.1.1: - * 2. Process each date-token sequentially in the order the date-tokens - * appear in the cookie-date - */ - var tokens = str.split(DATE_DELIM); - if (!tokens) { - return; - } - - var hour = null; - var minute = null; - var second = null; - var dayOfMonth = null; - var month = null; - var year = null; - - for (var i=0; i= 70 && year <= 99) { - year += 1900; - } else if (year >= 0 && year <= 69) { - year += 2000; - } - } - } - } - - /* RFC 6265 S5.1.1 - * "5. Abort these steps and fail to parse the cookie-date if: - * * at least one of the found-day-of-month, found-month, found- - * year, or found-time flags is not set, - * * the day-of-month-value is less than 1 or greater than 31, - * * the year-value is less than 1601, - * * the hour-value is greater than 23, - * * the minute-value is greater than 59, or - * * the second-value is greater than 59. - * (Note that leap seconds cannot be represented in this syntax.)" - * - * So, in order as above: - */ - if ( - dayOfMonth === null || month === null || year === null || second === null || - dayOfMonth < 1 || dayOfMonth > 31 || - year < 1601 || - hour > 23 || - minute > 59 || - second > 59 - ) { - return; - } - - return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); -} - -function formatDate(date) { - var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; - var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; - var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; - var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; - return NUM_TO_DAY[date.getUTCDay()] + ', ' + - d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ - h+':'+m+':'+s+' GMT'; -} - -// S5.1.2 Canonicalized Host Names -function canonicalDomain(str) { - if (str == null) { - return null; - } - str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . - - // convert to IDN if any non-ASCII characters - if (punycode && /[^\u0001-\u007f]/.test(str)) { - str = punycode.toASCII(str); - } - - return str.toLowerCase(); -} - -// S5.1.3 Domain Matching -function domainMatch(str, domStr, canonicalize) { - if (str == null || domStr == null) { - return null; - } - if (canonicalize !== false) { - str = canonicalDomain(str); - domStr = canonicalDomain(domStr); - } - - /* - * "The domain string and the string are identical. (Note that both the - * domain string and the string will have been canonicalized to lower case at - * this point)" - */ - if (str == domStr) { - return true; - } - - /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ - - /* "* The string is a host name (i.e., not an IP address)." */ - if (net.isIP(str)) { - return false; - } - - /* "* The domain string is a suffix of the string" */ - var idx = str.indexOf(domStr); - if (idx <= 0) { - return false; // it's a non-match (-1) or prefix (0) - } - - // e.g "a.b.c".indexOf("b.c") === 2 - // 5 === 3+2 - if (str.length !== domStr.length + idx) { // it's not a suffix - return false; - } - - /* "* The last character of the string that is not included in the domain - * string is a %x2E (".") character." */ - if (str.substr(idx-1,1) !== '.') { - return false; - } - - return true; -} - - -// RFC6265 S5.1.4 Paths and Path-Match - -/* - * "The user agent MUST use an algorithm equivalent to the following algorithm - * to compute the default-path of a cookie:" - * - * Assumption: the path (and not query part or absolute uri) is passed in. - */ -function defaultPath(path) { - // "2. If the uri-path is empty or if the first character of the uri-path is not - // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. - if (!path || path.substr(0,1) !== "/") { - return "/"; - } - - // "3. If the uri-path contains no more than one %x2F ("/") character, output - // %x2F ("/") and skip the remaining step." - if (path === "/") { - return path; - } - - var rightSlash = path.lastIndexOf("/"); - if (rightSlash === 0) { - return "/"; - } - - // "4. Output the characters of the uri-path from the first character up to, - // but not including, the right-most %x2F ("/")." - return path.slice(0, rightSlash); -} - -function trimTerminator(str) { - for (var t = 0; t < TERMINATORS.length; t++) { - var terminatorIdx = str.indexOf(TERMINATORS[t]); - if (terminatorIdx !== -1) { - str = str.substr(0,terminatorIdx); - } - } - - return str; -} - -function parseCookiePair(cookiePair, looseMode) { - cookiePair = trimTerminator(cookiePair); - - var firstEq = cookiePair.indexOf('='); - if (looseMode) { - if (firstEq === 0) { // '=' is immediately at start - cookiePair = cookiePair.substr(1); - firstEq = cookiePair.indexOf('='); // might still need to split on '=' - } - } else { // non-loose mode - if (firstEq <= 0) { // no '=' or is at start - return; // needs to have non-empty "cookie-name" - } - } - - var cookieName, cookieValue; - if (firstEq <= 0) { - cookieName = ""; - cookieValue = cookiePair.trim(); - } else { - cookieName = cookiePair.substr(0, firstEq).trim(); - cookieValue = cookiePair.substr(firstEq+1).trim(); - } - - if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { - return; - } - - var c = new Cookie(); - c.key = cookieName; - c.value = cookieValue; - return c; -} - -function parse(str, options) { - if (!options || typeof options !== 'object') { - options = {}; - } - str = str.trim(); - - // We use a regex to parse the "name-value-pair" part of S5.2 - var firstSemi = str.indexOf(';'); // S5.2 step 1 - var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi); - var c = parseCookiePair(cookiePair, !!options.loose); - if (!c) { - return; - } - - if (firstSemi === -1) { - return c; - } - - // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question)." plus later on in the same section - // "discard the first ";" and trim". - var unparsed = str.slice(firstSemi + 1).trim(); - - // "If the unparsed-attributes string is empty, skip the rest of these - // steps." - if (unparsed.length === 0) { - return c; - } - - /* - * S5.2 says that when looping over the items "[p]rocess the attribute-name - * and attribute-value according to the requirements in the following - * subsections" for every item. Plus, for many of the individual attributes - * in S5.3 it says to use the "attribute-value of the last attribute in the - * cookie-attribute-list". Therefore, in this implementation, we overwrite - * the previous value. - */ - var cookie_avs = unparsed.split(';'); - while (cookie_avs.length) { - var av = cookie_avs.shift().trim(); - if (av.length === 0) { // happens if ";;" appears - continue; - } - var av_sep = av.indexOf('='); - var av_key, av_value; - - if (av_sep === -1) { - av_key = av; - av_value = null; - } else { - av_key = av.substr(0,av_sep); - av_value = av.substr(av_sep+1); - } - - av_key = av_key.trim().toLowerCase(); - - if (av_value) { - av_value = av_value.trim(); - } - - switch(av_key) { - case 'expires': // S5.2.1 - if (av_value) { - var exp = parseDate(av_value); - // "If the attribute-value failed to parse as a cookie date, ignore the - // cookie-av." - if (exp) { - // over and underflow not realistically a concern: V8's getTime() seems to - // store something larger than a 32-bit time_t (even with 32-bit node) - c.expires = exp; - } - } - break; - - case 'max-age': // S5.2.2 - if (av_value) { - // "If the first character of the attribute-value is not a DIGIT or a "-" - // character ...[or]... If the remainder of attribute-value contains a - // non-DIGIT character, ignore the cookie-av." - if (/^-?[0-9]+$/.test(av_value)) { - var delta = parseInt(av_value, 10); - // "If delta-seconds is less than or equal to zero (0), let expiry-time - // be the earliest representable date and time." - c.setMaxAge(delta); - } - } - break; - - case 'domain': // S5.2.3 - // "If the attribute-value is empty, the behavior is undefined. However, - // the user agent SHOULD ignore the cookie-av entirely." - if (av_value) { - // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E - // (".") character." - var domain = av_value.trim().replace(/^\./, ''); - if (domain) { - // "Convert the cookie-domain to lower case." - c.domain = domain.toLowerCase(); - } - } - break; - - case 'path': // S5.2.4 - /* - * "If the attribute-value is empty or if the first character of the - * attribute-value is not %x2F ("/"): - * Let cookie-path be the default-path. - * Otherwise: - * Let cookie-path be the attribute-value." - * - * We'll represent the default-path as null since it depends on the - * context of the parsing. - */ - c.path = av_value && av_value[0] === "/" ? av_value : null; - break; - - case 'secure': // S5.2.5 - /* - * "If the attribute-name case-insensitively matches the string "Secure", - * the user agent MUST append an attribute to the cookie-attribute-list - * with an attribute-name of Secure and an empty attribute-value." - */ - c.secure = true; - break; - - case 'httponly': // S5.2.6 -- effectively the same as 'secure' - c.httpOnly = true; - break; - - default: - c.extensions = c.extensions || []; - c.extensions.push(av); - break; - } - } - - return c; -} - -// avoid the V8 deoptimization monster! -function jsonParse(str) { - var obj; - try { - obj = JSON.parse(str); - } catch (e) { - return e; - } - return obj; -} - -function fromJSON(str) { - if (!str) { - return null; - } - - var obj; - if (typeof str === 'string') { - obj = jsonParse(str); - if (obj instanceof Error) { - return null; - } - } else { - // assume it's an Object - obj = str; - } - - var c = new Cookie(); - for (var i=0; i 1) { - var lindex = path.lastIndexOf('/'); - if (lindex === 0) { - break; - } - path = path.substr(0,lindex); - permutations.push(path); - } - permutations.push('/'); - return permutations; -} - -function getCookieContext(url) { - if (url instanceof Object) { - return url; - } - // NOTE: decodeURI will throw on malformed URIs (see GH-32). - // Therefore, we will just skip decoding for such URIs. - try { - url = decodeURI(url); - } - catch(err) { - // Silently swallow error - } - - return urlParse(url); -} - -function Cookie(options) { - options = options || {}; - - Object.keys(options).forEach(function(prop) { - if (Cookie.prototype.hasOwnProperty(prop) && - Cookie.prototype[prop] !== options[prop] && - prop.substr(0,1) !== '_') - { - this[prop] = options[prop]; - } - }, this); - - this.creation = this.creation || new Date(); - - // used to break creation ties in cookieCompare(): - Object.defineProperty(this, 'creationIndex', { - configurable: false, - enumerable: false, // important for assert.deepEqual checks - writable: true, - value: ++Cookie.cookiesCreated - }); -} - -Cookie.cookiesCreated = 0; // incremented each time a cookie is created - -Cookie.parse = parse; -Cookie.fromJSON = fromJSON; - -Cookie.prototype.key = ""; -Cookie.prototype.value = ""; - -// the order in which the RFC has them: -Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity -Cookie.prototype.maxAge = null; // takes precedence over expires for TTL -Cookie.prototype.domain = null; -Cookie.prototype.path = null; -Cookie.prototype.secure = false; -Cookie.prototype.httpOnly = false; -Cookie.prototype.extensions = null; - -// set by the CookieJar: -Cookie.prototype.hostOnly = null; // boolean when set -Cookie.prototype.pathIsDefault = null; // boolean when set -Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse -Cookie.prototype.lastAccessed = null; // Date when set -Object.defineProperty(Cookie.prototype, 'creationIndex', { - configurable: true, - enumerable: false, - writable: true, - value: 0 -}); - -Cookie.serializableProperties = Object.keys(Cookie.prototype) - .filter(function(prop) { - return !( - Cookie.prototype[prop] instanceof Function || - prop === 'creationIndex' || - prop.substr(0,1) === '_' - ); - }); - -Cookie.prototype.inspect = function inspect() { - var now = Date.now(); - return 'Cookie="'+this.toString() + - '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + - '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + - '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + - '"'; -}; - -// Use the new custom inspection symbol to add the custom inspect function if -// available. -if (util.inspect.custom) { - Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect; -} - -Cookie.prototype.toJSON = function() { - var obj = {}; - - var props = Cookie.serializableProperties; - for (var i=0; i=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/tunnel-agent/LICENSE b/node_modules/tunnel-agent/LICENSE deleted file mode 100644 index a4a9aee0..00000000 --- a/node_modules/tunnel-agent/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index bb533d56..00000000 --- a/node_modules/tunnel-agent/README.md +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 3ee9abc5..00000000 --- a/node_modules/tunnel-agent/index.js +++ /dev/null @@ -1,244 +0,0 @@ -'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 deleted file mode 100644 index a271fda9..00000000 --- a/node_modules/tunnel-agent/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "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 deleted file mode 100644 index 7d98dcbd..00000000 --- a/node_modules/tweetnacl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -.eslintrc -.travis.yml -bower.json -test diff --git a/node_modules/tweetnacl/AUTHORS.md b/node_modules/tweetnacl/AUTHORS.md deleted file mode 100644 index 6d74d406..00000000 --- a/node_modules/tweetnacl/AUTHORS.md +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index 92a4fdc5..00000000 --- a/node_modules/tweetnacl/CHANGELOG.md +++ /dev/null @@ -1,221 +0,0 @@ -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 deleted file mode 100644 index cf1ab25d..00000000 --- a/node_modules/tweetnacl/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index a8eb4a9a..00000000 --- a/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,20 +0,0 @@ -# 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 deleted file mode 100644 index ffb6871d..00000000 --- a/node_modules/tweetnacl/README.md +++ /dev/null @@ -1,459 +0,0 @@ -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 deleted file mode 100644 index 5e4562fe..00000000 --- a/node_modules/tweetnacl/nacl-fast.js +++ /dev/null @@ -1,2388 +0,0 @@ -(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 deleted file mode 100644 index 8bc47daa..00000000 --- a/node_modules/tweetnacl/nacl-fast.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!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 deleted file mode 100644 index f72dd78d..00000000 --- a/node_modules/tweetnacl/nacl.js +++ /dev/null @@ -1,1175 +0,0 @@ -(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 deleted file mode 100644 index 4484974e..00000000 --- a/node_modules/tweetnacl/nacl.min.js +++ /dev/null @@ -1 +0,0 @@ -!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-is/HISTORY.md b/node_modules/type-is/HISTORY.md deleted file mode 100644 index 8de21f7a..00000000 --- a/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,259 +0,0 @@ -1.6.18 / 2019-04-26 -=================== - - * Fix regression passing request object to `typeis.is` - -1.6.17 / 2019-04-25 -=================== - - * deps: mime-types@~2.1.24 - - Add Apple file extensions from IANA - - Add extension `.csl` to `application/vnd.citationstyles.style+xml` - - Add extension `.es` to `application/ecmascript` - - Add extension `.nq` to `application/n-quads` - - Add extension `.nt` to `application/n-triples` - - Add extension `.owl` to `application/rdf+xml` - - Add extensions `.siv` and `.sieve` to `application/sieve` - - Add extensions from IANA for `image/*` types - - Add extensions from IANA for `model/*` types - - Add extensions to HEIC image types - - Add new mime types - - Add `text/mdx` with extension `.mdx` - * perf: prevent internal `throw` on invalid type - -1.6.16 / 2018-02-16 -=================== - - * deps: mime-types@~2.1.18 - - Add `application/raml+yaml` with extension `.raml` - - Add `application/wasm` with extension `.wasm` - - Add `text/shex` with extension `.shex` - - Add extensions for JPEG-2000 images - - Add extensions from IANA for `message/*` types - - Add extension `.mjs` to `application/javascript` - - Add extension `.wadl` to `application/vnd.sun.wadl+xml` - - Add extension `.gz` to `application/gzip` - - Add glTF types and extensions - - Add new mime types - - Update extensions `.md` and `.markdown` to be `text/markdown` - - Update font MIME types - - Update `text/hjson` to registered `application/hjson` - -1.6.15 / 2017-03-31 -=================== - - * deps: mime-types@~2.1.15 - - Add new mime types - -1.6.14 / 2016-11-18 -=================== - - * deps: mime-types@~2.1.13 - - Add new mime types - -1.6.13 / 2016-05-18 -=================== - - * deps: mime-types@~2.1.11 - - Add new mime types - -1.6.12 / 2016-02-28 -=================== - - * deps: mime-types@~2.1.10 - - Add new mime types - - Fix extension of `application/dash+xml` - - Update primary extension for `audio/mp4` - -1.6.11 / 2016-01-29 -=================== - - * deps: mime-types@~2.1.9 - - Add new mime types - -1.6.10 / 2015-12-01 -=================== - - * deps: mime-types@~2.1.8 - - Add new mime types - -1.6.9 / 2015-09-27 -================== - - * deps: mime-types@~2.1.7 - - Add new mime types - -1.6.8 / 2015-09-04 -================== - - * deps: mime-types@~2.1.6 - - Add new mime types - -1.6.7 / 2015-08-20 -================== - - * Fix type error when given invalid type to match against - * deps: mime-types@~2.1.5 - - Add new mime types - -1.6.6 / 2015-07-31 -================== - - * deps: mime-types@~2.1.4 - - Add new mime types - -1.6.5 / 2015-07-16 -================== - - * deps: mime-types@~2.1.3 - - Add new mime types - -1.6.4 / 2015-07-01 -================== - - * deps: mime-types@~2.1.2 - - Add new mime types - * perf: enable strict mode - * perf: remove argument reassignment - -1.6.3 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - Add new mime types - * perf: reduce try block size - * perf: remove bitwise operations - -1.6.2 / 2015-05-10 -================== - - * deps: mime-types@~2.0.11 - - Add new mime types - -1.6.1 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - Add new mime types - -1.6.0 / 2015-02-12 -================== - - * fix false-positives in `hasBody` `Transfer-Encoding` check - * support wildcard for both type and subtype (`*/*`) - -1.5.7 / 2015-02-09 -================== - - * fix argument reassignment - * deps: mime-types@~2.0.9 - - Add new mime types - -1.5.6 / 2015-01-29 -================== - - * deps: mime-types@~2.0.8 - - Add new mime types - -1.5.5 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - Add new mime types - - Fix missing extensions - - Fix various invalid MIME type entries - - Remove example template MIME types - - deps: mime-db@~1.5.0 - -1.5.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - Add new mime types - - deps: mime-db@~1.3.0 - -1.5.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - Add new mime types - - deps: mime-db@~1.2.0 - -1.5.2 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - Add new mime types - - deps: mime-db@~1.1.0 - -1.5.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - * deps: media-typer@0.3.0 - * deps: mime-types@~2.0.1 - - Support Node.js 0.6 - -1.5.0 / 2014-09-05 -================== - - * fix `hasbody` to be true for `content-length: 0` - -1.4.0 / 2014-09-02 -================== - - * update mime-types - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/node_modules/type-is/LICENSE b/node_modules/type-is/LICENSE deleted file mode 100644 index 386b7b69..00000000 --- a/node_modules/type-is/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/type-is/README.md b/node_modules/type-is/README.md deleted file mode 100644 index b85ef8f7..00000000 --- a/node_modules/type-is/README.md +++ /dev/null @@ -1,170 +0,0 @@ -# type-is - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Infer the content-type of a request. - -### Install - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var typeis = require('type-is') - -http.createServer(function (req, res) { - var istext = typeis(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### typeis(request, types) - -Checks if the `request` is one of the `types`. If the request has no body, -even if there is a `Content-Type` header, then `null` is returned. If the -`Content-Type` header is invalid or does not matches any of the `types`, then -`false` is returned. Otherwise, a string of the type that matched is returned. - -The `request` argument is expected to be a Node.js HTTP request. The `types` -argument is an array of type strings. - -Each type in the `types` array can be one of the following: - -- A file extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. - The full mime type will be returned if matched. -- A suffix such as `+json`. This can be combined with a wildcard such as - `*/vnd+json` or `application/*+json`. The full mime type will be returned - if matched. - -Some examples to illustrate the inputs and returned value: - - - -```js -// req.headers.content-type = 'application/json' - -typeis(req, ['json']) // => 'json' -typeis(req, ['html', 'json']) // => 'json' -typeis(req, ['application/*']) // => 'application/json' -typeis(req, ['application/json']) // => 'application/json' - -typeis(req, ['html']) // => false -``` - -### typeis.hasBody(request) - -Returns a Boolean if the given `request` has a body, regardless of the -`Content-Type` header. - -Having a body has no relation to how large the body is (it may be 0 bytes). -This is similar to how file existence works. If a body does exist, then this -indicates that there is data to read from the Node.js request stream. - - - -```js -if (typeis.hasBody(req)) { - // read the body, since there is one - - req.on('data', function (chunk) { - // ... - }) -} -``` - -### typeis.is(mediaType, types) - -Checks if the `mediaType` is one of the `types`. If the `mediaType` is invalid -or does not matches any of the `types`, then `false` is returned. Otherwise, a -string of the type that matched is returned. - -The `mediaType` argument is expected to be a -[media type](https://tools.ietf.org/html/rfc6838) string. The `types` argument -is an array of type strings. - -Each type in the `types` array can be one of the following: - -- A file extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. - The full mime type will be returned if matched. -- A suffix such as `+json`. This can be combined with a wildcard such as - `*/vnd+json` or `application/*+json`. The full mime type will be returned - if matched. - -Some examples to illustrate the inputs and returned value: - - - -```js -var mediaType = 'application/json' - -typeis.is(mediaType, ['json']) // => 'json' -typeis.is(mediaType, ['html', 'json']) // => 'json' -typeis.is(mediaType, ['application/*']) // => 'application/json' -typeis.is(mediaType, ['application/json']) // => 'application/json' - -typeis.is(mediaType, ['html']) // => false -``` - -## Examples - -### Example body parser - -```js -var express = require('express') -var typeis = require('type-is') - -var app = express() - -app.use(function bodyParser (req, res, next) { - if (!typeis.hasBody(req)) { - return next() - } - - switch (typeis(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - throw new Error('implement urlencoded body parsing') - case 'json': - // parse json body - throw new Error('implement json body parsing') - case 'multipart': - // parse multipart body - throw new Error('implement multipart body parsing') - default: - // 415 error code - res.statusCode = 415 - res.end() - break - } -}) -``` - -## License - -[MIT](LICENSE) - -[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/type-is/master -[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master -[node-version-image]: https://badgen.net/npm/node/type-is -[node-version-url]: https://nodejs.org/en/download -[npm-downloads-image]: https://badgen.net/npm/dm/type-is -[npm-url]: https://npmjs.org/package/type-is -[npm-version-image]: https://badgen.net/npm/v/type-is -[travis-image]: https://badgen.net/travis/jshttp/type-is/master -[travis-url]: https://travis-ci.org/jshttp/type-is diff --git a/node_modules/type-is/index.js b/node_modules/type-is/index.js deleted file mode 100644 index 890ad76c..00000000 --- a/node_modules/type-is/index.js +++ /dev/null @@ -1,266 +0,0 @@ -/*! - * type-is - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var typer = require('media-typer') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = typeofrequest -module.exports.is = typeis -module.exports.hasBody = hasbody -module.exports.normalize = normalize -module.exports.match = mimeMatch - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @public - */ - -function typeis (value, types_) { - var i - var types = types_ - - // remove parameters and normalize - var val = tryNormalizeType(value) - - // no type or invalid - if (!val) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) { - return val - } - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), val)) { - return type[0] === '+' || type.indexOf('*') !== -1 - ? val - : type - } - } - - // no matches - return false -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @public - */ - -function hasbody (req) { - return req.headers['transfer-encoding'] !== undefined || - !isNaN(req.headers['content-length']) -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -function typeofrequest (req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types) -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @private - */ - -function normalize (type) { - if (typeof type !== 'string') { - // invalid type - return false - } - - switch (type) { - case 'urlencoded': - return 'application/x-www-form-urlencoded' - case 'multipart': - return 'multipart/*' - } - - if (type[0] === '+') { - // "+json" -> "*/*+json" expando - return '*/*' + type - } - - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if `expected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @private - */ - -function mimeMatch (expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // split types - var actualParts = actual.split('/') - var expectedParts = expected.split('/') - - // invalid format - if (actualParts.length !== 2 || expectedParts.length !== 2) { - return false - } - - // validate type - if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { - return false - } - - // validate suffix wildcard - if (expectedParts[1].substr(0, 2) === '*+') { - return expectedParts[1].length <= actualParts[1].length + 1 && - expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) - } - - // validate subtype - if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { - return false - } - - return true -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function normalizeType (value) { - // parse the type - var type = typer.parse(value) - - // remove the parameters - type.parameters = undefined - - // reformat it - return typer.format(type) -} - -/** - * Try to normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function tryNormalizeType (value) { - if (!value) { - return null - } - - try { - return normalizeType(value) - } catch (err) { - return null - } -} diff --git a/node_modules/type-is/package.json b/node_modules/type-is/package.json deleted file mode 100644 index 97ba5f14..00000000 --- a/node_modules/type-is/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.6.18", - "contributors": [ - "Douglas Christopher Wilson ", - "Jonathan Ong (http://jongleberry.com)" - ], - "license": "MIT", - "repository": "jshttp/type-is", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "devDependencies": { - "eslint": "5.16.0", - "eslint-config-standard": "12.0.0", - "eslint-plugin-import": "2.17.2", - "eslint-plugin-markdown": "1.0.0", - "eslint-plugin-node": "8.0.1", - "eslint-plugin-promise": "4.1.1", - "eslint-plugin-standard": "4.0.0", - "mocha": "6.1.4", - "nyc": "14.0.0" - }, - "engines": { - "node": ">= 0.6" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "scripts": { - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "test-travis": "nyc --reporter=text npm test" - }, - "keywords": [ - "content", - "type", - "checking" - ] -} diff --git a/node_modules/uglify-js/LICENSE b/node_modules/uglify-js/LICENSE deleted file mode 100644 index dd7706f0..00000000 --- a/node_modules/uglify-js/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -UglifyJS is released under the BSD license: - -Copyright 2012-2013 (c) Mihai Bazon - -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. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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/uglify-js/README.md b/node_modules/uglify-js/README.md deleted file mode 100644 index 8a34f6e4..00000000 --- a/node_modules/uglify-js/README.md +++ /dev/null @@ -1,1100 +0,0 @@ -UglifyJS 3 -========== - -UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit. - -#### Note: -- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS2/tree/v2.x)**. -- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS2/tree/v2.x)**. -- `uglify-js` only supports ECMAScript 5 (ES5). -- Those wishing to minify -ES2015+ (ES6+) should use the `npm` package [**uglify-es**](https://github.com/mishoo/UglifyJS2/tree/harmony). - -Install -------- - -First make sure you have installed the latest version of [node.js](http://nodejs.org/) -(You may need to restart your computer after this step). - -From NPM for use as a command line app: - - npm install uglify-js -g - -From NPM for programmatic use: - - npm install uglify-js - -# Command line usage - - uglifyjs [input files] [options] - -UglifyJS can take multiple input files. It's recommended that you pass the -input files first, then pass the options. UglifyJS will parse input files -in sequence and apply any compression options. The files are parsed in the -same global scope, that is, a reference from a file to some -variable/function declared in another file will be matched properly. - -If no input file is specified, UglifyJS will read from STDIN. - -If you wish to pass your options before the input files, separate the two with -a double dash to prevent input files being used as option arguments: - - uglifyjs --compress --mangle -- input.js - -### Command line options - -``` - -h, --help Print usage information. - `--help options` for details on available options. - -V, --version Print version number. - -p, --parse Specify parser options: - `acorn` Use Acorn for parsing. - `bare_returns` Allow return outside of functions. - Useful when minifying CommonJS - modules and Userscripts that may - be anonymous function wrapped (IIFE) - by the .user.js engine `caller`. - `expression` Parse a single expression, rather than - a program (for parsing JSON). - `spidermonkey` Assume input files are SpiderMonkey - AST format (as JSON). - -c, --compress [options] Enable compressor/specify compressor options: - `pure_funcs` List of functions that can be safely - removed when their return values are - not used. - -m, --mangle [options] Mangle names/specify mangler options: - `reserved` List of names that should not be mangled. - --mangle-props [options] Mangle properties/specify mangler options: - `builtins` Mangle property names that overlaps - with standard JavaScript globals. - `debug` Add debug prefix and suffix. - `domprops` Mangle property names that overlaps - with DOM properties. - `keep_quoted` Only mangle unquoted properies. - `regex` Only mangle matched property names. - `reserved` List of names that should not be mangled. - -b, --beautify [options] Beautify output/specify output options: - `beautify` Enabled with `--beautify` by default. - `preamble` Preamble to prepend to the output. You - can use this to insert a comment, for - example for licensing information. - This will not be parsed, but the source - map will adjust for its presence. - `quote_style` Quote style: - 0 - auto - 1 - single - 2 - double - 3 - original - `wrap_iife` Wrap IIFEs in parenthesis. Note: you may - want to disable `negate_iife` under - compressor options. - -o, --output Output file path (default STDOUT). Specify `ast` or - `spidermonkey` to write UglifyJS or SpiderMonkey AST - as JSON to STDOUT respectively. - --comments [filter] Preserve copyright comments in the output. By - default this works like Google Closure, keeping - JSDoc-style comments that contain "@license" or - "@preserve". You can optionally pass one of the - following arguments to this flag: - - "all" to keep all comments - - a valid JS RegExp like `/foo/` or `/^!/` to - keep only matching comments. - Note that currently not *all* comments can be - kept when compression is on, because of dead - code removal or cascading statements into - sequences. - --config-file Read `minify()` options from JSON file. - -d, --define [=value] Global definitions. - --ie8 Support non-standard Internet Explorer 8. - Equivalent to setting `ie8: true` in `minify()` - for `compress`, `mangle` and `output` options. - By default UglifyJS will not try to be IE-proof. - --keep-fnames Do not mangle/drop function names. Useful for - code relying on Function.prototype.name. - --name-cache File to hold mangled name mappings. - --self Build UglifyJS as a library (implies --wrap UglifyJS) - --source-map [options] Enable source map/specify source map options: - `base` Path to compute relative paths from input files. - `content` Input source map, useful if you're compressing - JS that was generated from some other original - code. Specify "inline" if the source map is - included within the sources. - `filename` Name and/or location of the output source. - `includeSources` Pass this flag if you want to include - the content of source files in the - source map as sourcesContent property. - `root` Path to the original source to be included in - the source map. - `url` If specified, path to the source map to append in - `//# sourceMappingURL`. - --timings Display operations run time on STDERR. - --toplevel Compress and/or mangle variables in top level scope. - --verbose Print diagnostic messages. - --warn Print warning messages. - --wrap Embed everything in a big function, making the - “exports” and “global” variables available. You - need to pass an argument to this option to - specify the name that your module will take - when included in, say, a browser. -``` - -Specify `--output` (`-o`) to declare the output file. Otherwise the output -goes to STDOUT. - -## CLI source map options - -UglifyJS can generate a source map file, which is highly useful for -debugging your compressed JavaScript. To get a source map, pass -`--source-map --output output.js` (source map will be written out to -`output.js.map`). - -Additional options: - -- `--source-map "filename=''"` to specify the name of the source map. - -- `--source-map "root=''"` to pass the URL where the original files can be found. - -- `--source-map "url=''"` to specify the URL where the source map can be found. - Otherwise UglifyJS assumes HTTP `X-SourceMap` is being used and will omit the - `//# sourceMappingURL=` directive. - -For example: - - uglifyjs js/file1.js js/file2.js \ - -o foo.min.js -c -m \ - --source-map "root='http://foo.com/src',url='foo.min.js.map'" - -The above will compress and mangle `file1.js` and `file2.js`, will drop the -output in `foo.min.js` and the source map in `foo.min.js.map`. The source -mapping will refer to `http://foo.com/src/js/file1.js` and -`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src` -as the source map root, and the original files as `js/file1.js` and -`js/file2.js`). - -### Composed source map - -When you're compressing JS code that was output by a compiler such as -CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd -like to map back to the original code (i.e. CoffeeScript). UglifyJS has an -option to take an input source map. Assuming you have a mapping from -CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript → -compressed JS by mapping every token in the compiled JS to its original -location. - -To use this feature pass `--source-map "content='/path/to/input/source.map'"` -or `--source-map "content=inline"` if the source map is included inline with -the sources. - -## CLI compress options - -You need to pass `--compress` (`-c`) to enable the compressor. Optionally -you can pass a comma-separated list of [compress options](#compress-options). - -Options are in the form `foo=bar`, or just `foo` (the latter implies -a boolean option that you want to set `true`; it's effectively a -shortcut for `foo=true`). - -Example: - - uglifyjs file.js -c toplevel,sequences=false - -## CLI mangle options - -To enable the mangler you need to pass `--mangle` (`-m`). The following -(comma-separated) options are supported: - -- `toplevel` (default `false`) -- mangle names declared in the top level scope. - -- `eval` (default `false`) -- mangle names visible in scopes where `eval` or `with` are used. - -When mangling is enabled but you want to prevent certain names from being -mangled, you can declare those names with `--mangle reserved` — pass a -comma-separated list of names. For example: - - uglifyjs ... -m reserved=['$','require','exports'] - -to prevent the `require`, `exports` and `$` names from being changed. - -### CLI mangling property names (`--mangle-props`) - -**Note:** THIS WILL PROBABLY BREAK YOUR CODE. Mangling property names -is a separate step, different from variable name mangling. Pass -`--mangle-props` to enable it. It will mangle all properties in the -input code with the exception of built in DOM properties and properties -in core JavaScript classes. For example: - -```javascript -// example.js -var x = { - baz_: 0, - foo_: 1, - calc: function() { - return this.foo_ + this.baz_; - } -}; -x.bar_ = 2; -x["baz_"] = 3; -console.log(x.calc()); -``` -Mangle all properties (except for JavaScript `builtins`): -```bash -$ uglifyjs example.js -c -m --mangle-props -``` -```javascript -var x={o:0,_:1,l:function(){return this._+this.o}};x.t=2,x.o=3,console.log(x.l()); -``` -Mangle all properties except for `reserved` properties: -```bash -$ uglifyjs example.js -c -m --mangle-props reserved=[foo_,bar_] -``` -```javascript -var x={o:0,foo_:1,_:function(){return this.foo_+this.o}};x.bar_=2,x.o=3,console.log(x._()); -``` -Mangle all properties matching a `regex`: -```bash -$ uglifyjs example.js -c -m --mangle-props regex=/_$/ -``` -```javascript -var x={o:0,_:1,calc:function(){return this._+this.o}};x.l=2,x.o=3,console.log(x.calc()); -``` - -Combining mangle properties options: -```bash -$ uglifyjs example.js -c -m --mangle-props regex=/_$/,reserved=[bar_] -``` -```javascript -var x={o:0,_:1,calc:function(){return this._+this.o}};x.bar_=2,x.o=3,console.log(x.calc()); -``` - -In order for this to be of any use, we avoid mangling standard JS names by -default (`--mangle-props builtins` to override). - -A default exclusion file is provided in `tools/domprops.json` which should -cover most standard JS and DOM properties defined in various browsers. Pass -`--mangle-props domprops` to disable this feature. - -A regular expression can be used to define which property names should be -mangled. For example, `--mangle-props regex=/^_/` will only mangle property -names that start with an underscore. - -When you compress multiple files using this option, in order for them to -work together in the end we need to ensure somehow that one property gets -mangled to the same name in all of them. For this, pass `--name-cache filename.json` -and UglifyJS will maintain these mappings in a file which can then be reused. -It should be initially empty. Example: - -```bash -$ rm -f /tmp/cache.json # start fresh -$ uglifyjs file1.js file2.js --mangle-props --name-cache /tmp/cache.json -o part1.js -$ uglifyjs file3.js file4.js --mangle-props --name-cache /tmp/cache.json -o part2.js -``` - -Now, `part1.js` and `part2.js` will be consistent with each other in terms -of mangled property names. - -Using the name cache is not necessary if you compress all your files in a -single call to UglifyJS. - -### Mangling unquoted names (`--mangle-props keep_quoted`) - -Using quoted property name (`o["foo"]`) reserves the property name (`foo`) -so that it is not mangled throughout the entire script even when used in an -unquoted style (`o.foo`). Example: - -```javascript -// stuff.js -var o = { - "foo": 1, - bar: 3 -}; -o.foo += o.bar; -console.log(o.foo); -``` -```bash -$ uglifyjs stuff.js --mangle-props keep_quoted -c -m -``` -```javascript -var o={foo:1,o:3};o.foo+=o.o,console.log(o.foo); -``` - -### Debugging property name mangling - -You can also pass `--mangle-props debug` in order to mangle property names -without completely obscuring them. For example the property `o.foo` -would mangle to `o._$foo$_` with this option. This allows property mangling -of a large codebase while still being able to debug the code and identify -where mangling is breaking things. - -```bash -$ uglifyjs stuff.js --mangle-props debug -c -m -``` -```javascript -var o={_$foo$_:1,_$bar$_:3};o._$foo$_+=o._$bar$_,console.log(o._$foo$_); -``` - -You can also pass a custom suffix using `--mangle-props debug=XYZ`. This would then -mangle `o.foo` to `o._$foo$XYZ_`. You can change this each time you compile a -script to identify how a property got mangled. One technique is to pass a -random number on every compile to simulate mangling changing with different -inputs (e.g. as you update the input script with new properties), and to help -identify mistakes like writing mangled keys to storage. - - -# API Reference - -Assuming installation via NPM, you can load UglifyJS in your application -like this: -```javascript -var UglifyJS = require("uglify-js"); -``` - -There is a single high level function, **`minify(code, options)`**, -which will perform all minification [phases](#minify-options) in a configurable -manner. By default `minify()` will enable the options [`compress`](#compress-options) -and [`mangle`](#mangle-options). Example: -```javascript -var code = "function add(first, second) { return first + second; }"; -var result = UglifyJS.minify(code); -console.log(result.error); // runtime error, or `undefined` if no error -console.log(result.code); // minified output: function add(n,d){return n+d} -``` - -You can `minify` more than one JavaScript file at a time by using an object -for the first argument where the keys are file names and the values are source -code: -```javascript -var code = { - "file1.js": "function add(first, second) { return first + second; }", - "file2.js": "console.log(add(1 + 2, 3 + 4));" -}; -var result = UglifyJS.minify(code); -console.log(result.code); -// function add(d,n){return d+n}console.log(add(3,7)); -``` - -The `toplevel` option: -```javascript -var code = { - "file1.js": "function add(first, second) { return first + second; }", - "file2.js": "console.log(add(1 + 2, 3 + 4));" -}; -var options = { toplevel: true }; -var result = UglifyJS.minify(code, options); -console.log(result.code); -// console.log(3+7); -``` - -The `nameCache` option: -```javascript -var options = { - mangle: { - toplevel: true, - }, - nameCache: {} -}; -var result1 = UglifyJS.minify({ - "file1.js": "function add(first, second) { return first + second; }" -}, options); -var result2 = UglifyJS.minify({ - "file2.js": "console.log(add(1 + 2, 3 + 4));" -}, options); -console.log(result1.code); -// function n(n,r){return n+r} -console.log(result2.code); -// console.log(n(3,7)); -``` - -You may persist the name cache to the file system in the following way: -```javascript -var cacheFileName = "/tmp/cache.json"; -var options = { - mangle: { - properties: true, - }, - nameCache: JSON.parse(fs.readFileSync(cacheFileName, "utf8")) -}; -fs.writeFileSync("part1.js", UglifyJS.minify({ - "file1.js": fs.readFileSync("file1.js", "utf8"), - "file2.js": fs.readFileSync("file2.js", "utf8") -}, options).code, "utf8"); -fs.writeFileSync("part2.js", UglifyJS.minify({ - "file3.js": fs.readFileSync("file3.js", "utf8"), - "file4.js": fs.readFileSync("file4.js", "utf8") -}, options).code, "utf8"); -fs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), "utf8"); -``` - -An example of a combination of `minify()` options: -```javascript -var code = { - "file1.js": "function add(first, second) { return first + second; }", - "file2.js": "console.log(add(1 + 2, 3 + 4));" -}; -var options = { - toplevel: true, - compress: { - global_defs: { - "@console.log": "alert" - }, - passes: 2 - }, - output: { - beautify: false, - preamble: "/* uglified */" - } -}; -var result = UglifyJS.minify(code, options); -console.log(result.code); -// /* uglified */ -// alert(10);" -``` - -To produce warnings: -```javascript -var code = "function f(){ var u; return 2 + 3; }"; -var options = { warnings: true }; -var result = UglifyJS.minify(code, options); -console.log(result.error); // runtime error, `undefined` in this case -console.log(result.warnings); // [ 'Dropping unused variable u [0:1,18]' ] -console.log(result.code); // function f(){return 5} -``` - -An error example: -```javascript -var result = UglifyJS.minify({"foo.js" : "if (0) else console.log(1);"}); -console.log(JSON.stringify(result.error)); -// {"message":"Unexpected token: keyword (else)","filename":"foo.js","line":1,"col":7,"pos":7} -``` -Note: unlike `uglify-js@2.x`, the `3.x` API does not throw errors. To -achieve a similar effect one could do the following: -```javascript -var result = UglifyJS.minify(code, options); -if (result.error) throw result.error; -``` - -## Minify options - -- `warnings` (default `false`) — pass `true` to return compressor warnings - in `result.warnings`. Use the value `"verbose"` for more detailed warnings. - -- `parse` (default `{}`) — pass an object if you wish to specify some - additional [parse options](#parse-options). - -- `compress` (default `{}`) — pass `false` to skip compressing entirely. - Pass an object to specify custom [compress options](#compress-options). - -- `mangle` (default `true`) — pass `false` to skip mangling names, or pass - an object to specify [mangle options](#mangle-options) (see below). - - - `mangle.properties` (default `false`) — a subcategory of the mangle option. - Pass an object to specify custom [mangle property options](#mangle-properties-options). - -- `output` (default `null`) — pass an object if you wish to specify - additional [output options](#output-options). The defaults are optimized - for best compression. - -- `sourceMap` (default `false`) - pass an object if you wish to specify - [source map options](#source-map-options). - -- `toplevel` (default `false`) - set to `true` if you wish to enable top level - variable and function name mangling and to drop unused variables and functions. - -- `nameCache` (default `null`) - pass an empty object `{}` or a previously - used `nameCache` object if you wish to cache mangled variable and - property names across multiple invocations of `minify()`. Note: this is - a read/write property. `minify()` will read the name cache state of this - object and update it during minification so that it may be - reused or externally persisted by the user. - -- `ie8` (default `false`) - set to `true` to support IE8. - -- `keep_fnames` (default: `false`) - pass `true` to prevent discarding or mangling - of function names. Useful for code relying on `Function.prototype.name`. - -## Minify options structure - -```javascript -{ - parse: { - // parse options - }, - compress: { - // compress options - }, - mangle: { - // mangle options - - properties: { - // mangle property options - } - }, - output: { - // output options - }, - sourceMap: { - // source map options - }, - nameCache: null, // or specify a name cache object - toplevel: false, - ie8: false, - warnings: false, -} -``` - -### Source map options - -To generate a source map: -```javascript -var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, { - sourceMap: { - filename: "out.js", - url: "out.js.map" - } -}); -console.log(result.code); // minified output -console.log(result.map); // source map -``` - -Note that the source map is not saved in a file, it's just returned in -`result.map`. The value passed for `sourceMap.url` is only used to set -`//# sourceMappingURL=out.js.map` in `result.code`. The value of -`filename` is only used to set `file` attribute (see [the spec][sm-spec]) -in source map file. - -You can set option `sourceMap.url` to be `"inline"` and source map will -be appended to code. - -You can also specify sourceRoot property to be included in source map: -```javascript -var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, { - sourceMap: { - root: "http://example.com/src", - url: "out.js.map" - } -}); -``` - -If you're compressing compiled JavaScript and have a source map for it, you -can use `sourceMap.content`: -```javascript -var result = UglifyJS.minify({"compiled.js": "compiled code"}, { - sourceMap: { - content: "content from compiled.js.map", - url: "minified.js.map" - } -}); -// same as before, it returns `code` and `map` -``` - -If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.url`. - -## Parse options - -- `bare_returns` (default `false`) -- support top level `return` statements - -- `html5_comments` (default `true`) - -- `shebang` (default `true`) -- support `#!command` as the first line - -## Compress options - -- `booleans` (default: `true`) -- various optimizations for boolean context, - for example `!!a ? b : c → a ? b : c` - -- `cascade` (default: `true`) -- small optimization for sequences, transform - `x, x` into `x` and `x = something(), x` into `x = something()` - -- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables, - side effects permitting. - -- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes, - e.g. `!(a <= b) → a > b` (only when `unsafe_comps`), attempts to negate binary - nodes, e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc. - -- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional - expressions - -- `dead_code` (default: `true`) -- remove unreachable code - -- `drop_console` (default: `false`) -- Pass `true` to discard calls to - `console.*` functions. If you wish to drop a specific function call - such as `console.info` and/or retain side effects from function arguments - after dropping the function call then use `pure_funcs` instead. - -- `drop_debugger` (default: `true`) -- remove `debugger;` statements - -- `evaluate` (default: `true`) -- attempt to evaluate constant expressions - -- `expression` (default: `false`) -- Pass `true` to preserve completion values - from terminal statements without `return`, e.g. in bookmarklets. - -- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation) - -- `hoist_funs` (default: `true`) -- hoist function declarations - -- `hoist_props` (default: `true`) -- hoist properties from constant object and - array literals into regular variables subject to a set of constraints. For example: - `var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props` - works best with `mangle` enabled, the `compress` option `passes` set to `2` or higher, - and the `compress` option `toplevel` enabled. - -- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false` - by default because it seems to increase the size of the output in general) - -- `if_return` (default: `true`) -- optimizations for if/return and if/continue - -- `inline` (default: `true`) -- embed simple functions - -- `join_vars` (default: `true`) -- join consecutive `var` statements - -- `keep_fargs` (default: `true`) -- Prevents the compressor from discarding unused - function arguments. You need this for code which relies on `Function.length`. - -- `keep_fnames` (default: `false`) -- Pass `true` to prevent the - compressor from discarding function names. Useful for code relying on - `Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle). - -- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from - being compressed into `1/0`, which may cause performance issues on Chrome. - -- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops - when we can statically determine the condition. - -- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions" - where the return value is discarded, to avoid the parens that the - code generator would insert. - -- `passes` (default: `1`) -- The maximum number of times to run compress. - In some cases more than one pass leads to further compressed code. Keep in - mind more passes will take more time. - -- `properties` (default: `true`) -- rewrite property access using the dot notation, for - example `foo["bar"] → foo.bar` - -- `pure_funcs` (default: `null`) -- You can pass an array of names and - UglifyJS will assume that those functions do not produce side - effects. DANGER: will not check if the name is redefined in scope. - An example case here, for instance `var q = Math.floor(a/b)`. If - variable `q` is not used elsewhere, UglifyJS will drop it, but will - still keep the `Math.floor(a/b)`, not knowing what it does. You can - pass `pure_funcs: [ 'Math.floor' ]` to let it know that this - function won't produce any side effect, in which case the whole - statement would get discarded. The current implementation adds some - overhead (compression will be slower). - -- `pure_getters` (default: `"strict"`) -- If you pass `true` for - this, UglifyJS will assume that object property access - (e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects. - Specify `"strict"` to treat `foo.bar` as side-effect-free only when - `foo` is certain to not throw, i.e. not `null` or `undefined`. - -- `reduce_funcs` (default: `true`) -- Allows single-use functions to be - inlined as function expressions when permissible allowing further - optimization. Enabled by default. Option depends on `reduce_vars` - being enabled. Some code runs faster in the Chrome V8 engine if this - option is disabled. Does not negatively impact other major browsers. - -- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and - used as constant values. - -- `sequences` (default: `true`) -- join consecutive simple statements using the - comma operator. May be set to a positive integer to specify the maximum number - of consecutive comma sequences that will be generated. If this option is set to - `true` then the default `sequences` limit is `200`. Set option to `false` or `0` - to disable. The smallest `sequences` length is `2`. A `sequences` value of `1` - is grandfathered to be equivalent to `true` and as such means `200`. On rare - occasions the default sequences limit leads to very slow compress times in which - case a value of `20` or less is recommended. - -- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping - functions marked as "pure". A function call is marked as "pure" if a comment - annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For - example: `/*@__PURE__*/foo();` - -- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches - -- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or - variables (`"vars"`) in the top level scope (`false` by default, `true` to drop - both unreferenced functions and variables) - -- `top_retain` (default: `null`) -- prevent specific toplevel functions and - variables from `unused` removal (can be array, comma-separated, RegExp or - function. Implies `toplevel`) - -- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into - `foo === void 0`. Note: recommend to set this value to `false` for IE10 and - earlier versions due to known issues. - -- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below) - -- `unsafe_comps` (default: `false`) -- Reverse `<` and `<=` to `>` and `>=` to - allow improved compression. This might be unsafe when an at least one of two - operands is an object with computed values due the use of methods like `get`, - or `valueOf`. This could cause change in execution order after operands in the - comparison are switching. Compression only works if both `comparisons` and - `unsafe_comps` are both set to true. - -- `unsafe_Func` (default: `false`) -- compress and mangle `Function(args, code)` - when both `args` and `code` are string literals. - -- `unsafe_math` (default: `false`) -- optimize numerical expressions like - `2 * x * 3` into `6 * x`, which may give imprecise floating point results. - -- `unsafe_proto` (default: `false`) -- optimize expressions like - `Array.prototype.slice.call(a)` into `[].slice.call(a)` - -- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with - `RegExp` values the same way as if they are constants. - -- `unused` (default: `true`) -- drop unreferenced functions and variables (simple - direct variable assignments do not count as references unless set to `"keep_assign"`) - -- `warnings` (default: `false`) -- display warnings when dropping unreachable - code or unused declarations etc. - -## Mangle options - -- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes - where `eval` or `with` are used. - -- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names. - Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames` - [compress option](#compress-options). - -- `reserved` (default `[]`) -- Pass an array of identifiers that should be - excluded from mangling. Example: `["foo", "bar"]`. - -- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the - top level scope. - -Examples: - -```javascript -// test.js -var globalVar; -function funcName(firstLongName, anotherLongName) { - var myVariable = firstLongName + anotherLongName; -} -``` -```javascript -var code = fs.readFileSync("test.js", "utf8"); - -UglifyJS.minify(code).code; -// 'function funcName(a,n){}var globalVar;' - -UglifyJS.minify(code, { mangle: { reserved: ['firstLongName'] } }).code; -// 'function funcName(firstLongName,a){}var globalVar;' - -UglifyJS.minify(code, { mangle: { toplevel: true } }).code; -// 'function n(n,a){}var a;' -``` - -### Mangle properties options - -- `builtins` (default: `false`) -- Use `true` to allow the mangling of builtin - DOM properties. Not recommended to override this setting. - -- `debug` (default: `false`) -— Mangle names with the original name still present. - Pass an empty string `""` to enable, or a non-empty string to set the debug suffix. - -- `keep_quoted` (default: `false`) -— Only mangle unquoted property names. - -- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property - names matching the regular expression. - -- `reserved` (default: `[]`) -- Do not mangle property names listed in the - `reserved` array. - -## Output options - -The code generator tries to output shortest code possible by default. In -case you want beautified output, pass `--beautify` (`-b`). Optionally you -can pass additional arguments that control the code output: - -- `ascii_only` (default `false`) -- escape Unicode characters in strings and - regexps (affects directives with non-ascii characters becoming invalid) - -- `beautify` (default `true`) -- whether to actually beautify the output. - Passing `-b` will set this to true, but you might need to pass `-b` even - when you want to generate minified code, in order to specify additional - arguments, so you can use `-b beautify=false` to override it. - -- `bracketize` (default `false`) -- always insert brackets in `if`, `for`, - `do`, `while` or `with` statements, even if their body is a single - statement. - -- `comments` (default `false`) -- pass `true` or `"all"` to preserve all - comments, `"some"` to preserve some comments, a regular expression string - (e.g. `/^!/`) or a function. - -- `indent_level` (default `4`) - -- `indent_start` (default `0`) -- prefix all lines by that many spaces - -- `inline_script` (default `false`) -- escape the slash in occurrences of - `= 0) program.helpInformation = UglifyJS.describe_ast; -else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() { - var text = []; - var options = UglifyJS.default_options(); - for (var option in options) { - text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:"); - text.push(format_object(options[option])); - text.push(""); - } - return text.join("\n"); -}; -program.option("-p, --parse ", "Specify parser options.", parse_js()); -program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js()); -program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js()); -program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js()); -program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js()); -program.option("-o, --output ", "Output file (default STDOUT)."); -program.option("--comments [filter]", "Preserve copyright comments in the output."); -program.option("--config-file ", "Read minify() options from JSON file."); -program.option("-d, --define [=value]", "Global definitions.", parse_js("define")); -program.option("--ie8", "Support non-standard Internet Explorer 8."); -program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name."); -program.option("--name-cache ", "File to hold mangled name mappings."); -program.option("--no-rename", "Disable symbol expansion."); -program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)"); -program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map()); -program.option("--timings", "Display operations run time on STDERR.") -program.option("--toplevel", "Compress and/or mangle variables in toplevel scope."); -program.option("--verbose", "Print diagnostic messages."); -program.option("--warn", "Print warning messages."); -program.option("--wrap ", "Embed everything as a function with “exports” corresponding to “name” globally."); -program.arguments("[files...]").parseArgv(process.argv); -if (program.configFile) { - options = JSON.parse(read_file(program.configFile)); -} -if (!program.output && program.sourceMap && program.sourceMap.url != "inline") { - fatal("ERROR: cannot write source map to STDOUT"); -} -[ - "compress", - "ie8", - "mangle", - "rename", - "sourceMap", - "toplevel", - "wrap" -].forEach(function(name) { - if (name in program) { - if (name == "rename" && program[name]) return; - options[name] = program[name]; - } -}); -if (program.beautify) { - options.output = typeof program.beautify == "object" ? program.beautify : {}; - if (!("beautify" in options.output)) { - options.output.beautify = true; - } -} -if (program.comments) { - if (typeof options.output != "object") options.output = {}; - options.output.comments = typeof program.comments == "string" ? program.comments : "some"; -} -if (program.define) { - if (typeof options.compress != "object") options.compress = {}; - if (typeof options.compress.global_defs != "object") options.compress.global_defs = {}; - for (var expr in program.define) { - options.compress.global_defs[expr] = program.define[expr]; - } -} -if (program.keepFnames) { - options.keep_fnames = true; -} -if (program.mangleProps) { - if (program.mangleProps.domprops) { - delete program.mangleProps.domprops; - } else { - if (typeof program.mangleProps != "object") program.mangleProps = {}; - if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = []; - require("../tools/domprops").forEach(function(name) { - UglifyJS._push_uniq(program.mangleProps.reserved, name); - }); - } - if (typeof options.mangle != "object") options.mangle = {}; - options.mangle.properties = program.mangleProps; -} -if (program.nameCache) { - options.nameCache = JSON.parse(read_file(program.nameCache, "{}")); -} -if (program.output == "ast") { - options.output = { - ast: true, - code: false - }; -} -if (program.parse) { - if (!program.parse.acorn && !program.parse.spidermonkey) { - options.parse = program.parse; - } else if (program.sourceMap && program.sourceMap.content == "inline") { - fatal("ERROR: inline source map only works with built-in parser"); - } -} -var convert_path = function(name) { - return name; -}; -if (typeof program.sourceMap == "object" && "base" in program.sourceMap) { - convert_path = function() { - var base = program.sourceMap.base; - delete options.sourceMap.base; - return function(name) { - return path.relative(base, name); - }; - }(); -} -if (program.verbose) { - options.warnings = "verbose"; -} else if (program.warn) { - options.warnings = true; -} -if (program.self) { - if (program.args.length) { - print_error("WARN: Ignoring input files since --self was passed"); - } - if (!options.wrap) options.wrap = "UglifyJS"; - simple_glob(UglifyJS.FILES).forEach(function(name) { - files[convert_path(name)] = read_file(name); - }); - run(); -} else if (program.args.length) { - simple_glob(program.args).forEach(function(name) { - files[convert_path(name)] = read_file(name); - }); - run(); -} else { - var chunks = []; - process.stdin.setEncoding("utf8"); - process.stdin.on("data", function(chunk) { - chunks.push(chunk); - }).on("end", function() { - files = [ chunks.join("") ]; - run(); - }); - process.stdin.resume(); -} - -function convert_ast(fn) { - return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null)); -} - -function run() { - UglifyJS.AST_Node.warn_function = function(msg) { - print_error("WARN: " + msg); - }; - if (program.timings) options.timings = true; - try { - if (program.parse) { - if (program.parse.acorn) { - files = convert_ast(function(toplevel, name) { - return require("acorn").parse(files[name], { - locations: true, - program: toplevel, - sourceFile: name - }); - }); - } else if (program.parse.spidermonkey) { - files = convert_ast(function(toplevel, name) { - var obj = JSON.parse(files[name]); - if (!toplevel) return obj; - toplevel.body = toplevel.body.concat(obj.body); - return toplevel; - }); - } - } - } catch (ex) { - fatal(ex); - } - var result = UglifyJS.minify(files, options); - if (result.error) { - var ex = result.error; - if (ex.name == "SyntaxError") { - print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col); - var col = ex.col; - var lines = files[ex.filename].split(/\r?\n/); - var line = lines[ex.line - 1]; - if (!line && !col) { - line = lines[ex.line - 2]; - col = line.length; - } - if (line) { - var limit = 70; - if (col > limit) { - line = line.slice(col - limit); - col = limit; - } - print_error(line.slice(0, 80)); - print_error(line.slice(0, col).replace(/\S/g, " ") + "^"); - } - } - if (ex.defs) { - print_error("Supported options:"); - print_error(format_object(ex.defs)); - } - fatal(ex); - } else if (program.output == "ast") { - print(JSON.stringify(result.ast, function(key, value) { - if (skip_key(key)) return; - if (value instanceof UglifyJS.AST_Token) return; - if (value instanceof UglifyJS.Dictionary) return; - if (value instanceof UglifyJS.AST_Node) { - var result = { - _class: "AST_" + value.TYPE - }; - value.CTOR.PROPS.forEach(function(prop) { - result[prop] = value[prop]; - }); - return result; - } - return value; - }, 2)); - } else if (program.output == "spidermonkey") { - print(JSON.stringify(UglifyJS.minify(result.code, { - compress: false, - mangle: false, - output: { - ast: true, - code: false - } - }).ast.to_mozilla_ast(), null, 2)); - } else if (program.output) { - fs.writeFileSync(program.output, result.code); - if (result.map) { - fs.writeFileSync(program.output + ".map", result.map); - } - } else { - print(result.code); - } - if (program.nameCache) { - fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache)); - } - if (result.timings) for (var phase in result.timings) { - print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s"); - } -} - -function fatal(message) { - if (message instanceof Error) message = message.stack.replace(/^\S*?Error:/, "ERROR:") - print_error(message); - process.exit(1); -} - -// A file glob function that only supports "*" and "?" wildcards in the basename. -// Example: "foo/bar/*baz??.*.js" -// Argument `glob` may be a string or an array of strings. -// Returns an array of strings. Garbage in, garbage out. -function simple_glob(glob) { - if (Array.isArray(glob)) { - return [].concat.apply([], glob.map(simple_glob)); - } - if (glob.match(/\*|\?/)) { - var dir = path.dirname(glob); - try { - var entries = fs.readdirSync(dir); - } catch (ex) {} - if (entries) { - var pattern = "^" + path.basename(glob) - .replace(/[.+^$[\]\\(){}]/g, "\\$&") - .replace(/\*/g, "[^/\\\\]*") - .replace(/\?/g, "[^/\\\\]") + "$"; - var mod = process.platform === "win32" ? "i" : ""; - var rx = new RegExp(pattern, mod); - var results = entries.filter(function(name) { - return rx.test(name); - }).map(function(name) { - return path.join(dir, name); - }); - if (results.length) return results; - } - } - return [ glob ]; -} - -function read_file(path, default_value) { - try { - return fs.readFileSync(path, "utf8"); - } catch (ex) { - if (ex.code == "ENOENT" && default_value != null) return default_value; - fatal(ex); - } -} - -function parse_js(flag) { - return function(value, options) { - options = options || {}; - try { - UglifyJS.minify(value, { - parse: { - expression: true - }, - compress: false, - mangle: false, - output: { - ast: true, - code: false - } - }).ast.walk(new UglifyJS.TreeWalker(function(node) { - if (node instanceof UglifyJS.AST_Assign) { - var name = node.left.print_to_string(); - var value = node.right; - if (flag) { - options[name] = value; - } else if (value instanceof UglifyJS.AST_Array) { - options[name] = value.elements.map(to_string); - } else { - options[name] = to_string(value); - } - return true; - } - if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) { - var name = node.print_to_string(); - options[name] = true; - return true; - } - if (!(node instanceof UglifyJS.AST_Sequence)) throw node; - - function to_string(value) { - return value instanceof UglifyJS.AST_Constant ? value.getValue() : value.print_to_string({ - quote_keys: true - }); - } - })); - } catch(ex) { - if (flag) { - fatal("Error parsing arguments for '" + flag + "': " + value); - } else { - options[value] = null; - } - } - return options; - } -} - -function parse_source_map() { - var parse = parse_js(); - return function(value, options) { - var hasContent = options && "content" in options; - var settings = parse(value, options); - if (!hasContent && settings.content && settings.content != "inline") { - print_error("INFO: Using input source map: " + settings.content); - settings.content = read_file(settings.content, settings.content); - } - return settings; - } -} - -function skip_key(key) { - return skip_keys.indexOf(key) >= 0; -} - -function format_object(obj) { - var lines = []; - var padding = ""; - Object.keys(obj).map(function(name) { - if (padding.length < name.length) padding = Array(name.length + 1).join(" "); - return [ name, JSON.stringify(obj[name]) ]; - }).forEach(function(tokens) { - lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]); - }); - return lines.join("\n"); -} - -function print_error(msg) { - process.stderr.write(msg); - process.stderr.write("\n"); -} - -function print(txt) { - process.stdout.write(txt); - process.stdout.write("\n"); -} diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js deleted file mode 100644 index 997486c2..00000000 --- a/node_modules/uglify-js/lib/ast.js +++ /dev/null @@ -1,914 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -function DEFNODE(type, props, methods, base) { - if (arguments.length < 4) base = AST_Node; - if (!props) props = []; - else props = props.split(/\s+/); - var self_props = props; - if (base && base.PROPS) - props = props.concat(base.PROPS); - var code = "return function AST_" + type + "(props){ if (props) { "; - for (var i = props.length; --i >= 0;) { - code += "this." + props[i] + " = props." + props[i] + ";"; - } - var proto = base && new base; - if (proto && proto.initialize || (methods && methods.initialize)) - code += "this.initialize();"; - code += "}}"; - var ctor = new Function(code)(); - if (proto) { - ctor.prototype = proto; - ctor.BASE = base; - } - if (base) base.SUBCLASSES.push(ctor); - ctor.prototype.CTOR = ctor; - ctor.PROPS = props || null; - ctor.SELF_PROPS = self_props; - ctor.SUBCLASSES = []; - if (type) { - ctor.prototype.TYPE = ctor.TYPE = type; - } - if (methods) for (i in methods) if (HOP(methods, i)) { - if (/^\$/.test(i)) { - ctor[i.substr(1)] = methods[i]; - } else { - ctor.prototype[i] = methods[i]; - } - } - ctor.DEFMETHOD = function(name, method) { - this.prototype[name] = method; - }; - if (typeof exports !== "undefined") { - exports["AST_" + type] = ctor; - } - return ctor; -}; - -var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file raw", { -}, null); - -var AST_Node = DEFNODE("Node", "start end", { - _clone: function(deep) { - if (deep) { - var self = this.clone(); - return self.transform(new TreeTransformer(function(node) { - if (node !== self) { - return node.clone(true); - } - })); - } - return new this.CTOR(this); - }, - clone: function(deep) { - return this._clone(deep); - }, - $documentation: "Base class of all AST nodes", - $propdoc: { - start: "[AST_Token] The first token of this node", - end: "[AST_Token] The last token of this node" - }, - _walk: function(visitor) { - return visitor._visit(this); - }, - walk: function(visitor) { - return this._walk(visitor); // not sure the indirection will be any help - } -}, null); - -AST_Node.warn_function = null; -AST_Node.warn = function(txt, props) { - if (AST_Node.warn_function) - AST_Node.warn_function(string_template(txt, props)); -}; - -/* -----[ statements ]----- */ - -var AST_Statement = DEFNODE("Statement", null, { - $documentation: "Base class of all statements", -}); - -var AST_Debugger = DEFNODE("Debugger", null, { - $documentation: "Represents a debugger statement", -}, AST_Statement); - -var AST_Directive = DEFNODE("Directive", "value quote", { - $documentation: "Represents a directive, like \"use strict\";", - $propdoc: { - value: "[string] The value of this directive as a plain string (it's not an AST_String!)", - quote: "[string] the original quote character" - }, -}, AST_Statement); - -var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", { - $documentation: "A statement consisting of an expression, i.e. a = 1 + 2", - $propdoc: { - body: "[AST_Node] an expression node (should not be instanceof AST_Statement)" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - }); - } -}, AST_Statement); - -function walk_body(node, visitor) { - var body = node.body; - if (body instanceof AST_Statement) { - body._walk(visitor); - } - else for (var i = 0, len = body.length; i < len; i++) { - body[i]._walk(visitor); - } -}; - -var AST_Block = DEFNODE("Block", "body", { - $documentation: "A body of statements (usually bracketed)", - $propdoc: { - body: "[AST_Statement*] an array of statements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - }); - } -}, AST_Statement); - -var AST_BlockStatement = DEFNODE("BlockStatement", null, { - $documentation: "A block statement", -}, AST_Block); - -var AST_EmptyStatement = DEFNODE("EmptyStatement", null, { - $documentation: "The empty statement (empty block or simply a semicolon)" -}, AST_Statement); - -var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", { - $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`", - $propdoc: { - body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement" - } -}, AST_Statement); - -var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { - $documentation: "Statement with a label", - $propdoc: { - label: "[AST_Label] a label definition" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.label._walk(visitor); - this.body._walk(visitor); - }); - }, - clone: function(deep) { - var node = this._clone(deep); - if (deep) { - var label = node.label; - var def = this.label; - node.walk(new TreeWalker(function(node) { - if (node instanceof AST_LoopControl - && node.label && node.label.thedef === def) { - node.label.thedef = label; - label.references.push(node); - } - })); - } - return node; - } -}, AST_StatementWithBody); - -var AST_IterationStatement = DEFNODE("IterationStatement", null, { - $documentation: "Internal class. All loops inherit from it." -}, AST_StatementWithBody); - -var AST_DWLoop = DEFNODE("DWLoop", "condition", { - $documentation: "Base class for do/while statements", - $propdoc: { - condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement" - } -}, AST_IterationStatement); - -var AST_Do = DEFNODE("Do", null, { - $documentation: "A `do` statement", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - this.condition._walk(visitor); - }); - } -}, AST_DWLoop); - -var AST_While = DEFNODE("While", null, { - $documentation: "A `while` statement", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_DWLoop); - -var AST_For = DEFNODE("For", "init condition step", { - $documentation: "A `for` statement", - $propdoc: { - init: "[AST_Node?] the `for` initialization code, or null if empty", - condition: "[AST_Node?] the `for` termination clause, or null if empty", - step: "[AST_Node?] the `for` update clause, or null if empty" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.init) this.init._walk(visitor); - if (this.condition) this.condition._walk(visitor); - if (this.step) this.step._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_IterationStatement); - -var AST_ForIn = DEFNODE("ForIn", "init name object", { - $documentation: "A `for ... in` statement", - $propdoc: { - init: "[AST_Node] the `for/in` initialization code", - name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var", - object: "[AST_Node] the object that we're looping through" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.init._walk(visitor); - this.object._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_IterationStatement); - -var AST_With = DEFNODE("With", "expression", { - $documentation: "A `with` statement", - $propdoc: { - expression: "[AST_Node] the `with` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ scope and functions ]----- */ - -var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", { - $documentation: "Base class for all statements introducing a lexical scope", - $propdoc: { - variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope", - functions: "[Object/S] like `variables`, but only lists function declarations", - uses_with: "[boolean/S] tells whether this scope uses the `with` statement", - uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`", - parent_scope: "[AST_Scope?/S] link to the parent scope", - enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", - cname: "[integer/S] current index for mangling variables (used internally by the mangler)", - }, -}, AST_Block); - -var AST_Toplevel = DEFNODE("Toplevel", "globals", { - $documentation: "The toplevel scope", - $propdoc: { - globals: "[Object/S] a map of name -> SymbolDef for all undeclared names", - }, - wrap_commonjs: function(name) { - var body = this.body; - var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");"; - wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ - if (node instanceof AST_Directive && node.value == "$ORIG") { - return MAP.splice(body); - } - })); - return wrapped_tl; - } -}, AST_Scope); - -var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", { - $documentation: "Base class for functions", - $propdoc: { - name: "[AST_SymbolDeclaration?] the name of this function", - argnames: "[AST_SymbolFunarg*] array of function arguments", - uses_arguments: "[boolean/S] tells whether this function accesses the arguments array" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.name) this.name._walk(visitor); - var argnames = this.argnames; - for (var i = 0, len = argnames.length; i < len; i++) { - argnames[i]._walk(visitor); - } - walk_body(this, visitor); - }); - } -}, AST_Scope); - -var AST_Accessor = DEFNODE("Accessor", null, { - $documentation: "A setter/getter function. The `name` property is always null." -}, AST_Lambda); - -var AST_Function = DEFNODE("Function", "inlined", { - $documentation: "A function expression" -}, AST_Lambda); - -var AST_Defun = DEFNODE("Defun", "inlined", { - $documentation: "A function definition" -}, AST_Lambda); - -/* -----[ JUMPS ]----- */ - -var AST_Jump = DEFNODE("Jump", null, { - $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)" -}, AST_Statement); - -var AST_Exit = DEFNODE("Exit", "value", { - $documentation: "Base class for “exits” (`return` and `throw`)", - $propdoc: { - value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return" - }, - _walk: function(visitor) { - return visitor._visit(this, this.value && function(){ - this.value._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Return = DEFNODE("Return", null, { - $documentation: "A `return` statement" -}, AST_Exit); - -var AST_Throw = DEFNODE("Throw", null, { - $documentation: "A `throw` statement" -}, AST_Exit); - -var AST_LoopControl = DEFNODE("LoopControl", "label", { - $documentation: "Base class for loop control statements (`break` and `continue`)", - $propdoc: { - label: "[AST_LabelRef?] the label, or null if none", - }, - _walk: function(visitor) { - return visitor._visit(this, this.label && function(){ - this.label._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Break = DEFNODE("Break", null, { - $documentation: "A `break` statement" -}, AST_LoopControl); - -var AST_Continue = DEFNODE("Continue", null, { - $documentation: "A `continue` statement" -}, AST_LoopControl); - -/* -----[ IF ]----- */ - -var AST_If = DEFNODE("If", "condition alternative", { - $documentation: "A `if` statement", - $propdoc: { - condition: "[AST_Node] the `if` condition", - alternative: "[AST_Statement?] the `else` part, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - if (this.alternative) this.alternative._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ SWITCH ]----- */ - -var AST_Switch = DEFNODE("Switch", "expression", { - $documentation: "A `switch` statement", - $propdoc: { - expression: "[AST_Node] the `switch` “discriminant”" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_SwitchBranch = DEFNODE("SwitchBranch", null, { - $documentation: "Base class for `switch` branches", -}, AST_Block); - -var AST_Default = DEFNODE("Default", null, { - $documentation: "A `default` switch branch", -}, AST_SwitchBranch); - -var AST_Case = DEFNODE("Case", "expression", { - $documentation: "A `case` switch branch", - $propdoc: { - expression: "[AST_Node] the `case` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_SwitchBranch); - -/* -----[ EXCEPTIONS ]----- */ - -var AST_Try = DEFNODE("Try", "bcatch bfinally", { - $documentation: "A `try` statement", - $propdoc: { - bcatch: "[AST_Catch?] the catch block, or null if not present", - bfinally: "[AST_Finally?] the finally block, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - if (this.bcatch) this.bcatch._walk(visitor); - if (this.bfinally) this.bfinally._walk(visitor); - }); - } -}, AST_Block); - -var AST_Catch = DEFNODE("Catch", "argname", { - $documentation: "A `catch` node; only makes sense as part of a `try` statement", - $propdoc: { - argname: "[AST_SymbolCatch] symbol for the exception" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.argname._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_Finally = DEFNODE("Finally", null, { - $documentation: "A `finally` node; only makes sense as part of a `try` statement" -}, AST_Block); - -/* -----[ VAR ]----- */ - -var AST_Definitions = DEFNODE("Definitions", "definitions", { - $documentation: "Base class for `var` nodes (variable declarations/initializations)", - $propdoc: { - definitions: "[AST_VarDef*] array of variable definitions" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - var definitions = this.definitions; - for (var i = 0, len = definitions.length; i < len; i++) { - definitions[i]._walk(visitor); - } - }); - } -}, AST_Statement); - -var AST_Var = DEFNODE("Var", null, { - $documentation: "A `var` statement" -}, AST_Definitions); - -var AST_VarDef = DEFNODE("VarDef", "name value", { - $documentation: "A variable declaration; only appears in a AST_Definitions node", - $propdoc: { - name: "[AST_SymbolVar] name of the variable", - value: "[AST_Node?] initializer, or null of there's no initializer" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.name._walk(visitor); - if (this.value) this.value._walk(visitor); - }); - } -}); - -/* -----[ OTHER ]----- */ - -var AST_Call = DEFNODE("Call", "expression args", { - $documentation: "A function call expression", - $propdoc: { - expression: "[AST_Node] expression to invoke as function", - args: "[AST_Node*] array of arguments" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - var args = this.args; - for (var i = 0, len = args.length; i < len; i++) { - args[i]._walk(visitor); - } - this.expression._walk(visitor); - }); - } -}); - -var AST_New = DEFNODE("New", null, { - $documentation: "An object instantiation. Derives from a function call since it has exactly the same properties" -}, AST_Call); - -var AST_Sequence = DEFNODE("Sequence", "expressions", { - $documentation: "A sequence expression (comma-separated expressions)", - $propdoc: { - expressions: "[AST_Node*] array of expressions (at least two)" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expressions.forEach(function(node) { - node._walk(visitor); - }); - }); - } -}); - -var AST_PropAccess = DEFNODE("PropAccess", "expression property", { - $documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`", - $propdoc: { - expression: "[AST_Node] the “container” expression", - property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node" - } -}); - -var AST_Dot = DEFNODE("Dot", null, { - $documentation: "A dotted property access expression", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Sub = DEFNODE("Sub", null, { - $documentation: "Index-style property access, i.e. `a[\"foo\"]`", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.property._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Unary = DEFNODE("Unary", "operator expression", { - $documentation: "Base class for unary expressions", - $propdoc: { - operator: "[string] the operator", - expression: "[AST_Node] expression that this unary operator applies to" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}); - -var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, { - $documentation: "Unary prefix expression, i.e. `typeof i` or `++i`" -}, AST_Unary); - -var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, { - $documentation: "Unary postfix expression, i.e. `i++`" -}, AST_Unary); - -var AST_Binary = DEFNODE("Binary", "operator left right", { - $documentation: "Binary expression, i.e. `a + b`", - $propdoc: { - left: "[AST_Node] left-hand side expression", - operator: "[string] the operator", - right: "[AST_Node] right-hand side expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.left._walk(visitor); - this.right._walk(visitor); - }); - } -}); - -var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", { - $documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`", - $propdoc: { - condition: "[AST_Node]", - consequent: "[AST_Node]", - alternative: "[AST_Node]" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.consequent._walk(visitor); - this.alternative._walk(visitor); - }); - } -}); - -var AST_Assign = DEFNODE("Assign", null, { - $documentation: "An assignment expression — `a = b + 5`", -}, AST_Binary); - -/* -----[ LITERALS ]----- */ - -var AST_Array = DEFNODE("Array", "elements", { - $documentation: "An array literal", - $propdoc: { - elements: "[AST_Node*] array of elements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - var elements = this.elements; - for (var i = 0, len = elements.length; i < len; i++) { - elements[i]._walk(visitor); - } - }); - } -}); - -var AST_Object = DEFNODE("Object", "properties", { - $documentation: "An object literal", - $propdoc: { - properties: "[AST_ObjectProperty*] array of properties" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - var properties = this.properties; - for (var i = 0, len = properties.length; i < len; i++) { - properties[i]._walk(visitor); - } - }); - } -}); - -var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", { - $documentation: "Base class for literal object properties", - $propdoc: { - key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an AST_SymbolAccessor.", - value: "[AST_Node] property value. For setters and getters this is an AST_Accessor." - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.value._walk(visitor); - }); - } -}); - -var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", { - $documentation: "A key: value object property", - $propdoc: { - quote: "[string] the original quote character" - } -}, AST_ObjectProperty); - -var AST_ObjectSetter = DEFNODE("ObjectSetter", null, { - $documentation: "An object setter property", -}, AST_ObjectProperty); - -var AST_ObjectGetter = DEFNODE("ObjectGetter", null, { - $documentation: "An object getter property", -}, AST_ObjectProperty); - -var AST_Symbol = DEFNODE("Symbol", "scope name thedef", { - $propdoc: { - name: "[string] name of this symbol", - scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)", - thedef: "[SymbolDef/S] the definition of this symbol" - }, - $documentation: "Base class for all symbols", -}); - -var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, { - $documentation: "The name of a property accessor (setter/getter function)" -}, AST_Symbol); - -var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", { - $documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)", -}, AST_Symbol); - -var AST_SymbolVar = DEFNODE("SymbolVar", null, { - $documentation: "Symbol defining a variable", -}, AST_SymbolDeclaration); - -var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, { - $documentation: "Symbol naming a function argument", -}, AST_SymbolVar); - -var AST_SymbolDefun = DEFNODE("SymbolDefun", null, { - $documentation: "Symbol defining a function", -}, AST_SymbolDeclaration); - -var AST_SymbolLambda = DEFNODE("SymbolLambda", null, { - $documentation: "Symbol naming a function expression", -}, AST_SymbolDeclaration); - -var AST_SymbolCatch = DEFNODE("SymbolCatch", null, { - $documentation: "Symbol naming the exception in catch", -}, AST_SymbolDeclaration); - -var AST_Label = DEFNODE("Label", "references", { - $documentation: "Symbol naming a label (declaration)", - $propdoc: { - references: "[AST_LoopControl*] a list of nodes referring to this label" - }, - initialize: function() { - this.references = []; - this.thedef = this; - } -}, AST_Symbol); - -var AST_SymbolRef = DEFNODE("SymbolRef", null, { - $documentation: "Reference to some symbol (not definition/declaration)", -}, AST_Symbol); - -var AST_LabelRef = DEFNODE("LabelRef", null, { - $documentation: "Reference to a label symbol", -}, AST_Symbol); - -var AST_This = DEFNODE("This", null, { - $documentation: "The `this` symbol", -}, AST_Symbol); - -var AST_Constant = DEFNODE("Constant", null, { - $documentation: "Base class for all constants", - getValue: function() { - return this.value; - } -}); - -var AST_String = DEFNODE("String", "value quote", { - $documentation: "A string literal", - $propdoc: { - value: "[string] the contents of this string", - quote: "[string] the original quote character" - } -}, AST_Constant); - -var AST_Number = DEFNODE("Number", "value literal", { - $documentation: "A number literal", - $propdoc: { - value: "[number] the numeric value", - literal: "[string] numeric value as string (optional)" - } -}, AST_Constant); - -var AST_RegExp = DEFNODE("RegExp", "value", { - $documentation: "A regexp literal", - $propdoc: { - value: "[RegExp] the actual regexp" - } -}, AST_Constant); - -var AST_Atom = DEFNODE("Atom", null, { - $documentation: "Base class for atoms", -}, AST_Constant); - -var AST_Null = DEFNODE("Null", null, { - $documentation: "The `null` atom", - value: null -}, AST_Atom); - -var AST_NaN = DEFNODE("NaN", null, { - $documentation: "The impossible value", - value: 0/0 -}, AST_Atom); - -var AST_Undefined = DEFNODE("Undefined", null, { - $documentation: "The `undefined` value", - value: (function(){}()) -}, AST_Atom); - -var AST_Hole = DEFNODE("Hole", null, { - $documentation: "A hole in an array", - value: (function(){}()) -}, AST_Atom); - -var AST_Infinity = DEFNODE("Infinity", null, { - $documentation: "The `Infinity` value", - value: 1/0 -}, AST_Atom); - -var AST_Boolean = DEFNODE("Boolean", null, { - $documentation: "Base class for booleans", -}, AST_Atom); - -var AST_False = DEFNODE("False", null, { - $documentation: "The `false` atom", - value: false -}, AST_Boolean); - -var AST_True = DEFNODE("True", null, { - $documentation: "The `true` atom", - value: true -}, AST_Boolean); - -/* -----[ TreeWalker ]----- */ - -function TreeWalker(callback) { - this.visit = callback; - this.stack = []; - this.directives = Object.create(null); -}; -TreeWalker.prototype = { - _visit: function(node, descend) { - this.push(node); - var ret = this.visit(node, descend ? function(){ - descend.call(node); - } : noop); - if (!ret && descend) { - descend.call(node); - } - this.pop(); - return ret; - }, - parent: function(n) { - return this.stack[this.stack.length - 2 - (n || 0)]; - }, - push: function(node) { - if (node instanceof AST_Lambda) { - this.directives = Object.create(this.directives); - } else if (node instanceof AST_Directive && !this.directives[node.value]) { - this.directives[node.value] = node; - } - this.stack.push(node); - }, - pop: function() { - if (this.stack.pop() instanceof AST_Lambda) { - this.directives = Object.getPrototypeOf(this.directives); - } - }, - self: function() { - return this.stack[this.stack.length - 1]; - }, - find_parent: function(type) { - var stack = this.stack; - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof type) return x; - } - }, - has_directive: function(type) { - var dir = this.directives[type]; - if (dir) return dir; - var node = this.stack[this.stack.length - 1]; - if (node instanceof AST_Scope) { - for (var i = 0; i < node.body.length; ++i) { - var st = node.body[i]; - if (!(st instanceof AST_Directive)) break; - if (st.value == type) return st; - } - } - }, - loopcontrol_target: function(node) { - var stack = this.stack; - if (node.label) for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_LabeledStatement && x.label.name == node.label.name) - return x.body; - } else for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_IterationStatement - || node instanceof AST_Break && x instanceof AST_Switch) - return x; - } - } -}; diff --git a/node_modules/uglify-js/lib/compress.js b/node_modules/uglify-js/lib/compress.js deleted file mode 100644 index ce0fbdd5..00000000 --- a/node_modules/uglify-js/lib/compress.js +++ /dev/null @@ -1,5002 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -function Compressor(options, false_by_default) { - if (!(this instanceof Compressor)) - return new Compressor(options, false_by_default); - TreeTransformer.call(this, this.before, this.after); - this.options = defaults(options, { - booleans : !false_by_default, - cascade : !false_by_default, - collapse_vars : !false_by_default, - comparisons : !false_by_default, - conditionals : !false_by_default, - dead_code : !false_by_default, - drop_console : false, - drop_debugger : !false_by_default, - evaluate : !false_by_default, - expression : false, - global_defs : {}, - hoist_funs : !false_by_default, - hoist_props : !false_by_default, - hoist_vars : false, - ie8 : false, - if_return : !false_by_default, - inline : !false_by_default, - join_vars : !false_by_default, - keep_fargs : true, - keep_fnames : false, - keep_infinity : false, - loops : !false_by_default, - negate_iife : !false_by_default, - passes : 1, - properties : !false_by_default, - pure_getters : !false_by_default && "strict", - pure_funcs : null, - reduce_funcs : !false_by_default, - reduce_vars : !false_by_default, - sequences : !false_by_default, - side_effects : !false_by_default, - switches : !false_by_default, - top_retain : null, - toplevel : !!(options && options["top_retain"]), - typeofs : !false_by_default, - unsafe : false, - unsafe_comps : false, - unsafe_Func : false, - unsafe_math : false, - unsafe_proto : false, - unsafe_regexp : false, - unused : !false_by_default, - warnings : false, - }, true); - var global_defs = this.options["global_defs"]; - if (typeof global_defs == "object") for (var key in global_defs) { - if (/^@/.test(key) && HOP(global_defs, key)) { - global_defs[key.slice(1)] = parse(global_defs[key], { - expression: true - }); - } - } - var pure_funcs = this.options["pure_funcs"]; - if (typeof pure_funcs == "function") { - this.pure_funcs = pure_funcs; - } else { - this.pure_funcs = pure_funcs ? function(node) { - return pure_funcs.indexOf(node.expression.print_to_string()) < 0; - } : return_true; - } - var top_retain = this.options["top_retain"]; - if (top_retain instanceof RegExp) { - this.top_retain = function(def) { - return top_retain.test(def.name); - }; - } else if (typeof top_retain == "function") { - this.top_retain = top_retain; - } else if (top_retain) { - if (typeof top_retain == "string") { - top_retain = top_retain.split(/,/); - } - this.top_retain = function(def) { - return top_retain.indexOf(def.name) >= 0; - }; - } - var toplevel = this.options["toplevel"]; - this.toplevel = typeof toplevel == "string" ? { - funcs: /funcs/.test(toplevel), - vars: /vars/.test(toplevel) - } : { - funcs: toplevel, - vars: toplevel - }; - var sequences = this.options["sequences"]; - this.sequences_limit = sequences == 1 ? 800 : sequences | 0; - this.warnings_produced = {}; -}; - -Compressor.prototype = new TreeTransformer; -merge(Compressor.prototype, { - option: function(key) { return this.options[key] }, - exposed: function(def) { - if (def.global) for (var i = 0, len = def.orig.length; i < len; i++) - if (!this.toplevel[def.orig[i] instanceof AST_SymbolDefun ? "funcs" : "vars"]) - return true; - return false; - }, - in_boolean_context: function() { - if (!this.option("booleans")) return false; - var self = this.self(); - for (var i = 0, p; p = this.parent(i); i++) { - if (p instanceof AST_SimpleStatement - || p instanceof AST_Conditional && p.condition === self - || p instanceof AST_DWLoop && p.condition === self - || p instanceof AST_For && p.condition === self - || p instanceof AST_If && p.condition === self - || p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) { - return true; - } - if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||") - || p instanceof AST_Conditional - || p.tail_node() === self) { - self = p; - } else { - return false; - } - } - }, - compress: function(node) { - if (this.option("expression")) { - node.process_expression(true); - } - var passes = +this.options.passes || 1; - var last_count = 1 / 0; - var mangle = { ie8: this.option("ie8") }; - for (var pass = 0; pass < passes; pass++) { - node.figure_out_scope(mangle); - if (pass > 0 || this.option("reduce_vars")) - node.reset_opt_flags(this); - node = node.transform(this); - if (passes > 1) { - var count = 0; - node.walk(new TreeWalker(function() { - count++; - })); - this.info("pass " + pass + ": last_count: " + last_count + ", count: " + count); - if (count >= last_count) break; - last_count = count; - } - } - if (this.option("expression")) { - node.process_expression(false); - } - return node; - }, - info: function() { - if (this.options.warnings == "verbose") { - AST_Node.warn.apply(AST_Node, arguments); - } - }, - warn: function(text, props) { - if (this.options.warnings) { - // only emit unique warnings - var message = string_template(text, props); - if (!(message in this.warnings_produced)) { - this.warnings_produced[message] = true; - AST_Node.warn.apply(AST_Node, arguments); - } - } - }, - clear_warnings: function() { - this.warnings_produced = {}; - }, - before: function(node, descend, in_list) { - if (node._squeezed) return node; - var was_scope = false; - if (node instanceof AST_Scope) { - node = node.hoist_properties(this); - node = node.hoist_declarations(this); - was_scope = true; - } - // Before https://github.com/mishoo/UglifyJS2/pull/1602 AST_Node.optimize() - // would call AST_Node.transform() if a different instance of AST_Node is - // produced after OPT(). - // This corrupts TreeWalker.stack, which cause AST look-ups to malfunction. - // Migrate and defer all children's AST_Node.transform() to below, which - // will now happen after this parent AST_Node has been properly substituted - // thus gives a consistent AST snapshot. - descend(node, this); - // Existing code relies on how AST_Node.optimize() worked, and omitting the - // following replacement call would result in degraded efficiency of both - // output and performance. - descend(node, this); - var opt = node.optimize(this); - if (was_scope && opt instanceof AST_Scope) { - opt.drop_unused(this); - descend(opt, this); - } - if (opt === node) opt._squeezed = true; - return opt; - } -}); - -(function(){ - - function OPT(node, optimizer) { - node.DEFMETHOD("optimize", function(compressor){ - var self = this; - if (self._optimized) return self; - if (compressor.has_directive("use asm")) return self; - var opt = optimizer(self, compressor); - opt._optimized = true; - return opt; - }); - }; - - OPT(AST_Node, function(self, compressor){ - return self; - }); - - AST_Node.DEFMETHOD("equivalent_to", function(node){ - return this.TYPE == node.TYPE && this.print_to_string() == node.print_to_string(); - }); - - AST_Scope.DEFMETHOD("process_expression", function(insert, compressor) { - var self = this; - var tt = new TreeTransformer(function(node) { - if (insert && node instanceof AST_SimpleStatement) { - return make_node(AST_Return, node, { - value: node.body - }); - } - if (!insert && node instanceof AST_Return) { - if (compressor) { - var value = node.value && node.value.drop_side_effect_free(compressor, true); - return value ? make_node(AST_SimpleStatement, node, { - body: value - }) : make_node(AST_EmptyStatement, node); - } - return make_node(AST_SimpleStatement, node, { - body: node.value || make_node(AST_UnaryPrefix, node, { - operator: "void", - expression: make_node(AST_Number, node, { - value: 0 - }) - }) - }); - } - if (node instanceof AST_Lambda && node !== self) { - return node; - } - if (node instanceof AST_Block) { - var index = node.body.length - 1; - if (index >= 0) { - node.body[index] = node.body[index].transform(tt); - } - } - if (node instanceof AST_If) { - node.body = node.body.transform(tt); - if (node.alternative) { - node.alternative = node.alternative.transform(tt); - } - } - if (node instanceof AST_With) { - node.body = node.body.transform(tt); - } - return node; - }); - self.transform(tt); - }); - - AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) { - var reduce_vars = compressor.option("reduce_vars"); - var unused = compressor.option("unused"); - // Stack of look-up tables to keep track of whether a `SymbolDef` has been - // properly assigned before use: - // - `push()` & `pop()` when visiting conditional branches - // - backup & restore via `save_ids` when visiting out-of-order sections - var safe_ids = Object.create(null); - var suppressor = new TreeWalker(function(node) { - if (!(node instanceof AST_Symbol)) return; - var d = node.definition(); - if (!d) return; - if (node instanceof AST_SymbolRef) d.references.push(node); - d.fixed = false; - }); - var in_loop = null; - var loop_ids = Object.create(null); - var tw = new TreeWalker(function(node, descend) { - node._squeezed = false; - node._optimized = false; - if (reduce_vars) { - if (node instanceof AST_Toplevel) node.globals.each(reset_def); - if (node instanceof AST_Scope) node.variables.each(reset_def); - if (node instanceof AST_SymbolRef) { - var d = node.definition(); - d.references.push(node); - var value; - if (d.fixed === undefined || !safe_to_read(d) || d.single_use == "m") { - d.fixed = false; - } else if (d.fixed) { - value = node.fixed_value(); - if (value && ref_once(d)) { - d.single_use = value instanceof AST_Lambda - || d.scope === node.scope && value.is_constant_expression(); - } else { - d.single_use = false; - } - if (is_modified(node, value, 0, is_immutable(value))) { - if (d.single_use) { - d.single_use = "m"; - } else { - d.fixed = false; - } - } - } - mark_escaped(d, node.scope, node, value, 0); - } - if (node instanceof AST_SymbolCatch) { - node.definition().fixed = false; - } - if (node instanceof AST_VarDef) { - var d = node.name.definition(); - if (d.fixed === undefined || safe_to_assign(d, node.value)) { - if (node.value) { - d.fixed = function() { - return node.value; - }; - loop_ids[d.id] = in_loop; - mark(d, false); - descend(); - } else { - d.fixed = null; - } - mark(d, true); - return true; - } else if (node.value) { - d.fixed = false; - } - } - if (node instanceof AST_Assign - && node.operator == "=" - && node.left instanceof AST_SymbolRef) { - var d = node.left.definition(); - if (safe_to_assign(d, node.right)) { - d.references.push(node.left); - d.fixed = function() { - return node.right; - }; - mark(d, false); - node.right.walk(tw); - mark(d, true); - return true; - } - } - if (node instanceof AST_Defun) { - node.inlined = false; - var d = node.name.definition(); - if (compressor.exposed(d) || safe_to_read(d)) { - d.fixed = false; - } else { - d.fixed = node; - loop_ids[d.id] = in_loop; - mark(d, true); - d.single_use = ref_once(d); - } - var save_ids = safe_ids; - safe_ids = Object.create(null); - descend(); - safe_ids = save_ids; - return true; - } - if (node instanceof AST_Function) { - node.inlined = false; - push(); - var iife; - if (!node.name - && (iife = tw.parent()) instanceof AST_Call - && iife.expression === node) { - // Virtually turn IIFE parameters into variable definitions: - // (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})() - // So existing transformation rules can work on them. - node.argnames.forEach(function(arg, i) { - var d = arg.definition(); - if (!node.uses_arguments && d.fixed === undefined) { - d.fixed = function() { - return iife.args[i] || make_node(AST_Undefined, iife); - }; - loop_ids[d.id] = in_loop; - mark(d, true); - } else { - d.fixed = false; - } - }); - } - descend(); - pop(); - return true; - } - if (node instanceof AST_Accessor) { - push(); - descend(); - pop(); - return true; - } - if (node instanceof AST_Binary && lazy_op(node.operator)) { - node.left.walk(tw); - push(); - node.right.walk(tw); - pop(); - return true; - } - if (node instanceof AST_Conditional) { - node.condition.walk(tw); - push(); - node.consequent.walk(tw); - pop(); - push(); - node.alternative.walk(tw); - pop(); - return true; - } - if (node instanceof AST_If) { - node.condition.walk(tw); - push(); - node.body.walk(tw); - pop(); - if (node.alternative) { - push(); - node.alternative.walk(tw); - pop(); - } - return true; - } - if (node instanceof AST_DWLoop) { - var saved_loop = in_loop; - in_loop = node; - push(); - node.condition.walk(tw); - node.body.walk(tw); - pop(); - in_loop = saved_loop; - return true; - } - if (node instanceof AST_LabeledStatement) { - push(); - node.body.walk(tw); - pop(); - return true; - } - if (node instanceof AST_For) { - if (node.init) node.init.walk(tw); - var saved_loop = in_loop; - in_loop = node; - if (node.condition) { - push(); - node.condition.walk(tw); - pop(); - } - push(); - node.body.walk(tw); - pop(); - if (node.step) { - push(); - node.step.walk(tw); - pop(); - } - in_loop = saved_loop; - return true; - } - if (node instanceof AST_ForIn) { - node.init.walk(suppressor); - node.object.walk(tw); - var saved_loop = in_loop; - in_loop = node; - push(); - node.body.walk(tw); - pop(); - in_loop = saved_loop; - return true; - } - if (node instanceof AST_Try) { - push(); - walk_body(node, tw); - pop(); - if (node.bcatch) { - push(); - node.bcatch.walk(tw); - pop(); - } - if (node.bfinally) node.bfinally.walk(tw); - return true; - } - if (node instanceof AST_SwitchBranch) { - push(); - descend(); - pop(); - return true; - } - } - }); - this.walk(tw); - - function mark(def, safe) { - safe_ids[def.id] = safe; - } - - function safe_to_read(def) { - if (safe_ids[def.id]) { - if (def.fixed == null) { - var orig = def.orig[0]; - if (orig instanceof AST_SymbolFunarg || orig.name == "arguments") return false; - def.fixed = make_node(AST_Undefined, orig); - } - return true; - } - return def.fixed instanceof AST_Defun; - } - - function safe_to_assign(def, value) { - if (!HOP(safe_ids, def.id)) return false; - if (!safe_to_read(def)) return false; - if (def.fixed === false) return false; - if (def.fixed != null && (!value || def.references.length > 0)) return false; - return !def.orig.some(function(sym) { - return sym instanceof AST_SymbolDefun - || sym instanceof AST_SymbolLambda; - }); - } - - function push() { - safe_ids = Object.create(safe_ids); - } - - function pop() { - safe_ids = Object.getPrototypeOf(safe_ids); - } - - function reset_def(def) { - def.direct_access = false; - def.escaped = false; - if (def.scope.uses_eval || def.scope.uses_with) { - def.fixed = false; - } else if (!compressor.exposed(def)) { - def.fixed = undefined; - } else { - def.fixed = false; - } - def.references = []; - def.should_replace = undefined; - def.single_use = undefined; - } - - function ref_once(def) { - return unused - && !def.scope.uses_eval - && !def.scope.uses_with - && def.references.length == 1 - && loop_ids[def.id] === in_loop; - } - - function is_immutable(value) { - if (!value) return false; - return value.is_constant() - || value instanceof AST_Lambda - || value instanceof AST_This; - } - - function read_property(obj, key) { - if (key instanceof AST_Constant) key = key.getValue(); - if (key instanceof AST_Node) return null; - var value; - if (obj instanceof AST_Array) { - var elements = obj.elements; - if (key == "length") return make_node_from_constant(elements.length, obj); - if (typeof key == "number" && key in elements) value = elements[key]; - } else if (obj instanceof AST_Object) { - var props = obj.properties; - for (var i = props.length; --i >= 0;) { - var prop = props[i]; - if (!(prop instanceof AST_ObjectKeyVal)) return; - if (!value && props[i].key === key) value = props[i].value; - } - } - return value instanceof AST_SymbolRef && value.fixed_value() || value; - } - - function is_modified(node, value, level, immutable) { - var parent = tw.parent(level); - if (is_lhs(node, parent) - || !immutable - && parent instanceof AST_Call - && parent.expression === node - && (!(value instanceof AST_Function) - || !(parent instanceof AST_New) && value.contains_this())) { - return true; - } else if (parent instanceof AST_Array) { - return is_modified(parent, parent, level + 1); - } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { - var obj = tw.parent(level + 1); - return is_modified(obj, obj, level + 2); - } else if (parent instanceof AST_PropAccess && parent.expression === node) { - return !immutable && is_modified(parent, read_property(value, parent.property), level + 1); - } - } - - function mark_escaped(d, scope, node, value, level) { - var parent = tw.parent(level); - if (value) { - if (value.is_constant()) return; - if (level > 0 && value.is_constant_expression(scope)) return; - } - if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right - || parent instanceof AST_Call && node !== parent.expression - || parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope - || parent instanceof AST_VarDef && node === parent.value) { - d.escaped = true; - return; - } else if (parent instanceof AST_Array - || parent instanceof AST_Conditional && node !== parent.condition - || parent instanceof AST_Sequence && node === parent.tail_node()) { - mark_escaped(d, scope, parent, parent, level + 1); - } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { - var obj = tw.parent(level + 1); - mark_escaped(d, scope, obj, obj, level + 2); - } else if (parent instanceof AST_PropAccess && node === parent.expression) { - value = read_property(value, parent.property); - mark_escaped(d, scope, parent, value, level + 1); - if (value) return; - } - if (level == 0) d.direct_access = true; - } - }); - - AST_Symbol.DEFMETHOD("fixed_value", function() { - var fixed = this.definition().fixed; - if (!fixed || fixed instanceof AST_Node) return fixed; - return fixed(); - }); - - AST_SymbolRef.DEFMETHOD("is_immutable", function() { - var orig = this.definition().orig; - return orig.length == 1 && orig[0] instanceof AST_SymbolLambda; - }); - - function is_lhs_read_only(lhs) { - if (lhs instanceof AST_This) return true; - if (lhs instanceof AST_SymbolRef) return lhs.definition().orig[0] instanceof AST_SymbolLambda; - if (lhs instanceof AST_PropAccess) { - lhs = lhs.expression; - if (lhs instanceof AST_SymbolRef) { - if (lhs.is_immutable()) return false; - lhs = lhs.fixed_value(); - } - if (!lhs) return true; - if (lhs instanceof AST_RegExp) return false; - if (lhs instanceof AST_Constant) return true; - return is_lhs_read_only(lhs); - } - return false; - } - - function find_variable(compressor, name) { - var scope, i = 0; - while (scope = compressor.parent(i++)) { - if (scope instanceof AST_Scope) break; - if (scope instanceof AST_Catch) { - scope = scope.argname.definition().scope; - break; - } - } - return scope.find_variable(name); - } - - function make_node(ctor, orig, props) { - if (!props) props = {}; - if (orig) { - if (!props.start) props.start = orig.start; - if (!props.end) props.end = orig.end; - } - return new ctor(props); - }; - - function make_sequence(orig, expressions) { - if (expressions.length == 1) return expressions[0]; - return make_node(AST_Sequence, orig, { - expressions: expressions.reduce(merge_sequence, []) - }); - } - - function make_node_from_constant(val, orig) { - switch (typeof val) { - case "string": - return make_node(AST_String, orig, { - value: val - }); - case "number": - if (isNaN(val)) return make_node(AST_NaN, orig); - if (isFinite(val)) { - return 1 / val < 0 ? make_node(AST_UnaryPrefix, orig, { - operator: "-", - expression: make_node(AST_Number, orig, { value: -val }) - }) : make_node(AST_Number, orig, { value: val }); - } - return val < 0 ? make_node(AST_UnaryPrefix, orig, { - operator: "-", - expression: make_node(AST_Infinity, orig) - }) : make_node(AST_Infinity, orig); - case "boolean": - return make_node(val ? AST_True : AST_False, orig); - case "undefined": - return make_node(AST_Undefined, orig); - default: - if (val === null) { - return make_node(AST_Null, orig, { value: null }); - } - if (val instanceof RegExp) { - return make_node(AST_RegExp, orig, { value: val }); - } - throw new Error(string_template("Can't handle constant of type: {type}", { - type: typeof val - })); - } - }; - - // we shouldn't compress (1,func)(something) to - // func(something) because that changes the meaning of - // the func (becomes lexical instead of global). - function maintain_this_binding(parent, orig, val) { - if (parent instanceof AST_UnaryPrefix && parent.operator == "delete" - || parent instanceof AST_Call && parent.expression === orig - && (val instanceof AST_PropAccess || val instanceof AST_SymbolRef && val.name == "eval")) { - return make_sequence(orig, [ make_node(AST_Number, orig, { value: 0 }), val ]); - } - return val; - } - - function merge_sequence(array, node) { - if (node instanceof AST_Sequence) { - array.push.apply(array, node.expressions); - } else { - array.push(node); - } - return array; - } - - function as_statement_array(thing) { - if (thing === null) return []; - if (thing instanceof AST_BlockStatement) return thing.body; - if (thing instanceof AST_EmptyStatement) return []; - if (thing instanceof AST_Statement) return [ thing ]; - throw new Error("Can't convert thing to statement array"); - }; - - function is_empty(thing) { - if (thing === null) return true; - if (thing instanceof AST_EmptyStatement) return true; - if (thing instanceof AST_BlockStatement) return thing.body.length == 0; - return false; - }; - - function loop_body(x) { - if (x instanceof AST_Switch) return x; - if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) { - return (x.body instanceof AST_BlockStatement ? x.body : x); - } - return x; - }; - - function is_iife_call(node) { - if (node instanceof AST_Call && !(node instanceof AST_New)) { - return node.expression instanceof AST_Function || is_iife_call(node.expression); - } - return false; - } - - function is_undeclared_ref(node) { - return node instanceof AST_SymbolRef && node.definition().undeclared; - } - - var global_names = makePredicate("Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Math Number parseFloat parseInt RangeError ReferenceError RegExp Object setInterval setTimeout String SyntaxError TypeError unescape URIError"); - AST_SymbolRef.DEFMETHOD("is_declared", function(compressor) { - return !this.definition().undeclared - || compressor.option("unsafe") && global_names(this.name); - }); - - function is_identifier_atom(node) { - return node instanceof AST_Infinity - || node instanceof AST_NaN - || node instanceof AST_Undefined; - } - - function tighten_body(statements, compressor) { - var CHANGED, max_iter = 10; - do { - CHANGED = false; - eliminate_spurious_blocks(statements); - if (compressor.option("dead_code")) { - eliminate_dead_code(statements, compressor); - } - if (compressor.option("if_return")) { - handle_if_return(statements, compressor); - } - if (compressor.sequences_limit > 0) { - sequencesize(statements, compressor); - } - if (compressor.option("join_vars")) { - join_consecutive_vars(statements, compressor); - } - if (compressor.option("collapse_vars")) { - collapse(statements, compressor); - } - } while (CHANGED && max_iter-- > 0); - - // Search from right to left for assignment-like expressions: - // - `var a = x;` - // - `a = x;` - // - `++a` - // For each candidate, scan from left to right for first usage, then try - // to fold assignment into the site for compression. - // Will not attempt to collapse assignments into or past code blocks - // which are not sequentially executed, e.g. loops and conditionals. - function collapse(statements, compressor) { - var scope = compressor.find_parent(AST_Scope); - if (scope.uses_eval || scope.uses_with) return statements; - var args; - var candidates = []; - var stat_index = statements.length; - var scanner = new TreeTransformer(function(node, descend) { - if (abort) return node; - // Skip nodes before `candidate` as quickly as possible - if (!hit) { - if (node === candidate) { - hit = true; - return node; - } - return; - } - // Stop immediately if these node types are encountered - var parent = scanner.parent(); - if (node instanceof AST_Assign && node.operator != "=" && lhs.equivalent_to(node.left) - || node instanceof AST_Call && lhs instanceof AST_PropAccess && lhs.equivalent_to(node.expression) - || node instanceof AST_Debugger - || node instanceof AST_IterationStatement && !(node instanceof AST_For) - || node instanceof AST_SymbolRef && !node.is_declared(compressor) - || node instanceof AST_Try - || node instanceof AST_With - || parent instanceof AST_For && node !== parent.init) { - abort = true; - return node; - } - // Replace variable with assignment when found - if (can_replace - && !(node instanceof AST_SymbolDeclaration) - && lhs.equivalent_to(node)) { - if (is_lhs(node, parent)) { - if (value_def) replaced++; - return node; - } - CHANGED = abort = true; - replaced++; - compressor.info("Collapsing {name} [{file}:{line},{col}]", { - name: node.print_to_string(), - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - if (candidate instanceof AST_UnaryPostfix) { - return make_node(AST_UnaryPrefix, candidate, candidate); - } - if (candidate instanceof AST_VarDef) { - if (value_def) { - abort = false; - return node; - } - var def = candidate.name.definition(); - var value = candidate.value; - if (def.references.length - def.replaced == 1 && !compressor.exposed(def)) { - def.replaced++; - if (funarg && is_identifier_atom(value)) { - return value.transform(compressor); - } else { - return maintain_this_binding(parent, node, value); - } - } - return make_node(AST_Assign, candidate, { - operator: "=", - left: make_node(AST_SymbolRef, candidate.name, candidate.name), - right: value - }); - } - candidate.write_only = false; - return candidate; - } - // These node types have child nodes that execute sequentially, - // but are otherwise not safe to scan into or beyond them. - var sym; - if (node instanceof AST_Call - || node instanceof AST_Exit - || node instanceof AST_PropAccess - && (side_effects || node.expression.may_throw_on_access(compressor)) - || node instanceof AST_SymbolRef - && (lvalues[node.name] - || side_effects && !references_in_scope(node.definition())) - || (sym = lhs_or_def(node)) - && (sym instanceof AST_PropAccess || sym.name in lvalues) - || (side_effects || !replace_all) - && (parent instanceof AST_Binary && lazy_op(parent.operator) - || parent instanceof AST_Case - || parent instanceof AST_Conditional - || parent instanceof AST_If)) { - if (!(node instanceof AST_Scope)) descend(node, scanner); - abort = true; - return node; - } - // Skip (non-executed) functions and (leading) default case in switch statements - if (node instanceof AST_Default || node instanceof AST_Scope) return node; - }); - var multi_replacer = new TreeTransformer(function(node) { - if (abort) return node; - // Skip nodes before `candidate` as quickly as possible - if (!hit) { - if (node === candidate) { - hit = true; - return node; - } - return; - } - // Replace variable when found - if (node instanceof AST_SymbolRef - && node.name == def.name) { - if (!--replaced) abort = true; - if (is_lhs(node, multi_replacer.parent())) return node; - def.replaced++; - value_def.replaced--; - return candidate.value; - } - // Skip (non-executed) functions and (leading) default case in switch statements - if (node instanceof AST_Default || node instanceof AST_Scope) return node; - }); - while (--stat_index >= 0) { - // Treat parameters as collapsible in IIFE, i.e. - // function(a, b){ ... }(x()); - // would be translated into equivalent assignments: - // var a = x(), b = undefined; - if (stat_index == 0 && compressor.option("unused")) extract_args(); - // Find collapsible assignments - extract_candidates(statements[stat_index]); - while (candidates.length > 0) { - var candidate = candidates.pop(); - var value_def = null; - var lhs = get_lhs(candidate); - if (!lhs || is_lhs_read_only(lhs) || lhs.has_side_effects(compressor)) continue; - // Locate symbols which may execute code outside of scanning range - var lvalues = get_lvalues(candidate); - if (lhs instanceof AST_SymbolRef) lvalues[lhs.name] = false; - var replace_all = value_def; - if (!replace_all && lhs instanceof AST_SymbolRef) { - var def = lhs.definition(); - replace_all = def.references.length - def.replaced == 1; - } - var side_effects = value_has_side_effects(candidate); - var funarg = candidate.name instanceof AST_SymbolFunarg; - var hit = funarg; - var abort = false, replaced = 0, can_replace = !args || !hit; - if (!can_replace) { - for (var j = compressor.self().argnames.lastIndexOf(candidate.name) + 1; !abort && j < args.length; j++) { - args[j].transform(scanner); - } - can_replace = true; - } - for (var i = stat_index; !abort && i < statements.length; i++) { - statements[i].transform(scanner); - } - if (value_def) { - var def = candidate.name.definition(); - if (abort && def.references.length - def.replaced > replaced) replaced = false; - else { - abort = false; - hit = funarg; - for (var i = stat_index; !abort && i < statements.length; i++) { - statements[i].transform(multi_replacer); - } - } - } - if (replaced && !remove_candidate(candidate)) statements.splice(stat_index, 1); - } - } - - function extract_args() { - var iife, fn = compressor.self(); - if (fn instanceof AST_Function - && !fn.name - && !fn.uses_arguments - && !fn.uses_eval - && (iife = compressor.parent()) instanceof AST_Call - && iife.expression === fn) { - var fn_strict = compressor.has_directive("use strict"); - if (fn_strict && !member(fn_strict, fn.body)) fn_strict = false; - var len = fn.argnames.length; - args = iife.args.slice(len); - var names = Object.create(null); - for (var i = len; --i >= 0;) { - var sym = fn.argnames[i]; - var arg = iife.args[i]; - args.unshift(make_node(AST_VarDef, sym, { - name: sym, - value: arg - })); - if (sym.name in names) continue; - names[sym.name] = true; - if (!arg) arg = make_node(AST_Undefined, sym).transform(compressor); - else { - var tw = new TreeWalker(function(node) { - if (!arg) return true; - if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) { - var s = node.definition().scope; - if (s !== scope) while (s = s.parent_scope) { - if (s === scope) return true; - } - arg = null; - } - if (node instanceof AST_This && (fn_strict || !tw.find_parent(AST_Scope))) { - arg = null; - return true; - } - }); - arg.walk(tw); - } - if (arg) candidates.unshift(make_node(AST_VarDef, sym, { - name: sym, - value: arg - })); - } - } - } - - function extract_candidates(expr) { - if (expr instanceof AST_Assign && !expr.left.has_side_effects(compressor) - || expr instanceof AST_Unary && (expr.operator == "++" || expr.operator == "--")) { - candidates.push(expr); - } else if (expr instanceof AST_Sequence) { - expr.expressions.forEach(extract_candidates); - } else if (expr instanceof AST_Definitions) { - expr.definitions.forEach(function(var_def) { - if (var_def.value) candidates.push(var_def); - }); - } else if (expr instanceof AST_SimpleStatement) { - extract_candidates(expr.body); - } else if (expr instanceof AST_For && expr.init) { - extract_candidates(expr.init); - } - } - - function mangleable_var(var_def) { - var value = var_def.value; - if (!(value instanceof AST_SymbolRef)) return; - if (value.name == "arguments") return; - var def = value.definition(); - if (def.undeclared) return; - return value_def = def; - } - - function get_lhs(expr) { - if (expr instanceof AST_VarDef) { - var def = expr.name.definition(); - if (!member(expr.name, def.orig)) return; - var declared = def.orig.length - def.eliminated; - var referenced = def.references.length - def.replaced; - if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg) - || (referenced > 1 ? mangleable_var(expr) : !compressor.exposed(def))) { - return make_node(AST_SymbolRef, expr.name, expr.name); - } - } else { - return expr[expr instanceof AST_Assign ? "left" : "expression"]; - } - } - - function get_rvalue(expr) { - return expr[expr instanceof AST_Assign ? "right" : "value"]; - } - - function get_lvalues(expr) { - var lvalues = Object.create(null); - if (expr instanceof AST_Unary) return lvalues; - var tw = new TreeWalker(function(node, descend) { - var sym = node; - while (sym instanceof AST_PropAccess) sym = sym.expression; - if (sym instanceof AST_SymbolRef || sym instanceof AST_This) { - lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent()); - } - }); - get_rvalue(expr).walk(tw); - return lvalues; - } - - function lhs_or_def(node) { - if (node instanceof AST_VarDef) return node.value && node.name; - return is_lhs(node.left, node); - } - - function remove_candidate(expr) { - if (expr.name instanceof AST_SymbolFunarg) { - var index = compressor.self().argnames.indexOf(expr.name); - var args = compressor.parent().args; - if (args[index]) args[index] = make_node(AST_Number, args[index], { - value: 0 - }); - return true; - } - var found = false; - return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) { - if (found) return node; - if (node === expr || node.body === expr) { - found = true; - if (node instanceof AST_VarDef) { - node.value = null; - return node; - } - return in_list ? MAP.skip : null; - } - }, function(node) { - if (node instanceof AST_Sequence) switch (node.expressions.length) { - case 0: return null; - case 1: return node.expressions[0]; - } - })); - } - - function value_has_side_effects(expr) { - if (expr instanceof AST_Unary) return false; - return get_rvalue(expr).has_side_effects(compressor); - } - - function references_in_scope(def) { - if (def.orig.length == 1 && def.orig[0] instanceof AST_SymbolDefun) return true; - if (def.scope !== scope) return false; - return def.references.every(function(ref) { - return ref.scope === scope; - }); - } - } - - function eliminate_spurious_blocks(statements) { - var seen_dirs = []; - for (var i = 0; i < statements.length;) { - var stat = statements[i]; - if (stat instanceof AST_BlockStatement) { - CHANGED = true; - eliminate_spurious_blocks(stat.body); - [].splice.apply(statements, [i, 1].concat(stat.body)); - i += stat.body.length; - } else if (stat instanceof AST_EmptyStatement) { - CHANGED = true; - statements.splice(i, 1); - } else if (stat instanceof AST_Directive) { - if (seen_dirs.indexOf(stat.value) < 0) { - i++; - seen_dirs.push(stat.value); - } else { - CHANGED = true; - statements.splice(i, 1); - } - } else i++; - } - } - - function handle_if_return(statements, compressor) { - var self = compressor.self(); - var multiple_if_returns = has_multiple_if_returns(statements); - var in_lambda = self instanceof AST_Lambda; - for (var i = statements.length; --i >= 0;) { - var stat = statements[i]; - var next = statements[i + 1]; - - if (in_lambda && !next && stat instanceof AST_Return) { - if (!stat.value) { - CHANGED = true; - statements.length--; - continue; - } - if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == "void") { - CHANGED = true; - statements[i] = make_node(AST_SimpleStatement, stat, { - body: stat.value.expression - }); - continue; - } - } - - if (stat instanceof AST_If) { - var ab = aborts(stat.body); - if (can_merge_flow(ab)) { - if (ab.label) { - remove(ab.label.thedef.references, ab); - } - CHANGED = true; - stat = stat.clone(); - stat.condition = stat.condition.negate(compressor); - var body = as_statement_array_with_return(stat.body, ab); - stat.body = make_node(AST_BlockStatement, stat, { - body: as_statement_array(stat.alternative).concat(extract_functions()) - }); - stat.alternative = make_node(AST_BlockStatement, stat, { - body: body - }); - statements[i] = stat.transform(compressor); - continue; - } - - var ab = aborts(stat.alternative); - if (can_merge_flow(ab)) { - if (ab.label) { - remove(ab.label.thedef.references, ab); - } - CHANGED = true; - stat = stat.clone(); - stat.body = make_node(AST_BlockStatement, stat.body, { - body: as_statement_array(stat.body).concat(extract_functions()) - }); - var body = as_statement_array_with_return(stat.alternative, ab); - stat.alternative = make_node(AST_BlockStatement, stat.alternative, { - body: body - }); - statements[i] = stat.transform(compressor); - continue; - } - } - - if (stat instanceof AST_If && stat.body instanceof AST_Return) { - var value = stat.body.value; - //--- - // pretty silly case, but: - // if (foo()) return; return; ==> foo(); return; - if (!value && !stat.alternative - && (in_lambda && !next || next instanceof AST_Return && !next.value)) { - CHANGED = true; - statements[i] = make_node(AST_SimpleStatement, stat.condition, { - body: stat.condition - }); - continue; - } - //--- - // if (foo()) return x; return y; ==> return foo() ? x : y; - if (value && !stat.alternative && next instanceof AST_Return && next.value) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = next; - statements.splice(i, 2, stat.transform(compressor)); - continue; - } - //--- - // if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined; - if (multiple_if_returns && in_lambda && value && !stat.alternative - && (!next || next instanceof AST_Return)) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = next || make_node(AST_Return, stat, { - value: null - }); - statements.splice(i, next ? 2 : 1, stat.transform(compressor)); - continue; - } - //--- - // if (a) return b; if (c) return d; e; ==> return a ? b : c ? d : void e; - // - // if sequences is not enabled, this can lead to an endless loop (issue #866). - // however, with sequences on this helps producing slightly better output for - // the example code. - var prev = statements[i - 1]; - if (compressor.option("sequences") && in_lambda && !stat.alternative - && prev instanceof AST_If && prev.body instanceof AST_Return - && i + 2 == statements.length && next instanceof AST_SimpleStatement) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = make_node(AST_BlockStatement, next, { - body: [ - next, - make_node(AST_Return, next, { - value: null - }) - ] - }); - statements.splice(i, 2, stat.transform(compressor)); - continue; - } - } - } - - function has_multiple_if_returns(statements) { - var n = 0; - for (var i = statements.length; --i >= 0;) { - var stat = statements[i]; - if (stat instanceof AST_If && stat.body instanceof AST_Return) { - if (++n > 1) return true; - } - } - return false; - } - - function is_return_void(value) { - return !value || value instanceof AST_UnaryPrefix && value.operator == "void"; - } - - function can_merge_flow(ab) { - if (!ab) return false; - var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab) : null; - return ab instanceof AST_Return && in_lambda && is_return_void(ab.value) - || ab instanceof AST_Continue && self === loop_body(lct) - || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct; - } - - function extract_functions() { - var tail = statements.slice(i + 1); - statements.length = i + 1; - return tail.filter(function(stat) { - if (stat instanceof AST_Defun) { - statements.push(stat); - return false; - } - return true; - }); - } - - function as_statement_array_with_return(node, ab) { - var body = as_statement_array(node).slice(0, -1); - if (ab.value) { - body.push(make_node(AST_SimpleStatement, ab.value, { - body: ab.value.expression - })); - } - return body; - } - } - - function eliminate_dead_code(statements, compressor) { - var has_quit; - var self = compressor.self(); - for (var i = 0, n = 0, len = statements.length; i < len; i++) { - var stat = statements[i]; - if (stat instanceof AST_LoopControl) { - var lct = compressor.loopcontrol_target(stat); - if (stat instanceof AST_Break - && !(lct instanceof AST_IterationStatement) - && loop_body(lct) === self - || stat instanceof AST_Continue - && loop_body(lct) === self) { - if (stat.label) { - remove(stat.label.thedef.references, stat); - } - } else { - statements[n++] = stat; - } - } else { - statements[n++] = stat; - } - if (aborts(stat)) { - has_quit = statements.slice(i + 1); - break; - } - } - statements.length = n; - CHANGED = n != len; - if (has_quit) has_quit.forEach(function(stat) { - extract_declarations_from_unreachable_code(compressor, stat, statements); - }); - } - - function sequencesize(statements, compressor) { - if (statements.length < 2) return; - var seq = [], n = 0; - function push_seq() { - if (!seq.length) return; - var body = make_sequence(seq[0], seq); - statements[n++] = make_node(AST_SimpleStatement, body, { body: body }); - seq = []; - } - for (var i = 0, len = statements.length; i < len; i++) { - var stat = statements[i]; - if (stat instanceof AST_SimpleStatement) { - if (seq.length >= compressor.sequences_limit) push_seq(); - var body = stat.body; - if (seq.length > 0) body = body.drop_side_effect_free(compressor); - if (body) merge_sequence(seq, body); - } else { - push_seq(); - statements[n++] = stat; - } - } - push_seq(); - statements.length = n; - sequencesize_2(statements, compressor); - CHANGED = statements.length != len; - } - - function sequencesize_2(statements, compressor) { - function cons_seq(right) { - n--; - var left = prev.body; - return make_sequence(left, [ left, right ]).transform(compressor); - }; - var n = 0, prev; - for (var i = 0, len = statements.length; i < len; i++) { - var stat = statements[i]; - if (prev) { - if (stat instanceof AST_For && !(stat.init instanceof AST_Definitions)) { - var abort = false; - prev.body.walk(new TreeWalker(function(node) { - if (abort || node instanceof AST_Scope) return true; - if (node instanceof AST_Binary && node.operator == "in") { - abort = true; - return true; - } - })); - if (!abort) { - if (stat.init) stat.init = cons_seq(stat.init); - else { - stat.init = prev.body; - n--; - } - } - } - else if (stat instanceof AST_If) { - stat.condition = cons_seq(stat.condition); - } - else if (stat instanceof AST_With) { - stat.expression = cons_seq(stat.expression); - } - else if (stat instanceof AST_Exit && stat.value) { - stat.value = cons_seq(stat.value); - } - else if (stat instanceof AST_Exit) { - stat.value = cons_seq(make_node(AST_Undefined, stat).transform(compressor)); - } - else if (stat instanceof AST_Switch) { - stat.expression = cons_seq(stat.expression); - } - } - statements[n++] = stat; - prev = stat instanceof AST_SimpleStatement ? stat : null; - } - statements.length = n; - } - - function join_consecutive_vars(statements, compressor) { - for (var i = 0, j = -1, len = statements.length; i < len; i++) { - var stat = statements[i]; - var prev = statements[j]; - if (stat instanceof AST_Definitions && prev && prev.TYPE == stat.TYPE) { - prev.definitions = prev.definitions.concat(stat.definitions); - CHANGED = true; - } - else if (stat instanceof AST_For - && prev instanceof AST_Var - && (!stat.init || stat.init.TYPE == prev.TYPE)) { - CHANGED = true; - if (stat.init) { - stat.init.definitions = prev.definitions.concat(stat.init.definitions); - } else { - stat.init = prev; - } - statements[j] = stat; - } - else { - statements[++j] = stat; - } - } - statements.length = j + 1; - }; - } - - function extract_declarations_from_unreachable_code(compressor, stat, target) { - if (!(stat instanceof AST_Defun)) { - compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); - } - stat.walk(new TreeWalker(function(node){ - if (node instanceof AST_Definitions) { - compressor.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start); - node.remove_initializers(); - target.push(node); - return true; - } - if (node instanceof AST_Defun && (node === stat || !compressor.has_directive("use strict"))) { - target.push(node); - return true; - } - if (node instanceof AST_Scope) { - return true; - } - })); - }; - - function is_undefined(node, compressor) { - return node.is_undefined - || node instanceof AST_Undefined - || node instanceof AST_UnaryPrefix - && node.operator == "void" - && !node.expression.has_side_effects(compressor); - } - - // may_throw_on_access() - // returns true if this node may be null, undefined or contain `AST_Accessor` - (function(def) { - AST_Node.DEFMETHOD("may_throw_on_access", function(compressor) { - return !compressor.option("pure_getters") - || this._dot_throw(compressor); - }); - - function is_strict(compressor) { - return /strict/.test(compressor.option("pure_getters")); - } - - def(AST_Node, is_strict); - def(AST_Null, return_true); - def(AST_Undefined, return_true); - def(AST_Constant, return_false); - def(AST_Array, return_false); - def(AST_Object, function(compressor) { - if (!is_strict(compressor)) return false; - for (var i = this.properties.length; --i >=0;) - if (this.properties[i].value instanceof AST_Accessor) return true; - return false; - }); - def(AST_Function, return_false); - def(AST_UnaryPostfix, return_false); - def(AST_UnaryPrefix, function() { - return this.operator == "void"; - }); - def(AST_Binary, function(compressor) { - switch (this.operator) { - case "&&": - return this.left._dot_throw(compressor); - case "||": - return this.left._dot_throw(compressor) - && this.right._dot_throw(compressor); - default: - return false; - } - }) - def(AST_Assign, function(compressor) { - return this.operator == "=" - && this.right._dot_throw(compressor); - }) - def(AST_Conditional, function(compressor) { - return this.consequent._dot_throw(compressor) - || this.alternative._dot_throw(compressor); - }) - def(AST_Sequence, function(compressor) { - return this.tail_node()._dot_throw(compressor); - }); - def(AST_SymbolRef, function(compressor) { - if (this.is_undefined) return true; - if (!is_strict(compressor)) return false; - if (is_undeclared_ref(this) && this.is_declared(compressor)) return false; - if (this.is_immutable()) return false; - var fixed = this.fixed_value(); - return !fixed || fixed._dot_throw(compressor); - }); - })(function(node, func) { - node.DEFMETHOD("_dot_throw", func); - }); - - /* -----[ boolean/negation helpers ]----- */ - - // methods to determine whether an expression has a boolean result type - (function(def){ - var unary_bool = [ "!", "delete" ]; - var binary_bool = [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ]; - def(AST_Node, return_false); - def(AST_UnaryPrefix, function(){ - return member(this.operator, unary_bool); - }); - def(AST_Binary, function(){ - return member(this.operator, binary_bool) - || lazy_op(this.operator) - && this.left.is_boolean() - && this.right.is_boolean(); - }); - def(AST_Conditional, function(){ - return this.consequent.is_boolean() && this.alternative.is_boolean(); - }); - def(AST_Assign, function(){ - return this.operator == "=" && this.right.is_boolean(); - }); - def(AST_Sequence, function(){ - return this.tail_node().is_boolean(); - }); - def(AST_True, return_true); - def(AST_False, return_true); - })(function(node, func){ - node.DEFMETHOD("is_boolean", func); - }); - - // methods to determine if an expression has a numeric result type - (function(def){ - def(AST_Node, return_false); - def(AST_Number, return_true); - var unary = makePredicate("+ - ~ ++ --"); - def(AST_Unary, function(){ - return unary(this.operator); - }); - var binary = makePredicate("- * / % & | ^ << >> >>>"); - def(AST_Binary, function(compressor){ - return binary(this.operator) || this.operator == "+" - && this.left.is_number(compressor) - && this.right.is_number(compressor); - }); - def(AST_Assign, function(compressor){ - return binary(this.operator.slice(0, -1)) - || this.operator == "=" && this.right.is_number(compressor); - }); - def(AST_Sequence, function(compressor){ - return this.tail_node().is_number(compressor); - }); - def(AST_Conditional, function(compressor){ - return this.consequent.is_number(compressor) && this.alternative.is_number(compressor); - }); - })(function(node, func){ - node.DEFMETHOD("is_number", func); - }); - - // methods to determine if an expression has a string result type - (function(def){ - def(AST_Node, return_false); - def(AST_String, return_true); - def(AST_UnaryPrefix, function(){ - return this.operator == "typeof"; - }); - def(AST_Binary, function(compressor){ - return this.operator == "+" && - (this.left.is_string(compressor) || this.right.is_string(compressor)); - }); - def(AST_Assign, function(compressor){ - return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor); - }); - def(AST_Sequence, function(compressor){ - return this.tail_node().is_string(compressor); - }); - def(AST_Conditional, function(compressor){ - return this.consequent.is_string(compressor) && this.alternative.is_string(compressor); - }); - })(function(node, func){ - node.DEFMETHOD("is_string", func); - }); - - var lazy_op = makePredicate("&& ||"); - var unary_side_effects = makePredicate("delete ++ --"); - - function is_lhs(node, parent) { - if (parent instanceof AST_Unary && unary_side_effects(parent.operator)) return parent.expression; - if (parent instanceof AST_Assign && parent.left === node) return node; - } - - (function(def){ - AST_Node.DEFMETHOD("resolve_defines", function(compressor) { - if (!compressor.option("global_defs")) return; - var def = this._find_defs(compressor, ""); - if (def) { - var node, parent = this, level = 0; - do { - node = parent; - parent = compressor.parent(level++); - } while (parent instanceof AST_PropAccess && parent.expression === node); - if (is_lhs(node, parent)) { - compressor.warn('global_defs ' + this.print_to_string() + ' redefined [{file}:{line},{col}]', this.start); - } else { - return def; - } - } - }); - function to_node(value, orig) { - if (value instanceof AST_Node) return make_node(value.CTOR, orig, value); - if (Array.isArray(value)) return make_node(AST_Array, orig, { - elements: value.map(function(value) { - return to_node(value, orig); - }) - }); - if (value && typeof value == "object") { - var props = []; - for (var key in value) if (HOP(value, key)) { - props.push(make_node(AST_ObjectKeyVal, orig, { - key: key, - value: to_node(value[key], orig) - })); - } - return make_node(AST_Object, orig, { - properties: props - }); - } - return make_node_from_constant(value, orig); - } - def(AST_Node, noop); - def(AST_Dot, function(compressor, suffix){ - return this.expression._find_defs(compressor, "." + this.property + suffix); - }); - def(AST_SymbolRef, function(compressor, suffix){ - if (!this.global()) return; - var name; - var defines = compressor.option("global_defs"); - if (defines && HOP(defines, (name = this.name + suffix))) { - var node = to_node(defines[name], this); - var top = compressor.find_parent(AST_Toplevel); - node.walk(new TreeWalker(function(node) { - if (node instanceof AST_SymbolRef) { - node.scope = top; - node.thedef = top.def_global(node); - } - })); - return node; - } - }); - })(function(node, func){ - node.DEFMETHOD("_find_defs", func); - }); - - function best_of_expression(ast1, ast2) { - return ast1.print_to_string().length > - ast2.print_to_string().length - ? ast2 : ast1; - } - - function best_of_statement(ast1, ast2) { - return best_of_expression(make_node(AST_SimpleStatement, ast1, { - body: ast1 - }), make_node(AST_SimpleStatement, ast2, { - body: ast2 - })).body; - } - - function best_of(compressor, ast1, ast2) { - return (first_in_statement(compressor) ? best_of_statement : best_of_expression)(ast1, ast2); - } - - // methods to evaluate a constant expression - (function(def){ - // If the node has been successfully reduced to a constant, - // then its value is returned; otherwise the element itself - // is returned. - // They can be distinguished as constant value is never a - // descendant of AST_Node. - AST_Node.DEFMETHOD("evaluate", function(compressor){ - if (!compressor.option("evaluate")) return this; - var val = this._eval(compressor); - return !val || val instanceof RegExp || typeof val != "object" ? val : this; - }); - var unaryPrefix = makePredicate("! ~ - + void"); - AST_Node.DEFMETHOD("is_constant", function(){ - // Accomodate when compress option evaluate=false - // as well as the common constant expressions !0 and -1 - if (this instanceof AST_Constant) { - return !(this instanceof AST_RegExp); - } else { - return this instanceof AST_UnaryPrefix - && this.expression instanceof AST_Constant - && unaryPrefix(this.operator); - } - }); - def(AST_Statement, function(){ - throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); - }); - def(AST_Lambda, return_this); - function ev(node, compressor) { - if (!compressor) throw new Error("Compressor must be passed"); - - return node._eval(compressor); - }; - def(AST_Node, return_this); - def(AST_Constant, function(){ - return this.getValue(); - }); - def(AST_Array, function(compressor){ - if (compressor.option("unsafe")) { - var elements = []; - for (var i = 0, len = this.elements.length; i < len; i++) { - var element = this.elements[i]; - if (element instanceof AST_Function) continue; - var value = ev(element, compressor); - if (element === value) return this; - elements.push(value); - } - return elements; - } - return this; - }); - def(AST_Object, function(compressor){ - if (compressor.option("unsafe")) { - var val = {}; - for (var i = 0, len = this.properties.length; i < len; i++) { - var prop = this.properties[i]; - var key = prop.key; - if (key instanceof AST_Symbol) { - key = key.name; - } else if (key instanceof AST_Node) { - key = ev(key, compressor); - if (key === prop.key) return this; - } - if (typeof Object.prototype[key] === 'function') { - return this; - } - if (prop.value instanceof AST_Function) continue; - val[key] = ev(prop.value, compressor); - if (val[key] === prop.value) return this; - } - return val; - } - return this; - }); - def(AST_UnaryPrefix, function(compressor){ - var e = this.expression; - // Function would be evaluated to an array and so typeof would - // incorrectly return 'object'. Hence making is a special case. - if (compressor.option("typeofs") - && this.operator == "typeof" - && (e instanceof AST_Lambda - || e instanceof AST_SymbolRef - && e.fixed_value() instanceof AST_Lambda)) { - return typeof function(){}; - } - e = ev(e, compressor); - if (e === this.expression) return this; - switch (this.operator) { - case "!": return !e; - case "typeof": - // typeof returns "object" or "function" on different platforms - // so cannot evaluate reliably - if (e instanceof RegExp) return this; - return typeof e; - case "void": return void e; - case "~": return ~e; - case "-": return -e; - case "+": return +e; - } - return this; - }); - def(AST_Binary, function(compressor){ - var left = ev(this.left, compressor); - if (left === this.left) return this; - var right = ev(this.right, compressor); - if (right === this.right) return this; - var result; - switch (this.operator) { - case "&&" : result = left && right; break; - case "||" : result = left || right; break; - case "|" : result = left | right; break; - case "&" : result = left & right; break; - case "^" : result = left ^ right; break; - case "+" : result = left + right; break; - case "*" : result = left * right; break; - case "/" : result = left / right; break; - case "%" : result = left % right; break; - case "-" : result = left - right; break; - case "<<" : result = left << right; break; - case ">>" : result = left >> right; break; - case ">>>" : result = left >>> right; break; - case "==" : result = left == right; break; - case "===" : result = left === right; break; - case "!=" : result = left != right; break; - case "!==" : result = left !== right; break; - case "<" : result = left < right; break; - case "<=" : result = left <= right; break; - case ">" : result = left > right; break; - case ">=" : result = left >= right; break; - default: - return this; - } - if (isNaN(result) && compressor.find_parent(AST_With)) { - // leave original expression as is - return this; - } - return result; - }); - def(AST_Conditional, function(compressor){ - var condition = ev(this.condition, compressor); - if (condition === this.condition) return this; - var node = condition ? this.consequent : this.alternative; - var value = ev(node, compressor); - return value === node ? this : value; - }); - def(AST_SymbolRef, function(compressor){ - var fixed = this.fixed_value(); - if (!fixed) return this; - this._eval = return_this; - var value = ev(fixed, compressor); - if (value === fixed) { - delete this._eval; - return this; - } - if (!HOP(fixed, "_eval")) fixed._eval = function() { - return value; - }; - if (value && typeof value == "object" && this.definition().escaped) { - delete this._eval; - return this; - } - this._eval = fixed._eval; - return value; - }); - var global_objs = { - Array: Array, - Math: Math, - Number: Number, - String: String, - }; - function convert_to_predicate(obj) { - for (var key in obj) { - obj[key] = makePredicate(obj[key]); - } - } - var static_values = { - Math: [ - "E", - "LN10", - "LN2", - "LOG2E", - "LOG10E", - "PI", - "SQRT1_2", - "SQRT2", - ], - Number: [ - "MAX_VALUE", - "MIN_VALUE", - "NaN", - "NEGATIVE_INFINITY", - "POSITIVE_INFINITY", - ], - }; - convert_to_predicate(static_values); - def(AST_PropAccess, function(compressor){ - if (compressor.option("unsafe")) { - var key = this.property; - if (key instanceof AST_Node) { - key = ev(key, compressor); - if (key === this.property) return this; - } - var exp = this.expression; - var val; - if (is_undeclared_ref(exp)) { - if (!(static_values[exp.name] || return_false)(key)) return this; - val = global_objs[exp.name]; - } else { - val = ev(exp, compressor); - if (!val || val === exp || !HOP(val, key)) return this; - } - return val[key]; - } - return this; - }); - var object_fns = [ - "constructor", - "toString", - "valueOf", - ]; - var native_fns = { - Array: [ - "indexOf", - "join", - "lastIndexOf", - "slice", - ].concat(object_fns), - Boolean: object_fns, - Number: [ - "toExponential", - "toFixed", - "toPrecision", - ].concat(object_fns), - RegExp: [ - "test", - ].concat(object_fns), - String: [ - "charAt", - "charCodeAt", - "concat", - "indexOf", - "italics", - "lastIndexOf", - "match", - "replace", - "search", - "slice", - "split", - "substr", - "substring", - "trim", - ].concat(object_fns), - }; - convert_to_predicate(native_fns); - var static_fns = { - Array: [ - "isArray", - ], - Math: [ - "abs", - "acos", - "asin", - "atan", - "ceil", - "cos", - "exp", - "floor", - "log", - "round", - "sin", - "sqrt", - "tan", - "atan2", - "pow", - "max", - "min" - ], - Number: [ - "isFinite", - "isNaN", - ], - String: [ - "fromCharCode", - ], - }; - convert_to_predicate(static_fns); - def(AST_Call, function(compressor){ - var exp = this.expression; - if (compressor.option("unsafe") && exp instanceof AST_PropAccess) { - var key = exp.property; - if (key instanceof AST_Node) { - key = ev(key, compressor); - if (key === exp.property) return this; - } - var val; - var e = exp.expression; - if (is_undeclared_ref(e)) { - if (!(static_fns[e.name] || return_false)(key)) return this; - val = global_objs[e.name]; - } else { - val = ev(e, compressor); - if (val === e || !(val && native_fns[val.constructor.name] || return_false)(key)) return this; - } - var args = []; - for (var i = 0, len = this.args.length; i < len; i++) { - var arg = this.args[i]; - var value = ev(arg, compressor); - if (arg === value) return this; - args.push(value); - } - return val[key].apply(val, args); - } - return this; - }); - def(AST_New, return_this); - })(function(node, func){ - node.DEFMETHOD("_eval", func); - }); - - // method to negate an expression - (function(def){ - function basic_negation(exp) { - return make_node(AST_UnaryPrefix, exp, { - operator: "!", - expression: exp - }); - } - function best(orig, alt, first_in_statement) { - var negated = basic_negation(orig); - if (first_in_statement) { - var stat = make_node(AST_SimpleStatement, alt, { - body: alt - }); - return best_of_expression(negated, stat) === stat ? alt : negated; - } - return best_of_expression(negated, alt); - } - def(AST_Node, function(){ - return basic_negation(this); - }); - def(AST_Statement, function(){ - throw new Error("Cannot negate a statement"); - }); - def(AST_Function, function(){ - return basic_negation(this); - }); - def(AST_UnaryPrefix, function(){ - if (this.operator == "!") - return this.expression; - return basic_negation(this); - }); - def(AST_Sequence, function(compressor){ - var expressions = this.expressions.slice(); - expressions.push(expressions.pop().negate(compressor)); - return make_sequence(this, expressions); - }); - def(AST_Conditional, function(compressor, first_in_statement){ - var self = this.clone(); - self.consequent = self.consequent.negate(compressor); - self.alternative = self.alternative.negate(compressor); - return best(this, self, first_in_statement); - }); - def(AST_Binary, function(compressor, first_in_statement){ - var self = this.clone(), op = this.operator; - if (compressor.option("unsafe_comps")) { - switch (op) { - case "<=" : self.operator = ">" ; return self; - case "<" : self.operator = ">=" ; return self; - case ">=" : self.operator = "<" ; return self; - case ">" : self.operator = "<=" ; return self; - } - } - switch (op) { - case "==" : self.operator = "!="; return self; - case "!=" : self.operator = "=="; return self; - case "===": self.operator = "!=="; return self; - case "!==": self.operator = "==="; return self; - case "&&": - self.operator = "||"; - self.left = self.left.negate(compressor, first_in_statement); - self.right = self.right.negate(compressor); - return best(this, self, first_in_statement); - case "||": - self.operator = "&&"; - self.left = self.left.negate(compressor, first_in_statement); - self.right = self.right.negate(compressor); - return best(this, self, first_in_statement); - } - return basic_negation(this); - }); - })(function(node, func){ - node.DEFMETHOD("negate", function(compressor, first_in_statement){ - return func.call(this, compressor, first_in_statement); - }); - }); - - AST_Call.DEFMETHOD("has_pure_annotation", function(compressor) { - if (!compressor.option("side_effects")) return false; - if (this.pure !== undefined) return this.pure; - var pure = false; - var comments, pure_comment; - if (this.start - && (comments = this.start.comments_before) - && comments.length - && (pure_comment = find_if(function (comment) { - return /[@#]__PURE__/.test(comment.value); - }, comments))) { - pure = pure_comment; - } - return this.pure = pure; - }); - - var global_pure_fns = makePredicate("Boolean decodeURI decodeURIComponent Date encodeURI encodeURIComponent Error escape EvalError isFinite isNaN Number Object parseFloat parseInt RangeError ReferenceError String SyntaxError TypeError unescape URIError"); - AST_Call.DEFMETHOD("is_expr_pure", function(compressor) { - if (compressor.option("unsafe")) { - var expr = this.expression; - if (is_undeclared_ref(expr) && global_pure_fns(expr.name)) return true; - } - return this.has_pure_annotation(compressor) || !compressor.pure_funcs(this); - }); - - // determine if expression has side effects - (function(def){ - def(AST_Node, return_true); - - def(AST_EmptyStatement, return_false); - def(AST_Constant, return_false); - def(AST_This, return_false); - - def(AST_Call, function(compressor){ - if (!this.is_expr_pure(compressor)) return true; - for (var i = this.args.length; --i >= 0;) { - if (this.args[i].has_side_effects(compressor)) - return true; - } - return false; - }); - - function any(list, compressor) { - for (var i = list.length; --i >= 0;) - if (list[i].has_side_effects(compressor)) - return true; - return false; - } - - def(AST_Block, function(compressor){ - return any(this.body, compressor); - }); - def(AST_Switch, function(compressor){ - return this.expression.has_side_effects(compressor) - || any(this.body, compressor); - }); - def(AST_Case, function(compressor){ - return this.expression.has_side_effects(compressor) - || any(this.body, compressor); - }); - def(AST_Try, function(compressor){ - return any(this.body, compressor) - || this.bcatch && this.bcatch.has_side_effects(compressor) - || this.bfinally && this.bfinally.has_side_effects(compressor); - }); - def(AST_If, function(compressor){ - return this.condition.has_side_effects(compressor) - || this.body && this.body.has_side_effects(compressor) - || this.alternative && this.alternative.has_side_effects(compressor); - }); - def(AST_LabeledStatement, function(compressor){ - return this.body.has_side_effects(compressor); - }); - def(AST_SimpleStatement, function(compressor){ - return this.body.has_side_effects(compressor); - }); - def(AST_Defun, return_true); - def(AST_Function, return_false); - def(AST_Binary, function(compressor){ - return this.left.has_side_effects(compressor) - || this.right.has_side_effects(compressor); - }); - def(AST_Assign, return_true); - def(AST_Conditional, function(compressor){ - return this.condition.has_side_effects(compressor) - || this.consequent.has_side_effects(compressor) - || this.alternative.has_side_effects(compressor); - }); - def(AST_Unary, function(compressor){ - return unary_side_effects(this.operator) - || this.expression.has_side_effects(compressor); - }); - def(AST_SymbolRef, function(compressor){ - return !this.is_declared(compressor); - }); - def(AST_SymbolDeclaration, return_false); - def(AST_Object, function(compressor){ - return any(this.properties, compressor); - }); - def(AST_ObjectProperty, function(compressor){ - return this.value.has_side_effects(compressor); - }); - def(AST_Array, function(compressor){ - return any(this.elements, compressor); - }); - def(AST_Dot, function(compressor){ - return this.expression.may_throw_on_access(compressor) - || this.expression.has_side_effects(compressor); - }); - def(AST_Sub, function(compressor){ - return this.expression.may_throw_on_access(compressor) - || this.expression.has_side_effects(compressor) - || this.property.has_side_effects(compressor); - }); - def(AST_Sequence, function(compressor){ - return this.expressions.some(function(expression, index) { - return expression.has_side_effects(compressor); - }); - }); - })(function(node, func){ - node.DEFMETHOD("has_side_effects", func); - }); - - // determine if expression is constant - (function(def){ - function all(list) { - for (var i = list.length; --i >= 0;) - if (!list[i].is_constant_expression()) - return false; - return true; - } - def(AST_Node, return_false); - def(AST_Constant, return_true); - def(AST_Lambda, function(scope){ - var self = this; - var result = true; - self.walk(new TreeWalker(function(node) { - if (!result) return true; - if (node instanceof AST_SymbolRef) { - if (self.inlined) { - result = false; - return true; - } - var def = node.definition(); - if (member(def, self.enclosed) - && !self.variables.has(def.name)) { - if (scope) { - var scope_def = scope.find_variable(node); - if (def.undeclared ? !scope_def : scope_def === def) { - result = "f"; - return true; - } - } - result = false; - } - return true; - } - })); - return result; - }); - def(AST_Unary, function(){ - return this.expression.is_constant_expression(); - }); - def(AST_Binary, function(){ - return this.left.is_constant_expression() && this.right.is_constant_expression(); - }); - def(AST_Array, function(){ - return all(this.elements); - }); - def(AST_Object, function(){ - return all(this.properties); - }); - def(AST_ObjectProperty, function(){ - return this.value.is_constant_expression(); - }); - })(function(node, func){ - node.DEFMETHOD("is_constant_expression", func); - }); - - // tell me if a statement aborts - function aborts(thing) { - return thing && thing.aborts(); - }; - (function(def){ - def(AST_Statement, return_null); - def(AST_Jump, return_this); - function block_aborts(){ - var n = this.body.length; - return n > 0 && aborts(this.body[n - 1]); - }; - def(AST_BlockStatement, block_aborts); - def(AST_SwitchBranch, block_aborts); - def(AST_If, function(){ - return this.alternative && aborts(this.body) && aborts(this.alternative) && this; - }); - })(function(node, func){ - node.DEFMETHOD("aborts", func); - }); - - /* -----[ optimizers ]----- */ - - OPT(AST_Directive, function(self, compressor){ - if (compressor.has_directive(self.value) !== self) { - return make_node(AST_EmptyStatement, self); - } - return self; - }); - - OPT(AST_Debugger, function(self, compressor){ - if (compressor.option("drop_debugger")) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_LabeledStatement, function(self, compressor){ - if (self.body instanceof AST_Break - && compressor.loopcontrol_target(self.body) === self.body) { - return make_node(AST_EmptyStatement, self); - } - return self.label.references.length == 0 ? self.body : self; - }); - - OPT(AST_Block, function(self, compressor){ - tighten_body(self.body, compressor); - return self; - }); - - OPT(AST_BlockStatement, function(self, compressor){ - tighten_body(self.body, compressor); - switch (self.body.length) { - case 1: return self.body[0]; - case 0: return make_node(AST_EmptyStatement, self); - } - return self; - }); - - AST_Scope.DEFMETHOD("drop_unused", function(compressor){ - if (!compressor.option("unused")) return; - if (compressor.has_directive("use asm")) return; - var self = this; - if (self.uses_eval || self.uses_with) return; - var drop_funcs = !(self instanceof AST_Toplevel) || compressor.toplevel.funcs; - var drop_vars = !(self instanceof AST_Toplevel) || compressor.toplevel.vars; - var assign_as_unused = /keep_assign/.test(compressor.option("unused")) ? return_false : function(node) { - if (node instanceof AST_Assign && (node.write_only || node.operator == "=")) { - return node.left; - } - if (node instanceof AST_Unary && node.write_only) return node.expression; - }; - var in_use = []; - var in_use_ids = Object.create(null); // avoid expensive linear scans of in_use - if (self instanceof AST_Toplevel && compressor.top_retain) { - self.variables.each(function(def) { - if (compressor.top_retain(def) && !(def.id in in_use_ids)) { - in_use_ids[def.id] = true; - in_use.push(def); - } - }); - } - var var_defs_by_id = new Dictionary(); - var initializations = new Dictionary(); - // pass 1: find out which symbols are directly used in - // this scope (not in nested scopes). - var scope = this; - var tw = new TreeWalker(function(node, descend){ - if (node === self) return; - if (node instanceof AST_Defun) { - if (!drop_funcs && scope === self) { - var node_def = node.name.definition(); - if (!(node_def.id in in_use_ids)) { - in_use_ids[node_def.id] = true; - in_use.push(node_def); - } - } - initializations.add(node.name.name, node); - return true; // don't go in nested scopes - } - if (node instanceof AST_SymbolFunarg && scope === self) { - var_defs_by_id.add(node.definition().id, node); - } - if (node instanceof AST_Definitions && scope === self) { - node.definitions.forEach(function(def){ - var node_def = def.name.definition(); - if (def.name instanceof AST_SymbolVar) { - var_defs_by_id.add(node_def.id, def); - } - if (!drop_vars) { - if (!(node_def.id in in_use_ids)) { - in_use_ids[node_def.id] = true; - in_use.push(node_def); - } - } - if (def.value) { - initializations.add(def.name.name, def.value); - if (def.value.has_side_effects(compressor)) { - def.value.walk(tw); - } - } - }); - return true; - } - return scan_ref_scoped(node, descend); - }); - self.walk(tw); - // pass 2: for every used symbol we need to walk its - // initialization code to figure out if it uses other - // symbols (that may not be in_use). - tw = new TreeWalker(scan_ref_scoped); - for (var i = 0; i < in_use.length; ++i) { - in_use[i].orig.forEach(function(decl){ - // undeclared globals will be instanceof AST_SymbolRef - var init = initializations.get(decl.name); - if (init) init.forEach(function(init){ - init.walk(tw); - }); - }); - } - // pass 3: we should drop declarations not in_use - var tt = new TreeTransformer( - function before(node, descend, in_list) { - var parent = tt.parent(); - if (drop_vars) { - var sym = assign_as_unused(node); - if (sym instanceof AST_SymbolRef - && !(sym.definition().id in in_use_ids)) { - if (node instanceof AST_Assign) { - return maintain_this_binding(parent, node, node.right.transform(tt)); - } - return make_node(AST_Number, node, { - value: 0 - }); - } - } - if (scope !== self) return; - if (node instanceof AST_Function - && node.name - && !compressor.option("keep_fnames")) { - var def = node.name.definition(); - // any declarations with same name will overshadow - // name of this anonymous function and can therefore - // never be used anywhere - if (!(def.id in in_use_ids) || def.orig.length > 1) - node.name = null; - } - if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) { - var trim = !compressor.option("keep_fargs"); - for (var a = node.argnames, i = a.length; --i >= 0;) { - var sym = a[i]; - if (!(sym.definition().id in in_use_ids)) { - sym.__unused = true; - if (trim) { - a.pop(); - compressor[sym.unreferenced() ? "warn" : "info"]("Dropping unused function argument {name} [{file}:{line},{col}]", template(sym)); - } - } - else { - trim = false; - } - } - } - if (drop_funcs && node instanceof AST_Defun && node !== self) { - var def = node.name.definition(); - if (!(def.id in in_use_ids)) { - compressor[node.name.unreferenced() ? "warn" : "info"]("Dropping unused function {name} [{file}:{line},{col}]", template(node.name)); - def.eliminated++; - return make_node(AST_EmptyStatement, node); - } - } - if (node instanceof AST_Definitions && !(parent instanceof AST_ForIn && parent.init === node)) { - // place uninitialized names at the start - var body = [], head = [], tail = []; - // for unused names whose initialization has - // side effects, we can cascade the init. code - // into the next one, or next statement. - var side_effects = []; - node.definitions.forEach(function(def) { - if (def.value) def.value = def.value.transform(tt); - var sym = def.name.definition(); - if (!drop_vars || sym.id in in_use_ids) { - if (def.name instanceof AST_SymbolVar) { - var var_defs = var_defs_by_id.get(sym.id); - if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) { - compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); - if (def.value) { - side_effects.push(make_node(AST_Assign, def, { - operator: "=", - left: make_node(AST_SymbolRef, def.name, def.name), - right: def.value - })); - } - remove(var_defs, def); - sym.eliminated++; - return; - } - } - if (def.value) { - if (side_effects.length > 0) { - if (tail.length > 0) { - side_effects.push(def.value); - def.value = make_sequence(def.value, side_effects); - } else { - body.push(make_node(AST_SimpleStatement, node, { - body: make_sequence(node, side_effects) - })); - } - side_effects = []; - } - tail.push(def); - } else { - head.push(def); - } - } else if (sym.orig[0] instanceof AST_SymbolCatch) { - var value = def.value && def.value.drop_side_effect_free(compressor); - if (value) side_effects.push(value); - def.value = null; - head.push(def); - } else { - var value = def.value && def.value.drop_side_effect_free(compressor); - if (value) { - compressor.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]", template(def.name)); - side_effects.push(value); - } else { - compressor[def.name.unreferenced() ? "warn" : "info"]("Dropping unused variable {name} [{file}:{line},{col}]", template(def.name)); - } - sym.eliminated++; - } - }); - if (head.length > 0 || tail.length > 0) { - node.definitions = head.concat(tail); - body.push(node); - } - if (side_effects.length > 0) { - body.push(make_node(AST_SimpleStatement, node, { - body: make_sequence(node, side_effects) - })); - } - switch (body.length) { - case 0: - return in_list ? MAP.skip : make_node(AST_EmptyStatement, node); - case 1: - return body[0]; - default: - return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, { - body: body - }); - } - } - // certain combination of unused name + side effect leads to: - // https://github.com/mishoo/UglifyJS2/issues/44 - // https://github.com/mishoo/UglifyJS2/issues/1830 - // https://github.com/mishoo/UglifyJS2/issues/1838 - // that's an invalid AST. - // We fix it at this stage by moving the `var` outside the `for`. - if (node instanceof AST_For) { - descend(node, this); - var block; - if (node.init instanceof AST_BlockStatement) { - block = node.init; - node.init = block.body.pop(); - block.body.push(node); - } - if (node.init instanceof AST_SimpleStatement) { - node.init = node.init.body; - } else if (is_empty(node.init)) { - node.init = null; - } - return !block ? node : in_list ? MAP.splice(block.body) : block; - } - if (node instanceof AST_LabeledStatement && node.body instanceof AST_For) { - descend(node, this); - if (node.body instanceof AST_BlockStatement) { - var block = node.body; - node.body = block.body.pop(); - block.body.push(node); - return in_list ? MAP.splice(block.body) : block; - } - return node; - } - if (node instanceof AST_Scope) { - var save_scope = scope; - scope = node; - descend(node, this); - scope = save_scope; - return node; - } - - function template(sym) { - return { - name : sym.name, - file : sym.start.file, - line : sym.start.line, - col : sym.start.col - }; - } - } - ); - self.transform(tt); - - function scan_ref_scoped(node, descend) { - var sym; - if ((sym = assign_as_unused(node)) instanceof AST_SymbolRef - && self.variables.get(sym.name) === sym.definition()) { - if (node instanceof AST_Assign) node.right.walk(tw); - return true; - } - if (node instanceof AST_SymbolRef) { - var node_def = node.definition(); - if (!(node_def.id in in_use_ids)) { - in_use_ids[node_def.id] = true; - in_use.push(node_def); - } - return true; - } - if (node instanceof AST_Scope) { - var save_scope = scope; - scope = node; - descend(); - scope = save_scope; - return true; - } - } - }); - - AST_Scope.DEFMETHOD("hoist_declarations", function(compressor){ - var self = this; - if (compressor.has_directive("use asm")) return self; - var hoist_funs = compressor.option("hoist_funs"); - var hoist_vars = compressor.option("hoist_vars"); - if (hoist_funs || hoist_vars) { - var dirs = []; - var hoisted = []; - var vars = new Dictionary(), vars_found = 0, var_decl = 0; - // let's count var_decl first, we seem to waste a lot of - // space if we hoist `var` when there's only one. - self.walk(new TreeWalker(function(node){ - if (node instanceof AST_Scope && node !== self) - return true; - if (node instanceof AST_Var) { - ++var_decl; - return true; - } - })); - hoist_vars = hoist_vars && var_decl > 1; - var tt = new TreeTransformer( - function before(node) { - if (node !== self) { - if (node instanceof AST_Directive) { - dirs.push(node); - return make_node(AST_EmptyStatement, node); - } - if (hoist_funs && node instanceof AST_Defun - && (tt.parent() === self || !compressor.has_directive("use strict"))) { - hoisted.push(node); - return make_node(AST_EmptyStatement, node); - } - if (hoist_vars && node instanceof AST_Var) { - node.definitions.forEach(function(def){ - vars.set(def.name.name, def); - ++vars_found; - }); - var seq = node.to_assignments(compressor); - var p = tt.parent(); - if (p instanceof AST_ForIn && p.init === node) { - if (seq == null) { - var def = node.definitions[0].name; - return make_node(AST_SymbolRef, def, def); - } - return seq; - } - if (p instanceof AST_For && p.init === node) { - return seq; - } - if (!seq) return make_node(AST_EmptyStatement, node); - return make_node(AST_SimpleStatement, node, { - body: seq - }); - } - if (node instanceof AST_Scope) - return node; // to avoid descending in nested scopes - } - } - ); - self = self.transform(tt); - if (vars_found > 0) { - // collect only vars which don't show up in self's arguments list - var defs = []; - vars.each(function(def, name){ - if (self instanceof AST_Lambda - && find_if(function(x){ return x.name == def.name.name }, - self.argnames)) { - vars.del(name); - } else { - def = def.clone(); - def.value = null; - defs.push(def); - vars.set(name, def); - } - }); - if (defs.length > 0) { - // try to merge in assignments - for (var i = 0; i < self.body.length;) { - if (self.body[i] instanceof AST_SimpleStatement) { - var expr = self.body[i].body, sym, assign; - if (expr instanceof AST_Assign - && expr.operator == "=" - && (sym = expr.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = expr.right; - remove(defs, def); - defs.push(def); - self.body.splice(i, 1); - continue; - } - if (expr instanceof AST_Sequence - && (assign = expr.expressions[0]) instanceof AST_Assign - && assign.operator == "=" - && (sym = assign.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = assign.right; - remove(defs, def); - defs.push(def); - self.body[i].body = make_sequence(expr, expr.expressions.slice(1)); - continue; - } - } - if (self.body[i] instanceof AST_EmptyStatement) { - self.body.splice(i, 1); - continue; - } - if (self.body[i] instanceof AST_BlockStatement) { - var tmp = [ i, 1 ].concat(self.body[i].body); - self.body.splice.apply(self.body, tmp); - continue; - } - break; - } - defs = make_node(AST_Var, self, { - definitions: defs - }); - hoisted.push(defs); - }; - } - self.body = dirs.concat(hoisted, self.body); - } - return self; - }); - - AST_Scope.DEFMETHOD("make_var_name", function(prefix) { - var var_names = this.var_names; - if (!var_names) { - this.var_names = var_names = Object.create(null); - this.enclosed.forEach(function(def) { - var_names[def.name] = true; - }); - this.variables.each(function(def, name) { - var_names[name] = true; - }); - } - prefix = prefix.replace(/[^a-z_$]+/ig, "_"); - var name = prefix; - for (var i = 0; var_names[name]; i++) name = prefix + "$" + i; - var_names[name] = true; - return name; - }); - - AST_Scope.DEFMETHOD("hoist_properties", function(compressor){ - var self = this; - if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return self; - var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false; - var defs_by_id = Object.create(null); - return self.transform(new TreeTransformer(function(node, descend) { - if (node instanceof AST_VarDef) { - var sym = node.name, def, value; - if (sym.scope === self - && !(def = sym.definition()).escaped - && !def.single_use - && !def.direct_access - && !top_retain(def) - && (value = sym.fixed_value()) === node.value - && value instanceof AST_Object) { - descend(node, this); - var defs = new Dictionary(); - var assignments = []; - value.properties.forEach(function(prop) { - assignments.push(make_node(AST_VarDef, node, { - name: make_sym(prop.key), - value: prop.value - })); - }); - defs_by_id[def.id] = defs; - return MAP.splice(assignments); - } - } - if (node instanceof AST_PropAccess && node.expression instanceof AST_SymbolRef) { - var defs = defs_by_id[node.expression.definition().id]; - if (defs) { - var key = node.property; - if (key instanceof AST_Node) key = key.getValue(); - var def = defs.get(key); - var sym = make_node(AST_SymbolRef, node, { - name: def.name, - scope: node.expression.scope, - thedef: def - }); - sym.reference({}); - return sym; - } - } - - function make_sym(key) { - var new_var = make_node(sym.CTOR, sym, { - name: self.make_var_name(sym.name + "_" + key), - scope: self - }); - var def = self.def_variable(new_var); - defs.set(key, def); - self.enclosed.push(def); - return new_var; - } - })); - }); - - // drop_side_effect_free() - // remove side-effect-free parts which only affects return value - (function(def){ - // Drop side-effect-free elements from an array of expressions. - // Returns an array of expressions with side-effects or null - // if all elements were dropped. Note: original array may be - // returned if nothing changed. - function trim(nodes, compressor, first_in_statement) { - var len = nodes.length; - if (!len) return null; - var ret = [], changed = false; - for (var i = 0; i < len; i++) { - var node = nodes[i].drop_side_effect_free(compressor, first_in_statement); - changed |= node !== nodes[i]; - if (node) { - ret.push(node); - first_in_statement = false; - } - } - return changed ? ret.length ? ret : null : nodes; - } - - def(AST_Node, return_this); - def(AST_Constant, return_null); - def(AST_This, return_null); - def(AST_Call, function(compressor, first_in_statement){ - if (!this.is_expr_pure(compressor)) { - if (this.expression instanceof AST_Function - && (!this.expression.name || !this.expression.name.definition().references.length)) { - var node = this.clone(); - node.expression.process_expression(false, compressor); - return node; - } - return this; - } - if (this.pure) { - compressor.warn("Dropping __PURE__ call [{file}:{line},{col}]", this.start); - this.pure.value = this.pure.value.replace(/[@#]__PURE__/g, ' '); - } - var args = trim(this.args, compressor, first_in_statement); - return args && make_sequence(this, args); - }); - def(AST_Accessor, return_null); - def(AST_Function, return_null); - def(AST_Binary, function(compressor, first_in_statement){ - var right = this.right.drop_side_effect_free(compressor); - if (!right) return this.left.drop_side_effect_free(compressor, first_in_statement); - if (lazy_op(this.operator)) { - if (right === this.right) return this; - var node = this.clone(); - node.right = right; - return node; - } else { - var left = this.left.drop_side_effect_free(compressor, first_in_statement); - if (!left) return this.right.drop_side_effect_free(compressor, first_in_statement); - return make_sequence(this, [ left, right ]); - } - }); - def(AST_Assign, function(compressor){ - this.write_only = !this.left.has_side_effects(compressor); - return this; - }); - def(AST_Conditional, function(compressor){ - var consequent = this.consequent.drop_side_effect_free(compressor); - var alternative = this.alternative.drop_side_effect_free(compressor); - if (consequent === this.consequent && alternative === this.alternative) return this; - if (!consequent) return alternative ? make_node(AST_Binary, this, { - operator: "||", - left: this.condition, - right: alternative - }) : this.condition.drop_side_effect_free(compressor); - if (!alternative) return make_node(AST_Binary, this, { - operator: "&&", - left: this.condition, - right: consequent - }); - var node = this.clone(); - node.consequent = consequent; - node.alternative = alternative; - return node; - }); - def(AST_Unary, function(compressor, first_in_statement){ - if (unary_side_effects(this.operator)) { - this.write_only = !this.expression.has_side_effects(compressor); - return this; - } - if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) return null; - var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); - if (first_in_statement - && this instanceof AST_UnaryPrefix - && is_iife_call(expression)) { - if (expression === this.expression && this.operator.length === 1) return this; - return make_node(AST_UnaryPrefix, this, { - operator: this.operator.length === 1 ? this.operator : "!", - expression: expression - }); - } - return expression; - }); - def(AST_SymbolRef, function(compressor) { - return this.is_declared(compressor) ? null : this; - }); - def(AST_Object, function(compressor, first_in_statement){ - var values = trim(this.properties, compressor, first_in_statement); - return values && make_sequence(this, values); - }); - def(AST_ObjectProperty, function(compressor, first_in_statement){ - return this.value.drop_side_effect_free(compressor, first_in_statement); - }); - def(AST_Array, function(compressor, first_in_statement){ - var values = trim(this.elements, compressor, first_in_statement); - return values && make_sequence(this, values); - }); - def(AST_Dot, function(compressor, first_in_statement){ - if (this.expression.may_throw_on_access(compressor)) return this; - return this.expression.drop_side_effect_free(compressor, first_in_statement); - }); - def(AST_Sub, function(compressor, first_in_statement){ - if (this.expression.may_throw_on_access(compressor)) return this; - var expression = this.expression.drop_side_effect_free(compressor, first_in_statement); - if (!expression) return this.property.drop_side_effect_free(compressor, first_in_statement); - var property = this.property.drop_side_effect_free(compressor); - if (!property) return expression; - return make_sequence(this, [ expression, property ]); - }); - def(AST_Sequence, function(compressor){ - var last = this.tail_node(); - var expr = last.drop_side_effect_free(compressor); - if (expr === last) return this; - var expressions = this.expressions.slice(0, -1); - if (expr) expressions.push(expr); - return make_sequence(this, expressions); - }); - })(function(node, func){ - node.DEFMETHOD("drop_side_effect_free", func); - }); - - OPT(AST_SimpleStatement, function(self, compressor){ - if (compressor.option("side_effects")) { - var body = self.body; - var node = body.drop_side_effect_free(compressor, true); - if (!node) { - compressor.warn("Dropping side-effect-free statement [{file}:{line},{col}]", self.start); - return make_node(AST_EmptyStatement, self); - } - if (node !== body) { - return make_node(AST_SimpleStatement, self, { body: node }); - } - } - return self; - }); - - OPT(AST_While, function(self, compressor){ - return compressor.option("loops") ? make_node(AST_For, self, self).optimize(compressor) : self; - }); - - OPT(AST_Do, function(self, compressor){ - if (!compressor.option("loops")) return self; - var cond = self.condition.tail_node().evaluate(compressor); - if (!(cond instanceof AST_Node)) { - if (cond) return make_node(AST_For, self, { - body: make_node(AST_BlockStatement, self.body, { - body: [ - self.body, - make_node(AST_SimpleStatement, self.condition, { - body: self.condition - }) - ] - }) - }).optimize(compressor); - var has_loop_control = false; - var tw = new TreeWalker(function(node) { - if (node instanceof AST_Scope || has_loop_control) return true; - if (node instanceof AST_LoopControl && tw.loopcontrol_target(node) === self) - return has_loop_control = true; - }); - var parent = compressor.parent(); - (parent instanceof AST_LabeledStatement ? parent : self).walk(tw); - if (!has_loop_control) return make_node(AST_BlockStatement, self.body, { - body: [ - self.body, - make_node(AST_SimpleStatement, self.condition, { - body: self.condition - }) - ] - }).optimize(compressor); - } - return self; - }); - - function if_break_in_loop(self, compressor) { - function drop_it(rest) { - rest = as_statement_array(rest); - if (self.body instanceof AST_BlockStatement) { - self.body = self.body.clone(); - self.body.body = rest.concat(self.body.body.slice(1)); - self.body = self.body.transform(compressor); - } else { - self.body = make_node(AST_BlockStatement, self.body, { - body: rest - }).transform(compressor); - } - if_break_in_loop(self, compressor); - } - var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body; - if (first instanceof AST_If) { - if (first.body instanceof AST_Break - && compressor.loopcontrol_target(first.body) === compressor.self()) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition.negate(compressor), - }); - } else { - self.condition = first.condition.negate(compressor); - } - drop_it(first.alternative); - } - else if (first.alternative instanceof AST_Break - && compressor.loopcontrol_target(first.alternative) === compressor.self()) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition, - }); - } else { - self.condition = first.condition; - } - drop_it(first.body); - } - } - }; - - OPT(AST_For, function(self, compressor){ - if (!compressor.option("loops")) return self; - if (compressor.option("side_effects") && self.init) { - self.init = self.init.drop_side_effect_free(compressor); - } - if (self.condition) { - var cond = self.condition.evaluate(compressor); - if (!(cond instanceof AST_Node)) { - if (cond) self.condition = null; - else if (!compressor.option("dead_code")) { - var orig = self.condition; - self.condition = make_node_from_constant(cond, self.condition); - self.condition = best_of_expression(self.condition.transform(compressor), orig); - } - } - if (compressor.option("dead_code")) { - if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor); - if (!cond) { - var body = []; - extract_declarations_from_unreachable_code(compressor, self.body, body); - if (self.init instanceof AST_Statement) { - body.push(self.init); - } else if (self.init) { - body.push(make_node(AST_SimpleStatement, self.init, { - body: self.init - })); - } - body.push(make_node(AST_SimpleStatement, self.condition, { - body: self.condition - })); - return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); - } - } - } - if_break_in_loop(self, compressor); - return self; - }); - - OPT(AST_If, function(self, compressor){ - if (is_empty(self.alternative)) self.alternative = null; - - if (!compressor.option("conditionals")) return self; - // if condition can be statically determined, warn and drop - // one of the blocks. note, statically determined implies - // “has no side effects”; also it doesn't work for cases like - // `x && true`, though it probably should. - var cond = self.condition.evaluate(compressor); - if (!compressor.option("dead_code") && !(cond instanceof AST_Node)) { - var orig = self.condition; - self.condition = make_node_from_constant(cond, orig); - self.condition = best_of_expression(self.condition.transform(compressor), orig); - } - if (compressor.option("dead_code")) { - if (cond instanceof AST_Node) cond = self.condition.tail_node().evaluate(compressor); - if (!cond) { - compressor.warn("Condition always false [{file}:{line},{col}]", self.condition.start); - var body = []; - extract_declarations_from_unreachable_code(compressor, self.body, body); - body.push(make_node(AST_SimpleStatement, self.condition, { - body: self.condition - })); - if (self.alternative) body.push(self.alternative); - return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); - } else if (!(cond instanceof AST_Node)) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.condition.start); - var body = []; - if (self.alternative) { - extract_declarations_from_unreachable_code(compressor, self.alternative, body); - } - body.push(make_node(AST_SimpleStatement, self.condition, { - body: self.condition - })); - body.push(self.body); - return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor); - } - } - var negated = self.condition.negate(compressor); - var self_condition_length = self.condition.print_to_string().length; - var negated_length = negated.print_to_string().length; - var negated_is_best = negated_length < self_condition_length; - if (self.alternative && negated_is_best) { - negated_is_best = false; // because we already do the switch here. - // no need to swap values of self_condition_length and negated_length - // here because they are only used in an equality comparison later on. - self.condition = negated; - var tmp = self.body; - self.body = self.alternative || make_node(AST_EmptyStatement, self); - self.alternative = tmp; - } - if (is_empty(self.body) && is_empty(self.alternative)) { - return make_node(AST_SimpleStatement, self.condition, { - body: self.condition.clone() - }).optimize(compressor); - } - if (self.body instanceof AST_SimpleStatement - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.body, - alternative : self.alternative.body - }) - }).optimize(compressor); - } - if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) { - if (self_condition_length === negated_length && !negated_is_best - && self.condition instanceof AST_Binary && self.condition.operator == "||") { - // although the code length of self.condition and negated are the same, - // negated does not require additional surrounding parentheses. - // see https://github.com/mishoo/UglifyJS2/issues/979 - negated_is_best = true; - } - if (negated_is_best) return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : negated, - right : self.body.body - }) - }).optimize(compressor); - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "&&", - left : self.condition, - right : self.body.body - }) - }).optimize(compressor); - } - if (self.body instanceof AST_EmptyStatement - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : self.condition, - right : self.alternative.body - }) - }).optimize(compressor); - } - if (self.body instanceof AST_Exit - && self.alternative instanceof AST_Exit - && self.body.TYPE == self.alternative.TYPE) { - return make_node(self.body.CTOR, self, { - value: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.value || make_node(AST_Undefined, self.body), - alternative : self.alternative.value || make_node(AST_Undefined, self.alternative) - }).transform(compressor) - }).optimize(compressor); - } - if (self.body instanceof AST_If - && !self.body.alternative - && !self.alternative) { - self = make_node(AST_If, self, { - condition: make_node(AST_Binary, self.condition, { - operator: "&&", - left: self.condition, - right: self.body.condition - }), - body: self.body.body, - alternative: null - }); - } - if (aborts(self.body)) { - if (self.alternative) { - var alt = self.alternative; - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, alt ] - }).optimize(compressor); - } - } - if (aborts(self.alternative)) { - var body = self.body; - self.body = self.alternative; - self.condition = negated_is_best ? negated : self.condition.negate(compressor); - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, body ] - }).optimize(compressor); - } - return self; - }); - - OPT(AST_Switch, function(self, compressor){ - if (!compressor.option("switches")) return self; - var branch; - var value = self.expression.evaluate(compressor); - if (!(value instanceof AST_Node)) { - var orig = self.expression; - self.expression = make_node_from_constant(value, orig); - self.expression = best_of_expression(self.expression.transform(compressor), orig); - } - if (!compressor.option("dead_code")) return self; - if (value instanceof AST_Node) { - value = self.expression.tail_node().evaluate(compressor); - } - var decl = []; - var body = []; - var default_branch; - var exact_match; - for (var i = 0, len = self.body.length; i < len && !exact_match; i++) { - branch = self.body[i]; - if (branch instanceof AST_Default) { - if (!default_branch) { - default_branch = branch; - } else { - eliminate_branch(branch, body[body.length - 1]); - } - } else if (!(value instanceof AST_Node)) { - var exp = branch.expression.evaluate(compressor); - if (!(exp instanceof AST_Node) && exp !== value) { - eliminate_branch(branch, body[body.length - 1]); - continue; - } - if (exp instanceof AST_Node) exp = branch.expression.tail_node().evaluate(compressor); - if (exp === value) { - exact_match = branch; - if (default_branch) { - var default_index = body.indexOf(default_branch); - body.splice(default_index, 1); - eliminate_branch(default_branch, body[default_index - 1]); - default_branch = null; - } - } - } - if (aborts(branch)) { - var prev = body[body.length - 1]; - if (aborts(prev) && prev.body.length == branch.body.length - && make_node(AST_BlockStatement, prev, prev).equivalent_to(make_node(AST_BlockStatement, branch, branch))) { - prev.body = []; - } - } - body.push(branch); - } - while (i < len) eliminate_branch(self.body[i++], body[body.length - 1]); - if (body.length > 0) { - body[0].body = decl.concat(body[0].body); - } - self.body = body; - while (branch = body[body.length - 1]) { - var stat = branch.body[branch.body.length - 1]; - if (stat instanceof AST_Break && compressor.loopcontrol_target(stat) === self) - branch.body.pop(); - if (branch.body.length || branch instanceof AST_Case - && (default_branch || branch.expression.has_side_effects(compressor))) break; - if (body.pop() === default_branch) default_branch = null; - } - if (body.length == 0) { - return make_node(AST_BlockStatement, self, { - body: decl.concat(make_node(AST_SimpleStatement, self.expression, { - body: self.expression - })) - }).optimize(compressor); - } - if (body.length == 1 && (body[0] === exact_match || body[0] === default_branch)) { - var has_break = false; - var tw = new TreeWalker(function(node) { - if (has_break - || node instanceof AST_Lambda - || node instanceof AST_SimpleStatement) return true; - if (node instanceof AST_Break && tw.loopcontrol_target(node) === self) - has_break = true; - }); - self.walk(tw); - if (!has_break) { - var statements = body[0].body.slice(); - var exp = body[0].expression; - if (exp) statements.unshift(make_node(AST_SimpleStatement, exp, { - body: exp - })); - statements.unshift(make_node(AST_SimpleStatement, self.expression, { - body:self.expression - })); - return make_node(AST_BlockStatement, self, { - body: statements - }).optimize(compressor); - } - } - return self; - - function eliminate_branch(branch, prev) { - if (prev && !aborts(prev)) { - prev.body = prev.body.concat(branch.body); - } else { - extract_declarations_from_unreachable_code(compressor, branch, decl); - } - } - }); - - OPT(AST_Try, function(self, compressor){ - tighten_body(self.body, compressor); - if (self.bcatch && self.bfinally && all(self.bfinally.body, is_empty)) self.bfinally = null; - if (all(self.body, is_empty)) { - var body = []; - if (self.bcatch) extract_declarations_from_unreachable_code(compressor, self.bcatch, body); - if (self.bfinally) body = body.concat(self.bfinally.body); - return make_node(AST_BlockStatement, self, { - body: body - }).optimize(compressor); - } - return self; - }); - - AST_Definitions.DEFMETHOD("remove_initializers", function(){ - this.definitions.forEach(function(def){ def.value = null }); - }); - - AST_Definitions.DEFMETHOD("to_assignments", function(compressor){ - var reduce_vars = compressor.option("reduce_vars"); - var assignments = this.definitions.reduce(function(a, def){ - if (def.value) { - var name = make_node(AST_SymbolRef, def.name, def.name); - a.push(make_node(AST_Assign, def, { - operator : "=", - left : name, - right : def.value - })); - if (reduce_vars) name.definition().fixed = false; - } - def = def.name.definition(); - def.eliminated++; - def.replaced--; - return a; - }, []); - if (assignments.length == 0) return null; - return make_sequence(this, assignments); - }); - - OPT(AST_Definitions, function(self, compressor){ - if (self.definitions.length == 0) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_Call, function(self, compressor){ - var exp = self.expression; - var fn = exp; - if (compressor.option("reduce_vars") && fn instanceof AST_SymbolRef) { - fn = fn.fixed_value(); - } - if (compressor.option("unused") - && fn instanceof AST_Function - && !fn.uses_arguments - && !fn.uses_eval) { - var pos = 0, last = 0; - for (var i = 0, len = self.args.length; i < len; i++) { - var trim = i >= fn.argnames.length; - if (trim || fn.argnames[i].__unused) { - var node = self.args[i].drop_side_effect_free(compressor); - if (node) { - self.args[pos++] = node; - } else if (!trim) { - self.args[pos++] = make_node(AST_Number, self.args[i], { - value: 0 - }); - continue; - } - } else { - self.args[pos++] = self.args[i]; - } - last = pos; - } - self.args.length = last; - } - if (compressor.option("unsafe")) { - if (is_undeclared_ref(exp)) switch (exp.name) { - case "Array": - if (self.args.length != 1) { - return make_node(AST_Array, self, { - elements: self.args - }).optimize(compressor); - } - break; - case "Object": - if (self.args.length == 0) { - return make_node(AST_Object, self, { - properties: [] - }); - } - break; - case "String": - if (self.args.length == 0) return make_node(AST_String, self, { - value: "" - }); - if (self.args.length <= 1) return make_node(AST_Binary, self, { - left: self.args[0], - operator: "+", - right: make_node(AST_String, self, { value: "" }) - }).optimize(compressor); - break; - case "Number": - if (self.args.length == 0) return make_node(AST_Number, self, { - value: 0 - }); - if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { - expression: self.args[0], - operator: "+" - }).optimize(compressor); - case "Boolean": - if (self.args.length == 0) return make_node(AST_False, self); - if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, { - expression: make_node(AST_UnaryPrefix, self, { - expression: self.args[0], - operator: "!" - }), - operator: "!" - }).optimize(compressor); - break; - } else if (exp instanceof AST_Dot) switch(exp.property) { - case "toString": - if (self.args.length == 0) return make_node(AST_Binary, self, { - left: make_node(AST_String, self, { value: "" }), - operator: "+", - right: exp.expression - }).optimize(compressor); - break; - case "join": - if (exp.expression instanceof AST_Array) EXIT: { - var separator; - if (self.args.length > 0) { - separator = self.args[0].evaluate(compressor); - if (separator === self.args[0]) break EXIT; // not a constant - } - var elements = []; - var consts = []; - exp.expression.elements.forEach(function(el) { - var value = el.evaluate(compressor); - if (value !== el) { - consts.push(value); - } else { - if (consts.length > 0) { - elements.push(make_node(AST_String, self, { - value: consts.join(separator) - })); - consts.length = 0; - } - elements.push(el); - } - }); - if (consts.length > 0) { - elements.push(make_node(AST_String, self, { - value: consts.join(separator) - })); - } - if (elements.length == 0) return make_node(AST_String, self, { value: "" }); - if (elements.length == 1) { - if (elements[0].is_string(compressor)) { - return elements[0]; - } - return make_node(AST_Binary, elements[0], { - operator : "+", - left : make_node(AST_String, self, { value: "" }), - right : elements[0] - }); - } - if (separator == "") { - var first; - if (elements[0].is_string(compressor) - || elements[1].is_string(compressor)) { - first = elements.shift(); - } else { - first = make_node(AST_String, self, { value: "" }); - } - return elements.reduce(function(prev, el){ - return make_node(AST_Binary, el, { - operator : "+", - left : prev, - right : el - }); - }, first).optimize(compressor); - } - // need this awkward cloning to not affect original element - // best_of will decide which one to get through. - var node = self.clone(); - node.expression = node.expression.clone(); - node.expression.expression = node.expression.expression.clone(); - node.expression.expression.elements = elements; - return best_of(compressor, self, node); - } - break; - case "charAt": - if (exp.expression.is_string(compressor)) { - var arg = self.args[0]; - var index = arg ? arg.evaluate(compressor) : 0; - if (index !== arg) { - return make_node(AST_Sub, exp, { - expression: exp.expression, - property: make_node_from_constant(index | 0, arg || exp) - }).optimize(compressor); - } - } - break; - } - } - if (compressor.option("unsafe_Func") - && is_undeclared_ref(exp) - && exp.name == "Function") { - // new Function() => function(){} - if (self.args.length == 0) return make_node(AST_Function, self, { - argnames: [], - body: [] - }); - if (all(self.args, function(x) { - return x instanceof AST_String; - })) { - // quite a corner-case, but we can handle it: - // https://github.com/mishoo/UglifyJS2/issues/203 - // if the code argument is a constant, then we can minify it. - try { - var code = "n(function(" + self.args.slice(0, -1).map(function(arg) { - return arg.value; - }).join(",") + "){" + self.args[self.args.length - 1].value + "})"; - var ast = parse(code); - var mangle = { ie8: compressor.option("ie8") }; - ast.figure_out_scope(mangle); - var comp = new Compressor(compressor.options); - ast = ast.transform(comp); - ast.figure_out_scope(mangle); - base54.reset(); - ast.compute_char_frequency(mangle); - ast.mangle_names(mangle); - var fun; - ast.walk(new TreeWalker(function(node) { - if (fun) return true; - if (node instanceof AST_Lambda) { - fun = node; - return true; - } - })); - var code = OutputStream(); - AST_BlockStatement.prototype._codegen.call(fun, fun, code); - self.args = [ - make_node(AST_String, self, { - value: fun.argnames.map(function(arg) { - return arg.print_to_string(); - }).join(",") - }), - make_node(AST_String, self.args[self.args.length - 1], { - value: code.get().replace(/^\{|\}$/g, "") - }) - ]; - return self; - } catch (ex) { - if (ex instanceof JS_Parse_Error) { - compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]", self.args[self.args.length - 1].start); - compressor.warn(ex.toString()); - } else { - throw ex; - } - } - } - } - var stat = fn instanceof AST_Function && fn.body[0]; - if (compressor.option("inline") && stat instanceof AST_Return) { - var value = stat.value; - if (!value || value.is_constant_expression()) { - var args = self.args.concat(value || make_node(AST_Undefined, self)); - return make_sequence(self, args).optimize(compressor); - } - } - if (fn instanceof AST_Function) { - if (compressor.option("inline") - && exp === fn - && !fn.name - && !fn.uses_arguments - && !fn.uses_eval - && fn.body.length == 1 - && !fn.contains_this() - && all(fn.argnames, function(arg) { - return arg.__unused; - }) - && !self.has_pure_annotation(compressor)) { - var value; - if (stat instanceof AST_Return) { - value = stat.value; - } else if (stat instanceof AST_SimpleStatement) { - value = make_node(AST_UnaryPrefix, stat, { - operator: "void", - expression: stat.body - }); - } - if (value) { - var args = self.args.concat(value); - return make_sequence(self, args).optimize(compressor); - } - } - if (compressor.option("side_effects") && all(fn.body, is_empty)) { - var args = self.args.concat(make_node(AST_Undefined, self)); - return make_sequence(self, args).optimize(compressor); - } - } - if (compressor.option("drop_console")) { - if (exp instanceof AST_PropAccess) { - var name = exp.expression; - while (name.expression) { - name = name.expression; - } - if (is_undeclared_ref(name) && name.name == "console") { - return make_node(AST_Undefined, self).optimize(compressor); - } - } - } - if (compressor.option("negate_iife") - && compressor.parent() instanceof AST_SimpleStatement - && is_iife_call(self)) { - return self.negate(compressor, true); - } - var ev = self.evaluate(compressor); - if (ev !== self) { - ev = make_node_from_constant(ev, self).optimize(compressor); - return best_of(compressor, ev, self); - } - return self; - }); - - OPT(AST_New, function(self, compressor){ - if (compressor.option("unsafe")) { - var exp = self.expression; - if (is_undeclared_ref(exp)) { - switch (exp.name) { - case "Object": - case "RegExp": - case "Function": - case "Error": - case "Array": - return make_node(AST_Call, self, self).transform(compressor); - } - } - } - return self; - }); - - OPT(AST_Sequence, function(self, compressor){ - if (!compressor.option("side_effects")) return self; - var expressions = []; - filter_for_side_effects(); - var end = expressions.length - 1; - trim_right_for_undefined(); - if (end > 0 && compressor.option("cascade")) trim_left_for_assignment(); - if (end == 0) { - self = maintain_this_binding(compressor.parent(), compressor.self(), expressions[0]); - if (!(self instanceof AST_Sequence)) self = self.optimize(compressor); - return self; - } - self.expressions = expressions; - return self; - - function filter_for_side_effects() { - var first = first_in_statement(compressor); - var last = self.expressions.length - 1; - self.expressions.forEach(function(expr, index) { - if (index < last) expr = expr.drop_side_effect_free(compressor, first); - if (expr) { - merge_sequence(expressions, expr); - first = false; - } - }); - } - - function trim_right_for_undefined() { - while (end > 0 && is_undefined(expressions[end], compressor)) end--; - if (end < expressions.length - 1) { - expressions[end] = make_node(AST_UnaryPrefix, self, { - operator : "void", - expression : expressions[end] - }); - expressions.length = end + 1; - } - } - - function trim_left_for_assignment() { - for (var i = 0, j = 1; j <= end; j++) { - var left = expressions[i]; - var cdr = expressions[j]; - if (left instanceof AST_Assign - && !left.left.has_side_effects(compressor)) { - left = left.left; - } else if (left instanceof AST_Unary - && (left.operator == "++" || left.operator == "--")) { - left = left.expression; - } else left = null; - if (!left || is_lhs_read_only(left) || left.has_side_effects(compressor)) { - expressions[++i] = cdr; - continue; - } - var parent = null, field; - expressions[j] = cdr = cdr.clone(); - while (true) { - if (cdr.equivalent_to(left)) { - var car = expressions[i]; - if (car instanceof AST_UnaryPostfix) { - car = make_node(AST_UnaryPrefix, car, { - operator: car.operator, - expression: left - }); - } else { - car.write_only = false; - } - if (parent) { - parent[field] = car; - expressions[i] = expressions[j]; - } else { - expressions[i] = car; - } - break; - } - if (cdr instanceof AST_Binary && !(cdr instanceof AST_Assign)) { - if (cdr.left.is_constant()) { - if (lazy_op(cdr.operator)) { - expressions[++i] = expressions[j]; - break; - } - field = "right"; - } else { - field = "left"; - } - } else if (cdr instanceof AST_Call - && !(left instanceof AST_PropAccess && cdr.expression.equivalent_to(left)) - || cdr instanceof AST_PropAccess - || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) { - field = "expression"; - } else if (cdr instanceof AST_Conditional) { - field = "condition"; - } else { - expressions[++i] = expressions[j]; - break; - } - parent = cdr; - cdr = cdr[field] = cdr[field].clone(); - } - } - end = i; - expressions.length = end + 1; - } - }); - - AST_Unary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.expression instanceof AST_Sequence) { - var x = this.expression.expressions.slice(); - var e = this.clone(); - e.expression = x.pop(); - x.push(e); - return make_sequence(this, x).optimize(compressor); - } - } - return this; - }); - - OPT(AST_UnaryPostfix, function(self, compressor){ - return self.lift_sequences(compressor); - }); - - OPT(AST_UnaryPrefix, function(self, compressor){ - var e = self.expression; - if (self.operator == "delete" - && !(e instanceof AST_SymbolRef - || e instanceof AST_PropAccess - || is_identifier_atom(e))) { - if (e instanceof AST_Sequence) { - e = e.expressions.slice(); - e.push(make_node(AST_True, self)); - return make_sequence(self, e).optimize(compressor); - } - return make_sequence(self, [ e, make_node(AST_True, self) ]).optimize(compressor); - } - var seq = self.lift_sequences(compressor); - if (seq !== self) { - return seq; - } - if (compressor.option("side_effects") && self.operator == "void") { - e = e.drop_side_effect_free(compressor); - if (e) { - self.expression = e; - return self; - } else { - return make_node(AST_Undefined, self).optimize(compressor); - } - } - if (compressor.in_boolean_context()) { - switch (self.operator) { - case "!": - if (e instanceof AST_UnaryPrefix && e.operator == "!") { - // !!foo ==> foo, if we're in boolean context - return e.expression; - } - if (e instanceof AST_Binary) { - self = best_of(compressor, self, e.negate(compressor, first_in_statement(compressor))); - } - break; - case "typeof": - // typeof always returns a non-empty string, thus it's - // always true in booleans - compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start); - return (e instanceof AST_SymbolRef ? make_node(AST_True, self) : make_sequence(self, [ - e, - make_node(AST_True, self) - ])).optimize(compressor); - } - } - if (self.operator == "-" && e instanceof AST_Infinity) { - e = e.transform(compressor); - } - if (e instanceof AST_Binary - && (self.operator == "+" || self.operator == "-") - && (e.operator == "*" || e.operator == "/" || e.operator == "%")) { - return make_node(AST_Binary, self, { - operator: e.operator, - left: make_node(AST_UnaryPrefix, e.left, { - operator: self.operator, - expression: e.left - }), - right: e.right - }); - } - // avoids infinite recursion of numerals - if (self.operator != "-" - || !(e instanceof AST_Number || e instanceof AST_Infinity)) { - var ev = self.evaluate(compressor); - if (ev !== self) { - ev = make_node_from_constant(ev, self).optimize(compressor); - return best_of(compressor, ev, self); - } - } - return self; - }); - - AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.left instanceof AST_Sequence) { - var x = this.left.expressions.slice(); - var e = this.clone(); - e.left = x.pop(); - x.push(e); - return make_sequence(this, x).optimize(compressor); - } - if (this.right instanceof AST_Sequence && !this.left.has_side_effects(compressor)) { - var assign = this.operator == "=" && this.left instanceof AST_SymbolRef; - var x = this.right.expressions; - var last = x.length - 1; - for (var i = 0; i < last; i++) { - if (!assign && x[i].has_side_effects(compressor)) break; - } - if (i == last) { - x = x.slice(); - var e = this.clone(); - e.right = x.pop(); - x.push(e); - return make_sequence(this, x).optimize(compressor); - } else if (i > 0) { - var e = this.clone(); - e.right = make_sequence(this.right, x.slice(i)); - x = x.slice(0, i); - x.push(e); - return make_sequence(this, x).optimize(compressor); - } - } - } - return this; - }); - - var commutativeOperators = makePredicate("== === != !== * & | ^"); - function is_object(node) { - return node instanceof AST_Array - || node instanceof AST_Lambda - || node instanceof AST_Object; - } - - OPT(AST_Binary, function(self, compressor){ - function reversible() { - return self.left.is_constant() - || self.right.is_constant() - || !self.left.has_side_effects(compressor) - && !self.right.has_side_effects(compressor); - } - function reverse(op) { - if (reversible()) { - if (op) self.operator = op; - var tmp = self.left; - self.left = self.right; - self.right = tmp; - } - } - if (commutativeOperators(self.operator)) { - if (self.right.is_constant() - && !self.left.is_constant()) { - // if right is a constant, whatever side effects the - // left side might have could not influence the - // result. hence, force switch. - - if (!(self.left instanceof AST_Binary - && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) { - reverse(); - } - } - } - self = self.lift_sequences(compressor); - if (compressor.option("comparisons")) switch (self.operator) { - case "===": - case "!==": - if ((self.left.is_string(compressor) && self.right.is_string(compressor)) || - (self.left.is_number(compressor) && self.right.is_number(compressor)) || - (self.left.is_boolean() && self.right.is_boolean()) || - self.left.equivalent_to(self.right)) { - self.operator = self.operator.substr(0, 2); - } - // XXX: intentionally falling down to the next case - case "==": - case "!=": - // "undefined" == typeof x => undefined === x - if (compressor.option("typeofs") - && self.left instanceof AST_String - && self.left.value == "undefined" - && self.right instanceof AST_UnaryPrefix - && self.right.operator == "typeof") { - var expr = self.right.expression; - if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor) - : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) { - self.right = expr; - self.left = make_node(AST_Undefined, self.left).optimize(compressor); - if (self.operator.length == 2) self.operator += "="; - } - } - // obj !== obj => false - else if (self.left instanceof AST_SymbolRef - && self.right instanceof AST_SymbolRef - && self.left.definition() === self.right.definition() - && is_object(self.left.fixed_value())) { - return make_node(self.operator[0] == "=" ? AST_True : AST_False, self); - } - break; - } - if (self.operator == "+" && compressor.in_boolean_context()) { - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if (ll && typeof ll == "string") { - compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); - return make_sequence(self, [ - self.right, - make_node(AST_True, self) - ]).optimize(compressor); - } - if (rr && typeof rr == "string") { - compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); - return make_sequence(self, [ - self.left, - make_node(AST_True, self) - ]).optimize(compressor); - } - } - if (compressor.option("comparisons") && self.is_boolean()) { - if (!(compressor.parent() instanceof AST_Binary) - || compressor.parent() instanceof AST_Assign) { - var negated = make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: self.negate(compressor, first_in_statement(compressor)) - }); - self = best_of(compressor, self, negated); - } - if (compressor.option("unsafe_comps")) { - switch (self.operator) { - case "<": reverse(">"); break; - case "<=": reverse(">="); break; - } - } - } - if (self.operator == "+") { - if (self.right instanceof AST_String - && self.right.getValue() == "" - && self.left.is_string(compressor)) { - return self.left; - } - if (self.left instanceof AST_String - && self.left.getValue() == "" - && self.right.is_string(compressor)) { - return self.right; - } - if (self.left instanceof AST_Binary - && self.left.operator == "+" - && self.left.left instanceof AST_String - && self.left.left.getValue() == "" - && self.right.is_string(compressor)) { - self.left = self.left.right; - return self.transform(compressor); - } - } - if (compressor.option("evaluate")) { - switch (self.operator) { - case "&&": - var ll = self.left.truthy ? true : self.left.falsy ? false : self.left.evaluate(compressor); - if (!ll) { - compressor.warn("Condition left of && always false [{file}:{line},{col}]", self.start); - return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor); - } else if (!(ll instanceof AST_Node)) { - compressor.warn("Condition left of && always true [{file}:{line},{col}]", self.start); - return make_sequence(self, [ self.left, self.right ]).optimize(compressor); - } - var rr = self.right.evaluate(compressor); - if (!rr) { - if (compressor.in_boolean_context()) { - compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start); - return make_sequence(self, [ - self.left, - make_node(AST_False, self) - ]).optimize(compressor); - } else self.falsy = true; - } else if (!(rr instanceof AST_Node)) { - var parent = compressor.parent(); - if (parent.operator == "&&" && parent.left === compressor.self() || compressor.in_boolean_context()) { - compressor.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start); - return self.left.optimize(compressor); - } - } - // x || false && y ---> x ? y : false - if (self.left.operator == "||") { - var lr = self.left.right.evaluate(compressor); - if (!lr) return make_node(AST_Conditional, self, { - condition: self.left.left, - consequent: self.right, - alternative: self.left.right - }).optimize(compressor); - } - break; - case "||": - var ll = self.left.truthy ? true : self.left.falsy ? false : self.left.evaluate(compressor); - if (!ll) { - compressor.warn("Condition left of || always false [{file}:{line},{col}]", self.start); - return make_sequence(self, [ self.left, self.right ]).optimize(compressor); - } else if (!(ll instanceof AST_Node)) { - compressor.warn("Condition left of || always true [{file}:{line},{col}]", self.start); - return maintain_this_binding(compressor.parent(), compressor.self(), self.left).optimize(compressor); - } - var rr = self.right.evaluate(compressor); - if (!rr) { - var parent = compressor.parent(); - if (parent.operator == "||" && parent.left === compressor.self() || compressor.in_boolean_context()) { - compressor.warn("Dropping side-effect-free || [{file}:{line},{col}]", self.start); - return self.left.optimize(compressor); - } - } else if (!(rr instanceof AST_Node)) { - if (compressor.in_boolean_context()) { - compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start); - return make_sequence(self, [ - self.left, - make_node(AST_True, self) - ]).optimize(compressor); - } else self.truthy = true; - } - if (self.left.operator == "&&") { - var lr = self.left.right.evaluate(compressor); - if (lr && !(lr instanceof AST_Node)) return make_node(AST_Conditional, self, { - condition: self.left.left, - consequent: self.left.right, - alternative: self.right - }).optimize(compressor); - } - break; - } - var associative = true; - switch (self.operator) { - case "+": - // "foo" + ("bar" + x) => "foobar" + x - if (self.left instanceof AST_Constant - && self.right instanceof AST_Binary - && self.right.operator == "+" - && self.right.left instanceof AST_Constant - && self.right.is_string(compressor)) { - self = make_node(AST_Binary, self, { - operator: "+", - left: make_node(AST_String, self.left, { - value: "" + self.left.getValue() + self.right.left.getValue(), - start: self.left.start, - end: self.right.left.end - }), - right: self.right.right - }); - } - // (x + "foo") + "bar" => x + "foobar" - if (self.right instanceof AST_Constant - && self.left instanceof AST_Binary - && self.left.operator == "+" - && self.left.right instanceof AST_Constant - && self.left.is_string(compressor)) { - self = make_node(AST_Binary, self, { - operator: "+", - left: self.left.left, - right: make_node(AST_String, self.right, { - value: "" + self.left.right.getValue() + self.right.getValue(), - start: self.left.right.start, - end: self.right.end - }) - }); - } - // (x + "foo") + ("bar" + y) => (x + "foobar") + y - if (self.left instanceof AST_Binary - && self.left.operator == "+" - && self.left.is_string(compressor) - && self.left.right instanceof AST_Constant - && self.right instanceof AST_Binary - && self.right.operator == "+" - && self.right.left instanceof AST_Constant - && self.right.is_string(compressor)) { - self = make_node(AST_Binary, self, { - operator: "+", - left: make_node(AST_Binary, self.left, { - operator: "+", - left: self.left.left, - right: make_node(AST_String, self.left.right, { - value: "" + self.left.right.getValue() + self.right.left.getValue(), - start: self.left.right.start, - end: self.right.left.end - }) - }), - right: self.right.right - }); - } - // a + -b => a - b - if (self.right instanceof AST_UnaryPrefix - && self.right.operator == "-" - && self.left.is_number(compressor)) { - self = make_node(AST_Binary, self, { - operator: "-", - left: self.left, - right: self.right.expression - }); - break; - } - // -a + b => b - a - if (self.left instanceof AST_UnaryPrefix - && self.left.operator == "-" - && reversible() - && self.right.is_number(compressor)) { - self = make_node(AST_Binary, self, { - operator: "-", - left: self.right, - right: self.left.expression - }); - break; - } - case "*": - associative = compressor.option("unsafe_math"); - case "&": - case "|": - case "^": - // a + +b => +b + a - if (self.left.is_number(compressor) - && self.right.is_number(compressor) - && reversible() - && !(self.left instanceof AST_Binary - && self.left.operator != self.operator - && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) { - var reversed = make_node(AST_Binary, self, { - operator: self.operator, - left: self.right, - right: self.left - }); - if (self.right instanceof AST_Constant - && !(self.left instanceof AST_Constant)) { - self = best_of(compressor, reversed, self); - } else { - self = best_of(compressor, self, reversed); - } - } - if (associative && self.is_number(compressor)) { - // a + (b + c) => (a + b) + c - if (self.right instanceof AST_Binary - && self.right.operator == self.operator) { - self = make_node(AST_Binary, self, { - operator: self.operator, - left: make_node(AST_Binary, self.left, { - operator: self.operator, - left: self.left, - right: self.right.left, - start: self.left.start, - end: self.right.left.end - }), - right: self.right.right - }); - } - // (n + 2) + 3 => 5 + n - // (2 * n) * 3 => 6 + n - if (self.right instanceof AST_Constant - && self.left instanceof AST_Binary - && self.left.operator == self.operator) { - if (self.left.left instanceof AST_Constant) { - self = make_node(AST_Binary, self, { - operator: self.operator, - left: make_node(AST_Binary, self.left, { - operator: self.operator, - left: self.left.left, - right: self.right, - start: self.left.left.start, - end: self.right.end - }), - right: self.left.right - }); - } else if (self.left.right instanceof AST_Constant) { - self = make_node(AST_Binary, self, { - operator: self.operator, - left: make_node(AST_Binary, self.left, { - operator: self.operator, - left: self.left.right, - right: self.right, - start: self.left.right.start, - end: self.right.end - }), - right: self.left.left - }); - } - } - // (a | 1) | (2 | d) => (3 | a) | b - if (self.left instanceof AST_Binary - && self.left.operator == self.operator - && self.left.right instanceof AST_Constant - && self.right instanceof AST_Binary - && self.right.operator == self.operator - && self.right.left instanceof AST_Constant) { - self = make_node(AST_Binary, self, { - operator: self.operator, - left: make_node(AST_Binary, self.left, { - operator: self.operator, - left: make_node(AST_Binary, self.left.left, { - operator: self.operator, - left: self.left.right, - right: self.right.left, - start: self.left.right.start, - end: self.right.left.end - }), - right: self.left.left - }), - right: self.right.right - }); - } - } - } - } - // x && (y && z) ==> x && y && z - // x || (y || z) ==> x || y || z - // x + ("y" + z) ==> x + "y" + z - // "x" + (y + "z")==> "x" + y + "z" - if (self.right instanceof AST_Binary - && self.right.operator == self.operator - && (lazy_op(self.operator) - || (self.operator == "+" - && (self.right.left.is_string(compressor) - || (self.left.is_string(compressor) - && self.right.right.is_string(compressor)))))) - { - self.left = make_node(AST_Binary, self.left, { - operator : self.operator, - left : self.left, - right : self.right.left - }); - self.right = self.right.right; - return self.transform(compressor); - } - var ev = self.evaluate(compressor); - if (ev !== self) { - ev = make_node_from_constant(ev, self).optimize(compressor); - return best_of(compressor, ev, self); - } - return self; - }); - - function recursive_ref(compressor, def) { - var node; - for (var i = 0; node = compressor.parent(i); i++) { - if (node instanceof AST_Lambda) { - var name = node.name; - if (name && name.definition() === def) break; - } - } - return node; - } - - OPT(AST_SymbolRef, function(self, compressor){ - var def = self.resolve_defines(compressor); - if (def) { - return def.optimize(compressor); - } - // testing against !self.scope.uses_with first is an optimization - if (!compressor.option("ie8") - && is_undeclared_ref(self) - && (!self.scope.uses_with || !compressor.find_parent(AST_With))) { - switch (self.name) { - case "undefined": - return make_node(AST_Undefined, self).optimize(compressor); - case "NaN": - return make_node(AST_NaN, self).optimize(compressor); - case "Infinity": - return make_node(AST_Infinity, self).optimize(compressor); - } - } - if (compressor.option("reduce_vars") - && is_lhs(self, compressor.parent()) !== self) { - var d = self.definition(); - var fixed = self.fixed_value(); - if (fixed instanceof AST_Defun) { - d.fixed = fixed = make_node(AST_Function, fixed, fixed); - } - if (d.single_use && fixed instanceof AST_Function) { - if (d.scope !== self.scope - && (!compressor.option("reduce_funcs") - || d.escaped - || fixed.inlined)) { - d.single_use = false; - } else if (recursive_ref(compressor, d)) { - d.single_use = false; - } else if (d.scope !== self.scope || d.orig[0] instanceof AST_SymbolFunarg) { - d.single_use = fixed.is_constant_expression(self.scope); - if (d.single_use == "f") { - var scope = self.scope; - do { - if (scope instanceof AST_Defun || scope instanceof AST_Function) { - scope.inlined = true; - } - } while (scope = scope.parent_scope); - } - } - } - if (d.single_use && fixed) { - var value = fixed.optimize(compressor); - return value === fixed ? fixed.clone(true) : value; - } - if (fixed && d.should_replace === undefined) { - var init; - if (fixed instanceof AST_This) { - if (!(d.orig[0] instanceof AST_SymbolFunarg) - && all(d.references, function(ref) { - return d.scope === ref.scope; - })) { - init = fixed; - } - } else { - var ev = fixed.evaluate(compressor); - if (ev !== fixed && (compressor.option("unsafe_regexp") || !(ev instanceof RegExp))) { - init = make_node_from_constant(ev, fixed); - } - } - if (init) { - var value_length = init.optimize(compressor).print_to_string().length; - var fn; - if (has_symbol_ref(fixed)) { - fn = function() { - var result = init.optimize(compressor); - return result === init ? result.clone(true) : result; - }; - } else { - value_length = Math.min(value_length, fixed.print_to_string().length); - fn = function() { - var result = best_of_expression(init.optimize(compressor), fixed); - return result === init || result === fixed ? result.clone(true) : result; - }; - } - var name_length = d.name.length; - var overhead = 0; - if (compressor.option("unused") && !compressor.exposed(d)) { - overhead = (name_length + 2 + value_length) / d.references.length; - } - d.should_replace = value_length <= name_length + overhead ? fn : false; - } else { - d.should_replace = false; - } - } - if (d.should_replace) { - return d.should_replace(); - } - } - return self; - - function has_symbol_ref(value) { - var found; - value.walk(new TreeWalker(function(node) { - if (node instanceof AST_SymbolRef) found = true; - if (found) return true; - })); - return found; - } - }); - - function is_atomic(lhs, self) { - return lhs instanceof AST_SymbolRef || lhs.TYPE === self.TYPE; - } - - OPT(AST_Undefined, function(self, compressor){ - if (compressor.option("unsafe")) { - var undef = find_variable(compressor, "undefined"); - if (undef) { - var ref = make_node(AST_SymbolRef, self, { - name : "undefined", - scope : undef.scope, - thedef : undef - }); - ref.is_undefined = true; - return ref; - } - } - var lhs = is_lhs(compressor.self(), compressor.parent()); - if (lhs && is_atomic(lhs, self)) return self; - return make_node(AST_UnaryPrefix, self, { - operator: "void", - expression: make_node(AST_Number, self, { - value: 0 - }) - }); - }); - - OPT(AST_Infinity, function(self, compressor){ - var lhs = is_lhs(compressor.self(), compressor.parent()); - if (lhs && is_atomic(lhs, self)) return self; - if (compressor.option("keep_infinity") - && !(lhs && !is_atomic(lhs, self)) - && !find_variable(compressor, "Infinity")) - return self; - return make_node(AST_Binary, self, { - operator: "/", - left: make_node(AST_Number, self, { - value: 1 - }), - right: make_node(AST_Number, self, { - value: 0 - }) - }); - }); - - OPT(AST_NaN, function(self, compressor){ - var lhs = is_lhs(compressor.self(), compressor.parent()); - if (lhs && !is_atomic(lhs, self) - || find_variable(compressor, "NaN")) { - return make_node(AST_Binary, self, { - operator: "/", - left: make_node(AST_Number, self, { - value: 0 - }), - right: make_node(AST_Number, self, { - value: 0 - }) - }); - } - return self; - }); - - var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; - var ASSIGN_OPS_COMMUTATIVE = [ '*', '|', '^', '&' ]; - OPT(AST_Assign, function(self, compressor){ - self = self.lift_sequences(compressor); - if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) { - // x = expr1 OP expr2 - if (self.right.left instanceof AST_SymbolRef - && self.right.left.name == self.left.name - && member(self.right.operator, ASSIGN_OPS)) { - // x = x - 2 ---> x -= 2 - self.operator = self.right.operator + "="; - self.right = self.right.right; - } - else if (self.right.right instanceof AST_SymbolRef - && self.right.right.name == self.left.name - && member(self.right.operator, ASSIGN_OPS_COMMUTATIVE) - && !self.right.left.has_side_effects(compressor)) { - // x = 2 & x ---> x &= 2 - self.operator = self.right.operator + "="; - self.right = self.right.left; - } - } - return self; - }); - - OPT(AST_Conditional, function(self, compressor){ - if (!compressor.option("conditionals")) return self; - // This looks like lift_sequences(), should probably be under "sequences" - if (self.condition instanceof AST_Sequence) { - var expressions = self.condition.expressions.slice(); - self.condition = expressions.pop(); - expressions.push(self); - return make_sequence(self, expressions); - } - var cond = self.condition.evaluate(compressor); - if (cond !== self.condition) { - if (cond) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.start); - return maintain_this_binding(compressor.parent(), compressor.self(), self.consequent); - } else { - compressor.warn("Condition always false [{file}:{line},{col}]", self.start); - return maintain_this_binding(compressor.parent(), compressor.self(), self.alternative); - } - } - var negated = cond.negate(compressor, first_in_statement(compressor)); - if (best_of(compressor, cond, negated) === negated) { - self = make_node(AST_Conditional, self, { - condition: negated, - consequent: self.alternative, - alternative: self.consequent - }); - } - var condition = self.condition; - var consequent = self.consequent; - var alternative = self.alternative; - // x?x:y --> x||y - if (condition instanceof AST_SymbolRef - && consequent instanceof AST_SymbolRef - && condition.definition() === consequent.definition()) { - return make_node(AST_Binary, self, { - operator: "||", - left: condition, - right: alternative - }); - } - // if (foo) exp = something; else exp = something_else; - // | - // v - // exp = foo ? something : something_else; - if (consequent instanceof AST_Assign - && alternative instanceof AST_Assign - && consequent.operator == alternative.operator - && consequent.left.equivalent_to(alternative.left) - && (!self.condition.has_side_effects(compressor) - || consequent.operator == "=" - && !consequent.left.has_side_effects(compressor))) { - return make_node(AST_Assign, self, { - operator: consequent.operator, - left: consequent.left, - right: make_node(AST_Conditional, self, { - condition: self.condition, - consequent: consequent.right, - alternative: alternative.right - }) - }); - } - // x ? y(a) : y(b) --> y(x ? a : b) - var arg_index; - if (consequent instanceof AST_Call - && alternative.TYPE === consequent.TYPE - && consequent.args.length > 0 - && consequent.args.length == alternative.args.length - && consequent.expression.equivalent_to(alternative.expression) - && !self.condition.has_side_effects(compressor) - && !consequent.expression.has_side_effects(compressor) - && typeof (arg_index = single_arg_diff()) == "number") { - var node = consequent.clone(); - node.args[arg_index] = make_node(AST_Conditional, self, { - condition: self.condition, - consequent: consequent.args[arg_index], - alternative: alternative.args[arg_index] - }); - return node; - } - // x?y?z:a:a --> x&&y?z:a - if (consequent instanceof AST_Conditional - && consequent.alternative.equivalent_to(alternative)) { - return make_node(AST_Conditional, self, { - condition: make_node(AST_Binary, self, { - left: self.condition, - operator: "&&", - right: consequent.condition - }), - consequent: consequent.consequent, - alternative: alternative - }); - } - // x ? y : y --> x, y - if (consequent.equivalent_to(alternative)) { - return make_sequence(self, [ - self.condition, - consequent - ]).optimize(compressor); - } - var in_bool = compressor.in_boolean_context(); - if (is_true(self.consequent)) { - if (is_false(self.alternative)) { - // c ? true : false ---> !!c - return booleanize(self.condition); - } - // c ? true : x ---> !!c || x - return make_node(AST_Binary, self, { - operator: "||", - left: booleanize(self.condition), - right: self.alternative - }); - } - if (is_false(self.consequent)) { - if (is_true(self.alternative)) { - // c ? false : true ---> !c - return booleanize(self.condition.negate(compressor)); - } - // c ? false : x ---> !c && x - return make_node(AST_Binary, self, { - operator: "&&", - left: booleanize(self.condition.negate(compressor)), - right: self.alternative - }); - } - if (is_true(self.alternative)) { - // c ? x : true ---> !c || x - return make_node(AST_Binary, self, { - operator: "||", - left: booleanize(self.condition.negate(compressor)), - right: self.consequent - }); - } - if (is_false(self.alternative)) { - // c ? x : false ---> !!c && x - return make_node(AST_Binary, self, { - operator: "&&", - left: booleanize(self.condition), - right: self.consequent - }); - } - - return self; - - function booleanize(node) { - if (node.is_boolean()) return node; - // !!expression - return make_node(AST_UnaryPrefix, node, { - operator: "!", - expression: node.negate(compressor) - }); - } - - // AST_True or !0 - function is_true(node) { - return node instanceof AST_True - || in_bool - && node instanceof AST_Constant - && node.getValue() - || (node instanceof AST_UnaryPrefix - && node.operator == "!" - && node.expression instanceof AST_Constant - && !node.expression.getValue()); - } - // AST_False or !1 - function is_false(node) { - return node instanceof AST_False - || in_bool - && node instanceof AST_Constant - && !node.getValue() - || (node instanceof AST_UnaryPrefix - && node.operator == "!" - && node.expression instanceof AST_Constant - && node.expression.getValue()); - } - - function single_arg_diff() { - var a = consequent.args; - var b = alternative.args; - for (var i = 0, len = a.length; i < len; i++) { - if (!a[i].equivalent_to(b[i])) { - for (var j = i + 1; j < len; j++) { - if (!a[j].equivalent_to(b[j])) return; - } - return i; - } - } - } - }); - - OPT(AST_Boolean, function(self, compressor){ - if (compressor.in_boolean_context()) return make_node(AST_Number, self, { - value: +self.value - }); - if (compressor.option("booleans")) { - var p = compressor.parent(); - if (p instanceof AST_Binary && (p.operator == "==" - || p.operator == "!=")) { - compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]", { - operator : p.operator, - value : self.value, - file : p.start.file, - line : p.start.line, - col : p.start.col, - }); - return make_node(AST_Number, self, { - value: +self.value - }); - } - return make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: make_node(AST_Number, self, { - value: 1 - self.value - }) - }); - } - return self; - }); - - OPT(AST_Sub, function(self, compressor){ - var expr = self.expression; - var prop = self.property; - if (compressor.option("properties")) { - var key = prop.evaluate(compressor); - if (key !== prop) { - if (typeof key == "string") { - if (key == "undefined") { - key = undefined; - } else { - var value = parseFloat(key); - if (value.toString() == key) { - key = value; - } - } - } - prop = self.property = best_of_expression(prop, make_node_from_constant(key, prop).transform(compressor)); - var property = "" + key; - if (is_identifier_string(property) - && property.length <= prop.print_to_string().length + 1) { - return make_node(AST_Dot, self, { - expression: expr, - property: property - }).optimize(compressor); - } - } - } - if (is_lhs(self, compressor.parent())) return self; - if (key !== prop) { - var sub = self.flatten_object(property, compressor); - if (sub) { - expr = self.expression = sub.expression; - prop = self.property = sub.property; - } - } - if (compressor.option("properties") && compressor.option("side_effects") - && prop instanceof AST_Number && expr instanceof AST_Array) { - var index = prop.getValue(); - var elements = expr.elements; - if (index in elements) { - var flatten = true; - var values = []; - for (var i = elements.length; --i > index;) { - var value = elements[i].drop_side_effect_free(compressor); - if (value) { - values.unshift(value); - if (flatten && value.has_side_effects(compressor)) flatten = false; - } - } - var retValue = elements[index]; - retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue; - if (!flatten) values.unshift(retValue); - while (--i >= 0) { - var value = elements[i].drop_side_effect_free(compressor); - if (value) values.unshift(value); - else index--; - } - if (flatten) { - values.push(retValue); - return make_sequence(self, values).optimize(compressor); - } else return make_node(AST_Sub, self, { - expression: make_node(AST_Array, expr, { - elements: values - }), - property: make_node(AST_Number, prop, { - value: index - }) - }); - } - } - var ev = self.evaluate(compressor); - if (ev !== self) { - ev = make_node_from_constant(ev, self).optimize(compressor); - return best_of(compressor, ev, self); - } - return self; - }); - - AST_Lambda.DEFMETHOD("contains_this", function() { - var result; - var self = this; - self.walk(new TreeWalker(function(node) { - if (result) return true; - if (node instanceof AST_This) return result = true; - if (node !== self && node instanceof AST_Scope) return true; - })); - return result; - }); - - AST_PropAccess.DEFMETHOD("flatten_object", function(key, compressor) { - if (!compressor.option("properties")) return; - var expr = this.expression; - if (expr instanceof AST_Object) { - var props = expr.properties; - for (var i = props.length; --i >= 0;) { - var prop = props[i]; - if ("" + prop.key == key) { - if (!all(props, function(prop) { - return prop instanceof AST_ObjectKeyVal; - })) break; - var value = prop.value; - if (value instanceof AST_Function - && !(compressor.parent() instanceof AST_New) - && value.contains_this()) break; - return make_node(AST_Sub, this, { - expression: make_node(AST_Array, expr, { - elements: props.map(function(prop) { - return prop.value; - }) - }), - property: make_node(AST_Number, this, { - value: i - }) - }); - } - } - } - }); - - OPT(AST_Dot, function(self, compressor){ - var def = self.resolve_defines(compressor); - if (def) { - return def.optimize(compressor); - } - if (compressor.option("unsafe_proto") - && self.expression instanceof AST_Dot - && self.expression.property == "prototype") { - var exp = self.expression.expression; - if (is_undeclared_ref(exp)) switch (exp.name) { - case "Array": - self.expression = make_node(AST_Array, self.expression, { - elements: [] - }); - break; - case "Object": - self.expression = make_node(AST_Object, self.expression, { - properties: [] - }); - break; - case "String": - self.expression = make_node(AST_String, self.expression, { - value: "" - }); - break; - } - } - if (is_lhs(self, compressor.parent())) return self; - var sub = self.flatten_object(self.property, compressor); - if (sub) return sub.optimize(compressor); - var ev = self.evaluate(compressor); - if (ev !== self) { - ev = make_node_from_constant(ev, self).optimize(compressor); - return best_of(compressor, ev, self); - } - return self; - }); - - function literals_in_boolean_context(self, compressor) { - if (compressor.in_boolean_context()) { - return best_of(compressor, self, make_sequence(self, [ - self, - make_node(AST_True, self) - ]).optimize(compressor)); - } - return self; - }; - OPT(AST_Array, literals_in_boolean_context); - OPT(AST_Object, literals_in_boolean_context); - OPT(AST_RegExp, literals_in_boolean_context); - - OPT(AST_Return, function(self, compressor){ - if (self.value && is_undefined(self.value, compressor)) { - self.value = null; - } - return self; - }); - - OPT(AST_VarDef, function(self, compressor){ - var defines = compressor.option("global_defs"); - if (defines && HOP(defines, self.name.name)) { - compressor.warn('global_defs ' + self.name.name + ' redefined [{file}:{line},{col}]', self.start); - } - return self; - }); - -})(); diff --git a/node_modules/uglify-js/lib/minify.js b/node_modules/uglify-js/lib/minify.js deleted file mode 100644 index 806c3aeb..00000000 --- a/node_modules/uglify-js/lib/minify.js +++ /dev/null @@ -1,228 +0,0 @@ -"use strict"; - -var to_ascii = typeof atob == "undefined" ? function(b64) { - return new Buffer(b64, "base64").toString(); -} : atob; -var to_base64 = typeof btoa == "undefined" ? function(str) { - return new Buffer(str).toString("base64"); -} : btoa; - -function read_source_map(code) { - var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code); - if (!match) { - AST_Node.warn("inline source map not found"); - return null; - } - return to_ascii(match[2]); -} - -function set_shorthand(name, options, keys) { - if (options[name]) { - keys.forEach(function(key) { - if (options[key]) { - if (typeof options[key] != "object") options[key] = {}; - if (!(name in options[key])) options[key][name] = options[name]; - } - }); - } -} - -function init_cache(cache) { - if (!cache) return; - if (!("cname" in cache)) cache.cname = -1; - if (!("props" in cache)) { - cache.props = new Dictionary(); - } else if (!(cache.props instanceof Dictionary)) { - cache.props = Dictionary.fromObject(cache.props); - } -} - -function to_json(cache) { - return { - cname: cache.cname, - props: cache.props.toObject() - }; -} - -function minify(files, options) { - var warn_function = AST_Node.warn_function; - try { - options = defaults(options, { - compress: {}, - ie8: false, - keep_fnames: false, - mangle: {}, - nameCache: null, - output: {}, - parse: {}, - rename: undefined, - sourceMap: false, - timings: false, - toplevel: false, - warnings: false, - wrap: false, - }, true); - var timings = options.timings && { - start: Date.now() - }; - if (options.rename === undefined) { - options.rename = options.compress && options.mangle; - } - set_shorthand("ie8", options, [ "compress", "mangle", "output" ]); - set_shorthand("keep_fnames", options, [ "compress", "mangle" ]); - set_shorthand("toplevel", options, [ "compress", "mangle" ]); - set_shorthand("warnings", options, [ "compress" ]); - var quoted_props; - if (options.mangle) { - options.mangle = defaults(options.mangle, { - cache: options.nameCache && (options.nameCache.vars || {}), - eval: false, - ie8: false, - keep_fnames: false, - properties: false, - reserved: [], - toplevel: false, - }, true); - if (options.mangle.properties) { - if (typeof options.mangle.properties != "object") { - options.mangle.properties = {}; - } - if (options.mangle.properties.keep_quoted) { - quoted_props = options.mangle.properties.reserved; - if (!Array.isArray(quoted_props)) quoted_props = []; - options.mangle.properties.reserved = quoted_props; - } - if (options.nameCache && !("cache" in options.mangle.properties)) { - options.mangle.properties.cache = options.nameCache.props || {}; - } - } - init_cache(options.mangle.cache); - init_cache(options.mangle.properties.cache); - } - if (options.sourceMap) { - options.sourceMap = defaults(options.sourceMap, { - content: null, - filename: null, - includeSources: false, - root: null, - url: null, - }, true); - } - var warnings = []; - if (options.warnings && !AST_Node.warn_function) { - AST_Node.warn_function = function(warning) { - warnings.push(warning); - }; - } - if (timings) timings.parse = Date.now(); - var toplevel; - if (files instanceof AST_Toplevel) { - toplevel = files; - } else { - if (typeof files == "string") { - files = [ files ]; - } - options.parse = options.parse || {}; - options.parse.toplevel = null; - for (var name in files) if (HOP(files, name)) { - options.parse.filename = name; - options.parse.toplevel = parse(files[name], options.parse); - if (options.sourceMap && options.sourceMap.content == "inline") { - if (Object.keys(files).length > 1) - throw new Error("inline source map only works with singular input"); - options.sourceMap.content = read_source_map(files[name]); - } - } - toplevel = options.parse.toplevel; - } - if (quoted_props) { - reserve_quoted_keys(toplevel, quoted_props); - } - if (options.wrap) { - toplevel = toplevel.wrap_commonjs(options.wrap); - } - if (timings) timings.rename = Date.now(); - if (options.rename) { - toplevel.figure_out_scope(options.mangle); - toplevel.expand_names(options.mangle); - } - if (timings) timings.compress = Date.now(); - if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel); - if (timings) timings.scope = Date.now(); - if (options.mangle) toplevel.figure_out_scope(options.mangle); - if (timings) timings.mangle = Date.now(); - if (options.mangle) { - base54.reset(); - toplevel.compute_char_frequency(options.mangle); - toplevel.mangle_names(options.mangle); - } - if (timings) timings.properties = Date.now(); - if (options.mangle && options.mangle.properties) { - toplevel = mangle_properties(toplevel, options.mangle.properties); - } - if (timings) timings.output = Date.now(); - var result = {}; - if (options.output.ast) { - result.ast = toplevel; - } - if (!HOP(options.output, "code") || options.output.code) { - if (options.sourceMap) { - if (typeof options.sourceMap.content == "string") { - options.sourceMap.content = JSON.parse(options.sourceMap.content); - } - options.output.source_map = SourceMap({ - file: options.sourceMap.filename, - orig: options.sourceMap.content, - root: options.sourceMap.root - }); - if (options.sourceMap.includeSources) { - if (files instanceof AST_Toplevel) { - throw new Error("original source content unavailable"); - } else for (var name in files) if (HOP(files, name)) { - options.output.source_map.get().setSourceContent(name, files[name]); - } - } - } - delete options.output.ast; - delete options.output.code; - var stream = OutputStream(options.output); - toplevel.print(stream); - result.code = stream.get(); - if (options.sourceMap) { - result.map = options.output.source_map.toString(); - if (options.sourceMap.url == "inline") { - result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map); - } else if (options.sourceMap.url) { - result.code += "\n//# sourceMappingURL=" + options.sourceMap.url; - } - } - } - if (options.nameCache && options.mangle) { - if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache); - if (options.mangle.properties && options.mangle.properties.cache) { - options.nameCache.props = to_json(options.mangle.properties.cache); - } - } - if (timings) { - timings.end = Date.now(); - result.timings = { - parse: 1e-3 * (timings.rename - timings.parse), - rename: 1e-3 * (timings.compress - timings.rename), - compress: 1e-3 * (timings.scope - timings.compress), - scope: 1e-3 * (timings.mangle - timings.scope), - mangle: 1e-3 * (timings.properties - timings.mangle), - properties: 1e-3 * (timings.output - timings.properties), - output: 1e-3 * (timings.end - timings.output), - total: 1e-3 * (timings.end - timings.start) - } - } - if (warnings.length) { - result.warnings = warnings; - } - return result; - } catch (ex) { - return { error: ex }; - } finally { - AST_Node.warn_function = warn_function; - } -} diff --git a/node_modules/uglify-js/lib/mozilla-ast.js b/node_modules/uglify-js/lib/mozilla-ast.js deleted file mode 100644 index 8d7ee4b8..00000000 --- a/node_modules/uglify-js/lib/mozilla-ast.js +++ /dev/null @@ -1,615 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -(function(){ - - var normalize_directives = function(body) { - var in_directive = true; - - for (var i = 0; i < body.length; i++) { - if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) { - body[i] = new AST_Directive({ - start: body[i].start, - end: body[i].end, - value: body[i].body.value - }); - } else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) { - in_directive = false; - } - } - - return body; - }; - - var MOZ_TO_ME = { - Program: function(M) { - return new AST_Toplevel({ - start: my_start_token(M), - end: my_end_token(M), - body: normalize_directives(M.body.map(from_moz)) - }); - }, - FunctionDeclaration: function(M) { - return new AST_Defun({ - start: my_start_token(M), - end: my_end_token(M), - name: from_moz(M.id), - argnames: M.params.map(from_moz), - body: normalize_directives(from_moz(M.body).body) - }); - }, - FunctionExpression: function(M) { - return new AST_Function({ - start: my_start_token(M), - end: my_end_token(M), - name: from_moz(M.id), - argnames: M.params.map(from_moz), - body: normalize_directives(from_moz(M.body).body) - }); - }, - ExpressionStatement: function(M) { - return new AST_SimpleStatement({ - start: my_start_token(M), - end: my_end_token(M), - body: from_moz(M.expression) - }); - }, - TryStatement: function(M) { - var handlers = M.handlers || [M.handler]; - if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) { - throw new Error("Multiple catch clauses are not supported."); - } - return new AST_Try({ - start : my_start_token(M), - end : my_end_token(M), - body : from_moz(M.block).body, - bcatch : from_moz(handlers[0]), - bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null - }); - }, - Property: function(M) { - var key = M.key; - var args = { - start : my_start_token(key), - end : my_end_token(M.value), - key : key.type == "Identifier" ? key.name : key.value, - value : from_moz(M.value) - }; - if (M.kind == "init") return new AST_ObjectKeyVal(args); - args.key = new AST_SymbolAccessor({ - name: args.key - }); - args.value = new AST_Accessor(args.value); - if (M.kind == "get") return new AST_ObjectGetter(args); - if (M.kind == "set") return new AST_ObjectSetter(args); - }, - ArrayExpression: function(M) { - return new AST_Array({ - start : my_start_token(M), - end : my_end_token(M), - elements : M.elements.map(function(elem){ - return elem === null ? new AST_Hole() : from_moz(elem); - }) - }); - }, - ObjectExpression: function(M) { - return new AST_Object({ - start : my_start_token(M), - end : my_end_token(M), - properties : M.properties.map(function(prop){ - prop.type = "Property"; - return from_moz(prop) - }) - }); - }, - SequenceExpression: function(M) { - return new AST_Sequence({ - start : my_start_token(M), - end : my_end_token(M), - expressions: M.expressions.map(from_moz) - }); - }, - MemberExpression: function(M) { - return new (M.computed ? AST_Sub : AST_Dot)({ - start : my_start_token(M), - end : my_end_token(M), - property : M.computed ? from_moz(M.property) : M.property.name, - expression : from_moz(M.object) - }); - }, - SwitchCase: function(M) { - return new (M.test ? AST_Case : AST_Default)({ - start : my_start_token(M), - end : my_end_token(M), - expression : from_moz(M.test), - body : M.consequent.map(from_moz) - }); - }, - VariableDeclaration: function(M) { - return new AST_Var({ - start : my_start_token(M), - end : my_end_token(M), - definitions : M.declarations.map(from_moz) - }); - }, - Literal: function(M) { - var val = M.value, args = { - start : my_start_token(M), - end : my_end_token(M) - }; - if (val === null) return new AST_Null(args); - switch (typeof val) { - case "string": - args.value = val; - return new AST_String(args); - case "number": - args.value = val; - return new AST_Number(args); - case "boolean": - return new (val ? AST_True : AST_False)(args); - default: - var rx = M.regex; - if (rx && rx.pattern) { - // RegExpLiteral as per ESTree AST spec - args.value = new RegExp(rx.pattern, rx.flags).toString(); - } else { - // support legacy RegExp - args.value = M.regex && M.raw ? M.raw : val; - } - return new AST_RegExp(args); - } - }, - Identifier: function(M) { - var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2]; - return new ( p.type == "LabeledStatement" ? AST_Label - : p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar - : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg) - : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg) - : p.type == "CatchClause" ? AST_SymbolCatch - : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef - : AST_SymbolRef)({ - start : my_start_token(M), - end : my_end_token(M), - name : M.name - }); - } - }; - - MOZ_TO_ME.UpdateExpression = - MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) { - var prefix = "prefix" in M ? M.prefix - : M.type == "UnaryExpression" ? true : false; - return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({ - start : my_start_token(M), - end : my_end_token(M), - operator : M.operator, - expression : from_moz(M.argument) - }); - }; - - map("EmptyStatement", AST_EmptyStatement); - map("BlockStatement", AST_BlockStatement, "body@body"); - map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative"); - map("LabeledStatement", AST_LabeledStatement, "label>label, body>body"); - map("BreakStatement", AST_Break, "label>label"); - map("ContinueStatement", AST_Continue, "label>label"); - map("WithStatement", AST_With, "object>expression, body>body"); - map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body"); - map("ReturnStatement", AST_Return, "argument>value"); - map("ThrowStatement", AST_Throw, "argument>value"); - map("WhileStatement", AST_While, "test>condition, body>body"); - map("DoWhileStatement", AST_Do, "test>condition, body>body"); - map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body"); - map("ForInStatement", AST_ForIn, "left>init, right>object, body>body"); - map("DebuggerStatement", AST_Debugger); - map("VariableDeclarator", AST_VarDef, "id>name, init>value"); - map("CatchClause", AST_Catch, "param>argname, body%body"); - - map("ThisExpression", AST_This); - map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right"); - map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative"); - map("NewExpression", AST_New, "callee>expression, arguments@args"); - map("CallExpression", AST_Call, "callee>expression, arguments@args"); - - def_to_moz(AST_Toplevel, function To_Moz_Program(M) { - return to_moz_scope("Program", M); - }); - - def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) { - return { - type: "FunctionDeclaration", - id: to_moz(M.name), - params: M.argnames.map(to_moz), - body: to_moz_scope("BlockStatement", M) - } - }); - - def_to_moz(AST_Function, function To_Moz_FunctionExpression(M) { - return { - type: "FunctionExpression", - id: to_moz(M.name), - params: M.argnames.map(to_moz), - body: to_moz_scope("BlockStatement", M) - } - }); - - def_to_moz(AST_Directive, function To_Moz_Directive(M) { - return { - type: "ExpressionStatement", - expression: { - type: "Literal", - value: M.value - } - }; - }); - - def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) { - return { - type: "ExpressionStatement", - expression: to_moz(M.body) - }; - }); - - def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) { - return { - type: "SwitchCase", - test: to_moz(M.expression), - consequent: M.body.map(to_moz) - }; - }); - - def_to_moz(AST_Try, function To_Moz_TryStatement(M) { - return { - type: "TryStatement", - block: to_moz_block(M), - handler: to_moz(M.bcatch), - guardedHandlers: [], - finalizer: to_moz(M.bfinally) - }; - }); - - def_to_moz(AST_Catch, function To_Moz_CatchClause(M) { - return { - type: "CatchClause", - param: to_moz(M.argname), - guard: null, - body: to_moz_block(M) - }; - }); - - def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) { - return { - type: "VariableDeclaration", - kind: "var", - declarations: M.definitions.map(to_moz) - }; - }); - - def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) { - return { - type: "SequenceExpression", - expressions: M.expressions.map(to_moz) - }; - }); - - def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) { - var isComputed = M instanceof AST_Sub; - return { - type: "MemberExpression", - object: to_moz(M.expression), - computed: isComputed, - property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property} - }; - }); - - def_to_moz(AST_Unary, function To_Moz_Unary(M) { - return { - type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression", - operator: M.operator, - prefix: M instanceof AST_UnaryPrefix, - argument: to_moz(M.expression) - }; - }); - - def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) { - return { - type: M.operator == "&&" || M.operator == "||" ? "LogicalExpression" : "BinaryExpression", - left: to_moz(M.left), - operator: M.operator, - right: to_moz(M.right) - }; - }); - - def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) { - return { - type: "ArrayExpression", - elements: M.elements.map(to_moz) - }; - }); - - def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) { - return { - type: "ObjectExpression", - properties: M.properties.map(to_moz) - }; - }); - - def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) { - var key = { - type: "Literal", - value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key - }; - var kind; - if (M instanceof AST_ObjectKeyVal) { - kind = "init"; - } else - if (M instanceof AST_ObjectGetter) { - kind = "get"; - } else - if (M instanceof AST_ObjectSetter) { - kind = "set"; - } - return { - type: "Property", - kind: kind, - key: key, - value: to_moz(M.value) - }; - }); - - def_to_moz(AST_Symbol, function To_Moz_Identifier(M) { - var def = M.definition(); - return { - type: "Identifier", - name: def ? def.mangled_name || def.name : M.name - }; - }); - - def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) { - var value = M.value; - return { - type: "Literal", - value: value, - raw: value.toString(), - regex: { - pattern: value.source, - flags: value.toString().match(/[gimuy]*$/)[0] - } - }; - }); - - def_to_moz(AST_Constant, function To_Moz_Literal(M) { - var value = M.value; - if (typeof value === 'number' && (value < 0 || (value === 0 && 1 / value < 0))) { - return { - type: "UnaryExpression", - operator: "-", - prefix: true, - argument: { - type: "Literal", - value: -value, - raw: M.start.raw - } - }; - } - return { - type: "Literal", - value: value, - raw: M.start.raw - }; - }); - - def_to_moz(AST_Atom, function To_Moz_Atom(M) { - return { - type: "Identifier", - name: String(M.value) - }; - }); - - AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast); - AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast); - AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null }); - - AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast); - AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast); - - /* -----[ tools ]----- */ - - function raw_token(moznode) { - if (moznode.type == "Literal") { - return moznode.raw != null ? moznode.raw : moznode.value + ""; - } - } - - function my_start_token(moznode) { - var loc = moznode.loc, start = loc && loc.start; - var range = moznode.range; - return new AST_Token({ - file : loc && loc.source, - line : start && start.line, - col : start && start.column, - pos : range ? range[0] : moznode.start, - endline : start && start.line, - endcol : start && start.column, - endpos : range ? range[0] : moznode.start, - raw : raw_token(moznode), - }); - }; - - function my_end_token(moznode) { - var loc = moznode.loc, end = loc && loc.end; - var range = moznode.range; - return new AST_Token({ - file : loc && loc.source, - line : end && end.line, - col : end && end.column, - pos : range ? range[1] : moznode.end, - endline : end && end.line, - endcol : end && end.column, - endpos : range ? range[1] : moznode.end, - raw : raw_token(moznode), - }); - }; - - function map(moztype, mytype, propmap) { - var moz_to_me = "function From_Moz_" + moztype + "(M){\n"; - moz_to_me += "return new U2." + mytype.name + "({\n" + - "start: my_start_token(M),\n" + - "end: my_end_token(M)"; - - var me_to_moz = "function To_Moz_" + moztype + "(M){\n"; - me_to_moz += "return {\n" + - "type: " + JSON.stringify(moztype); - - if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){ - var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop); - if (!m) throw new Error("Can't understand property map: " + prop); - var moz = m[1], how = m[2], my = m[3]; - moz_to_me += ",\n" + my + ": "; - me_to_moz += ",\n" + moz + ": "; - switch (how) { - case "@": - moz_to_me += "M." + moz + ".map(from_moz)"; - me_to_moz += "M." + my + ".map(to_moz)"; - break; - case ">": - moz_to_me += "from_moz(M." + moz + ")"; - me_to_moz += "to_moz(M." + my + ")"; - break; - case "=": - moz_to_me += "M." + moz; - me_to_moz += "M." + my; - break; - case "%": - moz_to_me += "from_moz(M." + moz + ").body"; - me_to_moz += "to_moz_block(M)"; - break; - default: - throw new Error("Can't understand operator in propmap: " + prop); - } - }); - - moz_to_me += "\n})\n}"; - me_to_moz += "\n}\n}"; - - //moz_to_me = parse(moz_to_me).print_to_string({ beautify: true }); - //me_to_moz = parse(me_to_moz).print_to_string({ beautify: true }); - //console.log(moz_to_me); - - moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")( - exports, my_start_token, my_end_token, from_moz - ); - me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")( - to_moz, to_moz_block, to_moz_scope - ); - MOZ_TO_ME[moztype] = moz_to_me; - def_to_moz(mytype, me_to_moz); - }; - - var FROM_MOZ_STACK = null; - - function from_moz(node) { - FROM_MOZ_STACK.push(node); - var ret = node != null ? MOZ_TO_ME[node.type](node) : null; - FROM_MOZ_STACK.pop(); - return ret; - }; - - AST_Node.from_mozilla_ast = function(node){ - var save_stack = FROM_MOZ_STACK; - FROM_MOZ_STACK = []; - var ast = from_moz(node); - FROM_MOZ_STACK = save_stack; - return ast; - }; - - function set_moz_loc(mynode, moznode, myparent) { - var start = mynode.start; - var end = mynode.end; - if (start.pos != null && end.endpos != null) { - moznode.range = [start.pos, end.endpos]; - } - if (start.line) { - moznode.loc = { - start: {line: start.line, column: start.col}, - end: end.endline ? {line: end.endline, column: end.endcol} : null - }; - if (start.file) { - moznode.loc.source = start.file; - } - } - return moznode; - }; - - function def_to_moz(mytype, handler) { - mytype.DEFMETHOD("to_mozilla_ast", function() { - return set_moz_loc(this, handler(this)); - }); - }; - - function to_moz(node) { - return node != null ? node.to_mozilla_ast() : null; - }; - - function to_moz_block(node) { - return { - type: "BlockStatement", - body: node.body.map(to_moz) - }; - }; - - function to_moz_scope(type, node) { - var body = node.body.map(to_moz); - if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) { - body.unshift(to_moz(new AST_EmptyStatement(node.body[0]))); - } - return { - type: type, - body: body - }; - }; -})(); diff --git a/node_modules/uglify-js/lib/output.js b/node_modules/uglify-js/lib/output.js deleted file mode 100644 index 1aa63450..00000000 --- a/node_modules/uglify-js/lib/output.js +++ /dev/null @@ -1,1445 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -var EXPECT_DIRECTIVE = /^$|[;{][\s\n]*$/; - -function is_some_comments(comment) { - // multiline comment - return comment.type == "comment2" && /@preserve|@license|@cc_on/i.test(comment.value); -} - -function OutputStream(options) { - - options = defaults(options, { - ascii_only : false, - beautify : false, - bracketize : false, - comments : false, - ie8 : false, - indent_level : 4, - indent_start : 0, - inline_script : true, - keep_quoted_props: false, - max_line_len : false, - preamble : null, - preserve_line : false, - quote_keys : false, - quote_style : 0, - semicolons : true, - shebang : true, - source_map : null, - webkit : false, - width : 80, - wrap_iife : false, - }, true); - - // Convert comment option to RegExp if neccessary and set up comments filter - var comment_filter = return_false; // Default case, throw all comments away - if (options.comments) { - var comments = options.comments; - if (typeof options.comments === "string" && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) { - var regex_pos = options.comments.lastIndexOf("/"); - comments = new RegExp( - options.comments.substr(1, regex_pos - 1), - options.comments.substr(regex_pos + 1) - ); - } - if (comments instanceof RegExp) { - comment_filter = function(comment) { - return comment.type != "comment5" && comments.test(comment.value); - }; - } - else if (typeof comments === "function") { - comment_filter = function(comment) { - return comment.type != "comment5" && comments(this, comment); - }; - } - else if (comments === "some") { - comment_filter = is_some_comments; - } else { // NOTE includes "all" option - comment_filter = return_true; - } - } - - var indentation = 0; - var current_col = 0; - var current_line = 1; - var current_pos = 0; - var OUTPUT = ""; - - var to_utf8 = options.ascii_only ? function(str, identifier) { - return str.replace(/[\u0000-\u001f\u007f-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - if (code.length <= 2 && !identifier) { - while (code.length < 2) code = "0" + code; - return "\\x" + code; - } else { - while (code.length < 4) code = "0" + code; - return "\\u" + code; - } - }); - } : function(str) { - return str.replace(/[\ud800-\udbff](?![\udc00-\udfff])/g, function(ch) { - return "\\u" + ch.charCodeAt(0).toString(16); - }).replace(/(^|[^\ud800-\udbff])([\udc00-\udfff])/g, function(match, prefix, ch) { - return prefix + "\\u" + ch.charCodeAt(0).toString(16); - }); - }; - - function make_string(str, quote) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g, - function(s, i){ - switch (s) { - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - case "\\": return "\\\\"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\t": return "\\t"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\x0B": return options.ie8 ? "\\x0B" : "\\v"; - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - case "\ufeff": return "\\ufeff"; - case "\0": - return /[0-9]/.test(str.charAt(i+1)) ? "\\x00" : "\\0"; - } - return s; - }); - function quote_single() { - return "'" + str.replace(/\x27/g, "\\'") + "'"; - } - function quote_double() { - return '"' + str.replace(/\x22/g, '\\"') + '"'; - } - str = to_utf8(str); - switch (options.quote_style) { - case 1: - return quote_single(); - case 2: - return quote_double(); - case 3: - return quote == "'" ? quote_single() : quote_double(); - default: - return dq > sq ? quote_single() : quote_double(); - } - }; - - function encode_string(str, quote) { - var ret = make_string(str, quote); - if (options.inline_script) { - ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1"); - ret = ret.replace(/\x3c!--/g, "\\x3c!--"); - ret = ret.replace(/--\x3e/g, "--\\x3e"); - } - return ret; - }; - - function make_name(name) { - name = name.toString(); - name = to_utf8(name, true); - return name; - }; - - function make_indent(back) { - return repeat_string(" ", options.indent_start + indentation - back * options.indent_level); - }; - - /* -----[ beautification/minification ]----- */ - - var might_need_space = false; - var might_need_semicolon = false; - var might_add_newline = 0; - var last = ""; - var mapping_token, mapping_name, mappings = options.source_map && []; - - var do_add_mapping = mappings ? function() { - mappings.forEach(function(mapping) { - try { - options.source_map.add( - mapping.token.file, - mapping.line, mapping.col, - mapping.token.line, mapping.token.col, - !mapping.name && mapping.token.type == "name" ? mapping.token.value : mapping.name - ); - } catch(ex) { - AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", { - file: mapping.token.file, - line: mapping.token.line, - col: mapping.token.col, - cline: mapping.line, - ccol: mapping.col, - name: mapping.name || "" - }) - } - }); - mappings = []; - } : noop; - - var ensure_line_len = options.max_line_len ? function() { - if (current_col > options.max_line_len) { - if (might_add_newline) { - var left = OUTPUT.slice(0, might_add_newline); - var right = OUTPUT.slice(might_add_newline); - if (mappings) { - var delta = right.length - current_col; - mappings.forEach(function(mapping) { - mapping.line++; - mapping.col += delta; - }); - } - OUTPUT = left + "\n" + right; - current_line++; - current_pos++; - current_col = right.length; - } - if (current_col > options.max_line_len) { - AST_Node.warn("Output exceeds {max_line_len} characters", options); - } - } - if (might_add_newline) { - might_add_newline = 0; - do_add_mapping(); - } - } : noop; - - var requireSemicolonChars = makePredicate("( [ + * / - , ."); - - function print(str) { - str = String(str); - var ch = str.charAt(0); - var prev = last.charAt(last.length - 1); - if (might_need_semicolon) { - might_need_semicolon = false; - - if (prev == ":" && ch == "}" || (!ch || ";}".indexOf(ch) < 0) && prev != ";") { - if (options.semicolons || requireSemicolonChars(ch)) { - OUTPUT += ";"; - current_col++; - current_pos++; - } else { - ensure_line_len(); - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - - if (/^\s+$/.test(str)) { - // reset the semicolon flag, since we didn't print one - // now and might still have to later - might_need_semicolon = true; - } - } - - if (!options.beautify) - might_need_space = false; - } - } - - if (!options.beautify && options.preserve_line && stack[stack.length - 1]) { - var target_line = stack[stack.length - 1].start.line; - while (current_line < target_line) { - ensure_line_len(); - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - might_need_space = false; - } - } - - if (might_need_space) { - if ((is_identifier_char(prev) - && (is_identifier_char(ch) || ch == "\\")) - || (ch == "/" && ch == prev) - || ((ch == "+" || ch == "-") && ch == last)) - { - OUTPUT += " "; - current_col++; - current_pos++; - } - might_need_space = false; - } - - if (mapping_token) { - mappings.push({ - token: mapping_token, - name: mapping_name, - line: current_line, - col: current_col - }); - mapping_token = false; - if (!might_add_newline) do_add_mapping(); - } - - OUTPUT += str; - current_pos += str.length; - var a = str.split(/\r?\n/), n = a.length - 1; - current_line += n; - current_col += a[0].length; - if (n > 0) { - ensure_line_len(); - current_col = a[n].length; - } - last = str; - }; - - var space = options.beautify ? function() { - print(" "); - } : function() { - might_need_space = true; - }; - - var indent = options.beautify ? function(half) { - if (options.beautify) { - print(make_indent(half ? 0.5 : 0)); - } - } : noop; - - var with_indent = options.beautify ? function(col, cont) { - if (col === true) col = next_indent(); - var save_indentation = indentation; - indentation = col; - var ret = cont(); - indentation = save_indentation; - return ret; - } : function(col, cont) { return cont() }; - - var newline = options.beautify ? function() { - print("\n"); - } : options.max_line_len ? function() { - ensure_line_len(); - might_add_newline = OUTPUT.length; - } : noop; - - var semicolon = options.beautify ? function() { - print(";"); - } : function() { - might_need_semicolon = true; - }; - - function force_semicolon() { - might_need_semicolon = false; - print(";"); - }; - - function next_indent() { - return indentation + options.indent_level; - }; - - function with_block(cont) { - var ret; - print("{"); - newline(); - with_indent(next_indent(), function(){ - ret = cont(); - }); - indent(); - print("}"); - return ret; - }; - - function with_parens(cont) { - print("("); - //XXX: still nice to have that for argument lists - //var ret = with_indent(current_col, cont); - var ret = cont(); - print(")"); - return ret; - }; - - function with_square(cont) { - print("["); - //var ret = with_indent(current_col, cont); - var ret = cont(); - print("]"); - return ret; - }; - - function comma() { - print(","); - space(); - }; - - function colon() { - print(":"); - space(); - }; - - var add_mapping = mappings ? function(token, name) { - mapping_token = token; - mapping_name = name; - } : noop; - - function get() { - if (might_add_newline) { - ensure_line_len(); - } - return OUTPUT; - }; - - var stack = []; - return { - get : get, - toString : get, - indent : indent, - indentation : function() { return indentation }, - current_width : function() { return current_col - indentation }, - should_break : function() { return options.width && this.current_width() >= options.width }, - newline : newline, - print : print, - space : space, - comma : comma, - colon : colon, - last : function() { return last }, - semicolon : semicolon, - force_semicolon : force_semicolon, - to_utf8 : to_utf8, - print_name : function(name) { print(make_name(name)) }, - print_string : function(str, quote, escape_directive) { - var encoded = encode_string(str, quote); - if (escape_directive === true && encoded.indexOf("\\") === -1) { - // Insert semicolons to break directive prologue - if (!EXPECT_DIRECTIVE.test(OUTPUT)) { - force_semicolon(); - } - force_semicolon(); - } - print(encoded); - }, - encode_string : encode_string, - next_indent : next_indent, - with_indent : with_indent, - with_block : with_block, - with_parens : with_parens, - with_square : with_square, - add_mapping : add_mapping, - option : function(opt) { return options[opt] }, - comment_filter : comment_filter, - line : function() { return current_line }, - col : function() { return current_col }, - pos : function() { return current_pos }, - push_node : function(node) { stack.push(node) }, - pop_node : function() { return stack.pop() }, - parent : function(n) { - return stack[stack.length - 2 - (n || 0)]; - } - }; - -}; - -/* -----[ code generators ]----- */ - -(function(){ - - /* -----[ utils ]----- */ - - function DEFPRINT(nodetype, generator) { - nodetype.DEFMETHOD("_codegen", generator); - }; - - var in_directive = false; - var active_scope = null; - var use_asm = null; - - AST_Node.DEFMETHOD("print", function(stream, force_parens){ - var self = this, generator = self._codegen; - if (self instanceof AST_Scope) { - active_scope = self; - } - else if (!use_asm && self instanceof AST_Directive && self.value == "use asm") { - use_asm = active_scope; - } - function doit() { - self.add_comments(stream); - self.add_source_map(stream); - generator(self, stream); - } - stream.push_node(self); - if (force_parens || self.needs_parens(stream)) { - stream.with_parens(doit); - } else { - doit(); - } - stream.pop_node(); - if (self === use_asm) { - use_asm = null; - } - }); - AST_Node.DEFMETHOD("_print", AST_Node.prototype.print); - - AST_Node.DEFMETHOD("print_to_string", function(options){ - var s = OutputStream(options); - if (!options) s._readonly = true; - this.print(s); - return s.get(); - }); - - /* -----[ comments ]----- */ - - AST_Node.DEFMETHOD("add_comments", function(output){ - if (output._readonly) return; - var self = this; - var start = self.start; - if (start && !start._comments_dumped) { - start._comments_dumped = true; - var comments = start.comments_before || []; - - // XXX: ugly fix for https://github.com/mishoo/UglifyJS2/issues/112 - // and https://github.com/mishoo/UglifyJS2/issues/372 - if (self instanceof AST_Exit && self.value) { - self.value.walk(new TreeWalker(function(node){ - if (node.start && node.start.comments_before) { - comments = comments.concat(node.start.comments_before); - node.start.comments_before = []; - } - if (node instanceof AST_Function || - node instanceof AST_Array || - node instanceof AST_Object) - { - return true; // don't go inside. - } - })); - } - - if (output.pos() == 0) { - if (comments.length > 0 && output.option("shebang") && comments[0].type == "comment5") { - output.print("#!" + comments.shift().value + "\n"); - output.indent(); - } - var preamble = output.option("preamble"); - if (preamble) { - output.print(preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g, "\n")); - } - } - - comments = comments.filter(output.comment_filter, self); - - // Keep single line comments after nlb, after nlb - if (!output.option("beautify") && comments.length > 0 && - /comment[134]/.test(comments[0].type) && - output.col() !== 0 && comments[0].nlb) - { - output.print("\n"); - } - - comments.forEach(function(c){ - if (/comment[134]/.test(c.type)) { - output.print("//" + c.value + "\n"); - output.indent(); - } - else if (c.type == "comment2") { - output.print("/*" + c.value + "*/"); - if (start.nlb) { - output.print("\n"); - output.indent(); - } else { - output.space(); - } - } - }); - } - }); - - /* -----[ PARENTHESES ]----- */ - - function PARENS(nodetype, func) { - if (Array.isArray(nodetype)) { - nodetype.forEach(function(nodetype){ - PARENS(nodetype, func); - }); - } else { - nodetype.DEFMETHOD("needs_parens", func); - } - }; - - PARENS(AST_Node, function(){ - return false; - }); - - // a function expression needs parens around it when it's provably - // the first token to appear in a statement. - PARENS(AST_Function, function(output){ - if (first_in_statement(output)) { - return true; - } - - if (output.option('webkit')) { - var p = output.parent(); - if (p instanceof AST_PropAccess && p.expression === this) { - return true; - } - } - - if (output.option('wrap_iife')) { - var p = output.parent(); - return p instanceof AST_Call && p.expression === this; - } - - return false; - }); - - // same goes for an object literal, because otherwise it would be - // interpreted as a block of code. - PARENS(AST_Object, function(output){ - return first_in_statement(output); - }); - - PARENS(AST_Unary, function(output){ - var p = output.parent(); - return p instanceof AST_PropAccess && p.expression === this - || p instanceof AST_Call && p.expression === this; - }); - - PARENS(AST_Sequence, function(output){ - var p = output.parent(); - return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4) - || p instanceof AST_Unary // !(foo, bar, baz) - || p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8 - || p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4 - || p instanceof AST_PropAccess // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2 - || p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ] - || p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2 - || p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30) - * ==> 20 (side effect, set a := 10 and b := 20) */ - ; - }); - - PARENS(AST_Binary, function(output){ - var p = output.parent(); - // (foo && bar)() - if (p instanceof AST_Call && p.expression === this) - return true; - // typeof (foo && bar) - if (p instanceof AST_Unary) - return true; - // (foo && bar)["prop"], (foo && bar).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - // this deals with precedence: 3 * (2 + 1) - if (p instanceof AST_Binary) { - var po = p.operator, pp = PRECEDENCE[po]; - var so = this.operator, sp = PRECEDENCE[so]; - if (pp > sp - || (pp == sp - && this === p.right)) { - return true; - } - } - }); - - PARENS(AST_PropAccess, function(output){ - var p = output.parent(); - if (p instanceof AST_New && p.expression === this) { - // i.e. new (foo.bar().baz) - // - // if there's one call into this subtree, then we need - // parens around it too, otherwise the call will be - // interpreted as passing the arguments to the upper New - // expression. - var parens = false; - this.walk(new TreeWalker(function(node) { - if (parens || node instanceof AST_Scope) return true; - if (node instanceof AST_Call) { - parens = true; - return true; - } - })); - return parens; - } - }); - - PARENS(AST_Call, function(output){ - var p = output.parent(), p1; - if (p instanceof AST_New && p.expression === this) - return true; - - // workaround for Safari bug. - // https://bugs.webkit.org/show_bug.cgi?id=123506 - return this.expression instanceof AST_Function - && p instanceof AST_PropAccess - && p.expression === this - && (p1 = output.parent(1)) instanceof AST_Assign - && p1.left === p; - }); - - PARENS(AST_New, function(output){ - var p = output.parent(); - if (!need_constructor_parens(this, output) - && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]() - || p instanceof AST_Call && p.expression === this)) // (new foo)(bar) - return true; - }); - - PARENS(AST_Number, function(output){ - var p = output.parent(); - if (p instanceof AST_PropAccess && p.expression === this) { - var value = this.getValue(); - if (value < 0 || /^0/.test(make_num(value))) { - return true; - } - } - }); - - PARENS([ AST_Assign, AST_Conditional ], function(output){ - var p = output.parent(); - // !(a = false) → true - if (p instanceof AST_Unary) - return true; - // 1 + (a = 2) + 3 → 6, side effect setting a = 2 - if (p instanceof AST_Binary && !(p instanceof AST_Assign)) - return true; - // (a = func)() —or— new (a = Object)() - if (p instanceof AST_Call && p.expression === this) - return true; - // (a = foo) ? bar : baz - if (p instanceof AST_Conditional && p.condition === this) - return true; - // (a = foo)["prop"] —or— (a = foo).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }); - - /* -----[ PRINTERS ]----- */ - - DEFPRINT(AST_Directive, function(self, output){ - output.print_string(self.value, self.quote); - output.semicolon(); - }); - DEFPRINT(AST_Debugger, function(self, output){ - output.print("debugger"); - output.semicolon(); - }); - - /* -----[ statements ]----- */ - - function display_body(body, is_toplevel, output, allow_directives) { - var last = body.length - 1; - in_directive = allow_directives; - body.forEach(function(stmt, i){ - if (in_directive === true && !(stmt instanceof AST_Directive || - stmt instanceof AST_EmptyStatement || - (stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String) - )) { - in_directive = false; - } - if (!(stmt instanceof AST_EmptyStatement)) { - output.indent(); - stmt.print(output); - if (!(i == last && is_toplevel)) { - output.newline(); - if (is_toplevel) output.newline(); - } - } - if (in_directive === true && - stmt instanceof AST_SimpleStatement && - stmt.body instanceof AST_String - ) { - in_directive = false; - } - }); - in_directive = false; - }; - - AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output){ - force_statement(this.body, output); - }); - - DEFPRINT(AST_Statement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - DEFPRINT(AST_Toplevel, function(self, output){ - display_body(self.body, true, output, true); - output.print(""); - }); - DEFPRINT(AST_LabeledStatement, function(self, output){ - self.label.print(output); - output.colon(); - self.body.print(output); - }); - DEFPRINT(AST_SimpleStatement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - function print_bracketed(body, output, allow_directives) { - if (body.length > 0) output.with_block(function(){ - display_body(body, false, output, allow_directives); - }); - else output.print("{}"); - }; - DEFPRINT(AST_BlockStatement, function(self, output){ - print_bracketed(self.body, output); - }); - DEFPRINT(AST_EmptyStatement, function(self, output){ - output.semicolon(); - }); - DEFPRINT(AST_Do, function(self, output){ - output.print("do"); - output.space(); - make_block(self.body, output); - output.space(); - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.semicolon(); - }); - DEFPRINT(AST_While, function(self, output){ - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_For, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - if (self.init) { - if (self.init instanceof AST_Definitions) { - self.init.print(output); - } else { - parenthesize_for_noin(self.init, output, true); - } - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.condition) { - self.condition.print(output); - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.step) { - self.step.print(output); - } - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_ForIn, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - self.init.print(output); - output.space(); - output.print("in"); - output.space(); - self.object.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_With, function(self, output){ - output.print("with"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - self._do_print_body(output); - }); - - /* -----[ functions ]----- */ - AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){ - var self = this; - if (!nokeyword) { - output.print("function"); - } - if (self.name) { - output.space(); - self.name.print(output); - } - output.with_parens(function(){ - self.argnames.forEach(function(arg, i){ - if (i) output.comma(); - arg.print(output); - }); - }); - output.space(); - print_bracketed(self.body, output, true); - }); - DEFPRINT(AST_Lambda, function(self, output){ - self._do_print(output); - }); - - /* -----[ exits ]----- */ - AST_Exit.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.value) { - output.space(); - this.value.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Return, function(self, output){ - self._do_print(output, "return"); - }); - DEFPRINT(AST_Throw, function(self, output){ - self._do_print(output, "throw"); - }); - - /* -----[ loop control ]----- */ - AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.label) { - output.space(); - this.label.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Break, function(self, output){ - self._do_print(output, "break"); - }); - DEFPRINT(AST_Continue, function(self, output){ - self._do_print(output, "continue"); - }); - - /* -----[ if ]----- */ - function make_then(self, output) { - var b = self.body; - if (output.option("bracketize") - || output.option("ie8") && b instanceof AST_Do) - return make_block(b, output); - // The squeezer replaces "block"-s that contain only a single - // statement with the statement itself; technically, the AST - // is correct, but this can create problems when we output an - // IF having an ELSE clause where the THEN clause ends in an - // IF *without* an ELSE block (then the outer ELSE would refer - // to the inner IF). This function checks for this case and - // adds the block brackets if needed. - if (!b) return output.force_semicolon(); - while (true) { - if (b instanceof AST_If) { - if (!b.alternative) { - make_block(self.body, output); - return; - } - b = b.alternative; - } - else if (b instanceof AST_StatementWithBody) { - b = b.body; - } - else break; - } - force_statement(self.body, output); - }; - DEFPRINT(AST_If, function(self, output){ - output.print("if"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - if (self.alternative) { - make_then(self, output); - output.space(); - output.print("else"); - output.space(); - if (self.alternative instanceof AST_If) - self.alternative.print(output); - else - force_statement(self.alternative, output); - } else { - self._do_print_body(output); - } - }); - - /* -----[ switch ]----- */ - DEFPRINT(AST_Switch, function(self, output){ - output.print("switch"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - var last = self.body.length - 1; - if (last < 0) output.print("{}"); - else output.with_block(function(){ - self.body.forEach(function(branch, i){ - output.indent(true); - branch.print(output); - if (i < last && branch.body.length > 0) - output.newline(); - }); - }); - }); - AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){ - output.newline(); - this.body.forEach(function(stmt){ - output.indent(); - stmt.print(output); - output.newline(); - }); - }); - DEFPRINT(AST_Default, function(self, output){ - output.print("default:"); - self._do_print_body(output); - }); - DEFPRINT(AST_Case, function(self, output){ - output.print("case"); - output.space(); - self.expression.print(output); - output.print(":"); - self._do_print_body(output); - }); - - /* -----[ exceptions ]----- */ - DEFPRINT(AST_Try, function(self, output){ - output.print("try"); - output.space(); - print_bracketed(self.body, output); - if (self.bcatch) { - output.space(); - self.bcatch.print(output); - } - if (self.bfinally) { - output.space(); - self.bfinally.print(output); - } - }); - DEFPRINT(AST_Catch, function(self, output){ - output.print("catch"); - output.space(); - output.with_parens(function(){ - self.argname.print(output); - }); - output.space(); - print_bracketed(self.body, output); - }); - DEFPRINT(AST_Finally, function(self, output){ - output.print("finally"); - output.space(); - print_bracketed(self.body, output); - }); - - /* -----[ var/const ]----- */ - AST_Definitions.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - output.space(); - this.definitions.forEach(function(def, i){ - if (i) output.comma(); - def.print(output); - }); - var p = output.parent(); - var in_for = p instanceof AST_For || p instanceof AST_ForIn; - var avoid_semicolon = in_for && p.init === this; - if (!avoid_semicolon) - output.semicolon(); - }); - DEFPRINT(AST_Var, function(self, output){ - self._do_print(output, "var"); - }); - - function parenthesize_for_noin(node, output, noin) { - var parens = false; - // need to take some precautions here: - // https://github.com/mishoo/UglifyJS2/issues/60 - if (noin) node.walk(new TreeWalker(function(node) { - if (parens || node instanceof AST_Scope) return true; - if (node instanceof AST_Binary && node.operator == "in") { - parens = true; - return true; - } - })); - node.print(output, parens); - }; - - DEFPRINT(AST_VarDef, function(self, output){ - self.name.print(output); - if (self.value) { - output.space(); - output.print("="); - output.space(); - var p = output.parent(1); - var noin = p instanceof AST_For || p instanceof AST_ForIn; - parenthesize_for_noin(self.value, output, noin); - } - }); - - /* -----[ other expressions ]----- */ - DEFPRINT(AST_Call, function(self, output){ - self.expression.print(output); - if (self instanceof AST_New && !need_constructor_parens(self, output)) - return; - if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) { - output.add_mapping(self.start); - } - output.with_parens(function(){ - self.args.forEach(function(expr, i){ - if (i) output.comma(); - expr.print(output); - }); - }); - }); - DEFPRINT(AST_New, function(self, output){ - output.print("new"); - output.space(); - AST_Call.prototype._codegen(self, output); - }); - - AST_Sequence.DEFMETHOD("_do_print", function(output){ - this.expressions.forEach(function(node, index) { - if (index > 0) { - output.comma(); - if (output.should_break()) { - output.newline(); - output.indent(); - } - } - node.print(output); - }); - }); - DEFPRINT(AST_Sequence, function(self, output){ - self._do_print(output); - // var p = output.parent(); - // if (p instanceof AST_Statement) { - // output.with_indent(output.next_indent(), function(){ - // self._do_print(output); - // }); - // } else { - // self._do_print(output); - // } - }); - DEFPRINT(AST_Dot, function(self, output){ - var expr = self.expression; - expr.print(output); - var prop = self.property; - if (output.option("ie8") && RESERVED_WORDS(prop)) { - output.print("["); - output.add_mapping(self.end); - output.print_string(prop); - output.print("]"); - } else { - if (expr instanceof AST_Number && expr.getValue() >= 0) { - if (!/[xa-f.)]/i.test(output.last())) { - output.print("."); - } - } - output.print("."); - // the name after dot would be mapped about here. - output.add_mapping(self.end); - output.print_name(prop); - } - }); - DEFPRINT(AST_Sub, function(self, output){ - self.expression.print(output); - output.print("["); - self.property.print(output); - output.print("]"); - }); - DEFPRINT(AST_UnaryPrefix, function(self, output){ - var op = self.operator; - output.print(op); - if (/^[a-z]/i.test(op) - || (/[+-]$/.test(op) - && self.expression instanceof AST_UnaryPrefix - && /^[+-]/.test(self.expression.operator))) { - output.space(); - } - self.expression.print(output); - }); - DEFPRINT(AST_UnaryPostfix, function(self, output){ - self.expression.print(output); - output.print(self.operator); - }); - DEFPRINT(AST_Binary, function(self, output){ - var op = self.operator; - self.left.print(output); - if (op[0] == ">" /* ">>" ">>>" ">" ">=" */ - && self.left instanceof AST_UnaryPostfix - && self.left.operator == "--") { - // space is mandatory to avoid outputting --> - output.print(" "); - } else { - // the space is optional depending on "beautify" - output.space(); - } - output.print(op); - if ((op == "<" || op == "<<") - && self.right instanceof AST_UnaryPrefix - && self.right.operator == "!" - && self.right.expression instanceof AST_UnaryPrefix - && self.right.expression.operator == "--") { - // space is mandatory to avoid outputting ") && S.newline_before) { - forward(3); - skip_line_comment("comment4"); - continue; - } - } - var ch = peek(); - if (!ch) return token("eof"); - var code = ch.charCodeAt(0); - switch (code) { - case 34: case 39: return read_string(ch); - case 46: return handle_dot(); - case 47: { - var tok = handle_slash(); - if (tok === next_token) continue; - return tok; - } - } - if (is_digit(code)) return read_num(); - if (PUNC_CHARS(ch)) return token("punc", next()); - if (OPERATOR_CHARS(ch)) return read_operator(); - if (code == 92 || is_identifier_start(code)) return read_word(); - break; - } - parse_error("Unexpected character '" + ch + "'"); - }; - - next_token.context = function(nc) { - if (nc) S = nc; - return S; - }; - - next_token.add_directive = function(directive) { - S.directive_stack[S.directive_stack.length - 1].push(directive); - - if (S.directives[directive] === undefined) { - S.directives[directive] = 1; - } else { - S.directives[directive]++; - } - } - - next_token.push_directives_stack = function() { - S.directive_stack.push([]); - } - - next_token.pop_directives_stack = function() { - var directives = S.directive_stack[S.directive_stack.length - 1]; - - for (var i = 0; i < directives.length; i++) { - S.directives[directives[i]]--; - } - - S.directive_stack.pop(); - } - - next_token.has_directive = function(directive) { - return S.directives[directive] > 0; - } - - return next_token; - -}; - -/* -----[ Parser (constants) ]----- */ - -var UNARY_PREFIX = makePredicate([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = makePredicate([ "--", "++" ]); - -var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]); - -var PRECEDENCE = (function(a, ret){ - for (var i = 0; i < a.length; ++i) { - var b = a[i]; - for (var j = 0; j < b.length; ++j) { - ret[b[j]] = i + 1; - } - } - return ret; -})( - [ - ["||"], - ["&&"], - ["|"], - ["^"], - ["&"], - ["==", "===", "!=", "!=="], - ["<", ">", "<=", ">=", "in", "instanceof"], - [">>", "<<", ">>>"], - ["+", "-"], - ["*", "/", "%"] - ], - {} -); - -var ATOMIC_START_TOKEN = makePredicate([ "atom", "num", "string", "regexp", "name" ]); - -/* -----[ Parser ]----- */ - -function parse($TEXT, options) { - - options = defaults(options, { - bare_returns : false, - expression : false, - filename : null, - html5_comments : true, - shebang : true, - strict : false, - toplevel : null, - }, true); - - var S = { - input : (typeof $TEXT == "string" - ? tokenizer($TEXT, options.filename, - options.html5_comments, options.shebang) - : $TEXT), - token : null, - prev : null, - peeked : null, - in_function : 0, - in_directives : true, - in_loop : 0, - labels : [] - }; - - S.token = next(); - - function is(type, value) { - return is_token(S.token, type, value); - }; - - function peek() { return S.peeked || (S.peeked = S.input()); }; - - function next() { - S.prev = S.token; - if (S.peeked) { - S.token = S.peeked; - S.peeked = null; - } else { - S.token = S.input(); - } - S.in_directives = S.in_directives && ( - S.token.type == "string" || is("punc", ";") - ); - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - ctx.filename, - line != null ? line : ctx.tokline, - col != null ? col : ctx.tokcol, - pos != null ? pos : ctx.tokpos); - }; - - function token_error(token, msg) { - croak(msg, token.line, token.col); - }; - - function unexpected(token) { - if (token == null) - token = S.token; - token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); - }; - - function expect_token(type, val) { - if (is(type, val)) { - return next(); - } - token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !options.strict && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon(optional) { - if (is("punc", ";")) next(); - else if (!optional && !can_insert_semicolon()) unexpected(); - }; - - function parenthesised() { - expect("("); - var exp = expression(true); - expect(")"); - return exp; - }; - - function embed_tokens(parser) { - return function() { - var start = S.token; - var expr = parser(); - var end = prev(); - expr.start = start; - expr.end = end; - return expr; - }; - }; - - function handle_regexp() { - if (is("operator", "/") || is("operator", "/=")) { - S.peeked = null; - S.token = S.input(S.token.value.substr(1)); // force regexp - } - }; - - var statement = embed_tokens(function() { - handle_regexp(); - switch (S.token.type) { - case "string": - if (S.in_directives) { - var token = peek(); - if (S.token.raw.indexOf("\\") == -1 - && (token.nlb - || is_token(token, "eof") - || is_token(token, "punc", ";") - || is_token(token, "punc", "}"))) { - S.input.add_directive(S.token.value); - } else { - S.in_directives = false; - } - } - var dir = S.in_directives, stat = simple_statement(); - return dir ? new AST_Directive(stat.body) : stat; - case "num": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement() - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return new AST_BlockStatement({ - start : S.token, - body : block_(), - end : prev() - }); - case "[": - case "(": - return simple_statement(); - case ";": - S.in_directives = false; - next(); - return new AST_EmptyStatement(); - default: - unexpected(); - } - - case "keyword": - switch (S.token.value) { - case "break": - next(); - return break_cont(AST_Break); - - case "continue": - next(); - return break_cont(AST_Continue); - - case "debugger": - next(); - semicolon(); - return new AST_Debugger(); - - case "do": - next(); - var body = in_loop(statement); - expect_token("keyword", "while"); - var condition = parenthesised(); - semicolon(true); - return new AST_Do({ - body : body, - condition : condition - }); - - case "while": - next(); - return new AST_While({ - condition : parenthesised(), - body : in_loop(statement) - }); - - case "for": - next(); - return for_(); - - case "function": - next(); - return function_(AST_Defun); - - case "if": - next(); - return if_(); - - case "return": - if (S.in_function == 0 && !options.bare_returns) - croak("'return' outside of function"); - next(); - var value = null; - if (is("punc", ";")) { - next(); - } else if (!can_insert_semicolon()) { - value = expression(true); - semicolon(); - } - return new AST_Return({ - value: value - }); - - case "switch": - next(); - return new AST_Switch({ - expression : parenthesised(), - body : in_loop(switch_body_) - }); - - case "throw": - next(); - if (S.token.nlb) - croak("Illegal newline after 'throw'"); - var value = expression(true); - semicolon(); - return new AST_Throw({ - value: value - }); - - case "try": - next(); - return try_(); - - case "var": - next(); - var node = var_(); - semicolon(); - return node; - - case "with": - if (S.input.has_directive("use strict")) { - croak("Strict mode may not include a with statement"); - } - next(); - return new AST_With({ - expression : parenthesised(), - body : statement() - }); - } - } - unexpected(); - }); - - function labeled_statement() { - var label = as_symbol(AST_Label); - if (find_if(function(l){ return l.name == label.name }, S.labels)) { - // ECMA-262, 12.12: An ECMAScript program is considered - // syntactically incorrect if it contains a - // LabelledStatement that is enclosed by a - // LabelledStatement with the same Identifier as label. - croak("Label " + label.name + " defined twice"); - } - expect(":"); - S.labels.push(label); - var stat = statement(); - S.labels.pop(); - if (!(stat instanceof AST_IterationStatement)) { - // check for `continue` that refers to this label. - // those should be reported as syntax errors. - // https://github.com/mishoo/UglifyJS2/issues/287 - label.references.forEach(function(ref){ - if (ref instanceof AST_Continue) { - ref = ref.label.start; - croak("Continue label `" + label.name + "` refers to non-IterationStatement.", - ref.line, ref.col, ref.pos); - } - }); - } - return new AST_LabeledStatement({ body: stat, label: label }); - }; - - function simple_statement(tmp) { - return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) }); - }; - - function break_cont(type) { - var label = null, ldef; - if (!can_insert_semicolon()) { - label = as_symbol(AST_LabelRef, true); - } - if (label != null) { - ldef = find_if(function(l){ return l.name == label.name }, S.labels); - if (!ldef) - croak("Undefined label " + label.name); - label.thedef = ldef; - } - else if (S.in_loop == 0) - croak(type.TYPE + " not inside a loop or switch"); - semicolon(); - var stat = new type({ label: label }); - if (ldef) ldef.references.push(stat); - return stat; - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) { - if (init instanceof AST_Var) { - if (init.definitions.length > 1) - croak("Only one variable declaration allowed in for..in loop", init.start.line, init.start.col, init.start.pos); - } else if (!is_assignable(init)) { - croak("Invalid left-hand side in for..in loop", init.start.line, init.start.col, init.start.pos); - } - next(); - return for_in(init); - } - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(true); - expect(";"); - var step = is("punc", ")") ? null : expression(true); - expect(")"); - return new AST_For({ - init : init, - condition : test, - step : step, - body : in_loop(statement) - }); - }; - - function for_in(init) { - var lhs = init instanceof AST_Var ? init.definitions[0].name : null; - var obj = expression(true); - expect(")"); - return new AST_ForIn({ - init : init, - name : lhs, - object : obj, - body : in_loop(statement) - }); - }; - - var function_ = function(ctor) { - var in_statement = ctor === AST_Defun; - var name = is("name") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null; - if (in_statement && !name) - unexpected(); - if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration)) - unexpected(prev()); - expect("("); - var argnames = []; - for (var first = true; !is("punc", ")");) { - if (first) first = false; else expect(","); - argnames.push(as_symbol(AST_SymbolFunarg)); - } - next(); - var loop = S.in_loop; - var labels = S.labels; - ++S.in_function; - S.in_directives = true; - S.input.push_directives_stack(); - S.in_loop = 0; - S.labels = []; - var body = block_(); - if (S.input.has_directive("use strict")) { - if (name) strict_verify_symbol(name); - argnames.forEach(strict_verify_symbol); - } - S.input.pop_directives_stack(); - --S.in_function; - S.in_loop = loop; - S.labels = labels; - return new ctor({ - name: name, - argnames: argnames, - body: body - }); - }; - - function if_() { - var cond = parenthesised(), body = statement(), belse = null; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return new AST_If({ - condition : cond, - body : body, - alternative : belse - }); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - function switch_body_() { - expect("{"); - var a = [], cur = null, branch = null, tmp; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Case({ - start : (tmp = S.token, next(), tmp), - expression : expression(true), - body : cur - }); - a.push(branch); - expect(":"); - } - else if (is("keyword", "default")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Default({ - start : (tmp = S.token, next(), expect(":"), tmp), - body : cur - }); - a.push(branch); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - if (branch) branch.end = prev(); - next(); - return a; - }; - - function try_() { - var body = block_(), bcatch = null, bfinally = null; - if (is("keyword", "catch")) { - var start = S.token; - next(); - expect("("); - var name = as_symbol(AST_SymbolCatch); - expect(")"); - bcatch = new AST_Catch({ - start : start, - argname : name, - body : block_(), - end : prev() - }); - } - if (is("keyword", "finally")) { - var start = S.token; - next(); - bfinally = new AST_Finally({ - start : start, - body : block_(), - end : prev() - }); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return new AST_Try({ - body : body, - bcatch : bcatch, - bfinally : bfinally - }); - }; - - function vardefs(no_in) { - var a = []; - for (;;) { - a.push(new AST_VarDef({ - start : S.token, - name : as_symbol(AST_SymbolVar), - value : is("operator", "=") ? (next(), expression(false, no_in)) : null, - end : prev() - })); - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - var var_ = function(no_in) { - return new AST_Var({ - start : prev(), - definitions : vardefs(no_in), - end : prev() - }); - }; - - var new_ = function(allow_calls) { - var start = S.token; - expect_token("operator", "new"); - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(new AST_New({ - start : start, - expression : newexp, - args : args, - end : prev() - }), allow_calls); - }; - - function as_atom_node() { - var tok = S.token, ret; - switch (tok.type) { - case "name": - ret = _make_symbol(AST_SymbolRef); - break; - case "num": - ret = new AST_Number({ start: tok, end: tok, value: tok.value }); - break; - case "string": - ret = new AST_String({ - start : tok, - end : tok, - value : tok.value, - quote : tok.quote - }); - break; - case "regexp": - ret = new AST_RegExp({ start: tok, end: tok, value: tok.value }); - break; - case "atom": - switch (tok.value) { - case "false": - ret = new AST_False({ start: tok, end: tok }); - break; - case "true": - ret = new AST_True({ start: tok, end: tok }); - break; - case "null": - ret = new AST_Null({ start: tok, end: tok }); - break; - } - break; - } - next(); - return ret; - }; - - var expr_atom = function(allow_calls) { - if (is("operator", "new")) { - return new_(allow_calls); - } - var start = S.token; - if (is("punc")) { - switch (start.value) { - case "(": - next(); - var ex = expression(true); - ex.start = start; - ex.end = S.token; - expect(")"); - return subscripts(ex, allow_calls); - case "[": - return subscripts(array_(), allow_calls); - case "{": - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - var func = function_(AST_Function); - func.start = start; - func.end = prev(); - return subscripts(func, allow_calls); - } - if (ATOMIC_START_TOKEN(S.token.type)) { - return subscripts(as_atom_node(), allow_calls); - } - unexpected(); - }; - - function expr_list(closing, allow_trailing_comma, allow_empty) { - var first = true, a = []; - while (!is("punc", closing)) { - if (first) first = false; else expect(","); - if (allow_trailing_comma && is("punc", closing)) break; - if (is("punc", ",") && allow_empty) { - a.push(new AST_Hole({ start: S.token, end: S.token })); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - var array_ = embed_tokens(function() { - expect("["); - return new AST_Array({ - elements: expr_list("]", !options.strict, true) - }); - }); - - var create_accessor = embed_tokens(function() { - return function_(AST_Accessor); - }); - - var object_ = embed_tokens(function() { - expect("{"); - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!options.strict && is("punc", "}")) - // allow trailing comma - break; - var start = S.token; - var type = start.type; - var name = as_property_name(); - if (type == "name" && !is("punc", ":")) { - var key = new AST_SymbolAccessor({ - start: S.token, - name: as_property_name(), - end: prev() - }); - if (name == "get") { - a.push(new AST_ObjectGetter({ - start : start, - key : key, - value : create_accessor(), - end : prev() - })); - continue; - } - if (name == "set") { - a.push(new AST_ObjectSetter({ - start : start, - key : key, - value : create_accessor(), - end : prev() - })); - continue; - } - } - expect(":"); - a.push(new AST_ObjectKeyVal({ - start : start, - quote : start.quote, - key : name, - value : expression(false), - end : prev() - })); - } - next(); - return new AST_Object({ properties: a }); - }); - - function as_property_name() { - var tmp = S.token; - switch (tmp.type) { - case "operator": - if (!KEYWORDS(tmp.value)) unexpected(); - case "num": - case "string": - case "name": - case "keyword": - case "atom": - next(); - return tmp.value; - default: - unexpected(); - } - }; - - function as_name() { - var tmp = S.token; - if (tmp.type != "name") unexpected(); - next(); - return tmp.value; - }; - - function _make_symbol(type) { - var name = S.token.value; - return new (name == "this" ? AST_This : type)({ - name : String(name), - start : S.token, - end : S.token - }); - }; - - function strict_verify_symbol(sym) { - if (sym.name == "arguments" || sym.name == "eval") - croak("Unexpected " + sym.name + " in strict mode", sym.start.line, sym.start.col, sym.start.pos); - } - - function as_symbol(type, noerror) { - if (!is("name")) { - if (!noerror) croak("Name expected"); - return null; - } - var sym = _make_symbol(type); - if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) { - strict_verify_symbol(sym); - } - next(); - return sym; - }; - - var subscripts = function(expr, allow_calls) { - var start = expr.start; - if (is("punc", ".")) { - next(); - return subscripts(new AST_Dot({ - start : start, - expression : expr, - property : as_name(), - end : prev() - }), allow_calls); - } - if (is("punc", "[")) { - next(); - var prop = expression(true); - expect("]"); - return subscripts(new AST_Sub({ - start : start, - expression : expr, - property : prop, - end : prev() - }), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(new AST_Call({ - start : start, - expression : expr, - args : expr_list(")"), - end : prev() - }), true); - } - return expr; - }; - - var maybe_unary = function(allow_calls) { - var start = S.token; - if (is("operator") && UNARY_PREFIX(start.value)) { - next(); - handle_regexp(); - var ex = make_unary(AST_UnaryPrefix, start, maybe_unary(allow_calls)); - ex.start = start; - ex.end = prev(); - return ex; - } - var val = expr_atom(allow_calls); - while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) { - val = make_unary(AST_UnaryPostfix, S.token, val); - val.start = start; - val.end = S.token; - next(); - } - return val; - }; - - function make_unary(ctor, token, expr) { - var op = token.value; - switch (op) { - case "++": - case "--": - if (!is_assignable(expr)) - croak("Invalid use of " + op + " operator", token.line, token.col, token.pos); - break; - case "delete": - if (expr instanceof AST_SymbolRef && S.input.has_directive("use strict")) - croak("Calling delete on expression not allowed in strict mode", expr.start.line, expr.start.col, expr.start.pos); - break; - } - return new ctor({ operator: op, expression: expr }); - }; - - var expr_op = function(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(maybe_unary(true), prec, no_in); - return expr_op(new AST_Binary({ - start : left.start, - left : left, - operator : op, - right : right, - end : right.end - }), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(maybe_unary(true), 0, no_in); - }; - - var maybe_conditional = function(no_in) { - var start = S.token; - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return new AST_Conditional({ - start : start, - condition : expr, - consequent : yes, - alternative : expression(false, no_in), - end : prev() - }); - } - return expr; - }; - - function is_assignable(expr) { - return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef; - }; - - var maybe_assign = function(no_in) { - var start = S.token; - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && ASSIGNMENT(val)) { - if (is_assignable(left)) { - next(); - return new AST_Assign({ - start : start, - left : left, - operator : val, - right : maybe_assign(no_in), - end : prev() - }); - } - croak("Invalid assignment"); - } - return left; - }; - - var expression = function(commas, no_in) { - var start = S.token; - var exprs = []; - while (true) { - exprs.push(maybe_assign(no_in)); - if (!commas || !is("punc", ",")) break; - next(); - commas = true; - } - return exprs.length == 1 ? exprs[0] : new AST_Sequence({ - start : start, - expressions : exprs, - end : peek() - }); - }; - - function in_loop(cont) { - ++S.in_loop; - var ret = cont(); - --S.in_loop; - return ret; - }; - - if (options.expression) { - return expression(true); - } - - return (function(){ - var start = S.token; - var body = []; - S.input.push_directives_stack(); - while (!is("eof")) - body.push(statement()); - S.input.pop_directives_stack(); - var end = prev(); - var toplevel = options.toplevel; - if (toplevel) { - toplevel.body = toplevel.body.concat(body); - toplevel.end = end; - } else { - toplevel = new AST_Toplevel({ start: start, body: body, end: end }); - } - return toplevel; - })(); - -}; diff --git a/node_modules/uglify-js/lib/propmangle.js b/node_modules/uglify-js/lib/propmangle.js deleted file mode 100644 index c2f27c42..00000000 --- a/node_modules/uglify-js/lib/propmangle.js +++ /dev/null @@ -1,241 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -function find_builtins(reserved) { - // NaN will be included due to Number.NaN - [ - "null", - "true", - "false", - "Infinity", - "-Infinity", - "undefined", - ].forEach(add); - [ Object, Array, Function, Number, - String, Boolean, Error, Math, - Date, RegExp - ].forEach(function(ctor){ - Object.getOwnPropertyNames(ctor).map(add); - if (ctor.prototype) { - Object.getOwnPropertyNames(ctor.prototype).map(add); - } - }); - function add(name) { - push_uniq(reserved, name); - } -} - -function reserve_quoted_keys(ast, reserved) { - function add(name) { - push_uniq(reserved, name); - } - - ast.walk(new TreeWalker(function(node) { - if (node instanceof AST_ObjectKeyVal && node.quote) { - add(node.key); - } else if (node instanceof AST_Sub) { - addStrings(node.property, add); - } - })); -} - -function addStrings(node, add) { - node.walk(new TreeWalker(function(node) { - if (node instanceof AST_Sequence) { - addStrings(node.tail_node(), add); - } else if (node instanceof AST_String) { - add(node.value); - } else if (node instanceof AST_Conditional) { - addStrings(node.consequent, add); - addStrings(node.alternative, add); - } - return true; - })); -} - -function mangle_properties(ast, options) { - options = defaults(options, { - builtins: false, - cache: null, - debug: false, - keep_quoted: false, - only_cache: false, - regex: null, - reserved: null, - }, true); - - var reserved = options.reserved; - if (!Array.isArray(reserved)) reserved = []; - if (!options.builtins) find_builtins(reserved); - - var cache = options.cache; - if (cache == null) { - cache = { - cname: -1, - props: new Dictionary() - }; - } - - var regex = options.regex; - - // note debug is either false (disabled), or a string of the debug suffix to use (enabled). - // note debug may be enabled as an empty string, which is falsey. Also treat passing 'true' - // the same as passing an empty string. - var debug = options.debug !== false; - var debug_name_suffix; - if (debug) { - debug_name_suffix = (options.debug === true ? "" : options.debug); - } - - var names_to_mangle = []; - var unmangleable = []; - - // step 1: find candidates to mangle - ast.walk(new TreeWalker(function(node){ - if (node instanceof AST_ObjectKeyVal) { - add(node.key); - } - else if (node instanceof AST_ObjectProperty) { - // setter or getter, since KeyVal is handled above - add(node.key.name); - } - else if (node instanceof AST_Dot) { - add(node.property); - } - else if (node instanceof AST_Sub) { - addStrings(node.property, add); - } - })); - - // step 2: transform the tree, renaming properties - return ast.transform(new TreeTransformer(function(node){ - if (node instanceof AST_ObjectKeyVal) { - node.key = mangle(node.key); - } - else if (node instanceof AST_ObjectProperty) { - // setter or getter - node.key.name = mangle(node.key.name); - } - else if (node instanceof AST_Dot) { - node.property = mangle(node.property); - } - else if (!options.keep_quoted && node instanceof AST_Sub) { - node.property = mangleStrings(node.property); - } - })); - - // only function declarations after this line - - function can_mangle(name) { - if (unmangleable.indexOf(name) >= 0) return false; - if (reserved.indexOf(name) >= 0) return false; - if (options.only_cache) { - return cache.props.has(name); - } - if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false; - return true; - } - - function should_mangle(name) { - if (regex && !regex.test(name)) return false; - if (reserved.indexOf(name) >= 0) return false; - return cache.props.has(name) - || names_to_mangle.indexOf(name) >= 0; - } - - function add(name) { - if (can_mangle(name)) - push_uniq(names_to_mangle, name); - - if (!should_mangle(name)) { - push_uniq(unmangleable, name); - } - } - - function mangle(name) { - if (!should_mangle(name)) { - return name; - } - - var mangled = cache.props.get(name); - if (!mangled) { - if (debug) { - // debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_. - var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_"; - - if (can_mangle(debug_mangled)) { - mangled = debug_mangled; - } - } - - // either debug mode is off, or it is on and we could not use the mangled name - if (!mangled) { - do { - mangled = base54(++cache.cname); - } while (!can_mangle(mangled)); - } - - cache.props.set(name, mangled); - } - return mangled; - } - - function mangleStrings(node) { - return node.transform(new TreeTransformer(function(node){ - if (node instanceof AST_Sequence) { - var last = node.expressions.length - 1; - node.expressions[last] = mangleStrings(node.expressions[last]); - } - else if (node instanceof AST_String) { - node.value = mangle(node.value); - } - else if (node instanceof AST_Conditional) { - node.consequent = mangleStrings(node.consequent); - node.alternative = mangleStrings(node.alternative); - } - return node; - })); - } -} diff --git a/node_modules/uglify-js/lib/scope.js b/node_modules/uglify-js/lib/scope.js deleted file mode 100644 index bbfa037c..00000000 --- a/node_modules/uglify-js/lib/scope.js +++ /dev/null @@ -1,589 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -function SymbolDef(scope, orig) { - this.name = orig.name; - this.orig = [ orig ]; - this.eliminated = 0; - this.scope = scope; - this.references = []; - this.replaced = 0; - this.global = false; - this.mangled_name = null; - this.undeclared = false; - this.id = SymbolDef.next_id++; -}; - -SymbolDef.next_id = 1; - -SymbolDef.prototype = { - unmangleable: function(options) { - if (!options) options = {}; - - return (this.global && !options.toplevel) - || this.undeclared - || (!options.eval && (this.scope.uses_eval || this.scope.uses_with)) - || (options.keep_fnames - && (this.orig[0] instanceof AST_SymbolLambda - || this.orig[0] instanceof AST_SymbolDefun)); - }, - mangle: function(options) { - var cache = options.cache && options.cache.props; - if (this.global && cache && cache.has(this.name)) { - this.mangled_name = cache.get(this.name); - } - else if (!this.mangled_name && !this.unmangleable(options)) { - var s = this.scope; - var sym = this.orig[0]; - if (options.ie8 && sym instanceof AST_SymbolLambda) - s = s.parent_scope; - var def; - if (def = this.redefined()) { - this.mangled_name = def.mangled_name || def.name; - } else - this.mangled_name = s.next_mangled(options, this); - if (this.global && cache) { - cache.set(this.name, this.mangled_name); - } - } - }, - redefined: function() { - return this.defun && this.defun.variables.get(this.name); - } -}; - -AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){ - options = defaults(options, { - cache: null, - ie8: false, - }); - - // pass 1: setup scope chaining and handle definitions - var self = this; - var scope = self.parent_scope = null; - var labels = new Dictionary(); - var defun = null; - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_Catch) { - var save_scope = scope; - scope = new AST_Scope(node); - scope.init_scope_vars(save_scope); - descend(); - scope = save_scope; - return true; - } - if (node instanceof AST_Scope) { - node.init_scope_vars(scope); - var save_scope = scope; - var save_defun = defun; - var save_labels = labels; - defun = scope = node; - labels = new Dictionary(); - descend(); - scope = save_scope; - defun = save_defun; - labels = save_labels; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_LabeledStatement) { - var l = node.label; - if (labels.has(l.name)) { - throw new Error(string_template("Label {name} defined twice", l)); - } - labels.set(l.name, l); - descend(); - labels.del(l.name); - return true; // no descend again - } - if (node instanceof AST_With) { - for (var s = scope; s; s = s.parent_scope) - s.uses_with = true; - return; - } - if (node instanceof AST_Symbol) { - node.scope = scope; - } - if (node instanceof AST_Label) { - node.thedef = node; - node.references = []; - } - if (node instanceof AST_SymbolLambda) { - defun.def_function(node); - } - else if (node instanceof AST_SymbolDefun) { - // Careful here, the scope where this should be defined is - // the parent scope. The reason is that we enter a new - // scope when we encounter the AST_Defun node (which is - // instanceof AST_Scope) but we get to the symbol a bit - // later. - (node.scope = defun.parent_scope).def_function(node); - } - else if (node instanceof AST_SymbolVar) { - defun.def_variable(node); - if (defun !== scope) { - node.mark_enclosed(options); - var def = scope.find_variable(node); - if (node.thedef !== def) { - node.thedef = def; - node.reference(options); - } - } - } - else if (node instanceof AST_SymbolCatch) { - scope.def_variable(node).defun = defun; - } - else if (node instanceof AST_LabelRef) { - var sym = labels.get(node.name); - if (!sym) throw new Error(string_template("Undefined label {name} [{line},{col}]", { - name: node.name, - line: node.start.line, - col: node.start.col - })); - node.thedef = sym; - } - }); - self.walk(tw); - - // pass 2: find back references and eval - self.globals = new Dictionary(); - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_LoopControl && node.label) { - node.label.thedef.references.push(node); - return true; - } - if (node instanceof AST_SymbolRef) { - var name = node.name; - if (name == "eval" && tw.parent() instanceof AST_Call) { - for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) { - s.uses_eval = true; - } - } - var sym = node.scope.find_variable(name); - if (!sym) { - sym = self.def_global(node); - } else if (sym.scope instanceof AST_Lambda && name == "arguments") { - sym.scope.uses_arguments = true; - } - node.thedef = sym; - node.reference(options); - return true; - } - // ensure mangling works if catch reuses a scope variable - var def; - if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) { - var s = node.scope; - while (s) { - push_uniq(s.enclosed, def); - if (s === def.scope) break; - s = s.parent_scope; - } - } - }); - self.walk(tw); - - // pass 3: fix up any scoping issue with IE8 - if (options.ie8) { - self.walk(new TreeWalker(function(node, descend) { - if (node instanceof AST_SymbolCatch) { - var name = node.name; - var refs = node.thedef.references; - var scope = node.thedef.defun; - var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node); - refs.forEach(function(ref) { - ref.thedef = def; - ref.reference(options); - }); - node.thedef = def; - node.reference(options); - return true; - } - })); - } - - if (options.cache) { - this.cname = options.cache.cname; - } -}); - -AST_Toplevel.DEFMETHOD("def_global", function(node){ - var globals = this.globals, name = node.name; - if (globals.has(name)) { - return globals.get(name); - } else { - var g = new SymbolDef(this, node); - g.undeclared = true; - g.global = true; - globals.set(name, g); - return g; - } -}); - -AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){ - this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions) - this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope) - this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement - this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval` - this.parent_scope = parent_scope; // the parent scope - this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes - this.cname = -1; // the current index for mangling functions/variables -}); - -AST_Lambda.DEFMETHOD("init_scope_vars", function(){ - AST_Scope.prototype.init_scope_vars.apply(this, arguments); - this.uses_arguments = false; - this.def_variable(new AST_SymbolFunarg({ - name: "arguments", - start: this.start, - end: this.end - })); -}); - -AST_Symbol.DEFMETHOD("mark_enclosed", function(options) { - var def = this.definition(); - var s = this.scope; - while (s) { - push_uniq(s.enclosed, def); - if (options.keep_fnames) { - s.functions.each(function(d) { - push_uniq(def.scope.enclosed, d); - }); - } - if (s === def.scope) break; - s = s.parent_scope; - } -}); - -AST_Symbol.DEFMETHOD("reference", function(options) { - this.definition().references.push(this); - this.mark_enclosed(options); -}); - -AST_Scope.DEFMETHOD("find_variable", function(name){ - if (name instanceof AST_Symbol) name = name.name; - return this.variables.get(name) - || (this.parent_scope && this.parent_scope.find_variable(name)); -}); - -AST_Scope.DEFMETHOD("def_function", function(symbol){ - this.functions.set(symbol.name, this.def_variable(symbol)); -}); - -AST_Scope.DEFMETHOD("def_variable", function(symbol){ - var def; - if (!this.variables.has(symbol.name)) { - def = new SymbolDef(this, symbol); - this.variables.set(symbol.name, def); - def.global = !this.parent_scope; - } else { - def = this.variables.get(symbol.name); - def.orig.push(symbol); - } - return symbol.thedef = def; -}); - -AST_Scope.DEFMETHOD("next_mangled", function(options){ - var ext = this.enclosed; - out: while (true) { - var m = base54(++this.cname); - if (!is_identifier(m)) continue; // skip over "do" - - // https://github.com/mishoo/UglifyJS2/issues/242 -- do not - // shadow a name reserved from mangling. - if (member(m, options.reserved)) continue; - - // we must ensure that the mangled name does not shadow a name - // from some parent scope that is referenced in this or in - // inner scopes. - for (var i = ext.length; --i >= 0;) { - var sym = ext[i]; - var name = sym.mangled_name || (sym.unmangleable(options) && sym.name); - if (m == name) continue out; - } - return m; - } -}); - -AST_Function.DEFMETHOD("next_mangled", function(options, def){ - // #179, #326 - // in Safari strict mode, something like (function x(x){...}) is a syntax error; - // a function expression's argument cannot shadow the function expression's name - - var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition(); - - // the function's mangled_name is null when keep_fnames is true - var tricky_name = tricky_def ? tricky_def.mangled_name || tricky_def.name : null; - - while (true) { - var name = AST_Lambda.prototype.next_mangled.call(this, options, def); - if (!tricky_name || tricky_name != name) - return name; - } -}); - -AST_Symbol.DEFMETHOD("unmangleable", function(options){ - var def = this.definition(); - return !def || def.unmangleable(options); -}); - -// labels are always mangleable -AST_Label.DEFMETHOD("unmangleable", return_false); - -AST_Symbol.DEFMETHOD("unreferenced", function(){ - return this.definition().references.length == 0 - && !(this.scope.uses_eval || this.scope.uses_with); -}); - -AST_Symbol.DEFMETHOD("definition", function(){ - return this.thedef; -}); - -AST_Symbol.DEFMETHOD("global", function(){ - return this.definition().global; -}); - -AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options) { - options = defaults(options, { - eval : false, - ie8 : false, - keep_fnames : false, - reserved : [], - toplevel : false, - }); - if (!Array.isArray(options.reserved)) options.reserved = []; - // Never mangle arguments - push_uniq(options.reserved, "arguments"); - return options; -}); - -AST_Toplevel.DEFMETHOD("mangle_names", function(options){ - options = this._default_mangler_options(options); - - // We only need to mangle declaration nodes. Special logic wired - // into the code generator will display the mangled name if it's - // present (and for AST_SymbolRef-s it'll use the mangled name of - // the AST_SymbolDeclaration that it points to). - var lname = -1; - var to_mangle = []; - - if (options.cache) { - this.globals.each(collect); - } - - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_LabeledStatement) { - // lname is incremented when we get to the AST_Label - var save_nesting = lname; - descend(); - lname = save_nesting; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_Scope) { - node.variables.each(collect); - return; - } - if (node instanceof AST_Label) { - var name; - do name = base54(++lname); while (!is_identifier(name)); - node.mangled_name = name; - return true; - } - if (!options.ie8 && node instanceof AST_SymbolCatch) { - to_mangle.push(node.definition()); - return; - } - }); - this.walk(tw); - to_mangle.forEach(function(def){ def.mangle(options) }); - - if (options.cache) { - options.cache.cname = this.cname; - } - - function collect(symbol) { - if (!member(symbol.name, options.reserved)) { - to_mangle.push(symbol); - } - } -}); - -AST_Toplevel.DEFMETHOD("find_unique_prefix", function(options) { - var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"; - var cache = options.cache && options.cache.props; - var prefixes = Object.create(null); - options.reserved.forEach(add_prefix); - this.globals.each(add_def); - this.walk(new TreeWalker(function(node) { - if (node instanceof AST_Scope) node.variables.each(add_def); - if (node instanceof AST_SymbolCatch) add_def(node.definition()); - })); - var prefix, i = 0; - do { - prefix = create_name(i++); - } while (prefixes[prefix]); - return prefix; - - function add_prefix(name) { - if (/[0-9]$/.test(name)) { - prefixes[name.replace(/[0-9]+$/, "")] = true; - } - } - - function add_def(def) { - var name = def.name; - if (def.global && cache && cache.has(name)) name = cache.get(name); - else if (!def.unmangleable(options)) return; - add_prefix(name); - } - - function create_name(num) { - var name = ""; - do { - name += letters[num % letters.length]; - num = Math.floor(num / letters.length); - } while (num); - return name; - } -}); - -AST_Toplevel.DEFMETHOD("expand_names", function(options) { - options = this._default_mangler_options(options); - var prefix = this.find_unique_prefix(options); - this.globals.each(rename); - this.walk(new TreeWalker(function(node) { - if (node instanceof AST_Scope) node.variables.each(rename); - if (node instanceof AST_SymbolCatch) rename(node.definition()); - })); - - function rename(def) { - if (def.global || def.unmangleable(options)) return; - if (member(def.name, options.reserved)) return; - var d = def.redefined(); - def.name = d ? d.name : prefix + def.id; - def.orig.forEach(function(sym) { - sym.name = def.name; - }); - def.references.forEach(function(sym) { - sym.name = def.name; - }); - } -}); - -AST_Node.DEFMETHOD("tail_node", return_this); -AST_Sequence.DEFMETHOD("tail_node", function() { - return this.expressions[this.expressions.length - 1]; -}); - -AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){ - options = this._default_mangler_options(options); - try { - AST_Node.prototype.print = function(stream, force_parens) { - this._print(stream, force_parens); - if (this instanceof AST_Symbol && !this.unmangleable(options)) { - base54.consider(this.name, -1); - } else if (options.properties) { - if (this instanceof AST_Dot) { - base54.consider(this.property, -1); - } else if (this instanceof AST_Sub) { - skip_string(this.property); - } - } - }; - base54.consider(this.print_to_string(), 1); - } finally { - AST_Node.prototype.print = AST_Node.prototype._print; - } - base54.sort(); - - function skip_string(node) { - if (node instanceof AST_String) { - base54.consider(node.value, -1); - } else if (node instanceof AST_Conditional) { - skip_string(node.consequent); - skip_string(node.alternative); - } else if (node instanceof AST_Sequence) { - skip_string(node.tail_node()); - } - } -}); - -var base54 = (function() { - var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split(""); - var digits = "0123456789".split(""); - var chars, frequency; - function reset() { - frequency = Object.create(null); - leading.forEach(function(ch) { - frequency[ch] = 0; - }); - digits.forEach(function(ch) { - frequency[ch] = 0; - }); - } - base54.consider = function(str, delta) { - for (var i = str.length; --i >= 0;) { - frequency[str[i]] += delta; - } - }; - function compare(a, b) { - return frequency[b] - frequency[a]; - } - base54.sort = function() { - chars = mergeSort(leading, compare).concat(mergeSort(digits, compare)); - }; - base54.reset = reset; - reset(); - function base54(num) { - var ret = "", base = 54; - num++; - do { - num--; - ret += chars[num % base]; - num = Math.floor(num / base); - base = 64; - } while (num > 0); - return ret; - }; - return base54; -})(); diff --git a/node_modules/uglify-js/lib/sourcemap.js b/node_modules/uglify-js/lib/sourcemap.js deleted file mode 100644 index 0be16bfc..00000000 --- a/node_modules/uglify-js/lib/sourcemap.js +++ /dev/null @@ -1,97 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -// a small wrapper around fitzgen's source-map library -function SourceMap(options) { - options = defaults(options, { - file : null, - root : null, - orig : null, - - orig_line_diff : 0, - dest_line_diff : 0, - }); - var generator = new MOZ_SourceMap.SourceMapGenerator({ - file : options.file, - sourceRoot : options.root - }); - var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig); - - if (orig_map && Array.isArray(options.orig.sources)) { - orig_map._sources.toArray().forEach(function(source) { - var sourceContent = orig_map.sourceContentFor(source, true); - if (sourceContent) { - generator.setSourceContent(source, sourceContent); - } - }); - } - - function add(source, gen_line, gen_col, orig_line, orig_col, name) { - if (orig_map) { - var info = orig_map.originalPositionFor({ - line: orig_line, - column: orig_col - }); - if (info.source === null) { - return; - } - source = info.source; - orig_line = info.line; - orig_col = info.column; - name = info.name || name; - } - generator.addMapping({ - generated : { line: gen_line + options.dest_line_diff, column: gen_col }, - original : { line: orig_line + options.orig_line_diff, column: orig_col }, - source : source, - name : name - }); - }; - return { - add : add, - get : function() { return generator }, - toString : function() { return JSON.stringify(generator.toJSON()); } - }; -}; diff --git a/node_modules/uglify-js/lib/transform.js b/node_modules/uglify-js/lib/transform.js deleted file mode 100644 index 8008e571..00000000 --- a/node_modules/uglify-js/lib/transform.js +++ /dev/null @@ -1,217 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -// Tree transformer helpers. - -function TreeTransformer(before, after) { - TreeWalker.call(this); - this.before = before; - this.after = after; -} -TreeTransformer.prototype = new TreeWalker; - -(function(undefined){ - - function _(node, descend) { - node.DEFMETHOD("transform", function(tw, in_list){ - var x, y; - tw.push(this); - if (tw.before) x = tw.before(this, descend, in_list); - if (x === undefined) { - if (!tw.after) { - x = this; - descend(x, tw); - } else { - tw.stack[tw.stack.length - 1] = x = this; - descend(x, tw); - y = tw.after(x, in_list); - if (y !== undefined) x = y; - } - } - tw.pop(); - return x; - }); - }; - - function do_list(list, tw) { - return MAP(list, function(node){ - return node.transform(tw, true); - }); - }; - - _(AST_Node, noop); - - _(AST_LabeledStatement, function(self, tw){ - self.label = self.label.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_SimpleStatement, function(self, tw){ - self.body = self.body.transform(tw); - }); - - _(AST_Block, function(self, tw){ - self.body = do_list(self.body, tw); - }); - - _(AST_DWLoop, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_For, function(self, tw){ - if (self.init) self.init = self.init.transform(tw); - if (self.condition) self.condition = self.condition.transform(tw); - if (self.step) self.step = self.step.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_ForIn, function(self, tw){ - self.init = self.init.transform(tw); - self.object = self.object.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_With, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_Exit, function(self, tw){ - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_LoopControl, function(self, tw){ - if (self.label) self.label = self.label.transform(tw); - }); - - _(AST_If, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - if (self.alternative) self.alternative = self.alternative.transform(tw); - }); - - _(AST_Switch, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Case, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Try, function(self, tw){ - self.body = do_list(self.body, tw); - if (self.bcatch) self.bcatch = self.bcatch.transform(tw); - if (self.bfinally) self.bfinally = self.bfinally.transform(tw); - }); - - _(AST_Catch, function(self, tw){ - self.argname = self.argname.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Definitions, function(self, tw){ - self.definitions = do_list(self.definitions, tw); - }); - - _(AST_VarDef, function(self, tw){ - self.name = self.name.transform(tw); - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_Lambda, function(self, tw){ - if (self.name) self.name = self.name.transform(tw); - self.argnames = do_list(self.argnames, tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Call, function(self, tw){ - self.expression = self.expression.transform(tw); - self.args = do_list(self.args, tw); - }); - - _(AST_Sequence, function(self, tw){ - self.expressions = do_list(self.expressions, tw); - }); - - _(AST_Dot, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Sub, function(self, tw){ - self.expression = self.expression.transform(tw); - self.property = self.property.transform(tw); - }); - - _(AST_Unary, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Binary, function(self, tw){ - self.left = self.left.transform(tw); - self.right = self.right.transform(tw); - }); - - _(AST_Conditional, function(self, tw){ - self.condition = self.condition.transform(tw); - self.consequent = self.consequent.transform(tw); - self.alternative = self.alternative.transform(tw); - }); - - _(AST_Array, function(self, tw){ - self.elements = do_list(self.elements, tw); - }); - - _(AST_Object, function(self, tw){ - self.properties = do_list(self.properties, tw); - }); - - _(AST_ObjectProperty, function(self, tw){ - self.value = self.value.transform(tw); - }); - -})(); diff --git a/node_modules/uglify-js/lib/utils.js b/node_modules/uglify-js/lib/utils.js deleted file mode 100644 index 76306919..00000000 --- a/node_modules/uglify-js/lib/utils.js +++ /dev/null @@ -1,355 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “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 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. - - ***********************************************************************/ - -"use strict"; - -function slice(a, start) { - return Array.prototype.slice.call(a, start || 0); -}; - -function characters(str) { - return str.split(""); -}; - -function member(name, array) { - return array.indexOf(name) >= 0; -}; - -function find_if(func, array) { - for (var i = 0, n = array.length; i < n; ++i) { - if (func(array[i])) - return array[i]; - } -}; - -function repeat_string(str, i) { - if (i <= 0) return ""; - if (i == 1) return str; - var d = repeat_string(str, i >> 1); - d += d; - if (i & 1) d += str; - return d; -}; - -function configure_error_stack(fn) { - Object.defineProperty(fn.prototype, "stack", { - get: function() { - var err = new Error(this.message); - err.name = this.name; - try { - throw err; - } catch(e) { - return e.stack; - } - } - }); -} - -function DefaultsError(msg, defs) { - this.message = msg; - this.defs = defs; -}; -DefaultsError.prototype = Object.create(Error.prototype); -DefaultsError.prototype.constructor = DefaultsError; -DefaultsError.prototype.name = "DefaultsError"; -configure_error_stack(DefaultsError); - -DefaultsError.croak = function(msg, defs) { - throw new DefaultsError(msg, defs); -}; - -function defaults(args, defs, croak) { - if (args === true) - args = {}; - var ret = args || {}; - if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i)) - DefaultsError.croak("`" + i + "` is not a supported option", defs); - for (var i in defs) if (HOP(defs, i)) { - ret[i] = (args && HOP(args, i)) ? args[i] : defs[i]; - } - return ret; -}; - -function merge(obj, ext) { - var count = 0; - for (var i in ext) if (HOP(ext, i)) { - obj[i] = ext[i]; - count++; - } - return count; -}; - -function noop() {} -function return_false() { return false; } -function return_true() { return true; } -function return_this() { return this; } -function return_null() { return null; } - -var MAP = (function(){ - function MAP(a, f, backwards) { - var ret = [], top = [], i; - function doit() { - var val = f(a[i], i); - var is_last = val instanceof Last; - if (is_last) val = val.v; - if (val instanceof AtTop) { - val = val.v; - if (val instanceof Splice) { - top.push.apply(top, backwards ? val.v.slice().reverse() : val.v); - } else { - top.push(val); - } - } - else if (val !== skip) { - if (val instanceof Splice) { - ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v); - } else { - ret.push(val); - } - } - return is_last; - }; - if (a instanceof Array) { - if (backwards) { - for (i = a.length; --i >= 0;) if (doit()) break; - ret.reverse(); - top.reverse(); - } else { - for (i = 0; i < a.length; ++i) if (doit()) break; - } - } - else { - for (i in a) if (HOP(a, i)) if (doit()) break; - } - return top.concat(ret); - }; - MAP.at_top = function(val) { return new AtTop(val) }; - MAP.splice = function(val) { return new Splice(val) }; - MAP.last = function(val) { return new Last(val) }; - var skip = MAP.skip = {}; - function AtTop(val) { this.v = val }; - function Splice(val) { this.v = val }; - function Last(val) { this.v = val }; - return MAP; -})(); - -function push_uniq(array, el) { - if (array.indexOf(el) < 0) - array.push(el); -}; - -function string_template(text, props) { - return text.replace(/\{(.+?)\}/g, function(str, p){ - return props && props[p]; - }); -}; - -function remove(array, el) { - for (var i = array.length; --i >= 0;) { - if (array[i] === el) array.splice(i, 1); - } -}; - -function mergeSort(array, cmp) { - if (array.length < 2) return array.slice(); - function merge(a, b) { - var r = [], ai = 0, bi = 0, i = 0; - while (ai < a.length && bi < b.length) { - cmp(a[ai], b[bi]) <= 0 - ? r[i++] = a[ai++] - : r[i++] = b[bi++]; - } - if (ai < a.length) r.push.apply(r, a.slice(ai)); - if (bi < b.length) r.push.apply(r, b.slice(bi)); - return r; - }; - function _ms(a) { - if (a.length <= 1) - return a; - var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m); - left = _ms(left); - right = _ms(right); - return merge(left, right); - }; - return _ms(array); -}; - -function set_difference(a, b) { - return a.filter(function(el){ - return b.indexOf(el) < 0; - }); -}; - -function set_intersection(a, b) { - return a.filter(function(el){ - return b.indexOf(el) >= 0; - }); -}; - -// this function is taken from Acorn [1], written by Marijn Haverbeke -// [1] https://github.com/marijnh/acorn -function makePredicate(words) { - if (!(words instanceof Array)) words = words.split(" "); - var f = "", cats = []; - out: for (var i = 0; i < words.length; ++i) { - for (var j = 0; j < cats.length; ++j) - if (cats[j][0].length == words[i].length) { - cats[j].push(words[i]); - continue out; - } - cats.push([words[i]]); - } - function quote(word) { - return JSON.stringify(word).replace(/[\u2028\u2029]/g, function(s) { - switch (s) { - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - } - return s; - }); - } - function compareTo(arr) { - if (arr.length == 1) return f += "return str === " + quote(arr[0]) + ";"; - f += "switch(str){"; - for (var i = 0; i < arr.length; ++i) f += "case " + quote(arr[i]) + ":"; - f += "return true}return false;"; - } - // When there are more than three length categories, an outer - // switch first dispatches on the lengths, to save on comparisons. - if (cats.length > 3) { - cats.sort(function(a, b) {return b.length - a.length;}); - f += "switch(str.length){"; - for (var i = 0; i < cats.length; ++i) { - var cat = cats[i]; - f += "case " + cat[0].length + ":"; - compareTo(cat); - } - f += "}"; - // Otherwise, simply generate a flat `switch` statement. - } else { - compareTo(words); - } - return new Function("str", f); -}; - -function all(array, predicate) { - for (var i = array.length; --i >= 0;) - if (!predicate(array[i])) - return false; - return true; -}; - -function Dictionary() { - this._values = Object.create(null); - this._size = 0; -}; -Dictionary.prototype = { - set: function(key, val) { - if (!this.has(key)) ++this._size; - this._values["$" + key] = val; - return this; - }, - add: function(key, val) { - if (this.has(key)) { - this.get(key).push(val); - } else { - this.set(key, [ val ]); - } - return this; - }, - get: function(key) { return this._values["$" + key] }, - del: function(key) { - if (this.has(key)) { - --this._size; - delete this._values["$" + key]; - } - return this; - }, - has: function(key) { return ("$" + key) in this._values }, - each: function(f) { - for (var i in this._values) - f(this._values[i], i.substr(1)); - }, - size: function() { - return this._size; - }, - map: function(f) { - var ret = []; - for (var i in this._values) - ret.push(f(this._values[i], i.substr(1))); - return ret; - }, - toObject: function() { return this._values } -}; -Dictionary.fromObject = function(obj) { - var dict = new Dictionary(); - dict._size = merge(dict._values, obj); - return dict; -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -// return true if the node at the top of the stack (that means the -// innermost node in the current output) is lexically the first in -// a statement. -function first_in_statement(stack) { - var node = stack.parent(-1); - for (var i = 0, p; p = stack.parent(i); i++) { - if (p instanceof AST_Statement && p.body === node) - return true; - if ((p instanceof AST_Sequence && p.expressions[0] === node) || - (p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) || - (p instanceof AST_Dot && p.expression === node ) || - (p instanceof AST_Sub && p.expression === node ) || - (p instanceof AST_Conditional && p.condition === node ) || - (p instanceof AST_Binary && p.left === node ) || - (p instanceof AST_UnaryPostfix && p.expression === node )) - { - node = p; - } else { - return false; - } - } -} diff --git a/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md b/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md deleted file mode 100644 index 3a8c066c..00000000 --- a/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md +++ /dev/null @@ -1,301 +0,0 @@ -# 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/uglify-js/node_modules/source-map/LICENSE b/node_modules/uglify-js/node_modules/source-map/LICENSE deleted file mode 100644 index ed1b7cf2..00000000 --- a/node_modules/uglify-js/node_modules/source-map/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ - -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/uglify-js/node_modules/source-map/README.md b/node_modules/uglify-js/node_modules/source-map/README.md deleted file mode 100644 index fea4beb1..00000000 --- a/node_modules/uglify-js/node_modules/source-map/README.md +++ /dev/null @@ -1,742 +0,0 @@ -# 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/uglify-js/node_modules/source-map/dist/source-map.debug.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.debug.js deleted file mode 100644 index aad0620d..00000000 --- a/node_modules/uglify-js/node_modules/source-map/dist/source-map.debug.js +++ /dev/null @@ -1,3234 +0,0 @@ -(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/uglify-js/node_modules/source-map/dist/source-map.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.js deleted file mode 100644 index b4eb0874..00000000 --- a/node_modules/uglify-js/node_modules/source-map/dist/source-map.js +++ /dev/null @@ -1,3233 +0,0 @@ -(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/uglify-js/node_modules/source-map/dist/source-map.min.js b/node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js deleted file mode 100644 index c7c72dad..00000000 --- a/node_modules/uglify-js/node_modules/source-map/dist/source-map.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!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/uglify-js/node_modules/source-map/lib/array-set.js b/node_modules/uglify-js/node_modules/source-map/lib/array-set.js deleted file mode 100644 index fbd5c81c..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/array-set.js +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- 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 = require('./util'); -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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js b/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js deleted file mode 100644 index 612b4040..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/base64-vlq.js +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- 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 = require('./base64'); - -// 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; -}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/base64.js b/node_modules/uglify-js/node_modules/source-map/lib/base64.js deleted file mode 100644 index 8aa86b30..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/base64.js +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- 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; -}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js b/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js deleted file mode 100644 index 010ac941..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/binary-search.js +++ /dev/null @@ -1,111 +0,0 @@ -/* -*- 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; -}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js b/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js deleted file mode 100644 index 06d1274a..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/mapping-list.js +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- 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 = require('./util'); - -/** - * 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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js b/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js deleted file mode 100644 index 6a7caadb..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/quick-sort.js +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- 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); -}; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js b/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js deleted file mode 100644 index 7b99d1da..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/source-map-consumer.js +++ /dev/null @@ -1,1145 +0,0 @@ -/* -*- 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 = require('./util'); -var binarySearch = require('./binary-search'); -var ArraySet = require('./array-set').ArraySet; -var base64VLQ = require('./base64-vlq'); -var quickSort = require('./quick-sort').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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js b/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js deleted file mode 100644 index 508bcfbb..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/source-map-generator.js +++ /dev/null @@ -1,425 +0,0 @@ -/* -*- 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 = require('./base64-vlq'); -var util = require('./util'); -var ArraySet = require('./array-set').ArraySet; -var MappingList = require('./mapping-list').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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/source-node.js b/node_modules/uglify-js/node_modules/source-map/lib/source-node.js deleted file mode 100644 index 8bcdbe38..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/source-node.js +++ /dev/null @@ -1,413 +0,0 @@ -/* -*- 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 = require('./source-map-generator').SourceMapGenerator; -var util = require('./util'); - -// 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; diff --git a/node_modules/uglify-js/node_modules/source-map/lib/util.js b/node_modules/uglify-js/node_modules/source-map/lib/util.js deleted file mode 100644 index 3ca92e56..00000000 --- a/node_modules/uglify-js/node_modules/source-map/lib/util.js +++ /dev/null @@ -1,488 +0,0 @@ -/* -*- 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; diff --git a/node_modules/uglify-js/node_modules/source-map/package.json b/node_modules/uglify-js/node_modules/source-map/package.json deleted file mode 100644 index 24663417..00000000 --- a/node_modules/uglify-js/node_modules/source-map/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "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/uglify-js/node_modules/source-map/source-map.d.ts b/node_modules/uglify-js/node_modules/source-map/source-map.d.ts deleted file mode 100644 index 8f972b0c..00000000 --- a/node_modules/uglify-js/node_modules/source-map/source-map.d.ts +++ /dev/null @@ -1,98 +0,0 @@ -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/uglify-js/node_modules/source-map/source-map.js b/node_modules/uglify-js/node_modules/source-map/source-map.js deleted file mode 100644 index bc88fe82..00000000 --- a/node_modules/uglify-js/node_modules/source-map/source-map.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * 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/uglify-js/package.json b/node_modules/uglify-js/package.json deleted file mode 100644 index e3f21d63..00000000 --- a/node_modules/uglify-js/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "uglify-js", - "description": "JavaScript parser, mangler/compressor and beautifier toolkit", - "homepage": "http://lisperator.net/uglifyjs", - "author": "Mihai Bazon (http://lisperator.net/)", - "license": "BSD-2-Clause", - "version": "3.2.2", - "engines": { - "node": ">=0.8.0" - }, - "maintainers": [ - "Mihai Bazon (http://lisperator.net/)" - ], - "repository": { - "type": "git", - "url": "https://github.com/mishoo/UglifyJS2.git" - }, - "bugs": { - "url": "https://github.com/mishoo/UglifyJS2/issues" - }, - "main": "tools/node.js", - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "files": [ - "bin", - "lib", - "tools", - "LICENSE" - ], - "dependencies": { - "commander": "~2.12.1", - "source-map": "~0.6.1" - }, - "devDependencies": { - "acorn": "~5.2.1", - "mocha": "~3.5.1", - "semver": "~5.4.1" - }, - "scripts": { - "test": "node test/run-tests.js" - }, - "keywords": ["uglify", "uglify-js", "minify", "minifier", "es5"] -} diff --git a/node_modules/uglify-js/tools/domprops.json b/node_modules/uglify-js/tools/domprops.json deleted file mode 100644 index 481e8018..00000000 --- a/node_modules/uglify-js/tools/domprops.json +++ /dev/null @@ -1,5601 +0,0 @@ -[ - "$&", - "$'", - "$*", - "$+", - "$1", - "$2", - "$3", - "$4", - "$5", - "$6", - "$7", - "$8", - "$9", - "$_", - "$`", - "$input", - "@@iterator", - "ABORT_ERR", - "ACTIVE", - "ACTIVE_ATTRIBUTES", - "ACTIVE_TEXTURE", - "ACTIVE_UNIFORMS", - "ADDITION", - "ALIASED_LINE_WIDTH_RANGE", - "ALIASED_POINT_SIZE_RANGE", - "ALLOW_KEYBOARD_INPUT", - "ALLPASS", - "ALPHA", - "ALPHA_BITS", - "ALT_MASK", - "ALWAYS", - "ANY_TYPE", - "ANY_UNORDERED_NODE_TYPE", - "ARRAY_BUFFER", - "ARRAY_BUFFER_BINDING", - "ATTACHED_SHADERS", - "ATTRIBUTE_NODE", - "AT_TARGET", - "AddSearchProvider", - "AnalyserNode", - "AnimationEvent", - "AnonXMLHttpRequest", - "ApplicationCache", - "ApplicationCacheErrorEvent", - "Array", - "ArrayBuffer", - "Attr", - "Audio", - "AudioBuffer", - "AudioBufferSourceNode", - "AudioContext", - "AudioDestinationNode", - "AudioListener", - "AudioNode", - "AudioParam", - "AudioProcessingEvent", - "AudioStreamTrack", - "AutocompleteErrorEvent", - "BACK", - "BAD_BOUNDARYPOINTS_ERR", - "BANDPASS", - "BLEND", - "BLEND_COLOR", - "BLEND_DST_ALPHA", - "BLEND_DST_RGB", - "BLEND_EQUATION", - "BLEND_EQUATION_ALPHA", - "BLEND_EQUATION_RGB", - "BLEND_SRC_ALPHA", - "BLEND_SRC_RGB", - "BLUE_BITS", - "BLUR", - "BOOL", - "BOOLEAN_TYPE", - "BOOL_VEC2", - "BOOL_VEC3", - "BOOL_VEC4", - "BOTH", - "BROWSER_DEFAULT_WEBGL", - "BUBBLING_PHASE", - "BUFFER_SIZE", - "BUFFER_USAGE", - "BYTE", - "BYTES_PER_ELEMENT", - "BarProp", - "BaseHref", - "BatteryManager", - "BeforeLoadEvent", - "BeforeUnloadEvent", - "BiquadFilterNode", - "Blob", - "BlobEvent", - "Boolean", - "CAPTURING_PHASE", - "CCW", - "CDATASection", - "CDATA_SECTION_NODE", - "CHANGE", - "CHARSET_RULE", - "CHECKING", - "CLAMP_TO_EDGE", - "CLICK", - "CLOSED", - "CLOSING", - "COLOR_ATTACHMENT0", - "COLOR_BUFFER_BIT", - "COLOR_CLEAR_VALUE", - "COLOR_WRITEMASK", - "COMMENT_NODE", - "COMPILE_STATUS", - "COMPRESSED_RGBA_S3TC_DXT1_EXT", - "COMPRESSED_RGBA_S3TC_DXT3_EXT", - "COMPRESSED_RGBA_S3TC_DXT5_EXT", - "COMPRESSED_RGB_S3TC_DXT1_EXT", - "COMPRESSED_TEXTURE_FORMATS", - "CONNECTING", - "CONSTANT_ALPHA", - "CONSTANT_COLOR", - "CONSTRAINT_ERR", - "CONTEXT_LOST_WEBGL", - "CONTROL_MASK", - "COUNTER_STYLE_RULE", - "CSS", - "CSS2Properties", - "CSSCharsetRule", - "CSSConditionRule", - "CSSCounterStyleRule", - "CSSFontFaceRule", - "CSSFontFeatureValuesRule", - "CSSGroupingRule", - "CSSImportRule", - "CSSKeyframeRule", - "CSSKeyframesRule", - "CSSMediaRule", - "CSSMozDocumentRule", - "CSSNameSpaceRule", - "CSSPageRule", - "CSSPrimitiveValue", - "CSSRule", - "CSSRuleList", - "CSSStyleDeclaration", - "CSSStyleRule", - "CSSStyleSheet", - "CSSSupportsRule", - "CSSUnknownRule", - "CSSValue", - "CSSValueList", - "CSSVariablesDeclaration", - "CSSVariablesRule", - "CSSViewportRule", - "CSS_ATTR", - "CSS_CM", - "CSS_COUNTER", - "CSS_CUSTOM", - "CSS_DEG", - "CSS_DIMENSION", - "CSS_EMS", - "CSS_EXS", - "CSS_FILTER_BLUR", - "CSS_FILTER_BRIGHTNESS", - "CSS_FILTER_CONTRAST", - "CSS_FILTER_CUSTOM", - "CSS_FILTER_DROP_SHADOW", - "CSS_FILTER_GRAYSCALE", - "CSS_FILTER_HUE_ROTATE", - "CSS_FILTER_INVERT", - "CSS_FILTER_OPACITY", - "CSS_FILTER_REFERENCE", - "CSS_FILTER_SATURATE", - "CSS_FILTER_SEPIA", - "CSS_GRAD", - "CSS_HZ", - "CSS_IDENT", - "CSS_IN", - "CSS_INHERIT", - "CSS_KHZ", - "CSS_MATRIX", - "CSS_MATRIX3D", - "CSS_MM", - "CSS_MS", - "CSS_NUMBER", - "CSS_PC", - "CSS_PERCENTAGE", - "CSS_PERSPECTIVE", - "CSS_PRIMITIVE_VALUE", - "CSS_PT", - "CSS_PX", - "CSS_RAD", - "CSS_RECT", - "CSS_RGBCOLOR", - "CSS_ROTATE", - "CSS_ROTATE3D", - "CSS_ROTATEX", - "CSS_ROTATEY", - "CSS_ROTATEZ", - "CSS_S", - "CSS_SCALE", - "CSS_SCALE3D", - "CSS_SCALEX", - "CSS_SCALEY", - "CSS_SCALEZ", - "CSS_SKEW", - "CSS_SKEWX", - "CSS_SKEWY", - "CSS_STRING", - "CSS_TRANSLATE", - "CSS_TRANSLATE3D", - "CSS_TRANSLATEX", - "CSS_TRANSLATEY", - "CSS_TRANSLATEZ", - "CSS_UNKNOWN", - "CSS_URI", - "CSS_VALUE_LIST", - "CSS_VH", - "CSS_VMAX", - "CSS_VMIN", - "CSS_VW", - "CULL_FACE", - "CULL_FACE_MODE", - "CURRENT_PROGRAM", - "CURRENT_VERTEX_ATTRIB", - "CUSTOM", - "CW", - "CanvasGradient", - "CanvasPattern", - "CanvasRenderingContext2D", - "CaretPosition", - "ChannelMergerNode", - "ChannelSplitterNode", - "CharacterData", - "ClientRect", - "ClientRectList", - "Clipboard", - "ClipboardEvent", - "CloseEvent", - "Collator", - "CommandEvent", - "Comment", - "CompositionEvent", - "Console", - "Controllers", - "ConvolverNode", - "Counter", - "Crypto", - "CryptoKey", - "CustomEvent", - "DATABASE_ERR", - "DATA_CLONE_ERR", - "DATA_ERR", - "DBLCLICK", - "DECR", - "DECR_WRAP", - "DELETE_STATUS", - "DEPTH_ATTACHMENT", - "DEPTH_BITS", - "DEPTH_BUFFER_BIT", - "DEPTH_CLEAR_VALUE", - "DEPTH_COMPONENT", - "DEPTH_COMPONENT16", - "DEPTH_FUNC", - "DEPTH_RANGE", - "DEPTH_STENCIL", - "DEPTH_STENCIL_ATTACHMENT", - "DEPTH_TEST", - "DEPTH_WRITEMASK", - "DIRECTION_DOWN", - "DIRECTION_LEFT", - "DIRECTION_RIGHT", - "DIRECTION_UP", - "DISABLED", - "DISPATCH_REQUEST_ERR", - "DITHER", - "DOCUMENT_FRAGMENT_NODE", - "DOCUMENT_NODE", - "DOCUMENT_POSITION_CONTAINED_BY", - "DOCUMENT_POSITION_CONTAINS", - "DOCUMENT_POSITION_DISCONNECTED", - "DOCUMENT_POSITION_FOLLOWING", - "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", - "DOCUMENT_POSITION_PRECEDING", - "DOCUMENT_TYPE_NODE", - "DOMCursor", - "DOMError", - "DOMException", - "DOMImplementation", - "DOMImplementationLS", - "DOMMatrix", - "DOMMatrixReadOnly", - "DOMParser", - "DOMPoint", - "DOMPointReadOnly", - "DOMQuad", - "DOMRect", - "DOMRectList", - "DOMRectReadOnly", - "DOMRequest", - "DOMSTRING_SIZE_ERR", - "DOMSettableTokenList", - "DOMStringList", - "DOMStringMap", - "DOMTokenList", - "DOMTransactionEvent", - "DOM_DELTA_LINE", - "DOM_DELTA_PAGE", - "DOM_DELTA_PIXEL", - "DOM_INPUT_METHOD_DROP", - "DOM_INPUT_METHOD_HANDWRITING", - "DOM_INPUT_METHOD_IME", - "DOM_INPUT_METHOD_KEYBOARD", - "DOM_INPUT_METHOD_MULTIMODAL", - "DOM_INPUT_METHOD_OPTION", - "DOM_INPUT_METHOD_PASTE", - "DOM_INPUT_METHOD_SCRIPT", - "DOM_INPUT_METHOD_UNKNOWN", - "DOM_INPUT_METHOD_VOICE", - "DOM_KEY_LOCATION_JOYSTICK", - "DOM_KEY_LOCATION_LEFT", - "DOM_KEY_LOCATION_MOBILE", - "DOM_KEY_LOCATION_NUMPAD", - "DOM_KEY_LOCATION_RIGHT", - "DOM_KEY_LOCATION_STANDARD", - "DOM_VK_0", - "DOM_VK_1", - "DOM_VK_2", - "DOM_VK_3", - "DOM_VK_4", - "DOM_VK_5", - "DOM_VK_6", - "DOM_VK_7", - "DOM_VK_8", - "DOM_VK_9", - "DOM_VK_A", - "DOM_VK_ACCEPT", - "DOM_VK_ADD", - "DOM_VK_ALT", - "DOM_VK_ALTGR", - "DOM_VK_AMPERSAND", - "DOM_VK_ASTERISK", - "DOM_VK_AT", - "DOM_VK_ATTN", - "DOM_VK_B", - "DOM_VK_BACKSPACE", - "DOM_VK_BACK_QUOTE", - "DOM_VK_BACK_SLASH", - "DOM_VK_BACK_SPACE", - "DOM_VK_C", - "DOM_VK_CANCEL", - "DOM_VK_CAPS_LOCK", - "DOM_VK_CIRCUMFLEX", - "DOM_VK_CLEAR", - "DOM_VK_CLOSE_BRACKET", - "DOM_VK_CLOSE_CURLY_BRACKET", - "DOM_VK_CLOSE_PAREN", - "DOM_VK_COLON", - "DOM_VK_COMMA", - "DOM_VK_CONTEXT_MENU", - "DOM_VK_CONTROL", - "DOM_VK_CONVERT", - "DOM_VK_CRSEL", - "DOM_VK_CTRL", - "DOM_VK_D", - "DOM_VK_DECIMAL", - "DOM_VK_DELETE", - "DOM_VK_DIVIDE", - "DOM_VK_DOLLAR", - "DOM_VK_DOUBLE_QUOTE", - "DOM_VK_DOWN", - "DOM_VK_E", - "DOM_VK_EISU", - "DOM_VK_END", - "DOM_VK_ENTER", - "DOM_VK_EQUALS", - "DOM_VK_EREOF", - "DOM_VK_ESCAPE", - "DOM_VK_EXCLAMATION", - "DOM_VK_EXECUTE", - "DOM_VK_EXSEL", - "DOM_VK_F", - "DOM_VK_F1", - "DOM_VK_F10", - "DOM_VK_F11", - "DOM_VK_F12", - "DOM_VK_F13", - "DOM_VK_F14", - "DOM_VK_F15", - "DOM_VK_F16", - "DOM_VK_F17", - "DOM_VK_F18", - "DOM_VK_F19", - "DOM_VK_F2", - "DOM_VK_F20", - "DOM_VK_F21", - "DOM_VK_F22", - "DOM_VK_F23", - "DOM_VK_F24", - "DOM_VK_F25", - "DOM_VK_F26", - "DOM_VK_F27", - "DOM_VK_F28", - "DOM_VK_F29", - "DOM_VK_F3", - "DOM_VK_F30", - "DOM_VK_F31", - "DOM_VK_F32", - "DOM_VK_F33", - "DOM_VK_F34", - "DOM_VK_F35", - "DOM_VK_F36", - "DOM_VK_F4", - "DOM_VK_F5", - "DOM_VK_F6", - "DOM_VK_F7", - "DOM_VK_F8", - "DOM_VK_F9", - "DOM_VK_FINAL", - "DOM_VK_FRONT", - "DOM_VK_G", - "DOM_VK_GREATER_THAN", - "DOM_VK_H", - "DOM_VK_HANGUL", - "DOM_VK_HANJA", - "DOM_VK_HASH", - "DOM_VK_HELP", - "DOM_VK_HK_TOGGLE", - "DOM_VK_HOME", - "DOM_VK_HYPHEN_MINUS", - "DOM_VK_I", - "DOM_VK_INSERT", - "DOM_VK_J", - "DOM_VK_JUNJA", - "DOM_VK_K", - "DOM_VK_KANA", - "DOM_VK_KANJI", - "DOM_VK_L", - "DOM_VK_LEFT", - "DOM_VK_LEFT_TAB", - "DOM_VK_LESS_THAN", - "DOM_VK_M", - "DOM_VK_META", - "DOM_VK_MODECHANGE", - "DOM_VK_MULTIPLY", - "DOM_VK_N", - "DOM_VK_NONCONVERT", - "DOM_VK_NUMPAD0", - "DOM_VK_NUMPAD1", - "DOM_VK_NUMPAD2", - "DOM_VK_NUMPAD3", - "DOM_VK_NUMPAD4", - "DOM_VK_NUMPAD5", - "DOM_VK_NUMPAD6", - "DOM_VK_NUMPAD7", - "DOM_VK_NUMPAD8", - "DOM_VK_NUMPAD9", - "DOM_VK_NUM_LOCK", - "DOM_VK_O", - "DOM_VK_OEM_1", - "DOM_VK_OEM_102", - "DOM_VK_OEM_2", - "DOM_VK_OEM_3", - "DOM_VK_OEM_4", - "DOM_VK_OEM_5", - "DOM_VK_OEM_6", - "DOM_VK_OEM_7", - "DOM_VK_OEM_8", - "DOM_VK_OEM_COMMA", - "DOM_VK_OEM_MINUS", - "DOM_VK_OEM_PERIOD", - "DOM_VK_OEM_PLUS", - "DOM_VK_OPEN_BRACKET", - "DOM_VK_OPEN_CURLY_BRACKET", - "DOM_VK_OPEN_PAREN", - "DOM_VK_P", - "DOM_VK_PA1", - "DOM_VK_PAGEDOWN", - "DOM_VK_PAGEUP", - "DOM_VK_PAGE_DOWN", - "DOM_VK_PAGE_UP", - "DOM_VK_PAUSE", - "DOM_VK_PERCENT", - "DOM_VK_PERIOD", - "DOM_VK_PIPE", - "DOM_VK_PLAY", - "DOM_VK_PLUS", - "DOM_VK_PRINT", - "DOM_VK_PRINTSCREEN", - "DOM_VK_PROCESSKEY", - "DOM_VK_PROPERITES", - "DOM_VK_Q", - "DOM_VK_QUESTION_MARK", - "DOM_VK_QUOTE", - "DOM_VK_R", - "DOM_VK_REDO", - "DOM_VK_RETURN", - "DOM_VK_RIGHT", - "DOM_VK_S", - "DOM_VK_SCROLL_LOCK", - "DOM_VK_SELECT", - "DOM_VK_SEMICOLON", - "DOM_VK_SEPARATOR", - "DOM_VK_SHIFT", - "DOM_VK_SLASH", - "DOM_VK_SLEEP", - "DOM_VK_SPACE", - "DOM_VK_SUBTRACT", - "DOM_VK_T", - "DOM_VK_TAB", - "DOM_VK_TILDE", - "DOM_VK_U", - "DOM_VK_UNDERSCORE", - "DOM_VK_UNDO", - "DOM_VK_UNICODE", - "DOM_VK_UP", - "DOM_VK_V", - "DOM_VK_VOLUME_DOWN", - "DOM_VK_VOLUME_MUTE", - "DOM_VK_VOLUME_UP", - "DOM_VK_W", - "DOM_VK_WIN", - "DOM_VK_WINDOW", - "DOM_VK_WIN_ICO_00", - "DOM_VK_WIN_ICO_CLEAR", - "DOM_VK_WIN_ICO_HELP", - "DOM_VK_WIN_OEM_ATTN", - "DOM_VK_WIN_OEM_AUTO", - "DOM_VK_WIN_OEM_BACKTAB", - "DOM_VK_WIN_OEM_CLEAR", - "DOM_VK_WIN_OEM_COPY", - "DOM_VK_WIN_OEM_CUSEL", - "DOM_VK_WIN_OEM_ENLW", - "DOM_VK_WIN_OEM_FINISH", - "DOM_VK_WIN_OEM_FJ_JISHO", - "DOM_VK_WIN_OEM_FJ_LOYA", - "DOM_VK_WIN_OEM_FJ_MASSHOU", - "DOM_VK_WIN_OEM_FJ_ROYA", - "DOM_VK_WIN_OEM_FJ_TOUROKU", - "DOM_VK_WIN_OEM_JUMP", - "DOM_VK_WIN_OEM_PA1", - "DOM_VK_WIN_OEM_PA2", - "DOM_VK_WIN_OEM_PA3", - "DOM_VK_WIN_OEM_RESET", - "DOM_VK_WIN_OEM_WSCTRL", - "DOM_VK_X", - "DOM_VK_XF86XK_ADD_FAVORITE", - "DOM_VK_XF86XK_APPLICATION_LEFT", - "DOM_VK_XF86XK_APPLICATION_RIGHT", - "DOM_VK_XF86XK_AUDIO_CYCLE_TRACK", - "DOM_VK_XF86XK_AUDIO_FORWARD", - "DOM_VK_XF86XK_AUDIO_LOWER_VOLUME", - "DOM_VK_XF86XK_AUDIO_MEDIA", - "DOM_VK_XF86XK_AUDIO_MUTE", - "DOM_VK_XF86XK_AUDIO_NEXT", - "DOM_VK_XF86XK_AUDIO_PAUSE", - "DOM_VK_XF86XK_AUDIO_PLAY", - "DOM_VK_XF86XK_AUDIO_PREV", - "DOM_VK_XF86XK_AUDIO_RAISE_VOLUME", - "DOM_VK_XF86XK_AUDIO_RANDOM_PLAY", - "DOM_VK_XF86XK_AUDIO_RECORD", - "DOM_VK_XF86XK_AUDIO_REPEAT", - "DOM_VK_XF86XK_AUDIO_REWIND", - "DOM_VK_XF86XK_AUDIO_STOP", - "DOM_VK_XF86XK_AWAY", - "DOM_VK_XF86XK_BACK", - "DOM_VK_XF86XK_BACK_FORWARD", - "DOM_VK_XF86XK_BATTERY", - "DOM_VK_XF86XK_BLUE", - "DOM_VK_XF86XK_BLUETOOTH", - "DOM_VK_XF86XK_BOOK", - "DOM_VK_XF86XK_BRIGHTNESS_ADJUST", - "DOM_VK_XF86XK_CALCULATOR", - "DOM_VK_XF86XK_CALENDAR", - "DOM_VK_XF86XK_CD", - "DOM_VK_XF86XK_CLOSE", - "DOM_VK_XF86XK_COMMUNITY", - "DOM_VK_XF86XK_CONTRAST_ADJUST", - "DOM_VK_XF86XK_COPY", - "DOM_VK_XF86XK_CUT", - "DOM_VK_XF86XK_CYCLE_ANGLE", - "DOM_VK_XF86XK_DISPLAY", - "DOM_VK_XF86XK_DOCUMENTS", - "DOM_VK_XF86XK_DOS", - "DOM_VK_XF86XK_EJECT", - "DOM_VK_XF86XK_EXCEL", - "DOM_VK_XF86XK_EXPLORER", - "DOM_VK_XF86XK_FAVORITES", - "DOM_VK_XF86XK_FINANCE", - "DOM_VK_XF86XK_FORWARD", - "DOM_VK_XF86XK_FRAME_BACK", - "DOM_VK_XF86XK_FRAME_FORWARD", - "DOM_VK_XF86XK_GAME", - "DOM_VK_XF86XK_GO", - "DOM_VK_XF86XK_GREEN", - "DOM_VK_XF86XK_HIBERNATE", - "DOM_VK_XF86XK_HISTORY", - "DOM_VK_XF86XK_HOME_PAGE", - "DOM_VK_XF86XK_HOT_LINKS", - "DOM_VK_XF86XK_I_TOUCH", - "DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN", - "DOM_VK_XF86XK_KBD_BRIGHTNESS_UP", - "DOM_VK_XF86XK_KBD_LIGHT_ON_OFF", - "DOM_VK_XF86XK_LAUNCH0", - "DOM_VK_XF86XK_LAUNCH1", - "DOM_VK_XF86XK_LAUNCH2", - "DOM_VK_XF86XK_LAUNCH3", - "DOM_VK_XF86XK_LAUNCH4", - "DOM_VK_XF86XK_LAUNCH5", - "DOM_VK_XF86XK_LAUNCH6", - "DOM_VK_XF86XK_LAUNCH7", - "DOM_VK_XF86XK_LAUNCH8", - "DOM_VK_XF86XK_LAUNCH9", - "DOM_VK_XF86XK_LAUNCH_A", - "DOM_VK_XF86XK_LAUNCH_B", - "DOM_VK_XF86XK_LAUNCH_C", - "DOM_VK_XF86XK_LAUNCH_D", - "DOM_VK_XF86XK_LAUNCH_E", - "DOM_VK_XF86XK_LAUNCH_F", - "DOM_VK_XF86XK_LIGHT_BULB", - "DOM_VK_XF86XK_LOG_OFF", - "DOM_VK_XF86XK_MAIL", - "DOM_VK_XF86XK_MAIL_FORWARD", - "DOM_VK_XF86XK_MARKET", - "DOM_VK_XF86XK_MEETING", - "DOM_VK_XF86XK_MEMO", - "DOM_VK_XF86XK_MENU_KB", - "DOM_VK_XF86XK_MENU_PB", - "DOM_VK_XF86XK_MESSENGER", - "DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN", - "DOM_VK_XF86XK_MON_BRIGHTNESS_UP", - "DOM_VK_XF86XK_MUSIC", - "DOM_VK_XF86XK_MY_COMPUTER", - "DOM_VK_XF86XK_MY_SITES", - "DOM_VK_XF86XK_NEW", - "DOM_VK_XF86XK_NEWS", - "DOM_VK_XF86XK_OFFICE_HOME", - "DOM_VK_XF86XK_OPEN", - "DOM_VK_XF86XK_OPEN_URL", - "DOM_VK_XF86XK_OPTION", - "DOM_VK_XF86XK_PASTE", - "DOM_VK_XF86XK_PHONE", - "DOM_VK_XF86XK_PICTURES", - "DOM_VK_XF86XK_POWER_DOWN", - "DOM_VK_XF86XK_POWER_OFF", - "DOM_VK_XF86XK_RED", - "DOM_VK_XF86XK_REFRESH", - "DOM_VK_XF86XK_RELOAD", - "DOM_VK_XF86XK_REPLY", - "DOM_VK_XF86XK_ROCKER_DOWN", - "DOM_VK_XF86XK_ROCKER_ENTER", - "DOM_VK_XF86XK_ROCKER_UP", - "DOM_VK_XF86XK_ROTATE_WINDOWS", - "DOM_VK_XF86XK_ROTATION_KB", - "DOM_VK_XF86XK_ROTATION_PB", - "DOM_VK_XF86XK_SAVE", - "DOM_VK_XF86XK_SCREEN_SAVER", - "DOM_VK_XF86XK_SCROLL_CLICK", - "DOM_VK_XF86XK_SCROLL_DOWN", - "DOM_VK_XF86XK_SCROLL_UP", - "DOM_VK_XF86XK_SEARCH", - "DOM_VK_XF86XK_SEND", - "DOM_VK_XF86XK_SHOP", - "DOM_VK_XF86XK_SPELL", - "DOM_VK_XF86XK_SPLIT_SCREEN", - "DOM_VK_XF86XK_STANDBY", - "DOM_VK_XF86XK_START", - "DOM_VK_XF86XK_STOP", - "DOM_VK_XF86XK_SUBTITLE", - "DOM_VK_XF86XK_SUPPORT", - "DOM_VK_XF86XK_SUSPEND", - "DOM_VK_XF86XK_TASK_PANE", - "DOM_VK_XF86XK_TERMINAL", - "DOM_VK_XF86XK_TIME", - "DOM_VK_XF86XK_TOOLS", - "DOM_VK_XF86XK_TOP_MENU", - "DOM_VK_XF86XK_TO_DO_LIST", - "DOM_VK_XF86XK_TRAVEL", - "DOM_VK_XF86XK_USER1KB", - "DOM_VK_XF86XK_USER2KB", - "DOM_VK_XF86XK_USER_PB", - "DOM_VK_XF86XK_UWB", - "DOM_VK_XF86XK_VENDOR_HOME", - "DOM_VK_XF86XK_VIDEO", - "DOM_VK_XF86XK_VIEW", - "DOM_VK_XF86XK_WAKE_UP", - "DOM_VK_XF86XK_WEB_CAM", - "DOM_VK_XF86XK_WHEEL_BUTTON", - "DOM_VK_XF86XK_WLAN", - "DOM_VK_XF86XK_WORD", - "DOM_VK_XF86XK_WWW", - "DOM_VK_XF86XK_XFER", - "DOM_VK_XF86XK_YELLOW", - "DOM_VK_XF86XK_ZOOM_IN", - "DOM_VK_XF86XK_ZOOM_OUT", - "DOM_VK_Y", - "DOM_VK_Z", - "DOM_VK_ZOOM", - "DONE", - "DONT_CARE", - "DOWNLOADING", - "DRAGDROP", - "DST_ALPHA", - "DST_COLOR", - "DYNAMIC_DRAW", - "DataChannel", - "DataTransfer", - "DataTransferItem", - "DataTransferItemList", - "DataView", - "Date", - "DateTimeFormat", - "DelayNode", - "DesktopNotification", - "DesktopNotificationCenter", - "DeviceLightEvent", - "DeviceMotionEvent", - "DeviceOrientationEvent", - "DeviceProximityEvent", - "DeviceStorage", - "DeviceStorageChangeEvent", - "Document", - "DocumentFragment", - "DocumentType", - "DragEvent", - "DynamicsCompressorNode", - "E", - "ELEMENT_ARRAY_BUFFER", - "ELEMENT_ARRAY_BUFFER_BINDING", - "ELEMENT_NODE", - "EMPTY", - "ENCODING_ERR", - "ENDED", - "END_TO_END", - "END_TO_START", - "ENTITY_NODE", - "ENTITY_REFERENCE_NODE", - "EPSILON", - "EQUAL", - "EQUALPOWER", - "ERROR", - "EXPONENTIAL_DISTANCE", - "Element", - "ElementQuery", - "Entity", - "EntityReference", - "Error", - "ErrorEvent", - "EvalError", - "Event", - "EventException", - "EventSource", - "EventTarget", - "External", - "FASTEST", - "FIDOSDK", - "FILTER_ACCEPT", - "FILTER_INTERRUPT", - "FILTER_REJECT", - "FILTER_SKIP", - "FINISHED_STATE", - "FIRST_ORDERED_NODE_TYPE", - "FLOAT", - "FLOAT_MAT2", - "FLOAT_MAT3", - "FLOAT_MAT4", - "FLOAT_VEC2", - "FLOAT_VEC3", - "FLOAT_VEC4", - "FOCUS", - "FONT_FACE_RULE", - "FONT_FEATURE_VALUES_RULE", - "FRAGMENT_SHADER", - "FRAGMENT_SHADER_DERIVATIVE_HINT_OES", - "FRAMEBUFFER", - "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", - "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", - "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", - "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", - "FRAMEBUFFER_BINDING", - "FRAMEBUFFER_COMPLETE", - "FRAMEBUFFER_INCOMPLETE_ATTACHMENT", - "FRAMEBUFFER_INCOMPLETE_DIMENSIONS", - "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", - "FRAMEBUFFER_UNSUPPORTED", - "FRONT", - "FRONT_AND_BACK", - "FRONT_FACE", - "FUNC_ADD", - "FUNC_REVERSE_SUBTRACT", - "FUNC_SUBTRACT", - "Feed", - "FeedEntry", - "File", - "FileError", - "FileList", - "FileReader", - "FindInPage", - "Float32Array", - "Float64Array", - "FocusEvent", - "FontFace", - "FormData", - "Function", - "GENERATE_MIPMAP_HINT", - "GEQUAL", - "GREATER", - "GREEN_BITS", - "GainNode", - "Gamepad", - "GamepadButton", - "GamepadEvent", - "GestureEvent", - "HAVE_CURRENT_DATA", - "HAVE_ENOUGH_DATA", - "HAVE_FUTURE_DATA", - "HAVE_METADATA", - "HAVE_NOTHING", - "HEADERS_RECEIVED", - "HIDDEN", - "HIERARCHY_REQUEST_ERR", - "HIGHPASS", - "HIGHSHELF", - "HIGH_FLOAT", - "HIGH_INT", - "HORIZONTAL", - "HORIZONTAL_AXIS", - "HRTF", - "HTMLAllCollection", - "HTMLAnchorElement", - "HTMLAppletElement", - "HTMLAreaElement", - "HTMLAudioElement", - "HTMLBRElement", - "HTMLBaseElement", - "HTMLBaseFontElement", - "HTMLBlockquoteElement", - "HTMLBodyElement", - "HTMLButtonElement", - "HTMLCanvasElement", - "HTMLCollection", - "HTMLCommandElement", - "HTMLContentElement", - "HTMLDListElement", - "HTMLDataElement", - "HTMLDataListElement", - "HTMLDetailsElement", - "HTMLDialogElement", - "HTMLDirectoryElement", - "HTMLDivElement", - "HTMLDocument", - "HTMLElement", - "HTMLEmbedElement", - "HTMLFieldSetElement", - "HTMLFontElement", - "HTMLFormControlsCollection", - "HTMLFormElement", - "HTMLFrameElement", - "HTMLFrameSetElement", - "HTMLHRElement", - "HTMLHeadElement", - "HTMLHeadingElement", - "HTMLHtmlElement", - "HTMLIFrameElement", - "HTMLImageElement", - "HTMLInputElement", - "HTMLIsIndexElement", - "HTMLKeygenElement", - "HTMLLIElement", - "HTMLLabelElement", - "HTMLLegendElement", - "HTMLLinkElement", - "HTMLMapElement", - "HTMLMarqueeElement", - "HTMLMediaElement", - "HTMLMenuElement", - "HTMLMenuItemElement", - "HTMLMetaElement", - "HTMLMeterElement", - "HTMLModElement", - "HTMLOListElement", - "HTMLObjectElement", - "HTMLOptGroupElement", - "HTMLOptionElement", - "HTMLOptionsCollection", - "HTMLOutputElement", - "HTMLParagraphElement", - "HTMLParamElement", - "HTMLPictureElement", - "HTMLPreElement", - "HTMLProgressElement", - "HTMLPropertiesCollection", - "HTMLQuoteElement", - "HTMLScriptElement", - "HTMLSelectElement", - "HTMLShadowElement", - "HTMLSourceElement", - "HTMLSpanElement", - "HTMLStyleElement", - "HTMLTableCaptionElement", - "HTMLTableCellElement", - "HTMLTableColElement", - "HTMLTableElement", - "HTMLTableRowElement", - "HTMLTableSectionElement", - "HTMLTemplateElement", - "HTMLTextAreaElement", - "HTMLTimeElement", - "HTMLTitleElement", - "HTMLTrackElement", - "HTMLUListElement", - "HTMLUnknownElement", - "HTMLVideoElement", - "HashChangeEvent", - "Headers", - "History", - "ICE_CHECKING", - "ICE_CLOSED", - "ICE_COMPLETED", - "ICE_CONNECTED", - "ICE_FAILED", - "ICE_GATHERING", - "ICE_WAITING", - "IDBCursor", - "IDBCursorWithValue", - "IDBDatabase", - "IDBDatabaseException", - "IDBFactory", - "IDBFileHandle", - "IDBFileRequest", - "IDBIndex", - "IDBKeyRange", - "IDBMutableFile", - "IDBObjectStore", - "IDBOpenDBRequest", - "IDBRequest", - "IDBTransaction", - "IDBVersionChangeEvent", - "IDLE", - "IMPLEMENTATION_COLOR_READ_FORMAT", - "IMPLEMENTATION_COLOR_READ_TYPE", - "IMPORT_RULE", - "INCR", - "INCR_WRAP", - "INDEX_SIZE_ERR", - "INT", - "INT_VEC2", - "INT_VEC3", - "INT_VEC4", - "INUSE_ATTRIBUTE_ERR", - "INVALID_ACCESS_ERR", - "INVALID_CHARACTER_ERR", - "INVALID_ENUM", - "INVALID_EXPRESSION_ERR", - "INVALID_FRAMEBUFFER_OPERATION", - "INVALID_MODIFICATION_ERR", - "INVALID_NODE_TYPE_ERR", - "INVALID_OPERATION", - "INVALID_STATE_ERR", - "INVALID_VALUE", - "INVERSE_DISTANCE", - "INVERT", - "IceCandidate", - "Image", - "ImageBitmap", - "ImageData", - "Infinity", - "InputEvent", - "InputMethodContext", - "InstallTrigger", - "Int16Array", - "Int32Array", - "Int8Array", - "Intent", - "InternalError", - "Intl", - "IsSearchProviderInstalled", - "Iterator", - "JSON", - "KEEP", - "KEYDOWN", - "KEYFRAMES_RULE", - "KEYFRAME_RULE", - "KEYPRESS", - "KEYUP", - "KeyEvent", - "KeyboardEvent", - "LENGTHADJUST_SPACING", - "LENGTHADJUST_SPACINGANDGLYPHS", - "LENGTHADJUST_UNKNOWN", - "LEQUAL", - "LESS", - "LINEAR", - "LINEAR_DISTANCE", - "LINEAR_MIPMAP_LINEAR", - "LINEAR_MIPMAP_NEAREST", - "LINES", - "LINE_LOOP", - "LINE_STRIP", - "LINE_WIDTH", - "LINK_STATUS", - "LIVE", - "LN10", - "LN2", - "LOADED", - "LOADING", - "LOG10E", - "LOG2E", - "LOWPASS", - "LOWSHELF", - "LOW_FLOAT", - "LOW_INT", - "LSException", - "LSParserFilter", - "LUMINANCE", - "LUMINANCE_ALPHA", - "LocalMediaStream", - "Location", - "MAX_COMBINED_TEXTURE_IMAGE_UNITS", - "MAX_CUBE_MAP_TEXTURE_SIZE", - "MAX_FRAGMENT_UNIFORM_VECTORS", - "MAX_RENDERBUFFER_SIZE", - "MAX_SAFE_INTEGER", - "MAX_TEXTURE_IMAGE_UNITS", - "MAX_TEXTURE_MAX_ANISOTROPY_EXT", - "MAX_TEXTURE_SIZE", - "MAX_VALUE", - "MAX_VARYING_VECTORS", - "MAX_VERTEX_ATTRIBS", - "MAX_VERTEX_TEXTURE_IMAGE_UNITS", - "MAX_VERTEX_UNIFORM_VECTORS", - "MAX_VIEWPORT_DIMS", - "MEDIA_ERR_ABORTED", - "MEDIA_ERR_DECODE", - "MEDIA_ERR_ENCRYPTED", - "MEDIA_ERR_NETWORK", - "MEDIA_ERR_SRC_NOT_SUPPORTED", - "MEDIA_KEYERR_CLIENT", - "MEDIA_KEYERR_DOMAIN", - "MEDIA_KEYERR_HARDWARECHANGE", - "MEDIA_KEYERR_OUTPUT", - "MEDIA_KEYERR_SERVICE", - "MEDIA_KEYERR_UNKNOWN", - "MEDIA_RULE", - "MEDIUM_FLOAT", - "MEDIUM_INT", - "META_MASK", - "MIN_SAFE_INTEGER", - "MIN_VALUE", - "MIRRORED_REPEAT", - "MODE_ASYNCHRONOUS", - "MODE_SYNCHRONOUS", - "MODIFICATION", - "MOUSEDOWN", - "MOUSEDRAG", - "MOUSEMOVE", - "MOUSEOUT", - "MOUSEOVER", - "MOUSEUP", - "MOZ_KEYFRAMES_RULE", - "MOZ_KEYFRAME_RULE", - "MOZ_SOURCE_CURSOR", - "MOZ_SOURCE_ERASER", - "MOZ_SOURCE_KEYBOARD", - "MOZ_SOURCE_MOUSE", - "MOZ_SOURCE_PEN", - "MOZ_SOURCE_TOUCH", - "MOZ_SOURCE_UNKNOWN", - "MSGESTURE_FLAG_BEGIN", - "MSGESTURE_FLAG_CANCEL", - "MSGESTURE_FLAG_END", - "MSGESTURE_FLAG_INERTIA", - "MSGESTURE_FLAG_NONE", - "MSPOINTER_TYPE_MOUSE", - "MSPOINTER_TYPE_PEN", - "MSPOINTER_TYPE_TOUCH", - "MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE", - "MS_ASYNC_CALLBACK_STATUS_CANCEL", - "MS_ASYNC_CALLBACK_STATUS_CHOOSEANY", - "MS_ASYNC_CALLBACK_STATUS_ERROR", - "MS_ASYNC_CALLBACK_STATUS_JOIN", - "MS_ASYNC_OP_STATUS_CANCELED", - "MS_ASYNC_OP_STATUS_ERROR", - "MS_ASYNC_OP_STATUS_SUCCESS", - "MS_MANIPULATION_STATE_ACTIVE", - "MS_MANIPULATION_STATE_CANCELLED", - "MS_MANIPULATION_STATE_COMMITTED", - "MS_MANIPULATION_STATE_DRAGGING", - "MS_MANIPULATION_STATE_INERTIA", - "MS_MANIPULATION_STATE_PRESELECT", - "MS_MANIPULATION_STATE_SELECTING", - "MS_MANIPULATION_STATE_STOPPED", - "MS_MEDIA_ERR_ENCRYPTED", - "MS_MEDIA_KEYERR_CLIENT", - "MS_MEDIA_KEYERR_DOMAIN", - "MS_MEDIA_KEYERR_HARDWARECHANGE", - "MS_MEDIA_KEYERR_OUTPUT", - "MS_MEDIA_KEYERR_SERVICE", - "MS_MEDIA_KEYERR_UNKNOWN", - "Map", - "Math", - "MediaController", - "MediaDevices", - "MediaElementAudioSourceNode", - "MediaEncryptedEvent", - "MediaError", - "MediaKeyError", - "MediaKeyEvent", - "MediaKeyMessageEvent", - "MediaKeyNeededEvent", - "MediaKeySession", - "MediaKeyStatusMap", - "MediaKeySystemAccess", - "MediaKeys", - "MediaList", - "MediaQueryList", - "MediaQueryListEvent", - "MediaRecorder", - "MediaSource", - "MediaStream", - "MediaStreamAudioDestinationNode", - "MediaStreamAudioSourceNode", - "MediaStreamEvent", - "MediaStreamTrack", - "MediaStreamTrackEvent", - "MessageChannel", - "MessageEvent", - "MessagePort", - "Methods", - "MimeType", - "MimeTypeArray", - "MouseEvent", - "MouseScrollEvent", - "MozAnimation", - "MozAnimationDelay", - "MozAnimationDirection", - "MozAnimationDuration", - "MozAnimationFillMode", - "MozAnimationIterationCount", - "MozAnimationName", - "MozAnimationPlayState", - "MozAnimationTimingFunction", - "MozAppearance", - "MozBackfaceVisibility", - "MozBinding", - "MozBorderBottomColors", - "MozBorderEnd", - "MozBorderEndColor", - "MozBorderEndStyle", - "MozBorderEndWidth", - "MozBorderImage", - "MozBorderLeftColors", - "MozBorderRightColors", - "MozBorderStart", - "MozBorderStartColor", - "MozBorderStartStyle", - "MozBorderStartWidth", - "MozBorderTopColors", - "MozBoxAlign", - "MozBoxDirection", - "MozBoxFlex", - "MozBoxOrdinalGroup", - "MozBoxOrient", - "MozBoxPack", - "MozBoxSizing", - "MozCSSKeyframeRule", - "MozCSSKeyframesRule", - "MozColumnCount", - "MozColumnFill", - "MozColumnGap", - "MozColumnRule", - "MozColumnRuleColor", - "MozColumnRuleStyle", - "MozColumnRuleWidth", - "MozColumnWidth", - "MozColumns", - "MozContactChangeEvent", - "MozFloatEdge", - "MozFontFeatureSettings", - "MozFontLanguageOverride", - "MozForceBrokenImageIcon", - "MozHyphens", - "MozImageRegion", - "MozMarginEnd", - "MozMarginStart", - "MozMmsEvent", - "MozMmsMessage", - "MozMobileMessageThread", - "MozOSXFontSmoothing", - "MozOrient", - "MozOutlineRadius", - "MozOutlineRadiusBottomleft", - "MozOutlineRadiusBottomright", - "MozOutlineRadiusTopleft", - "MozOutlineRadiusTopright", - "MozPaddingEnd", - "MozPaddingStart", - "MozPerspective", - "MozPerspectiveOrigin", - "MozPowerManager", - "MozSettingsEvent", - "MozSmsEvent", - "MozSmsMessage", - "MozStackSizing", - "MozTabSize", - "MozTextAlignLast", - "MozTextDecorationColor", - "MozTextDecorationLine", - "MozTextDecorationStyle", - "MozTextSizeAdjust", - "MozTransform", - "MozTransformOrigin", - "MozTransformStyle", - "MozTransition", - "MozTransitionDelay", - "MozTransitionDuration", - "MozTransitionProperty", - "MozTransitionTimingFunction", - "MozUserFocus", - "MozUserInput", - "MozUserModify", - "MozUserSelect", - "MozWindowDragging", - "MozWindowShadow", - "MutationEvent", - "MutationObserver", - "MutationRecord", - "NAMESPACE_ERR", - "NAMESPACE_RULE", - "NEAREST", - "NEAREST_MIPMAP_LINEAR", - "NEAREST_MIPMAP_NEAREST", - "NEGATIVE_INFINITY", - "NETWORK_EMPTY", - "NETWORK_ERR", - "NETWORK_IDLE", - "NETWORK_LOADED", - "NETWORK_LOADING", - "NETWORK_NO_SOURCE", - "NEVER", - "NEW", - "NEXT", - "NEXT_NO_DUPLICATE", - "NICEST", - "NODE_AFTER", - "NODE_BEFORE", - "NODE_BEFORE_AND_AFTER", - "NODE_INSIDE", - "NONE", - "NON_TRANSIENT_ERR", - "NOTATION_NODE", - "NOTCH", - "NOTEQUAL", - "NOT_ALLOWED_ERR", - "NOT_FOUND_ERR", - "NOT_READABLE_ERR", - "NOT_SUPPORTED_ERR", - "NO_DATA_ALLOWED_ERR", - "NO_ERR", - "NO_ERROR", - "NO_MODIFICATION_ALLOWED_ERR", - "NUMBER_TYPE", - "NUM_COMPRESSED_TEXTURE_FORMATS", - "NaN", - "NamedNodeMap", - "Navigator", - "NearbyLinks", - "NetworkInformation", - "Node", - "NodeFilter", - "NodeIterator", - "NodeList", - "Notation", - "Notification", - "NotifyPaintEvent", - "Number", - "NumberFormat", - "OBSOLETE", - "ONE", - "ONE_MINUS_CONSTANT_ALPHA", - "ONE_MINUS_CONSTANT_COLOR", - "ONE_MINUS_DST_ALPHA", - "ONE_MINUS_DST_COLOR", - "ONE_MINUS_SRC_ALPHA", - "ONE_MINUS_SRC_COLOR", - "OPEN", - "OPENED", - "OPENING", - "ORDERED_NODE_ITERATOR_TYPE", - "ORDERED_NODE_SNAPSHOT_TYPE", - "OUT_OF_MEMORY", - "Object", - "OfflineAudioCompletionEvent", - "OfflineAudioContext", - "OfflineResourceList", - "Option", - "OscillatorNode", - "OverflowEvent", - "PACK_ALIGNMENT", - "PAGE_RULE", - "PARSE_ERR", - "PATHSEG_ARC_ABS", - "PATHSEG_ARC_REL", - "PATHSEG_CLOSEPATH", - "PATHSEG_CURVETO_CUBIC_ABS", - "PATHSEG_CURVETO_CUBIC_REL", - "PATHSEG_CURVETO_CUBIC_SMOOTH_ABS", - "PATHSEG_CURVETO_CUBIC_SMOOTH_REL", - "PATHSEG_CURVETO_QUADRATIC_ABS", - "PATHSEG_CURVETO_QUADRATIC_REL", - "PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS", - "PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL", - "PATHSEG_LINETO_ABS", - "PATHSEG_LINETO_HORIZONTAL_ABS", - "PATHSEG_LINETO_HORIZONTAL_REL", - "PATHSEG_LINETO_REL", - "PATHSEG_LINETO_VERTICAL_ABS", - "PATHSEG_LINETO_VERTICAL_REL", - "PATHSEG_MOVETO_ABS", - "PATHSEG_MOVETO_REL", - "PATHSEG_UNKNOWN", - "PATH_EXISTS_ERR", - "PEAKING", - "PERMISSION_DENIED", - "PERSISTENT", - "PI", - "PLAYING_STATE", - "POINTS", - "POLYGON_OFFSET_FACTOR", - "POLYGON_OFFSET_FILL", - "POLYGON_OFFSET_UNITS", - "POSITION_UNAVAILABLE", - "POSITIVE_INFINITY", - "PREV", - "PREV_NO_DUPLICATE", - "PROCESSING_INSTRUCTION_NODE", - "PageChangeEvent", - "PageTransitionEvent", - "PaintRequest", - "PaintRequestList", - "PannerNode", - "Path2D", - "Performance", - "PerformanceEntry", - "PerformanceMark", - "PerformanceMeasure", - "PerformanceNavigation", - "PerformanceResourceTiming", - "PerformanceTiming", - "PeriodicWave", - "Plugin", - "PluginArray", - "PopStateEvent", - "PopupBlockedEvent", - "ProcessingInstruction", - "ProgressEvent", - "Promise", - "PropertyNodeList", - "Proxy", - "PushManager", - "PushSubscription", - "Q", - "QUOTA_ERR", - "QUOTA_EXCEEDED_ERR", - "QueryInterface", - "READ_ONLY", - "READ_ONLY_ERR", - "READ_WRITE", - "RED_BITS", - "REMOVAL", - "RENDERBUFFER", - "RENDERBUFFER_ALPHA_SIZE", - "RENDERBUFFER_BINDING", - "RENDERBUFFER_BLUE_SIZE", - "RENDERBUFFER_DEPTH_SIZE", - "RENDERBUFFER_GREEN_SIZE", - "RENDERBUFFER_HEIGHT", - "RENDERBUFFER_INTERNAL_FORMAT", - "RENDERBUFFER_RED_SIZE", - "RENDERBUFFER_STENCIL_SIZE", - "RENDERBUFFER_WIDTH", - "RENDERER", - "RENDERING_INTENT_ABSOLUTE_COLORIMETRIC", - "RENDERING_INTENT_AUTO", - "RENDERING_INTENT_PERCEPTUAL", - "RENDERING_INTENT_RELATIVE_COLORIMETRIC", - "RENDERING_INTENT_SATURATION", - "RENDERING_INTENT_UNKNOWN", - "REPEAT", - "REPLACE", - "RGB", - "RGB565", - "RGB5_A1", - "RGBA", - "RGBA4", - "RGBColor", - "ROTATION_CLOCKWISE", - "ROTATION_COUNTERCLOCKWISE", - "RTCDataChannelEvent", - "RTCIceCandidate", - "RTCPeerConnectionIceEvent", - "RTCRtpReceiver", - "RTCRtpSender", - "RTCSessionDescription", - "RTCStatsReport", - "RadioNodeList", - "Range", - "RangeError", - "RangeException", - "RecordErrorEvent", - "Rect", - "ReferenceError", - "RegExp", - "Request", - "Response", - "SAMPLER_2D", - "SAMPLER_CUBE", - "SAMPLES", - "SAMPLE_ALPHA_TO_COVERAGE", - "SAMPLE_BUFFERS", - "SAMPLE_COVERAGE", - "SAMPLE_COVERAGE_INVERT", - "SAMPLE_COVERAGE_VALUE", - "SAWTOOTH", - "SCHEDULED_STATE", - "SCISSOR_BOX", - "SCISSOR_TEST", - "SCROLL_PAGE_DOWN", - "SCROLL_PAGE_UP", - "SDP_ANSWER", - "SDP_OFFER", - "SDP_PRANSWER", - "SECURITY_ERR", - "SELECT", - "SERIALIZE_ERR", - "SEVERITY_ERROR", - "SEVERITY_FATAL_ERROR", - "SEVERITY_WARNING", - "SHADER_COMPILER", - "SHADER_TYPE", - "SHADING_LANGUAGE_VERSION", - "SHIFT_MASK", - "SHORT", - "SHOWING", - "SHOW_ALL", - "SHOW_ATTRIBUTE", - "SHOW_CDATA_SECTION", - "SHOW_COMMENT", - "SHOW_DOCUMENT", - "SHOW_DOCUMENT_FRAGMENT", - "SHOW_DOCUMENT_TYPE", - "SHOW_ELEMENT", - "SHOW_ENTITY", - "SHOW_ENTITY_REFERENCE", - "SHOW_NOTATION", - "SHOW_PROCESSING_INSTRUCTION", - "SHOW_TEXT", - "SINE", - "SOUNDFIELD", - "SQLException", - "SQRT1_2", - "SQRT2", - "SQUARE", - "SRC_ALPHA", - "SRC_ALPHA_SATURATE", - "SRC_COLOR", - "START_TO_END", - "START_TO_START", - "STATIC_DRAW", - "STENCIL_ATTACHMENT", - "STENCIL_BACK_FAIL", - "STENCIL_BACK_FUNC", - "STENCIL_BACK_PASS_DEPTH_FAIL", - "STENCIL_BACK_PASS_DEPTH_PASS", - "STENCIL_BACK_REF", - "STENCIL_BACK_VALUE_MASK", - "STENCIL_BACK_WRITEMASK", - "STENCIL_BITS", - "STENCIL_BUFFER_BIT", - "STENCIL_CLEAR_VALUE", - "STENCIL_FAIL", - "STENCIL_FUNC", - "STENCIL_INDEX", - "STENCIL_INDEX8", - "STENCIL_PASS_DEPTH_FAIL", - "STENCIL_PASS_DEPTH_PASS", - "STENCIL_REF", - "STENCIL_TEST", - "STENCIL_VALUE_MASK", - "STENCIL_WRITEMASK", - "STREAM_DRAW", - "STRING_TYPE", - "STYLE_RULE", - "SUBPIXEL_BITS", - "SUPPORTS_RULE", - "SVGAElement", - "SVGAltGlyphDefElement", - "SVGAltGlyphElement", - "SVGAltGlyphItemElement", - "SVGAngle", - "SVGAnimateColorElement", - "SVGAnimateElement", - "SVGAnimateMotionElement", - "SVGAnimateTransformElement", - "SVGAnimatedAngle", - "SVGAnimatedBoolean", - "SVGAnimatedEnumeration", - "SVGAnimatedInteger", - "SVGAnimatedLength", - "SVGAnimatedLengthList", - "SVGAnimatedNumber", - "SVGAnimatedNumberList", - "SVGAnimatedPreserveAspectRatio", - "SVGAnimatedRect", - "SVGAnimatedString", - "SVGAnimatedTransformList", - "SVGAnimationElement", - "SVGCircleElement", - "SVGClipPathElement", - "SVGColor", - "SVGComponentTransferFunctionElement", - "SVGCursorElement", - "SVGDefsElement", - "SVGDescElement", - "SVGDiscardElement", - "SVGDocument", - "SVGElement", - "SVGElementInstance", - "SVGElementInstanceList", - "SVGEllipseElement", - "SVGException", - "SVGFEBlendElement", - "SVGFEColorMatrixElement", - "SVGFEComponentTransferElement", - "SVGFECompositeElement", - "SVGFEConvolveMatrixElement", - "SVGFEDiffuseLightingElement", - "SVGFEDisplacementMapElement", - "SVGFEDistantLightElement", - "SVGFEDropShadowElement", - "SVGFEFloodElement", - "SVGFEFuncAElement", - "SVGFEFuncBElement", - "SVGFEFuncGElement", - "SVGFEFuncRElement", - "SVGFEGaussianBlurElement", - "SVGFEImageElement", - "SVGFEMergeElement", - "SVGFEMergeNodeElement", - "SVGFEMorphologyElement", - "SVGFEOffsetElement", - "SVGFEPointLightElement", - "SVGFESpecularLightingElement", - "SVGFESpotLightElement", - "SVGFETileElement", - "SVGFETurbulenceElement", - "SVGFilterElement", - "SVGFontElement", - "SVGFontFaceElement", - "SVGFontFaceFormatElement", - "SVGFontFaceNameElement", - "SVGFontFaceSrcElement", - "SVGFontFaceUriElement", - "SVGForeignObjectElement", - "SVGGElement", - "SVGGeometryElement", - "SVGGlyphElement", - "SVGGlyphRefElement", - "SVGGradientElement", - "SVGGraphicsElement", - "SVGHKernElement", - "SVGImageElement", - "SVGLength", - "SVGLengthList", - "SVGLineElement", - "SVGLinearGradientElement", - "SVGMPathElement", - "SVGMarkerElement", - "SVGMaskElement", - "SVGMatrix", - "SVGMetadataElement", - "SVGMissingGlyphElement", - "SVGNumber", - "SVGNumberList", - "SVGPaint", - "SVGPathElement", - "SVGPathSeg", - "SVGPathSegArcAbs", - "SVGPathSegArcRel", - "SVGPathSegClosePath", - "SVGPathSegCurvetoCubicAbs", - "SVGPathSegCurvetoCubicRel", - "SVGPathSegCurvetoCubicSmoothAbs", - "SVGPathSegCurvetoCubicSmoothRel", - "SVGPathSegCurvetoQuadraticAbs", - "SVGPathSegCurvetoQuadraticRel", - "SVGPathSegCurvetoQuadraticSmoothAbs", - "SVGPathSegCurvetoQuadraticSmoothRel", - "SVGPathSegLinetoAbs", - "SVGPathSegLinetoHorizontalAbs", - "SVGPathSegLinetoHorizontalRel", - "SVGPathSegLinetoRel", - "SVGPathSegLinetoVerticalAbs", - "SVGPathSegLinetoVerticalRel", - "SVGPathSegList", - "SVGPathSegMovetoAbs", - "SVGPathSegMovetoRel", - "SVGPatternElement", - "SVGPoint", - "SVGPointList", - "SVGPolygonElement", - "SVGPolylineElement", - "SVGPreserveAspectRatio", - "SVGRadialGradientElement", - "SVGRect", - "SVGRectElement", - "SVGRenderingIntent", - "SVGSVGElement", - "SVGScriptElement", - "SVGSetElement", - "SVGStopElement", - "SVGStringList", - "SVGStyleElement", - "SVGSwitchElement", - "SVGSymbolElement", - "SVGTRefElement", - "SVGTSpanElement", - "SVGTextContentElement", - "SVGTextElement", - "SVGTextPathElement", - "SVGTextPositioningElement", - "SVGTitleElement", - "SVGTransform", - "SVGTransformList", - "SVGUnitTypes", - "SVGUseElement", - "SVGVKernElement", - "SVGViewElement", - "SVGViewSpec", - "SVGZoomAndPan", - "SVGZoomEvent", - "SVG_ANGLETYPE_DEG", - "SVG_ANGLETYPE_GRAD", - "SVG_ANGLETYPE_RAD", - "SVG_ANGLETYPE_UNKNOWN", - "SVG_ANGLETYPE_UNSPECIFIED", - "SVG_CHANNEL_A", - "SVG_CHANNEL_B", - "SVG_CHANNEL_G", - "SVG_CHANNEL_R", - "SVG_CHANNEL_UNKNOWN", - "SVG_COLORTYPE_CURRENTCOLOR", - "SVG_COLORTYPE_RGBCOLOR", - "SVG_COLORTYPE_RGBCOLOR_ICCCOLOR", - "SVG_COLORTYPE_UNKNOWN", - "SVG_EDGEMODE_DUPLICATE", - "SVG_EDGEMODE_NONE", - "SVG_EDGEMODE_UNKNOWN", - "SVG_EDGEMODE_WRAP", - "SVG_FEBLEND_MODE_COLOR", - "SVG_FEBLEND_MODE_COLOR_BURN", - "SVG_FEBLEND_MODE_COLOR_DODGE", - "SVG_FEBLEND_MODE_DARKEN", - "SVG_FEBLEND_MODE_DIFFERENCE", - "SVG_FEBLEND_MODE_EXCLUSION", - "SVG_FEBLEND_MODE_HARD_LIGHT", - "SVG_FEBLEND_MODE_HUE", - "SVG_FEBLEND_MODE_LIGHTEN", - "SVG_FEBLEND_MODE_LUMINOSITY", - "SVG_FEBLEND_MODE_MULTIPLY", - "SVG_FEBLEND_MODE_NORMAL", - "SVG_FEBLEND_MODE_OVERLAY", - "SVG_FEBLEND_MODE_SATURATION", - "SVG_FEBLEND_MODE_SCREEN", - "SVG_FEBLEND_MODE_SOFT_LIGHT", - "SVG_FEBLEND_MODE_UNKNOWN", - "SVG_FECOLORMATRIX_TYPE_HUEROTATE", - "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA", - "SVG_FECOLORMATRIX_TYPE_MATRIX", - "SVG_FECOLORMATRIX_TYPE_SATURATE", - "SVG_FECOLORMATRIX_TYPE_UNKNOWN", - "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE", - "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA", - "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY", - "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR", - "SVG_FECOMPONENTTRANSFER_TYPE_TABLE", - "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN", - "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC", - "SVG_FECOMPOSITE_OPERATOR_ATOP", - "SVG_FECOMPOSITE_OPERATOR_IN", - "SVG_FECOMPOSITE_OPERATOR_OUT", - "SVG_FECOMPOSITE_OPERATOR_OVER", - "SVG_FECOMPOSITE_OPERATOR_UNKNOWN", - "SVG_FECOMPOSITE_OPERATOR_XOR", - "SVG_INVALID_VALUE_ERR", - "SVG_LENGTHTYPE_CM", - "SVG_LENGTHTYPE_EMS", - "SVG_LENGTHTYPE_EXS", - "SVG_LENGTHTYPE_IN", - "SVG_LENGTHTYPE_MM", - "SVG_LENGTHTYPE_NUMBER", - "SVG_LENGTHTYPE_PC", - "SVG_LENGTHTYPE_PERCENTAGE", - "SVG_LENGTHTYPE_PT", - "SVG_LENGTHTYPE_PX", - "SVG_LENGTHTYPE_UNKNOWN", - "SVG_MARKERUNITS_STROKEWIDTH", - "SVG_MARKERUNITS_UNKNOWN", - "SVG_MARKERUNITS_USERSPACEONUSE", - "SVG_MARKER_ORIENT_ANGLE", - "SVG_MARKER_ORIENT_AUTO", - "SVG_MARKER_ORIENT_UNKNOWN", - "SVG_MASKTYPE_ALPHA", - "SVG_MASKTYPE_LUMINANCE", - "SVG_MATRIX_NOT_INVERTABLE", - "SVG_MEETORSLICE_MEET", - "SVG_MEETORSLICE_SLICE", - "SVG_MEETORSLICE_UNKNOWN", - "SVG_MORPHOLOGY_OPERATOR_DILATE", - "SVG_MORPHOLOGY_OPERATOR_ERODE", - "SVG_MORPHOLOGY_OPERATOR_UNKNOWN", - "SVG_PAINTTYPE_CURRENTCOLOR", - "SVG_PAINTTYPE_NONE", - "SVG_PAINTTYPE_RGBCOLOR", - "SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR", - "SVG_PAINTTYPE_UNKNOWN", - "SVG_PAINTTYPE_URI", - "SVG_PAINTTYPE_URI_CURRENTCOLOR", - "SVG_PAINTTYPE_URI_NONE", - "SVG_PAINTTYPE_URI_RGBCOLOR", - "SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR", - "SVG_PRESERVEASPECTRATIO_NONE", - "SVG_PRESERVEASPECTRATIO_UNKNOWN", - "SVG_PRESERVEASPECTRATIO_XMAXYMAX", - "SVG_PRESERVEASPECTRATIO_XMAXYMID", - "SVG_PRESERVEASPECTRATIO_XMAXYMIN", - "SVG_PRESERVEASPECTRATIO_XMIDYMAX", - "SVG_PRESERVEASPECTRATIO_XMIDYMID", - "SVG_PRESERVEASPECTRATIO_XMIDYMIN", - "SVG_PRESERVEASPECTRATIO_XMINYMAX", - "SVG_PRESERVEASPECTRATIO_XMINYMID", - "SVG_PRESERVEASPECTRATIO_XMINYMIN", - "SVG_SPREADMETHOD_PAD", - "SVG_SPREADMETHOD_REFLECT", - "SVG_SPREADMETHOD_REPEAT", - "SVG_SPREADMETHOD_UNKNOWN", - "SVG_STITCHTYPE_NOSTITCH", - "SVG_STITCHTYPE_STITCH", - "SVG_STITCHTYPE_UNKNOWN", - "SVG_TRANSFORM_MATRIX", - "SVG_TRANSFORM_ROTATE", - "SVG_TRANSFORM_SCALE", - "SVG_TRANSFORM_SKEWX", - "SVG_TRANSFORM_SKEWY", - "SVG_TRANSFORM_TRANSLATE", - "SVG_TRANSFORM_UNKNOWN", - "SVG_TURBULENCE_TYPE_FRACTALNOISE", - "SVG_TURBULENCE_TYPE_TURBULENCE", - "SVG_TURBULENCE_TYPE_UNKNOWN", - "SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", - "SVG_UNIT_TYPE_UNKNOWN", - "SVG_UNIT_TYPE_USERSPACEONUSE", - "SVG_WRONG_TYPE_ERR", - "SVG_ZOOMANDPAN_DISABLE", - "SVG_ZOOMANDPAN_MAGNIFY", - "SVG_ZOOMANDPAN_UNKNOWN", - "SYNTAX_ERR", - "SavedPages", - "Screen", - "ScreenOrientation", - "Script", - "ScriptProcessorNode", - "ScrollAreaEvent", - "SecurityPolicyViolationEvent", - "Selection", - "ServiceWorker", - "ServiceWorkerContainer", - "ServiceWorkerRegistration", - "SessionDescription", - "Set", - "ShadowRoot", - "SharedWorker", - "SimpleGestureEvent", - "SpeechSynthesisEvent", - "SpeechSynthesisUtterance", - "StopIteration", - "Storage", - "StorageEvent", - "String", - "StyleSheet", - "StyleSheetList", - "SubtleCrypto", - "Symbol", - "SyntaxError", - "TEMPORARY", - "TEXTPATH_METHODTYPE_ALIGN", - "TEXTPATH_METHODTYPE_STRETCH", - "TEXTPATH_METHODTYPE_UNKNOWN", - "TEXTPATH_SPACINGTYPE_AUTO", - "TEXTPATH_SPACINGTYPE_EXACT", - "TEXTPATH_SPACINGTYPE_UNKNOWN", - "TEXTURE", - "TEXTURE0", - "TEXTURE1", - "TEXTURE10", - "TEXTURE11", - "TEXTURE12", - "TEXTURE13", - "TEXTURE14", - "TEXTURE15", - "TEXTURE16", - "TEXTURE17", - "TEXTURE18", - "TEXTURE19", - "TEXTURE2", - "TEXTURE20", - "TEXTURE21", - "TEXTURE22", - "TEXTURE23", - "TEXTURE24", - "TEXTURE25", - "TEXTURE26", - "TEXTURE27", - "TEXTURE28", - "TEXTURE29", - "TEXTURE3", - "TEXTURE30", - "TEXTURE31", - "TEXTURE4", - "TEXTURE5", - "TEXTURE6", - "TEXTURE7", - "TEXTURE8", - "TEXTURE9", - "TEXTURE_2D", - "TEXTURE_BINDING_2D", - "TEXTURE_BINDING_CUBE_MAP", - "TEXTURE_CUBE_MAP", - "TEXTURE_CUBE_MAP_NEGATIVE_X", - "TEXTURE_CUBE_MAP_NEGATIVE_Y", - "TEXTURE_CUBE_MAP_NEGATIVE_Z", - "TEXTURE_CUBE_MAP_POSITIVE_X", - "TEXTURE_CUBE_MAP_POSITIVE_Y", - "TEXTURE_CUBE_MAP_POSITIVE_Z", - "TEXTURE_MAG_FILTER", - "TEXTURE_MAX_ANISOTROPY_EXT", - "TEXTURE_MIN_FILTER", - "TEXTURE_WRAP_S", - "TEXTURE_WRAP_T", - "TEXT_NODE", - "TIMEOUT", - "TIMEOUT_ERR", - "TOO_LARGE_ERR", - "TRANSACTION_INACTIVE_ERR", - "TRIANGLE", - "TRIANGLES", - "TRIANGLE_FAN", - "TRIANGLE_STRIP", - "TYPE_BACK_FORWARD", - "TYPE_ERR", - "TYPE_MISMATCH_ERR", - "TYPE_NAVIGATE", - "TYPE_RELOAD", - "TYPE_RESERVED", - "Text", - "TextDecoder", - "TextEncoder", - "TextEvent", - "TextMetrics", - "TextTrack", - "TextTrackCue", - "TextTrackCueList", - "TextTrackList", - "TimeEvent", - "TimeRanges", - "Touch", - "TouchEvent", - "TouchList", - "TrackEvent", - "TransitionEvent", - "TreeWalker", - "TypeError", - "UIEvent", - "UNCACHED", - "UNKNOWN_ERR", - "UNKNOWN_RULE", - "UNMASKED_RENDERER_WEBGL", - "UNMASKED_VENDOR_WEBGL", - "UNORDERED_NODE_ITERATOR_TYPE", - "UNORDERED_NODE_SNAPSHOT_TYPE", - "UNPACK_ALIGNMENT", - "UNPACK_COLORSPACE_CONVERSION_WEBGL", - "UNPACK_FLIP_Y_WEBGL", - "UNPACK_PREMULTIPLY_ALPHA_WEBGL", - "UNSCHEDULED_STATE", - "UNSENT", - "UNSIGNED_BYTE", - "UNSIGNED_INT", - "UNSIGNED_SHORT", - "UNSIGNED_SHORT_4_4_4_4", - "UNSIGNED_SHORT_5_5_5_1", - "UNSIGNED_SHORT_5_6_5", - "UNSPECIFIED_EVENT_TYPE_ERR", - "UPDATEREADY", - "URIError", - "URL", - "URLSearchParams", - "URLUnencoded", - "URL_MISMATCH_ERR", - "UTC", - "Uint16Array", - "Uint32Array", - "Uint8Array", - "Uint8ClampedArray", - "UserMessageHandler", - "UserMessageHandlersNamespace", - "UserProximityEvent", - "VALIDATE_STATUS", - "VALIDATION_ERR", - "VARIABLES_RULE", - "VENDOR", - "VERSION", - "VERSION_CHANGE", - "VERSION_ERR", - "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", - "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", - "VERTEX_ATTRIB_ARRAY_ENABLED", - "VERTEX_ATTRIB_ARRAY_NORMALIZED", - "VERTEX_ATTRIB_ARRAY_POINTER", - "VERTEX_ATTRIB_ARRAY_SIZE", - "VERTEX_ATTRIB_ARRAY_STRIDE", - "VERTEX_ATTRIB_ARRAY_TYPE", - "VERTEX_SHADER", - "VERTICAL", - "VERTICAL_AXIS", - "VER_ERR", - "VIEWPORT", - "VIEWPORT_RULE", - "VTTCue", - "VTTRegion", - "ValidityState", - "VideoStreamTrack", - "WEBKIT_FILTER_RULE", - "WEBKIT_KEYFRAMES_RULE", - "WEBKIT_KEYFRAME_RULE", - "WEBKIT_REGION_RULE", - "WRONG_DOCUMENT_ERR", - "WaveShaperNode", - "WeakMap", - "WeakSet", - "WebGLActiveInfo", - "WebGLBuffer", - "WebGLContextEvent", - "WebGLFramebuffer", - "WebGLProgram", - "WebGLRenderbuffer", - "WebGLRenderingContext", - "WebGLShader", - "WebGLShaderPrecisionFormat", - "WebGLTexture", - "WebGLUniformLocation", - "WebGLVertexArray", - "WebKitAnimationEvent", - "WebKitBlobBuilder", - "WebKitCSSFilterRule", - "WebKitCSSFilterValue", - "WebKitCSSKeyframeRule", - "WebKitCSSKeyframesRule", - "WebKitCSSMatrix", - "WebKitCSSRegionRule", - "WebKitCSSTransformValue", - "WebKitDataCue", - "WebKitGamepad", - "WebKitMediaKeyError", - "WebKitMediaKeyMessageEvent", - "WebKitMediaKeySession", - "WebKitMediaKeys", - "WebKitMediaSource", - "WebKitMutationObserver", - "WebKitNamespace", - "WebKitPlaybackTargetAvailabilityEvent", - "WebKitPoint", - "WebKitShadowRoot", - "WebKitSourceBuffer", - "WebKitSourceBufferList", - "WebKitTransitionEvent", - "WebSocket", - "WheelEvent", - "Window", - "Worker", - "XMLDocument", - "XMLHttpRequest", - "XMLHttpRequestEventTarget", - "XMLHttpRequestException", - "XMLHttpRequestProgressEvent", - "XMLHttpRequestUpload", - "XMLSerializer", - "XMLStylesheetProcessingInstruction", - "XPathEvaluator", - "XPathException", - "XPathExpression", - "XPathNSResolver", - "XPathResult", - "XSLTProcessor", - "ZERO", - "_XD0M_", - "_YD0M_", - "__defineGetter__", - "__defineSetter__", - "__lookupGetter__", - "__lookupSetter__", - "__opera", - "__proto__", - "_browserjsran", - "a", - "aLink", - "abbr", - "abort", - "abs", - "absolute", - "acceleration", - "accelerationIncludingGravity", - "accelerator", - "accept", - "acceptCharset", - "acceptNode", - "accessKey", - "accessKeyLabel", - "accuracy", - "acos", - "acosh", - "action", - "actionURL", - "active", - "activeCues", - "activeElement", - "activeSourceBuffers", - "activeSourceCount", - "activeTexture", - "add", - "addBehavior", - "addCandidate", - "addColorStop", - "addCue", - "addElement", - "addEventListener", - "addFilter", - "addFromString", - "addFromUri", - "addIceCandidate", - "addImport", - "addListener", - "addNamed", - "addPageRule", - "addPath", - "addPointer", - "addRange", - "addRegion", - "addRule", - "addSearchEngine", - "addSourceBuffer", - "addStream", - "addTextTrack", - "addTrack", - "addWakeLockListener", - "addedNodes", - "additionalName", - "additiveSymbols", - "addons", - "adoptNode", - "adr", - "advance", - "alert", - "algorithm", - "align", - "align-content", - "align-items", - "align-self", - "alignContent", - "alignItems", - "alignSelf", - "alignmentBaseline", - "alinkColor", - "all", - "allowFullscreen", - "allowedDirections", - "alpha", - "alt", - "altGraphKey", - "altHtml", - "altKey", - "altLeft", - "altitude", - "altitudeAccuracy", - "amplitude", - "ancestorOrigins", - "anchor", - "anchorNode", - "anchorOffset", - "anchors", - "angle", - "animVal", - "animate", - "animatedInstanceRoot", - "animatedNormalizedPathSegList", - "animatedPathSegList", - "animatedPoints", - "animation", - "animation-delay", - "animation-direction", - "animation-duration", - "animation-fill-mode", - "animation-iteration-count", - "animation-name", - "animation-play-state", - "animation-timing-function", - "animationDelay", - "animationDirection", - "animationDuration", - "animationFillMode", - "animationIterationCount", - "animationName", - "animationPlayState", - "animationStartTime", - "animationTimingFunction", - "animationsPaused", - "anniversary", - "app", - "appCodeName", - "appMinorVersion", - "appName", - "appNotifications", - "appVersion", - "append", - "appendBuffer", - "appendChild", - "appendData", - "appendItem", - "appendMedium", - "appendNamed", - "appendRule", - "appendStream", - "appendWindowEnd", - "appendWindowStart", - "applets", - "applicationCache", - "apply", - "applyElement", - "arc", - "arcTo", - "archive", - "areas", - "arguments", - "arrayBuffer", - "asin", - "asinh", - "assert", - "assign", - "async", - "atEnd", - "atan", - "atan2", - "atanh", - "atob", - "attachEvent", - "attachShader", - "attachments", - "attack", - "attrChange", - "attrName", - "attributeName", - "attributeNamespace", - "attributes", - "audioTracks", - "autoIncrement", - "autobuffer", - "autocapitalize", - "autocomplete", - "autocorrect", - "autofocus", - "autoplay", - "availHeight", - "availLeft", - "availTop", - "availWidth", - "availability", - "available", - "aversion", - "axes", - "axis", - "azimuth", - "b", - "back", - "backface-visibility", - "backfaceVisibility", - "background", - "background-attachment", - "background-blend-mode", - "background-clip", - "background-color", - "background-image", - "background-origin", - "background-position", - "background-repeat", - "background-size", - "backgroundAttachment", - "backgroundBlendMode", - "backgroundClip", - "backgroundColor", - "backgroundImage", - "backgroundOrigin", - "backgroundPosition", - "backgroundPositionX", - "backgroundPositionY", - "backgroundRepeat", - "backgroundSize", - "badInput", - "balance", - "baseFrequencyX", - "baseFrequencyY", - "baseNode", - "baseOffset", - "baseURI", - "baseVal", - "baselineShift", - "battery", - "bday", - "beginElement", - "beginElementAt", - "beginPath", - "behavior", - "behaviorCookie", - "behaviorPart", - "behaviorUrns", - "beta", - "bezierCurveTo", - "bgColor", - "bgProperties", - "bias", - "big", - "binaryType", - "bind", - "bindAttribLocation", - "bindBuffer", - "bindFramebuffer", - "bindRenderbuffer", - "bindTexture", - "blendColor", - "blendEquation", - "blendEquationSeparate", - "blendFunc", - "blendFuncSeparate", - "blink", - "blob", - "blockDirection", - "blue", - "blur", - "body", - "bodyUsed", - "bold", - "bookmarks", - "booleanValue", - "border", - "border-bottom", - "border-bottom-color", - "border-bottom-left-radius", - "border-bottom-right-radius", - "border-bottom-style", - "border-bottom-width", - "border-collapse", - "border-color", - "border-image", - "border-image-outset", - "border-image-repeat", - "border-image-slice", - "border-image-source", - "border-image-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-spacing", - "border-style", - "border-top", - "border-top-color", - "border-top-left-radius", - "border-top-right-radius", - "border-top-style", - "border-top-width", - "border-width", - "borderBottom", - "borderBottomColor", - "borderBottomLeftRadius", - "borderBottomRightRadius", - "borderBottomStyle", - "borderBottomWidth", - "borderCollapse", - "borderColor", - "borderColorDark", - "borderColorLight", - "borderImage", - "borderImageOutset", - "borderImageRepeat", - "borderImageSlice", - "borderImageSource", - "borderImageWidth", - "borderLeft", - "borderLeftColor", - "borderLeftStyle", - "borderLeftWidth", - "borderRadius", - "borderRight", - "borderRightColor", - "borderRightStyle", - "borderRightWidth", - "borderSpacing", - "borderStyle", - "borderTop", - "borderTopColor", - "borderTopLeftRadius", - "borderTopRightRadius", - "borderTopStyle", - "borderTopWidth", - "borderWidth", - "bottom", - "bottomMargin", - "bound", - "boundElements", - "boundingClientRect", - "boundingHeight", - "boundingLeft", - "boundingTop", - "boundingWidth", - "bounds", - "box-decoration-break", - "box-shadow", - "box-sizing", - "boxDecorationBreak", - "boxShadow", - "boxSizing", - "breakAfter", - "breakBefore", - "breakInside", - "browserLanguage", - "btoa", - "bubbles", - "buffer", - "bufferData", - "bufferDepth", - "bufferSize", - "bufferSubData", - "buffered", - "bufferedAmount", - "buildID", - "buildNumber", - "button", - "buttonID", - "buttons", - "byteLength", - "byteOffset", - "c", - "call", - "caller", - "canBeFormatted", - "canBeMounted", - "canBeShared", - "canHaveChildren", - "canHaveHTML", - "canPlayType", - "cancel", - "cancelAnimationFrame", - "cancelBubble", - "cancelScheduledValues", - "cancelable", - "candidate", - "canvas", - "caption", - "caption-side", - "captionSide", - "captureEvents", - "captureStackTrace", - "caretPositionFromPoint", - "caretRangeFromPoint", - "cast", - "catch", - "category", - "cbrt", - "cd", - "ceil", - "cellIndex", - "cellPadding", - "cellSpacing", - "cells", - "ch", - "chOff", - "chain", - "challenge", - "changedTouches", - "channel", - "channelCount", - "channelCountMode", - "channelInterpretation", - "char", - "charAt", - "charCode", - "charCodeAt", - "charIndex", - "characterSet", - "charging", - "chargingTime", - "charset", - "checkEnclosure", - "checkFramebufferStatus", - "checkIntersection", - "checkValidity", - "checked", - "childElementCount", - "childNodes", - "children", - "chrome", - "ciphertext", - "cite", - "classList", - "className", - "classid", - "clear", - "clearAttributes", - "clearColor", - "clearData", - "clearDepth", - "clearImmediate", - "clearInterval", - "clearMarks", - "clearMeasures", - "clearParameters", - "clearRect", - "clearResourceTimings", - "clearShadow", - "clearStencil", - "clearTimeout", - "clearWatch", - "click", - "clickCount", - "clientHeight", - "clientInformation", - "clientLeft", - "clientRect", - "clientRects", - "clientTop", - "clientWidth", - "clientX", - "clientY", - "clip", - "clip-path", - "clip-rule", - "clipBottom", - "clipLeft", - "clipPath", - "clipPathUnits", - "clipRight", - "clipRule", - "clipTop", - "clipboardData", - "clone", - "cloneContents", - "cloneNode", - "cloneRange", - "close", - "closePath", - "closed", - "closest", - "clz", - "clz32", - "cmp", - "code", - "codeBase", - "codePointAt", - "codeType", - "colSpan", - "collapse", - "collapseToEnd", - "collapseToStart", - "collapsed", - "collect", - "colno", - "color", - "color-interpolation", - "color-interpolation-filters", - "colorDepth", - "colorInterpolation", - "colorInterpolationFilters", - "colorMask", - "colorType", - "cols", - "columnCount", - "columnFill", - "columnGap", - "columnNumber", - "columnRule", - "columnRuleColor", - "columnRuleStyle", - "columnRuleWidth", - "columnSpan", - "columnWidth", - "columns", - "command", - "commitPreferences", - "commonAncestorContainer", - "compact", - "compareBoundaryPoints", - "compareDocumentPosition", - "compareEndPoints", - "compareNode", - "comparePoint", - "compatMode", - "compatible", - "compile", - "compileShader", - "complete", - "componentFromPoint", - "compositionEndOffset", - "compositionStartOffset", - "compressedTexImage2D", - "compressedTexSubImage2D", - "concat", - "conditionText", - "coneInnerAngle", - "coneOuterAngle", - "coneOuterGain", - "confirm", - "confirmComposition", - "confirmSiteSpecificTrackingException", - "confirmWebWideTrackingException", - "connect", - "connectEnd", - "connectStart", - "connected", - "connection", - "connectionSpeed", - "console", - "consolidate", - "constrictionActive", - "constructor", - "contactID", - "contains", - "containsNode", - "content", - "contentDocument", - "contentEditable", - "contentOverflow", - "contentScriptType", - "contentStyleType", - "contentType", - "contentWindow", - "context", - "contextMenu", - "contextmenu", - "continue", - "continuous", - "control", - "controller", - "controls", - "convertToSpecifiedUnits", - "cookie", - "cookieEnabled", - "coords", - "copyFromChannel", - "copyTexImage2D", - "copyTexSubImage2D", - "copyToChannel", - "copyWithin", - "correspondingElement", - "correspondingUseElement", - "cos", - "cosh", - "count", - "counter-increment", - "counter-reset", - "counterIncrement", - "counterReset", - "cpuClass", - "cpuSleepAllowed", - "create", - "createAnalyser", - "createAnswer", - "createAttribute", - "createAttributeNS", - "createBiquadFilter", - "createBuffer", - "createBufferSource", - "createCDATASection", - "createCSSStyleSheet", - "createCaption", - "createChannelMerger", - "createChannelSplitter", - "createComment", - "createContextualFragment", - "createControlRange", - "createConvolver", - "createDTMFSender", - "createDataChannel", - "createDelay", - "createDelayNode", - "createDocument", - "createDocumentFragment", - "createDocumentType", - "createDynamicsCompressor", - "createElement", - "createElementNS", - "createEntityReference", - "createEvent", - "createEventObject", - "createExpression", - "createFramebuffer", - "createFunction", - "createGain", - "createGainNode", - "createHTMLDocument", - "createImageBitmap", - "createImageData", - "createIndex", - "createJavaScriptNode", - "createLinearGradient", - "createMediaElementSource", - "createMediaKeys", - "createMediaStreamDestination", - "createMediaStreamSource", - "createMutableFile", - "createNSResolver", - "createNodeIterator", - "createNotification", - "createObjectStore", - "createObjectURL", - "createOffer", - "createOscillator", - "createPanner", - "createPattern", - "createPeriodicWave", - "createPopup", - "createProcessingInstruction", - "createProgram", - "createRadialGradient", - "createRange", - "createRangeCollection", - "createRenderbuffer", - "createSVGAngle", - "createSVGLength", - "createSVGMatrix", - "createSVGNumber", - "createSVGPathSegArcAbs", - "createSVGPathSegArcRel", - "createSVGPathSegClosePath", - "createSVGPathSegCurvetoCubicAbs", - "createSVGPathSegCurvetoCubicRel", - "createSVGPathSegCurvetoCubicSmoothAbs", - "createSVGPathSegCurvetoCubicSmoothRel", - "createSVGPathSegCurvetoQuadraticAbs", - "createSVGPathSegCurvetoQuadraticRel", - "createSVGPathSegCurvetoQuadraticSmoothAbs", - "createSVGPathSegCurvetoQuadraticSmoothRel", - "createSVGPathSegLinetoAbs", - "createSVGPathSegLinetoHorizontalAbs", - "createSVGPathSegLinetoHorizontalRel", - "createSVGPathSegLinetoRel", - "createSVGPathSegLinetoVerticalAbs", - "createSVGPathSegLinetoVerticalRel", - "createSVGPathSegMovetoAbs", - "createSVGPathSegMovetoRel", - "createSVGPoint", - "createSVGRect", - "createSVGTransform", - "createSVGTransformFromMatrix", - "createScriptProcessor", - "createSession", - "createShader", - "createShadowRoot", - "createStereoPanner", - "createStyleSheet", - "createTBody", - "createTFoot", - "createTHead", - "createTextNode", - "createTextRange", - "createTexture", - "createTouch", - "createTouchList", - "createTreeWalker", - "createWaveShaper", - "creationTime", - "crossOrigin", - "crypto", - "csi", - "cssFloat", - "cssRules", - "cssText", - "cssValueType", - "ctrlKey", - "ctrlLeft", - "cues", - "cullFace", - "currentNode", - "currentPage", - "currentScale", - "currentScript", - "currentSrc", - "currentState", - "currentStyle", - "currentTarget", - "currentTime", - "currentTranslate", - "currentView", - "cursor", - "curve", - "customError", - "cx", - "cy", - "d", - "data", - "dataFld", - "dataFormatAs", - "dataPageSize", - "dataSrc", - "dataTransfer", - "database", - "dataset", - "dateTime", - "db", - "debug", - "debuggerEnabled", - "declare", - "decode", - "decodeAudioData", - "decodeURI", - "decodeURIComponent", - "decrypt", - "default", - "defaultCharset", - "defaultChecked", - "defaultMuted", - "defaultPlaybackRate", - "defaultPrevented", - "defaultSelected", - "defaultStatus", - "defaultURL", - "defaultValue", - "defaultView", - "defaultstatus", - "defer", - "defineMagicFunction", - "defineMagicVariable", - "defineProperties", - "defineProperty", - "delayTime", - "delete", - "deleteBuffer", - "deleteCaption", - "deleteCell", - "deleteContents", - "deleteData", - "deleteDatabase", - "deleteFramebuffer", - "deleteFromDocument", - "deleteIndex", - "deleteMedium", - "deleteObjectStore", - "deleteProgram", - "deleteRenderbuffer", - "deleteRow", - "deleteRule", - "deleteShader", - "deleteTFoot", - "deleteTHead", - "deleteTexture", - "deliverChangeRecords", - "delivery", - "deliveryInfo", - "deliveryStatus", - "deliveryTimestamp", - "delta", - "deltaMode", - "deltaX", - "deltaY", - "deltaZ", - "depthFunc", - "depthMask", - "depthRange", - "deriveBits", - "deriveKey", - "description", - "deselectAll", - "designMode", - "destination", - "destinationURL", - "detach", - "detachEvent", - "detachShader", - "detail", - "detune", - "devicePixelRatio", - "deviceXDPI", - "deviceYDPI", - "diffuseConstant", - "digest", - "dimensions", - "dir", - "dirName", - "direction", - "dirxml", - "disable", - "disableVertexAttribArray", - "disabled", - "dischargingTime", - "disconnect", - "dispatchEvent", - "display", - "distanceModel", - "divisor", - "djsapi", - "djsproxy", - "doImport", - "doNotTrack", - "doScroll", - "doctype", - "document", - "documentElement", - "documentMode", - "documentURI", - "dolphin", - "dolphinGameCenter", - "dolphininfo", - "dolphinmeta", - "domComplete", - "domContentLoadedEventEnd", - "domContentLoadedEventStart", - "domInteractive", - "domLoading", - "domain", - "domainLookupEnd", - "domainLookupStart", - "dominant-baseline", - "dominantBaseline", - "done", - "dopplerFactor", - "download", - "dragDrop", - "draggable", - "drawArrays", - "drawArraysInstancedANGLE", - "drawCustomFocusRing", - "drawElements", - "drawElementsInstancedANGLE", - "drawFocusIfNeeded", - "drawImage", - "drawImageFromRect", - "drawSystemFocusRing", - "drawingBufferHeight", - "drawingBufferWidth", - "dropEffect", - "droppedVideoFrames", - "dropzone", - "dump", - "duplicate", - "duration", - "dvname", - "dvnum", - "dx", - "dy", - "dynsrc", - "e", - "edgeMode", - "effectAllowed", - "elapsedTime", - "elementFromPoint", - "elements", - "elevation", - "ellipse", - "email", - "embeds", - "empty", - "empty-cells", - "emptyCells", - "enable", - "enableBackground", - "enableStyleSheetsForSet", - "enableVertexAttribArray", - "enabled", - "enabledPlugin", - "encode", - "encodeURI", - "encodeURIComponent", - "encoding", - "encrypt", - "enctype", - "end", - "endContainer", - "endElement", - "endElementAt", - "endOfStream", - "endOffset", - "endTime", - "ended", - "endsWith", - "entities", - "entries", - "entryType", - "enumerate", - "enumerateEditable", - "error", - "errorCode", - "escape", - "eval", - "evaluate", - "event", - "eventPhase", - "every", - "exception", - "exec", - "execCommand", - "execCommandShowHelp", - "execScript", - "exitFullscreen", - "exitPointerLock", - "exp", - "expand", - "expandEntityReferences", - "expando", - "expansion", - "expiryDate", - "explicitOriginalTarget", - "expm1", - "exponent", - "exponentialRampToValueAtTime", - "exportKey", - "extend", - "extensions", - "extentNode", - "extentOffset", - "external", - "externalResourcesRequired", - "extractContents", - "extractable", - "f", - "face", - "factoryReset", - "fallback", - "familyName", - "farthestViewportElement", - "fastSeek", - "fatal", - "fetch", - "fetchStart", - "fftSize", - "fgColor", - "fileCreatedDate", - "fileHandle", - "fileModifiedDate", - "fileName", - "fileSize", - "fileUpdatedDate", - "filename", - "files", - "fill", - "fill-opacity", - "fill-rule", - "fillOpacity", - "fillRect", - "fillRule", - "fillStyle", - "fillText", - "filter", - "filterResX", - "filterResY", - "filterUnits", - "filters", - "find", - "findIndex", - "findRule", - "findText", - "finish", - "fireEvent", - "firstChild", - "firstElementChild", - "firstPage", - "fixed", - "flex", - "flex-basis", - "flex-direction", - "flex-flow", - "flex-grow", - "flex-shrink", - "flex-wrap", - "flexBasis", - "flexDirection", - "flexFlow", - "flexGrow", - "flexShrink", - "flexWrap", - "flipX", - "flipY", - "float", - "flood-color", - "flood-opacity", - "floodColor", - "floodOpacity", - "floor", - "flush", - "focus", - "focusNode", - "focusOffset", - "font", - "font-family", - "font-feature-settings", - "font-kerning", - "font-language-override", - "font-size", - "font-size-adjust", - "font-stretch", - "font-style", - "font-synthesis", - "font-variant", - "font-variant-alternates", - "font-variant-caps", - "font-variant-east-asian", - "font-variant-ligatures", - "font-variant-numeric", - "font-variant-position", - "font-weight", - "fontFamily", - "fontFeatureSettings", - "fontKerning", - "fontLanguageOverride", - "fontSize", - "fontSizeAdjust", - "fontSmoothingEnabled", - "fontStretch", - "fontStyle", - "fontSynthesis", - "fontVariant", - "fontVariantAlternates", - "fontVariantCaps", - "fontVariantEastAsian", - "fontVariantLigatures", - "fontVariantNumeric", - "fontVariantPosition", - "fontWeight", - "fontcolor", - "fonts", - "fontsize", - "for", - "forEach", - "forceRedraw", - "form", - "formAction", - "formEnctype", - "formMethod", - "formNoValidate", - "formTarget", - "format", - "forms", - "forward", - "fr", - "frame", - "frameBorder", - "frameElement", - "frameSpacing", - "framebufferRenderbuffer", - "framebufferTexture2D", - "frames", - "freeSpace", - "freeze", - "frequency", - "frequencyBinCount", - "from", - "fromCharCode", - "fromCodePoint", - "fromElement", - "frontFace", - "fround", - "fullScreen", - "fullscreenElement", - "fullscreenEnabled", - "fx", - "fy", - "gain", - "gamepad", - "gamma", - "genderIdentity", - "generateKey", - "generateMipmap", - "generateRequest", - "geolocation", - "gestureObject", - "get", - "getActiveAttrib", - "getActiveUniform", - "getAdjacentText", - "getAll", - "getAllResponseHeaders", - "getAsFile", - "getAsString", - "getAttachedShaders", - "getAttribLocation", - "getAttribute", - "getAttributeNS", - "getAttributeNode", - "getAttributeNodeNS", - "getAudioTracks", - "getBBox", - "getBattery", - "getBlob", - "getBookmark", - "getBoundingClientRect", - "getBufferParameter", - "getByteFrequencyData", - "getByteTimeDomainData", - "getCSSCanvasContext", - "getCTM", - "getCandidateWindowClientRect", - "getChannelData", - "getCharNumAtPosition", - "getClientRect", - "getClientRects", - "getCompositionAlternatives", - "getComputedStyle", - "getComputedTextLength", - "getConfiguration", - "getContext", - "getContextAttributes", - "getCounterValue", - "getCueAsHTML", - "getCueById", - "getCurrentPosition", - "getCurrentTime", - "getData", - "getDatabaseNames", - "getDate", - "getDay", - "getDefaultComputedStyle", - "getDestinationInsertionPoints", - "getDistributedNodes", - "getEditable", - "getElementById", - "getElementsByClassName", - "getElementsByName", - "getElementsByTagName", - "getElementsByTagNameNS", - "getEnclosureList", - "getEndPositionOfChar", - "getEntries", - "getEntriesByName", - "getEntriesByType", - "getError", - "getExtension", - "getExtentOfChar", - "getFeature", - "getFile", - "getFloat32", - "getFloat64", - "getFloatFrequencyData", - "getFloatTimeDomainData", - "getFloatValue", - "getFramebufferAttachmentParameter", - "getFrequencyResponse", - "getFullYear", - "getGamepads", - "getHours", - "getImageData", - "getInt16", - "getInt32", - "getInt8", - "getIntersectionList", - "getItem", - "getItems", - "getKey", - "getLineDash", - "getLocalStreams", - "getMarks", - "getMatchedCSSRules", - "getMeasures", - "getMetadata", - "getMilliseconds", - "getMinutes", - "getModifierState", - "getMonth", - "getNamedItem", - "getNamedItemNS", - "getNotifier", - "getNumberOfChars", - "getOverrideHistoryNavigationMode", - "getOverrideStyle", - "getOwnPropertyDescriptor", - "getOwnPropertyNames", - "getOwnPropertySymbols", - "getParameter", - "getPathSegAtLength", - "getPointAtLength", - "getPreference", - "getPreferenceDefault", - "getPresentationAttribute", - "getPreventDefault", - "getProgramInfoLog", - "getProgramParameter", - "getPropertyCSSValue", - "getPropertyPriority", - "getPropertyShorthand", - "getPropertyValue", - "getPrototypeOf", - "getRGBColorValue", - "getRandomValues", - "getRangeAt", - "getReceivers", - "getRectValue", - "getRegistration", - "getRemoteStreams", - "getRenderbufferParameter", - "getResponseHeader", - "getRoot", - "getRotationOfChar", - "getSVGDocument", - "getScreenCTM", - "getSeconds", - "getSelection", - "getSenders", - "getShaderInfoLog", - "getShaderParameter", - "getShaderPrecisionFormat", - "getShaderSource", - "getSimpleDuration", - "getSiteIcons", - "getSources", - "getSpeculativeParserUrls", - "getStartPositionOfChar", - "getStartTime", - "getStats", - "getStorageUpdates", - "getStreamById", - "getStringValue", - "getSubStringLength", - "getSubscription", - "getSupportedExtensions", - "getTexParameter", - "getTime", - "getTimezoneOffset", - "getTotalLength", - "getTrackById", - "getTracks", - "getTransformToElement", - "getUTCDate", - "getUTCDay", - "getUTCFullYear", - "getUTCHours", - "getUTCMilliseconds", - "getUTCMinutes", - "getUTCMonth", - "getUTCSeconds", - "getUint16", - "getUint32", - "getUint8", - "getUniform", - "getUniformLocation", - "getUserMedia", - "getValues", - "getVarDate", - "getVariableValue", - "getVertexAttrib", - "getVertexAttribOffset", - "getVideoPlaybackQuality", - "getVideoTracks", - "getWakeLockState", - "getYear", - "givenName", - "global", - "globalAlpha", - "globalCompositeOperation", - "glyphOrientationHorizontal", - "glyphOrientationVertical", - "glyphRef", - "go", - "gradientTransform", - "gradientUnits", - "grammars", - "green", - "group", - "groupCollapsed", - "groupEnd", - "hardwareConcurrency", - "has", - "hasAttribute", - "hasAttributeNS", - "hasAttributes", - "hasChildNodes", - "hasComposition", - "hasExtension", - "hasFeature", - "hasFocus", - "hasLayout", - "hasOwnProperty", - "hash", - "head", - "headers", - "heading", - "height", - "hidden", - "hide", - "hideFocus", - "high", - "hint", - "history", - "honorificPrefix", - "honorificSuffix", - "horizontalOverflow", - "host", - "hostname", - "href", - "hreflang", - "hspace", - "html5TagCheckInerface", - "htmlFor", - "htmlText", - "httpEquiv", - "hwTimestamp", - "hypot", - "iccId", - "iceConnectionState", - "iceGatheringState", - "icon", - "id", - "identifier", - "identity", - "ignoreBOM", - "ignoreCase", - "image-orientation", - "image-rendering", - "imageOrientation", - "imageRendering", - "images", - "ime-mode", - "imeMode", - "implementation", - "importKey", - "importNode", - "importStylesheet", - "imports", - "impp", - "imul", - "in1", - "in2", - "inBandMetadataTrackDispatchType", - "inRange", - "includes", - "incremental", - "indeterminate", - "index", - "indexNames", - "indexOf", - "indexedDB", - "inertiaDestinationX", - "inertiaDestinationY", - "info", - "init", - "initAnimationEvent", - "initBeforeLoadEvent", - "initClipboardEvent", - "initCloseEvent", - "initCommandEvent", - "initCompositionEvent", - "initCustomEvent", - "initData", - "initDeviceMotionEvent", - "initDeviceOrientationEvent", - "initDragEvent", - "initErrorEvent", - "initEvent", - "initFocusEvent", - "initGestureEvent", - "initHashChangeEvent", - "initKeyEvent", - "initKeyboardEvent", - "initMSManipulationEvent", - "initMessageEvent", - "initMouseEvent", - "initMouseScrollEvent", - "initMouseWheelEvent", - "initMutationEvent", - "initNSMouseEvent", - "initOverflowEvent", - "initPageEvent", - "initPageTransitionEvent", - "initPointerEvent", - "initPopStateEvent", - "initProgressEvent", - "initScrollAreaEvent", - "initSimpleGestureEvent", - "initStorageEvent", - "initTextEvent", - "initTimeEvent", - "initTouchEvent", - "initTransitionEvent", - "initUIEvent", - "initWebKitAnimationEvent", - "initWebKitTransitionEvent", - "initWebKitWheelEvent", - "initWheelEvent", - "initialTime", - "initialize", - "initiatorType", - "inner", - "innerHTML", - "innerHeight", - "innerText", - "innerWidth", - "input", - "inputBuffer", - "inputEncoding", - "inputMethod", - "insertAdjacentElement", - "insertAdjacentHTML", - "insertAdjacentText", - "insertBefore", - "insertCell", - "insertData", - "insertItemBefore", - "insertNode", - "insertRow", - "insertRule", - "instanceRoot", - "intercept", - "interimResults", - "internalSubset", - "intersectsNode", - "interval", - "invalidIteratorState", - "inverse", - "invertSelf", - "is", - "is2D", - "isAlternate", - "isArray", - "isBingCurrentSearchDefault", - "isBuffer", - "isCandidateWindowVisible", - "isChar", - "isCollapsed", - "isComposing", - "isContentEditable", - "isContentHandlerRegistered", - "isContextLost", - "isDefaultNamespace", - "isDisabled", - "isEnabled", - "isEqual", - "isEqualNode", - "isExtensible", - "isFinite", - "isFramebuffer", - "isFrozen", - "isGenerator", - "isId", - "isInjected", - "isInteger", - "isMap", - "isMultiLine", - "isNaN", - "isOpen", - "isPointInFill", - "isPointInPath", - "isPointInRange", - "isPointInStroke", - "isPrefAlternate", - "isPrimary", - "isProgram", - "isPropertyImplicit", - "isProtocolHandlerRegistered", - "isPrototypeOf", - "isRenderbuffer", - "isSafeInteger", - "isSameNode", - "isSealed", - "isShader", - "isSupported", - "isTextEdit", - "isTexture", - "isTrusted", - "isTypeSupported", - "isView", - "isolation", - "italics", - "item", - "itemId", - "itemProp", - "itemRef", - "itemScope", - "itemType", - "itemValue", - "iterateNext", - "iterator", - "javaEnabled", - "jobTitle", - "join", - "json", - "justify-content", - "justifyContent", - "k1", - "k2", - "k3", - "k4", - "kernelMatrix", - "kernelUnitLengthX", - "kernelUnitLengthY", - "kerning", - "key", - "keyCode", - "keyFor", - "keyIdentifier", - "keyLightEnabled", - "keyLocation", - "keyPath", - "keySystem", - "keyText", - "keyUsage", - "keys", - "keytype", - "kind", - "knee", - "label", - "labels", - "lang", - "language", - "languages", - "largeArcFlag", - "lastChild", - "lastElementChild", - "lastEventId", - "lastIndex", - "lastIndexOf", - "lastMatch", - "lastMessageSubject", - "lastMessageType", - "lastModified", - "lastModifiedDate", - "lastPage", - "lastParen", - "lastState", - "lastStyleSheetSet", - "latitude", - "layerX", - "layerY", - "layoutFlow", - "layoutGrid", - "layoutGridChar", - "layoutGridLine", - "layoutGridMode", - "layoutGridType", - "lbound", - "left", - "leftContext", - "leftMargin", - "length", - "lengthAdjust", - "lengthComputable", - "letter-spacing", - "letterSpacing", - "level", - "lighting-color", - "lightingColor", - "limitingConeAngle", - "line", - "line-height", - "lineAlign", - "lineBreak", - "lineCap", - "lineDashOffset", - "lineHeight", - "lineJoin", - "lineNumber", - "lineTo", - "lineWidth", - "linearRampToValueAtTime", - "lineno", - "link", - "linkColor", - "linkProgram", - "links", - "list", - "list-style", - "list-style-image", - "list-style-position", - "list-style-type", - "listStyle", - "listStyleImage", - "listStylePosition", - "listStyleType", - "listener", - "load", - "loadEventEnd", - "loadEventStart", - "loadTimes", - "loaded", - "localDescription", - "localName", - "localStorage", - "locale", - "localeCompare", - "location", - "locationbar", - "lock", - "lockedFile", - "log", - "log10", - "log1p", - "log2", - "logicalXDPI", - "logicalYDPI", - "longDesc", - "longitude", - "lookupNamespaceURI", - "lookupPrefix", - "loop", - "loopEnd", - "loopStart", - "looping", - "low", - "lower", - "lowerBound", - "lowerOpen", - "lowsrc", - "m11", - "m12", - "m13", - "m14", - "m21", - "m22", - "m23", - "m24", - "m31", - "m32", - "m33", - "m34", - "m41", - "m42", - "m43", - "m44", - "manifest", - "map", - "mapping", - "margin", - "margin-bottom", - "margin-left", - "margin-right", - "margin-top", - "marginBottom", - "marginHeight", - "marginLeft", - "marginRight", - "marginTop", - "marginWidth", - "mark", - "marker", - "marker-end", - "marker-mid", - "marker-offset", - "marker-start", - "markerEnd", - "markerHeight", - "markerMid", - "markerOffset", - "markerStart", - "markerUnits", - "markerWidth", - "marks", - "mask", - "mask-type", - "maskContentUnits", - "maskType", - "maskUnits", - "match", - "matchMedia", - "matchMedium", - "matches", - "matrix", - "matrixTransform", - "max", - "max-height", - "max-width", - "maxAlternatives", - "maxChannelCount", - "maxConnectionsPerServer", - "maxDecibels", - "maxDistance", - "maxHeight", - "maxLength", - "maxTouchPoints", - "maxValue", - "maxWidth", - "measure", - "measureText", - "media", - "mediaDevices", - "mediaElement", - "mediaGroup", - "mediaKeys", - "mediaText", - "meetOrSlice", - "memory", - "menubar", - "mergeAttributes", - "message", - "messageClass", - "messageHandlers", - "metaKey", - "method", - "mimeType", - "mimeTypes", - "min", - "min-height", - "min-width", - "minDecibels", - "minHeight", - "minValue", - "minWidth", - "miterLimit", - "mix-blend-mode", - "mixBlendMode", - "mode", - "modify", - "mount", - "move", - "moveBy", - "moveEnd", - "moveFirst", - "moveFocusDown", - "moveFocusLeft", - "moveFocusRight", - "moveFocusUp", - "moveNext", - "moveRow", - "moveStart", - "moveTo", - "moveToBookmark", - "moveToElementText", - "moveToPoint", - "mozAdd", - "mozAnimationStartTime", - "mozAnon", - "mozApps", - "mozAudioCaptured", - "mozAudioChannelType", - "mozAutoplayEnabled", - "mozCancelAnimationFrame", - "mozCancelFullScreen", - "mozCancelRequestAnimationFrame", - "mozCaptureStream", - "mozCaptureStreamUntilEnded", - "mozClearDataAt", - "mozContact", - "mozContacts", - "mozCreateFileHandle", - "mozCurrentTransform", - "mozCurrentTransformInverse", - "mozCursor", - "mozDash", - "mozDashOffset", - "mozDecodedFrames", - "mozExitPointerLock", - "mozFillRule", - "mozFragmentEnd", - "mozFrameDelay", - "mozFullScreen", - "mozFullScreenElement", - "mozFullScreenEnabled", - "mozGetAll", - "mozGetAllKeys", - "mozGetAsFile", - "mozGetDataAt", - "mozGetMetadata", - "mozGetUserMedia", - "mozHasAudio", - "mozHasItem", - "mozHidden", - "mozImageSmoothingEnabled", - "mozIndexedDB", - "mozInnerScreenX", - "mozInnerScreenY", - "mozInputSource", - "mozIsTextField", - "mozItem", - "mozItemCount", - "mozItems", - "mozLength", - "mozLockOrientation", - "mozMatchesSelector", - "mozMovementX", - "mozMovementY", - "mozOpaque", - "mozOrientation", - "mozPaintCount", - "mozPaintedFrames", - "mozParsedFrames", - "mozPay", - "mozPointerLockElement", - "mozPresentedFrames", - "mozPreservesPitch", - "mozPressure", - "mozPrintCallback", - "mozRTCIceCandidate", - "mozRTCPeerConnection", - "mozRTCSessionDescription", - "mozRemove", - "mozRequestAnimationFrame", - "mozRequestFullScreen", - "mozRequestPointerLock", - "mozSetDataAt", - "mozSetImageElement", - "mozSourceNode", - "mozSrcObject", - "mozSystem", - "mozTCPSocket", - "mozTextStyle", - "mozTypesAt", - "mozUnlockOrientation", - "mozUserCancelled", - "mozVisibilityState", - "msAnimation", - "msAnimationDelay", - "msAnimationDirection", - "msAnimationDuration", - "msAnimationFillMode", - "msAnimationIterationCount", - "msAnimationName", - "msAnimationPlayState", - "msAnimationStartTime", - "msAnimationTimingFunction", - "msBackfaceVisibility", - "msBlockProgression", - "msCSSOMElementFloatMetrics", - "msCaching", - "msCachingEnabled", - "msCancelRequestAnimationFrame", - "msCapsLockWarningOff", - "msClearImmediate", - "msClose", - "msContentZoomChaining", - "msContentZoomFactor", - "msContentZoomLimit", - "msContentZoomLimitMax", - "msContentZoomLimitMin", - "msContentZoomSnap", - "msContentZoomSnapPoints", - "msContentZoomSnapType", - "msContentZooming", - "msConvertURL", - "msCrypto", - "msDoNotTrack", - "msElementsFromPoint", - "msElementsFromRect", - "msExitFullscreen", - "msExtendedCode", - "msFillRule", - "msFirstPaint", - "msFlex", - "msFlexAlign", - "msFlexDirection", - "msFlexFlow", - "msFlexItemAlign", - "msFlexLinePack", - "msFlexNegative", - "msFlexOrder", - "msFlexPack", - "msFlexPositive", - "msFlexPreferredSize", - "msFlexWrap", - "msFlowFrom", - "msFlowInto", - "msFontFeatureSettings", - "msFullscreenElement", - "msFullscreenEnabled", - "msGetInputContext", - "msGetRegionContent", - "msGetUntransformedBounds", - "msGraphicsTrustStatus", - "msGridColumn", - "msGridColumnAlign", - "msGridColumnSpan", - "msGridColumns", - "msGridRow", - "msGridRowAlign", - "msGridRowSpan", - "msGridRows", - "msHidden", - "msHighContrastAdjust", - "msHyphenateLimitChars", - "msHyphenateLimitLines", - "msHyphenateLimitZone", - "msHyphens", - "msImageSmoothingEnabled", - "msImeAlign", - "msIndexedDB", - "msInterpolationMode", - "msIsStaticHTML", - "msKeySystem", - "msKeys", - "msLaunchUri", - "msLockOrientation", - "msManipulationViewsEnabled", - "msMatchMedia", - "msMatchesSelector", - "msMaxTouchPoints", - "msOrientation", - "msOverflowStyle", - "msPerspective", - "msPerspectiveOrigin", - "msPlayToDisabled", - "msPlayToPreferredSourceUri", - "msPlayToPrimary", - "msPointerEnabled", - "msRegionOverflow", - "msReleasePointerCapture", - "msRequestAnimationFrame", - "msRequestFullscreen", - "msSaveBlob", - "msSaveOrOpenBlob", - "msScrollChaining", - "msScrollLimit", - "msScrollLimitXMax", - "msScrollLimitXMin", - "msScrollLimitYMax", - "msScrollLimitYMin", - "msScrollRails", - "msScrollSnapPointsX", - "msScrollSnapPointsY", - "msScrollSnapType", - "msScrollSnapX", - "msScrollSnapY", - "msScrollTranslation", - "msSetImmediate", - "msSetMediaKeys", - "msSetPointerCapture", - "msTextCombineHorizontal", - "msTextSizeAdjust", - "msToBlob", - "msTouchAction", - "msTouchSelect", - "msTraceAsyncCallbackCompleted", - "msTraceAsyncCallbackStarting", - "msTraceAsyncOperationCompleted", - "msTraceAsyncOperationStarting", - "msTransform", - "msTransformOrigin", - "msTransformStyle", - "msTransition", - "msTransitionDelay", - "msTransitionDuration", - "msTransitionProperty", - "msTransitionTimingFunction", - "msUnlockOrientation", - "msUpdateAsyncCallbackRelation", - "msUserSelect", - "msVisibilityState", - "msWrapFlow", - "msWrapMargin", - "msWrapThrough", - "msWriteProfilerMark", - "msZoom", - "msZoomTo", - "mt", - "multiEntry", - "multiSelectionObj", - "multiline", - "multiple", - "multiply", - "multiplySelf", - "mutableFile", - "muted", - "n", - "name", - "nameProp", - "namedItem", - "namedRecordset", - "names", - "namespaceURI", - "namespaces", - "naturalHeight", - "naturalWidth", - "navigate", - "navigation", - "navigationMode", - "navigationStart", - "navigator", - "near", - "nearestViewportElement", - "negative", - "netscape", - "networkState", - "newScale", - "newTranslate", - "newURL", - "newValue", - "newValueSpecifiedUnits", - "newVersion", - "newhome", - "next", - "nextElementSibling", - "nextNode", - "nextPage", - "nextSibling", - "nickname", - "noHref", - "noResize", - "noShade", - "noValidate", - "noWrap", - "nodeName", - "nodeType", - "nodeValue", - "normalize", - "normalizedPathSegList", - "notationName", - "notations", - "note", - "noteGrainOn", - "noteOff", - "noteOn", - "now", - "numOctaves", - "number", - "numberOfChannels", - "numberOfInputs", - "numberOfItems", - "numberOfOutputs", - "numberValue", - "oMatchesSelector", - "object", - "object-fit", - "object-position", - "objectFit", - "objectPosition", - "objectStore", - "objectStoreNames", - "observe", - "of", - "offscreenBuffering", - "offset", - "offsetHeight", - "offsetLeft", - "offsetNode", - "offsetParent", - "offsetTop", - "offsetWidth", - "offsetX", - "offsetY", - "ok", - "oldURL", - "oldValue", - "oldVersion", - "olderShadowRoot", - "onLine", - "onabort", - "onactivate", - "onactive", - "onaddstream", - "onaddtrack", - "onafterprint", - "onafterscriptexecute", - "onafterupdate", - "onaudioend", - "onaudioprocess", - "onaudiostart", - "onautocomplete", - "onautocompleteerror", - "onbeforeactivate", - "onbeforecopy", - "onbeforecut", - "onbeforedeactivate", - "onbeforeeditfocus", - "onbeforepaste", - "onbeforeprint", - "onbeforescriptexecute", - "onbeforeunload", - "onbeforeupdate", - "onblocked", - "onblur", - "onbounce", - "onboundary", - "oncached", - "oncancel", - "oncandidatewindowhide", - "oncandidatewindowshow", - "oncandidatewindowupdate", - "oncanplay", - "oncanplaythrough", - "oncellchange", - "onchange", - "onchargingchange", - "onchargingtimechange", - "onchecking", - "onclick", - "onclose", - "oncompassneedscalibration", - "oncomplete", - "oncontextmenu", - "oncontrolselect", - "oncopy", - "oncuechange", - "oncut", - "ondataavailable", - "ondatachannel", - "ondatasetchanged", - "ondatasetcomplete", - "ondblclick", - "ondeactivate", - "ondevicelight", - "ondevicemotion", - "ondeviceorientation", - "ondeviceproximity", - "ondischargingtimechange", - "ondisplay", - "ondownloading", - "ondrag", - "ondragend", - "ondragenter", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onencrypted", - "onend", - "onended", - "onenter", - "onerror", - "onerrorupdate", - "onexit", - "onfilterchange", - "onfinish", - "onfocus", - "onfocusin", - "onfocusout", - "onfullscreenchange", - "onfullscreenerror", - "ongesturechange", - "ongestureend", - "ongesturestart", - "ongotpointercapture", - "onhashchange", - "onhelp", - "onicecandidate", - "oniceconnectionstatechange", - "oninactive", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onlayoutcomplete", - "onlevelchange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadend", - "onloadstart", - "onlosecapture", - "onlostpointercapture", - "only", - "onmark", - "onmessage", - "onmousedown", - "onmouseenter", - "onmouseleave", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onmove", - "onmoveend", - "onmovestart", - "onmozfullscreenchange", - "onmozfullscreenerror", - "onmozorientationchange", - "onmozpointerlockchange", - "onmozpointerlockerror", - "onmscontentzoom", - "onmsfullscreenchange", - "onmsfullscreenerror", - "onmsgesturechange", - "onmsgesturedoubletap", - "onmsgestureend", - "onmsgesturehold", - "onmsgesturestart", - "onmsgesturetap", - "onmsgotpointercapture", - "onmsinertiastart", - "onmslostpointercapture", - "onmsmanipulationstatechanged", - "onmsneedkey", - "onmsorientationchange", - "onmspointercancel", - "onmspointerdown", - "onmspointerenter", - "onmspointerhover", - "onmspointerleave", - "onmspointermove", - "onmspointerout", - "onmspointerover", - "onmspointerup", - "onmssitemodejumplistitemremoved", - "onmsthumbnailclick", - "onnegotiationneeded", - "onnomatch", - "onnoupdate", - "onobsolete", - "onoffline", - "ononline", - "onopen", - "onorientationchange", - "onpagechange", - "onpagehide", - "onpageshow", - "onpaste", - "onpause", - "onplay", - "onplaying", - "onpluginstreamstart", - "onpointercancel", - "onpointerdown", - "onpointerenter", - "onpointerleave", - "onpointerlockchange", - "onpointerlockerror", - "onpointermove", - "onpointerout", - "onpointerover", - "onpointerup", - "onpopstate", - "onprogress", - "onpropertychange", - "onratechange", - "onreadystatechange", - "onremovestream", - "onremovetrack", - "onreset", - "onresize", - "onresizeend", - "onresizestart", - "onresourcetimingbufferfull", - "onresult", - "onresume", - "onrowenter", - "onrowexit", - "onrowsdelete", - "onrowsinserted", - "onscroll", - "onsearch", - "onseeked", - "onseeking", - "onselect", - "onselectionchange", - "onselectstart", - "onshow", - "onsignalingstatechange", - "onsoundend", - "onsoundstart", - "onspeechend", - "onspeechstart", - "onstalled", - "onstart", - "onstatechange", - "onstop", - "onstorage", - "onstoragecommit", - "onsubmit", - "onsuccess", - "onsuspend", - "ontextinput", - "ontimeout", - "ontimeupdate", - "ontoggle", - "ontouchcancel", - "ontouchend", - "ontouchmove", - "ontouchstart", - "ontransitionend", - "onunload", - "onupdateready", - "onupgradeneeded", - "onuserproximity", - "onversionchange", - "onvoiceschanged", - "onvolumechange", - "onwaiting", - "onwarning", - "onwebkitanimationend", - "onwebkitanimationiteration", - "onwebkitanimationstart", - "onwebkitcurrentplaybacktargetiswirelesschanged", - "onwebkitfullscreenchange", - "onwebkitfullscreenerror", - "onwebkitkeyadded", - "onwebkitkeyerror", - "onwebkitkeymessage", - "onwebkitneedkey", - "onwebkitorientationchange", - "onwebkitplaybacktargetavailabilitychanged", - "onwebkitpointerlockchange", - "onwebkitpointerlockerror", - "onwebkitresourcetimingbufferfull", - "onwebkittransitionend", - "onwheel", - "onzoom", - "opacity", - "open", - "openCursor", - "openDatabase", - "openKeyCursor", - "opener", - "opera", - "operationType", - "operator", - "opr", - "optimum", - "options", - "order", - "orderX", - "orderY", - "ordered", - "org", - "orient", - "orientAngle", - "orientType", - "orientation", - "origin", - "originalTarget", - "orphans", - "oscpu", - "outerHTML", - "outerHeight", - "outerText", - "outerWidth", - "outline", - "outline-color", - "outline-offset", - "outline-style", - "outline-width", - "outlineColor", - "outlineOffset", - "outlineStyle", - "outlineWidth", - "outputBuffer", - "overflow", - "overflow-x", - "overflow-y", - "overflowX", - "overflowY", - "overrideMimeType", - "oversample", - "ownerDocument", - "ownerElement", - "ownerNode", - "ownerRule", - "ownerSVGElement", - "owningElement", - "p1", - "p2", - "p3", - "p4", - "pad", - "padding", - "padding-bottom", - "padding-left", - "padding-right", - "padding-top", - "paddingBottom", - "paddingLeft", - "paddingRight", - "paddingTop", - "page", - "page-break-after", - "page-break-before", - "page-break-inside", - "pageBreakAfter", - "pageBreakBefore", - "pageBreakInside", - "pageCount", - "pageX", - "pageXOffset", - "pageY", - "pageYOffset", - "pages", - "paint-order", - "paintOrder", - "paintRequests", - "paintType", - "palette", - "panningModel", - "parent", - "parentElement", - "parentNode", - "parentRule", - "parentStyleSheet", - "parentTextEdit", - "parentWindow", - "parse", - "parseFloat", - "parseFromString", - "parseInt", - "participants", - "password", - "pasteHTML", - "path", - "pathLength", - "pathSegList", - "pathSegType", - "pathSegTypeAsLetter", - "pathname", - "pattern", - "patternContentUnits", - "patternMismatch", - "patternTransform", - "patternUnits", - "pause", - "pauseAnimations", - "pauseOnExit", - "paused", - "pending", - "performance", - "permission", - "persisted", - "personalbar", - "perspective", - "perspective-origin", - "perspectiveOrigin", - "phoneticFamilyName", - "phoneticGivenName", - "photo", - "ping", - "pitch", - "pixelBottom", - "pixelDepth", - "pixelHeight", - "pixelLeft", - "pixelRight", - "pixelStorei", - "pixelTop", - "pixelUnitToMillimeterX", - "pixelUnitToMillimeterY", - "pixelWidth", - "placeholder", - "platform", - "play", - "playbackRate", - "playbackState", - "playbackTime", - "played", - "plugins", - "pluginspage", - "pname", - "pointer-events", - "pointerBeforeReferenceNode", - "pointerEnabled", - "pointerEvents", - "pointerId", - "pointerLockElement", - "pointerType", - "points", - "pointsAtX", - "pointsAtY", - "pointsAtZ", - "polygonOffset", - "pop", - "popupWindowFeatures", - "popupWindowName", - "popupWindowURI", - "port", - "port1", - "port2", - "ports", - "posBottom", - "posHeight", - "posLeft", - "posRight", - "posTop", - "posWidth", - "position", - "positionAlign", - "postError", - "postMessage", - "poster", - "pow", - "powerOff", - "preMultiplySelf", - "precision", - "preferredStyleSheetSet", - "preferredStylesheetSet", - "prefix", - "preload", - "preserveAlpha", - "preserveAspectRatio", - "preserveAspectRatioString", - "pressed", - "pressure", - "prevValue", - "preventDefault", - "preventExtensions", - "previousElementSibling", - "previousNode", - "previousPage", - "previousScale", - "previousSibling", - "previousTranslate", - "primaryKey", - "primitiveType", - "primitiveUnits", - "principals", - "print", - "privateKey", - "probablySupportsContext", - "process", - "processIceMessage", - "product", - "productSub", - "profile", - "profileEnd", - "profiles", - "prompt", - "properties", - "propertyIsEnumerable", - "propertyName", - "protocol", - "protocolLong", - "prototype", - "pseudoClass", - "pseudoElement", - "publicId", - "publicKey", - "published", - "push", - "pushNotification", - "pushState", - "put", - "putImageData", - "quadraticCurveTo", - "qualifier", - "queryCommandEnabled", - "queryCommandIndeterm", - "queryCommandState", - "queryCommandSupported", - "queryCommandText", - "queryCommandValue", - "querySelector", - "querySelectorAll", - "quote", - "quotes", - "r", - "r1", - "r2", - "race", - "radiogroup", - "radiusX", - "radiusY", - "random", - "range", - "rangeCount", - "rangeMax", - "rangeMin", - "rangeOffset", - "rangeOverflow", - "rangeParent", - "rangeUnderflow", - "rate", - "ratio", - "raw", - "read", - "readAsArrayBuffer", - "readAsBinaryString", - "readAsBlob", - "readAsDataURL", - "readAsText", - "readOnly", - "readPixels", - "readReportRequested", - "readyState", - "reason", - "reboot", - "receiver", - "receivers", - "recordNumber", - "recordset", - "rect", - "red", - "redirectCount", - "redirectEnd", - "redirectStart", - "reduce", - "reduceRight", - "reduction", - "refDistance", - "refX", - "refY", - "referenceNode", - "referrer", - "refresh", - "region", - "regionAnchorX", - "regionAnchorY", - "regionId", - "regions", - "register", - "registerContentHandler", - "registerElement", - "registerProtocolHandler", - "reject", - "rel", - "relList", - "relatedNode", - "relatedTarget", - "release", - "releaseCapture", - "releaseEvents", - "releasePointerCapture", - "releaseShaderCompiler", - "reliable", - "reload", - "remainingSpace", - "remoteDescription", - "remove", - "removeAllRanges", - "removeAttribute", - "removeAttributeNS", - "removeAttributeNode", - "removeBehavior", - "removeChild", - "removeCue", - "removeEventListener", - "removeFilter", - "removeImport", - "removeItem", - "removeListener", - "removeNamedItem", - "removeNamedItemNS", - "removeNode", - "removeParameter", - "removeProperty", - "removeRange", - "removeRegion", - "removeRule", - "removeSiteSpecificTrackingException", - "removeSourceBuffer", - "removeStream", - "removeTrack", - "removeVariable", - "removeWakeLockListener", - "removeWebWideTrackingException", - "removedNodes", - "renderbufferStorage", - "renderedBuffer", - "renderingMode", - "repeat", - "replace", - "replaceAdjacentText", - "replaceChild", - "replaceData", - "replaceId", - "replaceItem", - "replaceNode", - "replaceState", - "replaceTrack", - "replaceWholeText", - "reportValidity", - "requestAnimationFrame", - "requestAutocomplete", - "requestData", - "requestFullscreen", - "requestMediaKeySystemAccess", - "requestPermission", - "requestPointerLock", - "requestStart", - "requestingWindow", - "required", - "requiredExtensions", - "requiredFeatures", - "reset", - "resetTransform", - "resize", - "resizeBy", - "resizeTo", - "resolve", - "response", - "responseBody", - "responseEnd", - "responseStart", - "responseText", - "responseType", - "responseURL", - "responseXML", - "restore", - "result", - "resultType", - "resume", - "returnValue", - "rev", - "reverse", - "reversed", - "revocable", - "revokeObjectURL", - "rgbColor", - "right", - "rightContext", - "rightMargin", - "rolloffFactor", - "root", - "rootElement", - "rotate", - "rotateAxisAngle", - "rotateAxisAngleSelf", - "rotateFromVector", - "rotateFromVectorSelf", - "rotateSelf", - "rotation", - "rotationRate", - "round", - "rowIndex", - "rowSpan", - "rows", - "rubyAlign", - "rubyOverhang", - "rubyPosition", - "rules", - "runtime", - "runtimeStyle", - "rx", - "ry", - "safari", - "sampleCoverage", - "sampleRate", - "sandbox", - "save", - "scale", - "scale3d", - "scale3dSelf", - "scaleNonUniform", - "scaleNonUniformSelf", - "scaleSelf", - "scheme", - "scissor", - "scope", - "scopeName", - "scoped", - "screen", - "screenBrightness", - "screenEnabled", - "screenLeft", - "screenPixelToMillimeterX", - "screenPixelToMillimeterY", - "screenTop", - "screenX", - "screenY", - "scripts", - "scroll", - "scroll-behavior", - "scrollAmount", - "scrollBehavior", - "scrollBy", - "scrollByLines", - "scrollByPages", - "scrollDelay", - "scrollHeight", - "scrollIntoView", - "scrollIntoViewIfNeeded", - "scrollLeft", - "scrollLeftMax", - "scrollMaxX", - "scrollMaxY", - "scrollTo", - "scrollTop", - "scrollTopMax", - "scrollWidth", - "scrollX", - "scrollY", - "scrollbar3dLightColor", - "scrollbarArrowColor", - "scrollbarBaseColor", - "scrollbarDarkShadowColor", - "scrollbarFaceColor", - "scrollbarHighlightColor", - "scrollbarShadowColor", - "scrollbarTrackColor", - "scrollbars", - "scrolling", - "sdp", - "sdpMLineIndex", - "sdpMid", - "seal", - "search", - "searchBox", - "searchBoxJavaBridge_", - "searchParams", - "sectionRowIndex", - "secureConnectionStart", - "security", - "seed", - "seekable", - "seeking", - "select", - "selectAllChildren", - "selectNode", - "selectNodeContents", - "selectNodes", - "selectSingleNode", - "selectSubString", - "selected", - "selectedIndex", - "selectedOptions", - "selectedStyleSheetSet", - "selectedStylesheetSet", - "selection", - "selectionDirection", - "selectionEnd", - "selectionStart", - "selector", - "selectorText", - "self", - "send", - "sendAsBinary", - "sendBeacon", - "sender", - "sentTimestamp", - "separator", - "serializeToString", - "serviceWorker", - "sessionId", - "sessionStorage", - "set", - "setActive", - "setAlpha", - "setAttribute", - "setAttributeNS", - "setAttributeNode", - "setAttributeNodeNS", - "setBaseAndExtent", - "setBingCurrentSearchDefault", - "setCapture", - "setColor", - "setCompositeOperation", - "setCurrentTime", - "setCustomValidity", - "setData", - "setDate", - "setDragImage", - "setEnd", - "setEndAfter", - "setEndBefore", - "setEndPoint", - "setFillColor", - "setFilterRes", - "setFloat32", - "setFloat64", - "setFloatValue", - "setFullYear", - "setHours", - "setImmediate", - "setInt16", - "setInt32", - "setInt8", - "setInterval", - "setItem", - "setLineCap", - "setLineDash", - "setLineJoin", - "setLineWidth", - "setLocalDescription", - "setMatrix", - "setMatrixValue", - "setMediaKeys", - "setMilliseconds", - "setMinutes", - "setMiterLimit", - "setMonth", - "setNamedItem", - "setNamedItemNS", - "setNonUserCodeExceptions", - "setOrientToAngle", - "setOrientToAuto", - "setOrientation", - "setOverrideHistoryNavigationMode", - "setPaint", - "setParameter", - "setPeriodicWave", - "setPointerCapture", - "setPosition", - "setPreference", - "setProperty", - "setPrototypeOf", - "setRGBColor", - "setRGBColorICCColor", - "setRadius", - "setRangeText", - "setRemoteDescription", - "setRequestHeader", - "setResizable", - "setResourceTimingBufferSize", - "setRotate", - "setScale", - "setSeconds", - "setSelectionRange", - "setServerCertificate", - "setShadow", - "setSkewX", - "setSkewY", - "setStart", - "setStartAfter", - "setStartBefore", - "setStdDeviation", - "setStringValue", - "setStrokeColor", - "setSuggestResult", - "setTargetAtTime", - "setTargetValueAtTime", - "setTime", - "setTimeout", - "setTransform", - "setTranslate", - "setUTCDate", - "setUTCFullYear", - "setUTCHours", - "setUTCMilliseconds", - "setUTCMinutes", - "setUTCMonth", - "setUTCSeconds", - "setUint16", - "setUint32", - "setUint8", - "setUri", - "setValueAtTime", - "setValueCurveAtTime", - "setVariable", - "setVelocity", - "setVersion", - "setYear", - "settingName", - "settingValue", - "sex", - "shaderSource", - "shadowBlur", - "shadowColor", - "shadowOffsetX", - "shadowOffsetY", - "shadowRoot", - "shape", - "shape-rendering", - "shapeRendering", - "sheet", - "shift", - "shiftKey", - "shiftLeft", - "show", - "showHelp", - "showModal", - "showModalDialog", - "showModelessDialog", - "showNotification", - "sidebar", - "sign", - "signalingState", - "sin", - "singleNodeValue", - "sinh", - "size", - "sizeToContent", - "sizes", - "skewX", - "skewXSelf", - "skewY", - "skewYSelf", - "slice", - "slope", - "small", - "smil", - "smoothingTimeConstant", - "snapToLines", - "snapshotItem", - "snapshotLength", - "some", - "sort", - "source", - "sourceBuffer", - "sourceBuffers", - "sourceIndex", - "spacing", - "span", - "speakAs", - "speaking", - "specified", - "specularConstant", - "specularExponent", - "speechSynthesis", - "speed", - "speedOfSound", - "spellcheck", - "splice", - "split", - "splitText", - "spreadMethod", - "sqrt", - "src", - "srcElement", - "srcFilter", - "srcUrn", - "srcdoc", - "srclang", - "srcset", - "stack", - "stackTraceLimit", - "stacktrace", - "standalone", - "standby", - "start", - "startContainer", - "startIce", - "startOffset", - "startRendering", - "startTime", - "startsWith", - "state", - "status", - "statusMessage", - "statusText", - "statusbar", - "stdDeviationX", - "stdDeviationY", - "stencilFunc", - "stencilFuncSeparate", - "stencilMask", - "stencilMaskSeparate", - "stencilOp", - "stencilOpSeparate", - "step", - "stepDown", - "stepMismatch", - "stepUp", - "sticky", - "stitchTiles", - "stop", - "stop-color", - "stop-opacity", - "stopColor", - "stopImmediatePropagation", - "stopOpacity", - "stopPropagation", - "storageArea", - "storageName", - "storageStatus", - "storeSiteSpecificTrackingException", - "storeWebWideTrackingException", - "stpVersion", - "stream", - "strike", - "stringValue", - "stringify", - "stroke", - "stroke-dasharray", - "stroke-dashoffset", - "stroke-linecap", - "stroke-linejoin", - "stroke-miterlimit", - "stroke-opacity", - "stroke-width", - "strokeDasharray", - "strokeDashoffset", - "strokeLinecap", - "strokeLinejoin", - "strokeMiterlimit", - "strokeOpacity", - "strokeRect", - "strokeStyle", - "strokeText", - "strokeWidth", - "style", - "styleFloat", - "styleMedia", - "styleSheet", - "styleSheetSets", - "styleSheets", - "sub", - "subarray", - "subject", - "submit", - "subscribe", - "substr", - "substring", - "substringData", - "subtle", - "suffix", - "suffixes", - "summary", - "sup", - "supports", - "surfaceScale", - "surroundContents", - "suspend", - "suspendRedraw", - "swapCache", - "swapNode", - "sweepFlag", - "symbols", - "system", - "systemCode", - "systemId", - "systemLanguage", - "systemXDPI", - "systemYDPI", - "tBodies", - "tFoot", - "tHead", - "tabIndex", - "table", - "table-layout", - "tableLayout", - "tableValues", - "tag", - "tagName", - "tagUrn", - "tags", - "taintEnabled", - "takeRecords", - "tan", - "tanh", - "target", - "targetElement", - "targetTouches", - "targetX", - "targetY", - "tel", - "terminate", - "test", - "texImage2D", - "texParameterf", - "texParameteri", - "texSubImage2D", - "text", - "text-align", - "text-anchor", - "text-decoration", - "text-decoration-color", - "text-decoration-line", - "text-decoration-style", - "text-indent", - "text-overflow", - "text-rendering", - "text-shadow", - "text-transform", - "textAlign", - "textAlignLast", - "textAnchor", - "textAutospace", - "textBaseline", - "textContent", - "textDecoration", - "textDecorationBlink", - "textDecorationColor", - "textDecorationLine", - "textDecorationLineThrough", - "textDecorationNone", - "textDecorationOverline", - "textDecorationStyle", - "textDecorationUnderline", - "textIndent", - "textJustify", - "textJustifyTrim", - "textKashida", - "textKashidaSpace", - "textLength", - "textOverflow", - "textRendering", - "textShadow", - "textTracks", - "textTransform", - "textUnderlinePosition", - "then", - "threadId", - "threshold", - "tiltX", - "tiltY", - "time", - "timeEnd", - "timeStamp", - "timeout", - "timestamp", - "timestampOffset", - "timing", - "title", - "toArray", - "toBlob", - "toDataURL", - "toDateString", - "toElement", - "toExponential", - "toFixed", - "toFloat32Array", - "toFloat64Array", - "toGMTString", - "toISOString", - "toJSON", - "toLocaleDateString", - "toLocaleFormat", - "toLocaleLowerCase", - "toLocaleString", - "toLocaleTimeString", - "toLocaleUpperCase", - "toLowerCase", - "toMethod", - "toPrecision", - "toSdp", - "toSource", - "toStaticHTML", - "toString", - "toStringTag", - "toTimeString", - "toUTCString", - "toUpperCase", - "toggle", - "toggleLongPressEnabled", - "tooLong", - "toolbar", - "top", - "topMargin", - "total", - "totalFrameDelay", - "totalVideoFrames", - "touchAction", - "touches", - "trace", - "track", - "transaction", - "transactions", - "transform", - "transform-origin", - "transform-style", - "transformOrigin", - "transformPoint", - "transformString", - "transformStyle", - "transformToDocument", - "transformToFragment", - "transition", - "transition-delay", - "transition-duration", - "transition-property", - "transition-timing-function", - "transitionDelay", - "transitionDuration", - "transitionProperty", - "transitionTimingFunction", - "translate", - "translateSelf", - "translationX", - "translationY", - "trim", - "trimLeft", - "trimRight", - "trueSpeed", - "trunc", - "truncate", - "type", - "typeDetail", - "typeMismatch", - "typeMustMatch", - "types", - "ubound", - "undefined", - "unescape", - "uneval", - "unicode-bidi", - "unicodeBidi", - "uniform1f", - "uniform1fv", - "uniform1i", - "uniform1iv", - "uniform2f", - "uniform2fv", - "uniform2i", - "uniform2iv", - "uniform3f", - "uniform3fv", - "uniform3i", - "uniform3iv", - "uniform4f", - "uniform4fv", - "uniform4i", - "uniform4iv", - "uniformMatrix2fv", - "uniformMatrix3fv", - "uniformMatrix4fv", - "unique", - "uniqueID", - "uniqueNumber", - "unitType", - "units", - "unloadEventEnd", - "unloadEventStart", - "unlock", - "unmount", - "unobserve", - "unpause", - "unpauseAnimations", - "unreadCount", - "unregister", - "unregisterContentHandler", - "unregisterProtocolHandler", - "unscopables", - "unselectable", - "unshift", - "unsubscribe", - "unsuspendRedraw", - "unsuspendRedrawAll", - "unwatch", - "unwrapKey", - "update", - "updateCommands", - "updateIce", - "updateInterval", - "updateSettings", - "updated", - "updating", - "upload", - "upper", - "upperBound", - "upperOpen", - "uri", - "url", - "urn", - "urns", - "usages", - "useCurrentView", - "useMap", - "useProgram", - "usedSpace", - "userAgent", - "userLanguage", - "username", - "v8BreakIterator", - "vAlign", - "vLink", - "valid", - "validateProgram", - "validationMessage", - "validity", - "value", - "valueAsDate", - "valueAsNumber", - "valueAsString", - "valueInSpecifiedUnits", - "valueMissing", - "valueOf", - "valueText", - "valueType", - "values", - "vector-effect", - "vectorEffect", - "velocityAngular", - "velocityExpansion", - "velocityX", - "velocityY", - "vendor", - "vendorSub", - "verify", - "version", - "vertexAttrib1f", - "vertexAttrib1fv", - "vertexAttrib2f", - "vertexAttrib2fv", - "vertexAttrib3f", - "vertexAttrib3fv", - "vertexAttrib4f", - "vertexAttrib4fv", - "vertexAttribDivisorANGLE", - "vertexAttribPointer", - "vertical", - "vertical-align", - "verticalAlign", - "verticalOverflow", - "vibrate", - "videoHeight", - "videoTracks", - "videoWidth", - "view", - "viewBox", - "viewBoxString", - "viewTarget", - "viewTargetString", - "viewport", - "viewportAnchorX", - "viewportAnchorY", - "viewportElement", - "visibility", - "visibilityState", - "visible", - "vlinkColor", - "voice", - "volume", - "vrml", - "vspace", - "w", - "wand", - "warn", - "wasClean", - "watch", - "watchPosition", - "webdriver", - "webkitAddKey", - "webkitAnimation", - "webkitAnimationDelay", - "webkitAnimationDirection", - "webkitAnimationDuration", - "webkitAnimationFillMode", - "webkitAnimationIterationCount", - "webkitAnimationName", - "webkitAnimationPlayState", - "webkitAnimationTimingFunction", - "webkitAppearance", - "webkitAudioContext", - "webkitAudioDecodedByteCount", - "webkitAudioPannerNode", - "webkitBackfaceVisibility", - "webkitBackground", - "webkitBackgroundAttachment", - "webkitBackgroundClip", - "webkitBackgroundColor", - "webkitBackgroundImage", - "webkitBackgroundOrigin", - "webkitBackgroundPosition", - "webkitBackgroundPositionX", - "webkitBackgroundPositionY", - "webkitBackgroundRepeat", - "webkitBackgroundSize", - "webkitBackingStorePixelRatio", - "webkitBorderImage", - "webkitBorderImageOutset", - "webkitBorderImageRepeat", - "webkitBorderImageSlice", - "webkitBorderImageSource", - "webkitBorderImageWidth", - "webkitBoxAlign", - "webkitBoxDirection", - "webkitBoxFlex", - "webkitBoxOrdinalGroup", - "webkitBoxOrient", - "webkitBoxPack", - "webkitBoxSizing", - "webkitCancelAnimationFrame", - "webkitCancelFullScreen", - "webkitCancelKeyRequest", - "webkitCancelRequestAnimationFrame", - "webkitClearResourceTimings", - "webkitClosedCaptionsVisible", - "webkitConvertPointFromNodeToPage", - "webkitConvertPointFromPageToNode", - "webkitCreateShadowRoot", - "webkitCurrentFullScreenElement", - "webkitCurrentPlaybackTargetIsWireless", - "webkitDirectionInvertedFromDevice", - "webkitDisplayingFullscreen", - "webkitEnterFullScreen", - "webkitEnterFullscreen", - "webkitExitFullScreen", - "webkitExitFullscreen", - "webkitExitPointerLock", - "webkitFullScreenKeyboardInputAllowed", - "webkitFullscreenElement", - "webkitFullscreenEnabled", - "webkitGenerateKeyRequest", - "webkitGetAsEntry", - "webkitGetDatabaseNames", - "webkitGetEntries", - "webkitGetEntriesByName", - "webkitGetEntriesByType", - "webkitGetFlowByName", - "webkitGetGamepads", - "webkitGetImageDataHD", - "webkitGetNamedFlows", - "webkitGetRegionFlowRanges", - "webkitGetUserMedia", - "webkitHasClosedCaptions", - "webkitHidden", - "webkitIDBCursor", - "webkitIDBDatabase", - "webkitIDBDatabaseError", - "webkitIDBDatabaseException", - "webkitIDBFactory", - "webkitIDBIndex", - "webkitIDBKeyRange", - "webkitIDBObjectStore", - "webkitIDBRequest", - "webkitIDBTransaction", - "webkitImageSmoothingEnabled", - "webkitIndexedDB", - "webkitInitMessageEvent", - "webkitIsFullScreen", - "webkitKeys", - "webkitLineDashOffset", - "webkitLockOrientation", - "webkitMatchesSelector", - "webkitMediaStream", - "webkitNotifications", - "webkitOfflineAudioContext", - "webkitOrientation", - "webkitPeerConnection00", - "webkitPersistentStorage", - "webkitPointerLockElement", - "webkitPostMessage", - "webkitPreservesPitch", - "webkitPutImageDataHD", - "webkitRTCPeerConnection", - "webkitRegionOverset", - "webkitRequestAnimationFrame", - "webkitRequestFileSystem", - "webkitRequestFullScreen", - "webkitRequestFullscreen", - "webkitRequestPointerLock", - "webkitResolveLocalFileSystemURL", - "webkitSetMediaKeys", - "webkitSetResourceTimingBufferSize", - "webkitShadowRoot", - "webkitShowPlaybackTargetPicker", - "webkitSlice", - "webkitSpeechGrammar", - "webkitSpeechGrammarList", - "webkitSpeechRecognition", - "webkitSpeechRecognitionError", - "webkitSpeechRecognitionEvent", - "webkitStorageInfo", - "webkitSupportsFullscreen", - "webkitTemporaryStorage", - "webkitTextSizeAdjust", - "webkitTransform", - "webkitTransformOrigin", - "webkitTransition", - "webkitTransitionDelay", - "webkitTransitionDuration", - "webkitTransitionProperty", - "webkitTransitionTimingFunction", - "webkitURL", - "webkitUnlockOrientation", - "webkitUserSelect", - "webkitVideoDecodedByteCount", - "webkitVisibilityState", - "webkitWirelessVideoPlaybackDisabled", - "webkitdropzone", - "webstore", - "weight", - "whatToShow", - "wheelDelta", - "wheelDeltaX", - "wheelDeltaY", - "which", - "white-space", - "whiteSpace", - "wholeText", - "widows", - "width", - "will-change", - "willChange", - "willValidate", - "window", - "withCredentials", - "word-break", - "word-spacing", - "word-wrap", - "wordBreak", - "wordSpacing", - "wordWrap", - "wrap", - "wrapKey", - "write", - "writeln", - "writingMode", - "x", - "x1", - "x2", - "xChannelSelector", - "xmlEncoding", - "xmlStandalone", - "xmlVersion", - "xmlbase", - "xmllang", - "xmlspace", - "y", - "y1", - "y2", - "yChannelSelector", - "yandex", - "z", - "z-index", - "zIndex", - "zoom", - "zoomAndPan", - "zoomRectScreen" -] diff --git a/node_modules/uglify-js/tools/exports.js b/node_modules/uglify-js/tools/exports.js deleted file mode 100644 index e08296f3..00000000 --- a/node_modules/uglify-js/tools/exports.js +++ /dev/null @@ -1,5 +0,0 @@ -exports["Dictionary"] = Dictionary; -exports["TreeWalker"] = TreeWalker; -exports["TreeTransformer"] = TreeTransformer; -exports["minify"] = minify; -exports["_push_uniq"] = push_uniq; diff --git a/node_modules/uglify-js/tools/node.js b/node_modules/uglify-js/tools/node.js deleted file mode 100644 index dc270106..00000000 --- a/node_modules/uglify-js/tools/node.js +++ /dev/null @@ -1,82 +0,0 @@ -var fs = require("fs"); - -var UglifyJS = exports; -var FILES = UglifyJS.FILES = [ - "../lib/utils.js", - "../lib/ast.js", - "../lib/parse.js", - "../lib/transform.js", - "../lib/scope.js", - "../lib/output.js", - "../lib/compress.js", - "../lib/sourcemap.js", - "../lib/mozilla-ast.js", - "../lib/propmangle.js", - "../lib/minify.js", - "./exports.js", -].map(function(file){ - return require.resolve(file); -}); - -new Function("MOZ_SourceMap", "exports", function() { - var code = FILES.map(function(file) { - return fs.readFileSync(file, "utf8"); - }); - code.push("exports.describe_ast = " + describe_ast.toString()); - return code.join("\n\n"); -}())( - require("source-map"), - UglifyJS -); - -function describe_ast() { - var out = OutputStream({ beautify: true }); - function doitem(ctor) { - out.print("AST_" + ctor.TYPE); - var props = ctor.SELF_PROPS.filter(function(prop){ - return !/^\$/.test(prop); - }); - if (props.length > 0) { - out.space(); - out.with_parens(function(){ - props.forEach(function(prop, i){ - if (i) out.space(); - out.print(prop); - }); - }); - } - if (ctor.documentation) { - out.space(); - out.print_string(ctor.documentation); - } - if (ctor.SUBCLASSES.length > 0) { - out.space(); - out.with_block(function(){ - ctor.SUBCLASSES.forEach(function(ctor, i){ - out.indent(); - doitem(ctor); - out.newline(); - }); - }); - } - }; - doitem(AST_Node); - return out + "\n"; -} - -function infer_options(options) { - var result = UglifyJS.minify("", options); - return result.error && result.error.defs; -} - -UglifyJS.default_options = function() { - var defs = {}; - Object.keys(infer_options({ 0: 0 })).forEach(function(component) { - var options = {}; - options[component] = { 0: 0 }; - if (options = infer_options(options)) { - defs[component] = options; - } - }); - return defs; -}; diff --git a/node_modules/uglify-js/tools/props.html b/node_modules/uglify-js/tools/props.html deleted file mode 100644 index f7c777aa..00000000 --- a/node_modules/uglify-js/tools/props.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - diff --git a/node_modules/undefsafe/.github/workflows/release.yml b/node_modules/undefsafe/.github/workflows/release.yml deleted file mode 100644 index e6ee8866..00000000 --- a/node_modules/undefsafe/.github/workflows/release.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Release -on: - push: - branches: - - master -jobs: - release: - name: Release - runs-on: ubuntu-18.04 - steps: - - name: Checkout - uses: actions/checkout@v1 - - name: Setup Node.js - uses: actions/setup-node@v1 - with: - node-version: 16 - - name: Install dependencies - run: npm ci - - name: Test - run: npm run test - - name: Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npx semantic-release diff --git a/node_modules/undefsafe/.jscsrc b/node_modules/undefsafe/.jscsrc deleted file mode 100644 index 9e01c9be..00000000 --- a/node_modules/undefsafe/.jscsrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "preset": "node-style-guide", - "requireCapitalizedComments": null, - "requireSpacesInAnonymousFunctionExpression": { - "beforeOpeningCurlyBrace": true, - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "excludeFiles": ["node_modules/**"], - "disallowSpacesInFunction": null -} diff --git a/node_modules/undefsafe/.jshintrc b/node_modules/undefsafe/.jshintrc deleted file mode 100644 index b47f672f..00000000 --- a/node_modules/undefsafe/.jshintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "browser": false, - "camelcase": true, - "curly": true, - "devel": true, - "eqeqeq": true, - "forin": true, - "indent": 2, - "noarg": true, - "node": true, - "quotmark": "single", - "undef": true, - "strict": false, - "unused": true -} - diff --git a/node_modules/undefsafe/.travis.yml b/node_modules/undefsafe/.travis.yml deleted file mode 100644 index a1ace24a..00000000 --- a/node_modules/undefsafe/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: node_js -cache: - directories: - - node_modules -notifications: - email: false -node_js: - - '4' -before_install: - - npm i -g npm@^2.0.0 -before_script: - - npm prune -after_success: - - npm run semantic-release -branches: - except: - - "/^v\\d+\\.\\d+\\.\\d+$/" diff --git a/node_modules/undefsafe/LICENSE b/node_modules/undefsafe/LICENSE deleted file mode 100644 index caaf03ae..00000000 --- a/node_modules/undefsafe/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright © 2016 Remy Sharp, http://remysharp.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/undefsafe/README.md b/node_modules/undefsafe/README.md deleted file mode 100644 index 46a706bc..00000000 --- a/node_modules/undefsafe/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# undefsafe - -Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined" - -Can also be used to safely set deep values. - -## Usage - -```js -var object = { - a: { - b: { - c: 1, - d: [1,2,3], - e: 'remy' - } - } -}; - -console.log(undefsafe(object, 'a.b.e')); // "remy" -console.log(undefsafe(object, 'a.b.not.found')); // undefined -``` - -Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console) - -## Setting - -```js -var object = { - a: { - b: [1,2,3] - } -}; - -// modified object -var res = undefsafe(object, 'a.b.0', 10); - -console.log(object); // { a: { b: [10, 2, 3] } } -console.log(res); // 1 - previous value -``` - -## Star rules in paths - -As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element. - -The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data: - -```js -const githubData = { - commits: [{ - modified: [ - "one", - "two" - ] - }, /* ... */ ] - }; - -// first modified file found in the first commit -console.log(undefsafe(githubData, 'commits.*.modified.0')); - -// returns `two` or undefined if not found -console.log(undefsafe(githubData, 'commits.*.modified.*', 'two')); -``` diff --git a/node_modules/undefsafe/example.js b/node_modules/undefsafe/example.js deleted file mode 100644 index ed93c23b..00000000 --- a/node_modules/undefsafe/example.js +++ /dev/null @@ -1,14 +0,0 @@ -var undefsafe = require('undefsafe'); - -var object = { - a: { - b: { - c: 1, - d: [1, 2, 3], - e: 'remy' - } - } -}; - -console.log(undefsafe(object, 'a.b.e')); // "remy" -console.log(undefsafe(object, 'a.b.not.found')); // undefined diff --git a/node_modules/undefsafe/lib/undefsafe.js b/node_modules/undefsafe/lib/undefsafe.js deleted file mode 100644 index 74468780..00000000 --- a/node_modules/undefsafe/lib/undefsafe.js +++ /dev/null @@ -1,125 +0,0 @@ -'use strict'; - -function undefsafe(obj, path, value, __res) { - // I'm not super keen on this private function, but it's because - // it'll also be use in the browser and I wont *one* function exposed - function split(path) { - var res = []; - var level = 0; - var key = ''; - - for (var i = 0; i < path.length; i++) { - var c = path.substr(i, 1); - - if (level === 0 && (c === '.' || c === '[')) { - if (c === '[') { - level++; - i++; - c = path.substr(i, 1); - } - - if (key) { - // the first value could be a string - res.push(key); - } - key = ''; - continue; - } - - if (c === ']') { - level--; - key = key.slice(0, -1); - continue; - } - - key += c; - } - - res.push(key); - - return res; - } - - // bail if there's nothing - if (obj === undefined || obj === null) { - return undefined; - } - - var parts = split(path); - var key = null; - var type = typeof obj; - var root = obj; - var parent = obj; - - var star = - parts.filter(function(_) { - return _ === '*'; - }).length > 0; - - // we're dealing with a primitive - if (type !== 'object' && type !== 'function') { - return obj; - } else if (path.trim() === '') { - return obj; - } - - key = parts[0]; - var i = 0; - for (; i < parts.length; i++) { - key = parts[i]; - parent = obj; - - if (key === '*') { - // loop through each property - var prop = ''; - var res = __res || []; - - for (prop in parent) { - var shallowObj = undefsafe( - obj[prop], - parts.slice(i + 1).join('.'), - value, - res - ); - if (shallowObj && shallowObj !== res) { - if ((value && shallowObj === value) || value === undefined) { - if (value !== undefined) { - return shallowObj; - } - - res.push(shallowObj); - } - } - } - - if (res.length === 0) { - return undefined; - } - - return res; - } - - if (Object.getOwnPropertyNames(obj).indexOf(key) == -1) { - return undefined; - } - - obj = obj[key]; - if (obj === undefined || obj === null) { - break; - } - } - - // if we have a null object, make sure it's the one the user was after, - // if it's not (i.e. parts has a length) then give undefined back. - if (obj === null && i !== parts.length - 1) { - obj = undefined; - } else if (!star && value) { - key = path.split('.').pop(); - parent[key] = value; - } - return obj; -} - -if (typeof module !== 'undefined') { - module.exports = undefsafe; -} diff --git a/node_modules/undefsafe/package.json b/node_modules/undefsafe/package.json deleted file mode 100644 index a4542332..00000000 --- a/node_modules/undefsafe/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "undefsafe", - "description": "Undefined safe way of extracting object properties", - "main": "lib/undefsafe.js", - "tonicExampleFilename": "example.js", - "directories": { - "test": "test" - }, - "scripts": { - "test": "tap test/**/*.test.js -R spec", - "cover": "tap test/*.test.js --cov --coverage-report=lcov", - "semantic-release": "semantic-release" - }, - "prettier": { - "trailingComma": "none", - "singleQuote": true - }, - "repository": { - "type": "git", - "url": "https://github.com/remy/undefsafe.git" - }, - "keywords": [ - "undefined" - ], - "author": "Remy Sharp", - "license": "MIT", - "devDependencies": { - "semantic-release": "^18.0.0", - "tap": "^5.7.1", - "tap-only": "0.0.5" - }, - "dependencies": {}, - "version": "2.0.5" -} diff --git a/node_modules/unpipe/HISTORY.md b/node_modules/unpipe/HISTORY.md deleted file mode 100644 index 85e0f8d7..00000000 --- a/node_modules/unpipe/HISTORY.md +++ /dev/null @@ -1,4 +0,0 @@ -1.0.0 / 2015-06-14 -================== - - * Initial release diff --git a/node_modules/unpipe/LICENSE b/node_modules/unpipe/LICENSE deleted file mode 100644 index aed01382..00000000 --- a/node_modules/unpipe/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/unpipe/README.md b/node_modules/unpipe/README.md deleted file mode 100644 index e536ad2c..00000000 --- a/node_modules/unpipe/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# unpipe - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Unpipe a stream from all destinations. - -## Installation - -```sh -$ npm install unpipe -``` - -## API - -```js -var unpipe = require('unpipe') -``` - -### unpipe(stream) - -Unpipes all destinations from a given stream. With stream 2+, this is -equivalent to `stream.unpipe()`. When used with streams 1 style streams -(typically Node.js 0.8 and below), this module attempts to undo the -actions done in `stream.pipe(dest)`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/unpipe.svg -[npm-url]: https://npmjs.org/package/unpipe -[node-image]: https://img.shields.io/node/v/unpipe.svg -[node-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg -[travis-url]: https://travis-ci.org/stream-utils/unpipe -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg -[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master -[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg -[downloads-url]: https://npmjs.org/package/unpipe diff --git a/node_modules/unpipe/index.js b/node_modules/unpipe/index.js deleted file mode 100644 index 15c3d97a..00000000 --- a/node_modules/unpipe/index.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * unpipe - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = unpipe - -/** - * Determine if there are Node.js pipe-like data listeners. - * @private - */ - -function hasPipeDataListeners(stream) { - var listeners = stream.listeners('data') - - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].name === 'ondata') { - return true - } - } - - return false -} - -/** - * Unpipe a stream from all destinations. - * - * @param {object} stream - * @public - */ - -function unpipe(stream) { - if (!stream) { - throw new TypeError('argument stream is required') - } - - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - if (!hasPipeDataListeners(stream)) { - return - } - - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/node_modules/unpipe/package.json b/node_modules/unpipe/package.json deleted file mode 100644 index a2b73583..00000000 --- a/node_modules/unpipe/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "unpipe", - "description": "Unpipe a stream from all destinations", - "version": "1.0.0", - "author": "Douglas Christopher Wilson ", - "license": "MIT", - "repository": "stream-utils/unpipe", - "devDependencies": { - "istanbul": "0.3.15", - "mocha": "2.2.5", - "readable-stream": "1.1.13" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - } -} diff --git a/node_modules/upper-case/LICENSE b/node_modules/upper-case/LICENSE deleted file mode 100644 index 983fbe8a..00000000 --- a/node_modules/upper-case/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/upper-case/README.md b/node_modules/upper-case/README.md deleted file mode 100644 index 7e23978c..00000000 --- a/node_modules/upper-case/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Upper Case - -[![NPM version][npm-image]][npm-url] -[![NPM downloads][downloads-image]][downloads-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] - -Upper case a string. - -Supports Unicode (non-ASCII characters) and non-string entities, such as objects with a `toString` property, numbers and booleans. Empty values (`null` and `undefined`) will result in an empty string. - -## Installation - -``` -npm install upper-case --save -``` - -## Usage - -```js -var upperCase = require('upper-case') - -upperCase(null) //=> "" -upperCase('string') //=> "STRING" -upperCase('string', 'tr') //=> "STRİNG" - -upperCase({ toString: function () { return 'test' } }) //=> "TEST" -``` - -## Typings - -Includes a [TypeScript definition](upper-case.d.ts). - -## License - -MIT - -[npm-image]: https://img.shields.io/npm/v/upper-case.svg?style=flat -[npm-url]: https://npmjs.org/package/upper-case -[downloads-image]: https://img.shields.io/npm/dm/upper-case.svg?style=flat -[downloads-url]: https://npmjs.org/package/upper-case -[travis-image]: https://img.shields.io/travis/blakeembrey/upper-case.svg?style=flat -[travis-url]: https://travis-ci.org/blakeembrey/upper-case -[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/upper-case.svg?style=flat -[coveralls-url]: https://coveralls.io/r/blakeembrey/upper-case?branch=master diff --git a/node_modules/upper-case/package.json b/node_modules/upper-case/package.json deleted file mode 100644 index d21476ff..00000000 --- a/node_modules/upper-case/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "upper-case", - "version": "1.1.3", - "description": "Upper case a string", - "main": "upper-case.js", - "typings": "upper-case.d.ts", - "files": [ - "upper-case.js", - "upper-case.d.ts", - "LICENSE" - ], - "scripts": { - "lint": "standard", - "test-std": "mocha -- -R spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -R spec --bail", - "test": "npm run lint && npm run test-cov" - }, - "standard": { - "ignore": [ - "coverage/**", - "node_modules/**", - "bower_components/**" - ] - }, - "repository": { - "type": "git", - "url": "git://github.com/blakeembrey/upper-case.git" - }, - "keywords": [ - "cases", - "upper", - "uppercase", - "case" - ], - "author": { - "name": "Blake Embrey", - "email": "hello@blakeembrey.com", - "url": "http://blakeembrey.me" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/blakeembrey/upper-case/issues" - }, - "homepage": "https://github.com/blakeembrey/upper-case", - "devDependencies": { - "istanbul": "^0.3.5", - "mocha": "^2.1.0", - "pre-commit": "^1.0.2", - "standard": "^2.4.5" - } -} diff --git a/node_modules/upper-case/upper-case.d.ts b/node_modules/upper-case/upper-case.d.ts deleted file mode 100644 index a3e83b3c..00000000 --- a/node_modules/upper-case/upper-case.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare function upperCase (value: string, locale?: string): string; - -export = upperCase; diff --git a/node_modules/upper-case/upper-case.js b/node_modules/upper-case/upper-case.js deleted file mode 100644 index 768a3875..00000000 --- a/node_modules/upper-case/upper-case.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Special language-specific overrides. - * - * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt - * - * @type {Object} - */ -var LANGUAGES = { - tr: { - regexp: /[\u0069]/g, - map: { - '\u0069': '\u0130' - } - }, - az: { - regexp: /[\u0069]/g, - map: { - '\u0069': '\u0130' - } - }, - lt: { - regexp: /[\u0069\u006A\u012F]\u0307|\u0069\u0307[\u0300\u0301\u0303]/g, - map: { - '\u0069\u0307': '\u0049', - '\u006A\u0307': '\u004A', - '\u012F\u0307': '\u012E', - '\u0069\u0307\u0300': '\u00CC', - '\u0069\u0307\u0301': '\u00CD', - '\u0069\u0307\u0303': '\u0128' - } - } -} - -/** - * Upper case a string. - * - * @param {String} str - * @return {String} - */ -module.exports = function (str, locale) { - var lang = LANGUAGES[locale] - - str = str == null ? '' : String(str) - - if (lang) { - str = str.replace(lang.regexp, function (m) { return lang.map[m] }) - } - - return str.toUpperCase() -} diff --git a/node_modules/uri-js/LICENSE b/node_modules/uri-js/LICENSE deleted file mode 100755 index 9338bde8..00000000 --- a/node_modules/uri-js/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100755 index 43e648bb..00000000 --- a/node_modules/uri-js/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# 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 deleted file mode 100755 index da51e235..00000000 --- a/node_modules/uri-js/dist/es5/uri.all.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100755 index 0706116f..00000000 --- a/node_modules/uri-js/dist/es5/uri.all.js +++ /dev/null @@ -1,1443 +0,0 @@ -/** @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 deleted file mode 100755 index 5b30c4e2..00000000 --- a/node_modules/uri-js/dist/es5/uri.all.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index da51e235..00000000 --- a/node_modules/uri-js/dist/es5/uri.all.min.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100755 index fcd84586..00000000 --- a/node_modules/uri-js/dist/es5/uri.all.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/** @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 deleted file mode 100755 index f6be7603..00000000 --- a/node_modules/uri-js/dist/esnext/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./uri"; diff --git a/node_modules/uri-js/dist/esnext/index.js b/node_modules/uri-js/dist/esnext/index.js deleted file mode 100755 index e3531b5b..00000000 --- a/node_modules/uri-js/dist/esnext/index.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100755 index 0971f6eb..00000000 --- a/node_modules/uri-js/dist/esnext/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index c91cdacb..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-iri.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100755 index 34e7de98..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-iri.js +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100755 index 2269c580..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-iri.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index 6096bda5..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-uri.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100755 index 1cc659f1..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-uri.js +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100755 index cb028b80..00000000 --- a/node_modules/uri-js/dist/esnext/regexps-uri.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index fe5b2f35..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/http.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100755 index 6abf0fe6..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/http.js +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100755 index 82118970..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/http.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index fe5b2f35..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/https.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100755 index ec4b6e76..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/https.js +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100755 index 385b8efe..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/https.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index e2aefc2a..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100755 index 2553713c..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/mailto.js +++ /dev/null @@ -1,148 +0,0 @@ -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 deleted file mode 100755 index 82dba9a1..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/mailto.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAa9D,MAAM,CAAC,GAAiB,EAAE,CAAC;AAC3B,MAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,UAAU;AACV,MAAM,YAAY,GAAG,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,2EAA2E,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AACjJ,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAE,kBAAkB;AACnD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAE,UAAU;AAE7O,qEAAqE;AACrE,yFAAyF;AACzF,+BAA+B;AAC/B,uGAAuG;AACvG,+GAA+G;AAC/G,kCAAkC;AAClC,+BAA+B;AAC/B,wGAAwG;AACxG,8EAA8E;AAC9E,8FAA8F;AAC9F,mGAAmG;AACnG,MAAM,OAAO,GAAG,uDAAuD,CAAC;AACxE,MAAM,OAAO,GAAG,4DAA4D,CAAC;AAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACnF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;AAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC;AACvD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;AAE/D,UAAU;AACV,MAAM,cAAc,GAAG,0BAA0B,CAAC,CAAE,oBAAoB;AACxE,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,aAAa,CAAC,CAAC;AAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,GAAG,GAAG,GAAG,KAAK,GAAG,cAAc,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;AACpF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC;AAClE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC;AACzD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AAClE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC;AACnD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE1E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAClD,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AACzF,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AACrG,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AACvC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;AAElD,0BAA0B,GAAU;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,GAAuC;IACnD,MAAM,EAAG,QAAQ;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,gBAAgB,GAAG,UAA8B,CAAC;QACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjG,gBAAgB,CAAC,IAAI,GAAG,SAAS,CAAC;QAElC,IAAI,gBAAgB,CAAC,KAAK,EAAE;YAC3B,IAAI,cAAc,GAAG,KAAK,CAAA;YAC1B,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;gBACjD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAErC,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE;oBAClB,KAAK,IAAI;wBACR,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;4BACjD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;yBACpB;wBACD,MAAM;oBACP,KAAK,SAAS;wBACb,gBAAgB,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACjE,MAAM;oBACP,KAAK,MAAM;wBACV,gBAAgB,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAC9D,MAAM;oBACP;wBACC,cAAc,GAAG,IAAI,CAAC;wBACtB,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACvF,MAAM;iBACP;aACD;YAED,IAAI,cAAc;gBAAE,gBAAgB,CAAC,OAAO,GAAG,OAAO,CAAC;SACvD;QAED,gBAAgB,CAAC,KAAK,GAAG,SAAS,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAErC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBAC5B,kCAAkC;gBAClC,IAAI;oBACH,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;iBAC9E;gBAAC,OAAO,CAAC,EAAE;oBACX,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,IAAI,0EAA0E,GAAG,CAAC,CAAC;iBAClI;aACD;iBAAM;gBACN,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;aAC5D;YAED,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;QAED,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAED,SAAS,EAAG,UAAU,gBAAiC,EAAE,OAAkB;QAC1E,MAAM,UAAU,GAAG,gBAAiC,CAAC;QACrD,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,EAAE;YACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;gBAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBACxJ,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAErC,0BAA0B;gBAC1B,IAAI;oBACH,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC1H;gBAAC,OAAO,CAAC,EAAE;oBACX,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,sDAAsD,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;iBAC7J;gBAED,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;aACjC;YAED,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC/B;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC;QAE1E,IAAI,gBAAgB,CAAC,OAAO;YAAE,OAAO,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC5E,IAAI,gBAAgB,CAAC,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAEnE,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CACV,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;oBAC7G,GAAG;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CACvH,CAAC;aACF;SACD;QACD,IAAI,MAAM,CAAC,MAAM,EAAE;YAClB,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACpC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAA;AAED,eAAe,OAAO,CAAC"} \ 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 deleted file mode 100755 index e75f2e79..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100755 index d1fce495..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100755 index 3b7a8b3a..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index 7e0c2fba..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100755 index 5d3f10aa..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn.js +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100755 index ea43b0be..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/urn.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index 47f4835b..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/ws.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100755 index 9277f035..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/ws.js +++ /dev/null @@ -1,41 +0,0 @@ -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 deleted file mode 100755 index 186818cc..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/ws.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index fe5b2f35..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/wss.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100755 index d1e22ccd..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/wss.js +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100755 index e19006d9..00000000 --- a/node_modules/uri-js/dist/esnext/schemes/wss.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index da51e235..00000000 --- a/node_modules/uri-js/dist/esnext/uri.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100755 index 659ce265..00000000 --- a/node_modules/uri-js/dist/esnext/uri.js +++ /dev/null @@ -1,480 +0,0 @@ -/** - * 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 deleted file mode 100755 index 2e72ab18..00000000 --- a/node_modules/uri-js/dist/esnext/uri.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index 7c128575..00000000 --- a/node_modules/uri-js/dist/esnext/util.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100755 index 072711ef..00000000 --- a/node_modules/uri-js/dist/esnext/util.js +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100755 index 05d9df02..00000000 --- a/node_modules/uri-js/dist/esnext/util.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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 deleted file mode 100755 index de95d91a..00000000 --- a/node_modules/uri-js/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "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 deleted file mode 100755 index 3c42ded1..00000000 --- a/node_modules/uri-js/yarn.lock +++ /dev/null @@ -1,2558 +0,0 @@ -# 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/utils-merge/.npmignore b/node_modules/utils-merge/.npmignore deleted file mode 100644 index 3e538441..00000000 --- a/node_modules/utils-merge/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -CONTRIBUTING.md -Makefile -docs/ -examples/ -reports/ -test/ - -.jshintrc -.travis.yml diff --git a/node_modules/utils-merge/LICENSE b/node_modules/utils-merge/LICENSE deleted file mode 100644 index 76f6d083..00000000 --- a/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2017 Jared Hanson - -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/utils-merge/README.md b/node_modules/utils-merge/README.md deleted file mode 100644 index 0cb71171..00000000 --- a/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -[![Version](https://img.shields.io/npm/v/utils-merge.svg?label=version)](https://www.npmjs.com/package/utils-merge) -[![Build](https://img.shields.io/travis/jaredhanson/utils-merge.svg)](https://travis-ci.org/jaredhanson/utils-merge) -[![Quality](https://img.shields.io/codeclimate/github/jaredhanson/utils-merge.svg?label=quality)](https://codeclimate.com/github/jaredhanson/utils-merge) -[![Coverage](https://img.shields.io/coveralls/jaredhanson/utils-merge.svg)](https://coveralls.io/r/jaredhanson/utils-merge) -[![Dependencies](https://img.shields.io/david/jaredhanson/utils-merge.svg)](https://david-dm.org/jaredhanson/utils-merge) - - -Merges the properties from a source object into a destination object. - -## Install - -```bash -$ npm install utils-merge -``` - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013-2017 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> - - Sponsor diff --git a/node_modules/utils-merge/index.js b/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c694..00000000 --- a/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/node_modules/utils-merge/package.json b/node_modules/utils-merge/package.json deleted file mode 100644 index e36b0781..00000000 --- a/node_modules/utils-merge/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.1", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "license": "MIT", - "licenses": [ - { - "type": "MIT", - "url": "http://opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "make-node": "0.3.x", - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - }, - "scripts": { - "test": "node_modules/.bin/mocha --reporter spec --require test/bootstrap/node test/*.test.js" - } -} diff --git a/node_modules/uuid/AUTHORS b/node_modules/uuid/AUTHORS deleted file mode 100644 index 5a105230..00000000 --- a/node_modules/uuid/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -Robert Kieffer -Christoph Tavan -AJ ONeal -Vincent Voyer -Roman Shtylman diff --git a/node_modules/uuid/CHANGELOG.md b/node_modules/uuid/CHANGELOG.md deleted file mode 100644 index f811b8a0..00000000 --- a/node_modules/uuid/CHANGELOG.md +++ /dev/null @@ -1,119 +0,0 @@ -# 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 deleted file mode 100644 index 8c84e398..00000000 --- a/node_modules/uuid/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 1752e475..00000000 --- a/node_modules/uuid/README.md +++ /dev/null @@ -1,276 +0,0 @@ - - -# 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/bin/uuid b/node_modules/uuid/bin/uuid deleted file mode 100755 index 502626e6..00000000 --- a/node_modules/uuid/bin/uuid +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env node -var assert = require('assert'); - -function usage() { - console.log('Usage:'); - console.log(' uuid'); - console.log(' uuid v1'); - console.log(' uuid v3 '); - console.log(' uuid v4'); - console.log(' uuid v5 '); - console.log(' uuid --help'); - console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122'); -} - -var args = process.argv.slice(2); - -if (args.indexOf('--help') >= 0) { - usage(); - process.exit(0); -} -var version = args.shift() || 'v4'; - -switch (version) { - case 'v1': - var uuidV1 = require('../v1'); - console.log(uuidV1()); - break; - - case 'v3': - var uuidV3 = require('../v3'); - - var name = args.shift(); - var namespace = args.shift(); - assert(name != null, 'v3 name not specified'); - assert(namespace != null, 'v3 namespace not specified'); - - if (namespace == 'URL') namespace = uuidV3.URL; - if (namespace == 'DNS') namespace = uuidV3.DNS; - - console.log(uuidV3(name, namespace)); - break; - - case 'v4': - var uuidV4 = require('../v4'); - console.log(uuidV4()); - break; - - case 'v5': - var uuidV5 = require('../v5'); - - var name = args.shift(); - var namespace = args.shift(); - assert(name != null, 'v5 name not specified'); - assert(namespace != null, 'v5 namespace not specified'); - - if (namespace == 'URL') namespace = uuidV5.URL; - if (namespace == 'DNS') namespace = uuidV5.DNS; - - console.log(uuidV5(name, namespace)); - break; - - default: - usage(); - process.exit(1); -} diff --git a/node_modules/uuid/index.js b/node_modules/uuid/index.js deleted file mode 100644 index e96791ab..00000000 --- a/node_modules/uuid/index.js +++ /dev/null @@ -1,8 +0,0 @@ -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/lib/bytesToUuid.js b/node_modules/uuid/lib/bytesToUuid.js deleted file mode 100644 index 24b60412..00000000 --- a/node_modules/uuid/lib/bytesToUuid.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ -var byteToHex = []; -for (var i = 0; i < 256; ++i) { - byteToHex[i] = (i + 0x100).toString(16).substr(1); -} - -function bytesToUuid(buf, offset) { - var i = offset || 0; - var bth = byteToHex; - // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4 - return ([ - bth[buf[i++]], bth[buf[i++]], - bth[buf[i++]], bth[buf[i++]], '-', - bth[buf[i++]], bth[buf[i++]], '-', - bth[buf[i++]], bth[buf[i++]], '-', - bth[buf[i++]], bth[buf[i++]], '-', - bth[buf[i++]], bth[buf[i++]], - bth[buf[i++]], bth[buf[i++]], - bth[buf[i++]], bth[buf[i++]] - ]).join(''); -} - -module.exports = bytesToUuid; diff --git a/node_modules/uuid/lib/md5-browser.js b/node_modules/uuid/lib/md5-browser.js deleted file mode 100644 index 9b3b6c7e..00000000 --- a/node_modules/uuid/lib/md5-browser.js +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Browser-compatible JavaScript MD5 - * - * Modification of JavaScript MD5 - * https://github.com/blueimp/JavaScript-MD5 - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - * - * Based on - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -'use strict'; - -function md5(bytes) { - if (typeof(bytes) == 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - bytes = new Array(msg.length); - for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); - } - - return md5ToHexEncodedArray( - wordsToMd5( - bytesToWords(bytes) - , bytes.length * 8) - ); -} - - -/* -* Convert an array of little-endian words to an array of bytes -*/ -function md5ToHexEncodedArray(input) { - var i; - var x; - var output = []; - var length32 = input.length * 32; - var hexTab = '0123456789abcdef'; - var hex; - - for (i = 0; i < length32; i += 8) { - x = (input[i >> 5] >>> (i % 32)) & 0xFF; - - hex = parseInt(hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F), 16); - - output.push(hex); - } - return output; -} - -/* -* Calculate the MD5 of an array of little-endian words, and a bit length. -*/ -function wordsToMd5(x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << (len % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var i; - var olda; - var oldb; - var oldc; - var oldd; - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - - var d = 271733878; - - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - - a = md5ff(a, b, c, d, x[i], 7, -680876936); - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); - - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5gg(b, c, d, a, x[i], 20, -373897302); - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); - - a = md5hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5hh(d, a, b, c, x[i], 11, -358537222); - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); - - a = md5ii(a, b, c, d, x[i], 6, -198630844); - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); - - a = safeAdd(a, olda); - b = safeAdd(b, oldb); - c = safeAdd(c, oldc); - d = safeAdd(d, oldd); - } - return [a, b, c, d]; -} - -/* -* Convert an array bytes to an array of little-endian words -* Characters >255 have their high-byte silently ignored. -*/ -function bytesToWords(input) { - var i; - var output = []; - output[(input.length >> 2) - 1] = undefined; - for (i = 0; i < output.length; i += 1) { - output[i] = 0; - } - var length8 = input.length * 8; - for (i = 0; i < length8; i += 8) { - output[i >> 5] |= (input[(i / 8)] & 0xFF) << (i % 32); - } - - return output; -} - -/* -* Add integers, wrapping at 2^32. This uses 16-bit operations internally -* to work around bugs in some JS interpreters. -*/ -function safeAdd(x, y) { - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); -} - -/* -* Bitwise rotate a 32-bit number to the left. -*/ -function bitRotateLeft(num, cnt) { - return (num << cnt) | (num >>> (32 - cnt)); -} - -/* -* These functions implement the four basic operations the algorithm uses. -*/ -function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); -} -function md5ff(a, b, c, d, x, s, t) { - return md5cmn((b & c) | ((~b) & d), a, b, x, s, t); -} -function md5gg(a, b, c, d, x, s, t) { - return md5cmn((b & d) | (c & (~d)), a, b, x, s, t); -} -function md5hh(a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t); -} -function md5ii(a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | (~d)), a, b, x, s, t); -} - -module.exports = md5; diff --git a/node_modules/uuid/lib/md5.js b/node_modules/uuid/lib/md5.js deleted file mode 100644 index 7044b872..00000000 --- a/node_modules/uuid/lib/md5.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -var crypto = require('crypto'); - -function md5(bytes) { - if (typeof Buffer.from === 'function') { - // Modern Buffer API - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } - } else { - // Pre-v4 Buffer API - if (Array.isArray(bytes)) { - bytes = new Buffer(bytes); - } else if (typeof bytes === 'string') { - bytes = new Buffer(bytes, 'utf8'); - } - } - - return crypto.createHash('md5').update(bytes).digest(); -} - -module.exports = md5; diff --git a/node_modules/uuid/lib/rng-browser.js b/node_modules/uuid/lib/rng-browser.js deleted file mode 100644 index 6361fb81..00000000 --- a/node_modules/uuid/lib/rng-browser.js +++ /dev/null @@ -1,34 +0,0 @@ -// Unique ID creation requires a high quality random # generator. In the -// browser this is a little complicated due to unknown quality of Math.random() -// and inconsistent support for the `crypto` API. We do the best we can via -// feature-detection - -// getRandomValues needs to be invoked in a context where "this" is a Crypto -// implementation. Also, find the complete implementation of crypto on IE11. -var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) || - (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto)); - -if (getRandomValues) { - // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto - var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef - - module.exports = function whatwgRNG() { - getRandomValues(rnds8); - return rnds8; - }; -} else { - // Math.random()-based (RNG) - // - // If all else fails, use Math.random(). It's fast, but is of unspecified - // quality. - var rnds = new Array(16); - - module.exports = function mathRNG() { - for (var i = 0, r; i < 16; i++) { - if ((i & 0x03) === 0) r = Math.random() * 0x100000000; - rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; - } - - return rnds; - }; -} diff --git a/node_modules/uuid/lib/rng.js b/node_modules/uuid/lib/rng.js deleted file mode 100644 index 58f0dc9c..00000000 --- a/node_modules/uuid/lib/rng.js +++ /dev/null @@ -1,8 +0,0 @@ -// Unique ID creation requires a high quality random # generator. In node.js -// this is pretty straight-forward - we use the crypto API. - -var crypto = require('crypto'); - -module.exports = function nodeRNG() { - return crypto.randomBytes(16); -}; diff --git a/node_modules/uuid/lib/sha1-browser.js b/node_modules/uuid/lib/sha1-browser.js deleted file mode 100644 index 5758ed75..00000000 --- a/node_modules/uuid/lib/sha1-browser.js +++ /dev/null @@ -1,89 +0,0 @@ -// Adapted from Chris Veness' SHA1 code at -// http://www.movable-type.co.uk/scripts/sha1.html -'use strict'; - -function f(s, x, y, z) { - switch (s) { - case 0: return (x & y) ^ (~x & z); - case 1: return x ^ y ^ z; - case 2: return (x & y) ^ (x & z) ^ (y & z); - case 3: return x ^ y ^ z; - } -} - -function ROTL(x, n) { - return (x << n) | (x>>> (32 - n)); -} - -function sha1(bytes) { - var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; - var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; - - if (typeof(bytes) == 'string') { - var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape - bytes = new Array(msg.length); - for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); - } - - bytes.push(0x80); - - var l = bytes.length/4 + 2; - var N = Math.ceil(l/16); - var M = new Array(N); - - for (var i=0; i>> 0; - e = d; - d = c; - c = ROTL(b, 30) >>> 0; - b = a; - a = T; - } - - H[0] = (H[0] + a) >>> 0; - H[1] = (H[1] + b) >>> 0; - H[2] = (H[2] + c) >>> 0; - H[3] = (H[3] + d) >>> 0; - H[4] = (H[4] + e) >>> 0; - } - - return [ - H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, - H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, - H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, - H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, - H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff - ]; -} - -module.exports = sha1; diff --git a/node_modules/uuid/lib/sha1.js b/node_modules/uuid/lib/sha1.js deleted file mode 100644 index 0b54b250..00000000 --- a/node_modules/uuid/lib/sha1.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -var crypto = require('crypto'); - -function sha1(bytes) { - if (typeof Buffer.from === 'function') { - // Modern Buffer API - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } - } else { - // Pre-v4 Buffer API - if (Array.isArray(bytes)) { - bytes = new Buffer(bytes); - } else if (typeof bytes === 'string') { - bytes = new Buffer(bytes, 'utf8'); - } - } - - return crypto.createHash('sha1').update(bytes).digest(); -} - -module.exports = sha1; diff --git a/node_modules/uuid/lib/v35.js b/node_modules/uuid/lib/v35.js deleted file mode 100644 index 8b066cc5..00000000 --- a/node_modules/uuid/lib/v35.js +++ /dev/null @@ -1,57 +0,0 @@ -var bytesToUuid = require('./bytesToUuid'); - -function uuidToBytes(uuid) { - // Note: We assume we're being passed a valid uuid string - var bytes = []; - uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) { - bytes.push(parseInt(hex, 16)); - }); - - return bytes; -} - -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape - var bytes = new Array(str.length); - for (var i = 0; i < str.length; i++) { - bytes[i] = str.charCodeAt(i); - } - return bytes; -} - -module.exports = function(name, version, hashfunc) { - var generateUUID = function(value, namespace, buf, offset) { - var off = buf && offset || 0; - - if (typeof(value) == 'string') value = stringToBytes(value); - if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace); - - if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); - if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); - - // Per 4.3 - var bytes = hashfunc(namespace.concat(value)); - bytes[6] = (bytes[6] & 0x0f) | version; - bytes[8] = (bytes[8] & 0x3f) | 0x80; - - if (buf) { - for (var idx = 0; idx < 16; ++idx) { - buf[off+idx] = bytes[idx]; - } - } - - return buf || bytesToUuid(bytes); - }; - - // Function#name is not settable on some platforms (#270) - try { - generateUUID.name = name; - } catch (err) { - } - - // Pre-defined namespaces, per Appendix C - generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; - generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; - - return generateUUID; -}; diff --git a/node_modules/uuid/package.json b/node_modules/uuid/package.json deleted file mode 100644 index efc07b8f..00000000 --- a/node_modules/uuid/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "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 deleted file mode 100644 index 8c245de4..00000000 --- a/node_modules/uuid/v1.js +++ /dev/null @@ -1,109 +0,0 @@ -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 deleted file mode 100644 index ee7e14c0..00000000 --- a/node_modules/uuid/v3.js +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 1f07be1c..00000000 --- a/node_modules/uuid/v4.js +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index 4945baf3..00000000 --- a/node_modules/uuid/v5.js +++ /dev/null @@ -1,3 +0,0 @@ -var v35 = require('./lib/v35.js'); -var sha1 = require('./lib/sha1'); -module.exports = v35('v5', 0x50, sha1); diff --git a/node_modules/vary/HISTORY.md b/node_modules/vary/HISTORY.md deleted file mode 100644 index f6cbcf7f..00000000 --- a/node_modules/vary/HISTORY.md +++ /dev/null @@ -1,39 +0,0 @@ -1.1.2 / 2017-09-23 -================== - - * perf: improve header token parsing speed - -1.1.1 / 2017-03-20 -================== - - * perf: hoist regular expression - -1.1.0 / 2015-09-29 -================== - - * Only accept valid field names in the `field` argument - - Ensures the resulting string is a valid HTTP header value - -1.0.1 / 2015-07-08 -================== - - * Fix setting empty header from empty `field` - * perf: enable strict mode - * perf: remove argument reassignments - -1.0.0 / 2014-08-10 -================== - - * Accept valid `Vary` header string as `field` - * Add `vary.append` for low-level string manipulation - * Move to `jshttp` orgainzation - -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE deleted file mode 100644 index 84441fbb..00000000 --- a/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vary/README.md b/node_modules/vary/README.md deleted file mode 100644 index cc000b34..00000000 --- a/node_modules/vary/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# vary - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Manipulate the HTTP Vary header - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install vary -``` - -## API - - - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field, a string of a valid `Vary` -header, or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - - - -```js -// Append "Origin" to the Vary header of the response -vary(res, 'Origin') -``` - -### vary.append(header, field) - -Adds the given header `field` to the `Vary` response header string `header`. -This can be a string of a single field, a string of a valid `Vary` header, -or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. The new header string is returned. - - - -```js -// Get header string appending "Origin" to "Accept, User-Agent" -vary.append('Accept, User-Agent', 'Origin') -``` - -## Examples - -### Updating the Vary header when content is based on it - -```js -var http = require('http') -var vary = require('vary') - -http.createServer(function onRequest (req, res) { - // about to user-agent sniff - vary(res, 'User-Agent') - - var ua = req.headers['user-agent'] || '' - var isMobile = /mobi|android|touch|mini/i.test(ua) - - // serve site, depending on isMobile - res.setHeader('Content-Type', 'text/html') - res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') -}) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/vary.svg -[npm-url]: https://npmjs.org/package/vary -[node-version-image]: https://img.shields.io/node/v/vary.svg -[node-version-url]: https://nodejs.org/en/download -[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg -[travis-url]: https://travis-ci.org/jshttp/vary -[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/vary -[downloads-image]: https://img.shields.io/npm/dm/vary.svg -[downloads-url]: https://npmjs.org/package/vary diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js deleted file mode 100644 index 5b5e7412..00000000 --- a/node_modules/vary/index.js +++ /dev/null @@ -1,149 +0,0 @@ -/*! - * vary - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - */ - -module.exports = vary -module.exports.append = append - -/** - * RegExp to match field-name in RFC 7230 sec 3.2 - * - * field-name = token - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - */ - -var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ - -/** - * Append a field to a vary header. - * - * @param {String} header - * @param {String|Array} field - * @return {String} - * @public - */ - -function append (header, field) { - if (typeof header !== 'string') { - throw new TypeError('header argument is required') - } - - if (!field) { - throw new TypeError('field argument is required') - } - - // get fields array - var fields = !Array.isArray(field) - ? parse(String(field)) - : field - - // assert on invalid field names - for (var j = 0; j < fields.length; j++) { - if (!FIELD_NAME_REGEXP.test(fields[j])) { - throw new TypeError('field argument contains an invalid header name') - } - } - - // existing, unspecified vary - if (header === '*') { - return header - } - - // enumerate current values - var val = header - var vals = parse(header.toLowerCase()) - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - return '*' - } - - for (var i = 0; i < fields.length; i++) { - var fld = fields[i].toLowerCase() - - // append value (case-preserving) - if (vals.indexOf(fld) === -1) { - vals.push(fld) - val = val - ? val + ', ' + fields[i] - : fields[i] - } - } - - return val -} - -/** - * Parse a vary header into an array. - * - * @param {String} header - * @return {Array} - * @private - */ - -function parse (header) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = header.length; i < len; i++) { - switch (header.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - list.push(header.substring(start, end)) - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - list.push(header.substring(start, end)) - - return list -} - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @public - */ - -function vary (res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required') - } - - // get existing header - var val = res.getHeader('Vary') || '' - var header = Array.isArray(val) - ? val.join(', ') - : String(val) - - // set new header - if ((val = append(header, field))) { - res.setHeader('Vary', val) - } -} diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json deleted file mode 100644 index 028f72a9..00000000 --- a/node_modules/vary/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "vary", - "description": "Manipulate the HTTP Vary header", - "version": "1.1.2", - "author": "Douglas Christopher Wilson ", - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": "jshttp/vary", - "devDependencies": { - "beautify-benchmark": "0.2.4", - "benchmark": "2.1.4", - "eslint": "3.19.0", - "eslint-config-standard": "10.2.1", - "eslint-plugin-import": "2.7.0", - "eslint-plugin-markdown": "1.0.0-beta.6", - "eslint-plugin-node": "5.1.1", - "eslint-plugin-promise": "3.5.0", - "eslint-plugin-standard": "3.0.1", - "istanbul": "0.4.5", - "mocha": "2.5.3", - "supertest": "1.1.0" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "bench": "node benchmark/index.js", - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - } -} diff --git a/node_modules/verror/.npmignore b/node_modules/verror/.npmignore deleted file mode 100644 index f14aec80..00000000 --- a/node_modules/verror/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -.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 deleted file mode 100644 index bbb745a2..00000000 --- a/node_modules/verror/CHANGES.md +++ /dev/null @@ -1,28 +0,0 @@ -# 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 deleted file mode 100644 index 750cef8d..00000000 --- a/node_modules/verror/CONTRIBUTING.md +++ /dev/null @@ -1,19 +0,0 @@ -# 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 deleted file mode 100644 index 82a5cb86..00000000 --- a/node_modules/verror/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index c1f0635e..00000000 --- a/node_modules/verror/README.md +++ /dev/null @@ -1,528 +0,0 @@ -# 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/lib/verror.js b/node_modules/verror/lib/verror.js deleted file mode 100644 index 8663ddea..00000000 --- a/node_modules/verror/lib/verror.js +++ /dev/null @@ -1,451 +0,0 @@ -/* - * verror.js: richer JavaScript errors - */ - -var mod_assertplus = require('assert-plus'); -var mod_util = require('util'); - -var mod_extsprintf = require('extsprintf'); -var mod_isError = require('core-util-is').isError; -var sprintf = mod_extsprintf.sprintf; - -/* - * Public interface - */ - -/* So you can 'var VError = require('verror')' */ -module.exports = VError; -/* For compatibility */ -VError.VError = VError; -/* Other exported classes */ -VError.SError = SError; -VError.WError = WError; -VError.MultiError = MultiError; - -/* - * Common function used to parse constructor arguments for VError, WError, and - * SError. Named arguments to this function: - * - * strict force strict interpretation of sprintf arguments, even - * if the options in "argv" don't say so - * - * argv error's constructor arguments, which are to be - * interpreted as described in README.md. For quick - * reference, "argv" has one of the following forms: - * - * [ sprintf_args... ] (argv[0] is a string) - * [ cause, sprintf_args... ] (argv[0] is an Error) - * [ options, sprintf_args... ] (argv[0] is an object) - * - * This function normalizes these forms, producing an object with the following - * properties: - * - * options equivalent to "options" in third form. This will never - * be a direct reference to what the caller passed in - * (i.e., it may be a shallow copy), so it can be freely - * modified. - * - * shortmessage result of sprintf(sprintf_args), taking options.strict - * into account as described in README.md. - */ -function parseConstructorArguments(args) -{ - var argv, options, sprintf_args, shortmessage, k; - - mod_assertplus.object(args, 'args'); - mod_assertplus.bool(args.strict, 'args.strict'); - mod_assertplus.array(args.argv, 'args.argv'); - argv = args.argv; - - /* - * First, figure out which form of invocation we've been given. - */ - if (argv.length === 0) { - options = {}; - sprintf_args = []; - } else if (mod_isError(argv[0])) { - options = { 'cause': argv[0] }; - sprintf_args = argv.slice(1); - } else if (typeof (argv[0]) === 'object') { - options = {}; - for (k in argv[0]) { - options[k] = argv[0][k]; - } - sprintf_args = argv.slice(1); - } else { - mod_assertplus.string(argv[0], - 'first argument to VError, SError, or WError ' + - 'constructor must be a string, object, or Error'); - options = {}; - sprintf_args = argv; - } - - /* - * Now construct the error's message. - * - * extsprintf (which we invoke here with our caller's arguments in order - * to construct this Error's message) is strict in its interpretation of - * values to be processed by the "%s" specifier. The value passed to - * extsprintf must actually be a string or something convertible to a - * String using .toString(). Passing other values (notably "null" and - * "undefined") is considered a programmer error. The assumption is - * that if you actually want to print the string "null" or "undefined", - * then that's easy to do that when you're calling extsprintf; on the - * other hand, if you did NOT want that (i.e., there's actually a bug - * where the program assumes some variable is non-null and tries to - * print it, which might happen when constructing a packet or file in - * some specific format), then it's better to stop immediately than - * produce bogus output. - * - * However, sometimes the bug is only in the code calling VError, and a - * programmer might prefer to have the error message contain "null" or - * "undefined" rather than have the bug in the error path crash the - * program (making the first bug harder to identify). For that reason, - * by default VError converts "null" or "undefined" arguments to their - * string representations and passes those to extsprintf. Programmers - * desiring the strict behavior can use the SError class or pass the - * "strict" option to the VError constructor. - */ - mod_assertplus.object(options); - if (!options.strict && !args.strict) { - sprintf_args = sprintf_args.map(function (a) { - return (a === null ? 'null' : - a === undefined ? 'undefined' : a); - }); - } - - if (sprintf_args.length === 0) { - shortmessage = ''; - } else { - shortmessage = sprintf.apply(null, sprintf_args); - } - - return ({ - 'options': options, - 'shortmessage': shortmessage - }); -} - -/* - * See README.md for reference documentation. - */ -function VError() -{ - var args, obj, parsed, cause, ctor, message, k; - - args = Array.prototype.slice.call(arguments, 0); - - /* - * This is a regrettable pattern, but JavaScript's built-in Error class - * is defined to work this way, so we allow the constructor to be called - * without "new". - */ - if (!(this instanceof VError)) { - obj = Object.create(VError.prototype); - VError.apply(obj, arguments); - return (obj); - } - - /* - * For convenience and backwards compatibility, we support several - * different calling forms. Normalize them here. - */ - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': false - }); - - /* - * If we've been given a name, apply it now. - */ - if (parsed.options.name) { - mod_assertplus.string(parsed.options.name, - 'error\'s "name" must be a string'); - this.name = parsed.options.name; - } - - /* - * For debugging, we keep track of the original short message (attached - * this Error particularly) separately from the complete message (which - * includes the messages of our cause chain). - */ - this.jse_shortmsg = parsed.shortmessage; - message = parsed.shortmessage; - - /* - * If we've been given a cause, record a reference to it and update our - * message appropriately. - */ - cause = parsed.options.cause; - if (cause) { - mod_assertplus.ok(mod_isError(cause), 'cause is not an Error'); - this.jse_cause = cause; - - if (!parsed.options.skipCauseMessage) { - message += ': ' + cause.message; - } - } - - /* - * If we've been given an object with properties, shallow-copy that - * here. We don't want to use a deep copy in case there are non-plain - * objects here, but we don't want to use the original object in case - * the caller modifies it later. - */ - this.jse_info = {}; - if (parsed.options.info) { - for (k in parsed.options.info) { - this.jse_info[k] = parsed.options.info[k]; - } - } - - this.message = message; - Error.call(this, message); - - if (Error.captureStackTrace) { - ctor = parsed.options.constructorOpt || this.constructor; - Error.captureStackTrace(this, ctor); - } - - return (this); -} - -mod_util.inherits(VError, Error); -VError.prototype.name = 'VError'; - -VError.prototype.toString = function ve_toString() -{ - var str = (this.hasOwnProperty('name') && this.name || - this.constructor.name || this.constructor.prototype.name); - if (this.message) - str += ': ' + this.message; - - return (str); -}; - -/* - * This method is provided for compatibility. New callers should use - * VError.cause() instead. That method also uses the saner `null` return value - * when there is no cause. - */ -VError.prototype.cause = function ve_cause() -{ - var cause = VError.cause(this); - return (cause === null ? undefined : cause); -}; - -/* - * Static methods - * - * These class-level methods are provided so that callers can use them on - * instances of Errors that are not VErrors. New interfaces should be provided - * only using static methods to eliminate the class of programming mistake where - * people fail to check whether the Error object has the corresponding methods. - */ - -VError.cause = function (err) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - return (mod_isError(err.jse_cause) ? err.jse_cause : null); -}; - -VError.info = function (err) -{ - var rv, cause, k; - - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - cause = VError.cause(err); - if (cause !== null) { - rv = VError.info(cause); - } else { - rv = {}; - } - - if (typeof (err.jse_info) == 'object' && err.jse_info !== null) { - for (k in err.jse_info) { - rv[k] = err.jse_info[k]; - } - } - - return (rv); -}; - -VError.findCauseByName = function (err, name) -{ - var cause; - - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - mod_assertplus.string(name, 'name'); - mod_assertplus.ok(name.length > 0, 'name cannot be empty'); - - for (cause = err; cause !== null; cause = VError.cause(cause)) { - mod_assertplus.ok(mod_isError(cause)); - if (cause.name == name) { - return (cause); - } - } - - return (null); -}; - -VError.hasCauseWithName = function (err, name) -{ - return (VError.findCauseByName(err, name) !== null); -}; - -VError.fullStack = function (err) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - - var cause = VError.cause(err); - - if (cause) { - return (err.stack + '\ncaused by: ' + VError.fullStack(cause)); - } - - return (err.stack); -}; - -VError.errorFromList = function (errors) -{ - mod_assertplus.arrayOfObject(errors, 'errors'); - - if (errors.length === 0) { - return (null); - } - - errors.forEach(function (e) { - mod_assertplus.ok(mod_isError(e)); - }); - - if (errors.length == 1) { - return (errors[0]); - } - - return (new MultiError(errors)); -}; - -VError.errorForEach = function (err, func) -{ - mod_assertplus.ok(mod_isError(err), 'err must be an Error'); - mod_assertplus.func(func, 'func'); - - if (err instanceof MultiError) { - err.errors().forEach(function iterError(e) { func(e); }); - } else { - func(err); - } -}; - - -/* - * SError is like VError, but stricter about types. You cannot pass "null" or - * "undefined" as string arguments to the formatter. - */ -function SError() -{ - var args, obj, parsed, options; - - args = Array.prototype.slice.call(arguments, 0); - if (!(this instanceof SError)) { - obj = Object.create(SError.prototype); - SError.apply(obj, arguments); - return (obj); - } - - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': true - }); - - options = parsed.options; - VError.call(this, options, '%s', parsed.shortmessage); - - return (this); -} - -/* - * We don't bother setting SError.prototype.name because once constructed, - * SErrors are just like VErrors. - */ -mod_util.inherits(SError, VError); - - -/* - * Represents a collection of errors for the purpose of consumers that generally - * only deal with one error. Callers can extract the individual errors - * contained in this object, but may also just treat it as a normal single - * error, in which case a summary message will be printed. - */ -function MultiError(errors) -{ - mod_assertplus.array(errors, 'list of errors'); - mod_assertplus.ok(errors.length > 0, 'must be at least one error'); - this.ase_errors = errors; - - VError.call(this, { - 'cause': errors[0] - }, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's'); -} - -mod_util.inherits(MultiError, VError); -MultiError.prototype.name = 'MultiError'; - -MultiError.prototype.errors = function me_errors() -{ - return (this.ase_errors.slice(0)); -}; - - -/* - * See README.md for reference details. - */ -function WError() -{ - var args, obj, parsed, options; - - args = Array.prototype.slice.call(arguments, 0); - if (!(this instanceof WError)) { - obj = Object.create(WError.prototype); - WError.apply(obj, args); - return (obj); - } - - parsed = parseConstructorArguments({ - 'argv': args, - 'strict': false - }); - - options = parsed.options; - options['skipCauseMessage'] = true; - VError.call(this, options, '%s', parsed.shortmessage); - - return (this); -} - -mod_util.inherits(WError, VError); -WError.prototype.name = 'WError'; - -WError.prototype.toString = function we_toString() -{ - var str = (this.hasOwnProperty('name') && this.name || - this.constructor.name || this.constructor.prototype.name); - if (this.message) - str += ': ' + this.message; - if (this.jse_cause && this.jse_cause.message) - str += '; caused by ' + this.jse_cause.toString(); - - return (str); -}; - -/* - * For purely historical reasons, WError's cause() function allows you to set - * the cause. - */ -WError.prototype.cause = function we_cause(c) -{ - if (mod_isError(c)) - this.jse_cause = c; - - return (this.jse_cause); -}; diff --git a/node_modules/verror/package.json b/node_modules/verror/package.json deleted file mode 100644 index 79295c57..00000000 --- a/node_modules/verror/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "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/xml-char-classes/index.js b/node_modules/xml-char-classes/index.js deleted file mode 100644 index 8a21138b..00000000 --- a/node_modules/xml-char-classes/index.js +++ /dev/null @@ -1,11 +0,0 @@ -exports.baseChar = /[A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B36-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60\u0D61\u0E01-\u0E2E\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102\u1103\u1105-\u1107\u1109\u110B\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D\u116E\u1172\u1173\u1175\u119E\u11A8\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\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\u2126\u212A\u212B\u212E\u2180-\u2182\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\uAC00-\uD7A3]/; - -exports.ideographic = /[\u3007\u3021-\u3029\u4E00-\u9FA5]/; - -exports.letter = /[A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u0131\u0134-\u013E\u0141-\u0148\u014A-\u017E\u0180-\u01C3\u01CD-\u01F0\u01F4\u01F5\u01FA-\u0217\u0250-\u02A8\u02BB-\u02C1\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03D6\u03DA\u03DC\u03DE\u03E0\u03E2-\u03F3\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E-\u0481\u0490-\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0-\u04EB\u04EE-\u04F5\u04F8\u04F9\u0531-\u0556\u0559\u0561-\u0586\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0641-\u064A\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D3\u06D5\u06E5\u06E6\u0905-\u0939\u093D\u0958-\u0961\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8B\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AE0\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B36-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB5\u0BB7-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CDE\u0CE0\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60\u0D61\u0E01-\u0E2E\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0F40-\u0F47\u0F49-\u0F69\u10A0-\u10C5\u10D0-\u10F6\u1100\u1102\u1103\u1105-\u1107\u1109\u110B\u110C\u110E-\u1112\u113C\u113E\u1140\u114C\u114E\u1150\u1154\u1155\u1159\u115F-\u1161\u1163\u1165\u1167\u1169\u116D\u116E\u1172\u1173\u1175\u119E\u11A8\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BC-\u11C2\u11EB\u11F0\u11F9\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\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\u2126\u212A\u212B\u212E\u2180-\u2182\u3007\u3021-\u3029\u3041-\u3094\u30A1-\u30FA\u3105-\u312C\u4E00-\u9FA5\uAC00-\uD7A3]/; - -exports.combiningChar = /[\u0300-\u0345\u0360\u0361\u0483-\u0486\u0591-\u05A1\u05A3-\u05B9\u05BB-\u05BD\u05BF\u05C1\u05C2\u05C4\u064B-\u0652\u0670\u06D6-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0901-\u0903\u093C\u093E-\u094D\u0951-\u0954\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A02\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A70\u0A71\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0B01-\u0B03\u0B3C\u0B3E-\u0B43\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B82\u0B83\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C01-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C82\u0C83\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D43\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86-\u0F8B\u0F90-\u0F95\u0F97\u0F99-\u0FAD\u0FB1-\u0FB7\u0FB9\u20D0-\u20DC\u20E1\u302A-\u302F\u3099\u309A]/; - -exports.digit = /[0-9\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]/; - -exports.extender = /[\xB7\u02D0\u02D1\u0387\u0640\u0E46\u0EC6\u3005\u3031-\u3035\u309D\u309E\u30FC-\u30FE]/; \ No newline at end of file diff --git a/node_modules/xml-char-classes/package.json b/node_modules/xml-char-classes/package.json deleted file mode 100644 index 91530f27..00000000 --- a/node_modules/xml-char-classes/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "xml-char-classes", - "version": "1.0.0", - "description": "Regular expressions for matching against the XML Character Classes", - "license": "MIT", - "repository": "sindresorhus/xml-char-classes", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "http://sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha", - "prepublish": "node generate.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "xml", - "re", - "regex", - "name", - "element", - "tag", - "match", - "unicode", - "char", - "character", - "classes" - ], - "devDependencies": { - "mocha": "*", - "regenerate": "^0.6.2" - } -} diff --git a/node_modules/xml-char-classes/readme.md b/node_modules/xml-char-classes/readme.md deleted file mode 100644 index c10ed3e4..00000000 --- a/node_modules/xml-char-classes/readme.md +++ /dev/null @@ -1,45 +0,0 @@ -# xml-char-classes [![Build Status](https://travis-ci.org/sindresorhus/xml-char-classes.svg?branch=master)](https://travis-ci.org/sindresorhus/xml-char-classes) - -> Regular expressions for matching against the [XML Character Classes](http://www.w3.org/TR/2006/REC-xml-20060816/#CharClasses) - - -## Install - -```sh -$ npm install --save xml-char-classes -``` - - -## Usage - -```js -var xmlCharClasses = require('xml-char-classes'); - -console.log(xmlCharClasses.digit); -//=> /[0-9\u0660-\u0669\u06F0-\u06F9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE7-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29]/ - -xmlCharClasses.letter.test('unicorn'); -//=> true - -xmlCharClasses.letter.test('#'); -//=> false -``` - - -## API - -### xmlCharClasses - -Contains the following regular expressions for matching the different [character classes](http://www.w3.org/TR/2006/REC-xml-20060816/#CharClasses) in the XML spec. - -- letter -- baseChar -- ideographic -- combiningChar -- digit -- extender - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) From d183130ded24f3b89171f43eefd9a403b3122090 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 11:56:34 +0200 Subject: [PATCH 06/90] added git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e69de29b..3c3629e6 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +node_modules From c2fc6c1686bc308120cdb6066082f742b9255497 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 12:52:17 +0200 Subject: [PATCH 07/90] template done --- app.js | 34 +++++++++++++++++++ public/images/PW2 - Hackaton trans.png | Bin 0 -> 8067 bytes public/images/PW2 - Hackaton.png | Bin 0 -> 9519 bytes views/poemas.ejs => public/scripts/script.js | 0 routes/routes.js | 0 views/poems.ejs | 0 6 files changed, 34 insertions(+) create mode 100644 public/images/PW2 - Hackaton trans.png create mode 100644 public/images/PW2 - Hackaton.png rename views/poemas.ejs => public/scripts/script.js (100%) create mode 100644 routes/routes.js create mode 100644 views/poems.ejs diff --git a/app.js b/app.js index e69de29b..3c410975 100644 --- a/app.js +++ b/app.js @@ -0,0 +1,34 @@ +const express = require('express'); +const app = express(); +const port = 3000; +// let minifyHTML = require('express-minify-html'); +let options = { + maxAge: '2y', + etag: false +} + +// Setup the template engine ejs +app.set('view engine', 'ejs'); +app.set('views', 'views') + +app.use(express.static('public', options)); + +// app.use(minifyHTML({ +// override: true, +// exception_url: false, +// htmlMinifier: { +// removeComments: true, +// collapseWhitespace: true, +// collapseBooleanAttributes: true, +// removeAttributeQuotes: true, +// removeEmptyAttributes: true, +// minifyJS: true +// } +// })); + +var poemsRouter = require('./routes/poemas'); +app.use('/', poemsRouter); + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) \ No newline at end of file diff --git a/public/images/PW2 - Hackaton trans.png b/public/images/PW2 - Hackaton trans.png new file mode 100644 index 0000000000000000000000000000000000000000..adbc0efb3a062c33dcd6ddb42aee5c62625ee02a GIT binary patch literal 8067 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 literal 0 HcmV?d00001 diff --git a/public/images/PW2 - Hackaton.png b/public/images/PW2 - Hackaton.png new file mode 100644 index 0000000000000000000000000000000000000000..360f0520a3bcd3ba672f0a5264a547be28b9675e GIT binary patch literal 9519 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 literal 0 HcmV?d00001 diff --git a/views/poemas.ejs b/public/scripts/script.js similarity index 100% rename from views/poemas.ejs rename to public/scripts/script.js diff --git a/routes/routes.js b/routes/routes.js new file mode 100644 index 00000000..e69de29b diff --git a/views/poems.ejs b/views/poems.ejs new file mode 100644 index 00000000..e69de29b From 5151e13db3aee96f7fd4b841b9c9fc6e008a200e Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 13:02:50 +0200 Subject: [PATCH 08/90] added header and script --- package.json | 2 ++ public/images/favicon.ico | Bin 0 -> 15406 bytes public/styles/{styles.css => style.css} | 0 views/index.ejs | 18 ++++++++++++++++++ views/partials/head.ejs | 10 ++++++++++ 5 files changed, 30 insertions(+) create mode 100644 public/images/favicon.ico rename public/styles/{styles.css => style.css} (100%) diff --git a/package.json b/package.json index 0f98715d..6ff02e35 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "Welcome to the world of poetry with a twist of AI", "main": "index.js", "scripts": { + "start": "node app.js", + "dev": "nodemon app.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7346be9ae3b7b4cddb843d07382274605641867 GIT binary patch literal 15406 zcmeHN+f$QA6#qKyA7CH)&Qr%npZeCB&UD&NTeUdT&e*|rkV_CoELbX4Yg=tCip&(b z*%lF|<<=?%1>_P4Aw`5hxrJLo2o(qykpgl_NPu7WZ2V$yv?dI}Pug5~R+3(jUX-?NlUNxb9e7ESUXvs#Ai(v${bfnI#OikJxYz!wBsIPwN!wW;HiV6E z)wANEzv1Cw2--Xy^!N9py}cbhJw52|?nYZ%8}xcTuQM8rUhBGfU<^OD&hY*ztZX!m zc|F!*8NpTE6y7aa!QR?syi>V?+WrZz$G6-Z$AP`8h)}H{^@jy~d1KzE@rDj764Dm% zMZ*G4#o7>ZdD*A&eLbVd{(S}{_t|4hI99ZXn@k_x+9}~b66!$e>3Mv8(2jqGe4AgB zaRe2`Q_$5+V#vp_-eOcrzlS;nA1cYu1TcDo5&5S_{gfiFz~S3k5c(4O5;m|kHc(w% z4I-^pi>j(B&|ZQ{gTVl`TFu*vii%KCQGv?JO6YVt)Ya8_9T%UrdDI#wkkm4}F7~&u zeE`+f_^_YZsN6Xn(|G;*8j1|J-8wGondEgpxBcs`+vxWnH%{gssCMvu9PQ=yuxG;L zPyXGVR#aY{!nyprc>CfS0?VCl{()+z-}#qaxr6=h!A)Vi*O2o40!+qHY=!=1{>Q(w zAtGfNhoYSv%gGo!O1EJCW&W{0*|@H+F#9|A)gs4`T0HA_{nPwcU7Nyrjf)rAzq)*i z^FNyG!sJi;qjhoX)-YuIC;s*7NzVUBlK=T%XM6vMJ*&vbokJS?4?_RNe!Vcu`Df?P z@;dTOk6XVRZI|c&+8=i?U>ZSj{xnn{tRd>dRT%q6{l-_uEAyvy7xKPq9Y!+Vn#%ir zQ10uGvOzP!?LFzlBGMD)@n_yN`uqGZw?AYN-`twLlhCuW_57%Ff#;>3&Pmu2trW~i zoRcWqR)sGS^CN6P*nqGBVFSVjgbfHAc(!ezrltlOjRvKqrTn}-H#e7`v6qyTU~q5{ z>FMccXlTH|zyLBcGf`Mri2C|^Bqk=JtgH+L1qH~<%R^IB6ECT6b91xb&uL`4qX-7)z!t{dwYBNI4WrjQD0x*mf@G>coxf6 z^BCx?knS&7*qNrMj6>|biPclPo|T?$N_nO`9F%Ve(%8{4XkCZVU>QY7o$EX{vfj3? zO)2=}Wc;;HH~zQS9iDLQ5~6hXNyXmjZV%0m()CXm|BsY}UtM+^S;=$AIzNZV(+=!9 zvxePSs|c&HA(H7|rf{uIk^0X#JI`|!o;fsnru@OBlsR;@kMaD9QrEAHpYjiJ`<;mW z#EEd0{~#GCAMs7J9r_#NP&)pYeNMz*Uc|m)2SR^a#_>42TL!w9)?rqr|CIHA_){ms zuG(GxpZU*rvlYoF7u-3a!Yk8?^#8fP%;0FmG7{pK5K-=mPeJ$me{0h?qW7-wdHD7O zyPK%M_(gf{?k+2OyRG#8P^e{qKA9b;=3@n*#;g6r()WcsJvczl?H^@Gwg>ihPZGbU|LJPC@>oS{;xCpL zj{exSc2$9E&^L}NM(3XTlJQ4CqQCWQ tpTq9c51L05tMAQ{TYP8z`GC-e(1)-AVFSVjo*x@v*Mr1QXkfz{_z%CuFKGY( literal 0 HcmV?d00001 diff --git a/public/styles/styles.css b/public/styles/style.css similarity index 100% rename from public/styles/styles.css rename to public/styles/style.css diff --git a/views/index.ejs b/views/index.ejs index e69de29b..80ca91ef 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -0,0 +1,18 @@ + + + + + <%- include('./partials/head'); %> + + + +
+ <%- include('./partials/header'); %> +
+ +
+ <%- include('./partials/footer'); %> +
+ + + \ No newline at end of file diff --git a/views/partials/head.ejs b/views/partials/head.ejs index e69de29b..46b92662 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -0,0 +1,10 @@ + + + + + + +Dicho di Hubentut + + + \ No newline at end of file From 158fbe57af3ced4c987d16670a7c149a22591f5f Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Tue, 11 Apr 2023 13:10:10 +0200 Subject: [PATCH 09/90] head done and mini fix --- app.js | 4 ++-- routes/poems.js | 11 +++++++++++ routes/routes.js | 0 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 routes/poems.js delete mode 100644 routes/routes.js diff --git a/app.js b/app.js index 3c410975..c79ab2fa 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,6 @@ const express = require('express'); const app = express(); -const port = 3000; +const port = 8000; // let minifyHTML = require('express-minify-html'); let options = { maxAge: '2y', @@ -26,7 +26,7 @@ app.use(express.static('public', options)); // } // })); -var poemsRouter = require('./routes/poemas'); +var poemsRouter = require('./routes/poems'); app.use('/', poemsRouter); app.listen(port, () => { diff --git a/routes/poems.js b/routes/poems.js new file mode 100644 index 00000000..d9aa16fd --- /dev/null +++ b/routes/poems.js @@ -0,0 +1,11 @@ +const express = require('express'); +const request = require('request'); +const router = express.Router(); + +router.get('/', function (req, res) { + res.render('index', { + title: 'Start page' + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/routes.js b/routes/routes.js deleted file mode 100644 index e69de29b..00000000 From 57fd0f8bba84aba9b57ef6bbd0638cce7eb688eb Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 13:26:47 +0200 Subject: [PATCH 10/90] css structure and fonts added --- public/styles/style.css | 44 +++++++++++++++++++++++++++++++++++++++++ views/partials/head.ejs | 6 +++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index e69de29b..76d78de1 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -0,0 +1,44 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +:root { + /*color palette*/ + + --coral-deeppink: #ff4a61; + --orange-yellow: #feb63d; + --light-grey: #e2e2e2; + --black: #000000; + + --title: 'Commissioner', Arial, + Helvetica, + sans-serif; + --text: 'Commissioner', Arial, + Helvetica, + sans-serif; + +} + + +body { + font-family: var(--text); +} + +h1{ + font-family: var(--title); + font-weight: 500; +} + +p{ +font-weight: 400; +} + +li { + list-style: none; +} + +a { + text-decoration: none; +} \ No newline at end of file diff --git a/views/partials/head.ejs b/views/partials/head.ejs index 46b92662..a4e10ae3 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -7,4 +7,8 @@ Dicho di Hubentut - \ No newline at end of file + + + + + \ No newline at end of file From 222cd6f376abbb0a194cbbc9f63781992b5694d7 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:14:53 +0200 Subject: [PATCH 11/90] sketches for readme --- public/images/idee-0.png | Bin 0 -> 854488 bytes public/images/idee-1.png | Bin 0 -> 587789 bytes public/images/idee-2.png | Bin 0 -> 1237790 bytes public/images/idee-3.png | Bin 0 -> 1502975 bytes public/images/loading-state.png | Bin 0 -> 986453 bytes public/images/startpage.png | Bin 0 -> 1379600 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/idee-0.png create mode 100644 public/images/idee-1.png create mode 100644 public/images/idee-2.png create mode 100644 public/images/idee-3.png create mode 100644 public/images/loading-state.png create mode 100644 public/images/startpage.png diff --git a/public/images/idee-0.png b/public/images/idee-0.png new file mode 100644 index 0000000000000000000000000000000000000000..4be1132dae5d291ef551c8abb46a7ca9dfd220f4 GIT binary patch literal 854488 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%0DWGI+Z1*ty9i_+ho4fC`8B}<8U-4s`v6@A z)O*#yMo=|y&xR>5R7>aO!HIpQw<2+3SDQ)=QOK4(?{g~H4`*Rv!6s_o`$9-}=l2=e z$M1oOg~dpLX3Zu3*&r+HxlSJmna=iVL2JbY=yd_U<~Fdo7IaHM0+M-}r@)a)U{mou z170A2Jrxw9tej+W({y!RcW0fBz=}Py=F|P^rC^4`4uQ+2+4(#maDQKQu?-o-$D8O; zZ7T7vRC@nIhmdjkmKxL#uSjeZz;rMmMBVOP^cWOk)Sr^CAI_&#SpO>+otj#h5&m4wZZ0+Bp)%)F#~JRr%ONS4a?RPfa$|GjS))fm z;xhmERULZ1+O*kjk2FX1T1Q*kSpi@n$Z`bCxYcw4f-$MhNFK} z*-o2s8~Z(J`T}!Z9J9)oK*t|xszJH?PaBoE=)A887Isu?8GdgsrU`kdCXX};iF?|PU2{^#4LB49K*jkF+N9MYfdq+FT)ab=2 z3!YwiiG=1rj^nyv?KOM=<8Q%@-3PnGth-@cZjYKG2S|buc;$w6C)q z$;h!lRA|1p&~z;xVz4vqss=bkz;jKWoSvRGD%cOpaG4$FO$U{bP_Hfrpwrz@DuYpzR}#_W)Slk_%YbE{D`MwS`fk{FC_`Z-Db(_OB(m z6~J0YBPVTuR><=1a4AuRT99696sov>+)KR{bDySRZODv;&Uo)feLpN-^eUq&yZA^$?7N z>BX1qZ;)>xv{9IJluwLnzHEGE)qe&X6NY+$$_Us;xJN)+p@ma1S7SwH!*aJu9k(^V zbU|~cq!k?;96XU37!W}%e@O8LJm3sNgw`M*^kVRpAv{U^7>Cw)tIxsNV zr%<`rDrcqZR3eO)+H-6{rsnedt)gP#JL<%J1p;mN;+uui;^IN=D(m4_lcU!VrF>ZU zk_5h-oZ|?M|6%m@U#E_o-0M@rd!>9;aM%=AS68onZ~AA9bCHmcT)}QIjqmm$K+^N0 z3f7$hngWPTVH@;Qt;0(raybB@*uG(Tk_13CI-pQpHC#O()pS}1_R5Z_!=72j*>dBs z&2qxIcA)+S(`Q3q@7v6I#YX?mN%yQJdMWbey(Ru{R#;{h?;t0n||06I~3)=s=J z35om2v+-me_4NXg(n)oMnUz)wG8W0t7Rd2I=Bub<>#w)!9ZdWXIEiDBBrRieg$TGY zZ7Y~8rn)`q%~GMvTD7Oz{Nl4-+GycrjGLwit~MitgawL2nX!t+u`s zD{C5I_3&YWwPv{SMd~uHsKEOmw*%rI$tSbBAI$~awrO|Pw15kdT;zy;}7g0e( zkz0PQ@5A#buW#`Jyh+&DER2Z5Vyn_NmXoGkGRej0CtRBgezqbLB{{;aKM|2=1F2n+ zEZY3j71pU=<>LArwe5^W(`GL^0%wb~ocsWc|J8YZ5TYT5EbkR;c#BPaW2b^zMSXVd6CAGzgD~RebAK^ zs;UH|XvWp+&X2B~@ECS!5Dl+r3HtJllW>ot-WGVo<0ajk&G74^JpfevhNVw`c4JJy`vTFJ+(I2FYPYOhhBq+&`s}} zZT5pv)%P{5ko2<3P*cC<8vGFkB5{2{5u|>07vCaU?%H}fE6iiIu4Z;RH->_U>2=W; zaMtKA0p3B&Y52>)t;)p8Zk<-U3^l*(oKU|3nTLtKe}cIV2oH@!3G0-??-- zh%8fyp`>gwW2=_8r@!?;+fX88MuA!>0@#wU_xxJpD7}ea7wCV%^U6?EG8Yj3sU~=? z+W+{O`FuVN<<;I$zRm%2r@eHu%-)|G3y=`sy5;5NU?CQrRN!)^eg zLrdUHQsH{EISr^jKN}8y{<)8j_=qr2->rQAWWW*vZuHjIVV~P?bSIuli9t}156v<~Oy<@|rwQ#`dLX<9TmIU0&yrOrA#7yD=c^zR(@ZTlm)H zq-B$4w&pYsMFPf438N6r3D-s=gMU-hIGm@(^ypXmj;+@Ej@t;dRX|I@blnIq zl}xXwvYQu4?PuZ$#zd;f_^43N8hokL5U7tL3@t)hYbJ^9yr5{aDoi&hCN)^p_ay(`T_F)3BKCWGm* z2`=s`2EH&ztM-QPhL%r>*I$crg_O@aD$-DG>VCN5cf^D?4<-T_!tC4G>U z`=_`jEA4$fvOb($gX2)Fn6K2!X*pw}&Zm#>I|PFGWXfz!zS_}7xqb)Mg;gUQF{gVa z@HUO(G&(eKI~!Hb*J}&rbRHlF8>r(cye-EIk`2Fqra0^e%hM*sLLZufHj;CgT~{WN zXO#cq(yk`WRDnUgAc>>u`h20R%X3nWb9bE2^Rn{mtEeBXC`lsx^8I%As$TO*-x}3U zZzvjjuAuyOHy}%hoj(~;l{xx2aEDpPkWQmAaN7=L>@EMYcE~NM{*U~h`4*u@^KsX^ ziCLL`dY9NbuxZb6-7v1|yS+b%IOELKdqU;|UwjUA%VW*_}q%k9ZJilTArLg@Wn)#s^c0&d3^ z(~HSTJzf2g9FVYsXoXSt@@r3mye`cn0~0gSTfa0MpA|{iGvWj|OLy{%iWo-KuBmcM z;%k2Q(;|-*%2B5m4d!d3d8YAfh9y9KtqzJHi`>E+iOsQcFhy6ho|U*2%HC%q4zgT7 za0Wwi*ql1uUuKd^;Z>@TwcMO9)W)eSw;CP;LCbKwCd17A(sT3leDmdk>zvCPVfv&Z zM47nb4OkUn;Kvi=BuOU6X`F!v3&6MhoXQ{sxI5mI=d0&`2~on$>f5tds;X@POP2cX zT0zhsFrp@Z1By9N!*^Z&;5^Lw$H$F`@SQ%x;;jK>$@*NyR*-c0W3DBc$A}nkNc1>A zEKaU*JYO>coIb`51jsT=(|1CrAj&M=+F!i+u0|Bv-7>_(?oQW&y_deI4j{TwP$_}< zmG50R{#{cEw^PZfLJ3UdmaELwxw40x_cykO=J8hmxJC&PD#|>b`-47s&;qT*Y8Nf@;t`>Sn@a z_XH4A2Lh_W1Xd!4d92~PCb~^s#MfzhZ3|!2ZgL@8?oM({Z!!ac?6^zIb5)U;#~={u zNH7LYhDvg^17pmM`8rmf{1}60X@3M7gCf1uvIh{$7k37iAwoJg-fbA%8a5Xy&>{+g zWfgc{W7pup$>zpsImT~KRSl212AHo8eQhCFURv@U-mtb7-3|V29sYlRDcD6}1HNT) zSpWwV8UhJg68A?4sE|uRDg54Z47dfUrOwq^f;y}m%p19ZH85LWK_v{5F>(FH`DURy zSb>;l&>6XS0j8l!0B8p*Q@1{3$!upZYchgwiw+?d5kj}bw)yzB^!bLz=bJtUzh{Ht z_Xt+|OaLU$0v^X{6Yda<79Qv{VdSBIy_Dy5G3m}LCC+yy0C(2Y^1h7h&z%0>rZn;XlZ%q$hh zp9~7^`48B{4-g9v2bJ>PcK!m24N8-a%)ru-SGRtTf_G^J*VX|65IT8n$_u@Zo}8Ap zT&4ycSWFljmRjvh*-1UsiUxL@QrXlUB8NVs)CdcgL`y-Yq4@W=rcl2BMY zs`b*E70m^cQsroPG!q|=Hevg#7Hi@(-UWf%z<9YZ0E?G-zAy5O`jXCW9HSAmI(0da zGz^l{Z@sMp@zpv_zE77^Wd}g!Mn>_5-774D0@+ml*`F$P*@_HJ_il+8{})Ll1Q)<= zM=-}j5pwkE29(NN4Zt&)Bg%(5`?}$xi%ZJv;b5vqefb zeb0uRt&M&2Kb;GkNJJY6nN^RRoSUdl`tvCebeWi$`?{j(@XoafnAGlTsNzHdIjH3-V&2D8Qb z0i$`U!>|fkn(k-Wt=AY-KMT85HY?w8K^Q_48pR-Fn-J=Mr&ue3CY8!xw@8V-ni=TTIrK9-u7DxAOq7Y|*nv%QOlA3%@}8CVE*o>R^Hj zjD+n}1WA8c`CH#O_)W4*@MubMOxD{nxBg$U=stkg^uOAfEbRbDf>B!tekqlBIFXQ2 zYcA}z^1A#|k(TaZ$;p-N_A$%;r(;Qu&>86s0{yR&jm%q5$buIdiG$AunBuYMINnx* zWx-rnjQmLQTu+_Tx_rWZ9pj}r$Vb;F-LB%ldD}^Fmfg=xhbDl!ifP%4&7OqUd0@yT z@y&l!ZI_RHMjB4i`0;MP?h=m>AFybVAm0ajSgir1huI7>wp9noVY?LAD}rCHPD5tG z>v`$?i(5DO{okH#CO87_obqjGP}akbWE(IZIl4)PW4pO=3R1#zY59L4*v z_-`-&Gle|{YrzzO`MLgTcTA}V|3si5ht)j)G%R`bB~6ys9GFd(7)EukZ}9&83%#a< zr(quwd(41RsIRA&2UOomS<rAnj$1TTyBr44q(RrQLm!*WU8T|@p((-n~koy zO)rO7`9~rSGnJ!_QQ%!|nKtX(&v!Bryvo4H$(axIyCYy$Y;gx-xCMasyOwfnE>BJW z^AJ9MOx|QBMC5uE2ewY%e}{raf{NeYP>btv+l^fyqw?0_0A1G@0EHGJ{Yp19oSIdE z^n&FgR3?u3aR2hx2d%$8>0f`ye1d>Zz*y81&t8MWG4|%Gq#-HT-r5z%Vhw&xd3zYq zNI!2~4p#>OEq~Bqd=fC+M%a9ZMKUS8oq%lG0_v`EtL>@#ZE~~> zf1TnBL_NRe#qaQ4Pjz#=@PFLFzuq70 z4}weNjbHRqYF+Y0g6=tfzp!Sm{z-Z9vjrP80W(S^2CpD$`3b8>{m}n<)gMnclNSL9 z<0=mMcT%5AJ(yl2YkdR)8nE2hAvU&{mccPnH0(?S=ep#F$uRiLTL&#I;T%Kk4fz-Rt(L{~EY$D1Ft zt_p~@Vcw&`u12=^7@ z!$5=AwqX4?MXx@1jzV7jyWWp_GdzNXH;Jw5 z3Hx+E$))rxQBDkfl}a758|wQjfZU^n2PkjfX5_cXnGef!fv(C5@I&3oMm0gl|(;gugGxPA?9zmY~xMAfU)11>K4k74o*gwR-1`BG-!Dm+mZMHCV zbnjAbu!*AHXak(8_U|99PeVN1r1irm(g5Uugn$8Ttd9_f%@OFdmH8w8yfx<^ zqwO+8)0P!;W+o`V*1D~^p4Bw*IJ);TH(b7hL2aQb>?Fmrgp=0i>MIhoF*4n6;SKL7X#oneB}NGKgi%^;n?w=kw;u{LB|8Kmu^3~qoX zhe;tzx^w%`f&cHXZFuP&6b7(Q{ioT%(>3E@<*6Q0Z8Ep%(Btk!LS?t34MWgwptUOo zV3Yk}6r33pWdV?53O|%heCD?kJiHfq+Y`ktB}SckATdAzgxsCLl!(u$G5}_diOP`6 zUc`&!i2hkFkgwj8NPZ`$Y3x~o`0W|nG+HrzH;`Pm$i;>8mryZFq&5!EC@2F=0=0z0`rU60WjTJ!1=CK z!fpL)+?Lx-9&qBNkP-*!m9bs)8`JK2oZ-Ro%G>^*#YWp|<|CEGK&iD%ppd7+RXYWe z=C6QU_P>(vsV2fZl`Bo&a~uTjOiCp_KwXgXI1d2q$x7cHdGsqF%fMkR1@^YgsPbGE zD%Lq3bzLb4-gmdtgi(aw{e^ zxQI9f!VMz)xnt$LZAH^dTCeNNv<9R8omt0;3kw_NuX4r}H_2_Jwq<`0@sF($P?ZMn z81#H*H9DzI06-vim6s;Efeb5&`$z5{EQFJ#f_ip2uMsTp|V@%~Ra6(aXYkstDBmrc~aEGHSc?xW?_Pcmj@1H=(x6IE(UOED-qj% zXpum(qj7*cGA=*vvD*bWquq z?5@1&F8HT!9{XhQp9T(_fwb6s1q#WDh<03YMH<54{?hC0)ay>+f%3mMtM|}+G;16u zVUY%4Z@L%)?X>K2$vhmjKiJ#P!@)S8Z~%6N9}1S*+R0pLu3|q_lYg?E!^DkgFK5Ygbfv+<@`VFv5{Z6Fe0R`*T#&>EDWH0tR zzADwZhUx6e1;f>c{N%v!cm348D@%&u{|9sQ-$gPvAEHUBC^L~gCb>$RD3z`{lk3eP zN!l?z0_C0)-o*BuU};LDJsWUimC}TeE-nxHw<&hV0TCCtJzLt5FlQr-Q({)KKQE&_ z{l6WLPwOk4(wfX4V5cJqNnv>9Cq)2!Zk114m693tmiQu}s{|aA<~i>#arU<5)y>F5 zZ8OAluVBM{V5|A!)vKI5HRy&?sS?vT+S>}#okq!qVL-81_@Q8yNU_u~N~g3|DgO1? z1-ocK$=g+b?d5!op(ExOgQ2xl(zPIFBu6j~RadULxkiBz)h(e6V6Es3Ja1?@D@Jy7=MzR6kr* zz?#A6dqfjBgSdxq;~I8hN5HIc>FU5@vQ#wyt6wc~EPs2sKyy3ZIHlNhI6L4-%Y7fo ze6~8QH=b|Wv07@A8ZetMEEouoIUZ^*{>c5WJT%-C7wvY=a{#b-a%6n@p*ALs%EtQB zC3MK9Y%YuqJUX6KDBkILxeD#>Ae(MQ!`n_#%5QEI2TGCV1)2+$3M)+;Wok<}1f|x( zKT-?%bG$%*G7JQ~18@^gq@<<$*7EKCdh!x#h~Kg!aPKUF?i9DeYL;lqQkr{Z_Zxpy zS)a5xDC_ss5i94bD%KNK!Oki`+Az)BOxNxPz<+Okj}B|hEc|K;jrK!%ewW6$e7?=2 z$iQuj(y%mu;Sr^3>G%Qh)>9=aCxza4hHR$KT=V5tllN!@$oO0t4R$BU8s-5|P1@c} zBmG&2K-2!yD(F)#S2`2N>6P*x(g?G^a!vQr0u4Y|9Q7{c*V2D|3LgQ`JZ+FsN>(vE zwKD_Fm+k|6zv#EJ;Z@6KfcbT7Om?(UyE;y^ZWct|$pK4{N~;MpbYT1(fayN$ZtuT+ zhvB;?OkELJ<4~lDEKIE?Q)MV+%#6^P47W1^vf2S2*|5tD2J1*01jwQ=v*j3D^FvSn z{onv}g70JU2J<3h%HWd<2M;nL1XRgf$oH@waev{FLKJHdB`3uB!V&;4v2#$Hvh&H4 z?7@!1)Dy$*SSTopRqBBb0=I?>L2=e)cMu zsj}Qp7j2p`13g2z;ek<2nkxJB+IB}W|2k_}_?fo-U|U)^;8U#2HJIO$@|r|!@0YK! zlF?3YZL*6Uw}4K(-ra>k@!VLKLEq@#&+iR0e2&4J9q3I9yYWB?07)CTH=nAgeoyA? z<2{geyFOcE5^fJ2E7BDve*P{q-)Su@Z>QF_4PSWzo^0hC2)Um*V){`8K0CCP1H$n^ zlADcr7_!*S9(kEBELc9KL_p=e$Be4rv@;XGm%m3uL9eGsGy^zVG^|l~@6TjTW<=Mm zJx}U(3M(!Ih)0P3$~|-ma1KapTCYz6V+C>r$R$Hgf<6oi&H9(CY0EW;O-=R(<#DfqQ4W7>CzKL8;%JCLXytf{V;|a zc##xe&4p(ihQ2x>+Wh{%>13fF=gU0GK@I}aU6rq;{aEQE%Gw^IU^Uz$X%*lL`8*Lg z*?L@TSByc`xi%*=#D5A@k2xS5Dh?J{jMvx6B=d|iSMCYb-1wku^*vzn{SFliBjOxx z%e9^B%M=JMW}Qm^j|adBTCS|E&6^ryGE7NI=CBjhHn6jGZ$}fwx z&ok}TPt(XH+@~)#)RpEwy_0s{E5CO`_e_ zS47Kz&cMX9S|V+ZaGH0a&E$>ev`mmm;${szH~nc1W*Kso3#}Mti=WhloW{A_l`R*h zN`9#?@_4X*q4|2EUPC2Hh;ESeUvxmDfH)ilUGf=NNQ>bR0JP33R!)_tzd~4=GaE-C zN`!P{-{eB~If*S<#&X`~y!kBnu&QqO(Q@g23TXyN@v(!n6hJ1@GM0bQ8T^2WsJyok z{wSO&WiBj;Yee`h+1Xk_emNsTb^_d;AXwi;uh@qsl8Mvvx;%&D?eZuzpk0quCd;)gNP2u_sgMAWraX1NUGqUGRUH;KIA|AX; z@~S}J)(ER(jdP4E@<;s58O)gSagehNcN-Nk#b`B9fQh0C}LGpuCY~utt6ISk-oAZrDxydFPhtDMTR^EoA=7eb9u$1o~Nck zf}AKbldXCHg^l=P!5CnjFw(jRQc&MDdxz^(utO52+}OIDf^NsETS2?s7owYF|G*|A zqS5v~&r~~@+bD^C4u6U`xW1~afs2^QSATtO95=e$VX^!n%&`TNYvKn}qUGF-i&DA> zTFnsg2{`}z4Qn6bvn|lYOH~Cfb&d)tJqs#;o}VpqjY%ur*@ox5Qi?#m&Pc{&go^Sx zP|0F0GIaO~Cp`GG8}n%uUI4!2O%BQB_weMLwT!<2LLDrJ&J_3Md(CWDSf$TO0&a=uN2@56X z(lw5{dYFC)*aE*KKHEP;lg3TCUO4&~NiFpO-k*9WmUSK}PjU7r9Tbn{O`DWCR}+L9 zIuz8-j$|r=d0ka|>Yy$Z{6*pI#^wVZ5hf9lwI*t@icE-+To$A7Ka^(`N z48zMU%~eYcIoRCFEL@y$@_!tSAHEp$dSIx3Rku7~{O@$*=S`xd(C%=p-gl1xE0#;k zi?0$6kk=z-H9t3eE_N&IcN%$`jbA$)$19R~?xk7Im31amF$6romFPn>(GU$m{zZB3 z)eYCjTvS;b8Bu8=s-z}$qJ_-G-dG?(wO^#)9jv6`>+0p2HOO)Q5+`=D8mIke=9_YX zimq}cPE1)fzyP3$R`rt-agoEx-8dIiZ@&(H6rM7$-m5qrZ`iVQ5*L0PIX|m{?W|9h zwxLE)P+T?HC)82xvTCq`FQTZ>cO?aPp^&A zEyXT^_@z!?EV`o2-yAueCQ?t)6w28%x@Y}gNxD#o7r4aGkIpk^8`lU=xyVk?L`&Jv z#E*ugOE1t;$JFY^omRr^fGm>A{cx%8dL&A2ipVPq@51`1%p_1LN9v6@xfGJ@cAS=L zj>qXDN|TFk6Wqq#&64s` za`?f(PXSyBPDCXa_bI4bTt|+g64Xp_`iJeuAV&_3Of^71FlbcT*l05S@ICfF>NmI} zNc;D$dQSlHC$?VRMhmvUvnfAqkE57D&rIvU>w=cK@S|T0h5pyn=lwrlP%#WZ3hOp3 zJ4STh9WKl9F6yhU^0h2jsP7W;nvHzZ9p+ocj;bUK|1>yyqci?zEfb-KCQ+22$8weW z!WNkhM_fL>wiV?K_9I>s>r?V|fUD=f1@h}glvght-DlfRy%}QU>65zoMh%{kpRXNf zK}E^;adZY!+8?e8sM$0wc@XKNqH+Whe0nw2P?b`NN%4rHeYGp5`+;-9z1ByJO}P2$ z%Ic-AG7|Ap?o>2CdK1S#V33*-YL56sI7DQ>e6=PtHe&h)<McajX9LiH&?V^y??ozg;c2m*4m6+}< zrbrn5HH}#LQA2r0z5rk95EugTm5&y3CE?=PZsX#B|LO+*Q>3lJ_TO!;7DB%SY?I3x zCK6v=IRM?BQy{j7>j@UKL+ghpT1EWh$Kyg|{;#$&8nX4;P2=>Jh^VY+vi43e2ndR; zyHNE^NiLR_mMpqfI?LxPf(EMcLOy4l;-TevCi>6)pUhA~!uxY4J01TB4`~|T;S%CU40Qx{-*)$(WL6mTQvYL6!BZ(wf@?zzhLHV2fv$>F>ByEsn!(r0KwzW~@+KJ8=_h8@3=^UrHaa z2zC3a-8DNU2=%=HltRQ^kL^_#(#!x@)8eE&Xtnk<)Rv-5Y&6@DQmR|Oy!5lkkb8Wo zJH}Ykx=A*|j*}I6H))&~oiI@FTf6z(@+nmseNX!M-~l^@I82i$k%0K?e5DdVUdZFC zevcqF8Z=`ICDIn|-N`AP_nNNAMmeH>#BY52t33G&jF*jt^U&{i{E5>}oh6g3S21rZ z{xFKXTh3{>J6$`tbKvHeC;jd-bR!1qni_h%qE4Le4=2>f*1m1WtAyOA(-W0WS9}qRrP(rzV0Wc;s1}XbN6YjjPR<+=v#@>LM1OfOlcIz?7_9 zTW|b}BV z(4po@uF^Y>jw%PJ#8C*lI%!VhiUbQ(3mRC@%q?V!Wh5R}qY6l5cOC~s*Q@B6eFZK&aTyI z>jq0@E)$%tXY*mLkwJ0CH}jut!}syf!tPmN%F|wE*gwyk_Gxom$)C zKiQ};o-@}pRH)scEs~}YGVp0BnNA~B7LYNB>9E;^3{ROKl>^Zp_D5@Ebf4X7Byzwi z56+fh7WVjM@GoNGaq!e1Ctx0xv^XrEFTdlO6Mb#r6`HO2)qc!UwVn`h<#4G!pidJhIv`lZ-A#UL{RfE+WES`shvv2(Cdyz`dwSs{F=1g zgYtebr$jm>S}FT9o+1^!k*C_`D9UPf%g5{H1$Tb^Ro{!Iv@1|U6{9m(l1n=-lH@8D z;?h*@F$$>!XCQ6oTg~-#ts#_F*4d8Lo^8jDZ6-bXX*u$9kYalZJb%9KHk9%f&3m@? zsoMynK7PnkeEDjGes@7Tb?gx5oM;(o9d2n?0M^Z+MOl9KFCI^osg+BPT|<{W7!lR^ z&MyCdWl7@-oyh43UCxU&CviiX%|T>6q5GC`ue3Vy7K(pEV+wYWd!Hfe-#>Im>rPR{_e*{+kfE7-@e_j8?YS=OYSoNV)?TyA5l83Dd&W zoo71|pI0uWzcD917eK0|TD93kMQM%J*5Arec0*XVCMqcAS67}uort=+tG09nU=Gp;Ax1J1* zXI3-ZfoiJZsqfJrOhHpTi3#MJZ+mqdXid1A5|t6dmu(*pqBQ+i1*C7t@Hhk zIg=Yz?jQ-IV(FYWUxg-Lj4RkZ+WXbqGh)~GoYuWT>*}2OBb~AIUFRwNr@m$+vnhM` zTQUia$nvDJ5mpIpA2$=V(vsZ4N`GaG0B@m+gFungbj2+FVbASjKaLqCYO`Vi;CC1K zR}yR*#Ma!?w8eRpaW+>R#oszFguVc{_KVFPcFVKi)iidbVyvA?{aGdw6m>+gR=+6+ zGZgqIbPBkIk&f}^8bDxIvsKcqVNgBXCbjFlCPOW?Y3qH(bs(Dvb`w4i{DNCjk_yJ| z5EpSS)~aoKanSZphOc?4>kp6ZOcxLgL=;;ojys-HzTMbeQfnQ^G-djcEPz_j$Fs>u z%x|H>t=%QUMDX@%Vb#|mkR3H_qW+JVD}jM1`#8&(4escP-kc+W=DiB%l;S-?TaLh+ zS(j+;%5GX*Rtoa-N69OJH!gjcq-@U&JQ~q}*+!qEPffVz%97WH8*czegLa$i1vp^x zt-`UNSAWgru0?AupJvi|h8$wk)p@m8Sg7&AU9W3_^?sEN_<7HZFaalH)etXe5fXop zVbdj2+MOGwRBkq>9Sx@l6?3ULMoiLUV$M8lJn3UMkNddhHu}ljObDo-`>}4GE8pbPFiD_NpNpuQTz^#`^AP_#f&E`5l!H6PfeM|8IM_)d`o!2~8?#rV!eFg)x zW@&%V7wv-I--rvO(1@l6*3SJ)sOA&>3bcMkR*Biy>JOvZXPY8oX&P%lXl(_g=bL;s{JM9`_t_0EKQ@UzeY zK4#G(xp402GgCdG3^ZGW0*I963g;9lw&~M+yO$b3X=a%ha`h%#_PuQk$Gaw>=KJ`A z^*CtJb|-{0m}@=p+j{;UV*|65I3$iXnm!Lnrly>0WtN*CjiuF6WVu`xcWlYuP{gc(F+JZ({C$1#;mc#(M-?tLCbUf>+AM~fG3;G1cHi3DkH5(<1QMlA}(v}t&;ZliZxq{ zpX#Jph!@^m++F{Japh)(U$PL=)j#CgN7lX1`l(De6OjtbgG)!yhMIcr4H;x5${*)U z+jbTIQ9paYXITv+N{yFZj;!kofF)}&__(N5p_h(KIn1c4!d1$*iuXM0A~UW3GJfiM z(%7$&jMh9Q2=y!nh5vFuxGCox`jOP{HM$Q&6h^h<)x;EZ7Y5nO2i7T%7Oq()IJ-4X z^R&v38GD60*REFC7Z(N;MO!-AjgL5bYHY==;T7PaTIRgKkwSOXC{V~QuW`9RM08RV z_jcWej(>P{x7BKiA8WJKed7af_q@X=rYL6T`mN~(7H(s%>Vi+0Hb&tB`yvy}{pEnw zILizO(|y-Xk?L%Bb9I99Vbfg*pS6Bi-TJ*{i6%19sZ8BxbK$zUO>dLfAf*vMlVyra zLtlb^6c`}W83z|to*tx?p^+&$9rL++<%uVi6)pb|KShekZ`hz~#P4clM!jk^yK`38IG}JsH=lUDePOuj?}%)aHkGuKW*K z1_|1@$Fw!mSyk)h$S7%q&@RYtHXM)m{tQ7r!*YUHkn9_x$5m8~M=04f6&^VE_hrGD zOk5svEm4EuZ(%R52l=0h>*oY|q4*%I zK7?OKNs+}@?(U4D2`I}|oOyqj6{-0ykzruXyE9wzr(cSdCf{pSGE$0&Jo)rOZihU$ z_h+-8X$nnJba1BsDmzKJ1XI7$bL>_$?xrD~D2c5R{1+-zU0)dQADB1kY&Y&URJ`;< ze$OWSyvYNPqWc*ED&n@ZE+9}8Kpo@ZdZ`G~Vh<(z5JXXnJ>PZzDJ5oB|m%w=tb zBTC7;dQPR2mbbF!qmArGH=l_hRu(9T$VxS>_rMHvmV7A%80;$XaNdpk>~hAT+_7cN z(dsiwbn}76xYATYF9R=FWAJgbH|RW-1d~6xr6%fInB(6=gdh) zRICggc+bae<(5zbyzf1V)?@twIx>Yj85uZF5>LTJT)esPxk9u5(Ot za*l8%40yrK%If>9x6bXTgw1o8inon5#x3}YQt(GYv<>cSR{^D+iV&9i39E)HM*@sd z%#Qb)jCu+pqHQx@qs`kG7sF@wkMA{{NX0N)#@AWc@N>)AGLzuxrLLuT^fA|5{vvl} zS>B|mr{9_Ww(V>0UygBHDzoD>^id7P8ntEm>QJip{obZOZ zmGo(P#azU}7i-}rfyPWrrpNt`%GC?O_PjFIl@zUQi8F0Sv;t!Oh$JkA!P~ZV5^}RZ zVB%J)kd5Pq^Mk4++oHwIx1-DBV#ybsXFPtFN{d|S9v9u3Mt_v*{RY_&kz=?%nWEln zB>O4V_x9u0q-^p|PK&#ezq=?=hCX%_>1Wc|od5M%cx!<@1)7;*?4d^##fy`2FT{qZ z?JRn27Kh+m0fp)~hFNjS=)Bd(jqiiiK{ZLb%+dl4fm;dRhUPr5FR>w_9{V-N!3<}) z7=?kO#JcXyJ=T=!XU_ZK{i{-lrt?&_%;p|1HI%SlC`lG~ zl7ACV$Y#QGy)DiHDtGsEke0#XSoZWIvyP~JA3R>Igh6^q(BI!Yb@H-@o}s`25!x5Se);!fYhTH|^br zTA^sgI1?$&gL3}hR^)kC`E4beut5dW7d3`@#WsUPlRp(L3dOC4#0TL0(-ssP%$O10SLjn-urC4u`U7qhh6&@~?ix45d48R@@MDbzKrcveydFd&Rt#LQ!_jt^u;Lu< zAJ3b=h^csAKYlxHd$KV5di_x)JLEox&ynzKzDLFR8upi1E&xI_*%kR7|FnMA zBLwsaN^z8uaW;<0%@lJMSbCfgfHIBg0O;KpmPkXQI_O}-&o>hX1&5zk>|6vOKwRbM zo^JnWtQF3P-lO`J8mqiP7ue39vkGosp@!eg-m~MtWJRCkOXA(ZA?aQ zD3CTiU@$`qg8R7DxCH!%Nwd#2M26)83)uChA80=~%&J8MWP^UcbI2KXG_C#=FFc9= z+{~;YqZd4y+W-Ug;^BftLNvWg##x4q;ClT3eJSw`LpJL{Dgl;dTmOy zpebrC^|y&#EDVw)CStEv=Go%4@1hxtsxx&yPuw}8#8c?AbV&XCly%~cTkb7~pw={2 zUIqJ$A(jvBllVMkZPu4Jc7|tOUX6nX5bD7-mvU?o`#qGyz^PbNUFt`U4Q^*fK7Qq` zpp9p(VYyo)EU8XtlQeT&OKWABcCj-3yR5`;Gu`C7tDXUgQlbz=qe4a3c1QP{L$eg; z0G4s#YxcgLisV3%%Oldx_j>>1L;0~J{bMVphP@B`mscnMP3)l<TE(FWB{?uyiX5X2DcrngCfxHdEvLL1RsdZL|Fv`?fweLJh_3<$6 ztNqD=g}H@eqdqlSKPm`WAD`Bk8l6=LvO63QucI

Z^apMT}Ptq8;=_<@5k)ot$85}zJ z-buL1`Q5kZt7ll`ld6ACCjH6WX8rkS$CQ0GVB0}iG*+p@N^hZ+UvBkQRTI9uDGO5heq;g1>at90IpJa(6E4aYL5 zp!~4W9&%RZks~uGu*6DUa#8EkYoc0L=43H?{8T z4W{yr#2@pI?9x2LhAoM0JkX0NiA`ZY`@Q`zL}r-xB^nCO9ZLoJD}B7xBqE6Ey0EfT z2l_BG*BYes!!-H~MvOsC(9^|k{3#tH2ta}{2?GZ9dem*j=qG9Ez9Mu%b5+NbsX=7R z3rc>Yy=1j0J{!_MdjP#=x5~gL?Cai_<3bD_#NL8Bv6A$W+3cLD;N%+k9_d27W9%US!Nnj@6$|9XTxjOgl3L__ zEv)RQ>(`!E3N!5NzOBs4G7he^!zPUE`UZp>i!)gvbpVD=#2|>){5alWY0iKn<{eN{BEoOy0Tjk_p2L3lQdc;}ixzN!2@2EPRDfeQLlDQjUUB`n+LqV~ZF$UP?Hi zPm_8z>=-o4ZG+eUau8}J@B{R?GqdC7j}jHC4he$n0t_TTP%hWhR3aRH^ev5)y$w4$ zSCmov)TRo!3f)6m_wD?^JZg#CIT@GZ$%dAi>OAQWg8G}TCzWR8{Ls+`U$o^zkM9;4Ex7l{%sHd=sJdpbDY+dPQ982SokVBOwf5$`kiJ|Kf&& zzd)lAJ?Hm*M}jox3LFpxvX|I2mP|woX)M}l2UOENPE_0BlwxZ47;KB%GK#2b)$|F& zet>fdhih6Q4>C1l?qk0IKZ3@lKaD&t2N^6U(2|!}+}EIZyxFn%9jvxa{2qkQy3c^u zp_v(XL|eVC#T@c(Xi?{AB9B-e1iMi!hPg@kTNY&oqNTSv4TJv*e5F)N69}&+1bAoM z`BFD%?g);JD1MWp*~v9>ZodvV(4?N^MMt4#*+p0dM^qu0Q`ao=UWfV3ErRaWxOxDq zxeseXf6BwtH}{K1zZt$PrI|AK11|7;4-m}r7%eUtCYg=9T{DpnZ(G?3j5S|I21pwR zc5c2Peyu&uX;(>b=ik5{h?T8#q|X z9^jn)Jmj!EGS^M)5B|7MUcY{@O%gA5#qH`61$-ecv@oj?ZzwlySwQ61WY>r9Km#b zST6zBD??TN3;LdRnfdBj&e9d|1~AH;!pfvum_@vLE=#AAgYqzQaB0#h;){m|_zc89 zXe`%Sc1mPiDW&N?G7FyfliomJKFnjT_|>?1Ch<2#e3%gXHuE7;$vxjr7Vq1z9OZ-j z5D#RiElmiXZDKtYLB3qFn@db%HML?Y!e+zmWAw+#0JpAMMZT-&*Su(4jIiu|BXmjh zmbI19(-u*s=-|}j6n-TgVa8mZM-3Y$z*k}$p%VC`_wIe-#gZ)Oo(tEDXv8wl%Im#s znDZ20z&m{Y=6oNS>RAP31wz+o)*;QC-)Olz*5XpTx3T`nXIJx8eccA zhVD*x5(`tmHi+VGv!)A(D4i{?Zew1JEsECWf|A6@-q`N@#VcbbGHp~D4eX84aP=ux z(gR^%kUhphe7!m6C0vatas%`gnys~5q!NwIwv_H<(t%6=G?(bioi)4{(+?lG>H8fK zb2uN8uh=&8y>u<0vbK?%3}o5jh+t&J8_cTp+6j&W&r?x_yjJM z42d&cDp`zq#~G297aVgy?_B^;0Tm5`%)3p{`eVj5?p&D2y!IRIfEQ%Y66+oy~TM z6I`|+CHN=O=GLqzF(^~(Zg8qGRw2RHf@5*2F&ry_9eGt_qn;r^+37G|9jjzl3O(HQ za`I_9rs_L>$HS{WXctf>ziC@=I+ruSwjK6VTpIJaGR~o043Mq93G=!E&lhfA5=n#` zPdu}|Ox*X&AE7U)>rFEg)d6F}sT1K2SUW10v_o88Y1{EGul@>-q;fadi? z$TTK*CBYkjGT?8wZ4=%x!?Y+F;IMp*n=tDeo!*R`c&q~OrIO602fhSO+Nk&V>U6t! z(sZ3iX_+10#4Y+3g;QfUrJCOWAFLHt&nXqovw&}bJVh$TL^tQ}AqM7oA^cq3B{3xlM14Uk06Y`(Z$D zERotYk%X#<|sG2eL zXgE;NgYbzEe{14w+M3UJ@dz80XE|L^umEN_P($f{>I+HvFn;Qp1&^{8(J+d+{OL7Fic_$FBD z`CMw5^3MaG zU&&L;vfZlszI2=jXHR)tT}EKN@|$Q$OTA`T2WKH|4Gp&jsKm z<(cWqVf({sU#h-yFiG%nK5gwWIP0>yF0eckqcdtpPIwD2`IMU0oQL0dHsuR<=8^kD z!)oI{m?`zSAe3IO_e~3G@p4E@s}T9xc&`4^@1B>z z{>-SF90Q~sSCdp38`0)30^c=TquZZbDHp`ilLo1$`IxfA4cwq?Jn`s)#^vG{kg5Uu z*P?A()AIR_SL=|N!}Vw`BMYZmg4bVn0)|8~0Qczc?#=%0cj56K6&C6pBP?=_CkUl4 z(!2%x)DO1j^+owr5>gHfYW(!|6@XLW`>ka4*QXKv^rzECT(M@LAz9Fu$+bS?VlD>T zNr@`)^*hU)Tp?NbozD&`G@TMPjoo|BZ-ILoMm)ea?ZGy3;oV!3e?O8n9<%@caI}7q zkD@^cn*$H6C{|#?kvKNhWQx3#7;>moEFa2q7&=PZ8w*ZcGD z!wHOGJHUAtLtC%Lay;A~Rw|A&1GWhyeRGU4RDVmX7fb4x-cC?f?}VG`_SqvHWL*rm zbvKOi`H!zQQWBkY4_f&poOGUVaJDJ&AHESw*>L^y_S?PV>9I+{KVP@YjK`AN7*C6R zhyDNki5)GKK^A|%Iy*6=Sb}w0(L?c{d zZ4-y43inMo;%&gm;++@XFbi5<#9jd&p4$k8{+@kAxC6KbDxc|mx=6Qy7%FuJa=EMY zstC5f#k8tda{<2(EE?hsqLZkg8uS#QI!&EBdLxucP<7#wU0+$5Ua~4OYaJmT&!5c9 zYQn-}mVlT|U;99a-Ha<`q-SURTKIKsO*R13wz{<$Z~c;L2I*5XK=u{&v%wg;r_b8y znT}Y@X2lXA&RQ}0fUCgo;=GqF%$rT%Z)9T3RY{I@X@Oscrm9jm@NE}J@RVHp9Y zBIUr$82z*wnu;-w1tDpCtv_8}3*vLg_Rb9l5)t2PoJMPb@n@}l74=0iil`dqpe)l{ zN!n)!pCnHn+#bnoT1%Woly;JFLJY1Hflh`#To}zTPcu(C(-;sOR1kDLNN*XOb<3H3 z7&j8Ln8iDY3J+9tOtn?Z_m%t=T7hni^E#|2>UM-xe*l@6N!E!D1O%oA?mZj;mBoaj z8?Uti0i~s|aGnyZHj0aHw^eVH224(JLO2>6+#~^sG%fgp1=1~VIW?OjenRFw@DM)y zivqj!`BqF7whHtSYH_|;T<84zYbMw%z;}$BoBm41a#v-^+Qylyg0KoKM(oKVqITIK zU{nVD3B!qvqrG%W*OZ?H=o|hXT*;&iyrIOf&>AMza$36OSWaIDT=enuy9QaGS2OpU zEb`r6Ot*&NPv6EKBg1{qVvJ*$dCrZTenN$PNy2p=KXj0mG8ldBd9}D&L$*tY{5F=~ z$kTYQXO50y_B(XSPA|u`Ie7doz^ZYF|7k>RPOXA(HUrdf=p8ZTyY#hj*a3^c4%b#+${aD`XsdUm+4N@c zU#@FPW3OS(wC-m=u~16=HBNNEyJ$nN^e!ubORl*KF7W_qQ}`nc@_0mA@ki9&7KvSf z33IWyn?Q&Br0wrX4W?Ls9A5D=(GkkV8H7a8LkHXRHfAirzsiqYh^hMotQ*4dU}QG6 zdOiHX^mvoN^iz>FqMGaaw0K1QcxtkHpn568uOAxb)^XJUOlSmV6Hl= z^TN*UQNw;*qTMT2ko=AXiRZB*N!0s0N&;n{&}fk-p7&qKLS&(3gqB#JzEts5sxx{c zLVqfdbK)-#-J2R2FPHyX@&COr{`a9HpYHgjhHCvJ@m^Jo(&*}>bRV2?mJJg;8#O?L z=NE=IT6wOGeXwe`Mz-loy##MIRH)^BeYSD;!20xlLEjc;Z8l^g*#_ADlYCH z@j~Ok3-hG@M~^Z07<@u3_m$qi+#cwtf+HM_0~d7|J&qlAVVadywSJ_2mPHJU`{Ap;_(GTdM0ZC5^ede zDQXW}QK30erugu;XCuIpKg1}_}*Kizh+jyw8TGXGO zwYfAVN`l~a)bqp>TqerC{7qbERu{*IadXv0M#7^u^bU=VejIwTgX9fCG1BmG()EN0 zX2@SKOe$Lb4d~h-6g3|Le9`p6%LnGE!rdJgeTn|GN&5gXMBF)lmd*PCR>k87l*OyV1Z-!0p>gy%6L5?4G5b3#8-7Jl9gP}2BvTk;xk*` z+V}46?XQf1!4%C-9%!B@WjkR}k=vW6#l1V*d*4nxEZx@tE-0UQMN9l?jZ7M1*%@}y zq!v^>^$NcPIjE)?e_Q@ynPpP}^>0$xD9;5bi}BXaeY#Yl5I!mA3N)dYQO2@eI7Y^K zLc|9e5E<3iUdD;wZuTKe0OEj>GyU<=vQ#EYiKo!jfaclM-e|9_mS-qtQ|vM3eQT&7 zi(+eQ`d()+;fgcYJkBR7J9D%5u~C2GH&}6ONb1gB(q0l>W+sV1ZM*U^1|G}kMlRIA8r)*sS(;+KIps-P5;}MVpeV_+ zr)FH`B47djsFSx0e&=SbVtRQ#8d4=b{(k)Gt1|E{tFijSl7%t6M{QQOm>whja&hCU_7f;_E~obQtbVhpmfjjh zN!D%FsKgXq{~uq3HAUu2YhAYu1*#(4IbFAGq-j z*dnu4IWfRXuTP{w*hK@PI=_~Fpgts zwe6KRCy|a-&xl|azhwdbt@Q)#K(m#sw^-Ev{mXK*yGxS_dK`qr&$gwqkLk`e->}ss zi40`AX(i=&{y-M|Rr`FG9H2cWeRA=Ah;Oneo)#OY^kFx`Qg8Vez{(=r0VIqwD8mAH z$Q=+!`Qa0h=toQya)0Fimlsa)m$HB^4a`1#=w~OfOd~}*wtf?hzfEWin0R~(I8YU! z@kp!c?$NTtjHW^8Q?qOMgq9bx$e6C?N{KwonvMT|X$c0Gp#~O`yEFJJV-+ulUwtGG z#x=Lbxy#=^n{AzjR=#!Fx$ysh@J41LBg$TC*G(mzXi60hrkb7F;jAPTu750bl0mAQ z9V~XFP;;qUDog2Xl5x?n-qJI+*8sSM+51<@y!>qb}qAqb}o$7d+tL@g88H z>Q)6^q3X$h$+y56Iw(C$m%d+s(ReO206&P%{xcsAKtefB3O6w2&N++0ssQv^qjdyh zBt1-c9Vj$_g*+C2a~W0M;2+5lrAn~ICnlqte#F8WkRMz8vjyULq?$Eje6Wc?HpqLU zqL^>zmLUv?ib$1FFWBa#)nq~BBLED@t<>KZA$aH#jQtGcg6JU^o681Y7g$`oY4z?> za-6`M3rs;PS#3PyaC<>C_Af9*ywtGU@Xz#C?-zk_7c=Qz3nU*-Zf5VP_RDlWczsFN zV{vAXlE^1+ppx?b;A`y;^kwzI z-!DcwZ#cwnMr+O&TTayMrX;QanFnM{_|0ZDWfMDOsN))6>`?I%^YHwQnyD!xYttwG z$XMJ~3+35UN45e7^VBKT&1whRs-V&Hl}b?%%4`knvf)LO2jHrf&_qU2w@lmSW30Jo zUqn_N&fk~*=Bp|%qacE&fV5>Ey)f8wY5e12Gm>%_St%?HEl$b1lT$ucbLEw|tJc(- zM}tujVlJjV`}itlDNSZqZe!ZxVqAj%@Oqp;SzO8+F1^61&gb%A6o0}ulufa2-$P+A zIp{CCSe}P@@0GhYG>C~~TnMm$B?6L0McH}iu~QPJNr2{C!ru~>@I~CGw1n`$wOYm0 zK23GXZKRvk!P+zXDr~Z!C*;N3t%P9ijb*xkDB2Zw+-N)L2Oma`*rUR@u|kVbftY%* zzu;0#UOM0rF1J^-6(bn-TSVGywAXz(SEI1>3Y$YI2z$$dbv|&z zbW*F^2-Xx`J@NsN-LYv`MyRf@A@F3Q&gCu}I3?rpK8`F(Op3_d`jGO&@XUd#$F;Er ze5n5m;)7ylVn+=@!@dPTuh!g0+r!??XiGNw8%VNOYJ9*zH1n3TzeIq7@%H7Fcbu)q?dqCs?+A8a?6vnFxs*EM59w#%m_zr0znArUM0Z|Mnp}T_GtEd$=8~>l;d|j%_fL01c|wb){&Nzg{bU1*O$C>Hqft=x zhbl3B??Vmjw2j(0D0vf5z>$rXbZ+B6u#bOo#)V7_+nAqXCwW%QmB(p)P_d#8ckPfU4u651QoDsUV4RJ3$579Y~7SmZTc37(FYI3|aF{ zN=HWy1I%sFKQFh>BgrQL4XN08AFi$YQ|XuZ5dc!=McD2>!8lCV!QMR*khtcx5yu~L zKM=x;Pz`jee}cGlZCn!)hPZFyf~nSEGLudMfDo)?4x3&2=(%!h%Kan~+B7=bH(I{< zX<=z0A|yA_Ud9H#)FceK8Fm_6%l;Lp00}h0ndTt2&4b#mVoemA@9{Md{WJbDfO{i1 zTkEZY5Gx(J#N+nzDdVv5yZBRx=M!3t9|d?Who|>V{ki^ON|4t1P!7DQ;o;B*(yl#HMSS=1d9Q6|HL7!4b=m_@^$CJ<5F?gz(I} zBsvj^tXkk1C1q;JS+MNpZQd>@&lavndE}<%S`nAxgYW+E5+jIAL5w zJ0OO?@A!vgWD})4Rxu^8`7sih-`hw{)>bP=UqSzrGAXmm6VuVa_TY1TQbTDbT|_3f zJ!!eU3~hlGsXhT@fZ8@RL~dYhK}xWVwNw4wUdFo57lNnQZSK<>f&lfG*F;PZO(}rg ztK04ZA_m0b5q5t9i!;3tgTzhG2tV|qxZRUApt$6a_383N?@mX4lR&1p>{M9Z+~hcp z20d8Qq~hwS2fx3=r_kuHtCS=Fy~6sIbJ3JHYbx|K*DA%1oA7blG;gz5 zei>oVvyU7_qijK@-->Bfi!6K=d6;C!X7&v!l5S^=MDM)dI#)melK1c{y9h=`uk_Ra z{YBoP0R>biArlt`=}Gs&OG=P{rN%~=B5)b&=)(HUpXi9RLmop!13PX^IF)E8(?LCp zfaWK@esyhq-2l*qA>}2}r#lY|797lKpUV?rUA=r+BbW$IP59QmYK&2M}0 zYOlu~;KOS#^Md86NjJi#7Ic1yWU+NzZ4jnp;obeim)?m(UB}>6C>7w@=4`K!{?;WN z56--TJYmce?-#RKIwyFRQLy8}Hn`d{O(x<{flWYoO71xO_tv4#@H&k)GWs00Co+%H zWW_+{buE&1x5Lhpg*p^z*l*4^4ovxvXx>nu9*NYY1(F_=ULD;!yX7&6UW?G|fTgc7 zkCRB7al!1~tJq4X2HGW9zmbz^L+4lkXV?`a7Eg%#GJ)YuKTihNRa1TRgGTzsXy%Kt zJl}L#DzDUa%w>^j(qLeKJ#8OjffuXa{qsdn>F&hMy?sQ7T(2hg4}8hv%`M&nDbgKL z8Uqv6e^3)jA?6+Ok##a!;rae(h}^QwBC#NAZ5EH2ZIRrtf!%Wp{^%2drUCnxzZQwT zstp+fE=(?+uZ6?LHEx5+R9e(L3Jcbtf*nGX09K>7is^^#1MK!Dr=Lu094xnl`6Pia zqNd5ghtqLaPCZ|*NjG0F<_RHdhA&F|yamyWc?g(dJy6~beUqz8Rxg_FsEj;h!f7_b z<52qen`laT4=M})2z_)PMa1VJ1(z+xpw!LwO^?$L@sC^6qTxcqoa zwbbAx&evl0l@BT%h^C`C&v*Zi{-ts)`i07zM{cyYJ;0ye(z?zR4RWsP{-&IIr+*gF z5>lMyX2>z(a;7^}`9plf^L^a~#Z>RQ{2<+h&1^CE;=Fyw1*cCh+n2Md-$yV#;XX*v z0I4|N{%!gkxUeL_0yZsi2>+L0;A%<3i}m1$@-3cf?|R2*+ICLXY+=P;EB&7J2x^nK z<2yfXDC^|}k_;b6*)==4ubGz3#ZL3khehoGgrW2@C&bs$jZ2GSA_P<3Xc<76(KGg} z&KL4v76y*X!1o*aEUa+lhMnJco8~V_N&RV6kM;b@o&@u8Vl}*pvM%vWXJk0rIWAG> zh>o;o!f?&|gA|m+5hF3;^cYqKK^CZ|L@M?^G{qkP23~Njl zHbS4`Pe?@_K}5}#$BsDGa+_<;SInLd*T z5CxqpyEx2<3&*@hUdJZ7COHJ${Ca1JOdg#%>`^;YAa|CY5BmE;Sc7Q_`zaakE7Fxj z_P(d{9XkBBVysuQC8&9pMvIQtzAqARcTU(@Il+Yo1eTa?k>wqbgc_#k4ws96-kweU zvZxKahy)NH=WWILdcU-~Gjpj^jS>ug4Rff{0f4G+VOCG)zp*j}*y?eWp=R5z7(!d* zDLNB_#+4{Wd(8R=_`~RTnR3K)~?58 zxRNq#_b_xSSRcSH=3j8(O{cUSf0yRdMeZyMq`yTSWEwdVuPp`jW=bikW|tm*TN~PZ zHd1CvNoouI5qZC3Hf^nutE458dvRO?lOZxamNrM7WPzQT3xjtsmyGLIi#7gTrq$qB zp=qJqD1)@PEzRCG00i{Kw@&ZaFHJkpG$@EFwklwyPC980jVxdHl%~F<5ss>D7Pw~a zbmYrPrPKoL5so2m8YS!1i53PGtx z(#Hs<7OYoJQqfFkWDd+b{GDm4c#*qM=e`=fk`lwsVy;s^s`YM@RmF5&B4GdPWPLQ? znJfQ+bl0))Y_^ZiBm4|Yi&^FgGY$?DjwXr)4^=%H6Mbehy`5J3iS)5^B$G7!^jCtq(mNaX^-N>Jw85QAhim@$;JT`+1P& z_YSSp_(Of?k>1?en5~GvtlPtA-i1Hi)P>4n2QIRH%Ib=KF^l^X5(66xo_BqpO|PtO ziWo{^=+0FhiXPj6`bpbCpMy zEjZ~>GV;@XzTZpGTc1BD#fMk+eNEZDj3p?a&UEZN+QXgq-RU+}<~;u*0z=ON>^@c| z-X84X8v0iND(9o|alZZD&^aG$Wc`v()mgK%s9_bcr~J;m`iEnh?t-(jR<`Z_;OHE= z?*W#zea|p3E%y%6lQ0|369nPM3UeWOgpEW&oW?A?0Q+myS-+Zom@lgpK`p#?=eHt0 z!UMS&2V^YZA_z_) z&=u&3lXVh0fnMEE()N>xSY-PSq+B(F6GhEY#j3uT!5bILrVmRDzippNCsr5|+aEsZ z7G}DHGPusKsc54gwR{DKX2>Srm9k6^ zDZwncZa$6UUrUhA19%U@OGzu8)$z8VGKt=L0ON9X8kf_>Q`4b7!nrp!v9MyJqK+y^ zX(B$tH+R}TR{KKo>Rfyr93Agq1d>s1iUY3yC+|qrqC8yN4H`c2@0v2y+|dZ$;b0TN z-}LdyosN3Qt+{7!ou}J0)zwf($?#ekW9_AHavCn?Vm3AJ9NH3C4i&=4y${i$BJ53( z&Gr0El2dAwN`N$oU)cjIzFoW4Q2Ffq<+y80aHlG2@b(QDbbhk>{(xb?_qB7}B5>Gt z-+xwpJ@s{3Q@YQf!1K_d)()N~NF4}EyVtd7Fx(*&0XRX;&ACW6DVfnWgcEEkcOQnt-WE#mH*^o`9^3S!1vCC6=G|561Cq}N&BdU9k@Z;(DjT z#~1P)C+2XI0a=d7YDJP>OTCc4utSv>4Y-N0z4DW0y{z-%@?U*0aCKltn17k4q7RQh zH;I1(g{CAVRPpuPjY&XJmOsJ9+eCJ*fWJK}Egx;Pao-C~_Khl}$K4-IrDgBsu{UR; zTy|-oww9o-0M73R6DPV&^3RV0$5YQyjitgpLi9p^D7l!_9zJS8C(ZN*Fb&8iuR$^h z!Y+3T75Gp3{|Dn5X@Q8)19XT>(wY>0%wEaM+{j7I{aD^#OML~q_f_bb*mFOeEawOH zYyY^Z|1oe|V(ISjcE5WT)2Fl1>g{b{k!~x`cGA5@nXH%YZtBDEFfQCL+1(%3t}_(y z?Wmpz!QzE!A9$`3fJHEErF27-se22r>OE;4$G;cG)%94%Rj#9HVmvjJ^Jvr2^GBUL z3kN}@Vee?mS_IwDD5jEV4y%^T<^d{P|KFjR9@MTyv*`3_5jQheJI;z$d>EI0qZ#7{ zkX|f=@*;F1ZPS0!;U7SR&DP?wqkA7A=eTd{J8KAQfyDX?uE-TXy_j)M6yyt)G%)xv z9mxj@G$A;HF!Y8Zfu+KR9C(PL;Sf+ZUAvE!x!UgHGm;@Y|26LyJ6qv|GaE2#CtX(} z1O}Bz+2rD|M&}q6KCKmS7D963cmUe`g{8urpM}}W7Xinb$BRQua zNCRvNjZQ-*2@5)l5k6w=fooVJn%s6J*VGe&c9B%7(k zY+`vp-0Js7`t5yg?bFzi3PmbE$p(Pt(@}k4Gt8LIBJ{G+O7pZqdD4nkRvN!Mk$W|TCZXpKt%!4m6* zncOL*C@={7^JbAP#q#B$kyy&k_VTd8igYM|Pbdh*ZRJ8fw$SRw zah~frJSi&CRs#z4o=)K258VVJq>ll(KO+jttF<)f_9A$5AK+VEyrl`ij#ia4ims3r zdJuJ&Pf0vh-kPUTTP+QeQr>5s&BxtAd!)Ste*Vb$9QTt}7`5ZdK@=;OXsN&b=e*hB z0Xu)tgP&Xl`cY{D2o);w#e4&nE?Y8ARM(!9+Fs1%f7SwTdNL~(fM55^+6i!yqgo+9 zDm)JFFs@*1)@5#bkPeNF#%BamB)IhFqJDl~adE#rx;79ZYIY9r6qK<0cRx;-dc>|y zJnR8P(Q0oE?=HbA@&liNss0ozPmQT_2Nw7e=WVyD&4Tg8Z;eBwT9C=pLKK z=1O*p!VZLRZ_*^B&#>u*z=aXKX` z-$j;vn;4Hz`Ol_ZpCXVS<-B$C7Ad>1ac`mKaQ{$I$MGb6L|KZ3HcDGw8cN-*K49Yx25Y z|0;uw-8`WNGW24SIj{i@H`ytY)R)VoW(4LCO&RSrENY zm-Xc!?4vEt@RU*x>DT|sDQy7;c+YI!DxHvr=Oeh4b?=>io5<=q-ISjR9vJ*pmIIb??Ne zk5*N5v$q7XB6lo73CAMt9O$JDwdkfF%8{-S;%RfNpJ+x=*XsB9VcBm;fhWIXeJ>6x z6C?me)hPqSg4017J{|me_ssc;>Z}%-fwisqI!T`1F)SwFz@Mb3?bO^D68<9oajDnW zJGox1$1l4=alsmgsV2JnKU(N6SYm?`YZ78ynUQ?=zQzQ79lfK(#=8qJ~SA6ny3MA(% z2Qrch=;Lr&)}BEjrW@Yst9NaoA<37Nvi^d47bAT>Jwo!?>I8Aq&P$Z%@(IJGh-*@e0a3jLdVar$*yV>Rb7p085(I2}V7YrF9s{!M=L^!3j~uwyPi2ZJ5;lw6m)wmxartY`bX5 za9o1j9YRMo8Q_~rVf`j@Bz&yZ_2qw#3fE8u)alaQezE<5LuglhqfLw5-|BE=a5#2@ z*O%jYh;WWi{eR|)|_VrJg zqgfZGbMCs@XWBk`!+yo=_2~eaAmGxl`l~ei5H-JXkCe)yJs-ugx& zMrNa-=dOBi-M81rzSBPxH7uRa=M(F6lY@fQ{*Ck(nbIQtx7V^ymV#sUFcI#EtIxp0 z7EH+i@M&My<3ZW;bW`taq?gx3dNQuY2|=Vp9GJkF(382s%~dH+UTZXF&j>^r9^5EZ;J6WrXHczxYeJe=%BHB*z;N3)BRDG~A1S{kTz# z*ad6U0feDB-WDm7SYwcYCo(yS+04Y+@Fy%HU7VXmHFbLY)f25kk&Wz%z<%*=S@N4R zRb0C|pWi9a_tFazb7qM_q8=e!{CgXMjKr|Kp1|a+mnXl?^?3pbH_}}6e~8Qi*)bt| zq8N(K-ZUfZ!b3hL1Dw^;=*U8QP{-pa#07e5Wd&jl-I)#BzbDth7RUTdaQKn9t#MI| zwv!!LM`V3f`n6#14Sn!FMMd1?Gu-%K^)RVER&mTTKP1WZ#yuq!LJtUFyIz^%OkFgkvX#aRX za#;0Q$Vh$=xEa$}^=I<4-*?j@n7 zpu?Eo!L;tm*vB*1MP@CBau?n>b+}OIDDhgRDxaM}Ep#bm_ z3qIQDFEQ}zaz}p+>o+d6vqNhB%3yG0S0H?w3O~)Y^X+k1J*Hvpb6_0rxn2+tIj~`v zBUk5V^NZ5ZP9(ac{y`qqJexmuSTditmHCB>Flr>%Ln%MgmBd5!e+EW(pFCK1lv_RK zU~068f?klSJ@pCTBilF4NfSkHO)XDA!0y!LlC{MI(b#BTVP{9C546IY$KMCZE&EYC za$WLhdRb~}z~T1U&>ULpur@rCGFhn&AA{P4QAXWY*#iKMw2|=i6}z3L!jsxBbRFD} z_Fd$r$j=&*w<{e@9dd%t^%evCQu$7QDESDtH2wOgPy*h;bZL9W-Z(!A`HEjGYo^ok zG}bk>Ox)ZbctekJo}F+x+}ZVu;+i*NSLI+Un>tt>`0u z&g3)t_jV_?yM@+irhd`rllvZoV!J2&<`kTCvpfW{bQRNqQ5;Ryz-(UPX zR&{WMv8nwd7ovFD(?@GI3R5%eyhEte`1j~Br1-Ha34bnLe^%|M2o6jb%$S)&et5Y9<;G^(^vpNM%Ap+1T0TAe&W-@)i32;% zoONO(@w4#geBf#PJM~6HbZLd$kuesaW(v#+)4FdBoD+u|^GA0H5tF&Oj*_#pHXCU~ zp;|iT0Sg!hq9%GZO_CvVK@=;6wKEeD z!mgUi@-&T3^f1=O1)aGQI@x-%uN=Z9V{YkES|mkNWHs52em`b*lA!!V4dTTxTyw#F zzQ{Q2Wzc1x38-20;mtxwi2TB^L9sEdv0!WY(wH?vR`86f!mYlY^bTdIK72gsY3F0E z4G%f67-=MLa4lB1uJAa+O4q|7R1J=D*cZkbfv!Wj-(3}5@&n)T@ses{WVNp1Ldd>J z{d5vE9zf&5dF6*5e6ph)OCsO8rfi9FM*zz=amt(cerRB;ZU%ve(gDx}ty6rczp_GK zWh>5w8E{_~3b1*n-{uNkjs;~Tp=dhf7I}g?zB)X_*z}I?H&*Y+$o z?y|*S-#*mu{WM4L50WPWS~lK>M;hdmUsVaYR&jgl9Wz5W;ZOTfak%TEo(7rfJGste~O*Ac)sL6BNGxq|2jPA^I{!+fIt zc_`)Fy}KeR)8W{RIsz-40SwY1Nbh|LYN;nI!Wb~@om*%u7~K0f4`{g!f=N&?tJrPV z@mD-%9WIYFTX{_q9CsC2UOIez=jVELEW}d6K4fMQMYHlc!8qLt^I&Gj89%&Ae+8&L zU7ZtqP+WDg%6*qNB;NQR*dLh{-x(zMt4fb4w{s)+0EjnP3mbb{w zm!eKAt=I_67S(AbL3eS}Hy|%bPkEnu@*^axdeJ^g9am|+MOVCof0O;t-_BA$aZ}HC z?XbXV9>M!|D;aA5y2rCdZxNp+_-DvsY{XW44uLo6rcURNfRK~oeyHwqTf14OHF(wj z&JQh!C?^u#LNZdkgUfi})XCfe8rn5sUqMEqhzy z^wUizx91hQ`|okACXJ9h4tT=&?42dy2Z6#i$Gx%lVNLn-e*C5i!yZ-xq&zOu=RsKm!)OM{s7HfkFZ5@p^NvvR26#!7Pmc7k;a|UIS%~AUcEPyZ-(I|&jz}3;eNq|s z1hKN6K$yqQUcNlF^=2%8qhytns+yzg7ck|`U8YYk50dvJZm1 zfuHWh$&@4C*3BN`(V5LTb*{=tSsk@yC6!HgZ>;mKhov(Pxt!rk4LOlN-q>?JnKnLJ zA1M*O;O14LiY1$$GfgcO=tbTL!DAU)b)zT#=wX^B>3M$MM|bbCTQHNn!=gYDs8l!* zXwjp7EI22pT;9g2xl282k6(&DX?3Twb=A%1`8rCu3kN?a9P~bs$Ewg;3*44~(zd-?*6+mOMK$T7)=)8!6x+dAd~r8LQ~5 zx0}KQHDSW5lhTjhJ=gb(Yu_71eA$jDht$D5XG!L2VMSYejw{BXJrfA2VZdd}j=q`G z5z1!a-jU1R-ZN6`T`oV&R%o4jOs!b#AQ}&EVD{$Bt{0DR7fG!(PDa}9brtAE=$?qv za6w;jHa>UZ5Mu46mrP(Br}08zZY>seNx_$aUs+8!QTR83M+jsw-*AN0mEWS*025Ks1J@uvZ*D}dzIk1e6b$gIL?K99$_H7WAep^Ho@yK~wu`>g?|G!nzZIx|OHsFBR#XBuh>p+Z zP*3t~Zi+^fbAmNMn?0MK;7%tOix|+@X!cbAO z?8jXp(d?C#OiZ?^WkyFqjyJ6P;&C*ctcwPo>(F_yHOi@)K4|tKa=2pA<%LZs#DoD;N3^ZF7&9o3IiSQ3F|T^Uv95u+a4MV zcdJ0m9NrMbrAAyJ9j}w zhDw!6EVheKDlbTi`!^OW^U*7+Sz}&*3fy@-YcS*eHK3T7b&0_tIncXs2fm;r_b=hu z#%oEBE?&5#25>ubu%sEm{1h<(YoJE(OIB;zl3ttnAm(MD5?^hFk#}*Q(Fzwdl z4WHsANznCT!{!kf>FlWRlUgm^&6gJ+M~eJmUl=8%rek2~GYC%UzRjsg<389d;q$2; z(z)`UIy!`w)P!W?$80QRZmu|=5iz*GF#U9+*N)#8%oJ(lzSt$(n69bd8Y?sQr(!l9 znKG+8GAAUfrIXc2C&iY?27@nc{85+>97q_1w9i^$p}DfZUd2?<;^?ZS2#Z|zE5e&{J-90VP-$7RH8f4@r*M4@P&5V5<&5SW3czK;($N@ z(zmy0ya*C6kxtbHLXFqWVoF>r_&#dEg}|$31y;(@9$?H}G-Af-)Xs!)B?Jyf!AtVB+ku|;ijR_Vo<9TZ;1Y3c_C&Q&6bvL+!fsQ(PIp3k;V#}P_3`n(MIwr;` zw-3_Kz{gZg`}!S(z&w<2=djN>E;4hf~$u<7{G|Idkv& z5&nt1V+O^7VUiY)6$@|DO?oqDOGtMy(ZvT$UcH(3X|&(lY5tx+?kOXzdAd7Kf*8R7 z(l$X zSO6MO+?m*J*x?St87Wd%KieP;+hbsESiDT1 zkT-QFvTT+!Gb$O0A|sPiW{@Lh7I}nAhEM%e+B7)+-M=!*$56rFW6o_Vy@JeYY_mEJ z_Shqg>FC6QrQ|-}p!*YHi|%*m2rAv`m-IA-N=UTd-*f>vf?G}a1T$Lvey<~!T(}do z&i30JGb>&^un*%vps;@Em^hA?_DpP*lskQie!!4*CiHN>HqLqXVO|c-&D*Nd5Bnte zHT}o18OXL{FzZ@xk}eX^oeFkhuP!{Bp&vAAj7fJRdAf|fsNTItMcg%;Bopnw;`jO! zPKDga{LjHsijn^Zx>PGwZ(-k;3QGpA+{&^oBDVm>t0sP3i4CjBQW##RNV#(Q?3dvx+ z+SuN6*50h)lsIiV-Zo;aXE(ht-E{B@siM;X#X>r<%qy!Kv64l zUBTo@wYiC}?cJKDvfgYD7ZeqT*~01I5KN}lw}ajb zg&bPVST@AIPp`drkH%x-TlYa#jUI2ezh>w4_2r145G*;u{IOHlH-C%mir7r+zT#-2 zc%WnLFjJ({0nz015uMYUsjZq}pu-oiw`qJ*qlhWwk9_vd)H<%4lkV}y@A*a{QhB@f@l`{Dy%J^-2A zE~{^j*&uBHA?XUe4!?p!kYb#f-CE>WffHe;oWq`yn>Hmkq~%24GMp-_CB zg<~*^>$t;Jt9C3`sRVM6X$8O7VO&th98VGf7Z4x~h8=im^?flM@-O>b-8n zZlx_IDcwpi;ow1#KB*C5YQOm$UM-w`h~v644e~0j)rk#_on)cyrEPZHam^=RZ{4!C zjt=-ey7SpjQ#iD1TYDH%eG<|xfZ{3HPu}|1eXcb?4!#7sPuUeOLfG=Xg(-N|Hf86o+^CC zTMDGx%9$7jW4|$J)y3g_+}h3t0S+opZmQ`^kEcD!W)md;J*=L0c!|wtYTsG4zm?=E z>m$t4qUGl*%&YNJ=p%o(+LnC+$BD4#}1>)D&xeh_AQTCf^ZoGY#KcY6{oXcYQlEWIW2hDO zKhH0Eweg?^f!X}1q@vtQD~aZ)6rJXW5*tOhuyX8O{_^Mrp97Z91{XxH{J!3+5Qeka zyJ8EO&a(^*Vsy*{guvPf3(LL6b+AXR17)ztUU706zn{3yQeMo z$p%2_7^T0y66T;PVn=U@!I=ngtL~SE1$vn5;&9pCcw=uWNQ&c#l2&a8Yv^dh#R78B zLDg%QlnbZBTE1^)0VBU2~i9NEzeZ=8n2S#XM$lGT-ptmEj8-zZ3{7HRt~ zpNyTyGw9?-<4xx(*LBm-Z{K+>o9ce$C}Jm&8~E_Ey&2(A7uB^5f0FbFkPgmKP8Z9{ z>ijkd1exqF7Kun^6iXEuLg=r1Z{`jB?HN2@@Dlsgj1hFfO@0*bg@dzLA%36z+CWro zF+rxTw)NzQfaCT4EW+S+lP>#Q~7$`@v#hy)p@5Qo^WtU=bvuEmL}g? znouVwkW-nRfq6o5v2311O%?*<5BCur*Xcq7j&wUCNhgT|6zq3*)KZ8aP1n0RW7k@7 z?-8_-#OyrnF+JGq2EEGdNcX8ARo(_yZa}E6Y5&JiG5%a2= zRdj6n@1P62?|Q=L?l|u_zMv0d+7t5+t7)NTXb>iJ>!hLWFLCA8&)sU5YF!Q>aO2Sx z!G0cVAC>r=&d}J}1!v(LO#07LxJ+7!!8uU|dNsL$iNg@#)>nwu*`*8{QAHZcng4t? z?+O_}Gb*GULmaEAl1+&7jwPfSa*-|C?{YZMSK+N;i7FQ3o zDL=L_v5)PGH&45If>@9!THdSLDD{@)zk-ulam3lD6i>uOO|yx#u5vhHwwE@YuC|3V z59cWisBh0q1I|^|ZVLQ%!)%K4mE-fnla=FsX1@5`sn194)PP3sNS=y8n=7Hd zuR<3wiP8_IFw9D zEH!sGW;tw&iC&|WoO2#ut-a+V5pp+6WR_n#9Lh6KA!0_RcUDlq&=K(kE+sBNHOYaM;!TnwdwsjC_gbR zZK0Z)VAP!4MFFl zRnu1I%_WSJ3!!xv zOr!d~4-63mxRz=AW}T>E-TiM6NOa$FIXD_6T*5YYKHfxZ3WaL7-wor@Pvqp-Fh=t+ z87m|~kT_WG!D7$45NE5NQXg>x3YPEgP3I~-@je~Kj4QXDWTshcmMt!HK-Y*mA_!zy=&SX{Vh|q;%NXd4ASWw}A<5<`4_9+t+CU;dj|-|g z9?(|6p&Jfmi1TaupiNfW=3qXQCU>Dr6Jzg2@A%Z(N-JOM;ALvPXSBD_W(uTU<$>by zuA{CENhkS14wyL$_IB#oHP&RZ{S4*^fu(7l)H|;{>j+~8cb<*V(9o;t^Z1vu9#PaG zmytO}LR?}KbpJ&&|BFOekKp2s&(<CgEcJ7pTm zCSZU0P0vG02m?>EVNB&kWs#2QYQ7q?_Nhh9Qsi^aem8?Gt3dyw_imS)Fa@mk5_ z?YFhLoDLC0L$7TPvb5U*ozjOeNZbaP>sQ%5SGemR$z@05Np0==bTY2httqE|H?#Li zfSJ9|7M|(E0?9P9srUjFDr3z8`p`kgU2pkDDkM`iuX%vFG~`YbB4(yc>&J%=A2K_S ze$-j5GS{ z0Rq)Au`EUB{!lQ^J6#x3g>Jm1quj@UYeEDcvH5xI#6O-XZ_>za+EW_$qQb)=7=8&u4nT=nOI>K{Z)^G;AM(N#qrzmH zL39jE{ClWHLxeeFIUVi59UZVsm?L@S3@Z1)h1k5&BOeSACO9}#g zQO#9Vlk!xnJ|kh#;di6;CbA4Ha5_ZNYt$Fsf&EfP$GXhK9o2sbjQS%#^RH=bL3yH4 zl<#g%UoVE`dBkC7Nfl`$LA2Kmndam`%E6IOcVI5+p7E@h-{?Ji`tMA4dwBaQ5qh=$?kq-Uc zLZFW4ys=fWm4-}*pe@JV5PkRSUN_C__tXnRC>x_Hfjp~R%RO-{?3J00^zjmw+4N!F zG_b=r;n6A`${Zk_sCdl1`IQSu{9}Rq8wwh3hFI!0@9cvQeBKuVo_6@Spoi}!T@rsN zKHGlI6JusB*$LBM4k%a%Pm>oOALKEdWn^SpT#(IJ_xASW%T1Id9k`YXC|)lungol~ z(ESV$lu~Y3TH|hKw{B+Eyu2qQb5OUx27>2JzxfuF%wfs8>~&Dty-OX>nDU|7=w?_S zl|#%>Opd(LaJC%(Gje5^*1{j0_-+H3bnvYKVePs@(4+t1b{0_eDDF>YS6XA#Gx4$4 zF4%BLMmdbU0kRR6ovq3{&9Xl45oClza53=}(cg^h?ZaYDqhm7UfX@1 zsmMdH#Jy8*%uvK&cQibTJ+2g8l(?Lr(c*sE6nK6ROAB<8>AW7X27DgOu*OHv-p9to zv{gO-;QQ;bgT6ydgHAlAm?ib@F^kt^UseQJiwn|#yA2EeiaOmsTM~FoDo~-_&-un0 zzy5(xQi!GKbfuOzCfns9BnrxP=vlQqt##b@S!#biSy2HdtNM*`Qofw5Fh|qraI{_p z%6_k*(y}ee0joW7M-Ljm$^4xV6_|^MOA9;8R=?*t%SZhAOu*tzbhPg1#ZdttFI1lP z`Amcf2oO_&7VSeDi_u)AEtoJ|yJ_1|MTTi~bpWgTQJI+L!huKQS6 z1}YV1W!i#4${#KXf(K;;;`76JfIJ^8$!=(Z*BeH zDmw5hHu>L5sbD;iddq9k{cb`$ic&n+q{>QuO3hN_IK5iDW22zLlp9M1h?bdj33Jf? zysO3ocnPu6F*YPENm#ic9WpG|xR1`6N zO5Aaf>E@tD_1|_2PsZE&0#)_7}2JN^ZPe z;8J2bSw82*e}uPU5^t@guD|t$X{1O;7=R9K3kBMFYmOfd$3MV)-1~+OKV0tM;Na_* zvPZZ~cUI*Da$7HioqR)q7k1?20TJ{2{&ivCpsl`(mpG+GO^qhru z&zy(NgJ%aTw_w(}>}O2}xUOr(Q#i*tsvNgMIkpQw%4AkI+P+WE$hfUVovft(ehHso zJ}WCLJh_c*`D=I8BE0EpfATzf5j9M-%h|r~K#N`(_&3n)&f87!*E~!8p3D8w>;2{U zAn!)9)h01quQFaFFbc5=69N%qPL69YWRtQW`PFYO{Z43N*}ow^6TxB&YdsP){#2-y zWy5ZKys3Hb=n5n-i_@QPA!cYYXB?TCMqgX&ZyU; zEP*DpeXL1-KuwMo;Tk~W!1xtTSB{swXDQ0(i2HI;PIMkX#o75n&vnDm$lYBMMe2n_O7oRUI zC%>AyGV^LSgk=Jdu{MuJXA9{YPMhCUyh3L$1<4~+Sh?;y0?NVmRv`9QC+_Y+-JEUU zv2j8#`wYo0z5t@QrkB;WcYs%WE+3HVS8BFLN)+)Rf=^3mJb_A`8rXyGuWZ= z$>Mf4(2;+ts<_&hoH+f`@cL)NL9BwInIyuWD;8W2=%(+qsoP~P!gsN^_M8LcN|x8& zC4*s(P)F}+Ljp;rGaeKxW`Yq&k3cmXOcV4*h-vKLvlrMpT1m81@F{b?_e9M zpr&rT{1v5i0uh_KRJU(y<9J@j>i?K@;%USsi@n(h8;usGE-5!nq@bi!1} z5lt!ESE(4Qs!qA@3e<|N+^5|-xK@;+|0xpv{v#Z0#OF{B`|Uf3O%J=ew76dfvMQ)L z>SgKj-y*>90Y{tqHx}u8tO&gb&xg~E3(sdQ+3B`WqNqVCqBbKiuP&k9ijw3mng_D% z)^*WSZKjhG@A&ouYx9=cqXKjoYprw7mXR}g_AQjBjZ1UpEtp=<~oj^Gy zbAeo^L+d}lJ+LEAC1J_&hvI9rLMca{bFK8o^sHQ8lmK3eJzpzSwHOGnr|yi<{O61Q zV^9Bm(?T0iDV($~4!57eAvh7Mrkh%zuV)YEDcgyJNoJug}}=eIu170Lhj}U~F3-&NJqiT7I7u_aP|vNuTiAcN_Fy%i!O*L;e_u z)=M4fw+G{pyu9+~8vQD()$(CF)sV0-G>M$O?G&f0v(-sJ2KG)|&k#>E0S<@c zv2=wx7l*^HriG*)SJl)!|F4;xzdn=L6#+aQ^2!{>)n{J2Kv%9M31z^3d&k@L4ru zXcSO+*nsmVdp4|MUejmgs8j_~Ah$h@nx6SKj z`dfBO@z;Yvq~WM=s08e~FJHdAo_&K##EqZC;Sk}0V3u7(_o{D=RQ?A@@MFLP@r>g4 zFyzIT2W&oLfYpkDm7JU_s4u3gm^CY?JAMOTqncK~K8Ow0CkdRd7(5aO7GMkJ+t|Y|7 ziXTQ%O;T)4C{l_wB@v3B}VIp+WKoG+fuJ@x$4 zdV}{nzrjJ$x5rC5ppU&ZTND%}fdT=IYGt8ZzABgn%c?0Dc(3alajD;b?&H7D0{o{; z9{?pJ5$#;F{`iG1s^BOkQ%nGiDgzs~C*jFRwtSv`Wj?8HU&512K|#TBpvBXo1LDoA zsgR+}Uvb>`%?mDc9id}B_Wcw&ew)Di-}lpJGWt>&h)JVtV^iAJ+Num)HW1mC>-XVK zR#|77&en5XNNUR^|7L3Gk2g!@4ZXG7a(Ulls9!b_Beo}*aHyiRbma0tDvt?HXtuwM z21uvdZH{S8r#QAVn@+u=cplTOsgmFKtNP`SkEas}F0G_l;uX=a`{MgMR~(+8oH7n} zAT;a2YzYSVgoKoVK@%!_K5#k95;=)1rp4q~`C^6NX4%#oe!Q1ouib+i4c#|Qo&M@6 z{K?n+^&_u7sRu6;GjqFzvgu%&FVm|}jmMc86Wy3Jxu7^!?$n1%qgGv-r(VbYWGl8@ z?hoecuSFw{f&fXVDEtSe8Gqa;NeG^7)+=Ly%QPm7uTjduz3z?yKGvgQ!5pHK4FkQN z=pxu#NQ(6?XA(;~hw8seO8j6{SSbMoC@esb9uNV4+(G|d^Nx^8HMqIb$YzCO(n+_j zR6CS)u4PUFzmnUgaitAq&CZhvjn&sV(<S3U!S!vC(|FDsk$40dBQ57}$@f=)TTFNy65Yc9YiLzI$l{zpRQ z_d~@Q^7U8w|KbxaX#R`K&`9mK>kNG}oDb1trnn7~6N<+%0{Zhz!JN4YkYAnvDB63G zI_znH+>@^`U-bVkbHYnW1rorNJRTD+f4q5CLRjF$%gc;M6s^PpX_bmwE#$?;#E|H6 z&Ve^*ZEamt3W@!{&o;!9=YLZ3KH}!T5_JAH0-n8s#2WQ3pkSa5vaiX>mhCuNi+4dN z_oXvpB+F9gxu|G4xWh?+!Wc(G4UOHgJi%g)&u}?EVqzMGP!q9Q%-PpzAb+2S^qYs& zNJJ67=wHF}O~39R%IAOf)88l68X_Vgff|~PaG&Z$yrw0cdfi1J4HOs27ikOXyxA=h zCMv^HcVV#J3@_iWM6@uGnNm90oo|`vVzXL$>}IvxjhSQ@<}9cz^?z9e2@j}sy^%8W zOA+z=BTw+XftsV&9bKf#W~~hTV(yFaVyF?vW7HKH^Ucb7kOSbK{y2f@>JG67>(N}3 z_xu>p1N*eFxR}T5345P_;BrIxwBb*Qh5v2dq!+-Sa3$E3nf-AGbP~foxD0KfZ2mGN z!O;hW+n~{)9F(CcqkVTiz4MN-MW^ZcfXS#I-Z!d$!3SGozf(RorWh0uPy~9Qb73^uk-z(G4jB`1!=hK z`Gyd&^aFrx0N5&sp*hfsP=6v#EIo9462I!ZaL(Zp5f?{+SV&BRbP?-HB8z!B2(8CJ zMV8h+h0|`SGlE!~RyONXfwml6&;J>+Sui4WY8~lH4YU6qNrNv-?2XP_8V}N895!F2 zAdh1oyd-5cCDmOn>qP6x(sP0J7dHeO1tF|5V<8yt%sI6tQ|P>CnJLuu>f+3_Dk#!& zcsYKtG%!BqddJpJE;gic=QZZvt?$3so4vI5SB$~fH^NE1(JU*_?yMFs_M8TK#EaG3@J}isF?x3AmIi0Q ztN_f{VwzO5nepL+&&lpg{MeWUU6S2|VUumlC@HPW>jHSood0{XApn;o>60=;^ZP6x z*!c-QjqM?L-ZlDwm<2qmQ*6ic=Ar$iK4X<~lOp?BSC(kMxW^3E_)*is^Qd~<{3VMf;C8M}=<`7-6QT_+HM zn9O_Ky1%vBLa8x|a(&_+`^2EXuwJhxRtZ!DOlmob%T0!rtbcBvO_e|(C^zfV6&lbP-bEXof2o33pKkV z1n4{lwlfnve>7td&qFeh-agd%$n-~_$oratSJb}MA8NwBe35+)4gtO=$VoLd@a5ezx}N=vZ5+^;9J~59+AyJJKZAqsuv4{~va1Y^MN8God{s8kaj5~};JNq& zXuaxO&`P)0d*k_L-4axnw2J0*KfqxpY=2fFmI&L`U_Y0p$2TPlYD&joc4N#iAXAZnX; z#H1(D$W<)byhV9;i?#!W&k{sb-cRVZvsstu)Jr?5t06e(P*aop%omAyn!pB+$;hU+ zZsTCP2E^u%o!=V_SkyM0E+FG^8AaD!wd0YTGJ^y!O-i_?^As0mrX0Sbr3#c#gV4I% z8PP(xKEVXHx^1UL<5^`;ZChfH;>!F;q0Z@Ow+e0#VROFy$5i(B!&8B0fbg&z{ zo>}OK8@1G;c-6iEf)^~+mx#H;c`7Wm$6v|96nkQ6^FXMf0?se=EF2H@Cfr|5E$RTe z<gDKvv8$12k4jLgf zKBORST7TG9fcA46!1tKSlgIA{U3O*WLa=Cp11@S3*duqen;p>dO(rS__p2Hq5$}}S z$qTXOi-JVLh9SNS+g=bHDp}Z9b+ax*-3kxPY}-=+d8rU8OgWOvMR43aEg+g1V6M5Opc{j|_GerVV0yTyQiW0AW$kZ9mr`$%iDJZ>zqEr|A=0AkIk zZ^q;l%F$t(py`|k%yAz42pAb# zop{|uY2xpZt|AVMJIDR>^Z$0G-UXsaT zi5_*6-EuWa1gy~&Sx5mR-KdM05PRgreNdGN76W5EaE>}()qDrEKVJ|NAW9V{-{^T^ zKa>lc$$V+RK}VV|viB|oC}l8_^`tKf8_TVU+!$Pi!NOhi3Y3aj^xZ89hwpX}XzaFZ zGmS|F*%7}*iMJ?J@ojXfYJiqslR85vP=I`Sdg5@VSF_uU46QWmUDH;C5^zkop3Itq zjalMK=##kAR0S=_)K{`@%r-RGo-7;YHiU4L$>*qZRernziMeuD5V-FwL!LW7Y#pbQ zNM>@Dhjapd{U@U@xrTabk3v2%gS3JCgm3ZiW!-O=?3_QV@{pj{I zv+cUQ;p6hYTRE(y zZU=oV&|EeJhL~a)VS (mNwDu|PGawe;g-Un&Jxh09UU7K`*z+W(%toH~DS zaL@B+0T_JbVusEByH7~v#cR@|smc8Tg!~C;m{Tsby!+Yrz-y9#U0o& z=k2;tr`r8M*QtV3TMLGbY`L6fw%3o#Kx4Cfa|PDmBeR@MVcoyVDuJNDA44_);vNiaE+bjU z(}k;-Z+Sfdt*e$Zed!^dWcX|8gFW@?(8dtucCtoUGl4H%2X)&fZ;lnwi5JU=CAdTT zs6?s_CmJGies{#@VTO*TZ$ez_u7u3fxeJ>X0 zvBg^yJmxPqU97hv?Y441BBy~9Y^Z@oXi~(cGo6sZXK|X$;$EM;ikb^7HH%LflPZ2q z6OT7zpx#tfjA?TKl+w^p-9gxq{|fy#9^y0=4*U6&72P|%4sRN$fbtA8ASFmK`7oTI zN+J;~V)A9YNHMv|_3>b@gRsO-{h`lNZ^;1nq*>M3id2=4<&%IEFpj2<>!OoP%k}wv z`f^b7V>f}{&<^f%K|Y{&$@tsJCE&~3-v3Pk=r4f4%S`+UsykvwuK4Wi1mJrWKCDcP zq<6W~P-wpX)?yC1HXeb<>Bn(QR9NL)fD%c*J0R(fNsL4`eu^HxEOxN;-y~VZTF)Xxjbp6%6f?t zYvk1ggH*@%WWD>7v*zbD=%p>bm{@O8)k*`OY=H2=%c434{$kznW1FJAYx2(Zb8+!9 z1*gNpIG`gv+4}8wxx+aD#K-wFt6d4fzARNO>nq}k!F#j;sV@ZHz5izxKyXn4(MOpI zGi((Nx3gtCyBvA>wvM(6`!)RbD!^zeD})@^w*09QIAFuka6&Sj9#Pz zaI6>WUJDvG!h&!TA6RW2y}H91<#q~Qix8sLkI(=F_NBmw$}}NCK_!5*C0{L~=eJi{ zJpJqtO0xrEkKCkGyegN=Xrax^l|=d0TUme0+s{>7oFr3Zi zVJLnUCUpI>U40O*x^}q=<#$D9|Ju15`V$ChUAhWm;3aSV|oYlv=tgmWSc~v6$ z*;-o*-DiroS-%Ui+08QJ}$FOjJPP?>2jF6V`b#tYx^ z=Q->xFq=+1RjIMdb3Gf@Ok}gpu(b{t2JyTJ@FL|F^RP7w`!puyH6_eOUpjGF%<$Wn zDhmO(yOUZr3!6GJ{86w+OskYYo?*w7yDrZmA@o3XZo*kPFkeOV*593Q`^^da2ZLQp zXnqD@1jPSyxRC&Ts4}?&bV)y~&I2d$z*IQkm{Pr)YoYvXb~Nicg&G#FlC*i4#~JT| zj{nVdE3CqiT)7^?qhi0xw%wsjbB#m>o!73rP3OnQlRMa?YZbFjG;lWuI1gUbd?I)S zxGq>pF2Z5BdP#n?(|NZI-hh@s>?VFyr2(F67aEOs&mJ^D>ln@F9Hr*wpo>AvBF=QA z*3rW8vgAZ9mFgFV23*f$p%4Ti(HrToB6~hQa~Tt0CXIKE5i|j1*G#b?uz6I{m~FJGQz+Ry$A?4P-<&=<9Xhn7O*g%k_6PA!Y3Ak8#Vw?Z1^vZPrsNu%B8ng^zk>phMB3(+ zX`-t>)o$@zsWvV^>CeBuSc)pV+FNYLk!Xz5u=FL^?ZDmM49wXCUH>-yDS>x+Qy>1k zvI+h-7GGsYnT*$tAD=45vPFRCc3de%lkKX5$aJAKzz(!w`F8N9RNqwjB@)?QDsqRRbkj1vDMoNXATwWZXy} zvPF6BRHTP*th)rLLYP5mZ0-Z7e;s|$92Wa?;HiTSZDNJoTp;yo1dL}FX5G$kDKi49 zaF9m6y^1D~$Lf)#rv?l66(K&|fb5l@H$7@DU~w0KVQM#-TL!A~(YRkhhaN)dMHbm4 zk4I;wr8V3aQ8rea>Hr6}3FuuY^(Pe(b{cDf(Cx5s_UJgYW|G(}T~-Gi`l+HLQ{!c` z+_35>6gt-POMFTX|5s%Rab}Oys%@%wWSsT~tA9nCjJG}S5hXIRG@r(#hMfbVbFYF^ ztqJJdl)$!Uq_oZl|7sRLj7F0sNtE&Wc5)ThP|Oi(1m1Jf?wlc=zGJkCj*wYqUKH1q+=jcaJysp zO_`DJKqJh3zc-)+@BH|2*wNb1Xof_B31Hlm;h9yEL@TI*B#`S>8=>HWj(_6;zRiGu!BVLFJj~Gh&ixURV;(Pau{PljG$xBn|xh z@}+~kz-FC?SJvT7qR7rWpBa8MCK8fc80=Rk6YQKz!n4cl&tf z{%PX^E-}FZU^gNF!?=6W8@`8Id_5O{XndJ>IR)}Kdj|(KWi&1lu;je3X5x)H;mj43 zjowr+7{tGSu@FOWagEGkg55p}l(LIPWYn5mTH7p5#UPKM$8_4HM?k2ZivE*vd>vhM*uzYdFL}j*6(IflyraV;;HQj=% z3_SW(Dom%T0V^izaBWEC8F`WvxTa~i*bfR&XhFIcuBE(oQzAQz>#DMkk71`T>%d4h z1Bb!tL+O`w5=?6OrxEMmd7Fk#R9foP%z6n(AZQdx_73c^nShlAuLktDnlZC*e_B@z zi@UH79I>pAH^u$JSTSjz5&M6(MVKN!#VF`u%sGco+yK+oa43+XqN2nRNa37n3_w-C&~ z+GCLpgZ}&p%ciD`SA%KC$@Ll?4h0F8?tk6gkN-SLxv_1l$sK&Vhfr-9B4BIIobB_MSeegn~;^8-(R0|p%Q z`u8v1b;?4yX?_UtLyh{{T=s%Pi#3uBBBNyB zC~$NR&k-VwQ|2_S6~slWUbzxJ*7Qi?c2)NF?$cY3{>Z4+?0}hZzr;fm@SK)<3hE>6 z{q977%h-HC*GNF zaXUf0@In33iE$~JL>jajdkz`-B4Ij&wK>)!Z6YFud)!5T+md}Z`Hr10oQTKoU)xwP z(Vhd56hT#Hq`WtUyS3Yb5{EhgzbjoNg7khcpQbNZ&Z+eWNSQJhYM-rqAruCCCl!o7 zSKs`1TD;95-A=}50xrz>`g2w#yQ`^v$t#(uLP|JoXxyi~x3c{7K23TrleyOGO)~Ed z?d18f4+i5rQ5K7(rj3X=r{E@0|5mq~mMcHFL48S6;K}Q+=I3@0qFQGsm*P@fhiF3* z%9WGf4B2P~WyoK?f1@ixE9Z{aIxzuKnalhgrMFQ ztZMDq;RWiK-{jdZd+6)K^Fcc<#m2Tph3YgSVx!?vZ^9GGJHD?lz52-f(4K2yQj%4^ zF7_oPB)on#Fn<-uZSn~t7+QMU(K0c~t!fy_R+3S7n7`%eQ6~FQx*XLjxM8MJE5Fg= zrdh%AeJncFR~`Fn2B}?N2j92$4E1>VB8b%&Om53ljRGG#%_-q`bF1%`%QL7w`_C)f z2=VPVge!TY^aKH0#lAO8IdW^Pmis=f?d_ts^Vq!|4Y$~Bb%T(U>X@o9NQcFgj}`$D zN&!0EMRKSguq^x7l z57S2*K)lwbJ$Nnl(|I?|O>*P%+{h8Kya1)l7s*D=U$|Y*k+KKBjKFo03I@HIv)M`E zioL-OSiZ@UPOol7-I1=gF-+8Gj<6l8m<O})4vYDJ zp2>3-L8`FZ9QJ1e^xdRZ!oc{IkS7VIrKLSmycri>+tg(BQjMQ@&Kudl$rh`L2{?q&|`M4NDXtF(Hj~ z#Scyr*45T7Z}&6R)h!^ce9w68KS>6b<#6k{$bdCpHWE^Z2?zu-3Wjqp`Nstwc>nidXoO;! zZn`V5!l^V!oW!(mxt^Bs5?+fnTuK;+PkN}_G52Y)HbAywRoRPOFSUqV-4y_|+m~0O z29+xFDc7O`dUY zSt8qL7gK&E{tJd_F8T3>dpo3my{M7m)^sRAonKck5f-8iDX$(z(JNgCnKwGNL|tO~ z!^+xPfp5}f25aRP9q9()*rV4Gh)uJ__$`eLP@(zebQ3OtI439Yf!|#u_Kh>uTx^|K2$>sX5?)Hmt;$A;xqvtWj z>d@vd9M08{0(>vJCWBCiazPAtS2u;n?4Jv}YKkdG@e(}Q4+A&JbchSHflscj4tZvM)`&p3T}zjuK>h30 zKc)8tb89`=Lg)TQuP0F-4Z&$s?~c#8jMY&!fRd7==#{cB==;2FF(6|wuj$2E7@drj zgfQ5n8LT-sJFDz-nel64;teOT;-ZO{zs6Ju(wkC6&&a4$8*f`%h+npR*Dv4^EG+f* zeLsw=Qrd~tKmrQHaG}z2a!Pi_mY#=#aQwbU4<uBj*xXMO?0(49S&RkEZzSVji&`69B;BdJb+69z@hds zw2Wo3hsS0p8erNJgu*BLYm7wjVgaK9xbX0s7xYRGyo{Ab@?PT?OioTFog$=8PfzC) z?p;@W^hi`GQ5p@b9^F%(NYXOaj#3WEnwBm)+y+|MTU0&vQDi+QY{k2t_tg}9Ae&;S zI67NmW?p}f9jCysJfmv6<}CvnJ0K`?Im{`t*Wl|aLM*3m`eoou@Qw zs>P_*g(0#jH^}wQvLvni@fxocz~aeSTM=Ss-($?bcjl@#zbuS36I|FUtezE~s;eo~ zuQLE`1RWUVM)OU&v`E)`9`DE19(!lNW}4CNbBfOGKU?Tqly`ThJWBfS@GL()1pyNi zT0riJVo&B97e4G{OpgT!hGIaysM~xno5odELh@TYc634b6y>WF7Xt@5s>u)g3KMu{ zK5NBDY826mW8@|C+FjG;YAOfHcl~$a`_*baP|#H~Epcz}fYpF;_jq1a$bZVzxe9T5 zqFr(SX9IJ{=gWQJ)n)mwyZ-N#oEO(f%uX7i>0&cv#iJC@<~aZDK5j*P$dA^_QB`?V1LouiJW8$lTn z-5iLc5Q>wSTKB2}_KNwHY9rGKRvELOKdOM!7n@+%QqN1;7Zv8T(g;u?abM?O1aPo| zFB%5jZ6s;t)))E~~E~RS;f2-?cGb z*{SwgR(~ksqsNgsfO_wMC@GLPVnipBChXvc-L$zAIOhtpv{u#s{h6E0iSaKofB=j&=9Igm*p@+=_ zc`Ur1z~jLJ1VT-TZjN{z4HiE?(mPqYOM_F899Qn!$d)EcE`nlbP%Cwz=>4Uak?=$3 zsXUhh#1rTeH1_d2aApkCv>blen~ZDp#Bs69LiHWn`0~UB$*9oJLg3;Bk}1V*MJr9- z#uc8cT~$v1zL7orcO|V!gxZ5Wlb*_J7{l?CTv;O)`hxRW{S07 z^ioIQ)?Jf1Ax}wiTVQCxMgom}o-xCXry5RvSJq2oDaHTTxMOa|qMI$4U)4WhW6)v< z?ZxUx0721UYsw7=vX}=Tr8sz7I`+(H)+Mvf5og#3{*NN zN%d;G4TA!X9R!0NjYL_b$!=tBvMQ^~>DrL)kQMw5GS~E3zk6Yv)DyB)q&?_1|Lv;P zQ1!dsS6u070%p(Xh3&o|G>Y>Gp0E-^I`%?L3}{LGW@v0s@zzn z5Yf)-dU&6xp61mxCoNs&>vbec0Vha6$ybafOM28+ zjfS6|yW{H33X4Mm8kwXU!SfbZyJ`~T^?>wdrRA?9>5D00x;D(dm;sig2zTaWhdAIh z?_psRZ@b|YKTntV6LQu7xjTnO$q3lKhN1CRSlb$d{}X#!%LJHEzb z(QJqN!OFzvGX@k1oD?XvBr}j~c#@@vy)Ez|^1XwIp!x7joD|aSl6LdUMmF(D!}sVX zV4pTo)*{rG_lEd~FLmzDti4!#$i_)Qiug^Mkh3cKi&r~9Y0>$R{npB^JJr>mMj{SD zLtgv%gnO=SDS9G4p|^9* zBjWc9q@~JuQ=$~;$PdU*f@-v-@$B#f2*i$c-`J9dJbw{mJrtFtEvstdNLZ|8`7U)(J2y%HF7IWmq@%X+5 z!#!SSy8KesnU&~pUQh84Cibnlf!8b$P|)Wc>-|;A!=9YuEh9A6u*eNQmS;f@x@haE?W-(b zfS*7mU9R4(a3{dh;Bp350!(=ZMfve|mlN6ziXEB{w|6o_jotUwnT4LNM{2PM)@4X2 zU}@jtwq@dC@i?14JIIc$CZxSx1;*F7(#?+<0g_)14J^Qjt-~}K@GjnlZYYgy?`F33P(zI=Ft9X zmYYmqVZZ2Zn8(S+d%|2AExM=eEANP~Lk??PxZ0wx!v`LA^F97zt`HsvZM|7|^xSQ^RQ86DufmO?~q`)tkV+GYVo((N#t+qZr^V2$<=CcOo| z|G@(OX=o>WP!wCFS}_v{Aof&`0=j7@_%#-VCH-&fYZp$#?!nRNIJ|?gf}5C0Xv|`d z+nliIulo2eLo&^S=|NVb#Or&-gdNr~I6#p2Bv_o93V41IPR8s9fjIl#8RmJKcb=~6xmG|~f#1~gs(~WiC}#llEX=8iMgi=p zyC0WCF?qNMqe%|J2=+_3BTMfPL#e?|;>|V*35iNEkjT{oYglfcH_Qmnq)3>Cb%;6X z*JW9-t<=XD)TavLBd@;;3G#w)A`p6!pTynbfk4IqI7IK^NS@$6*#BC`qI}ehwT$e$cEvHwS zcYsTrt#nXk1A^Yp{;K&Y{d<^%VoMJfopaQsU_vV z0BIzS^7p0_f$9s!_f{F%(PU6eRfqvqqJPGAbm&QOE;@Dqj;o*l3&^CI6CN7BE`g1k zo7?0y0f2#NbJ&REHEUz>UuA1Kfj#q0wgaf7#ZkG%bz7$wuTQt?q)m5*x7b>9Er;-k zRo`AIaIzjOGjr6#$f-N|9!2SWC;@EEUT->;4ZL-~Vul{YLblSrdT%5rJ>L1*z7>$qPx*fTXqdJZS{S-VzD9jJ)a>`v1tfnI4g86=wMSJCjFtd` z0Nf5_FV&q@a%<;&`()Ps0gw>qI~m8jgJ)WLU5isq#;31|TK19Ew12X=i1^_66F>2J zOVntD?KGW|l(ClWR75URIWBA)g`?Oq2=xFukDU@mXjH34jw-p; zm%^9y%rw3ux=U{Qa68?57=?-5k3T8ilt+6p(J*z}R5WNWk|{b%;dy_q;o22iIUJTG z(@js66U{nVyaLB^y}%~hWQ7P0}V0Hd5f4y@u-0jGB9=qhLy zj@*r4^{3W(?ud{#i_aRV!+DsQJMoDm+7Bi@b&IDE#j`_9c&huF9pv_|7j*~9my?*C z7>M`TbbZyxw}%&iTT6`do``LbW>l{scLJaRb;`rFJ!>Bu!b^nAAB=(tS$7Ew)8pMy zvvN6O-ED8{-qj&T1u?O7!L7zTVn1kbzzl4SATv$O+vHAO4ZdBkP;2fo6Peyju=`rM zVSkKN>9OV3R5eF>%#V2s;tFaQDh%&P!+36b@+q~zm~<}rphB%r=#y~kSy`YBVt05A zxb&Ca*lm1?R_*YB;iUsO#Q1Geo?g)Jmcl3wr8p=Nw=Z2xO(w@{G1_fz|Wx+{EEG}%wWJ(Nol3baQ<17v%)O4$INpVz*{$PSdJ40dfE zm!Wsb*f}`*(vUls27q>IEW5KA5JW#$9rCztRxQz`oA`6}kC*t3fZkhxca9brfDt?( zfmZLWEH(Z7U`P<@-+vIes0cr*>2mm*4iUZW1maUGZrN%*hOB7hu%z_0vm7>kiF)R+EV(aGKLXOKTpRV&;&zxmGXo9Jc37HlBuctb%V-9hU(g^cA>XM zn>1|E0Wl&Fkb{+<+3&(hP2FUqM@`mHCy-)p4>zv!B(ML8i)J>f7iFy z2NgX_qR#D(^1TR3vB|Ehj4S*Zh){E6qoM}iWUJElxofj;%bI%mDr>O{>}!xe|If4r zE-VeI(G~k;;cv5TO7W$7Zy%}<6^p)U9>jJN2|yQMad2_7f)hqmXo8YWV(+qc`-f~W z8<1BS7Pw`kOLBhtHf3;Q;#z&mIGA<8$fB` z)+3)qd^aAkJ*jAg5g&Cpj zGmSVSYQa#4b9;E8!^Z2g{z)k^H{*z_H0u1lZ=e#KkW6F_!vXsCJXtK28QGIm95=w8 zV%uuCsGsjk9q-}^|Lns6DS^obYOzY^5V*c>z0=z8&Uz#o=*bMRExv)|m93o4+dJWe z#vLi3aA7a9H>g!9G64sCXG=RV*syORuMT?l7+geH&ga_M+3O4EJbk^>bjue?KWm81 z02D$En8?&y%l8cO^Rd@^lUI0F{Q%Nza{PUTRfWP!Z_;H~g*3|>bI7S`Wv{MUsUq0EFl?-aZJ5@byf&=Ui`HLG#u}tlVi=4zLQ)^VxMZa!3hYh-u zzvFf-1DevE&YW}uNi%8b08kM@(^kGfj~hJ z$WnUFPEXIL?q`N#7q`eiYc=9vW9ymh*dxVmO6GlBZZ5yRByOH%?5)we7!gf$F%^E~ zhkOqcKH@j|_+=?*{_ndA?kz$D6{4bO)#->3mE?BT{z^R~h%GVs_G`6*VU)`D8diL(E2gfjoF%TQ>qEa zfm~A_b&ULlu7vlEGat4Z5`f=waLFa|shiyLf_dW;H;GFmKN?m%($N3j&8cZX9zwk; z`%)gUL8kGr&h3Dgi={Q60HY-eKU`?*G6frQj0><}!_xA~>MF@#w^NtcGjFLz!X-4c zFV9y^6NJ>#lF@Wht_0~3qd~cY%|8*K$Vf%T{0^gb^ga+AqaeqnJ~M2V&u{u8U%IIn zR6coW{Mu{C<^ut7ZZoy8ayMnecKfXXFu7n8z{Yn9e10uT!VT|97$%cWUEDuG9S608 z496))S#YTtjz@g^cFyXBqxV>uQ;tCJ6}L5ZqUhsQ!F!&2ai@o$)pouVlzf@E@nEEu zMVmakyZr^ZO+=!9Qy?5H>4^OO z5X@gZL{O6{iODi4e%ke;o7q(L!7tc6$D7{%Yb?eK9@2l;Aa!wcmvHU@Ld))Bo#)kQbdpKaLO+V zVbfp%77zq;;#4>zL&7XKzt*|GKeRfU1KyuHg1Ox=CHC7@<3%5bN^ z5-Lcc%Y{x3`FGNiZT;Wn!#7Jv&zMSyeo3y>#Qx)PI*m4g5pR+K(_3^lDVomw6?c+) z9K}l<5SN-TJU|dAzdy%7G;Dg>__Om9M=O>`LDTH0T|qBO@)e+rcA9eA#UoCMuVp6m z1ZZOR3kFgeS9D^oX85^|3DHd;P+_EY^M)v-%dZC%uuN!zw$je2=IrD^3Ge`HO1|FjogaUiqskH-AFX&J5G9UOM?tkfKDS z{=%GoMw>ssPWYmrvA`~2KajhstDVmAlj9zsJr(yP(!dvqvhFvMq2?vnBR&%v7`OhY8f=`*lM+r&R4$O>jI9W z?pUJDal|K>&ak$pOfuL@f)J)pL13DrpiRw6=3RRELBD*zS!Fyk5$PLz*p#FK8($zRxh5z*jj-C!RXgIdFoaIIXPeL=FA5A z(%FKLaCtAFNSpIE^?UTRZD)b7#HqfqQ9L9ptb$I%$U8^*C5^z7a~FlB=}7swne?_8%d&?_Y!(L z^a2y>+T@o;%*<549A!?PU6j0>GYG6hZh&dc+b#`wrv&!GB^I1!U@GgY5UfJ(caMKW z;#&9ufp5Afyi1fb;S&3dEm@`o!zY4e=>|Ladl?_%rS&iG3aX3VH@+l3alm@cnLj-& zh5p9ng_-Hkn+dyzCf~@PJ#xdy8|masyli_HwNDm~2}111Y0!5OI)zvksA8qtCfO4U6~v+bMrXf?Iey(UvrilV6r+?O`ZfjZ*OBJ3&Qi~hfnBS zuI%2?9%(cpT$}d9(g)QJBf!7WVM(m zlE3FWsOsZ4H0brr)#Lx{OprhPCWIPW?jPI-xOlves&=Yx(n);7;GoroiXUhva4eSM zB*^oQ(D{IP=}aIh3#vc~V)ab2%-7VB&vtQN(Mfj`$Ts`NZdyOMAR*uu_B^hrDwAB- zs+Goe8tW`X8=+!9L&#!?61bR&U>R*+U>9B;g~&lTfb#uC87)f4g<1F#{{6x^4}J=2 zrcA6M3IB+n@6=lcW#szliyK@vDQ5%vn1RiZr_rLu#}|C6u-bmPUq=@95KVq@7dR3p)*P)EJqFLhK&7!zf!p?; z?mhkJnc>IdY}DK6a9x>Zs%U3w-m}xU{ev6dqfO-ON8NJ8cRD*L$H_>YMCoof7uCLG z`2MWK&=S9pASv@fr?=8(o5#0Y1_27eC-R_#v)%n5{*|(LBzHebXDM>|?d$uS;Q~}k zzW6jAbYPUlh<2^8`t#Ug*XQfKchR z?Ol%JhOvMDCav1Qa(ya zNj=^ScAWwvaSSH~I-v*Tz$jMi*^d%vA`Uqe+I0ISZ1=aYMF=B7V~TN>^}nOf^D$cD zD-U%k@Kt;hvJU9E>w9>3Df3-%-A1%u1C^{r`V89`u?DI6!D-{gonPoqpGsr25x;`U zhr@VrYUpE1>lb?Hef7qTM;CmJ`(Tth?7%-Lh%h7di+qoxRd%_MJR%%^ar*h_kBf~s z7tj6tTJ8!dKPhnR&9xD@d6>2$au z57CdPtV`vyHg&YSq#|ulsK+It$q>yuTyiCWMkcfi4D2@QW?F)9qn#RnUhbu+XZ3`- zE_C8z6!;MLt{^*v2vJf`^QCZd!X(c0@2g{4?bgIeRc@Z_1zU4(OM5RgLoPW9cbpyr zn}S7jmAChv*dR zQ3C?*JAmt9N+31$RRt77<#41Y4^^mPvw{pJo-duBIRRZqJ{5+f5;ty`)$Pk0gLyFq z9Q>ncLc{M#PM5^6#7Bw9PHz=lxa=Nam_E;#hkAO*Q*NL3E6U8)@=G@}$-UH3;`_w| zjcoi%D9$|p4DY7=HenmU#ugkEQWpVdkY1?LKA{Vm|ADonmS&?u`c6RM3X}lQ)a?{h zRio}!8>^Dj0%vkrxBXQM1ybj6Ogp(>qnHZ_YKO<_`2Ch1Vq$DkB$WVLn^n7z>4-;T z_g+$uZz!o+0nrh1vqEtWx!}`SP!{HW;L(vOyqlF^f=R6koRr>vy{iwDG_gbOj1AV! z_r(EFVOjIpTq@X#8rEjCy(I7-^HQ2?aF0=XCy0EJbLc0bJ>> zTvga=yn)fzh3WMd@hYkF5Bk&2*d-)mppoh`j}Ru%LhVjzZlwgasCE^KcyNRjK?i_A zA2If;6a-W(DhZ;IcVM4Vl8`kD} zzA7$3n4BCQCc=o(hTm2TGdXVxO;Yk9A0gjCX+U(Z9DE`!eEqK%m&*5oj)0Vu*=D3L zYWJqC#54v6CD#1m(GfNpvkY_@-E>o#yOV_mnVfCzf%*!5DnP5M1elRQ8kbU=4S{f!S>-( zN%F5q7+m$gLV*Jh6~HjwM#$%wp(A>M*|Z*5G-%Pu{_>7RJZ{oQZtFp&mC?M}dOhFHP^o;_1Uhf_ub2S)?P8Zxh28ctM! z&c|$|6H@1Oym}Uq#AB0GdTrM{*Z|C79$`OERHGfc3zmrSCY%?z&TODWvf+^Ee!p@i zt(ljTlk+vmmx-5}dSkL$}w1|VLzIPx|6O>R|{r;;i0L`lQ4I= zPOtrc97ylz#_MomW`l~{Giof5u}N726Zq^+m^I3?0t%#b8Q^3R89}}8u*La9o@wrd zFEJ4r)w*ma16!#6(M@tx2nDlFowINi;kiTgCLza$z@KSw!M~z&$&DDUZ1j z`p?7t65BK_IWaL8o3s;+Q4344BaGB+q%K12d~_1bSt=W4_VW5tkt2(8#Tb#{LKAji z8W>9{8(#6);o>!LG#UU)qsD*}GJA`I+4*HITQI+fzvegM{N=XXWgMJ4Wh}?fj|2kp zfpG*6c>TiSXD$jy=Av-R)Q-O~bEcm{$eLwhIpsXY%$jBxpSBT{?h(^(Dvoch8^i zD326t7U;0E^3*>1#0l8M_O8w!B9j$Z5sL|$)U54DTb8(aToT*MqiV)`VrTP2bMeNh z2I$(2yHTMY$aJh)V22uusqnLeDu>)&3S8a=vWIfH7~Y+rKm`goJJP5eTjyY7oDnFw zqFMtWV7-~M`MDp)K#eXZ+=Se8i*{xXB!10uZD##!y9EHGMXQtq5xfM>IMP5X$Y9b? z5+g<4x%K8gN4PsziuV+rh@BJ~U1SpW$NM}y>Bbbl5!(NSLQhpuXfO~F`~mrZo3mf7 z@mjXrz*u&g!coCrgz0(5;xR;6M5I>*ub2bBEPpQd2Afml^v|vqKyBB3f#3U>9{yaV z?!{hyt;nNDzy|Nq1Ib_OO;~IC^8{dlr*M-vPxRn)_bE(X$2YN~h4zI=^H>qEz`g@~ z6s*RJQ<2D$qbm6_RlD!p1Zc30adF`b+lYW0FqWQd}J@i^I4>Z`{Iv9V0xX5J;) zIhb-+v$och1Lo3nAcFZFZ3Fxq=!Qh1HHd(3#ckrv0(MGQX|VMrcXnW{+A|u0iHTcW zrFUW1me0>Tnzn2I{?u(J1H`a%KV&uOU4}pPzs%MjrZ{y=jLNvaMzsX7`z{nRu%rq*3j^FD>uSar?GWTGG8wwI5sIa3Y1 zLg+~|!}CAqsKkKEN0C=$5bMen68>VHLOl)Oi%$;j}e-%sre6oLDsLG)98652_yp48_VzK*>D)e3e_JUNz z0JsZL0rO%6qg-;6ChX+2K>~F?#sEM%yLqVSR@L2k1-Q#`6HFOf)v<;x3xZ^hX$al@F z#H4Ovt)!mNb}B;x-DASR5Xppoui zIDgF=4_Fhh7|B=Kk8{{te^QARsn1dXamzSHX7$5yr)9drQ}{@b9#3-hhSca?n?>dE zD`Yx`@2$*e(!?AezmGe-^1Dlvf>3GK4WYt84Y(*=uUrC0dUTTv0oHBO>qFr0W3e(o zzlf-|*nQ{(#k+ht7Az_ng%gM8%cFHBa=k9vy+TeX7XJgMf7U4F_WD@&y?_A)(_b$P zg4q`+2n?-+Vk2apSi7YC_5zSPssS?3sVr1fsVB-6hsVdAEmy=moCMPUj9>hisIkJJ zG0)|;9aZ07O|+|IAZx;~YyZBoh@}fn-5Dt|wlS;kQxl;#>j;Yq(*EdVjFG=G$o|gD z|2R52g@&LZ)AmkttL4!Bp^<)FLL$NqDyKZ3j?Z`f1-B^UfX=Dgnz+8XZBs`h(&?iq z=dbDp5Q1UG{(A2~uJ_Br4c3l{j;5<&Feel9njq`)_xEQXLpPkMd*X&yS3H7XO&WbZ zf7!^gOq7V{yf>~N`8%e)2;`l_o_2Zu4I}`ck)OnOe%>6n=NhYy^1gM59wN6`uil8t zJW%fySi3S%{FO)(SbZ+7^1Fj5|4&zD3Q^xdD6b6c*S@LFsk9zaeAt&reXk&x__3!8 zLgaxhpGDWTDzCHZ9!(8alY1JLL+MMLkvuHoB5(YLkm?&yXmU8BCV90KV!iu4u);W z2%pYmh1!?_uNZRdVoyZ-(ebeX{moEl>LKKwcc^?(= zBI8x-*VhrE))FsqSX2XdKjg=;7EQ3)p-5ph{VSxTK&*#~A6q=niF{g@|xas zKDC=Xc5Lv~;kvOErB$}2qPhBE7VF-uzGIikS6Xu0S{nGRxt%P-Rr%qLuvDZw(v!`J zu}b4|^NN03u`J@L_W|Dh~DMI(4U>m_Td9vM3@k5Bg$8D@YTBt2k>FP2tA1A*Wv zP)H!ZZ(5+W@DW9I7!1_e14sM zezeSNu|m+J6>DYim4B8}`Xt#B)xLs;u2;n~Fct)eb&>MU`3L#VBpy~Jx|;5U=N&)l z8V=>@PzJNCk+qvQQ<|evqMAN`mM+k{*M`Bd{YPLU&~?`6b);1us~N0@c7Law!yBR4Rv1oF&fYf-VPc9 z!ryt+1{i(W{a1{Dy(7zRlY{{)W1}T^dB)XNxMEsdG}#h?O`+S z9lK_T!tnOw%g;F$-o``8xNptPQlaPQjoX*2rEk= zrad|r>>X5j5`OU+CjSt~r@vP`{p!?__RszLGrS>RH(n@DSKwTm&L0w2s?SV?=0vTr zC^Knf2E;W!*Ip`I<*~-vEAw+>e6S5|3ZWydJ-tc8M{>D%qO7=`b+z#8M|7kkHZoKoEVhU{mfQ@ zf2zf3>3z*C*i`|?!%{l>RK7AB;MkW1W)C-))o6?MuHroyp|3uVbe?**QDzGSXwi($ zcG%tN_kiF(Lgt^3TLFQkqrZ@Z=7`9w-@rcYhft~Z7R{-H62S>rGKN<^E+cy|1o)q4 z{U@`beG)!?&?WvW>llB{eiOQAOy15QqmBVRDfShx!ivVX%CWQ7b+<6(ddfTC4MH#d z_1);N#Pg%ePDw@~j7n2q0*esObU>hEfBA$hC?E@n8s>XPrXqpvk~vlCw@|Kt6O=TrOSqusc0TfK1*E85_=5K4Y)(^(L*nzv~Bby}Qa z0K2Qi4wfP;{l_i(1!?~J3CsrV)2b*6qu*yYEoUd`fVjXw+$Nxa$O8Txi?wcG&pESh zaf+eS>>u15KnD}|p;%BuAC$Pr7wun99&63hKYcrDCg@qB{z_7_++5-1ZLeDLJ~@ET zjdKHKIap^vSLL`Ey+h2Bn{4ejsMEyicQJ)W$pQB04!4KNo3Dad(L5GbWUxxI`Q$_u zT8>Vz;pcoq@Ape-cR#HHqv}+0l9S)y;Ez%@6GB5v+h&-mefRiK&u_SBR-3=z0b7cw z)Fmea_$R3+-F8}~tMNIhn12MJe+6>@ruL*Qw(?F(s$L%}Q(c+r@eEZ&-W~GrnNHqoXz_h*H9k3B%<}^Ai z07(-$LJ9e3PLE{-1V{{3{(k15&u36?<0lAF29mrOz~6kH6NwE|ozTa_q5Sv znr3BrurtQdII!Rmh1KUtWzp)Vd-)YxA0^r&ZZW=F8;sJubUCuzqAL-X7=i*U&SJrK z3uIS-t@k=JQ~4Uqc&eL-j7{F9E6Yx2L+EMj)z$i>ObflTbf8qURv5k(5)u+sQh#nR zuwpq}aBm7y3}lN{oR<+=f1d6GDxWOojzq!`U4-*X0CY^XzX2^V0sxZ0cuNVth`({s z4Z?2*t8;3n_fW|+HVkukGen~m<>QT3@kudDzgW_6lEMzraSp<6aaY(^I1lqx$(LM4DcE%178I+tI z5PRAS5Z@2Xrjm47~O-svc0TA(jR~0!x6rexIZe zKmQR3q3`7Q-@O?*ThfSH)g&&gwEAk08BUo{z~a^BQg)%l*;%o2*Ou()9FtQ1lA7As zD?illL}+7WuRG*{WhC>B+exQEf6yhSRk2Nbo;$D;<`*xI63{APrkaR`2}6MEEU=p>kldZHU$|ECF^ytQg>&jDtmtZkqZ$JSb-|-nXqy&rs z-)%S-xLY%;*mfmwrms(wNj;c*u;4Q2KngsCu^)nk)eO{0moYkY`D+*o5>X;<*n91- zFgk7;)eh!qE$v54+x+=d5guxx$@ethxDi26%&>yk2Y)BtD58v$uvlkplmv!PtPh#qR577SgyMBhALm|-H`uLz`m)F+$FMNC@MR@BLE1*=y zf~i_!$jnSO1Cf+NwCJqrLVz-0_ggyrT6@C~ez)zTU<#WzO3wk$T z(iehdUX^lrLs?nU#Ft&F`I8L^h3B;Eh7F`^u}uW zA5iGu0y3!0CgjuVaNr#S{c`gtrPWpp4I8kbx~F$~%bVul&r|xXflwSq96g&X*B)oc+T9@NqJcyayio~TR7j*%v^u|w*1}p?Xdl{?Y zyQ;)lhn$nf-=FfbnG=`0eGzetk>FXI&RY~@J5_0{n)Di~V>PyO)#;v0`DcJs(95J6 zl^E620KPkS8QXE4?aCdZ8{%{|im4@Fc*lO%vM2H;kM-#%Ifs91_HX#w2!`(s1TfL* zP*bmkhC9y`Ch2rE!E^$5FTk^D0b1!7>`^^|kEe^1z__@oaBix?>SAN;XsW$NdXo%@ zsXF^h`aTiw|DY@W8Lt2HdfMyiDCkN+ci+?XVN-pi@WTiB?atWFR!ju8u;&+UK&*)Z zOaM#Cz>}dXn+bnLj|(Dk#C0?+$co17wGGgZ?FU(aXutE-c}j8qTpo83*kO)I7nJ}@ zQS-i(v48?tXV6`nOL#l?hNbEFms-eqjEuFo7Ns&80FX8S)W_!+K~wuUe)``T4KUsk zTxtwyfEVa2ng;e8H+a>Bn5C}{$h1dL+V^i)jV{KaqMILnn;E`>We8TQa9+6WL7iR% zj{YN6{P_VntYv&Fl6(T`*toH@xfTO!tYNUy7pz>B0aWlNKMYN<&DYAD4mYd8K%C+NefU|*YSO*;cE%x^37%o- zGo=^bKdUL(v8Ut64T{;gT=9lg`HAz`PuAXXoR`ltsjCKYuw~Mp3T*8R-#>DHN4I9^ zf2k9!>$A8xKN|o-Bd*o*FQpn%XA_qP-oR~K<;4mMtLri;|5XHTDxidDJi0;j;1sz& zF& zz9FO0JD^(^lv4pvOA70L>>nrU-92v^)3wAiVx3_d64+(*QC9FSXlcHDeL z4Wq>W8blyEAa~3^P@y&?+?83;Qd3iViL@=3Kbzg{UpQJyi#g|Pux;|7qv%Z&F*E^y zu-ycLnuPm91jxsU->WYz&s2n(dZvqdBGn12syq@%y}4z7T3vz3!TOleED_N{-N94> za2=Odf>$O9Tja-?7*{!Fw=&XAOxQoWoaU%PUN${|touNqRROIP8}M^Upd#)T1(ue4 zBMU@-emqbPm*w?uDd-$YO4(Cz6Q-$)n5OHXKN`%9S|16>1-=elmV)Pj1n})lnZ?N~ zBNxCRQXzbOjOVpt*1PIMv-L2pyX~o?V&|}nn2ZHm!h)%kj5nIUA>tAhV}q^^Yf&^Csf3f&|O0kYgd z{Z+#dEntlz4YoaWD`s3;Mm%2r_=*sCbA*lD$-{SGYIla_>wJP_sUQcZoxmAL)If(A zTd7UE;&=@Bn|*<=&DRQ+OY*z%JqFW!261vx4+J(APbp^@uky z2y#GEk{o#-#4gQTb?TZGcgB;2>VFm85hy7c-+~sIY?88?!I<~t!*kBPggX}9ik}{| zWjV&NID)m@aAk7NjtIFGL~*dRjEq9Mm*+xcyo?Bet2ou87g`$2edI#spt94s0|(6U zn}~*2G2uRpJ-X9X^$90$a4=nlT#R9JnVo?-ZuWP+RC&N^KSOB(G zI39nu>WpJeP)-(vt`3#h&j#YIs-sw<{ktrco6fwnQCC~HfzCxCRA86w&vW|<^)fTD z-=dE0AXqciEl24|w|9#>GD7t9qu(wp!SULlbSXvu-A7j1SPIlnJauF;o0^&yVFuO8 zq_`6&$H(VI=>CnS;N}osyFn)tdOeN=c%;w~<0C=W)3Y-b>D!k3wnAx2t671f*}Bdb zVWf4?6d2fxQg7RB;<>>CjJc<$R&n|M9H7EX&4JXo%QiA;9S@3K&UX%LS@-}45o+b)5lwS^{T8`v7GlN z_eqF|XkUI$TZEq}PmVvC+=95tHsw2|Q|^cVJ)x2M0`CufS9X49u-!u!gay`x?zkAF z*;WP$4c5P}s}hQ@2bMDR>Jxs6RDLfbufuK3HLQSF_606OT7kJp-q))s53@`)ENx0n zRPpL3E6S0pU^o(|+g49?8HNQZO$)kolFV&I^IA5der564IfAg+{{f309v+^?NI}!i z-pIYqS()bxNgVb-tZ2U7PXo%(K{G|#5bThFYL#1K?`#stv=j9BtzVIAHc5gp;kv*D z^&dEjJUQg{a1DUnu$8D)W%f|mTFe;8-^$96YeiXIx|PuP*%}3=)}}|&xlfS&;42Vc zbSa&kbbsNoq1)J+`>Io9XxQfaM6gn3M?|_LfrpgEKm7HlNT$Ftdn2P1dd(Sulie&Zm1>!Mzr=iY4UG3=t?sGvYVi7<(&M?YzbDTJ}Zs zZnfwa0e18?g4IbYN`xpfB2KXTnzM_&7#M{4)n_#{0EncLHE8t0?x1_)XAbhB^}#{2 z5*DTd$O~cY?a9E;V$#`VWn}{;_wF5ScchyGUOxkWDlpUtQ31vXW@}Q*$G`|v5rnnJ zo~NpF6bxQ9_PKK`?Mb7Qtwk^+3ny|kE2Er(b>JTOqdWgUz9LDFu56r~oa4gsN?o(h z>;MR&T#GV-3RzJ%SgW4=_M_DG#Z*9P5IQ9PsbFwsK;dFE%KnxdOeG4@LK1xGuhpII zuns7bD|sI+kQkn?zwI}$8YI0rs1~fIF86tALUD#F4(Uvmh4u+xF7966m${Ard1@Xs z%nVO^3w_Vrhe|oWlV%%@; zS<-OaHSuG|F%)B~lA;|CE%SRO6>s4S;1hWr6Ecy0TZhhog7UoiJ(3QFtiM#JIAC#yV6bqge#QBYtjoqva^#GvT)zS-n>79pQgYPX6nX zPuxW#5EU;(xsPH;c9PGJGV2Q=CX8j(RprflEg=D42bM@bKMNLGf;yU^x6`*8NP=j` z))lYU)6IT9*Sj!g4{+ChKrZ6e3@DaN{4d^UBn+C#MJNV`s-h1Salbe}56ov>^@1x0 z9ujTlBQ=8nlvbcr=6$G zI@dgTdFPJZx}LzBY~$@3a?mM<-MlMXf4ZZjl$a#?IEn0IJs&X919Ata6;L7cq~7gF zDf`HHS}&!ITeiUgf7W&w`-5??$%7i4^x(k*h(#73plkq-dmaZZV09OgrmlK(mNEEM zxn+Of_EMcF>I5Y)Tmu{_{_Ar>JxjnY)v{9$u@&sVL9tEIUU&jO#jzY3D$wcl@%?{{ zy>(dCYqTv)ONcZmNJ@7INVn1{-6h@KEhXKJNVDi}L_&~|?k?%>`d-}U+;i@|XMf-4 zv;Gi#+#A<=fAgJlj4{W6-S-yEmrfZ}KW`d(EZDw!+7VQ&vs4H2DRizPLmfo*)8L@K zC(N;^>DKVkR6M)$C4P=F`N!i2zf+%y|L*}%42siygaih0jG%c$qYj76F9JVTB)bfB zxhKGSIW>7=h4r+aKbqhPb?wka_eF;qq5>1H%uzIQx%}kt%GnoREEpMd6hSrLY`hG` z2N>F?w%gVX=BiZW$Dsk3Rr3J7O?h<(VmxwHhcgwMRT!Qe4+6h8ehm8hB>SRI^^I2v zIDZOyuu{Os*$?AR1cT+$BCwSAPoG#CJ(ZAPwc7cJg*+{Jd6ad)=Pus0$-wG$-H*lG&PF~M zZ-n7oR+!A=JXML1&}){qE?2C`;wvvg4#&cKS!J+yd9gS1Mm(3>Z8h+x_Oi%!cG5>}K$z-CS$q^&I zVhA)_t|cT;2l=Mn>UYw)__&F>gr%c>-BNhQ2QAltlfx`h%%j5oU+-Hj zLP7$JO7-yWL`l-?NyW047Q!JO2lHGr1qO4$XYW=X+9fk;VPNckQsB&ZXZN}YmZLH# z$3xk@`dcvWfNM7QcU1g#PL`1oN~2UT%zZ3WQ=lx=Ba%=wu3bg+CYAzGeW5Va+Jj5k z?NXU@-~cz!L6fIZZmZ#z6^f_!Lma&C9?EoDHTvTj-vA6GZp=h>F8Qe9fy0nDJeT$^ z<9C;z-%dj+q-@$1tP&9cC(K@>qKEf}=}6Cf=7&XbVBQrA!=-@)PzRgA1iIh+;V(*t z9tXdHtA7~7L;PRcRiCsDph3vXL0Df_go+U{6%T=EH7XXXmRobWD|oX9ARLcw>%PFL z`KyfTXr=Vc#({&ShD9vk3n{@o=aRe!(8@>isWPjaYc0PsLGw?`XyXqoUczye|3c(G_hga0_X9bkTONv!QdlD02lZR3Up;& zc?CHvPtd9628W40nSs-!l0X&gu+lnr+gPo=k5F!L@AJP!w_VuXECuPXJ%^+{iMDPJl0H$3p1TZEe*)hSdq+LxypmD#1~Z5Kqvl#3 zLV`@OP-AYgFamjN?3>hvz;)lv!PGvmXm1pO42;JECBS%2!OyP)e8ns;5sxIU?t?7M zWm|P^H%@TefC=2b&L{j0P66M_3nAOV3Nz(xy9} zGH4fX?Dg|p|-D4P4kY45iXk;T~iHe#+(Z-JQSP`y5P2>-Es zGEeBo>t>I#d0=|##MrLT8wmdEF-@uTza_eh#A`IFTtgj|Sj?>n-@F)I_oK@4RMc@j z7ISF)%!~u0IxisDiA7rl^cX+A>*b1fX}bz-6`bCFVL1-&g0l=jfTrs%ejz+`DGnge z46KWgf1hf&{9eyg{{qrMndAzKDQm3!&V49h_z*Q9=cEM4ZeG9yAJs4+P?-7pmM21i z-QO-%>T+agzH|k^VsA{SJ{q_4fm=QS35)XQ8=$I^r3QwZ?7b%Ok&D$H_4g{Ih~3#( z?Mjcmi|W2J%0}8}g7ZNQ&FC&JZw?L^yF}(mWCI&8UC``Yz%SKRn8!tS-nNwMlvjug z8Hw7b#@q|{>x<_<8_#u0XFtG+cC=&ZwHm>gLFY;>1(|XKm@*A9#T;eyqdL~`H|HTy zf?XhqYSfSxz47rf zpaJu}p&eY*ivx{u)C>25n15YE^22-7_2u`2TfQ-!!1<&3Jj<1g4+I^<_r^h}UAMD-|IT> zdv~c!UM~K1FGH7u`ARkM6eK^DD*UG(e|Z9qTK@j-l`<2t@_(XEdsB;V2gp1E_T@JNj zaEJ>yx<_<&F!wUs8J2kZ^CIBngLF?RQ%M*{Rd%CI_&)N<*;A+%J?%f2R-Fdq)R_$z{Fo z{?`ty+)1A@Coxy0tP)OVHAkD_p9||vq8Wj$W=y|xrcdNeD?xzUD zsS{xAdG_b4abN62TY!8AuCMCv2X4F7E|4~kL1oT@F+0IRFD*fS6sjsc49@;h5hAmC zt@5wLNi;L1_yTH8fT0Wn2a5gm2^n!s?VB+<#=NlbMm zC?FPjq55aEBIp;b7&L3`9fT>B6vDI{Y`-RmRGnjmK+!~V{Lxc}2pnbCieYOXBc z8ooOMej>TN`@M{paXM_7R^{uy0wFDf9kKzw>uV#jmSL0Pb3lSa6n?z77Qx}1b};k; zond-|I|e~%ETxQjdi{wVO(AP7J6QHQ$fnM>7m44Z^Z7Y=H9}Hveq{~g=XJTV{pbG< z=lNgXY4L}OGrsb(1LAvnjk7;x?5eyqstoek*-pE&6M5FhZsaBI@K$`E!9UT54E?RC zJQY+rw^M(P;B!}K8a<>yx);dm@vzjC$`JYQwU=|%F6D6=A_jh8;UA@+pV6z_7i|3= ze#$lK5J1n))<7epn)_D8ZeEf79irGBCZ0cQK5ulkyaG#AqPQ-d#(}D#)y|x+&gXuH zc-lg8!G@_y6GX)8`Wvals57@D1mn%@Rx+M!>bnsN1$N8n-({rT301U*zm`0D^$4u3 zMfLc$S{y;Ak_a|#K%je4$-U>$yqmq|ZxW$WqApeSI}BztJ8Lerc`YmfcL!ra9!F+xu>Dmg z^I?{@7u|Ai{69X)cQEtf-KZ+SZ%~lcTXJBoSOYLc5YgjRm0C$0&H|6n!D6T1$`meT zS_cw~!n`uR!?eR$JSH>MCN5d(RX-$WYs|D;z0Y?N(h5%4q@p1GJc=sDTZujg9c1d~ zYdV}+ZK~NeES@(K=br!eXoBzaOZjepw5-EM$bk}Q*;tx!_h2#d8&I!mfP=}`I1VuG z*ZZdu6T&5j+27wdB~`f-qsUwCyCAYE!-}g*%bNL3`r?opv8W%>kE%>hHi0SMS|PkP z6h-lMye9k8nduO~%I?UbRv=6AoQ2FxF%k;AH7D!74-wCk%;as{pKlz?{D!&{vCEn6 zDcKiC083p$+2!?QD-1YxXCIT2T`=$A#}y~nX%yP(Q`w;saE})&mmkP~M#SjUjA4~2 zv1)c^e3j@R8;1Df!vO%u5hGG|!D+IMos8B3@s=YXs4Sqt-XuHbc+tOfZ` zp>r)NwhzUBuSp+K-%t-oX#4_AYZN~FXzMdZu+helEU=_freS=#HCV0P?9vrN{DYPC!=ugDEbw5%eT11$K3jh9;&kCbflgrE zw#-#`AmY*MfU*GQwS2)9O}5`*o(gaGmsewxhD1N-v>IHYwX>^c_#Kh-PMngN^($z0 z8!N|bD!GlT_T^*Aruv|3kXwKX-0N7P;-~PJb${@NL*T`J_-y zAP92WSEgafl}zZboxX`fD@uEcYwysd?7;Q5S!!dS%=JKza2Be|vF#Eog{UQSyPX7X z48;7XMKmIqBwA={#P!E6&J;BITYvm~g_li23gd5e@pLutYF@F-3u)~eNF`ZeRd zBD=Bguuoi3=Do9~r08o861{~cx3P(-NRV%R!qi^#N4zY@vpaE$kh`Y-`773UG}$VH zsitw-gFRn}_7#g;(vH_@l;$fdjCcPie6s}dU0h5|m?$rS%>vlA$3_1&4;=z(3fpR! zIhSg_y?c+#^ujqzg4fBj{b!e=* zAZm?d8B-5`$1eAQ_?>M>-ukH*FDI#8^+@GfZ>jM0Nl)MeDgoy#7h)+WrcZ%61Y0G1 z9^MvFMEq~9>6hPA4Z;2hLfJBBHdY=oR1e@4Nkir(zgwIdWnQ@iU8sTVZhBTx=UoSd3SYME^AC3EPN8Np{cvdx#f-G#@v6y5FYv zV!sUM%;M*JOZW!kU6nL`D_Y!d-jzMka1DC3M#lz8EjP&FiqaY*PybKwiTZ}$r23rU~%t#SH=ONFUGvPvf4Lrh`*kxsKL zUAa*H`;)i^m4L%h*n*r~l_kiBFjiH`U`;Xoo!$H;HjJkMHsi@rlX!J!Kxx^|aMq|nj^=5hdT^#krtD(@|4M-ILqZ;S7nNT@)3pk z4!$poJ-~?()f~n67cBa^Dnu<3zhNl!$WoinZj^kgDm4uOlS%A5_*_(_z^BMNe{qr{z(!hON#8kNXI!lbMKf~3Z}!P?!)%3n#0 z&0WQ};-B(t!JZu@U6=|aqe95np(7jJhz5qaw4cfdDhyG2kx0Ngou{2>p?MD2{Oz+F zE&MixmV&+<`4;Sa+$l!2bK;4NP5ozGD}T5rjPO?&9@EOGYSe3fOQn2SRPjf*KU&}x ze;|XNjMxx|e6lLlYOHb!qCVeuSyBfQ_kHqFsP?WFhxzGBm3ke%dKx{jx+1G#tcp3= zPmR7lGs{ha+HX>Cv*bMWGT%{2u-S718E*2O^Z5=tRT&`mpHCHJmt{U9=ipYwKrDpg z9i`?eu*Hg@qKeDn`uzPa;*@7->+^GvwL8MTah^7Har7N_cghE9Gbd^9Ee8z?*CSnS zVbvNk#l+flpfX^}FV)fm6xB9VhqHY9X9cqA1C<}|c6R3fSJ(4@{$`mIrrvtNp7@Oa z^LhtvW#w8|T{4TIIxw2HIszRa-}~oDlilQW|C~5RnE2v`>~8Xol^>rQMcYC29sV4g zJ&XBao7V*eZfoN^@4YJ|i@E#=mX)30uOb-@{d1;IJ))o>NeB0Iv9gp@7Go>uJbr`< zVyiYDwY!~u;&Iq~PVPtIymA+`WG5Q(^1Dups~Ir~vOGUSl&JFL^qr{>Au3HtM6}LA zos0z{Og97wa%A0&S0}(mjpbP~OPLr)oNS73H=MV%^+_lTHoN!cmu=^@9+{G73YK6V zjs7H1Zz7k~h~3pAlR6Cyz_e(m_SCEQ`HZR|GgY%IKR!SZMHd^6SJlPREl7TrON;+) zZGfxla?JXStUD=(wQRt;H~h(l8@c*ak@nm~C$IvU`z{g;;nh$nS8v5HEiO>&3`B~k z+LR4Z4j|D}$VU@51a=CEC=2Li{y138<+|IWdmIv)m<$?m;~#$pdlLwLuu;c=r; z*qA<5l0_sy1J3bjz_diOKGSJ$dc=zuv$F%p4Ykebj6o;!;@!yK8Gxnr_Az<17GDvY zQz3y#bx3EWVFn>lmxex9@;*vNnX_z3kb4h>YLoRmdMcPvyLmR6R78uFPD!mdB1@0o zX?}4~EQ$$C>$PyyrHZ-5s_kugvKh0$AIu^yW@o8T;SB+bT|3NZNuz|X!<1?CN51{i z>xb)GKUgcl#|IUpZ3wutk7i*{^P+lAxAZht6)df(Kj+S%G^n%$q z?D#0EE7Neq>FvdS&~oO_JXX03jzNiXU7v*kqIn-Zhpj;e2Yw`pKaU`N zXZU_YeLMI6eBePV`=76eASlgtRwN2qOa?P|05p|My6JJWsAQ2ZQn6eXZ>^B{jESTU_;dPqffI-B=k|Rn z+oJ{b0J-8x`8BpV(F`_wf$Y>6B6ql0M_fg(^wDh(j4jTq(;0Iv^iqkCNQtk)K@138 zli*fsJY9El+#B!9v-=SCddA!PVnAEB{J3OttHQBWJjp>dQm0B_Z@XYY2Q3{VUc z_&lg2U6I+Y=V$!><_wtqMx0J4i)#QlwzxYI=hszRDnV%&HltC=vBL{z*rW1*sg#93 zzcJZ9NmCVBO*f2a6R;W&?TsqCMKpXLew8EUkoMYjKNhm1`)KjoE!4NsXGz!dIA}Mu zvwU8wD{vf**t;@R;K3B+oAWIW%Q>ZOaAom^%A7!m!CHo$1AG7DUR`H|8iPhnjZ^dr zUe4xcWSoAh1_PO|XR`XrKYXyFD|Xs-bu%*l70h}Eqh&e^980l&EVlcYAYoD1qd0=K z?`nSW1oanY2}npx(VzdLF%$9)pF$(zuKcnIzj$+rAJFScK98A$ z2VS3tc?q%j4=I`bhbguRi2EO#g~Cz;yC0d_??$;vC8BhhzD`ibK^`jg&imUQni}J3 zl4nJs9}S-o%N5BHOUYegfw$NUCO!v&tf&~lXbe`I(D(*>%Vsc@<34Gf1{sDR#vKnP z{8k!&f2lo-&--k8;@5BS*4fBJh%~wJ{Wm>9{aT=5Nd$B#U8v(k*cHzlUlOBsKZn(# z0We*6GMl0yp_UQaVb>IN2=J3btBcMX5VYfDja5?m>UDXf|6>ohd>mXgLi-n0N%PYC z)s15p0y4$~o2-piWBkbxf5dK47l&pQ)5z=Q>Msh>77j&0Jt>%f&%z#$R4jc}u2Y&C z@i{sb)vQGNQUGCO2c(;T$Yp@rG4NP7qX2E@{%SW$B6es=^{0UvH$GctBU??aqR-or=1A?p@KX~0=+p*n#^zL8*FGK?`Lu)zC z)AfK?KoSMqCAC2FtihL??~O*v4i6XXFD{Au< z7*v!4XWH{yr=#f4=*{Vkb6!za%W>!T) zG@B<|IfsGs?A({`VH7osdnY@F;FaBdn?oJF0HDZm$)KK5IYSQA& z55h!BAA!;lEH%p3K6&J5(CgS41*p9>InbH|s~`J9Ft}r>(=Sp{w59zYbOVY!A!c$U zHlWvClqknWqDHqBk_Ll1U@l<%Kn(Otv9Sw4U)Cx-0|J*sF{w|;>G5m=Ej~6vF|NIh zuY>OJ3LC#4C6t!zitMc;zSw?BgR6sEg)(LcE0!KGjK$%EKdPjzb>5jCp;%XdYXu6z zTJwp1iDGG0)Tjtpuu@rFjV?5UIZO3y;jRhdJUxVGv&?aYm#mDpJa;p^C~<(;f%GSV{{>th^RvTZwxx9f4aQPPmcWJYS*R>lVTP z4*vGlIVbSHlC9|XyPVyK(bC38nk0z!CS*7N*z9#%mxjm2GW*8(x<}QQKpP0n{&2LM zq<-I(d`>=U50J2~O?~g7U74fh@0Q*D%9CHcJbFVzr=+howKAq~ye9xobCd=5E@{2} z_~~B9%FP{eqln8dSn=ZHRJD8P=fbntQXc<(i*_(q81s!@AxHF}`ltSnV9l4F{I*!9 z>Wh(1=ff?-msz5)o9Zq{Cm0JBD2y^v5?FqD@7h~1`t9Ey>Axh!iCfm{y=WR1e#U(=<} z=(?c8#2~HPEcM^C{vuV?iZFkCQ6;3?*Rmmf8dnIVl}bWz`=O34Caw@L0TIMi_9rkM zDoW6pZVV<3Zw{xK0N0^v;J(OB6W>=FU*lg1HTxPw z3&Pao=+t|+O2P2juQPM-?Ae+5@IG#u4r^D5BJGZ}Hd9EXPxl$}JKebxf%kYx$oD+P zDM}H?f@G@@g`|>gKZ>RhQfoC^Q)!yaV;yKTo2?IPA>ZD1elXTcp~}|C1+7?u$EaZ> zpbrbRl?IW4uwZXvQOFu;%Dd29vYmtc(Vzn_b|r+~FGR+iHuH|BE2xD^>3D2kkCf1? z^)_k)0u~Uby`Gi^#U-^qB}G^8A(&OS;65kfoz_-zCu4{q=u0LdpjTr~V|A;F5S85L zoc{RzqqQ~Tnln_t<)c;GL8km86{ut;Nb_B{p3bapL8<-2xLm=!L0tH|2IN0WLNO^E zX^JhFRShMU%Txm#KdDD407 z$RTFKCDS*&@HYpG;tRojIMG*~bz0c?{$KZTH$JB81D;u7YL;@C z>RG6iR&k&2XjB?>XJmJ;8M3~`>w7dka*-}Ih<&T1F_Rh}t}FdR(jPbfAIf72QNF9- z>Ic62-875pFfP58p0ser*_tR-HtS&I8|Uw&vZ+Sk?sGc75tz^)Ui0Xk z>J<0iU{TO8rrW`zOC&t?43)oIy6lltq5=}L#-{nDHoIf>hlit|UJjTrr3)N3!Py?9K^6I1k+#`04tx)soEIlB+J^*9PD|?y z#|cG4m^|uJu7t~m9^5bQGE^fRj316Id9w>=vxU5PFX%2`&m%H>OiItS z85Ur<(4@6?c{Tyj$w3Rk3;cBs)(W0Z5Qb^>G!F4Lo;JL-u#Vg~%4K@USR40xB7d3u zR0}0sjvq1~HydMU-Kgj|EB*DC>xy| zq z4u4EgVbGjq%w?}6JSY8Gyg%z>D1v}m=VI!_hZrhbZ8B&tLGMW)26K4qAQ!tVK$TzB z&7KF%n603e7d>2;FTI8GrMt4Q&?-K@LGUmJ=Z;L3u=?pvBI}U(klxF}&P}d(g7;>j zoFGs-znqnY8Ik<{C5u6WyT@~3Ix!h*Y`rv<#bBpce~h4UA7ZcqR|9COX5#8HozGg# zj(_B-h>UzaD_);=sYL5M8R|<#XLb)hi*H88qp<{*BDZ`ghfBm$&FunU`m23kMXS_Q zWz@gUA^1fYbJ+;7Ryq+i^4j`!`mOQL()q5A2n{+_NX1qIf^>k|_r%F~vIYrZaPvQL zB*nB!LQ>dF2VE|d_Yf@Ptly*}+5 z6Mo8&h(Lt~^j@7>A)gHCmBT}y!2Daum=e&0sATI2B}w+<4}Da0exoNzx|NSgz|NXq zsi;dH)*x6wAB$6kb^7}Perp+@~X&78`d2M?j9lc?K zB(0SZdb;JAE>We+Y4O=;HtpcL&T?UM^UiYjNnNx2h}7bKjwvxBq)p4l!+Gq*xs@Kj z=VDMT|1wu?Ni1_A)3ldA(@73t-&)Bc2IhgrA+p7+!RnimVZd1EGJ@}v;qGub4y&|zneajdWY`CWWBr(ni*Y|{#V+!8d{GhzseaSXob5FozH$MSb)G?<#L_-OOX?D zPKCNv7{0kC9YJ%VIQ2}y7CHZJSH|QF!Q1b{l?`(Gz9_fS1qLW8lv2UIS9yQ=hqjCk zuwI<;1)J!+#HZam5#35TUWhndjP-Mam`jKVH%Zu~0DZq@!ONOhKZ92PtirF}y1+xJ{a z1h@^a!kr${F7`{IFkzlh;D=DC?Gl1fjAtVAgdCnP11H>MJNcqMie`QQ@wpFg2=0Xe z5O%szCxIBYuRs<1Q^193j z3T%;>39C&$|Lh<$+*24!A=%(OO;|xw^2{9FM@~K7V0Xd8g~2?&aFQUjG`>!)TKMyG zeGtIvQcDjyI&te(y^)*`E(FcV1`V&O@PdBRMIX~NTyzI|JR=d%Hg>>hWFqzBc!NS64)ydT{lcB4nM|sDmVc{_f zY8RJ6$=cmy!O+Xl{nRO>2oiqx+;;)$T~cmK|L_}!t-iIz^3ztHT{T`ux7fm)$KMFa z#NukG%uKbiAOE+C`CrwOgak{^A6c_~b1+r&Uq z!+&Th9Wme1w8jwSMnwv$NJibZ`B>m??N*`Joy(t}<1E@d4)%*QSntwdFf1_e_JN_2 zu_39PjL@7yzLeccx|x!6)N0O4;|ajjsd3N`Fljf9)2?tO?+B|WpnS?qoX`?K&8?TG z{r$JEXczXaJ;2_yi$A2fVmps4^2R>-wnjI{r7C95t|Y>xwoA>-=W#O-dOc@%Td44@ zDR)}{^E~C}2b%EOxXvx)aZ_Y?fWp;@q2M*8@*p@RvnL|?;Z<^xC~XdKn6Hal1P69J zP7KZRaItkq2T079&eb{jzZ&*?P91f8$jj7^{*_d2d3CkyO$#Mo$DvB8x}kt=xEwGB{#SO`B50-be0BaB_m(EVWD3@lsWR3!fkCd2N_sE?Jy0EsVUHS4 z%P`2zYAf;B`}ibO(+mpS&J!Q7MwB?`E_(&e%5a~h;4*kG!EAqO5u0z})g z{zhERxRZNs&ggvMVm1rnrK!_$_3n@Kl%-u_7J`gw$0EiLc74p^>KkNfV6+3H13WZiSNZo< z-gcnOo|b)68RcV=!=@Rl=xh*+g?ByUoQk5M)m0GheslKf(t)zzQ;z}noR))7c>PKa zF5Upz-qK+pguxVA8yDr$v#ih+A|@WRYUqmFG2Jv?E#Gr%|MfpdUuecnr3$0fZGcRX zP;^&;54Q2GvLrONtX$5Z13aRr*;t-Kjv#pB_u;&IoJ(k;pNseH9JG3rF+SXKJytUd z3hln;K;<=>CD{yTH=hjbz`>9GPIt*0K*Cn(Rb%1M>fO2_#wtKT%RgN3QX1h)@b#W> zNUgNDRXE3_fCxtkSUUg&&VwVHGsKi(@ zsZK+j_lc=PbcK7T+G4wsGdIvzcL~VXT5hLZ^(B6<^z28d!#D!LXG1A(KwBL13xNveXlA`alaZa-V?a1)#xw>WH&KiS{Er^R3T`8DBcZ5 zJB-=983$fK%ZqXKy{gu;tLYcdM8n5W63VAsGzK3^Ta{I8mNrf55HkBBT@f<&CKtYadDT*1gSw` z#LJ2lc3pnfTS@Ax;Jn<4Kc;?_Pzv>r4vG#@z6OK`*JH`eFverjbkj_x*|paeYo)g(g*qABx=$-qsmVtrkcXJ{q%H=#WDxdTwMJu|q2gt}TsT z%%dIqXi*zhq4*FJqL}>W)WWQA4vTvM44SugURf-^6&H=q^nX(sMiBFk8mh~$C53Qx zgkWH+fyJzMi16ZS#L&XGtL?oh&ixXCX8pnEkdMeGn`SjO+J2&K<`X5FkKXrM7Tf3I z@Vw9Uckge}oS)k(`uW2zI8-EXj7dFGx1P82WvMI%2(&K zm>f`(>->yrF%y&9WVZIcIpnZJr4(k{D-tK@3pc(*{ygup#EHrMe8?Pw2&NO5hD$MX z6(--;b$)_5^R}#*t@CP*Q^7M-!fD_7R18)?nrEw>_cd;j47R}+3my*EJ7EM&WeoRb zMf;1@y`ef_gs4qJ*XFdIHF`2ok3`pMzdztn{Z{f#rQUL)KTndF$9dqMA5Bz!sIr|_ zWq|Q34yUm)vT=~DXHi9r6G$+%7MX6WHpy6@1sNJt%dFS7L|w|P4S=HX643K4eUHzs zr0JH9tvVAEL_pmjK|)~uM?SaKx%d9*Sio>Vw_Tbr7`GmW6iP=%zGTUXQ=%!eC+b;p z$n5`q^J|!r9fk-RsRa6ved^V}3BTY3VWb0Af`9N-$m71~eEF=KB}_{zezwYuE!Jp< zc7+7$q5i89F7zR}Eimw_5zsaUPhR~-v|^)g!aE7fw5zo!YYdB*u_ry9lZ1Y0f&`*vb;VzU?@zT&{|7HlG>pbHbhj$T|v z+Zg2%N8eap^;vK~*D@#Gpg@+3iN3pRM;N`Hfdjj+Ao4?ApcB0<_K4v{|w_gh(4h4<11rO^EG%{wF# z=Y*K8@6cX^t}VWhU?<|RJw5~~mD+e3MbFXGqZb_R(x4(d$}WScz&f%IRY6F8&RXy} zAq-MAW^4&fyUEXF3>wH5i`=09Agl+=GX?`J=A`>eA&gy+a*+t z-QnsKC@mU$jUyN%YIYoxA1}7&dO578|BQZo=Ka_zRriT+BR$2*qALVr@`V9)-Z*f+ z$`%n~rJ5`c61{JCPyx~Q&+AC%y6~|FZ;jfp9hg1kgJePL5 zhzO*-U-6ZyrX#ILS+LB?&HNl3PdPDsc$~t_gmuVWbHLDiHOD}uQ4%K{lfC%f-$G7F zyfq+Nb}#}feTzx6t&_s$kq6BSaQEmHfJooCi$5(F!1weS{>}x$gsTF4KiJ=Yo7**c zNb?11nERWZz5nV1|JykI^vw>8<(z3N^7g$h!~7}--tn(*PBddFlEP#LJ8Z^OVR;iH2JuMrS}g{& z;{d;50NOgWFT*x5Z^Y`rm(4*gbuQMCjxF!hLQHbTv1+iTW!!Lt>Bcm!<}F!%-m>L| z<UUI!l8j>fOF`Ebf0-qO=fUK?FQe1`}Uj0jvFB7R{t<~HlaC1UZ zUCvjiKns6?#m?O#U^!TWcI1l_NgUZT_NJUIAD-Q>g9p6(x>RRox+G@q+pP>H%g zSrh3ISmZyJe;=lLlXn({VDrOKamY?Ci{C1y64dshNz$*5h~_986Toqc%g+f5&SP?6 zYuM+#!8Ydwmbo?jxCTFhg$H0dNBl_MHDS=Z_|qLq#Q?=3x3wWm-o&)H2Ooma#Vfdq z{lXE*xpeTx?E{l7p<3A4!`tWej;Qlg8BErs48qgY7~8l>U|G1jpT_~I5x@BgEd zFDDT+3$uc-83^6+kk0{c`p!^MX{Et%0}(kqE}hN*P&ZU#6*l}7fToehAX#TS4h=WRR4IX&{d3xE07D1e>V*KqbzkK- zTRTKcuxox#tklUr(YWmf5Vn@Y4%pmq1Qguoil&IFOf+uxLw%P6(si3!_8^H^r9w}r z#6Nx{h0UZ1w!wLyR#BWv4Mdr7pBfZ5H137t*9CI1g+s31g1s9Wi-$)~Xh&F3$mL{x4QO|t99+5?_qvRo*#k7Oo%^9i@?r_{S2vcAPSd4PNA(ISm$Y?%cZ}o zJokspqK5vKN#&>oD0MToY5s#kCjML7Y)yK(Xl7{K{lg}XAxocrcyC6ClB=;jicQHs zg)5~4d=7hnt>EySW=^u~k8iiuZr0!pQAGNE;*CO1HgrlI{^BKbM_W*CJffMeOd5MF zV+QwJV5opbo9A^#`n3ty-E)i!E+b`1B{r|a-zz^3+^Ee!gw}KziFPfMqO=Lg_k>Yw zPKt_B4tV)~MEy#I9i^xnadabdGNp!cp&P3gl@^GxO>{zC8X&jja0mh)4(6>(4805#>^}~OC8Sos$BGf2-KNd+0(Ftf!8I0| zt37vMNC+dIoztoKqY6~cA6-Iey!CtqYiif9KyzneYG9^YYc|&dLP8Fj;N_7SRB8(2 zK9%b zwiO8?;MDmaoyI>nYpksC_p*P^f<4l};`emDyoMt7*%_w+(4Q@*u5Pt^EyV|S3ys`v z%1+)4#q!PB_BWHdpddfMK~oezAc;e-Qvw3xCrarU_P-Dq=+OC)s(TtGRBF$R?oM8% z#?|ZvebAK>l6bp99I@}~$pBcW43|7V@HRgX2}=Vt_uh^rlcvZrqF?N>p-=!oH`NK^ zZnS~$KKXC$pwm${Oh`=`x^uW~emUoXuuV3`_$?;+jz0PC(TvG2QSP+P&>|9xUQ3f2 zku8>}GG(|fD{p=61voW0_F}#cY?P<1pI^SkNsCaE`w)R|+~~07oP)XX2(&1TG7`-r zi7BHLc?!r9hZXwSzE6s-ae0%V&J9)ZQw$>0vBc zEX}_0o-V(lEpVVObzm?{8pk-IBqDyholVU`-KC*1+~E^toxPHr5;ila@@H|pQH*aM5GWF_j>jH-6 zD>|V4e!$UaDt$s1{>Rsq0!;aDqUcc=ytT%{E_k>60%qj|6#2g2VICmx)U;ZAo}vGG zWNcg?bn{naFj`mnB*S$RRvPurC&TaQJDAiOepA3IvMyBU2S_;?2rmOKc1!x$Yy`m& ze4bBVEZF)TsTrfetc)1GSIYn_6zjZhos+1Ofxja`@SMX+8{noBQBH92?r1t#^_Bl2 z=CS-Xk_!l@>(REySF}9-=-Sy6GuMBUms|;}jdhx0^A|3|=QRom5}c*M5=%*zgg!5S zE|k^7x@iKQH^L{EH2tAm8QAeOM%7Ej{(n6t3V95y2`kD zm`;{C^F|s{SU?Pfn}|#m_-@6pzWZ6W_PW^cjTmw+{3ozD-PWa=Pbb?|TL?6|J&mV2 zH9v;-I26h4r%39CC&4>>qzk9UNmH`e>M;d)-UE$Ahi~KdmKS%p5|64Re^doeSjVKM zR$EW$5z|>nYg~W|5hO=gTTGQ+vXWr$y75XY8c4d~IqFPMQPfG5cgCIJOW|ppSoFhCl(D;$ zznl+CXgov(4gukR2NjY$Q3k6U>&~y2h(akNJ2j;i%Kb(Yz_`C5akP(gVC!e*LaqKM zsZlUXs0-zma`-ZzA)s7*dmrf-z9F5NqqT&IvL262{bO@DYbj5BL9l8^zouj;o~wFe zAVtY(fJ)bhF9{sbdaRcqb%a82M`!Pyoh3P@Fo015-R6zSk0~m?p@&eTJ}t#jep^(; z_xjw$FDWNfp|7`7V^%iE){geV?cDHLULNp4ZtgWcadIR7GzC!~%R5V;(_PHFWZ7^B zEdwK8T3<;?OxOZo^Vc?E7q_Bvi=y~4qZ*fh!WhEZRZZMc?X;^RUNmUPV$f9)G%fx; z{>P>Gi*z=d%>9Mx-X4(_istL9%vi>#RtAm0`rA^Ot6tvrgEyc$+#((=@l(jZn3QN^ zl0_!X($#JA^gA1!U{r{&G6i7&JOX{#4d{U@Uvt?v)mTX0^3!a3M2@}5b;p}nM0a*8 z6Oc{+!x4Bqi-nek)#P}vr>HHL$-TkRj?n%3{ueflmL$Z5Fq{b7>Q57l560EJPe$a> zzpKB2Y79|cctiO0m_c$?|My9sr|@?SbmD2}G@1};r;)$sqMS^SD~!e`-k(~5rIL|L zaS!WiqET?-A*oKIlxI)l7JJaTGcmRXip~`-jPh^%8?e-Nu`@yE5gF*2zZ>*| zaPyL5$d056IJeI&3Z0nv^FM=^%2%BdK3R~HN+c=bK3d|=09wR3K1d@?8AAd?OC#y(#xK?P zehE`K1Jir9N6SKVcN3~Autg;_O8GTNKyr&ix|%PM*3(0p!v3zz_(w2mEz|FmY>Onu ztdqBA^Wa(15%)ceN$DJzy+D&V&)c7`{dMt;pBF&$R*?qy4oPL&+N!>kGHLihcVJ;< z=6PYYTV&BxAfPGd|Ml@?@Y++WK&qXBMJG;`#`%1>SL1(5-{|t1^mhkrK6m9 z!0^k4%71X#r>mSEnga5muGsYNYThe-nBW(L_C-uI(Vi!mozvX8rQR4cu}^~oG7jUO zC~LnFcIRI?c1H=KyzFX@dpC$A2L@SXgigTH1a$CXDyZR)t!?*{93tq{zPTUs#rDOT zcj?iC$%GMU(G*O9+PAHL@{qZ$-78R&@>P72N)8uyVsN) zOJADI3Rqke;Ljs|kH9L8o*WdlkyMEzHB@LaPSu;VoSDB%?kfRXsezF5YN=;i@0lo3 zbl!U$5tCMzeb-7|vUoa)XfTjUX@!j*C})@uLb}9~((9A0|A(%(0Lr@U*0%vcLg^0a zP7!GV>F#bMRJyxEx?8%tyFsK8knWc5Zul;I-o0o4=X;+S27z%H?)!JeTIX8lv8usf zHqAI7-}0I08ro4ihq-VW?P4Tz85Nn&*G+2FTC5+9CD5Gk`j%+qJ1~ef!~DKj36uVL zV}q{lX!dSh#P4Tfgkwib8a}qu8!(A%?s2_cDD~U(Z43PxN*cG$vDR6kuJ5*4wfX=;?(_*@IIwF|H!f6N#>XYbH%Xh^5#JLI~W%{3xS{k zb)F$dULFr1U;`$LRYz(Kz}_e-mIvcotc<-QhHK8|a#FFUWrGO&1O)m=!Moih*77i)$Ws_zKqNQtiQ` z?;RT`yikQGG~74)Mq|OU!^$aSiQSFM^34j>gggQY+;iwe!B1!Y7z*`OQY>>BnP8io zlCnj?YR%ed_j399to2N5ab`ecGnX&9y=*?B2aSuDZ`fp8Jg^q?M-Z+2Fi2N^_V=hvCqa3pMmW>*g#7nV>N&pZ z$S3VkQl`{M4S??HDge9?bvAM_dCK)=8cZhzrEAx}k=Zc=4ZuB=?NTk8r+{WEZ<;HS`8q}pQR@)~T&Wg#y#ll_@WZ7zF&y-G#7#qu$tCx=*S zvxU_+a&z@d>NEV92TjQ5@XK6E0=AKl53OXG?1s_lcm?bI*Wc~-8nH5*hs*7j@{#Y< zN;OykI4KGdpLYRpyNrc{-HfPY(<-#T=D$HlV=z*u#5(M`N*6>4!(%Oyyx+1`bl4!0 zHQj5s*Yi9Xc9YRDP!JGUx6kGvFG1ht0*%}%r5X+=YcN0=Y>)A|`5kMu?CFG@r&?k> z{#gZaIuG0^O;a=bN>)cpJdTKWApx1m|3sfsnwxpF7BBU**FVH0m(EbEEZm&MAF~*zXI}nPFczH& zkk9KxKna_Id?Y&cZ}|;8z@@#9ZpwzH#;K5A&JDp%C9pz*!hwOR6JSuQ zAcn4FXXK{@>>Q8t*Y-2u@@R|dP^dv<&@PHaPk8PEtR&Vd6~x~F$&Ci!@|J4N+LTd( z`5X%#I9wCAnWg6w#^cWjiK&;sUZXb@OB2JO)zASzpiq!2ESi;WjjSC|&SQrC^q3}C zFw}Wm%#BBifwFB;&EevI0|GrRUUotX@uUfhrG{1LN#JCj1t~ebepjGOQkK^Z)){B8 z!U6^gsi9b40yYUIW);%GJa^$(altWXig zG;@2JY0|hFfB?RPI>=4`2!YS3?+0k3e{Dh0)vddUyqne>PaBofg^Kf_>*zHNM|_-j zD688woMw$xCWB539O<5QLSGV>vPrYY!^_QKQwFn!ic38GIcf55UwT+gaLepL?}eT1 zK?En#;xpF95oN`HxLHijsOV_~3<1I~R#S`-(2z}FOqDDP4 zQZ^ajy|?omPW{)96-AVcU)|s8-^|x*3Xu1_l?N~ASmtm|pIgz84M0=cic**JoxYu? zfc6?VxoA(XiE)r`&Ih9Yl=pO)VZzvA(yjupisQ%bMsdRB;Q=>Q(dFUfU}rYwUgBsr zgG>sCOx4;!o=mDqtLs%IfMCo656r>Eo@zXsIoG-XSGupU&r#(2zCTnFFzK|FBTub9 zTx8EXTfobf10lM^TIzBk0HZ@utjQJ0xCXi_)9I_GG_&1xUzE&lyX{pt=pewLaq8C6 z+yiN~8fcEymMB(DL67h?E-h(~{rc>=;cPZqFwhK`h3wWd&RzMDSRXM zv%RCj#zs~|oIk=<^z2fv2{?W;>t&tqvYIj|{1Id9ZzkSt6kWMUE^i9g`1^ptj5I^;eUvYU}>=Zvll{I1Q6l+}*y?3f8R>n~H zzLLNtjhC>}^}a;eCqVG-uaEuNX^CbEd>)J8bT4~pF5uqHG|mY<<51if1(*4 z6L7pgD3<9*(~RfdN@P+Xe=nx0=Y~r33_%aE13a4shcN^G4xrR z3Pg?=DA91djXxTcB?>C@Ah+-K^_#;DsuLW&OfKgK&pXuoM-0hMvTmcXPdgv*TS&&e zIexfuxSL`K!KI6LHG4>ZezwFNE+0u^E=onO4#5?#m?{!&e`ndooL4?2X!5?7C#Qn3 zyM+yBGhM3raJf7^dF0(eI|kRQ3PCSjqLMGl#Y&a5%EfbbUHRII4^EjJnjREDi~zrxmfhoO1L zY<$tT`qN@GNL)=TWBmD+_imS5ArKk|Rcy5z1WbBf!}KDxV;$s^Ei7`vykl#Ud)lr% zAX2Lv2bO654*#w%Crm!WTv{k|FjvOPvQa`N8Zk4i%kD@sNeYFs;?g(oly{XJZYPYnJ?;}R z0SCB023S_kvEG;bl+xOu^aCe^M#69^1Kl4+%HpLq_xU`jv^BI>G>*U~GEMQBrPK;w zu4QfsAW>^j!lNR7IE;U)Bq4b{JWT~VjshxEJK^4>2Z%Y;X z-|t5PBYetq36(6NCSdF?_5>%+K=jyt*);H#Q5W6?R71vW*wgUm<^TyCB*9l%nw zkF=}u3`y7-%T>v>p#VeI-#)hTG3SMQbhMxJ$5738iN`GXLs%s0w~F~UxnbbHP^ z^1*hz-I*hO|BwOP56Q1w&bL1qj6P&2Yz)*PoLxnWU3>J(rAO3aJt~x z0il|ZMbcV`pHniVS*LcOQCq^&mG5?Q*8E4gF8s3#ChYkA^)+Zva$r5cR5ZiH7*G_Q+~}s!cU>L z2Y!7H-Nz;r7MehEkqel%b{G(^ArML{6&~f z?5IQ8DQ*#AUQJH^(I%9%2D0=pV_)FPvo9Y3<|#9ZKV{WoJs`ZvD3eZK`!-=4+@VX} zLGI}Qr-ycq%y$pkxD3=^y<53!y4amv;rFGNTj{tYEF8F(aAxITlVld>f;TyaF+(uo zQL6!}Jp6>`35r|yQ13@Mqc|Dt4pT`S{NT213n8MbUu6R^SPkY{$_BL${+AW8-bQ&XzTU+YW6 z|2?_^B2>!eGuN&h{q=G{M^{(TDM}>LI^B5woPK4p!d`r-W(o6L=)2MIAa5{;#gRd6 zZ>rFMh}W$m=6V)ZjK4BUsTWTKGM*vvJJQgqxUvzQv8?GiYP>Yq{9h;EWzj4QT?rgW%p|euQ?bOLvw?(5~Tc=)}8k zuW`pTWy4s%?_^=5uvyLlq>W`oKm;M)_~YJm`O%!IB}hj-QaDD<+0?)UnIX_#UZ!s# zXc$=bjFv;Akl+}N$1fwzn7TV(h=s4stcVIBd+9{^^saIK11hPIm?M2mWQh~L@oKE? z_nHA|%ocxhVDx`S5*LL}o7k2Jrl}7`v(gzZUaDk#gd~y;yO_e(KxTw`jD(0u|Bli6 zc?gdxvrM;s_$4yo{$^Tdx@n_l^CT3lhse_n5L)C24TCu%u5ocJ zy^y)THzURoa<}-f@)Fv@Dm7>b^|{M@%N>X@6BnZKM76SiHD9nrc>Te1=JQW_7SsOQ zwgx}+2!%k;Nc`2^ea`Y_n4{l2SXv3_ruH@yNaXPfJ<{>?-)lkoT1VXfUM#XhOp{@MJz&^j8f4=&prnS^ zU7IhaX|(HTLrx9aIk55H`Kt}5G`{WSg(;*fiZSP`&zpIM?@^VsdOi)`UJ&V>MYVxR zIAqTdr-<}`G&yh>d7`h}8BHn4`tX@fz3w}&uaMt`VUxJnpB*P9DZI5cBfN&eFH*}_ zYv)klugR|&xI4SLtGEfaA7VlpUT3#h_yECSsHsYyw}TegPz_)Xu4nx3^*{m^b0cyvOGctL5HyY z6#GA!`4RM3zU&dS2SSllpJFrpBPyY5v z#xDsL+&APlv2cR(J=4R6sGI+Ma8-!b;9TOk`ZdAe{h+*Mq&y zA#-5S>|vWCB0g4BDAmdKF9mo}_ovfI$&f&yj|eJKMnhre%ISEq?bN@TCd_LF7{OI2 zIojrOQN$ep#yK_As0BBquhudD_U9&LW0tx<5gm+V&V~_bwG0(f7%*sG%dpf}6x{sv zUAt-rqy>w$-TA}05aB$8Il4NoGmI(IHFzkdOu9{fgyzfJZU;{P3~l+Xz7#_$S7@vf z?rbd4X`S1hD*ggesT#?KgA`6%ty3pr^0zifWzQwaX1L?lccwB{frTl$hu_Rb!Xd%# zv=T58w}T4|I)ua}p0Pc{Ko>CuBL#+%S*sC~*=GH$*Uiz`3=x5qQzDM>fa)o={wL?j zT&D#rD4oxa@OP`MrKKkjCTw8BBSr0aIJKE2kYn{)zWb=F~3mv9n0mIoB@b zU!V3dJ6wrYWv76_r+dkox2;YmS=}Hr4${Tw2TGiUl&`*~;D9a${$HJX)q8Lx?aOI<3}szX9fn=X-Xf*l1Y$$0A3O;29uwvv%bVy8-n@{S8H zRzAY9sxO({c7kw)QvL_y&Go4q)}4nWQLONrc_|@jfUje&2Zu@uji$d&lF1zdrpFF; zl2q2bRroxzlH#~Ov)c6XI`+Pwd9^wKzEjNTTz!f!nYrmb_LgAFmyGmh;HGYeh;mrU-2p`xhp4|Az%Y z57qRIbSAjz+B*1y0^^W?=6XXtoh6yE1i}UrTf=Aok*CNHX6S1ctn^= z0z!)Nk3J{%FEnzo6^$+hgzVo%-_9ZgO1Oco_Flxx{+oC~tg^b|j6mE$@prj;#L}X2 z-R47u!WonITz_tGSw5@TlTY$|gd(zh!s%DhqF#oxzQFlIPYKK0b;NP_(F{Z#-lm`c z5LX+jK$recXKYMT8+a@W2WA*oLSjn zH?~lvMva-u`J|1CIp3%k!a^gF%RX3}!}G^juH@Ec?UJ*FROqvCIxiH3xCrkckhrn= z>NJ(tAg}rJ$;IkkG{#mWR<9C1KC?eEzP~gM>O!s6Q5w%B*1LJ~ldXZcDJ+jDPjyc_l?!vXJt}*RtW1v3y84 z-x=eAuLn7XN{f&+x6^h8rl9n5E&Ol(96>?+>B69Y$KziQhLr%giZ^>e?n7T>WZ*H_Cv}MLbo6L8I6tnuiffum0}J zu`cfODd9J$0jLsN3^l&E&|GW)*8pv1$q;*lx%p~h*M`NLV_!MlK^ez2xM_gvI}mE9 zG>3%uob$@7C>0DD{Dj8zyF;EB?_95}A4k`#Wo+F}y0H%l8VbFqgTTBs+>wxEyl0>Y zpkD*(I8x1XJsd#8N@W(C0F$+NAESeFPZCZSmw4%26syPmHLwqSn$B|Vi~P~!u+(z+ zc674&r7%ly)&0-&ZlDTgXkSY^O2vKwjAk?7FsQ~6Gv2>gbQIIkwrI53^7-ZROQYVx zT(i#1db(lG-ejJzulU*G1ck4t@qPc<)^uzP?_`4cRLVjV#~N}$i@0kF;Qr=6I$?aQ4)i5Hd_G0D4OldV`UKsieXZs?(Q;^C0ZAs0Na=`y96T$UlL>$`)v4yEtRY zl=-h=-`^iT5q7*!+$5-Cz zQE3u4?k~oaXHV@|=kkXEoq7_lPWa8~Pvoh3S)zmw^=7m0Oh>D7HTS#bg{1vf=lQ_`lYzHV-X1ryNpwF-tL^!xHYJfMi<1w8j z{3`jK5rU2{92U71is`rbRb`SA1t){5PpITWHoS-0y?c{e<-O>TPcmM$erO+zoTsMJ zcw8D9_lx4_4pi@xb*n#zz4_7ZDRET-8LPrconfn}{CIyuFO$+>VT(z$*B3>`Xdh?4 z1MZJ9m792HI#XFdAT70yp*&1keu!U5W%(kbS*icc{F~Ww#V4|2KueTNx;z3ci@+fP zo@$5d^K;i}bFup;VE8Yek1?SeP(&*C5U|F+BmIoUMu6NR@sNjGCta{7x1x}V?E`d~ zExK@Z*ylLM5nc{WA5WQd0)w(oUd$u{t1zKlt5QT^*nRQ+^NB^=ln_ zo~&_>UFmb3#MTBy@PCSfLRKuAp-l>T^p>BVk%&9U<-BHD^4I;3#){_jGU~awS%&n? za<~o{!+?dM4!?#+YiPPz+jwP$P_Q0ds;RFC!Hy_*eQxgCJ7oHjq5yz7n(QVlqogE0 zU7&52f;OH=@IYu2XaTCgY91W@sXVqlc<;Zi2+>MpwoJv+DE9EYG*Y(EU#Z<>$e|nd z{T|zgh^oWs)cT3m%*G7i6+EZ;bs%b4GJgdCYph(oIOyt+sdGBfClCBmU3W024jfPB zV}JT117FQr=P)q>ccIDZTmreV!ZTb7fX2JcmyTunr|3p>BPgICy&;}b&z8xzvcAYU zQc5MRY^GZhr^qC|?|+zI0@&zQ;jmAotL8CT_#Hv(z2*R~XrVKJCqfc?rt+BT`v%I% zHMoo*T|;Rr50-Eq-3*}_5OGRHMdKC4j&=N{(R4H7tA>a9UD!v$@PGXc;J_0HFgAi+rOXuqHtD_q58C%IXxlRBNqHtdTX@vaW<>;kbnG3zG~y(yt0XIz3&St`iTLl zE9Mn)Si+9+O--|5d#I)v)X8S(#LnzT=Wfn-6d8>VL3gUd_6mRB>2xW;yidV;(yEkf z`+32fZ8cAH_(dvXGiYr`L*A(2S2(57+CSHwnoNraYLus#B%m=MmD=4_Ju$e*!MbE3 z>2MJ(Jb@)wIsy`5u8qQGPL~9KFxl%}#&L*eDE4Xvq%p}Zm1pl90Tk;ypw^e^xb#Ch zkNQ?vR5P%_Ze`I#X$-{j)vbnu#t3Qu6**&4`pR4#mf(*3|w<8HgEKN?rEuA@)q~^w@+s^i;(^6gSmv3Uo`lUayekl;zYp z9B@4YY(Ydf)cW~gR3}-yXqjJY<7VOqD>JU4avjQ6ZS>Z|UU~b>V)K=i1<8Wxws7Lb zTksr+#Jw(jSc8KKN?4=>bb`7@*&|og^DUO!j4pr&0Q5IBhC{kK9M$O(d)QQichi?1 zW3xbt<^t{vkayZ7D$^pw3zyi*=>iZi2j*%l%#BDM6+5)U&eif%ZCUo@v>d^&I@nwX zX!}Yg#hh!gq^9Km=5h6e}zEQ9uG2*BGmdZ~#*4egw=QN)^y}gP!5>E$AF=G)ds7@? zhzN}1%B_sM=cC`tlB@%IH=$gIQ~YT+Zt(KFU(xk`JF2@|B!>zm-6l(%+6|_G22eJuz#2*xTx;1QpZpmBWDjjq z+s`A9?vFs-U25=ZFg)5oQTna}28zAbgf*@OQ)faMYo6Kf7=7g!y@}Ccvy;W_oX2?a zuma|QUb5hpTn_V;hFK01(^E_=9G{BRBhca=Y#ZWbU=r|0dH9EO`!fn`dUvKWdqyq3 zQ{4OsO6(b;7GOqA$V;UcHM|>S6O%NFfr@&ahv3vqhTsEgZ6!!c@FJ~Iz351zI zdz9pA>KV}>wC=^jrVL;$eJ$jVT3cE} z>RyCLqenr5@+Rki_Hnf~y(@k4|H;n8~RUny&PC@{zX-9+gyr^Q(Xx>7^s9%FVqN!+RMYU5w1$`uqgd_j|{gW)>#nLX{WsI?4cinom zRP2|yS6u_nPDw4BhikHmT7qutD5jZl~o>weH!8o2ig1$RUQ3OEXa_>ycAE zs{z0IEf(4D$S^G*XZ2)WpLw_(pObluYU#$U!{$K^(^6&SBWgDH%bPD7J@^&{w02Y? zJI@9nY$KI8HIK)eEmJun<3dO1r@~?+_%Yh5-By1615|!n3Ez;eyHuYV;Wr51KOXaG z{(S)l@Q^0iW;LtKj5@Z`1$W&X;+1D7y+m~5!f4S#oeoB?}PklmWPhy8*f;fmn#9Y4h+lPl+Wr|6QJ%{1}f0nKb9mhp`qfPZJ zjgQn2q;5?*2-UIm`KbTA3R?N#91pRT$i4gbMQ^I=9fONxo-M*-7u3e(I`i$3Q5~PjNB%PKTyjP4PdAgDj+jY*5%Ij)}BcCg;B z)8U9=X(Y|>XU|mIi@L5$>zA6e>`sL38Fk1eRFETV3g_%maoV$G)49@R2_S7CA6Tc< zvR}JwXBK6#50+G`%tO*hHt&@+515^#DHI=d&(v+}hr|JFVw?=WmXRj8acyVp)AJj} z&EL^*ITpg?FJM1XHB>hrcQ(RP{{hud>_AlUsi5UzQ`2amFz@x)F1JyO8eKQBCS|f) zl^lk4B^nz|rNV^hCV{3#_M_zih4`nNjf8UB-bqzmZTJH0UahMAszGI&8GcwoH6+gS z-x3Idhpk6#cLQKj*8mhhLhWPo&1Ul8HFNnsp`qN_*f2k_=I8H51K}qw8j%$av-Z;} z0o@OcY!U&I6B*~X6N<8vwo4B4<{Q}jHiCT*4{dkx+=mU>Wg)U$H-DN$9t^10Ezkx+ z2Q0`MNpR=co;O*jIyBzXgzn{XdkPNpS&%-%gG%IDG9`^yy75$n>{0O1L+GdKVT|R) zF!tGo{rcrcR#ekEIa<~_R^E!w%gi^l@NToisivejd_Pn)&6S6_k6Pra+nC+l(YraC z&D2@M8t~0)p`C*n{JykNhBMV8Dn{_(<{OxA zvMmdi<*MX$?qMs5vI4IjW`<8LV#W|Vi&m1y+R{B{`F0WOHX5dxyg&4cNagZonym?; zODjE1$?lqz4bthC?qS6Wb&jigzqm6+?4LLq&Sc#(_PBENjk>~1xi7oXtWKSRrrRaD z(Ix%egDR(TF)L?*R&b@A%rKFZ7JL+B^KGPyE*Gck-77-7SwUdkM=z@LwpDXOVjS@m9Jr*=oh8cNuUcl+yiq1cj~SV(mpV z9*8$@^3y$vhA+(EbCmgdstWUxiay{wz}s{f#z?E6o6InIRQ=u5zjaV54l~Jb#Y+kg zkvbngoc&Vloo4sZI-mWLKD}I8UxWK4sgS_xH~+>ku>c{KIAjPzo0GOLE)@k{I78`1 z6Jo#QnDSEr+DGll+w-hfOht(Vo(q-s=8c`fbW^oS&_TjjIt>Jv8;!}V1e0T1q=lKf z)U}<3^G$p4pj$kiec7$Lq;Af{Xe^PhB$ui6JbJ8foS-!N+>5wHi<*&^q)n#YBF;%d z`NCHXc?9EXd$=LO5w_4gMyGY4rZSIJR3*!#pjyXn^&7}lZS_#BTc`Dy>lT{#zmWc3 zLRq1EmxdG4Tv8z*4c%})COPQyict=U>w3jz15-72#30#v-Bx@m0M`4_kzedf`RyZP zWf$5ca!-1faQ#XX$b>orNgQXb9P$&2RaX+e3*2M0F; zd*aWJEF+sF(r+@{q4&(?KMVKoJ^P>Q7A#{-C^+Jjp0J zMxfVF#Nvpvg$DYEnHlr~7Mw4XRh0#{-B3Sfo6VU;?2}}$8}_Z74h)vZ778qGJP=1H zxLP9_{bUU6NUG9{H9(P!+pu^0A=jJfH4wGTiD7owww31M(Yud9%NOf`A`_(;C2i4i z;twa}p@nIPB5T?HaOtw|kr_$$mfM5lGC$(66(3p+QY5$(gN!IdApy=YRwWgE6;QI! z`30sk%7+W3$iYopHc&y*T0?%#mDUbJrqOov!}>Mf&=J(@zD{$B-*VjX;PiWffm{w* z{h1zdw253)6@TJ|b|THbq{bUs`9eMpA@&Lt>YruzwhAthg=Rtg>#WIODQ*9N8_)Y_ z8J+N|tbKIb*2?Y5UcypH_sgG=*KYk33G`z^gzk1<3w9S(2?PCN8@H00>2ZuyC@SvP z@6TSr@W3<2Zq1-!WI`{rrW;O1wYq}KG7_#v7&@Hq@w%x_f${P2?x=h{ja7F`uHE%w zQgv@;>&Vd{rRAv2bng8$l{on7VguJqwNkkFo>+HUg zsoPj6qVOXan%JiIEfI^Z2{ zZUDBfOCfE&Ro*gs&Y1INT5}OK^$UNT=C9OgG;er6K_8^K?DlI^q0IVeAS)9Yj*3&J zl4DrDj1B7Ke42=njaTguDJBfnhY9r`PXND^a z%=HPY;}7+YSbxPqJlr5ct{fI@iXK>Cd7tof{=*r6?bvgcepv>34jRhGpn8bS^`Q*D z4PTU65x$J%J6YI`JmqEchbQy3tSWR68~xry{Yah4Z5G`7lk&S|+s!VAFNfVMMS_xz z@|9eJU>E0lD9i4ByBzger7ZO2P<3%hm5Fk`!3(iO)Ia6WIf;8idqh31N5VeAjf)?a z$mgz0#MO+?h>c+Xo-fx(aAFPBBF*p65GhC`-f8h*6!eC$A}V+Sd*NWLqO^LiN`T-( z%lR0SQb`ms1p}#N_`y(9gE*d6yJ$qx{zq-s6SeVM+;>h^oU4|ebonVZ5~Z8oLTtz0 zumdYjo*^Bpn~4TGLH7FsQ4rn*wJMQ9QJ$Wtehj^7EK{|w{5lJvLqykmx#G;hXgS`! z9^<_4b;I^w((P47ueR2CAGxOrV=XCk7VzSbAJ4b=66P&hYojengGzHtKM@7mH#H8| zety2{m_s0laH8*+dkHm>UQtXI>uXtXil~_~;qMN(DWa87=qhR`Lw?O89>YhTlUUE@ zUOyi%J}Rs1y}7+cU`L34>I|VLc&t?)l&xECql~DJ^Z3H|pOxBU0Twcs!*ct+`+toa z@IPiyRGzon=UZ#B`-u&t`+P!FS7>~T!1S0W5-c{$=ks|&6qPHkN%*~TS@JqgW;9yC zsrOT;dvZpq!ZNbZTN#M6T)8-PN(^b3buRd-Zf2Oy*y&VqpEwCIu1BBD*x;6a+=nZ; zeRn)VWXO;1EjxMmbU!AxJPL%U;~M%%L#8}Pd_LfKSJzIf=U)<$gliyfaaWZPXPj*l z`J{YI?pO}zK2X|39z!6dsVdkL(aD`E3eA30$N=GI5Qd%Ei-i0%mm)M}6g|)DpFx8a za<$v2KX`Yeip$$voN3Ci#V_MET@rHRHJa$(;KCB5#?-6qtbw#I#byH`GWG@Z+jb?5k@ zzU{6JIqg#yEW$TjxRG8;5TJ=*K^7ftimoF>$NAy0h0dNO8idopitH%C)5X9z?{3Nk z=#q)4&V9@D67}8%Q76qSSm%p2xrFR2s+sbeUn${oeooza{431$$@O8j`{ZZNEUMFQ z&Yq)oG3Xu}=n`XpQR5qN{Sv_e)i&qfg20Ydzj1m8v(GdF`WjHLxrZIg`i3xnLI z45ri%GHbPL)$8%@w29s&-gGv}2&mvR7=eJnM1QlCABtydzq)vLwKv_3Ks?gj#3skt z*DUDe99u_39OTDA^NZDa<#oD?#9%&Qw?o3r{^HOSa3B<$;2 zeDrH!E$JG9rcc6z^>T||<2ZTW^&yjW z+=x*p^5S;MZcS~C%kb333+5~dz#ta-xy-&Bv@7dkr7f-&MZx$KUwzvoS7T|q% z{RE#y=@XQ({rj3fHkGXG;lk>-Y5k&uCPf;;ubr(~RO+1F0r;{|%XB$0Oll=4r;jV5 zpDrqi4@nmhpovQnhHZAq#&^l=)!lRUckxi%Ij3kUID0{etD`()5oRlk#V@*x1(&O; zZEr-qNw1a$e@YKU*UKIEMo8m_xHq)ntftEqBQngC&nv5Zp~7;+o9<#)3)l9$(TL5) z?MU6=mTk5$h+O@FpYFE{@`KoA6`cqhX>gHr?h+?B&Wl%bXUp+WU(N9*_O-wXbFT{h zE5PH|{667XE?OZ~ij@E-uLp`MMVuUrq3!}&kG?>aXF-Nrpo8m_$@4~18(aNMet$ePH5wzVa!P9C z!=2QOt>RQ|1nY`f^{|RZ^|X%Bp%{5hoe3BQpb%4|$0Jr4D^R#gJk@^OxZ?9_;3dA9 z+$91*2@iG{v{c=ZQ>Dk9Ep<{=6osw2s-hMv-_XrEC)wy)+-VQK>E@59o!+Y**TWc~F6E*r>mt6}y;-H>=7_E!{~}pa)izahMBDR6Sw*|{ z1G|~pcV;(@WV06Wi=$F>_~o{C^UTVTA%?qydfizXw80yc@S@ap|} zyiPq!TU@?hdP%sxFF<;X2{qn(RzmXrIhE6m4G;6;h)z6$wrTb9I1BZxHF*5{{&!q` z>{u`*+J;g~=Rk0tHN7`tcqIe9IPV z5>)qsPEtP~p>03vdQ*)ZgtZ_EIgc=OxMRof~#V zWTE*m2Qmx?)Ty4Q>V~(USVpP!Fj2{Cjd5yfLtUFib)^{$2O6Zh{zu7mV}TM^d-$w% zy7>3HXv2nr8fOqMOd-M|Pxsq>@skhn<_O00F!uj!jSfcv2>#>b{n8%FJ8FV*T_#%w z4swVt{&@xYV}Bse&eJXnatiO%18XDlchenN9 zIx2CBA*an5el!P-h^p6$aBaO`jxqD~Hf-VUdR;g6%^q4&M1?1_SW(%=#*Ag0vdT?x zhJ?5>L<9no4UG}&Ly^z|91dgCjQ&Q{j|e3wbM$R|ykN7yhFjtW(aLzJo`%5u6SM2r z@nZGi>jZ&sW64oI)2xubbk!-4{eVrb*L&hdvPS%~326_~^R7Q0u7(vl^3c8BeZ&&E zic5i=^|PUiAFxy&MKjA+{72O$3xSyLb(4ThmHHfVC$+nZJ7cDb@Twx|p-ZRKj-v63H= z5#)>7&XdX;qiXqh1{C}bu~nyLnx+bS+~rfAJo?&?ORh&Eq&w&vBbn34zA2Df!9FTBf#wUm4iAQ|JHXs?gs!O`{!m@^qLhy!v*_{D9jftE z*kJ&t+$mM9vUo~#|8VG^DVqGGDtZj~#Om%j+kUZkwZjR1#)M{WZ^&%g7TCa9u7M1> zyePBkd$+;lsm>Vg2l1GF0Al-FL{#O7uu4CZvk-aC0@>@+>zM05c?eI~L=%Z-`coMC zoHji-DoUu1zHoD3_S3Q6BZ6>e3onM9ekAqplIIrEOL^-> z;biz%a3e;=;fH>m?z0v4qVFgWs!FSNvpSCeu?nj9LzW*}3GWE;C7e%M^8YE8G>d%H z3q<%aolKleOwdWORqihrBt^j)=&L5T{hditn+%N>TN2U83i>p5*<~$=s)!b%ih8oF znY2$39_9pXG-fQ+D*`PjFcbrZ(9KGZ8l_C9UQym7n!v?TH9}!gpUk zn#4SzhdcgQCCcBmBq0c53{~4%_L@Rc(-FUztyVh9C0UKE4(+&K^Db{rosVnQnXhjWa0zU9$Q@ydE9D)DdRqIwU}g=`zTz+;nwu5j+* zh6@kk{i?;qL0kd*N!wjc)}_g=IiLI3oQ{vYRQ1O`qm%ytq5tL>k|H0!jWUO(hVvG*V zU-MJzZj$d*XAL$jZ!QZ@pR$>i;M^_922qg4_vjVh%Dg%m-A~<^#k;%QPj2~Y>5Ap8 z6jS}p`%R|K^kVJxq5^bldq~`eYA5Uw+Mv#7e~5?DkK=~PeN;7g<*z0ns;J(@|0`;E z{+DN<OH2m)eCRME%1=xKI&jH_@=4aGOVdM>bD5?s))H%tc2mev)o~whUf9r+lLmyPYJ7Gr+&EXB5Mk59fETwBGw=TG_^Xe6SNoU;o zEh`S=`!V5{FT>oV|B1_?93uY$;uUZh*t29)&Toi68E~JqspbgMqa-12s1%f2UDtb z7#qPy3A*-dgs(jwMu<(QrDePGm1*S84><*X4ExZ*Y=R8;*jrb|Kul2)xsVqLHaiy0 z2P)-ZFR&{m;Y%6n7pi`t4N&2UzTZ%uzOp!f1F1w5uk-nPQJ}yNba{+Vr%iBHrNB;e zFiy|^Cqs*vn$-w}6GaWxk}qU^HogkMNa;a@R*?5h!YDui_Z?NqBJ7r^nBZkjClotH zOQbeU{hUS9P99?CA%!vtrh3e-%s9v5QPWw`6pEmfWC6%#_C#%J9vq&nq+FXIj zJOgjyLW}qQ_^0wDrnuUQSJ6-?zud(F>qxcfsOpR}7T#StUddh7NS*m@q3NSV*?HdC^r1<*s2sM_kHg%d7d? zIW9FzsMZii;$kb+QHQ~~WmN=UBMhYc~w89J>%ncHnM>X!^KsP$k%#^&2N9} z3&*-BIK1~aRU=Dxv7ah=l{X(liN#UJ)IQG+Z?v^t`P(cjRbt_`mnFl0(ZVyGOBaG# z+Xrjhu-v+xWU}p!@j(^T%RdN zHM=E({q;Yp6q@(Z^G<4~vTA%*2<$#ULsxMAY$cVHOC5!7GgT@6=wL{1+h}NIrDH$? zWd>(UJfCIcY-n5VeDx^zXdrkJr;TD1>v>t7uB?2yX`?wuxKB|R(KvtS5vn=+H$UAD zgj4&e&Ub_sBr>%o+s&m^vRbW{%{GK%{92_bjjOgx@{f3&KnYB>yEg=pkA0(|jOi1) z3`Zsb3c~W;eyd|?35mDea~-T3TU%+18XkMfXDYs^M6F)4_{{qlGciA$`*KFZ-6({i zuHZ2mMxQ9>lSe43@h0!1*JoZc9nn8Hjpkr2g}OkK&r2F6Y+IBL$?o0-7chQ@xH&`i zyfQ4dSoh@>FA!`g93uBV>VLg9xme^=}QzW2#x$W$8>b2;PRj6F&;!`jcb=+%2y zWtV{QR0C~d&0|fkxw{mM*X|pJ&`nWzC~(lQFpZq7ICmO?aD5P$earbDp6}tm3C{0P zR6T?DKU~RsB+3i$=V@8`ble=;b8Po?;Og zeJ07!YRB+1yelZy<$5(B0o1IsU%H*c&!Pp{-CJE&wOSzfY(9*NPLt_%!QcOs>#)0r zCB%`FT&k`;hivpVzud&PRDs&6*j~TRWLs|lNDyuIg|FEX4sQrHmN=8Rg=d{FlOH=G z*AV8*F1aV*(qBzVQ{2XfdrYTuASENKPwxH9%&P!5vr6YqSS689k$Vcd!y!6aFCx2^ z?#X8&Mtt}7YSAj;4~DM)v>ba!_n9U@)QF?4rJcS;M0q)4YocZ1TM z!|-l=o^#IoiEr>@X5V|Qb*=w(-6%r{o60Ip%l55a?cw!J#bbFG)su1iS1^wJXF*%Y z*juuq9M-w89HF5dzFeWvH=F=(_|U6?iREN z&Hm>1@7Zg)6xT(xhffQPWfhaTRPb2w4OwiSyn{&p3}8y_t?0cw9h( z@AEbfp-R;$NDaNr)}c%`64;$o5L9e=xLO>hITd8h`K$Q@>uoSAO9u968q=<56Kaa5 zoYR3E^3h~iwu^ZgZ#&p}`}(rAMnK^AI-e0mW4-0g>PX!v^f3M3gHr}7`{HDq?5I_J zyR2jLh9n`zFtUOw*9R&~!m7G+gFPY4Es`?Y4=C%%_F$7#XfkY*{$&XXgIw2;ZN~-ehBxenRQAdxQ!A&$ko? zd`A)r^A{B&0v~B^WRgP4n|;&IJQwleLzM{{N5{Y)WbuIj*&0oA^&`Z7{j-MNjf^-Q zy;9kp7Z+Di4P{?UiB$zF@U?F~S{}dkZV`qyCMoghDwd_mu#B~f+(`eA$*GEYBDn}A z1Pp<*@r3~ap@oEWlf=*QUHUwZd9n2z#IeeunN9J|O|>eRV$geZE-2 zARCyAXPc=1icof{mpaD3#jGf)%s`OOlkLB3PbH~8C`=>_VKDZF52=wiqJA6x&Si|( zQuG^+Kh{a^hXSNZK~o4<_^;gqup6RxueW8EpBI(u*qb57u@JmlnPf@J{tJy&b(|#gt*=^cmL(+}9Izlq|^*yo*G* zgP)#J5x{2wVFDRpOi{say0GLKb(z1NbZ_W5L2n`qRtj(F-2R3@8g{O>XZ&NU!b!U zS293Q+m%fINNBF-wj;+-r60!&tk0}FW97Y(7?9mBJ!OBR(_G z4Y~3nE=`u$cHpia;x?htHQ%xg9!q}gIU3;~d-Wm-#9bxtRD-0|Hvm-#da;{(YqLfP-Jqq7J-^YRBW zS9q;aL_r9YPF4w$ub3EW>gBS%G56*b4}@G;A2V+G{$b{b@B_Ye#07uzCf7|i=(pb| zXN&fjE*Y=Sl;Jy7ihK@-H?vR!V_A1ab zG^*tcA^4zG)Ma^(@p8&u0qOEJxEhr7PdMUsmdhA(=iPLUMJH)>j_cL@w59*Sx2pvk zZKHrq@^2ZFlqG(%uC0y5@0YDszl=XV3J$Mg1vCZw&$01eM=~(i_{pbK+{iYju3ldY zdkFW$8HQ6n@DCe$9~z{-^Sj-%d9yt0Y)mW54Kstuy1+wrm))0%I(j4IfDoR&8;d3J zITGxmg^3v19G1UjN5c4mf>jAY6~=L=oN1}>G@|6$ksHfMP-odrGpLZpb-Ki)N@mYuMyzf;2HR%1EckVdjXR zb&gD7{iC+NRq-!?qxUi#lMjaXolM0jt#DDnng7@@I^;TQ_)bgTsaNi$=KD9E$Ke#{ zEc>4)tFBP$)CcK`#^&GWGL0Dx6<}VdzO-2&RUk7}qcGqJM~dYDZnm#Ljr7=WtH$Kg zP_jh6N2#`DY{Dzu3lUYry%80|%_{`+5Lisq?h-zYGYn4~#|MQ@6F&#qqK_D;2zNYY zmjOSnib+SVeoqv_6x%~brPo~t;>q%L&Yh?>+>nbk0vHkWiW^?Qm$#rJ!{eDUQE7Up zXBhy9Jq`Y?4$ro#&PClpf^?7JOWpy_pYbO zx%aA@qW{F{*$UT(o&9u)EKxg+7}lIXT2|&fp~(jJiB2 zIQ(LHs!8Y8gri2j_l*w<;t@#6~S*ZR#HJD;u z-?q9`t|-e)9=vsvGn%XY&IW0$8)Gp{M>IIiGwqsVu%@+Vd!9uk(1+^8k*bsH>ZMuU zcVgD&Y!a-w7;`jao7f$?e}C~h`3Jh-+hnZfGQSrcnat}X9y^~(ZCulQ3wxR*qMtBZ z1)QxKY-PUkJNFynH;>>HCqG1_GFehs=dq+;1}GX0RIBYRRS(rvwHUhgZjgbI5DV$R z@=iN0P|gFYTMe&I$X4_pG9AJU1o$$AU^IQTBz|=DU+%0crzH@ZuHUHA?Lp7SDmN2* z>I-9qzG*dNQ2A8;Q&^t{b=3f%m`J~<@Eif;L%e&>AZ`=C^Vs{7DZZU`QkhHh~O|VP3r^CR{2{ebk*<^xlf!yb7sqh zNkmHjr~!ELm>*;*Z9I{79$5l+Nu;t*)CSXH0wo(T63vr>$!SlQYE3M|JWPHg)cS&lS18`_WNL}STM2Vw6Y8G#jbg4rcBC%Z)_p%jsnv*)RWHX> z+Qi+UyTYqT{g&fro|L1EwO!D<<(`x;6_o8#syJj?T@qk~7WFgK)@`8KD@V?SCyNzy ziDw~tmutJ3k$?#GomAuw9mU=X@Nigi>ZjvBs5N_tP8VLP0M3X$qwc55IBEF$Vmp}?bIs$cjSeSiR`qXwgYt)G)Lf7?{3;#1+@`w<50^+?3;g8J7u6L)C zf>TBg$lc{aq~iKse~R~dX3y1AB$+KX1s|r=Esj*+Ct1*t(wIs)`)eRukV9fPQMqwf zah|J#JEa?D3weYEcK94!Yt><U{yx6#$@0_}b zjYODwe+(@4oJzBY4%ZjwScm){kD5EHWcwdMV*9zUoBj;jk55kS=Fxm))p$Mt5tkoM}= zeku`Py>uoApSKUfBoKn5{Jfkub1jA zZc>eqocu3bW6u^7Y5uMk^Ta6tx)0s={(J+VZ}O<%afaVxhy^Crg;PD;T~_X)50urf z(w4zk;eUox*AK@Fa$yt_Ihjn529t_8UO1vQQr5rS#lxvEenmNn=$Z0-r8`7@kij%+ z2JbOOOufOOgBo}*{he)y&;mjU7xcM9!1Jq$Hi<$!_oJO?0V+RRRe74Lc&Fp2(~Wax z^oWfHUB46N3Sw>_l=C}nka==d?8)%Mi-(sj+I9MB(rr8XTsCTpH@d`F)BJwEOIbW_ zCqBA0!ZAkMdR!-cxVrjy)m(2I9|R6)0)pd_d#aX-w-XbT?OM z0UU+Oha$o~uRBSs5w!`#EiH?ZK8!`tRoW&L86teD-?Sm*E#xYOJ`<9h3GWNKq(m&f z$&`rFrbviyQ1aK?wT$ z2m84KM;dWHvH!D3oxL|@@p}}#YQCkvk+t_qa1@P@+g{9mlX@k**#F?Y5z#LXtePeN zl($xpSDe)}8Svm3B|KY2JJS$!D|2ANr8KIbzT3>;(Ow>p630wMlUkl?FHB|$e{0<3 zU$0{;tXPKljhi9F`m^tn*~7>2_`qdtUn`kmA$NNnGW$l`n55=y?_2MF$!AUkqRV)R zZa)3K=zS#&uN|)`zB`wc-Q?q|lf>~FN2ZHsI5q0##wyOH`aUV0O;I9dkW7YoHBdR! z+%Q4=c6rVu@ILX!TtZU=8o$s#?N&tBYY?e4vG)Oh$SUJH{QgO{y%zMS=Z2_V-$QWcV|#T!_kzdfV*)t-s~J(D7RINtEqt2@Y7~XrRy4 zAPtE$ZYu6DoG5LoKLc@a+0d@zomFXyVSbaxm9FJ<&!$-%fAvL#HIogZlLGr`)%p(| zCLiii-i~*1&XvGR{)0T|t-K`nQ_$fT(`SF#ojl%w~k0SWo`xRQ^g74or;uL zBiOR1w#)C#^so6UGCCr}jl2e_8r5c6*C%)S^*j4U1u@k?f4F)y4phVHXA=7zNi>=k;&UpJul#$a7*Nk z#~vL|lza;ZXT7!Jk|j0$OP^lFn7HG7jNeAq)4bOtAv_Qq=|fK^30_(SMd5I#Sap&O zEz`Mv#BG|9 zS4)S``3Of!nG`4PtwzKRZV=uraHCL-gi@{zVX`ecWbvh{4Et~+(6%+V7P}v_D?tm} zhLm_I2s70YKV41okR&pP(O}VR01$*h~d2;(@*7oM*N=Xk+2Jf?!$;mz3_#EW57 zy}F-SZ29|t8jT0PCm1i;zxO)VZIXBfpMyWHG;CS0eH@`i{&NOgTg_=m9*h)Az!CF9 zqZ_eL&wU0j2!iACp2MiQ5oQSi`gUOA$vgG-wDU`*w8*VDt9k*gU7Y`r!6|N*8Pl$v zBls6+&ASAC6|T+NE~^$gKKoZf@1;|VFw$2BSSezZ&T?XERIx_uKYySz+`m{KXqtIk z*`?5-n(3RFpYPy@-(f~eJ=t~edJDzvQMj?Zn%`}<$T>;*`g%%h7bADvE?=KV=|H+% z1u#!vrvi3{)F@(S`^aJ79rSboSY1WruR+>-! zdR#8a?^kdX>;vEINRILJq`fxvgIbPw29A-un7~?}blcIy-=3nR^drs65GFxYLuIe< zOtAhvvuLY6SeXUW5NbxnRr_vLBt6z2DhsF5B8T?K-VqetJ7wAidUJ7!RZD~=?61mUij}VTDx_l*tZ|%BV zA+C6x9k?~X{PjsUqt3jjm_KoN@d=A9dD(w$9vG+OE<|yrF=oF?CF@wr4ehfQs{*=p zk}{j;9Ozt&obeYWIU^&cS>x{WDBprC{Uq?_x3&K7w4X|@N4aO!AfQjSn3T#M>VB>y zmeCz8!u7jhXarhZz{d;RS0Jm6x!WQxq_>ej_dYgnPw47+wNu6W!3jDFb82VJH*gtQLZb9YsaJ1?Kwz(}yMe8Z1PWv<9)V?Th-q)R92ned2^_c4)G z^?G3hC)aBK#yYl&)z(@NI=#ynr{#@y6I0p?PuGF9@7o*lEOZ2yORO3fugYQZ7!-d# zF00%Z-lf@XVX^{-ajg#I>oDQX8x<8v)SU($8Xrl9Fr&z0nfc>Gv6K{|>cmwzL_(DZ z9v{ZU)Pw~0n8YPh1s_tV+Uiy*!EMei=F`E~An#(~GrZyOT}?w-_fLA7mJ&73q0nKx zvsGojIzrDI%&~z_uq;BEr`;jQIy>1>G=F0?cyn&36WURx4*W7uvu%E&slcMJQ@`c(E7)P9Ux-v*8>sT06 zP>^`IW3XqJyp&w5J_h@NAq?6c>m6nvW>iOt!ICahBpu)(*(mmN+(6M_*c`iMnFyZr zi%c&>6ofizj!2-oqEix_A3fR6A`0$IjFccegsxi&DZg)jo5iI92D%b`%qg9}GCYx-_?fBAlAAl9e|OBquO zQ`I2OOod1EK;o4cLOZWaX_M&D)KTQfl~X@KO|4=M%3|Q?vu4X&-=+mJP`ePps~S-A zKm)56&t1DM?MEnw+=LU~H#dCfJ0Dr7Yc4S|Vv&tHvWhVZT(cFZU8eYnCcD%hni$30 zeV~nP_qvEvoZ?Sb6Xa0uJ11W&I35?|{`~Q%%~q4v6*9-A96D5)hg?8^5AtlOv-1fp z6Oh#pGV{wOT)vnIBLi?8;7KMbB5u~``1AixyAmm5S?tD1^xkkz< zBUSqnRy}_I`^fvR+Qf$r&ouj%Xt&~A4tR0^4`L@KE7w_NS+W>Ne4{EIzEiaG{)l0} zdbWKDJEHu!{oe302zsz9T*H-PuGvEgqlA&L#oJazJ?o6ScX=Nl4#DieRn-48a3cBO zx9VGnHS*2GMVUnI^L;RhRrQHoyXrAE1dk+H=NDy?k{VZ}HCLk7{61E*GHOAlZ%6r^ z{Jx8QusG^o_#Fz7g`YUzB)twdhxoYzvr+3bz1{<&fQlr% z?d$>?SS}^KSF1YYvR<0aRqguasxCC{PkLP9#_f-9H z4Z_4Pea;U*#W~AN`1^MU#F!;Qd!j zqA0Ml&&sf_;NNE1Pf3o>riFeRAkU}$B3Mm)p2EN;d#%+2e%O3+y?XTmTGxt0W$!TWVU(*Ik ztCa^^A~s<&&os(5(4xE}3~8Pf*AONhx1GB+avmHTGH|<^(Js~-z3g!vy2|A~%CwAD z>{j~a&V`&s6sAXSyKLl!M!xq1g*Rc_zBwzmTi?1p_dd^B>|0GjT%SJw{T0xo>fqqU z9fx;s7ViYe7yTCN&dw$B8ZqJ(RNLjk7a&sBq7NJjIZH+5Y{uqh%4Cg@}@V z?>-qv^Qy>=ZL?I9>~)-d+BlW zV<+1^$63FuPKoUnXS-R|q|_3uNfmrv%KMTe*4#-bS)RFt$46yyx@Ui8-<6o|>F5!_ z`PslrLQlhYO$VW~3xb%regZ42{4&3NHV}xS=Y6^>Lm;03y&}4W^RDl;4eB}rjZp2M zlFU9HcG;??-bb6yWbs|ft?FQ1?!}J{d;2@sW2yfUo}=ZS953_}qh?PkXQrr#6oDCm z)8#0s32C|tQz7A%p81zi9En%R?`62(O zl_8XKRc#cxt0hvSf~Q~)XM+Zi;=Z}&%^)1^03MDp?V-eEHX{rRWtV65x#J0l5B8Ar z=fC!z1|Cg?_VM+Q4-pr5s1?q8<)vC1f8qjl#9SL3R=w#XYX4A3<2je9nP1*a(D-gM zo(mQ}iC9WO*3O!c6`BWY@oFQ0bi12!~R3<@BMPStT9tQZ?KDXH06d9j%lhj{Be zA^EyWmJ;*{$7EL5GP~Z~)`0+Fa)k{t{t7|2Nc($MT#$lX?-YzM7{>xJ^o-%`^F4*J zv9MgFL;J0k?&+{i{W!b{$=9n6)o(Fx7@RT44-~nVHMDe`df$9F;kKn}pL+>64P608 zU|MTOxG;VB*`4y0!Gq04pTU`-)vT9iEbn)a7n>i3CX88LFJQa6p;PBlkmTh^jqQFJfyeErRAVV1_(CLc( zrq=W{_4ymWbzFPCT_;Ua*^>f1^sTA-qPBIlMtoD_$wGu!!Uln?9Hbz|B#ADiXUZqB zn=k1~$y`Zs$yR+&T%|eAa>?(G^#}80l7X}dYufx6b-ow3NoRDLV?anoIbRKl=T?HA z(uX~(67=a1`Qb~|Aw(&u;{l@(L0s$y*7MxzArWSgPGEc#s|vo zmW4GmnjZ(1t$BsFjIB?aiZiSsH_-&b)h6>Q5>EQQL2w0iotL@Jz0 zZf!vohRe$RZp%za?xRet=|5gbBC$e1EwHLeg<~92>4_=&~r;b#4tyiT*xQ z3wt}BK2Dh_a~1!y?!$<(Y=?d8HJkT;iv^&&y@nesfl^{cQ_6GWYTU5j5Pa69&NV&T zyZ2&-V#~xQDREid(C1Xj&S0gX^PF_4+%FaBJAQw`DcZDIz-wL8rpv&LBRjC6GAUhu z@4X(j_&(FldV~M$4S^5r#SVti)N+V}B37%n+zVBzJaKg1B5I3V;>d44_CBIdgr4mU z-M*lkeurX5_EQ1>$pt>i{&K`cjNOt><Ch>81Wj3LD{W+tzv)g5hHv zW5r0|^bB@B164YY69%96madCGjv9Jvl6cnuCclw@xVztg|Ij_O28zfQ`x)E;domc= zJ^R%DSI7qh&+DgYZh3V>)jJ@XNs%-Njv8-#%_N-d8+{a|kaXfeDk$0>AzlveGDjBK za_Ee_ULOc3Y`kFIKrcm2;izy7bjcE&TCm-9K?&dCshWnY62OVBzSgZD5R;)u(Z@Qz z6(R$1qQ}heIS~I-E!krHPsiu_-hYrCk|yQ6!f)W6#e~hF_sK~h*MI`+17fn9Tu?W6 zf-wA4D{|l|HwsRZe&htbp5LfYIX@82gDf8dh$}-)`;}J<^lZ35;la8wxZQ;UMTqC* zyPSr3r^>68QH4S0K9yDt`s}mc*rKcw8zQwn)a-E%NNOAJ6X-^DM@|d%A1(pMI5F4O?(#$!lS4pi&x+nym-D?N>u+@}khQ&o+F&#;JNoz@TuKo<07mD%x zn6{%fGNsA^)L*TZxe=-!uu_&(H%u(}fWi<18mz&N?gdOPYJBRKKTmW*`|{9&h7)jd?enVi)N z91k^KDfrqu#_pb(nL`5e$%at6s~FS?*<01b=T`gcJ$}8;{=4Z}7wH@Sn>Ltp7aV@;Jy-3!b(gDV z68g{|-H5%2{WL{ti3qov+J}0+iWSGUt%pt1$L>0`<=@;BcV43kYdm?yodB}NH;e=V zl~qiCN;w*~Z#~l62{%(DfertAFu~1vMRF$rwcRD{T;=50mborUxC1xCuzPLQ7n=cx z_Hh*-u$A7L#J?+LL43Td;Zzz;Th)t+TU~%H@jQC&=Dd5s_CCX@CO$O= zc?A0&{6W(wa7N`2z$thWIh^J+=94ZzZlwCw^YZzm8pkk9F&i6c3K7VuxbGcLJpAaA zbX8PB#1X7y(edYD+yVAQ_Wh}FQTj!3Af9SCIus}Be|9rw*zj4Kt6Kwj#9N5LAhUX> zxGE7U<6pIC$<7WqZ|T&?kLnn}SJg_J{p>f1S{UF z@osChP=p5$6%K<^YyC+-ES{R?==hvc{iQL67YST2aT1=p&zXejWguFCzb7J>squ=3 zp(FL5b~k?X9;cn)v`N-0wT{>lWx}aTtopGYcVcCfun(ESxFVWJd&J&-2XB6&7 z5vWEqZR9rf6jP;EWvu68kc@z_TUu?SFK#lgZ(v z#XKM8TC{!lD#FvDaayb9d~i9x{&c~nMyq~nNc2}0nG9VVLb>`p8KnZAyHSm|{(a$P z!ld%~B$4PxfGj+;e$+xEJdP5g$Cprjm5|z9#prY`XT>q*jz`e}rHO4f2fquGCI_9- zVpR)uD@KsbUVY@*Gbx8OzlfM=SkGA)^Ud)-Y6%qKP^T(#UK>7>(%)W#JO*9MH#?3{ z#AKANM?)jORvg2#B-57d`w{z!wdMcZ(|tQj&d-k#mgg-sfkQX<;KZ0-Pw#PPg0hfU#ZMpYejnv} z#E7l|vMzg1iXHazRL>zFDj7Go(M_Zp}!m1h^{g*|6B?3 z^Y(-+{(i#jApi|DRl>3k*rd>^F0_y(jvtLy)Mdxq+sGm zGr1vgQ^yrJEwdE}p4+eGSAYF(N%KsVSbG%fx}N3Bq_00NI=*HG*40-J%MO)mfsJ3& zpF!BsLyqrwHhnM`JGe|=`Aiv5Amuk^;DvUCD}(K@9;snuhT;lAH+?0Uc3QmxVB2>| zjEj1+@&7q@9{`rwq|tX}R@F~48viAZc+{KJ-h}IT+4yG&oCv$^VR+%m0X-*@e^#9K zOc|b&6hgUN%dkC&F(nw!=<-!n#f4NCLN_G`^?NdlgERu?f_1j$i$3nOT((>j{n*Iq zj$VD&+URqH8RY|MyX#N^E^B7{3D$de5A|&O`_7ZXfurnxf3UG6vSYjOdMw$=T9z#W zKHQIKQMh0V+8M+cuFq$FvLPIx2Xx#=6WTzxK1a zwvV)tv8doF!(w5-h1n^kPaA;%1uoQWbqQTc zgDPtz*SZ@agmB2#HBrprLW6&ilw@9KG)4RC0^u zz9QOvBUYhy1M%Gby7MVzX+XKJ*-eDD zvg6_E-8L}wn_(sOb*cZL>4ix0ga|txHqKNF$!st{y*pQ2#+?_+OZy&f#dXO*pW7); zAAgs1eTxNwy4@r-jhN-%ze4Cd!L3Lj(3&TQ0(1|6s zD{EL55Z%Yw(bazxRwn)5Y1#PWQ$*B6$VYx&3{&K7#y+%y7X=l4AI|W}Q3^tz33VfF zBFl;)=@y|$U?3nxnf9C1TI6+R3lN(9W(Ug)h}Q%o6L&}Uc665Kncx~gmM>GF6tvuu z0zo;#+p3Inf`x&OuWkm|UY!iQ%~@4lW@Lx{ehwdV{5(Z;i&hDFi|D~BrgxyMBUQlf zX+SmrkzV4v>v5TV;Mj3YCf&l%wcU4jY2#gWd#!&G$JeJO>nk|LgouH!*3X!$zA8a$ z2MTBZn2XY1&VCqcxx&5Dfp3;|&iKk=HxuFYqH|dXQS5Agu1A|~+eBXq-aH*B)D~$= zF1Wi=9N4*MB{6OADG48b*;~`hSZrZ$xeNRymTv7d>s3zl?z9ZAAPinbv$%S)uB=X$p{ z(m^r>7>?3q68e&R#Vc}lZaeAclm=a5&ObK-c2PM-bf#a&n*na84mloOfhnEQwCb46 zMFAxFYcM|U70b(4vEIs*-aa^2S$2FcWIvX7DGYiG9}(Rvx9|o}zc$1(JpSZqQ^A7G zOt`AAuW7J(7uv)55edH9_rBLv9>>X6j$}++Gi{GSlKZ;hy(>hP*^Y2O>qZDjGvcz# zSS8ray?$d_zG-teEwJzBursxD{%s=dk@J|dhDmsM_3u96X`s0Z_IKszR7{#%Kj!`c zOXMLp+00gPw#29OPN{P`eKopCq!f*EIN?MK zw|4dsij&@`E24DEE;?}i=E}eiy(m>RuuuFYe3h^^%r(O0g=rjg?$V;Yp}wJMNQ3@Z zyyYQ#8s3+9bo;hB!g<+1%+ocyah5qvij#VAK^yBaW<6@_-4Z7b;j*O=cZar+qTlkw zaz^^{Zy^U@JMtk4goHWd!@JLzX0!SG8sjkwMH!;71BEOm<_Jwea3lt`$D}PoQLbr1HW9RE3zD7I|b$WI1}jjj-qY2Bg`wFe~D{ zd7Qy{P^EbX1;(XJ`7470$HGpK!aq#qjSz_S5A+M=2|mdKY80v-{tc+)iN)6Zk*vTz z-gcfGM(k6T$i~Zo$*3JMPPCbvq|8hb+Fi`6-@;m?Xhz+rVn%Cfb*(~c@tRba+=3jU z_F3ZN35R?sq9IV*ju9q)|pX!=@xqi z_sJ~)*lcd^^7`?VMc*Ef?&1j#r04dXjz_As?F1XPdue9fA)LCUkh*loBWF09#M)Hn zRqPoGUQQ)l@(k26WgZ;%6GIr2`@DT6r=HxL3<2sJKLN=2-4SZeb3u(9K&3Wz%>8gXj?mMxO2f@ z^sO?16Kg78xSPib+|t#GG=?(G2z=D=8#Y*dnyt6<;}F9K3BY-v zK5v(1Ab)*1TN9ZDH7O02+btB;NjZ41zwyqHQq5hUhhRUhGPfQr_y9=Kvw+Q5{^|<0 zvuwFY;j^;B3T5C%oMi{dJM7^bV+habYutbtgJ$oT*0ber%}^)6c4TpRe|lI=PywZBJYyDioEmD0o>pLid4Xm7%8kelLn93v2c zbfBy&6jwjrtd@&o@D?fX%@-99pBYqy5By@&^1<=*a|(44%hp{AG7b~^kL4Y(sk{b4 zB8UuRnuE?sVXCsz@l?qgjW;4+)OTJv1=j054lEU+mSi0Qu3%lHKpEoeo()}H!!6Xk zcT5EE3gW>ZZv9|6AfML=2($6Uv9T{&>W2Wopf1%oZCD{R#&VKtKqJt>Wn_X5H1&vI zNIAXp%_ocpi~w&0s!wwM`3j*!dkWznBg=^*C|x^-h%n7B<23O6$4!83UR&igCO1_S z>CPg?{CT~j2y}sD*z!zPXf%fH}!l#!p&j`0=zi&n` zFwaYumP$p7;q&xY*eqkzgdAWUx z9e^qNY(hUp59Upd7bj6rrW4|UaA}^R)PqTkcO&x0{n+=CpWg4(xrgSiFJswVd+EJ7 zFU|%>w%B*gER%Yk6-;SDVsZlalo(SeDQe>??0(k8^4DJY((>OFil>Ru923u>^8&HFqPI`ii z1Kkv^*HQKC7>J%97Y~~lw8JJBPotZ0CF3_j}8m}_#R0q z3fILG3#|}#=+TM!Kv#(O2OCp^xAHd7vD_y{jSma^r35>CKe{DfDIe$LN%ho-8P(`l zlXNBM}_~L~-Akl-Ud7Hlcb)WE*EQh5H&%KG+fuirG%oFqFl`%x3!j>v;HEQt|}J zyD(e<2w$U7Kvo(Eet1{qxUQIGC`BvO{dr^WSTp8>_|G9k=Howyq zgkI5Mm{Lycdoi)cu?*xp+pr6-=23dWMs^Fj;k`Q>^^$ImJT_Wqu0#i>Z2Jc1uO^zY<=Ak)fxxYuhy0U<-*5N{ zxGn1@#U9+b5GRU{ME#+EwUBNvBLb>4q?>ml)?K6E)5Y-^-yJ1~C|q-oKe@RJU&5Ka z3Cq!TDGZL^Eu3n1igo^S9fP!+<)Wl`=E0*Og^3zZPm|%;y%)|EhK^R+N3YtKQ|Q%7 z8udnfEcWb-d-bEb=gIc~)vNvGiVeCXcb$l`gkiuk+Wz@9)zHWTVKJzYu!5zxNhamtewE}(toe=~p2k&kR^n6gugcBN zYuG)fmC1Kf2l5%Y=zL=NKOb}OjuRM5kbCzm&6sugvTk-jl$v;N9M;2sMxDr7jX>e# zDSz$|*7R}75QZ0KRryJaxhgH*I4xICdaTU7g>kLoO+MJKIFU4F{KnpOM!T~5vm}We zkV0MFzZ*L_rvP9~|Al~_9{&Up|HIx;lV(|XQ^e8NT(2^dAIR!tx={$|{>9?|u|7nI zEK2xW?*NWL-5hiv@1~6T<5~b>>h&t5hTZ`yd))=w=qr%GUf~e?W>=WJq}fq}H}S)m zL*KEaxzxN>itiDI(VBH-mDZgkIhS_=OI%mqV*am4giN~&vY&}>rG5va9s9{g8<9dQ zkE#$LrY~zG#2(RAO|wW&0Xm`bT7jzM{`gq?&?_Y$M$EQk7uaJBar4_OC7fqCi{`1> zyj|~XEFoq5ske(aFSG-T=t`FovF-XwAN!E0qIlFII*wv@Xco3apmc^2&(AcjW@*TsQK7V*mY@f6e}0@(fhHFR!~^nnjK^7LA^yRi!TC& z7xaI(G~nSQ^dS{qMe*fPxFjz%i<9~bh|~Lh0L#4(?@e&VLB-#Cy=_BRLbq8N%p9o5 zM26Le5yEOAZI22+a*$AdD?*!JMYL#@yo?}IR--!w^nD#@a1u&Ut_UPiMxp$>NbH)W zDk+7myPwR~T$=DU%oFHIs@lZf`HaQ4`XK7RcAf-KW5S}+2!@uCd-yPr{9h&YK& zlhrr~@xrqSr-t4CsNKssp^!~o4m{hTHNloq(e=A!wn!z7>>$}voei6d01Y9TR+qk| zACwfoDEjsD?U>7!X5?p=7vGc5p3^XdfMPgOtyuRzH%xb?bZ<D5${ z-Or+J3XlDI-@)3{-Nl8*`{ff#yvjTSQ+8K%!)+U{;r|ReKyL)3rpM0>c6d|I5+0Y<}Xp4GCcA!l>T4A_`;1qdqwv0?7JcuCIk~9=b*ooQBaGK zE~fBf?o?(U?BV2v0=XyEb)XJ`(-hcx)PCb2wMBF8!)L4#+C%K}TQ4&XKKmxNAQ1{L z5xn0IC(DL7fy_Za{C3YDevmxs*xf!2&3lh+r+oxAXPuqn$fD0J25v2s`7fvHXIH#u z@5huE^kP<19B}iQpUxcA0U^3MSfs~Iqmd&AcI4h!SwPmoFTUa3rV<_*-X9)An%;>A zja)ryQ2sjrZSrhz2_rkjVp^G!g_rkmzlC56cnTpX(z0igXw0;7uH5gFg_(z>V8U@X z|C{^s0T)5dq*2q@7J^vUWejE2GXFE!B)XUGQr#lAs$#4zl&-gjAbO_bQq^ePRKng7 zh~FIg>y2wH$2d>ndj~afaYNk_m)#21(7A%>)`z#d*2%+o@0nyN4l(B23XX&PcfoW> zba(xjZ_P%G+~zG(%p2dA!I29w1S!7gYX}90`u79`ejV~G9C3a}<*R2-T0E32-t)$x zjby5W9O6XZLX7ui8V1Sr&bS8*yGQ|2FL2?em#o^v?j#gAJC||jOK}wAfCvq*`KaJT zIL$yRauc&0&mE?y-bz$GN{xFLWQXR5s}w@7iICSbouj=w+Q>U;`d(JLbm5siHIE%(Y)%RrO0mb1KUt z)W&R*)(q7ae_Tk;At5%O40)yZHC8@r6IcOcJJDluQLx<;uGlBzx6}QY;RZ+&uDJQsR`KX=zgR=lFB$YUmOwb zeV)`L+5fU$y2H`|7|jC@1U##NOQ&Y7?Y^^A8{Ju=eOH#35E*Xl8OY1LZ+ea3L*m2I z!dPDc=TdEC=~$ zI#a3`>sD$w6K|-;^jg`>Y#9Yb2R0!l_L<=SgYuMsW8nI+Krl5+K0eSiv))m@&vZIa z8cAPj+5kv6d}^);-+bcI_=TsnU)5}Afbe8R61<;}aa8&uWp9F;Z+ zo-g6L0Ow`>GVjGJR}7S02lDJ_s#*(fX-s%_DM58qoAJahy;|Jw&wI{$p6?I1f4S~`U3>4f*ItXF68m>UPppl#72~qBLrRie$))+F%aR%| z+t+dClcO)*7iC#|5LwdqkwhhO{$RFA6!BWw?f zNp*Q>U%c1Y-W66T%$1(f$}qEueZr(2TP_-=9hbcQ8o@uIqRLAi#cD%q_hd`8 zunWy|ts+HEdd_BE(@t)wtvtB5mJqi@tQkt#(~i-2hq;fL=_C-erwL>0)S_FG+0PeZ z121gyB>oS}0f!PNb|0)v%!V{~BfZ{>3NK7oo%$GJM4Jx|jQtBA`s-ys1IjafI!=^! zNn`Dl=^XqNbi2b}N%iScl{M!KEq3E!4VXBXXgKv=w9oK3(qK1Qm>_3Vs4!LgOwxWD z2i1zLin;vLbsq#;%Ptwf5dS@0#r951n}K$f_xb*d<`+qGzi+-;%pZQ-?eNUvj=(5i zk86I>b?dF5Y*7hb_9pQfI9{WcSh-kp6|IU?bUwTUGF|YTkr#P&;o-eE-qmRStR3L` z^Ey|J_9F=Rk@1ePcFkX6ODxQX<1O!c`EX1R|zRiHc{$DIOU?3!Oe)(^?gdFp*LT3u{ZB{STKG{RVVrDniMP z2g#0}A9Ntt;vW%^5}1YJse&5`y(C5)`+8$81(3#Rdn&5-R=Mt1zeV48?wQVUiT8eK z=>AO~|Ad7);_YDXySGB>QUKl2cd2@mTtgHzeP@!9JZ;xE5_a}! z*{^ zSGd_68U9P-^Q-SrX9E#g?h#($O9eq}x$U!i8{}ij72v%?h(nhk)c_T_Y4$i=WN8_(it{l)CfCs~ z?z#?0@mG`W&Y{YIsiGvQNnKCSd^dl0Jf1h7R5Tn<(Oh1*jh_cRxkT z>*$SH{;FEnXnDKN-AV0DPg`4b&GNnb&j{Z?;3qn`4-xrmN)UaH*%VNhO;}AK_kqGGL2VcMz0H3P10_{<|?1vZ0mp4F}Ov? z6T0piwM;WCiV#&?Q()9PzJ}eba9b{kdvh#7o&yfdKi26+zQYKGG66CoEVICCUk4%P zXN&&%&;dFV`rw;GkNz~1bm_tm6umTE=X?rJf-Y7RHcYy{H>LgpP#!wRlQ4fwbh?Ie zIbMRgJOb(x?dc8;kRmUCGt+;y-8zev_m}UM`Ut`Vg@YKtJ~ZMs>@z<*#pNhznK;gZ zIGE34_jf14p9KW~%??G=iM@>7%R$dOqmiw6Nv2EjFy@gs7!iTd?0k3=o9STTqd?fxf(K_rgaYaD0Vuy{__FO( zqyOjn%IhPgo2{NV>P#_Nf4_5UPcQKChtz@E&a3T4bk9Bwo>Mm+GJ_kZMX4f>#CfP^ zHM0@VYZw#!Ph}My-mHlE+f85c`Oyyy?9eRiDV??2GInEF5x@66zx{yDU8C9x5=Qu= zK1o<#ey9byI3YFt_>l0=X=r;VTQ9bozskLc>HJ8n9*HS5Ho39bc|PNJ+;_AVopw9h--KNo)DC9_0#tAFZVoXid%Y@Q`bPzFC# z|Bov4-<_Yd>hb^wXmkdte5yHDxT~e96=pkA_>BM_eJkb967eMZKgv=6AoNa80Wl@9 zqo5B5%sA0*n(JtPnL5Mai+<+I+o>`1uNEf@}C>fW|>ABr{ey9jBKB+ei}*qi%c_po?!JF4xrs_-^ybqq|a~6 zOuNY0Dvc%bm!tDh&vEVb-8e>91+VO|17N89f%rtItmY z2pPDNhNLExaY~OslxkUCSuhG2yI*OP4)w3_PsJ)};fu)z(vgfxUPixx1St;sHVVB5 zse$d=l~w6~$@bD1sf!Zu)LR)P6&bS^l@ANp)c@8}bAtbVJ4sjXD9}q7wHW=7hxh7c zQU7~9e}^9VLxu#$XO(WH2-qEViEjQvpH==RDQ#q1Y0H%<)tS28kg4#PKp=1Kfe!YZ zjP9eB?{g7Zj@{?o6Qd34nb4R8fGskXwpS=kc}aia6>@)g?iEQ>oh=C_vO3#c(drIO z6{?`F%n8V8`=-)TiH$&e%e?1G_rQ1C6D9CjG6@abH`FnAFG+Km_pikH^!oV|F|?}M zWb4bNO1>A1IX;Vinpl{s}DcPyw_EZlku{xZKGX zC9hqj)aHrJr#G;(acr|u=fJi2stUx7>^5JH~%tx=>qAgKC<Qpjj~ZxVta+niY!qMWrzZWF%md9lIlUWvP( z{_hLbZa^^(CTc@Z(Vi|kKPhuWO7`mX4{ac#ytBj#Kbt?+~{AIlNjjkN^l?wx44p?@TJz`*4;Bg#|Lxc|-_K{SwGg=LUe7ozL zYI_s>oZ&|>nRe0_EK32+SO7_yv1qjkYn*@zIr#yBlDaCyA#JD{PUy<1Vtz&7UM325 z?3RP>o%|&-Z7CAu0vP*vjqrgjtb1O4%cxvdX{6m}MD^YsG?1=ou09?<`?xcm(L7h^w2kow7GB+D`=4_SCdVK(zUK;~UcRPc0BQ+x0F321 zB6Bp)SmG&SM5qdo@wT*$8#CL16oT0NL+_ZS0g;Kw9zp~Og$%o9#Tr_ci5T5|*I=Xq zHP*H5r3eQ+I6vDiw!w8y973?1l zs9WOvzQE*da7Nz@58BeBTRx9JRPo*kp|k+7ZoIdpXOhJ7`nJdw=+(Aq2YF6pL=i8! z89}NOGvPW_4#F$7EpfrmIz_9S#gt^msVAU~^l%zbTqRH31l)AS9z#f?1(gjF@rKD$ zxroD6m?{hw?F--_=(5r?S!GXH9G>O2XHbT_Hj>j*k%ihV;jmSCHl1}eH09Ok{=>>m ziS$c|qtfIBkp}&+{~a2j_$%ho5sVJ!)S@~Ptts*`qZl zH1a54jF(G7$LP{seF&AWZq_GemETpi!aaDNz>w`rA12&j6W*y^O>oF;Glr5j97qbD z==_ub8d3)c7}qyZKSe#OOJ*}O#7*S?E0Sl}Y zGm@#(EGv_W1<4T#{b(8iS>K)C%5u!3PKvF>UAk-{s9lmudVe4{Kr@?$^xBfd=7=$X z?FbKb+n4+r^j>ayV34Y=pPbu`ZSXDW3V|3#%z$lAN$umm=Bp;qkdKlE9rWO?=%t9Z zR=^s4Yxy13QzN5<9qJ(*RFg)P@L^zb2-f=4&%p-@N?|ea6ue~ZAA9ewWt7Z1_mD<1PB3Xua z;+u6?)tjBam9{17v~T|Sc6XEY&jmq$*4?S{fPuqRY)TN6G0fTs#XCb|uIbWB!qijML!Nl0{q6*+*cv+N0?RrbvQlsmdU~#r7@L zuP};m< z5p4D8;8G$3y@_wxgXG14FsEiff8m1!k(?IJAdviQZhjyDj`(c=7l5&P{F5Z(JOF14Ad_zF2siMWPgG!(IyVt5SX>z5Mf$5)Yty z`rC5RNXKE1l2^F)x%%_W%cQI8>I zLf#WtzcFA%a!RUDTiQ8HnhfLf)!n7(PpKM$_XV`OBd-yHy7>yZpdto)Rmg*rl448y z_kwFX!=?a%CDvo|h;O;ugNUaiI$sCf;R;s~^$E6VOW{e%WF=!{C_OO8FSK*nKre5u zbaXFMKzM6x!p+UUuG6aQ3*h9XBr5pf%TxC>65sP8>Y3*k1oLokNveQyo=aXHI(%eR1 zV!n)!vF_pYf7LI$&#?hIkfs!k9-iu&eEA-xS@EHhRTeg9MkiV-I3CiGn}qRZ_-4k#I@h7H4NGqeSD-D#h%4b z$Q^t5Oii21va@3aEeM-*H`@+2PA_tv$`I^!4d>RK-!2VsWKWl{d@h z0c`(%=a{F<;a&^(fMpn4DZCM0!LceI8EI%VT{XIv6s_i^8!HSBS2hRb-%vZ|fYQ~i zDT8ItsbMk=OE*_ZB#^Ek&HKAOlbHOsndF`RH}e6w!BQ=#GO#?;Kn?)T614a8d}US@ z+63*UvO-My2JOq9M||Atluj%-Ty=n+sNCRVlv#tV3*!E8Uski`a{JW1w7LO%GDChM0ii zL`NIjMpeCBDOqntoWYvIzQt3*1pOmv+=G+69fPh2<(PhkfO_r9fXKDLRnhaXe!JJt zB#fYId-NS0rdC0f4%MtKVyC-Ma2DSJ)%)7I~{vVTs}8*P4MTd%rksFEA#)hU05hNnV{4;21opy=MKX$}E43jlH+fd(G6|d*7*b-Y7B#*44rRoLiqXd{>?o zygGZ#6jN}KnlfBz6<#oY>)25PuAnv=BIn9))W`47|E-{r#;TPbv9IFPkC&WWcv<^& zKrtjJIa$SUX9OC@cFcov-=yDkyrM~pfRFsp4Z~O{iW%AOVR~5aY#C$L316RN>3MJ@ zqJfuucq!Xc&xTh}o(hJ}dHD?d|MnOEQ*~W@ z0@M?4C~zt~)7f>MX~OQ(k*av6%~piu(Nur&U)7m20fvpbNI(h-pi}i&m@98ptsmDf zd9lof+^BTUp{G}+;Av|aYw6K*mO2Uprh81hGI?VajAKAr#Ngn(Hdl7qI?SFfrmp$X zf|zxRjYJ8nSop6oLCq_*WHdFI3!dwz+VqQ=o*%aD%B-du8iMSccpv#>Q$*8Mrxxo4jDKf&6a+4s`zCjr1sWOxbc0LThX zf?|BeD(5B#{c#2?AQo`|{*EUS09$&`nObEW(8xpv1U>6#&qrPN-5J=RI^U>lc6N5c z{AFtMRlIa~qu6!xAXg0t+93wY4rYZ`ztitP-7C>WI9p6f{Y=q9I&JrM(6#O!4V14{ z?K}M-yfWzgINqf@8vbEQqKFBM+UGT`hn`V)_H{0jqwBp#XmhwYloqo2l5ZZ#!7XYu zoI;5-dvFL=Sqc{we?DtAAo)41FV*18ulN;yEb?*}O@$`F!X=E^E|8G<{jo!L%_r(` zT*l}T>%Jt;U>JNPAUGFL#UdiGBzyBkDMk79c>7k=Abp^Sl-$J2pHiv1@xzR-KR_I+ zl$C1?N;GA}50Glj$tFHg`E7y?JGkHP2?w*jFat;H9sY^0fMv)uGo#$rhN{G(U2 zkgNXn=WRWsE`1Kt1OJDT^d+uSI8?S{(rT{sdF+ln7x|T*Pz(%vr_D7K^{AtaK@0NO zYvlYEZJGA(4tHvU@JulStPso~DyXJUTu=YM|yeGUz& zqp*B|?%<2~kyNyI7BkN-Qi5l;F2rcdktZpdbJ5S#0}{RH$*a;wqBR4Y3vGmu;n6v9 z{66b3Aor)(LUSa=bDIV~SS}f?A5`Lull@LMn3{dHO?F#4aqR4jcV0gE<6)`;t|$2w)x3Vx%|k%tUQ6CBgU#D7Z4fqa&wvf~SrXh&giG$-j@I`%ZEB zL5fC@HSb=X@PYd|0j8aDby)oKEBGE-g=)P4&^EtDH@r^Vj%$QzpDg(>{XWL?#px7xPQV!S#s>tYyhf1f>Ln~wY7Bwpvxdxv zO{GHD>>9bJW|D0Z4C*DW>pudPdvI+Yb9HL9>yH3GX9=_aDEdJ?)W{JKTp*dUd)MKY zgbxe2SNc^9W>3D&;_nV2yw_D;MneG1rwfPHrWIS_i@vrwN|Fp@aBg@x(5UAc%~)u7 z=tC^s_1IC_UZy5IU zC=bmA{;$U8BmwgGT$97g1mMf^HL$Cf5|`X=JQ_|F^Oi#GFkvTDXmox=atq1 zp!md<`5**{bGymb|L_8l*(W^libS+>Hm33eT#0#@$bR~K-E(Vk&8JNFHa%BfhG0pu zp_`>eg)qXDLr`Z??MK-w%;~rq z;qG-cmoTxbl=<#m6Q=$HMmSR4E5<86^a{H(ijW#SIwX&CZDA*%85WMU(cOcs$iEK1 zV%8xiBNB8WogVm!SLb~B)^P2|FKIL3M8-YQMD_vDI145snZ74lp7}QJ{sgzh>)I6{ zPpsNcVPvqW<+dUBP9FJ#@=kc*_tKbW^ibP+=a<%Y+!MdOS#Fw-RCz!6b0Wt4lHa?7 z6@^OnDU(Ooxl}pgiD|`n#&J6)Oci1;-JVaJJC3G^1Y8_Q;Jymnu8>f(L`#8$ZvCYN zkkgf=Rp?R?lb@{MTGhdheLk`7WWYMl?1M6jYvtRg zWPc>s63Ou>Rmxv_?V)!{dy1?QxJ1`*!8~@$=?0Hf{LTuZ=?P(bSAsP6BTP0YNkG(j)^-F_u60-;%CPdA^><0IqygL-C)Kj7}$7PUT` z7y2&t`_K1)&VSX5=<;g0D^fm=iK~J2ru)K7e?jTpGD|GoG6`#*VpnnjHR%l3R+r6>2|7iuYrfQ)f288SG0?mLK%pOcJ1aC*>}%0D z<51ZrE~xiG)YOxSlq9NNayhHk_wn+YU1B@IHVLO>NhrQKD45emXh} zsxIpZLl}2wFc;%$(tV97-O}}M%R`>dQEv#Pfe2R@+(&)YNNNF(G(W zzYl9~`#qyxJ#+?y(XMkL#?Lc&v z!d!x>IFZ89IVUNN^7<2f^^)o+W(vz3LvQLY*g8<=k}aGdJk{hd#+)#so_uTmE{Kbh zJ02dsB3YXim7-0bKwoS~Ay@oZ-MT_8MEaWKHh^bM3@$E!6H?M6Jm??^H zcF;>HEDAXANp}h?Xgo~zl%r%Rj%koQT`4kEgsO>WPWad+TQ1^=2WQB`Uf_+NrkJaR z^;;l^{@N|t3tGt?6xdn`6ZC%m>;CRBcB5P%qTyoRk=7Pgvi}I~EupL}^zC=iiRGp` zy=s7zW}H#FS$YbSIry=GXQ% zudBKp15?~Si{AI3M}5X2Cx@>H={_DbpSZhL43QlvvTG^giaX-knlfHD+Ki@s*~XYN zU1`Mfa#HuI@;%9{=a#w8LroP0ihhN8%>~rXx6`A$VfK8o#BrZjZ8}+RlXcvmr0`Ds z7?UwJWSJU%!xo(_?L%CKvF=W9sC!<-orzVI*xo}{Hv0-bdgSB zE6G}nNkX`(vQHZADt;9!GKP4rNV$LT$h890CTlRB2#G7cy;VH6m84@p%(w=)B@Aj% z=d>r^kvNkZISiG1ZBNB6q)NC&$VnfMZ61o(eAt8xkVXX(|9o1TaXswy;qPAjKNFx( zM2!6Ew}O+c3L~9_*s<#9hFGT}wS+hf7mFr2Z{dG;aq6@HAf=){iTi_971Ugecy6ht z3Cp74Jb|TSDk7qbc8Nn!hD%+6jg_xWbA4(MehP$%+|B!WZVeEi7!paSyLbwj{w%a6 zEiAjL5L&e$%@@plt=kk_a(;f0rPFA5=6^1Gt~_mW)3Lk68wi!JW@1cI)GQ_A4#d8f zi>o4{6(bD3URc6Rn*w%+6l>o1S|)X4%e{UA7LVaS!3A%3X;f|-p2%{!t$IdNX|W0i zTm($qvMPMO7pBD=TO0f8hLvec?Jo+Cbf4LM41QNZC*`$GM!{8JwH$)6(!O;S;l373 zoq_s94=3-l-{+5K5|}$jX#4|!{{Cx}`E4f`o#Jwn-JuE%$t$o3CLylJyAaO4RD_1Q zDKI+KV+{fZL!z+n1(P4^m5ilci>5*rNGMif!K_La5U>M>l2hqWB?;_E9ZnkgMZ>{7 zh?9_Q>x`1`WmhnH80&mBFyE9Xl}_aWfLyf^*yD*5GUaTD?tm>=j~RN?Ms|C6@Ik7s z<XY)A!lo&H;~OcSCFtYMPz75J$gaZ{?!L>;<-cPgPH5e@7)n)9tr*Gj3BLMW zueqK2&})KmaT01>*hw%W2*i(mB6460L@6YIjZ1_ZNYO)|vz zT9}PcRB#Td9h$+3I3{4TuuK0&C{Pd*u2O~Ag^CLoBX89uOnXmA&3q4S~29#SZz z?9DuqD{&+i#}exyqHGxRE?JyWGa4LSTQAe~u3gCV$w% zjap@TWxy5joU!AL`NWUAYR!n`TjC0`4I4-j;$zuIulQSsu{pu7hY@e$TnBsb1d*2v ziaf`{iJWe4Sqa;WYjgcN8UW2i>m4?oSF7<8efD(HssZY+I?0|0cG9Xle=Jrnvq~yTbB(BuJ0>Wb!A|4Yo~^T#5%XML*LYLNOz{v7 zaVW3nOaJCQp3_=bRzq~g3$vBL7{>gZp@Kf)s(?5B#7#ACQxq{no5_g|vN*V!Ewt=Gc zcT>15G|VD>L4tCtK^@Wg=W?-w$zNcP3OP?{r%Y0VFTa#%We6D6fm$kxsK}-tm}o}W zB?2njH_CFEmPCWL^co?=xrH93ww2q%mKP-O>5RMHVp>w4^?ffyJBV$1SGOIdI%!e^|QJm zX8HP3-Tg(uy^CXAm>LFM5CK)+KS0Q&FeYvcs&Bsl4Glg>1rji+%OGFRm2M@c`N9~z z58n>h#6G|wV7OBnVY+to!4kRTxeUVOERh$8kzB+~>4QoubneVIIkurGU45B?wwRM= zz*r&0zP4UG_CWzJf1FgcMDVHm~S@ttbgpF21P6NHFEE{twL{#T`5 zfg%sHPCC!Eqh&uieAU;Ew={Af>}{lIAhyR7n`Ff>dNky?>sa+3*kysAj6Dn`>g?JL zJZ&;B$b|5*mY~%8+E>pQuv6Wez5mc~+EOGGt7;Ausb;I32h{?4%BK=3EB5WE`R#NK zRaXU0^BJZrp|lR~2Xd5bbylA^OAKdLW!h31%CKKtji<7v5RL~UMfZ(1#j!Oo8|=VJ zuZkgT#L{q=K?FTr6P1tC9kU@F6KAopCcQ#SfO3RCLK)&&?wRU0c0LaLO_Rzt7$t&; z`wc@j1i42O3t~}66WX>|!a&w_dt?(?U`>Ke{utC856$R&v0cP5ZZD7OFa5XiSy<@l ztTndt$&cgl_@#{rr(AAg4fSktQ8k%`DifJ5yF>^29zQ%ZnuF;_VViD;(GuFGac_OM z5}@x{f=yOzIN-F{q4qGck~uW!qN*;+v-rc+l%Z~v60sc154W`h_v$q=*(W+>tOgsK zt>JfSmesr}GjEg+`WqfT&fSr^zd7#1B9Q^o74xeXh*l*Aha#=t6yt5;Zbl|Zb=AC8 z!{5o#bF{a>hUIxqw6h&R2}Db5d8oPXafWpN9^Cwmpj_}{*N2*B+jhMHM$6W#YLuik z&kPvL^TyjfxdHzZc>nX&H3LS#%0*5r<%(MWY&;NC&N@Q3TshJWKgi&wv-(f@WK@!v z>x_~jdXm=Hf5g9L7@6aH*iRXat~8@^Q8y=Vw=Ln+MIOdJc;&BBKd=QY?vp+3UJ6XQ z`CWd;c%i3;nyC{Ht}!@dwJG64(Z-m7UcS<@1nll<4a&*qgk3y1zY^}}_NiP-nTvX$ z`>phm($ZFbk|He%`(Wi8ZtP*{$=5g7xPs)NX^L?gK>uzW>wJ{z@23r6Wvh}9f>j>D zfL z3jFhGQ9s1su6965U*gt=_XAnrF=qRfySVtTsGxRFgNj2Qs`4*by;DT>ep#1Qe?-+Q z{+8!E$u!EVgi&@_AZ}@y$^F#=_ zg}%Ft1w@uZ3@RgC`zs!_B>VO}Sfx4--Dj~Ef+kycCy+ZMp39L31rS^Cn6=}6OFR7j z{&7=`Bv+Ij^U?g?+`j7#6wiZBLRC*WLc8TjBB;^53v^gLJ@2UIA+klRPvk+XtU1MS zNgrVbVFP0QyrT_WU!*T|A240$yp496D!O|7-c&HneS$L0f4H`^t6p}TJ7!$J$Mlxn zzKEgG{I#nFZ0kmRSVGAjc}Z9Thr>ur?hA52>#8GPlsI_#!knn>{fZ7^rMBbwiH#p; zXRqB*z`k8r^RX~XaAu)8&I=%15;iWeuP%?Y_#=Hvl#xc`q=1sZYdL>#6I+lRBuCMS=SN9V{A5wwovIVG(Z37{Rh*| zVW<{uIR3TIOB>|g*)c$6=e7wYT;P9yPb3s27(?xEg>pxu9w(U?kGyYoNG+0-JvIa3 zw(dO5PG5z3d%d5JXwFzX`-2^4?+GQ0kquIYLoT&obApZ%IITQ1zC+_3SW6} zCj@WeY2qLH_g*-5_I>RSw3RD%4_I7l<+%K0-KjmGI+@`UoZGSg|IszN0XGIMq%iEA zBi-V>eoyd$x&*6aVq-l^CK%GU>Goe0>YO+LdX;)1Ye)~Wyhw`cVKh@9mkam;%s5Ev ztQzqGV#R(1y<}pOx6SsPkYqRB`S@q%Y2ROyfTfFP{Vu@Zi!!89u(38?*fJKE;O)S= z_^M~8w8@?0_(MTlY#@5zu-)NVe61n*cfI&^wP?bkw|VJ4GVAO z^LsNa2@fp6{Yl7v6Oe=sa{27sxxXyA`BxU3ch z44F2_5u!Jw7$c9W6BP>3`=GRv7zrK_ir@n%apILyjU^{RWlElvujp^*AtVtSnrU2- zpuXtA+2qoez*gS(&fmn~A511i1$-klSP`Zs)!2^y0qFC-SLNQG%mh~0n zEHP)&x!`Vhq6+7_(3B3eT=7GZGC>?WRXhh(YHXx+YZsvugef`Gzv4!MU{7b(j8ypL zUvmSUR50t-gs1|xogk4IRhcgAC$Gc3ah0(w_{v~)dFwtwKGl5WUX<&4+!w3QPP?dH z%5gkLB9EgLlT*O?gp=M5HQ?Qikz#t`N?gA#?YsdyCh(-dfo#~irGJgqdsb`M`U3Kj zU+ZD>qinH;{RUZ-R!otE&R*N`c;@rO?>t$bk~ZJX_;(m(Shs{J16nQ6F&gE)EEOw;0$|h zfr(?ZPzsQY$rKU&;cZuzCv`T0D2Tw9xV7)^X@R_|LN|UD^@h$}=#Evvn`BzS*Nk4) zJo4{*fu#)+VRnA+2p{)KHD;TlpQO1&nbEcB9;$!kudpS^<%cyVv zgHjnWR5_S6k;n@!7jbKc#Q92So7lhMVxPM=8Ae*jRow8b7f@n^q|kRoT^_jNP~p&^ zgxwq!G%F4(g|2*wE{{tJl=>zx35B?`jBuR_GzWI?n5sPXB`g8R;{X9cFI2RXO?umED*GL5?E^DfC*~U(SB(l4+Ca9bE ziRmGOQpKppOlpO4_!TLFxf0lOd0SNK*B|%`6vrTn!7DjX`A*&=Uc1-hqz~apc}68R z<%@KK&EjVuVx*^0DLp3JF%>?lyrxh@>d{0OSRpNN-4KsxWWLDzgXiqH#5o*14BpZN zaR$#+S;8Em3{+BTaaIc^9qcuaS`U{VqAhQI|P zPo+Y4>Kd5OW22sv>~g#Vfz8g*6$oV?Z%%x><}Qrm-mVI8OaW9OpJ?uVe(HfaPNs44 zD#dm_YRpf)kb^RxQO)k>htt)Lk#>1ghoB3MW1Z)pYnC5U*x9B|6AF5z4Y1lhMOe%6 zmz@KQg_D%zHx`R(kz@Ng{A+3L3DmWrU$KcM_#_E3#< zLWA>2Q3jVmM$TBhu*varTw2*kIxp?44Scp&JpTS#_VPpi>!aac$N8|Ac_RvzbllJM zKcS^=Y7NQj7d_FVO93uvT!M^vD?l5KoW9x02V(2}lt$#P3S@?JTp&Ue zjqy-YLK2mwsC%VoWthrM$k84axh|E6lT{|{WzY!&jL&1cFG&W>9rBYy^lk#SM8?-q zZ{8tCCO)ql)|dD7sLUA@%0jPv&$`&_dUKyZBc9j*ws~t};jY3`Z=*(*LBn!}wMr|> zf}LvKfV;@tsQ_VOoDGCpliT1fX>`QMg(dVjqFQ4xzEX*!#9|oa?MmADRj6**v6#B4 zwB~>9AjF?}tUgCD5764EAlQ|im(77M*ZzGW6}uy*5wFDW2b-+`>=7bjj}VT87=SdY zF9F2PC&D>8Y3BZG*O#D-RtmSB8|$z^pY z#3?2eN9-FM=K&MlM)!jGD}6W@YfJ=I=-AUeg6*hhqqp-5L}6Tsl#TwnD^kdH5mbrprl`cXO(2~Q>vK8pw=}(&!*c?1yV$=O)kSZDh z8>$q!qI_JH4Earfbl~U1Dl3;8bdSKo5MsJbJk)^M=AWqK;3ku{TV_wq%6)@$dvl~V zT5b~3p9qii3VS=BI9@3!8Y5ob?T{o24!uEE>Pn8gtGX=}DQOo!*(Atu7*oMkL64tz z8N-DrKh-oM(Vkt2vm?!EGp4I=^&NFIp|Xb)!BH6&uQ|tUlXbIN=U%?ZWk=oAEWJqB zF3%yr);Ug3HuD@AxcqMt`(Kpz z2B6h#QcZYn2(N@LHek1ur6R?nsb*YG`g?9yx>a_=mxF&3C6|+!<+UTQq3R`TMl11N zQ)n?%n!JlGQhf~ad)~XVmAXzE6@r85po)Do(^x&EGOD`WDZln!WFS#58zN<=E>Yv~ z*{y#gBl_zRe^)WS2`XKOG8B2MFSz?%Cs&d3vPV)(kZo1<9&KbJ@Zv|CTh7g}@2kVe zt@L}JbU;H4Nwu*ITl_fQhS919W%El070>}CT8^CykuAW;L#lCh;_#@*4Lc|Z+Yy)_ zDl;l~aNHD>!;cYlz4s9Y*T0FrASY?jz4>-nc*Aba96}_|LnR&Ri_7&1C8GB&P#2S7 zD>pc3sOSPGOy&eMVs8w$SR4t>MfIx{oJpe^(5XOsSfSJY`!Qx8v`V`s%elH5q3bwtlJ7o@g?ipV#0aE1XnLfEV`xz*1hF7 zZzyAVdT0t6HWu4oQbho9{eBjz#8W+6g-94HLhfpA@6*op<8nBdgvN<-Xn-uk19XA` zz8BXutpnBkIbvzblO;%rjc42He^PczNn|Uvf4psWd8j$}@zxLfmo4xuwdG;wC}W7h zFEy_F@rz!J`UGv46voSdPY|QwxxmvjlR_I#u94^bZBXq@0Snf!ZM9U6%6AeBP=sR0 z`XVu%6wCW(Uxfmg2dStVI07f#OjoLZUEdt*Yn*sUe!DvRL)+BIDQ>9{xE^>qvH3Y$ z4f6&dDGs#}y8kkGJPg9cAe-EQpOR{l1m5*;tth4B&(@ezzIA#bFPL`xVyfOcM-6|d z0t0kz7nnroAIc<>3TQvLz9IjO~mBl_WHy0N}pt$mmbT%Q|ciX~$Z3%a+}grFxsuFQ;H=l+pNAD^D@ z3DSElN^V8;DXYrB2iZ&2Aa&(KQ8`P@ar3}d&Qhuw8xX$d`WUEmB9j{UXr3+jtbEqu z&74Zm<&0~@%MIbdI^rz+$?B&A$|0T2Ry|?$`f2;%=_!tYLSKT0Qvdyr`~%S@nh)?& zMFg3zXb&A$d*7Qx5fQMvc363SxsV(7l$?HvuT>pxdtmkBOTO=TCbRbk=@kCG?%;pU z_J7We5YyQ7vq0-nk~zR72bmKkq0$10P(onCMV)}vz9fneRbgeG`Pvk#^m48vb95RJ z+7g)4x71dz3Rl+amng`Q)vSD3L3oJ-!GN<*+{kCo7h|+1kJT$A*d@yJi!2QN3ecF;mBdJ4lFW@8k9GcO za&^HmZ>zG9GfSxJi?H2JztK(8)bfg!z~j&2Yd0dc11A!-Znf@z%t*2IgghCKJMZuO z-DMP@YJp^qX2iJ!_AW!e9+E(U?Q+)0tgBbxc5+1>L|cpKEvR3a#V>^iNMuD^QP^Ha zLtADfC2!_P)=d+!8Z!J(MsNJ&Uzr`{w0oT&c3tmu%?RH-|2IwLe>f}Mbz2K!VO!mdvCF4uqN2vnhn$OnqtsCH9sbN&YMp;BGBQ#&*6 z0wK*v{(xl?^{J3SH0ycYM^4~sIUh}(E~kji#N<-ASc~1dIXTu{Ig{QaoH*O1{{H?s zEq%bRf-h@Xdkxz&3Q{weHJ=h?jyRs5dz$4pu+c)lJ_H1ydmM{bw$M!Y!E>wE{MX05l@{}D~&J-wy2^=rc^Y!BT&)2N}{%mCW5{@sC(1> z-gfYe3iqAO{O)`cliw-Qqb%Z*fP%}|&7-Z|b4$I_oZEn#byeS(wPh%H73T#tC58=h z4hxkMvt`XJ|Nj5c^_5XsXj|8cNOyyDrwAByw{$ns(%s$NDJk6`4bq5|NOz}ncYm96 zPk8QozcHTS@Q2R;cdWhETyxI#GCv8qoa+6iUac-|r<9ZAE;=ekru9my|# zvtU*@%<~{`G+#brOnW6=GW?eW-&UI(Ch1Euadhv!o}HfA3GsV$ z0SGy)PG$&9lp?2$56=&Dc=1Uga2ZIHba->fm5*_6a&;tR`j!i+GQ!p?k)zs~gw~kD z%)~XaEu8G`vkhP}@Wjk|JysG&r-|^9Ic12KuVMGe`3Nc@wPS5ofl(KB8WJlzF=7l` z(ubOxbsqwx=jTs#B8br02J zW~2HLho9VJLlIsO3iUbWVgy%Qb)ribK=#ZH@qVg0O-ZyzS`11G`nr=sipI}RF?uY3 zN^ZStHgtj|H%^{XnHxt*vd#DFo3&5-R)Px*`CWKLFduR|x)G|1CDt%{_mf$CGG>~K z80an@NRw;wL2D)11^<=+{vA2g&vkB9LTjtS!>CVt33QorZ1FKr=48opA2b0!dARU- zrd`uDbiMgt(m*;y-z{j4?sfU{ ztKQtfdL(?RKv+7M68#}tEqrKQ*2TafWZ|%koJE@f4Gullbyh>7|AUbL*-O|H2ZD2M z?&o7sqLjaQ9LQSmb{!OI(c-hK-59w4#>K&#mqQ8BX>eG+=su~rEXCC&)|73%N?CC| zrEd8X_U@XSDA=)6kl4ep*G5L-UWed~ws@Sf_}!^7O)0-Zv%(SH3Y|@K_qm_0!R0cl zG7h``NAhHT*6$h3_B&t%Ui`swAmxDX!Hc6P&Ep>%eQ9(hBQA*AugAL&Z7mn?1r*r* zn?g1bJX~&P4TMlS>ju;;LV8MrMuuh_>sgC(%ZAwx0$x}Id0Ydz_v`DGVCXeAX6eh> z#WJKw&g+6A-!v5WD+NBX1%J`!A)n$YboqBt_~0gDY1~(ji0@;UQHZ(u0r!I6it^mg zNu;h!Q$P<@kxD8Vr`R0rggnCc5RsI23WK~46@KNWGs~p7h^VOT)LD>kGdm~@MV;cD zUn2D3)L@1v+}M!y(4FtM1fgdMh$Z=lTl;enJaSu_9{7nH_UJFseKBLO0~my#3&V7= z>5B!KxFu9lbWsO9yP2A|@=6Mj<;M-8EC0&elxIW2q0k3;j0?qJ&_ILz6gAA9ihL@r zTaX2_~0vM46w8^Ny0q&}xk)tbu`P|z}Hjk>JQZ(J;2OX~GJ4~L`3 zX;vgf&hk)g7Dhx>+7NpFhw}UMV3AP)K$f(PHk{(nSx&vSmE=qsux@-G(mva~!=`*JvAkhT&7eu(*FI>! zEg#dB!H@}u!IY}igbW~-A&wIhvdYVl=21*aY6tp-urNC_S}gJWwuOIkNe}{_#7iIY zD9AArI}kdc^oBM~7Au#F3b#>NU2o+ZeWANp|Et>uzOgikO6(!fWY`l$vaE6SMU^P6 z08WGaWNB4+Y`r=;|2vNKMSi0QGohfAF8^v*B(h}6>tGK9w;wPpO^tTOD)f9o$03pU z1+0kt@SP(l*ThiOvOaKcq&XOxGM&V|J%f9QA&&ST?yY$`-Gc6jyACU9uinI68v}=x zBRv6e$>~FP`7MN2&hSZ2B>Aw&9pkbj)b4eB-F~q_*Y{7JuPYH!e|R~5wZgK|-mn@f zf_b8&D6m7TyHbjl4nUhmvL~6z^-Eyd9QsUMD{I%Y;CJZ0{Pp>T++-6HbD!=79|T_c z;m{tv?}FE*>@{ui@UA0JXeu;)D_tM+%v4ZaHCmOg>bV_NTs8eGf-!+XjDD2yV;++5u3bB z;Ojc$8zOf_p+{E~MyQCJ&c`vCgAZeZ$(VyrCB-qJ5&IGqG<`rGZ^2j|Hi3Vgx<|7- zaN){%B7yL7If(esk4(o0pE8c~;GqM)VvTJ>zQygz2^sB}8j8$MZGVu8U0M9=XYSw? zicbE48X(2%wt3eysX;E#QyvA~ARO`Y?$?d!n5ELzu*P-~tC{YVJt~Fu<(Kf;76D?C zQc93Hw?sh_SmUIUVrpSXZyC)=*HX=5uF&R&66auH6yj6i9mLWMIG{w4G-vUOzdc)_ zc;AtUx5`RfKWHXEJi!vCO4B_tz6S6RDpG92; zri~udX(}xMK3+r{Jzl8(?r}8QG92tn6vh=No~`$n2;j3fJ+F(MTecY z<|{J@{_;iFsDpg%@l!wT(QKA(QcY{kLdL)MuQTTjBIv>PK@qSWg6 zug+Z0)ML6-ad2?(mAz7sgkXPxScDQTxY4sVe=G-jX_JZ)ADh+L#9dPNYsqrjfsK^Mf~{eK|NWzcDYdo;@S3O zs8sX|%O;u_bRP8KsFOaL{O8@j+|Xjko-)?m1@h|7vAoPi7hjXV9_Q#gd`Z&5q=$jV zoU>8#(6=9e&n}O|5HxVMCP5Y?mUoul7na85>Of8}K)X&TP)SHjF$P7NT&66BbG?(w zX1kKgzo?UuPov&co2q;2+>74J8`!0bqbnF~QRcM;qXi8Bu zX*AgOVmGsNwOYtLuS6vi2>=EbeV+5Lugi`KPc&hiV=1MP5UX2U)`msCnb$4g^=3!O z9%)OL{>ot{p*@rxF9Vu?s9nUFs!z#a)^l(2^O##I2VWIbCc_n$Q+2!}LNlc6 zC4!;}r`Dj6FcLqxOAEH|46>^30(yS+G=j>VlEk7clwTBsp#PRN{wGqHK~~NcCsZ&F zE7ws$zIv;AsR#L?9xZi=2YKOvC4k!CfUdY&1Msf-k-%ixDx=T<27^6WIZl3DTm4b@ zn>|Jf$@_k$b34hK9Tw4?C76KR+}j{)e{pl!=>0xXA*^w+)F-US5$ML)zUJ$F@xzx? z#GM;%(7p^bvEJ;gcj4iFEZBcEUf(&CLi9zs`oGZb$W z(xnM=^>0ec;d;KSGTYB76ve+JGN`}pmoL1CCuP#5KK{z&~EFFLysqsie^-{6jZ z@OkES?;8t;_J+2Abq%hUhBr71oCyCSIo^Pe;)~hR%Vxx@E+NeA@9|yDc70g{I|KB^ zGX&4#*z|x*im58aTJnm#i;E%_tG8W=cL4hQd%YKaINA|#_K6^OxMn1uf|Ena(-yGG z-9<&5;V@}Cl}yD4V5ii3d>joThASe_|NmW{`=>PH78`=RL{~Xlrd}a9Ol)N*i78u8 zG5)#S1iu*kgV$d1gUX)%k@bbLZe$3-uJBx8R={msEo^HZvtj^uZp^@$=_*s`M}lnsnm062 zSp0;{98v!9z9%|c0uI*wO~nlMhB{y*AvjICi+MtMcfJ+9XCWk(Wf7(<8pM{(<-!26#`>#IrAOB`x7aa^t8!njYi7&?GRIw4>C@7Qc5BDUe-JH*o zln3RaXtt-{05tju<+>7(q`nrb#OmGr9^JNMAy>^+<$NM~&!M!Pmlzt<*Ua0SaB~%X zFF@W!><0r=5l^o@rkqmu5p{6A`C>9JBl>Tc<#!3CYWr!Z7Wi`U0!BQQ7|P z{5E@&<(9k#nCp^#4FV<SNSHgE-N#!5Q-0DlT5T zBxOnXKzWz_1tuRJ`y~wUHn$)b7SPXqh?67Y7S7egdt-s0rWGf?O|yYhRCG$gT)jn? z9Y?Sr6~Ts~PEwP#-FLZ+A0sjMkeZwEZ=UvlupMooCpVF8Oya`iIma$v#=b@<%8|x1 ziz?;PB5aEo(Xvha)uMhp@3^Q>ZQ%ZAettMPc{t}|>1L;?;6gg4|b+fTwtudH8oP7oLI2kaGYJC5c{!@tL3gbl^; zCDZaPPlIzpk$1h=LNDGR(E_#vi8zriYTcw|b_3I;r#vDW7pTvcaDqh57ArJ6(AG)$ z&Oc~kD~_>l7`dLoF$kFnIgvIjI6b|O-9iP9$A&@ZXabakqU%C&N`Xz6S&(u?G!av; z&b38HYfL61^x&2WSHug7CkkZAJQCeec5a3Bf|&veU@Ihbi~e2U#CRfeEEnGJ9YI2UlN5e6pPLx4QyCB)t zag!DHpM))BVQP8RhsB_UFQtf!h5tliY_7+%?5%`H9o`dki}%kh=?$UL`J{hu`{ zY)EfbU2&50d-=Qta#{d_!S6xU{oWQ;pUtr>mNyYd&7TB5gB*!-f3uFs-_(`qze+5N z)-^1o1g2Go!gk8xc#gdBO7z;{R4~V**d)o+-XsP+FlMw-$}a zU4arSzQiJC`~W{A{GO}7nd)x@jM$vSt327nAt)Gy>XCy{O?fR$TQE!NTn#+@meCcv z$-MK$V!LEJGiT*BvqfPAIbd=cF;W1?RzjBold1eZ4Wl9|0C79;(UJi!(eCT7WSOrD zy;fi>m_PT7Q7iDxdUNI;69|m*eQ*#Un?Zu%U*2*n9)DcxFMW1@6tc*f^LSK?7wx_w zM&GjA^+fT`1%w#Sr+ct#P&1nW_8I9`jZtKJH1Cw=+E_G5NwCmpyq#tMS~SFOo$7XV z9FYIjA(WK7Gef36C$|Kx$0JraHJEh*?R&9In;i>8Yrqrh400v0lE8aG9)5giSBOR* zR#`N7A>()t|2;k*{P@#?er1{XhY0TLO;*CI{@*X3FtIK1hYpip^@BINv?L9Po@e79 z4-*oGLv?Phcgl;aZ#SdX+vt}wq&ZRZLON%*cdN**n3)vLr(ySVpYiqiN{FjskI~4= ze4nl`o32#x@ZVWy>2bp`sV2XC){C4SF(||I{j)DVXdL*^WMtY@y1o}XUuD&2l(R4l z6R+WoTjz+=$gdU#>GBaE>@!xK6VteiPJkmYP|G|v^h(v$Br#Xm_1wrzl)W8wV z3+b{h8sR6U&p|}95)=1NTKKgnXx{l^KDu+JR&wX?Oj$cnUC4=|c2oo| zpAB=7#-pD}$9v^vXX`PIgHPMDoiZX!k(FlO(`2WSGj{F`J~yaiEi%O~zMSs``g4@_ z)QUb#vAs5#lF6BvBdzhkEsIY!#Y}rPm8cgvkpc?-hhasu@f7euapD>IS>$3i zo$rE;D;aXkyRqf7HaC8|Xg&Ckl@Qzh33o%EAF#P%=Aq%zRuJya2}T#V31y7v9IrK> z@mr?li=;IYmRs{H`D(inaTt$}9>*-LS_$zz#)s6=<8V1}*c*6+Xb11AzT$;icf~Oj zdmqLTR!z44`H6I`n7HZE*kx%#LACB0UjjvJ#iKb-ibV?>+Iwfjqw1(Jh0vnc2oZ>t zo{!}40j`6lSNs>b=CifKLA#T6mI|%8aW|~-xg-MhVLj!hlVyk*J@uS|kTYsECPF?8 zT_43)b}iE~7XL>8c|07znLt6-oA+t752PxZ3@oK5b*s>O#ctfUW-6!CGCKaBEB|#a z;2@~^TaNqaGI!*q#jLAMaacd_HdV9P{_0ebaE@l*_?dzoT*zoDDLAL!dAO{TC8$a~ zMo{9^BNcs$gn@ft6kOLtMH0G9?atNvg#ms{0(Nk^k{JU8mEW*HcEn#)B3rv$!Y0=+VsL$WpG8 ze69H;W&*8wtp`%v?nb>aDmADpjym6|$-LEJZ9D0VJB6JiS@ZWIVS*oi!@`K=i4Q}^ z^z!NzwAU7dz546heW68sC_+*l=bepSk8seU+jscE4i7mk-QVbS%`I>zx;J$&B+ocb3F|2jnxYvh8zs&^GahB={CwRhs$s~7VAlQSDuQho^|r{jUwIvT2En= z^E8!sUO^c@9L0%)Gy_d*1SxF*$#%)OqFR8&j5bUS$2Vg+rS+-Z6WeHAHmG$C8IPYC z51W_Cdew?FpGbv5{Ax@m{6M!QAUKxNKlh*sU5b4xXQ)KAYDj}ZpZa-*zLd?tzhBwE z&p$6P!|Qmy{Q*TW*6XmsC7j48gmwi(b_wUf@4pU(0tC5*4|TWS(W*ePQYk+j#Wt^& zX0wa^W?6`x>FGmFG}$*7)UARL$JCx|P~stUQ}+f2ppoxT;dM5eO;`CBKb+USvOPDW z$(%rfSD0yXJmA(L5NradNTRkoW`sgXzSKOs>=XUiI89WjD}G(lP)tjS8uU&j2VyWb_}y? zBKKVx(HaVpoo-0-yU|W0Od_HMueCCA z`l1wk1xo@aqdKY#1_?8&5G%U$d7Az$y8{6O(06U;Hkw`Had4tYY1rf>w$lo1cB9xg zl?q+3hD|FsdWygrsX56Q$oEi6`jEPwb)F9opxetMiA-aQZ$-nt$0G5Q4$9QHDaX~& z?ltBkhKZr=nn9Ig$&G`Tf=Tz?D|fe)PE1HeUcYUbxMxDkuAufs?M4tB+hfM+4kvi= ze&KX$o_P*1LukVQ+_ zY}XNdweisgu$F7WY2gM^*#wT_$U1h!VY0TD3iH$PR@s^{Y`2D2KUsn4ao?v9ZhYFH zjT5E@yTawT7*weDQ&;)P=`{72>*?Vw|?p?k=91fswy8UZ0YEaYTKkV}G!c zLUW!TSEfy>yN!T5hVu5EdkakhOCcc2_QX<2t2A0@ek6|{me!YX+#DkL2GVg%UpRVd zP48uYrdnWF=yYcr|5P0a>k5)XTxg(F`2~S7EI&>8)xZL=ccpeu1&W^a7a6Hv?@{&b zhn&ptNeikCm6gbFzoimMp=eP->Di2)Pq0zmTzLMS*a6n!KTrIJ1L7x{5NMDdVNl1T zVFVnMV+C4dv?T*+Hx58Hm50$#h8ReDlq9J3dlyU}5>iH*;@rA2j!?b!BPy^!pnX2h zm+5hL%@m!V;inYjj<203art4olDZ=%?v+Sqc6KLsQ1)74-}Vn6H=Yz<8hP-??s$B5 zSE=94Iq8L!9yTwUfXZ~3*Neg-fx~eh2mM;EuekH06Mf8Q7{&dM3O{djZjhI6Pt?2h z$RXPnXIjDQWc<{dye#Mg@=;G5;#2Z#Ycyrat4|sK2H*)Hk@`5ntl0S!7z6@l@}_KN zO3(yX;6&&;cZyeHlXw~dL_5MYQejbHqDt#NvAeB)CE^M6T@%2Y78g^Yc(MSM04Hvq zEEFsMS;ol{NAJZ2lxqBmUMnjr>)Y)DoZvVg@3_7lVA@ut+C~$D6BDIqoNC%vTQ|V8 z&UE`<{w;qkJn%Fz884#o>HGy8xN@wbcJEFGIC!E&Lo+_Cb`55EKH=Zl_g)|4K|dJ& zZL?g7yn#qoFf$s9K|LThL`T!9{rNIcBoCp>#Wtpx?TKRg?Ky`{aw!aH6GB{3SnU;a)aknQy2T}U|!{5J59W5POhEekl_fC)Vm zoo>0YQ13}R*eob;DH>A?&i^U@oCl^_q1SXe%Yap(gUUjfxRi`{jwRR|?P1M+B*>pK zXNUY{vfHnJD?2{HKgx*8ZkmN&R>NMM3di` zV!_6mB}Tu%tz;!=)6Y&N2_*1vQlJ%D#^|7qfWjw4;kl^M3DCJT6<)Gz&WJvUE&o?4 z{@01-H54FDr~=j^P!UI}5*bWnXv)%-GYWp=;j)Tn(*WBA2a!SW%@7xk_Y3`Wxd z&K;RQcph-|I2cb4h|--_f~|Hdx`l@mXi4Mp4ArRtEu+!!XR-=SxqfdWuh8CX zV4Y$+V_kY8*H+FLXUT;D2b8R{Bn_9FY zut`9ZiW!!mr1g#jahlW(%#2(9`ECKmKW8(TFJo9eh7E=!zIz~zBU|40;p$`qIWV+M z+?XpUn=@v&Lz^rn@2yg+eb}N4Pfg^(-Ty!!9`pViWN+}zZbES53= zh|Zzh&{E!6M#S6n6^zku>(MEfApp<<37G97ebL{Q+X*c;AJzdEcCEayxw$ev(BY z{2H$K5y&y0sSSVF7)X1O0B%3dYbPt#{rXk@?{JtMV8ligO;6FB42F^;Rq-*mzM@)I zQ=e_DB47Leyo6q;Q`j&VJ=(;ChF8byvN~sbY_=UIgIw5B>{n|tMRr@SY=246M3n}` z+n#^Fy2SbIH=Ig=aicdFN8FhV+(_R+2O$!(2=s$YCJWJvAr@>G-I;`|v@)cfPkzd% zLeK+iOnUlB$Fhd=85z*Wte3i07=I3eGp20PWB$tNeC!9@7?6tvwan-0tyQX>tS_ZP ziUaZ8M5k)^8VgRpzGFIW`M)ib8$1xU_DwrkhK_ou33xo*a1QxBqhD3|%~~`vC={qL z(QAAmj>8r^OO{H@I%)-Hd*~`bop~ree;{`$?3KD- zEHpV=hmY2nPFiKa6f1O^4rdABuoy~A<<$%u%e~XAHB%)IlS<*{QbG~*)38!z}EhpO4fWxB25G!>BS4jKs=tI0m>V?N?ih3eGvd?w= z37pi!4U{QYrHKpx17$??{eRyWm}uaH2uwW%kl4tZs`SN5P;C8RfLqFkpO5$PMapYy z-6S4QE#lsP!Jb>V-oRy|8wbm8urFT;38;+1^&?Bv;G02>`4j?XyRgdeXNY({7r+&{ zT+R_58&lZYZq}Qhp<%gQv#re(_JQycHG=DW$_tI2DVwa)0RE9t^+^8XY(!Jv6HYq1XLg2`b3LF(;vnFRR^69*?d!k00=9@q~G4nTqC3(RbSf zOdC6z8f-xmY?1J-WId|pe(7hxH+p-Tj@C2_Qm0x@`}~u^{t{I@R^^r(W~;GZNKRV1PwFF@^&hNe*hfs zMc*emNVg~ee$KrB6o~} zO#5$LU}k6t4u{>K+XVXKpZbI8TxF_g13%a)rh&!>`9VmHf@b=UcoC(A+GA6$=ECKi zaRCS`WDUID5G0Q2oE3t-JdJk20k4aSZ$JJ5U}^QoY36=l6DCs&2x|Nn_5yfmC!L2I z%m1I!1IN2R9q<@&R>8*`ELdci2 z->cD)7Z5MrSs+BQLm}ay^rc$yI~i{deL1Qc>_819A`B)32uV2k_%SA}A2@9OPr)^c zR(mKJz0r0*GYGTf0!+J1$=O=(we&HIl5gB9we&Fx(m?rH@Z~G;K6cve3QzG{`5qd` z*m6mVVo661@f&UivN0cVg1iTiRX?0Hmq7dVI#-fd5lpJ=Yq$!Ex-=IP1?A>Pz9*iT?)$=EaT_z38klA`VxgNlit7%x&rlq?mxoqfekvX#c%^&K zv3D^m%}lf+K|1wU{T zcpx{%%oD@Bw^C%W$Sdl478h0pfPg4XU2DV_Z$f6@na{kwc61Qy+56&or0?;d>iqsO zFtptZ0EyrY@{OJA8u^cG0GusD8szgMaNS?7e$z0>@+cXxi4|1Ptlf3L^ZJDZOp-Sj zAxD~>+gXXMh;#Z0`E)P?A@x-UaE<7oBBbfeQ#RtldB&cZ~Q^6EM(1Q9CraiGQ8HyG9P){ot>LAy}0U#Xb4j;#|#u39oaw z)UGq2Zs|{%pF#L2df--ofZyH`q5ZU;S~ZCD=t2ayGoRtX?snWuwG2F=kcf=acsrQN zuTt+c?Z*`}B|b4T4MW9`d&`BDD>T?RU4Zzd#@WkG-U$+Fg9pv}NVCWNo_YoWy|>Kb zsSkNi1ficN7m}md2rqEwa<+=R6o1Xs)TGxflO-5@c+vX6wL4csm!Q53ok-N)JkLr6 z!4OwNw&VAJqR@_ak{gy@kRb4!$#>NCs$KDPAKTujHJ{bZo7duul za-wNbpTuET%qu5nOXxa2AvWonqfB} zE2(98deq;B&}p!}YIfkvsQa@O?mdq(MYAp+BNGuNPK%!q0wPxS@vrdSP9l#>osV-l zViL(70(L)dxoD!d zyX#g9&KrS}8J2L5WbmbZUW=c_djFAKjW9z%=dH({G~_ZsUNSv$U8cy5kB!o|P^)AZ zn|CX%?(8T1fyDed^E=|;V}Ys1=1jfyYO}Bk#j~?f`<*PG?Mj0m`a{^E;^k3_y%7{` zHaV5r#Bm)YOPA5O?V zvOgle{GUW!)DwpH^ne0~HUi$H%+GxN zPvWE%TCP9eEDv`RhT|p0$L9 zxrUtqYMTF!pu(dVioEc6wZY&=f>k##EPfB>OW@~7496-;QPhN+c!bG5YfpMmTbqi> z75C4g4fjD`=_c|F3n@<}T2mYFHaB*Qh(7rLKg3~A{DMIKT>!Z^v-uvEO;@ldJ7=*< z(ZvEJs}+I-2DY(+OZ{Q-<@0}MKBC$%QK`?4Y`adkqI0}`I1LOO<5p7e)W*1c}$>&BIY?DsAURWbmfphr?e%6;QT^jVoiP#>y|cNF``yi3toqmNdNfzM_y*bG~J!g>NHGH z94g7km`_(4IJtNDStU;3-Cdu48p1_x_4^=R{gud{u?QIm=9k-1c280x&0;+Bnd~*d#nZq{pilsV9LvP zqMxHCsd)(FKQrSzF6FA+DJT@x9z5=JdlO3fB1+ZEwG^%|Z%+pG3fb|Yf!~Te@6#N+ zt&yYd37+~wXY3}%zoN#!Q!e6WGF~A(3`JQ&)1l9N7K3l8ru?t+T8@KBmhNO`rf302L>&7R>~z zah=p40{7F~H}Tu%?)T2oyGIcUN+j;L_GGNX2T`^d^(us{yC6Zc2o_t%=f?M{*O-h~4)Q$UV|S}z`K1^Od%QKD89P7VS*rczn9Zhajhg=2x$>t_C(UTy zYs+B>>2m`lzKGb8Wu#A%EVMB6cSRi1^tvM(KfVzNK#(PfpJ9X`CH~`s;tl(Xm5L6371u8o zW=900xMifJ*$66(h^K|Ac*&+dy;Q5YuP=^a!`Ke~!+bD*bZFws20C1pdl1bALA~NA zg8Q7UB@0yowEs&0XE2>FDu7Xh_;c>+3`iy!w5`5yv@m-G?Py@c75uqXUNC|h5OyrN zrnKF}KN4P^nZ2E@wWt|0mYdy@&!68rW&Nd9&|0XOAHm?&$RW9s%y}GyNc6VgsYel0p4^Hvu8Q+|J8#vMfy!hi5^{<;q|d7t0WvQLCE9N{4{OrTWdsp*A(1tDI1| z4D;CuC9>>+&)&~Uf4CkrCV1Z0QhgMI6%Q7S_*~Jz zsrf&jpee{rVqqgjsJs2y#zAZzht-1y+g~c-$#1xxB%RP=IRCSZLA-*Lyhj@e3@OoX zz7(W+Q|r@Bq-|RCnR$RgFBK%(o`~(;Qa2@*+Sx%h64RCE_?^VV6}4j}&bC1!*|Q)d zlvpiyv`lo`7eEs_E!9R_xqdBX7Gj(%tG9@!H4vYzGK&1}4^xZ3U8#Sh>k0{hnOr4W z;xhZOCiBl*=cf)4h?>-~`^N4yBJA{s@E7kK(tg|=G#@~WtiAI7f%xtcyzf(kD0OmE z?9fuhV_m7-wli9LL+yZ!Z)DkgSDRA91?EFK;C5Ny7h}+Bze)Z zgUMPoKU3aL1G^!!iAbIqb<39Et8_D%05N?=&WGFbPjMFqb-JKvR<|fh0(&_|2KI7{ zW20_-#fyaoo0|HTUgonGqty5GFbv1L1erw1NGOmG@B$p&fiB<2JU z6CHg-ZR4YV-lYHBr@#J`P2i2dXQNlIHS39qMYCm_bVs5Riy=?Ih#+9eldc1Fxv6D= zKzc$f{>#*mKbI5S4?%qh{0n?Gn<-kQqBRR6j3~GBX`}OB>XtM8xI8MPNtFnji;MEx z=lkRErZVsL02)wpARJK*hef|ahHRm(Ys5$tIq;&R7MqXRe5SgB zuE#`T{wD>Dwmhkm@E^ggF)ZQj6y+CPX2=;8e@DO?>G96N<-XUFF{BkD7NlJ)_#O?iRKKnLOboqHQJdK^gx}bNeqU8m`M~?q-K~cO5 zguOZx@^W&Yi3r0`^7Hd+u<~^ygA^koALkZbMZVGHtcWPoRQt6u?(2_HT)-2K5J&J`wI3|{S5%2^sWh{_TmgqI*rNSuNgoYiNBOl5vgaJDr!U6MJ4Y_OAB4m;q>+5sge$vvX&Q{AG= z4{pA;evr)0iJdu!TDb{mB2=v*;IR(Pw2PgY*HdG+5uKhe3b?e6C6PsPW=`jwm- zD4tmRP8Qk3_?~|AmqSFk`QyX1lz|rYZJUPzM{H4g$68DDQ-c2P#p0}}V63n&Z#9EO z2|Nb)+Qt(&MW=lBk%^0+|w_^o-#|%+#Na}z=gVR=pXeHY!l&$)oPov;c1k9~p z1NK0Q72hh9Mti*%v*Q5%Us->mo<(AaXzwTAi89)pODtPGUZUlu z+#13tZGD_LpWZOr9Lh{UCLPE8kvI#_*aBlzsi+b-V{ZFvpe6+6(`&x3n#skl&`BnX zVko5dcjPegZFuag36R=h!SvJ@ZliT`ZfC1hC}h6S>Q8irSAcX9l@N5jE*JxO&$3LChiMG>DSB-%6`f9&(?Qi#E zf!D`Sbk%BrVN?j=Ps?^+QN) z^mzh-NJ=O)?uvgOLQ?3b?8PU^Abx7RhrUConv{V*A!EkXuD2po4Y5_N*&g2m#K0A&xDh;^$& zzcd1(@w@3jH^T;%frXX@MdXj*xsUyntz?1mc=@tk!nfm;+KxHxl}8h%;Mm7OEiQAT zDXG@0bZ&P%!Cd$f<-zoqgbcyY!(P{a8cbqZHLnTLokCvlT*T%{(v29-_P5d-cyZ$! zWX2HIU1hzTXG^=Q&Xv}uAy`StD+oJUes~8e(UIq;wI5B%{#p0m6PwHUCj{^6gE|!I z>_$IW*?;w@dF6!vloR7qs{fSUQ4Ga-#-x_5w+U!}?G-b&Rx{~!)epl@ z)=+!ozIp=*F#!OjsovOp4RZbsCA><%r9dA=L&~O*BW3#_1)C1OQo~X;2OJ-?yiLWf zwxHWBxxe1Sr3WhBsyAQLyCMi?J32acUxYFK;#=jP90lyZOO-X?>z=MtuX^&U7C*o` zmg&9#S&ubBabK{cFWZ(r8iUfx&NLS%zI%TpHfKeB;ZApN%&S`&C1dLfPc$a=EiuTo@1pGdHtapdbCPLp*VEI(s;-6 z|Ffm;5Ev3x1OEI7a15;PSO8fBTNmKy(^*_7Khxe?=w_}vRBqnh%bu3}^%8o)_#s1R zWMoiQuv`FV z*bqGRwFW;DNodKw!pnb3Ujry%rOVk)qdV)ol(U}XtPOVAy>N**mBLG(!@LJ>Oe>T|azS(5LMH)d;C^3;|c(ommvbihP@{!Hv>BN^r{ zRf#!tL=9K)&kJefb1SQRM0+~gKDRh& zAFX_!8@A_`d#2s)qDqofHMI5S11Y-HaG~1Y3Ad;36aW0Dw(kt#wVNk+xlX*){;FR= zLJi6uubx4Ot{1zYdpsg!KuYC3Y9*XIt1^(J6dQ=~Zw#BPH3vD~h zrJSh!h*0HrW#g!o3*(|kM)Y5_LG~HD{pPLWm&Q?%2LI~S_n#_OEdDf*;VScu)J^4e+ zJ5=@hbSvESqtUB{6%Rn^-B5+3!G{fNCw-<~!}k~Nw4@9%R{tvWm9Ki4c54I^zvb*# z`xGw3pYZd_U@WNXYSQZ6#X=Rc!4LiyvA5}&*<}HGiCXwOC7PzsKc9%jQAZoJALUDZ zS`oGduUX|lTH|Hv5cm}}UI@l=3=s4_zfVuY+fxBgAr=H$$pQo!E%zHj)u&-pI@6H_5@6F8USm}D+Y@MahP!`x0o169x`N{Jb>#h;{~7hmT8xU9ev+3) z8SZei$1M&Rx=IV3EH3)}o5SZOfk^u??8YmCt?fL{$BWnln&ctG>uRsu>N^=l4+dIm5&qI zTVAk@xLoY-N$G2R%Zk!FSa44u6@qgV&-T&-jo*n{bM@k|GkQbxHCv2|01M=rQuW$; z*PU`CLmr&TR;4nHtsO0@rC;K)ICwqelF6@c+hisGehc^EoT?)N7!43 zRh_Nx!+>;dWYY~I-O^psE#0kjhjd9uSRg9h(%s!6-JMd>()}*x%sBHq-#OR&&s=+) z(M$H;pY`0&T`L@W?~R<*GgKvD#Vzd65^x7Lt3bIByt?_%_gpsw`773H2ge!b+ z2}8i)_Ci1`2wwGiC->sNKBzzc)$t5DQz>a?BWS|xmKIB`MU_n~C;DW2k~rzfFZ`a^ zmX)1k#E0aodV|+zzLQn3L_Bk5f?AnTfdzs=<0ReY!ha2y|yqV8AWl zaauqs^|b9Lm-P%Vjut*2PS-4a>6WinnWrcoFnE5riXo>V5WKsY9gnbWuD+y+hxXN1 zqLds}SF2FhBBdSuvCc1ZJXU+b`%}0xXqK=X2ayBsscTW*->i2rJi!}r9BykHu*}%) z&In=MC{Wc@6d&xg_i^}uwTN7uO=W$V!(xw*ACXzzrw+sHJ;Kq(>>El6+lw*_u3t5{6;$BBr&41XKJ(@ry$j#aJM!|qn(pwbU zF2zg0ob4Qc9la-&JX9?*5vY~0$OMfWU!GKX)r1d+u5yNJZ}fdyrP8P>;HdIni_S_=sSXppp_cJ-9=L&Qj>N z_+pjTptmtJe%I&AliwAC22`t*~#{ zIH#JywC?x^6#J9pDubj3gtVdYzakALhzlA4hD^_@mT8gO=g@aU22I+frd_E?bG6Qd z-EvTGeJP?vW^M9(WG#)o9IbuBcy_bL`6$?o)ryEbT-mqLG2J9Kov)17h@wo(+G}rT z#%=JBx}(F~ij|5R*9lQ-l_x^Qb#ebX_5;Hem%yezK`zEX>1e;f<+s`e;jPv>g^2?s z&Wyy+pyQ4zgk_(E{73)C!Ro7Oz4$Y8!O!^TLsUqS0Tf&LOjHauBc}<+9 zm1*>%+$<;9-59iy?~Y>q?`U32ziK$Uy<#!Uf>bi4i*Q)>nw!0q3xyj4pP5dPK3}0p z`%`Xms!33|=ADVm++E+Abh19kvper0u$q2TyDPyEmor=8lx7nIf9MoU)}0{;huoFh3UW%S4BAO`q)HlrPh5{&~6uosqElla?w+Qe(4s^ zz>ev!PaX0Wc?czX8cB!laat+bWY76^45@&io&AQ#;z=r5k?(FGu}*qNgxz|9&M9vQ zslvqM0><=(zco8=*4!eiG{rGh#1stn(lpF*u4R0{*v(O`D1D4_@l!d*F zI`Uw9_f2gjqLsl;u)ABmc)FDIfnbm=-yjOg3@;ae3E_E$Y@3%R!p25R}#brnb*MGDM3W?krv z51h6SOxo>$<<8HvnaO zU9Rdy=Tq>P-x!xB^XdRHv>km(ZW{vr@9#D&c6bzg4W86T^;`WK$JUWd*;N}YXq22pp$(uJARn}{A-oR6BcUELDk>_S}1+0JbNw>TtqoCw;+s00!^p?xAkAQcI zHAq#S1K;z}s~)$bc;>wUe#|b`Ir47PzYk;V6qs&^7y*wDr+GNijamayqR15K^!rDO zKU-S?YB{>Vk3j)ay`K@W0W4uGAErrwlHaB;L4m~CIk=H*28k_Y7V^;4qBp*BXh=n` z$*0z$Kfb?P06kzGE7<-&o0~m0ATsBv2*u7^4p*e`3zGT0Mu6|ae$DA^x`kKrT0O3bKSBfBY6gbDz=BKo#pZ$S=;$e44P{y?Zw8IE|OxSCf+#QR_g zme<_8Qp)j~?pe(nfabd9IsL@)s=+S%k~{et0aY@b`|G>E&q>E>l*Hf&G=ot(VSUlzr%51D?$y`=-P4sFshmI<5nqGLBkP>jwiNB}+ z8N+nYW5KKYF;#v)HawO(Ee;t6hD(9?^43vL#pvF}hJnHtoPiR9)T?Dr8X&&8KUn=x zt$NnTmQKuW8nPX*B97y_)B@{amUYg}frsd!p78yMfLZqm)@ckj^;2`(yqQOE%Rzv( zZ0~$g;~%#q^%f1ARw=QB(@}lC)+ML@g`{+My-E8^{gBg3gnWub4WsR`Z^?c?=^0<4 z**7g2&j$8HY8m;Cvo=L_dE&)<-E3tR=*UGV$yKdaB4sp8KQG42t1)2(lZ)pGGmCQr z^2l_Y$j=}9ix-n`|6Y*)L0P6_!VcWAA=o|N!~{mw6uS^_M0_2(lGGY1AOzuI;2h~c zj|l5T{^!FJ3BN+YNikVeWY}m8P4v0ib-c14qw^pYa9JGkU8g(%_4rlf;X>sOQkwm*Hk0v&!OSdKeT_sp18fNY}kjQ7?cpdGRoA`Fqi9O zW;0Vk5BFJJ4-I~eO`YRJ2s*nCb{znDtiTtpivB&Vw;sV5PBMuWeO1<8g!rf^3bM)t zi4oQq&k`Q-dH*hS_?QbH zMx!g4Y}*FKu6w0oPCR42J|l=|eeLcUP83l>D~Ah80slFG{(K$iFG>NR#oohsqyaKA z1ro-`i6TFB2}n8;F5?F^^7N+-o~W6;75~TTmCgVgsmjOw6U>7c<8>^NsULTBnd8C8 zaa6dd#B>Y1e%Cc|FE=SYij|WEYhP0($W;SlCLZzZBl-9~@>qhy!Xy!og`}x;2CYiH zzt(UL*hrFl>`lEacqt1A727Qia&nb}ixqiRos@;f`5`;}s1>?vl1TI}F6#+&55@Is z6)tl?2MvYx+;oLnyTpB=;DS5fEL)9tZby(wb zQ6`PZq+Qaol96$Ph_7h)=K1z~rHxiBfiZMb0#aCZWC@S3=z>8iNKPyJdF)}j*?MPz zNygI!lky|XS7_Th$Xf4Lo+bhg+eI=mHj0Syuj&7nx_W=20q26_O41(WI?dB`>m5xz zof8$lPTyy)@2I#eJDB;OJ!4yFbu@l|=rxS+bcU%{J_`*OJBPH%qMEG_foGOIgTSq4 z(&%0~DWu@Q90`pYFw>WweZbz17p}cMR=C=RXh}Nvs)YiTEE1R5@?$B>N3^dVSnZ`u zW!Ynmj0crCe}1Qs!{B+f#E~>C^U~^OZq8U%^y@97Pj)8< zJ7bp%>H9+Z-Vsi_g9x4l=)MPet#UEP+3w_)gfQJy^&I8dG7EXTq14vX2XG#kB)rC4 zlubeil-pdqvBId*nyAiLqO={(yO(a{vuyQPgb3?#_HH~U7>7nJwNDPt9Q=_MT((AN z1fpN6q)7H-e|ICHU2>NTv=trewFA4ejR53Bzsp;kRpyw=hpi{creik*`MaH1+fr%F zi}J9H{g(scSZ*XImH|9xZ()lr0;7h_#Y}9M&a3&05PyDqIe(eppASxyYra6FgSDHr zL7w4!)d&~?J^rF!9{iHBA)%p!_>5%Y=9|E?Spb}(eoiJEeZ}yXvjyXG}CdNR@B4eu*9O4s~$T#-bu8B*T zLgkyezt6UC(Pxia4zUriyw7$@kF*6qQa@Yhax>#}e5sY2_=P|HFJn|4OP0RR%=wMC zm&7a+o*-6YfIbWmNQP&+O||{$?!oe@WVz*2*lke446bz2ZNdmG_y^bsZUJlETr?-% zF^7+W6E#BeeRdh-sCqatkvd}1($ct1f5^WU!icbpU6(yY9Ms85%Gn**;_*Pp^ONPENg^{)R7~uN6N`_ z{B2TzOJ!hrmL=-^>&LgEk7+e;E$u`GsseSJqG>ZnL#=YMOO^+`o z9nCiuaCD*ZrUNb;1GSJ3m|sB*xKtL0_GOo4-LN{{_fp*Mr#|GJ<#REZxnGtIQ`prX zGe*8to2z@iOojjTo!2+DtXr#G55%@n;3k-E#}e5oKDtRn%E*mBSr_&TYH{6fYQ*DF z(&t$-6S^0Ncg-L?2zkUq1BC?L7T-RPZ!Z;HCD3N@#$D1zI`GA;*2J7x=+PUm=@XG3 z-OG$igW%A=-0(^Nk-sB2{Z{Q_5Hr5$YZTp5D1-7s1DQ}ucSWb=4_bjA1m`G{sL#cy z<@{{Np8x9*c2o*D;tl+E`U6=wCPvncrHZXmk3^w&v~%U5{v(3izEHUT_d^EvC~y*t zc5yV?f>7VR%Lb$&+3}xM+`~ETl2qKb!Ps)EdTewAra_^rM1v4&8=yKeJu(l*Aigbh z+npJgqkK*$q}HbfFMk+@Zj}BjN8au~qayq{yytwA(<(p5$d6J&PRl89(+4n?8B`=< ztydT}de4GX)b5uwi9%2#uSv#|3KjW9OZ6ciV$6YaKeF!%zjF`SN*;nMMkBmjV>lZ~ZmRDQ{Z}`eU zBU`^-qjlUpIzQ{)9Ti9SK0h#-jh&n@wvW8b1R?S(_UBdI>{G7DTJ)k>$ThrhMGqc( zy9#HGGDn}NWhl9N2%%T&MH+35y(Dd&rKJ$J@KqLV=#3HwH>;JEJHA=tTNC#05~ed> zTZE?nYQSaI9rIT&=q-D(`qX1w5otrCsmb-*L-{bKr#>RF(t)hx>JCzroCtM+H_{=4 z0YB;B?zjQFaA&uIz3I6lLujW0>Ree|XBxcLI|H!O8lIQ5V@M(nJ^X?n6z<#_Et(^y zf&1_0yT3w!64rOEf|3HqFyjCY+PT`27L>akh#{0t8|M8L%Dv$#xh{Ty@b5#I3Zj9c zG9|kFpj**(xEFn+uun$1p7_O!9K|ozvhN>Nf>odg%B;Fzt1;E@uU6oJa=_#+_ngXhsdeb#IkE9#em9et5-s!5{*@CChpWTU` zdNS))Rdld*eqnP8qLKgHXW#Oz5?Xep@}$>k%+wrMH*A2d*#KV7f8+=tEol(h`6zwnQ+XST8`4LxEiW4 zpGX%wS^s6O%gU*ViOKENlS{nR3sPvJPpH%(D4XKR0co@cQ|0axk$4-aW zp=o#VKTI`$Z=&}A?iSfm&4+r9f=)kc7QPcdvBm1;tavEeEL%;0igqdPiz$HkZ<;CA z4kjOt%lt)^i^A_Q!`8jbN+lMWXx*IZtf+tz^@T7BDH;ZiAWXk0Zgz)7oE+(G5sGSy zcz}fIiK<&ydb&5-om4GHO|uJ%u%o`(<2;gi4(iQTX1;Xfot=_c@BjJta^yjAR1ht% zE^fN)HS|1`%2&^cd9D7b@iF@34WOB3Uh)wN3S5pl}GW1F{lLBL1jp3y}>LaImp zfSH}>ABhG_E0s)1%smy1{Q0pK|I`Kuf5&3u!%je()hMpe){F4WNHkJKVZSHxy|#H* z*1qP(x?aB7+k1%LneA$@#*Vcdw(k82+q`3mI?_Q$WFXL>TbpIwzq5cx1wW>fw<%+N z>-yq|#WL$OVz0DR6=^T5bwTh97+0NmbGpn_$)!{oW}P6bB6XvW+s|X%Qbj*rS(0kC zGEX2Bo_|@_1^U1>Ew-7T{IXp0!Fjk@aF>+L^DP#77}WRPYG59?#cP$b9}f z_?yS?XA)3K*6?(qS%GK>NL!T7sR1TrlKHN3+w=J!(Wp0>x=z?5F*nnnmUc`U`6Eb= z!zCA%$h@Vh!of74mW~NXpbR|Oot=CT^jJB0$HvC%*N+Hm?Qz3DXHfVM{ASa)55E-9 z?m)1tZu3pLOkECG!`eIJawr-y&+nUTZM*ALb^AU69r8siww(OMHBITyjKK2`K)wAn}Lc}9#k!GHHA3|KEMcrpw`q3 z+_&nSM%Qh^1a%u3jt^2tm5wD9u>7)YDaUTBJ%tJOf#jPYe-nYW0(5;HFF!hT4Bk&1 zHcvQ_OZ}i<)Kui&(sx!vGc5tz*X?YJ#ia^Oa8}xxa0W>E4n-4-TzF?yVlOsO*7doC zEWDLQQWOZ8=R2i3q~1wVpaQbX z8p=QIG4kvwI$L@G&%(}=i!(3RscG!_mVpoA8ioOnG#hd1UdH}AWV`l;=WTuu#W_HF zGZFRv)-@(IgWsC_5 z1Pyiw^VfRb&J)8 zv&u`47}2m11;~bTQ@EvvRw{8Xs`NAd7>=GW!Y}l5=nt?^If1=uU3~mIu)g>^j zl^+#C#Byr(xl5j}-=zqOp%c#16Yh3}<~t|9Hl4a=Ta$nHC}R6du2cGLgnv16^SGc> za@5gtCc)xF33-gkdmHrSku4TN@tETL^;S0d`~77<&+Db7>!w{Pk~?1b>H@4z5Jxj~ zGU1Gs=N9a8h`rfQ)FG9E-(v*_^*-wzvXiU(yK9rM?=gbx{7QI+=zrtezdw{e7%VD8 z*gDlmK{oLCsCcH>0rmvYBC_^Ozau>69Xb+vx|-D4kbh9dl2UNc%=^__{bp~ve0D_a zLkZdnQeEzP=$DCCZy-jDdJ)emp#=r6W*MX&vYSd)Z;fW_fntDZRAE=a*oPD&=?-MT5#=Voe#uRRXQPt-!iz;J7QY#>kAQjTgyU6;h7ThW8sE*3|n z%%9;r@D-HM3g1b-ZxHv4rW#?;$eV)J6sW!K*eI8PmtSr0?SY4qknD7M%~m;7&w;?c z{J1TtWE)l+7nfC$K1z038oOTBIhXwHM2ki!u zg|@FQGWgG7fp14r9N16L4)PxfKIB$X{MXdLf5@zRqa6b;u1rn|a9B;To-5)*>NNYL z@@7E{=|a*AlL_+wtjpAFmdDR$(cVhFmnL(;`Xl_ml zrCVWx^W_H|_AF)Qxn&PT`R=>j*4#-iBdb8&M?=5PZbMfB8(?M2l1_c|`#T}pK_x0Z z%nNy>832jH%&1&CuJt@LP0>rEcrPx2WhfcVt6c5nK0ZC(SAG6s7^?8Jg{*4 zb=`_{+gH5vB%#w<_Ut_p-_tZWjM&l8235}C}sm!*(R5oK}c;|wYT02H|~D2nt6#j zqk^nXcu-Ew)YlbFx;>!nnxmXRM;YYLF_kJ7ywfvGJ<*`!@`c;CuJaXJV0yH$43?nD zO2=IUE|q|CrSf0wAu(*WPfm&BX{<yUS>^1HD%3M~cw;cUr0N>jiKuMS&X^0&JS~C$$Hc3HA-p z;*qqw$1~qcjZt};}D!$1$&6b);OZO~M@Y{U-O&UoG!Zp0|=kqL4OkiuBD9|yxN9y;H z6A;F|qgC0BhQZ~x%@$|4%zZ}J_J|yn<4&P~2vUg{l;MDz{|?_k&R@BJ$dfspZ7oq3 zxD0m~LTXFRx~o9GXaQCRSJL$q7K8-Yw$d@-Q-!+-U=f>eNu(>k^UZ)1QWO=Whs0b89~ab zUT4;w!sRW{C{pXhqZG39%Ph_cI5}$aofos==|FTf&M4Oe#hG(L`PdSWsrU4hT(S7yDHVc^i4t%Xm&go#L`Ry$*@1eRNFPX+erMAxte z*t#XIBN#&4^ie$tVLC6kgtK$cKrq7{*bVsmov&q=?StS^uDSS2pVB;4T`Ny@zh%E) zHWQ)^f1Bd}o5c^5kuU~p-QIcY2XmB%kB`U9hwti*-+-o059G8j5-N4BG7ewpMk@3$ z{{ABZ7pXyYVZ<47%5gSzLm6be%T6qKMJ83@kGg2R1kV#lAK=#+`LkzF-jZt?xa zbOc_>2NWepy~eA|ARr&oh@14Rd;W{x2&R=WQ9`H6_0zm4gzZi#v-ZQ4cU#-^@K#x` zake@{;D{4=C!z@HpJUYYtBv(`L#4w)Le4#(ByvfNV+VSRFTu`5-8d_s79>Uf)@%RI zix6Ts;Lfc`a6AVVhYyomJ;NENpnYS?CW&7MST&eHKyMcSaP{d|U*z(s{@%|Vv5@-! zgc?{vrW#tTfdt$fZu!g-_B75C9#EqP2$ zO4JLqOLsn|_`B2If-=IF>lt90dTM3@ur%`ki;d@9B(kI-96Oc6=-5AE0srSK1OuB* zbk7{wg&=2uAzUD(!`qajS2@G$>rm-1U6YyKg3Orxl<5j-qwB?x!E9D9+k zn(=Bd=a`(W<$*Tu)6IzO8{l`g?ZOgCSXZOEqFqU;W+m#1x=w4kunO0p*N=Ws%78ZS z^BPLO(x%~edd^?1fgRW*ckevtnc=OJ|9iXsFCZuhOny+^A<7?+5F77bCHTVzaZMju{9_6ARC{$`3vFn{yUuB`8mI0Mh`#uP8gS7wxf|0YK zX!wE$p)2A8)#iN(>~d_X)cc7rB8(r|P8+NPV|O{Iq2V^3dM z)}0U&>mLg-qdX7@% zQw-ud`J1S%QGLH^KQRo1$C*I{vu*u04V99(A%eKTA48?!Uv%s8&JkR|4_{*a{**V`>I_n5Lv7KBDzO6j|m*eNt`Hruh7fqRqN zaY^*vp@^oLE){DZfkRV z!X3HDlnH8pPR!lsZu%|}jRp8wox(~N8w~va9)zMHR4t`gN%;V8S?XWsIJ(YFm2#W3 zd2WxF=Li(NvYj#pL@C~bJq?TRalv$4bvc$4?y*Rip7PRHvOS@e>L%8sTNAE0HhAQ|?cKfPjBk zb9Br#Nim1$&p;%ygH*bKc_)3@jd4cgDm8FkKLrH?|37b(0Q|i>1Yl5iEB0*s)ev6w zXw??6Qfp9qJnt2SvjQ9KH? znlSt0M+jV`6czjChO9l<$_2dP<9JnOVdF*W-Q5z4zC0sfD>OyIA}bLOMV*zZ86NeG zYa7L7)Lg0+horESY0WlUgVXfzSz+i~xCBgF#(37V4An=ojlgf-u3KUpn5Fn-LJIL- z0Dl@ye5VwB{NXQFNz{{Os6_0+_xC)-8U-q?K%L)+*#+8lB_6Y$*Bg12I*NRq{CE&l zWoh6RJBbW{hZECs-OTZfbAe05NDX(T2n5@g0MfADlVDOlwLKEiPy<)Hpsis;Yg7VN=9zSTup zKk|!&mD~qcXS1al(ssa68&4^Lcz3JjN=A&PbKSr1+;E4gRh!#+<|y`h@yMXw{bF@7 zJ4+b7dhNs!DLvq3B6K1^grdc;LO{CTX&`#f@+v7LyKKJ!-6IcN zT%ikW&hu`<=mRgnZHi?n_SfcLxb1&E)&O+nmBne2YlSY@M3Io#NDt!s_4GIYpto}O z$4WC4Kk<)~YHw+hlbQxu@D70Q#}1gZ6WNNy9?t!kX9b|>!`o=k&*0{{=k0N>{htq^ zv7duf_lcce^$ajYSvWKw#UP#H(W$gNq%=Ml>6GWjj>!k%GB?^2ct=Am>_7pUmaD_Y zo=8b)qZk}Mzbu)!X*gc3?m?5EPn!8J7q-}sg|U$xKoo;$VIce`_5U0hX8|yy(`pT3 zrHG+c0KM#jK-90X8fA%RV(g3t#P{H94+EBkS5=aTQIiQ@5&*-(t?37;H~?ydCRE=lk{XbP^F03GucRwYIg z`=E)Y%QXZ#pf)#fJTs^Hy6kM7GrbXk4$FASan*(dWgY zY~}i%z#dG>>o|0^4j6JVh+f;~y4>4sFasMz_CXNG@S|SvgFPkrO8nm&N4;V|P%B7R z&w^lJp;$X&O)^&1uvyo+@5B9CI!g=wGgmP&z)LjN`+DxOqCQ-*ig7_`n9L5oO9Q*5 zaL5ozN|~c@?Ahx5oJa04;VMg%t(5qm6YMqwCX_gFGutz0B^tEV5aH|6NoJ^Uff6GY z%{b!|Ws09P*yqIXbUT?Y3`wfm=cJkCWC*!A$|+B0wt{bo46XtBVFN_mQXNjKmwDFN zDcQM#k3$OUmtbT(L?dN3#EpA5z`n5F_VxQYW;0sg3wq>1<+eBr>F2qxRgc7F;ut;b zXCDNP|B!vZ1G>XqTem2Y4Y%M3Sp9s6QDC)vu7zVSOIVj|pk*;Px8Ac6X72kFAl&1y z=L=7&HCd>)?Tb9?f|;((Uk;Kz!`q6q1d+=+V`03AH?-iXPeEpbF}^-Oe2VmhS`O&yWZlrk53)nl&nvdd()mXQ9Is_Wc3E(c-YE1{a3>C2E2tHj_$> z`ZeKa&9l{Z<$z$+24u4B?KQ$eF?m=?GkCkY7Qx9_t#aH+&sKEld|>RoU07Y<_?Ale z)-;7!X1mwyZ_+MA1P=Xljmu{|Ps8sfIl{Z5(6MHY;GtP-$5XA zae$WWEjBMU2TRA2Rf2?FZN3p;FPORUlB~yz>=xT=!}jQ*74ghk10agGvXXO;@+>mb z3~QaUd>4vSEPy91#y3!0YvQ?fPhODSD@@X#=~Itn-)rBzJYi;UI$~`+PdBK2+4(e@ zXxD)+;3YZ%Tg#akzDA_V)?;mQOfhf(xNEg8Eg7S=w(VeyT_MLPS5KU83Xlb{y>?3m zxq09>N4X-gz&MyeL~h=k>EkZVyEpO};Na{L^^4`?R1!eAVaN!u7_2~{SIfmFWSYH$yZv93@lk*!tJB+dHv z`T`*#C|zKblZzhE7Sy`8?b=5@BqmGqV1*HK;4ug@k15l=kZ&t9_c_ z$Hc2;5w97z(Rw9M@jW9}(A4|z#)^C>%}iPVupBqMHt{(W1!|QH9mP2fO~5ee>V$`H zLmyeFksl8fCPx3;>naYeYkjuL#zW7OeQ~Z9K}M~PuK9+scnanC8#v?+{le`FWZykL@r$ybtj0ry zf49PwZLS#LTEL|KSh)&x&kZjw=36OyBn!VhCg^(RR3Lf_x2N4~JubJ}q?96T#y2!r zhPA;Jc*B3SWK=?a8d|Vj2#etdbASB&2MIeaqWGXW{RA4P-5?dO1>c^mA2N~=5)Ga(Hn0uQQHk+V(g2Y2Y3 z;c0fz+@eYtH^Tzw|3$QgCYB`&%BNZ(E5_?zu5$bgT+=f9N-FyZpQR??Lz_CP#_NxC z%L84_LYr~lKkmXeWw?q6g+B|xrKpihU`tElbLm1*;i0(BTsjtUl+NCM0Vq9Yf)%Fh z;_KV1eS^#sN)l}>ak@AWe>OD~#OYZX#eROZj?Vpy0N9&Ct3ku2^WN2c$;<8ghVgyUXHdg2~;S6^%{f-v|IA7P&ZGPso!kjZw(;3jO z-C03EE+49PmH4c1Dj+>v-4WmzRrE@bdp>zG)kqE>`a_V811-GG@4LAFYw&Kh7-1Xx zSEBh6TqPVM52WR$u#DVeqE?Y^0bmO(32{_oR?7@$7KMSi8gFKp!@8oa%S)EN`@~}; z?9uDj@Irk*cxyrz<3?bYj9{XDuAO31-kW1NuIZn*<^&Vr4nzT-&$w>+ zm_)#hRzmVEgUerV*Q7a`M4%~cPZoPfug;w(lfF9II(J&t56~@DqX8x5q0z(w6D%gM zk*`&u!7*)cTUIH4);1GGrR7!wx-7_ITXk(?<0)tR4t6twb~+qZP9CFRH>junxvuzy z$t*jniqkfy9&VWO`SJBwji2WG0!pwKKH+^o$W_c^$Z%!^z+XWXiU^yhb!UHq&=@3uV)wI&!J)s!yj(8?i>c(t7@~ibQFvq*wSOtdK}wf{B61c}sjNmm6~8 zq~R+w#;fLa0*T>oZhH-0rz>cz+Q7}>-a$UVZv`YuH}ZdWm|ZE7Bo#;Kru#SxsU@NCo?~24I8ZX#+vjP! z5lVU9r#q!`kW~8+;w``$`=q(x&OO^6`wDd8Bxigw{?ld=(!1C z%Em8qq2xw`uW&WH`7t`k#2%uTWVmfEGJlS8_1y-5vg%66Sk?345d=L0evc}Ov9RMgha}6$FiL#7)*sH7 zb56J&iHY=mbAPoON0W?MhAY83Bd~LhlIDVo6?c7)GiBd5IIP-0Cl-~`j03K=qnbX) z99t|s=@))iGzMMZ37uu=M9?ak-|)TC1-A`Hb*I6km@y#29fusOQP&tYpPbGvIE*Io z6LwTWJ7seH1+2to|J;pR8fio~dJk8-_0H_)DexLh7kxO#idGh00P_l7NJ|HB(Rn*A z%fR0O>Ac^Xl8%OguA!Q1bRmNX7O^^6{Eb)B($ZZt4qwySdE8ky=nFdYKCbDhNT-6s zjthX#$3E%%y70f59v);BnO2lNKrYo&#Nf=j+USE=R?e+u-mEWVm|ch^MGKH%=QeQq zZ0X?vmC=1(Bffu+peYXgXebeM%>(akM@VO5h$5O~5zOd^9Jr?S`DLhx!7v z1=*4}+%*AsfO5i%wy`#?oyfc#lUFcH7TzR$v%?uCL1_zgBLifk5*11Z9)t>4TMRU` zBk0uPGVc!w%KdGJ1`|*U<1RgAqkWwe)47=7sF@{TlPu^3^bXT1a{D4;%G<0K4|Wn% z|5q^4d*z2M(FK2$4lQZI?a0$#RCIpMCXJ7{-Eq zU0+eDlq*k?fJFGC|gop5KZlZ^Bvx0%KF#`h?SuSV8Hu2 zvjlz8e+Cwnhv5qdH0hd#C;uK3_~Y!U5rX@;lr4vC02T@+hlK`rLjP_Q!O$0fbpZsH zFo^}7Lq@Zn@biK?{9u;c8XWBI-Encf2+<#uqOGH{ygyV!pmYeRP{+3$vNdTc#@{Li zuMOGPIOk6{`Q@rd*us?u+g==(g5InVN1kk(7wo*JPl6bYVs@r)>T5|~WYfDB20R<_ z@qgS+DF`vJ~E7cqj)JY|uS5A1R4#12hcSBWD2O|N@;7~#|BGo)i@0&Z{Y zfOeA1@&(SQs+9O=rSrI)_u874Ey+&}#FZ&$i|=()A5E8*A+64DWAy1|GLTb(Snqec zT*UxWjY!RD@)C!1YTT=IMaQItniubfBVM+J9Bz_xdi%HS?nzz`I6aH}KwoItue(rO zK4@;#426X$cHdmOv5{*~YQ2%)%(0pLY8O2;StQ-u{j$>Umn{CTv#`xjG57+cE4i3j zKn+!jv|Bg+@huWPr*ORQy9x^svJCD?X$}ablu!gKyB%P%$#&Y7>Nb*XtTdL3@|YmY ztBFz*y5}``W>Sbvd-LU!Y}&_Hr_XD078|_E7uBtR-c!bHv>QovPd-U0ReYxZ3snCX z$xHzUjT#nvi zr;dsie8^`bQ|HN?(OhRKq}^*~x3?wISoO$acv3a2;@aLfmt6H;M^^siQt1wDq;4ZW zzOg7}$?y;i6hK?bl3c~JV4|qhP)h+Rw1HU;{V{^;PS=s`%8-ZX^z$BR?I!y#82T(D z;FpaEy)xBB^`>7)*BidQx!UP@o3SuJy!qZU5r|8*ubI@Hd2ANuq+Yn1U_g`6`1;_V zZ&o8qV!-W$(f5(R5{?}h1xjvt+a~@rEoil0ys8GGl9=bac@Bx=JLQnHoqSM9@!~%1 zLR!k29%~oWl;mp(V%rq@veux$t)wCs>B@uOST%KU)qlZ1pg)Nd>BXz=*3P_lH{oXl2dTHam3w#|?30;tH^3+3{3-<(^PHDRF(^QpVkQ25Y?1` zROV!oF}*!a3K*r+;6fq02S|PZ+QlF1hyT46cr_?0QKH(xDCa zLx)NP_SArQIkR_PIQYSoKX<4~a*z)m>a`9XiG_;Nl9&H4hihqe;j20DmuW}1w7Bc9 zX4R`3bKdy23OD`^vJEcK7z0b%iWr(}mnEBMU8<{Qt}!K+eyR=k1F&@}3V__xLP}XP z*4UB5Gubb{b)GpXICSw$8-ZXrT53+jZcOx;E7KO3tDoD&yKd$mjVZtm;J*VKl&HSE z$Ux=DiUJ=baF3sKp3>=Cu+cuq{zVz^Aw>cp+uVC(n`@=?zh_L~>?2X9d;iW3s-yvv z>obKA=nrYi%=;v}fu}U((>8b%CYBD%d#%i0fr0`r%Q52h2Up@XacqPFsJ!aAtkY;U zXf#VG7w?R0%Ki4_lu@&w1YoJFs|2~v;xtVkufpj$i{+qG z*u+za>F^fYk|#e3T9d0Ez>lvLKl5Upf$&GNx>3-u~vf?L>&N^4GLDF*X z<4ybGhLMF(qz3n)M#bM2kfqy)o@6={o{MkETAf$1pLE;ep+7|tb5yW2Z!ms?x}nOO zZLE?4G-?|-V3yZbFc<9&9wbA1z*BDVeO;*;ShpG{!zOQ~mXaTW>b&HY@qz!vb4f1U z0%smqLQ@QjA=E%6zzMaDHT#!6a53&m@rJ%lHQ!DUl$vZMC$g zj6#U*LKDhBZ!$|_dg{BPmwZdf_w@?ju{Ln{{YHeiU?rD*l+CYV5H1NGQfK&XDzmhJ zG|1OZibr3BeLt@a#LZ&12A=Yh=%(0@b}g&P+?fDHe@)9s$DyXGtIbp&w0r0;#ewqh zE4Z)K$|-!SRHa~=%wjSP^&7D*j$|oXo&22iz@NHL(kEHJ#$~iTS(>=~Mw?ROXbbL) zW5HWZU!aZ^Tsm(9uaV6!z?^{xnO5axun6B_Cv{JJg#| z>X;=aEPM^zP7X{y`D$5_z-%}6x!Tr*r)cp2+6K6r@@vm%(^*g@SEC(gst4Z8|Lll? zR}uk%jp+OrL`r$Cb}4)|@gPYxFhgAvazqXM3l;agvheLD^_Kt`K@^1jL9fU>>9rfK zU>+QCrhfKSvYJ8;wn!aB0+P-a?HKiY9vk})c&MR!^6x35|G-0EIDK;+KraitW~X5x z?G~r(NH|$#;-y5am5KV=_bFb$KM?NoPLprN3`Zokv0PKip+qZvv$R5YHD-(-?VEKz zKy~d^;6%Efg8AfX!XUMz|7^wMjj2MsfYUkJe!_H@daY1;T9&r zkq4hP3FsJusa}LC1xLoqL7QS7qK2pJ1f!$_LFY^YQ^RZF>7{89pEy>dg{0@47JbjD zpZdIhHuv3jIbCW3ab@z}%~ZDw+)Op!?Lfnt9wYK$z1yxesKhM=cRP+4=xxRD`pxlv zLFLgr^|~J)8y!85DKHb!ZtwzoWCCJ(ua=AY_Svp9_<4=$JcqB0PHFM66W`v!td^TGZDsV#PKvPmW;?Ipmys8)0+SMG%xqxrp_7> zcu)U(iL_bS%yBjcIiTKew{G!>{XB$_6K}OCSj?S7U53Qde?a}2AVbo5ds~}N;&=9~ z#OZROp=-LbiKx?k2xh{gwMWhU_D(AuZeomA<(`MDI(-D}^Rk~e!Z&C=_U5=@ zVhT5wuldo6WOw#!U=*<#@!_V)@3XZb{%{|cgPvM#%f6?b21&#{U*`GufVQ?lIwdaw z=`ljm&-8|k@5Q?{PfxUlkvgS}2Aiinz!UWcjzhM<5+ivtg;4Is5UE>)aNFF!5|GD+I8^hyMOHHX+;mc?u z%_3XExs;A7V8)$7m{VsPD)c_vJ8ebU*8|Cb8$%k#AT7}3@SRq){z@Ir^~M4bA5rHQ zS$u06`mY~WZ_lcrg?XT~{t=KN!aXORS^ae;{AQ2-dT}onRv6dmD_J8^3;lnLy=7RG zZM!xs2uO$^prn*^haeywN(?o0w}>=IcT3IyLzf~U-6f6WAfiZjBPHGSovgL)`+2@+ zZTI`W|L~6+%v{%b9><=7AudE=s)sU`lGtn!kJ&fYtq$59Rc`&KHw5!;?+dofjAP$_ z_p+Lgdd1C>l?6NeE)yG*nVkbN%(Pz$_z$teBsCLm6#Qwqu%(%kIYHDTj{H(*%r=h0 z`mcPq{7(8v;wjLb)g+ePhFH`*HoA4t)#j^!urln9-|rCE4?@5iV?0=6ZAm;|JPtg& z&3@LnVI!gVO;G)5AZE}zzo~Eo#TS~JQ@;3UeIFYojDN#lS`ne4pgcrFQB_eVyN@QP z3WrKssj7MMXL3}_dBT=%unQ%iuv)k=F8}>-?p@Oj=BxK%B*MbN}a{T zNz!n168g#3+kZb>%MEc>xZ>4}I_XW0qSnxC+9H^u{sH$b{ktyBMc zxa@}Z+UL$#^f%XyLn|`^@-ptGT9xF%2Rg3pmuHC_K0@RdBV)4RvnFNFtTxuCi4KVu zgrs${oB~R@7Z%<_ss4LPrhS3Z!ui>-B(?cyRPQl))UzhJT*8-qRr>Or0Tmi$j$ZVHtS=%^TI5z*lDYf0X0BY9IGgx zer))kAC&rgs5C&LfKJE7Wd)CC16Z_kO3=`4()%_kqAqv(ktW6oWu~Ot!vIVLf1al@ zFCz+xqQ4sty|*}XH&j(ujOK~65zcyM_0BDN71)b2eyOj4KgYAa2Q6+!Z6HuFPQK$BK-$Bx%x-yGyNL`HTY4wzG1 z)+a~ME6Q3fhi2Um6kES52JNQaU*tX+Vc(hp3YqafHAaz?gg9LwZ7ZgYOH7t5VF1UK zFDBOj!bvDs8N0|vpQ+7yr~U3dHdb>D!?GPd+Xz&)K`%r5)q$+Fz_z_5MjPRwG0{N$ zL2F26lgD;jz}4tdQ06g)xkv58r>`daqsjGtX&JeMCtBIswAY8KvKjC5t5vjIZm{ar z8wcE~T8W>ZMjwLV;D7Grdy@WeuERe?(eL@PUE>`)7`uJl`9lthF z)g7EiXND>}N0hy#5yQ%!o1^Svl#I%$=FH`%w?k3pbr!K1l>bS5?D;O{cyv-ZSvd&L z`8$K-KT+cVG39x%7-nMkEq6?vmZvcrT{@)Yx(G^C+0Tg*HyVb#X%8pm1LKR|!}(zP z*5utjA{B<+^cQa5!LD>uR{i5t!u5LELjlc$?*V~FvbQ9Se*DW5Uo_R1Pj`UULI)_x zg_-xrN;T#b)8A;(;5rA|?aVf3K7Ml7s`i$1C&V}K*w(Fj9X%k8ZK?y|3EK`s6hJ3y zipDN|LDy{!%GE_^hY>ky)VNw|a?Wa5q)8TDzh#QR2+~AU5iJ zSWTHUS36>JhPrW0n&)b~to2yhGjEtm#B;dI(~uZ+Pux3ENCDYul{`lq3e&FBb#v#| z?N)T+v1g9w#-aw6@qz z*8dcfvVtvZwA?dKz~y^*%80e=jM;*BRl_vE%}T6Y;nWBC6rZg$N+=((b3wQ`^~3j* zr0j5^;+DTxuK%r|nifI9e#{o#zh6bfVcH#K73p`{-fwd7)jrQ}C8X06&B7t&?Pu_O z?{cCNDRb)A&&MaFf6gK4a}I|RscG8JG_4R2C`jZ7RueJEMa(r5&L1(+$CpC2imCoj9UCVV$8I*L!i=8EaW}z@2|;PH9mU1GMbcnE4=Eg-;qt7#9rap3c=feg)}A zOUxR03!YSXW8wYqRpvHOh18oU^RRdJMM#8}L~jn{4WwPAW|5TLgM`dt z7OYt6N4oCJ+ESgYo9XSIqzgLJo}FJ2Ac&4fq4B*0phaaF4Ow3Y*BNMT^%_Ul^;faP?12)X>=6d$L)ig zr=)jRG$IPUmHRncPAs}&LCoNF*bh%)yt1^2w!8Enf=BK}7%6l7!wf}@dUHQu8!i|a z6ePlJ!_gT9BuGzHcSCUs!ERcc<$K+iN`qn}0(}a+kEet0-oX!XQ&>mLnN$eW;>u<#TUdI%A&7L(CbW9e! zf1D%icfdUjV&AIjWhHZ(AR%z%IpuY?+2X+Jz?Hy!#Ru>hI{0By1al!noeFGAziDLV zTM6frlLA>*G~`DvzlZ$3v@r!XUTq4EHf_~#Gu3NDMKsh9|KJhv3AK&dC<_!d%q6xf{f()evJ9YK+lHE-Tvxn-f|(Yv?U<=&+x02XzwvGx+v&Q?_f z@9PeYcuMfvrl3CTSB~PQ92C*-A!^j%)J43+MRN@t6|I|$=Ac6o_y+~05&J9s7cSQi zpemnw-Y-D!l=0q5d<#UtS6BPcjJf6IuI?Z>gPVNAhuT3o@}qON@7R(y_A`YEw+Z1g zNs-#S;vW8GPl(LU>nPphMJ*cw%k)E47exbkMmXsg<6#5K`{I5GOa?4oS-2td6wws>va#Ac{?oW?I_ne zx1sHSgfIYi8hMA&@HPnaMI?c#nB?jEV~1ymT6VJ}6=<4VEP_jWgTwRi_w^%fz5LmT zwmF4)jLx1gM-B(n_mWHObfuZ?4e@uJp0{d~#qATRL71fW=hCUOmpkR?Y5=3uz{}0Y z<`_#$!nl)cteq?WDC^r&%}zLDX1P5LxFZ2Qn%R7bWEI^@XVGB!`n?KQHqkIBcmxPl zC3(oVawQs!Qi`8>?3>Tk5lxiNdrqJ*M>#Ha9&Iua>g!N?vn`KG+`ac@TAz||D*fB* z3HwAV^BaMJ+grlH9xd73n`F)9779^Pj7HOl$YNVi&_OWwUy_$iVa1kTS`y7STYFEK|4e5FjqTgArP~YFKZi2v zI_2eYeQglq63wnRDViT6RpY%72=`qUm}l^D*@KTlL+)2}a2x`Wp)eFRdkE+++mUxo9oFL|6k zO%7var`sRl26j%gnof8ksQGy70vH0oX7E(7OV_r;N0}fwoI`o3!yJxe_>Jze!D@pg$_hS2fZk3n{$mdn|-MOh^a&$oc*6Y)3# zR3rGJ8K&~0)AVJF9`y0)>@ORhr%95@)XX9Cg@9WcfIvu_Z^UN8 z==Z8(ING>tl7?8-o+d;P+ToG9Y*8_^ZF2WK1(}R{h^k^)_?H;x#K^Y~B&b(9(u!n_ znv>A)dVd20*u-t0Vtu{dI*-NH!Jw$~UIJpOAo{>c6$1gm)jI@clZEZ2md1;+oV#1Oa7;!cy1Fl4@%kJ{tfOdz}mt@yi85L zad>TR*V%#s#+EnHI4b8yJNC_9NBf;FnhMD;>}RtK@d>YMp&}7XXs)yx36VLsIkaX! zflQy=ucs@yI4?(@^Pz?EtITb9Ihn_CO|AMrD4VI{2nDrK6d*$clw_?66h2Ep_AG3X39DFSxOm1Br49zQI48 zx+PAU4HZg{w7n2#fux14rNDrO}jr*hA6}E~k;DgO48`HV~ z$CC}^&}VA^F98;*3NJRN9^^7z%m?9t@%HuOdn+W2z9$*J)h=z7a#8i1x>c^G-g6*d|xHL#ut3c6}y z4LXRAKhUBsd@WJPGDwxD5MoewL(Z9L54;A)In~#)FMTKrde&yF?Mt%^qQA z9U9hkO>zJM%CGc)dpn5(fRMvug)|Ym7TBfBXFYlRb*+w7o=aPh}r1g-w{yZ;Jw-7qA+xLq|am%_TouP$~GN!tXHpGZpL$ ze{?6hFBmaIjoz~@%ka9uDlufW6GX5ui-3~^DjVJz;FaUh>Kq8eik_a6iiK;VF%M(G z(;LwU-rnzZP}VBlq9y-Duqg#t-%a}XWZ=bJMzv<`{aoQNU^7yf0ASR97Llv!fpqS> zRwYs*Da;^1O%voQ&}%1eeS<6 zff&98z=?(+grDO4;cu=J&|DwPkyR6(2Dm*z{sONqwTrgT{|V}UjtYR*J-mA5bODnom5s#3d%5@Xl2kPZ z5?GVsNdMrL{CV^NjY(2fe^Ic)a`3+dX-OY$4M2d?ob2DAm%`o)M8}C@PD8|NGsLYN zGtn|z@QJ%!wl)p~lOgRPpG+j5DlqeyFmse9&{M~VMzsz|Vf_Fsy=R2th3htGK}7`# z@h@5TPM7#Ck8N0k9hwq|pLt8f`j`mE#oR z=73_}qoYd*!q?)Dw)Benb2$QFf4{u%BX~6A(|@I0^51sN{n^q{7Ag%`){w7?cf1xo z8&>Pi8A%aX1NzOK6R)M{=fWC%KuOPUwtByHP_8L)wK0~gMXPKr;$Ym$ z$mjdqF*~0fYG|>)u_kLj5H5oP3ALH5E{HzcSJ=7ei)Xx=)JI`1_MQcqQ92k1<~8T? zboU!ypR0BiT#7DT!#4A;Djd6c;oHP)18~=%O1K3z`}A&GGqFZ(bQp)jI}R3}${Mqb5xm@&Gr9?feG` zO+wnY3mqXMGATIt3=59-^GyZk-*{aK$F9AZt{P3du>HnCDV9!!X;(1=bZoN5cC)W{ zr|F{9wkMk^&*s1ppcmUb3Z^-gs4gy&TGm4ILZ7tJbAE!Tf2GS%3Lkl(h={$Vg7X#}*?o zU&EyKTDWY@r9as|P(dZoy!)=FVCwI2;6H!ZwZsZe;2Q)k%DELHv?40FQg>zT9<_d_ z%-dyfrWD&wxz?KXJm7S>u%yzf1J4pYKEr9n4dm!T>wHB+Hq7nPQt7gMiY7_$<7BnncJ6n8uy0uvKxz!bf;U0Q&^KrvBwT%tujPY34%Qc%pW)$fko{F7 zP_cA-^KW6Biyr6S4Hit~q7rt0kK1n6ytkT`nc93BMzyu=HoNzvbLj%S$)fE_;W3d! z!_w5k`18rZi(+L3s-IpSaoEna%rMTUP=7mMV-rj^6|f%!BO6!xXXOl`BR@sh;*mG7 z2E&^#^nhdB2A@tNQF$d0Ew9A){=@~nEb~%p+MSe|0E2etoUQ|&5K&I^k&`*UxxlK| zHADi8Fe!az9628#JvcV(IVpzb<~QR(%<{y)U(a@$Q3|-@JK4Ar+tC+;cZ7sRQz;giIrmwQjwIcawXA0|hJ zzy-NxAt4pJ-0GCF;avu|1xA|a0xf4Jp^6Yb6Y>JBL`GD_BI(Foo{0$apEuvOqwj}(aIF(72 zRw0aTB@;Ak4$$~ziTWUcc0AhoMN3Io{XS@6nq*ZptQanUJ`HD&@4v&=j6B$=^TFK2 zxu9g23B6L9`x~|Zix&rNkydMFG$r5U?9TKAE9;ib##;)u)fI3bY!Vx9U1D|L0cvBd zj<=`dwy`b5`kh^SjKsc<51$g#IY9;n*(CSQx|d*LcKYhMfE1Dx?|A!Ri}~p9@}&P| zRJg`KCEC;OPBg{r-`SsYrY^Oct?tt`SzIN8o*};N-Y(FfxjKFMovhCD*gy1r&eOFKt_T%Ju%66z!EN`bZJPhC$P$s zUv&|?;uN&&Nl6Mf^YDHT;A%Ju@c$M65*sz$e2pa70^;!`FZqhAw2?@K8R0aP5r}Co zweSqZ+`%vi=jq4fNNermLxAl2e#?9b^~PYMn>W2H`UeR6wwq6cfYsTen718$A&>Cj9XGRbQFgj-l(qB|4R*WqSu#3?Eam6Wc%tv$ZOEz!Eyg zV>QBC_7bN|Ky-CHX^3Txif18fNsnWHk>tge{ldrAjUdcRPH^zw5Yt>4{KJ+8fUxvC zE5Zzg&@E#q-3qQ!uL|;mzXU0)b;-?lFUSte#qZHdKjxgP=IB;FJJh)J5|M8_NdI7* z%%{h%oM|q2JI_o7+`Z?G%0%n*gMUU0wQ1G~H8%T6u5c|dFHQj0)i%~BLeax!r9W$M zW29(jUGcVR9(2L$4bjQP9;?sgHUZ<04ymjw=i=H4P|NKv4{X9}z`;C-8Gm%dTf8C@sor%AqE|i}Of(6;XzADKho&y$@r# z_5#6q`>+Xv0=;4?5mwT38i$_!so#FIyIPpR^f9IS4MSx`6!E*-%{~{SH-g>n!r#-L z4-%MqLmQkdk}3rS2dk|!S&6Km*qY?@J17FlUcM`?x3Ggwo*_#;N@nOG!l@sx#mmtO2@J8#ot40^;Q800`A-Zb5lN zK1e*9C`TWMpq>1=J7|ZOt7>S;?0;R$y-@H92pS{?Gx-k>21VrJ7MaNvUhqrGIV1Dg z^bA3Jm)K(|DJcVQgBF_<$DvBl8O#6fw~Cl1IcWFkc@A?#78S(yBGo@nd+eVEq8pyf zc`xA-n^Fzze{SCEP8%f)kJ}eU>T*h_TmR9ez|x$+x{^s6y<$V}{A09@ zFh};+rW@4-YV24sWA?3Q-Cb`fVF=^?1lF|^!GNxN!c^{lzIfOXmLS!*>T|uA1p<6Y z6DtZySKjqe2W0>s{jcaD+;s9m^^&&`(N&LUclPD0#*FH0L2z;ReNr~Qq0xV#-Kc4I z=9UIBUX1-Qw)sh(aDTBoIw-{C$@ci3+34mcm<_ zoH4dI33bIerLYIDh5q*y`j0Qx^>pG7VLi{)I8zFBF`)$X9o)eEe&#?zU<{tL=4By! zH_&J!#@Mma{aFn~(I1tSkvL_e7ptouuIgcMO-dLIQ8K80^D+9uH9g-@tviyOvs9z- zuv+o*&x=pR=c7~hG>VpqHP&;pjEu?)=ROCc>}LBcgrAa2zlMLSoAcW7vZ;?s)8Ykm8H)``Sv4A(v+$D)J3e1<#(4U^ksUm&2nq zc^e9A8X6i7RkhjI*bYD@&rVV>ep~00B4imuq1hyj6?sqM2qZUfRIJLdI08cz8*^N6 z$`4O6ShLl^>-S^CHeLIVG)bA?Qb|4@L@>wOw(kf|_}%rf_(FC;z+hihhG_fu7yeGq zfOX?)hFF6fD{`;XHWxY=~!Na5MIV0oQ(GfWoklrk>Mx*YY6 zj0VSpsT%7fScp!0P)`X#z|$d0*y$9l3E$$5neE5Fp!ff9qWWXHPgoJ>P*Yn3E$>~O z%<18qGhvg0UZq2GF{BrS&}1J)T8?0_0sZE>PS(^yA&SLJz2p&fK900YHv5p^ag-TW}A@v zuCev>DgEa7y3YkR{m=a7M}YIu0w(2aA-O`QzX^PhZ|5Z3 z+4Xa{e6@bWWKRpyizACJ-wuC{&DS>+Z*Vyd8k!H2O<5Fdt7c9#^;=D`6yA0cV~`S* zO9d>7n7y`>&kOmYF!tbjqo%|904aadqlPL=cGhmPrtePs>G7LH)trkYOGgPjEb%@b zl#tA4eYqpez+e9!+2=-SMp5N}f(v_$~_1-}d& z^&xjyF{Pu=;VT1agT!8rKSzL3)7!g0Bs>jBCLT{rdi-y|dXi#Oy_HV5IKYyS` z#s9$6;nWBrD7smUDpb6cjWmrTvIi18ExOMy>rOy~ z5*@(TTsOvl-u4sSvZSIu7w0}Hk}?wI_F1Bu7*O`XM-ipz)VU=6Ej$wmu)&=EdhPpr zzdylP78tqk+8a0c%5sHYrXY~gjFdP;3eOkD=efmA5G(JVo3`H}?%$G%V+q+RUsgvJ z3%eGH6RdEPy85{W(msdrGF0%;XGT6?g4bG)eSbSzyuRX{lIe+4@L5=Fk@5YG52sN} zpkk)*1ndT^zh1OlWj91MQ~}Sto~-y^d2o%I?6bhOIa|+>=-cHX*xr=Wz4m@u;_v=D z`3K;o0S*fOWj8fkp~f0_ImUH?$8x6oLYiY72?II$bvAo@-I3bgz^t+2(D-CSdzrp% z&jHx^w*iyS24sd9OOt?oT!?HDm@NTp^K!^1c07UG9o{af;Ol>`?tjZS9ZtZ`9c6_B z!T$tL#p^31l1u*5GxX&)M6`-Eb;)drb|-McCI9m zAj#5$XA-IB4pBK51_ty!?T?3pOY4BkY|*Bsmwtnt3vuSuDMWA|rON#g#z@XX_UObQ zHhZ$%J3`d4OHGWPQ^$;!8chB2_P7v)mxuw(dJ@Fw?YM22)6nSAG-@81o!%ePzZ&o0 z2GybZjiDD%r4_!c_zN$t>%K^{q^Y(!vGApLeR$1M$3$VA=b9)@|1#( zp_?X}jQ^1C^pSQl-*yt!T;!26yaz7B@3Vf zs3;8T(DP3MvM31DP2hkLu}z>K_b|wRmr7oc&-Zq?JV&;|=6KSY;~u4`_c)8VdIpzC zpvdvKnW20}87_#<-a{J$2#eRoa&`!gh(!ce2~mqqi%&0{MifPegz&76hOM*%O{}Z) z=ckuCqM*I%Tu|a16g_&%x#eBk;9^NkuFw^!EXbw3M<;-IT4d?0W|YaiT>veGnA3xZ zbB|(Gey|;<-Z#U%W`_u^?4%T@-Y>}KhM)I$YWy*yB&^uWFpJ?j3+mxO*GgPo2_)l4 z43F+}MHT_oMpp&TPtmV?-DuAe#hO9qJ>vtvXu9Ej}Xu~H*$NGV5Nd=CHXmX)?aEmn89Bez4O zA(*&|`k3Rl5R4mR>X)o~bNH|;$JWY)q@3Tw3wO-Uk{8|r!;2r|x?Zb?Eu1Ep{n>QS zN<{79FCsv@ckja8pvR8-&rI)xC00?abE|dH-ypz$oanR}s{eAo;H2!UG?x1Yox(>WVy; zsH{6hk9{$NbCtq!7lEZ`0xWEc7tD{))MD6ApCf;PLn#!V+Tklb$zoq;eC@4(s+u}B zMI@`8fg^{&xhwEz-rNh7BB_U_mS3T-6aW_B?ELf^t6$ypxAp=r z`ArK7Mw_41wRSU2T^Aihqd?Lk9+kNzxot`@rwC?n(W_-bVkJ<8`TDqO0xinLY5AMg zE1+5m%<_pXCi9JXekA=r+w~t}6pnJiVDu;tcy%VJ8BCjmQ|q%zyKbG06)ttT)5kH_ zDBF~_@92U+F56;c@N+4mO@wefL`JVzvh5^*Lh9fkYNSZ>jC(-F48*g!Ea-M@h&&yA za$|xDL}P>?h4nw4g@6Ai$e>`Dq7V7d?(`$Q{G&<-USplz#Ns+F+YO`wMrFtA2o8VL zj63KJHnOBT?{j+f;fPXk;MXSa6u#rFJ*KU8_} zj2B*`aZ<7?dY&vLxBce#*uP=$_F!Wh#Xv zN*rexMNOi6S?-AnO2vy2Iee9l!UuQ%5xISjhSni3q^6!N-pSL9U!R!}be^)X&^F zJm)>WE`NI|tNJ7WF&rejEgBVmtve_JGRVByJdF$F^VFj+j`flr5z?R^qXlc_kMl$M@ot-gYVEFsa`rR#xUsU*vO$ymldbLna?Ls=1L8uXz&rhB z;XGKd=ahur9LJFsDpiv3YwWR8a5ql45w=u;G3J8K7Ze(o2ony&8PXXP$&&Q=x*Pm@ zV3a!lb0Tz*qi`S>>lcJs@VWM`@Vg%pslRaD2u4>^_4!7&6iZS|EVoNBm(y7X1D%iIDhUbkU`CT%AWiC4*E}3 zu{auC8(uv#*{y4^f3_luQz2~Rv+CD8#kAKT&#EF_b|I3KRTFL6(-vw@gRj}0Di<3G zFGXTyu;CW~XWJh+e~^aiI1yv<>wr2|S`kgvY5l=pSpc-WfL#TiIZ@7e?+=$fS%Q6i z;g>rM5Qk@q@L=S-5ui+)oRZC6w0;!{%Ayh&6m5Xyt0u@DS*<=BR$_E>eeAe1%aM{7 zO6PukDcDrIe0Z=;G4z}&sP}a9rCeN@vanXl4;@s(QY@N!4!zo8pozA~SI*e4HqWc& zkZ5qrtKuUzH^H^S9044`jPql~!k}EMd7}-;8}n;r&QBUe#sIE?rCf^TpCLGp-Fb$AR+752yN*K8*|;5YfAef1 z?0ULSHMEY7(jJdt!BUE49nh@Y4_&}OocY)Vr=WC;Jl=y2pP@^8|W*4gEcz~#BgW#>J)41UMlP8>>bbl>?Xs8s=ne%MbF>8{@f9-Jh|{S?5bIhM_ujQ zg)g{QK~|4a7LBeLV`vs?^iT7G^gJb|%HjuE!~;1G1O!yQnE)~O?z0hA+01E7t6K^> z5ii^l;g9Hbz=OLaIY`X|jcR5LAuo6m5X;=k?J?`^M1LZrT+{AbHS!`;ioj!cX^)DK zW2O$}i1;5kuN|;_5M0ma*?=P$f5BQTd>y2=SNB(Axm}nr5wy4!NLd zFlQ+#w^L3&y5)C7AEA26{$#m{)cbP5ZI)UXRt5Ng_maB%=Rk{&@E1%qDVqU zRPn{MJG8)mmU3rB0I9^L;X|2Q_)6S{Ow2cZAd_!uNUEMi<4bjkcFT0&;ysCag@?Uq zg)Nb7Vv^Kb-a_ww!}GQF`OFsG<~&F>7_^<74(}sNDla`HWpj;ujuM(NZAqD#?dlW~;RI4m3FejlIb79q94UB$^nGNb6ZDR}i z88UU{P52m+;dfKu#DuB!pXoKX#=pk}?xX9!V0OPnRQh|CWqk3LHYtu@wOpRrf_z_B zK<~EVb^W+6Ya|j7ewfAOcuhv&mhwaB!Nu0AXO3#^?O7B9_E? zIc!VFY!#9ggJvW8M`vrtP&Q`qdey}f%s3o8yoz=Ar8Qk^B6RHQR`sIbabw z=jNsu^Wtb(XlZrd%T}lvD>FJVlc{`b{$iu1`G0mj;}-Eyv#+;6G|y|~n-{e^<<%r^ z&_gpx`ku6ciXR(`xsjTM>Q*#_wSdk@lqnz^R(zKD!e1O{Y&d6P6=jG0qOMt2Q|v&s0Dj@bt-fF^XF(Dy41 zH&22mx3uAo_sgsiWGR@F7(ROFj`1fmt$wXZJ}Z1dM$-%&8<>aPXu5y!_#-|OsWaQ# zVHo8p@R~FO!_&2!-2sr~>!Yr6GM(DbRCcLprHoe-L75o41hIT6&Cs!LAZ8X$EGds) z3PNLOPAMo}J@Z(3q-?GjBt5zUS2POza6S`^mD$<x4F_w!WT!Gjh-7tCs+!`+Xu7eN3#TO*Xaes7y>f(8Ng|&i#NqK3|(a z1E}-=;%Dmx7(p76D}JOKtFej3=4gq}^iZ~i0@c^fuOybJ-7Liq+PLw0QVRJ$Eip8K zNLq@&tNdh1=8BltP^&+tM!CYRzL zj7}nkIqsAg!snOYK{X%s-tOJ)ThpgtFAJmwC*FXT1jAN|j=D{bJn!t0WWn1AJxgEV zB`i9k>SWZuKKVqioG3s%-wM;2qPlUgoz~MD#vzEN(8Pk zAWAxMqH(ezvLb#9f#5anNAKeXWpK0-F4M3wRa=@0eo*|I#KJ7&E9RKZo-8&;D3(&4 zN@Iqh*J{_S5Y8qxIK{P>fR%yJQjMY(nx~@@V8*L7{0Q-(^+F)XllK=Sw z^)$h}Ic~1HJZpNfNy7^0ZEu*4!+|Pe5-@{!x0M3gOY)G%0CkW?CHl$qOBJ#*rf~@g zk3?maVZgRVtS}XYXgy@dZzvk1-PJ?&o@wxRj)v0b$}t%2ABAy)?h3nvt4v+7JH{p!O(#<~ysD!3~KAh6usJ{e}1IL1m1 z3~S@k4ZqV=R8$S>EOB@Rgbn5Fj+YIYKF2yqTFe)foJ6W+bMm5udei1h3I|T z_`T_CZFow`Q2&*9_|bGjm1fmz_6rPpuZDU5x`vQ0e)9t^cZej^^#)i3lxDtYQg-wS zZB@PERvlb^_HU2bDLYCGXXt&(Ei*}u2$Q2|Y-Ld^Ttn}lZ^ewJ9y}2?&#fqr#VM)p zm0K@trT?7ul@Nsk^0jT8c-4_@@C0RQSBH|=8PE}}+K&QoPJti`ACt+15C1ss{Ga;6 zKsHRk9Sb~uhF(w+I;bSB-zCG05lZQJK)63zY`9GTV|aUwYBO^bK=5Jtnfnjw zB2d=Nh_MWxL)dxJ|H+CqUcX#U0Yc@5U&Nd(l3du zB7>>iSMtA`ZfJVbKx7zy9we@_~3)|#77q@m*wQ8o%JT(dQ#uJ0;a42uK z{Z#A&GQvR_leqZyrU7MqxfID%ihUM(UC}X6rU5_x^1XCnGL8h+-lB52Y|SF0BZ?uY zB57g7jO1O9>{}(0Wggx?N;GPE^2_|wl4Hugkk!x$$84p#E%y5=@98o?Pk^ewMcCIC z^UftlQ%_cgvc4d!nt1AH=)67v}fJ3|AQks3KY!-wJXc6=l9pIfM2mnk9LdL z@F^apurWDxFLWq(xL=gRUj@=lA*B*i5{}NX_4HR?W{K+86Po_@N@b9%@;st-A^qa|3%GfaLd_nTn zfkF#RLj74{S+{{LPV=r5@r8iCU~s_Mxp(Rtw4*AZ1oGxTjdYV_M2?&q2G0F5`}je0 z5NFU!)#ri_2;y4vKK@r8?O%ZI|8JQFo3yyjDrl6&R|^zz*(UAvwp4kL%fiz z-Hh0rF!6jPYz9n605(%mMVfx0m0?m6e)-j0Y3*e0gf1@3K|e_Xl?G<7w10~k3zMKe zk4=?BiI@8X=Ds>LSzHU`^AK726(ZUcJNdIF7bvy$1O0#^>n`m?1p4h`_B{IDRBddIVGec`Y(!B@I1ApERa}zkV5hA$Uqo zsGoxAh1vIwjaVT(q0WSi`9k5W63tF3CEzNrGnKew`z_ny2WjM(>TFnFQM&8{T-+K9 zCau9acEhG|nQvK+(WY_MI{INuJ^M8&W5wm&7aaQKZ95<*4Hp!)XE92u`CAmS#b+Dr zcDb_mm^tf>bIRx5`(ZyT#)9?(#D}*&pnT!_ZOCjWbwx6TsK3wpc-t}OqtjHwlUqOH zQoX^f_u1A^S0r3=$-~GadRg*uL=#cunmE_W6~J2U`l*|pF5%>HTWsZNcd!yFS+nZy zLy=DN6=6@iL`ajHKsA!j;X>Fk-O#sCaY+CVSI*RXd_DKR=kM{$>i41GD|3b`s!c0J6{Fk!P(}~ zFB+`Chwg5AMslO6o!%teXc1GD75vEF48-slRv`O zpwY$IF?1zDgGD5e3iIK+119_J;H_?+aZn)`c;_S?=M7Qk_bjnB`oc&D$^E%-*h8Wq zeg!nth&zLN$XJ9Va{#ED8unYYe%RluCg5}5s`zQ__r7O8BjGGS^|(yGWC`#dr%hTq z|H|}Dp`47@z3_IK{#Z~1zSZ}xBom+E>9i}uS(&4T|eGPImD6s10(~S)()f!{<`RpVZMA4ufXgDUAsghn4>V4*r)9=M)ExsZeG7 z;|IyT5K}z0Uk_*#Y^e!IwJVbd1rT8f2Sq^Iv;cZLYDI+Gy8AC=qCoSGncA2xb1n086qB&del^XM zDCFS}Xs$xzH$lwxVk`K!27DgYUm`l$nXvY;_UpUnQ!q>4>IL|t%pifjYSmg*xM|8u zhqRV9`LzC^FGwMDNx2|08sVcryZ;%bQ&9=g7R(ZM-6aFeBb=sIMwX_r1gYqAaUI}fJp{of;H z7|aO?2i0oz8;qce%?GDcE0@XchArJ$!Y)Ws)n4OlA({ExmfBTzy)86tI1S+l^Lw5r z3HnUw&`^;uM^tp(<1EwPi34c{ALwyrkAEqPIy%-db?S=#i9FhD92UZ(wfmL~6Gv0B z%8z}o@H3&KS9~k7#pnEz)#uSgbT*fo6LWKSIN?+%9+gSot^hjDqjRkY_TY&uuJ!M> zE5sLVwk_}0<4)qQ{{3dVdFdbNl=A!g2G8B|laoE&7z)AdszI^3)zht~wqL5Xm({vB zs1>ttvcQO>f(bdl_98B6_z<)6l)$8&lz7$2X0UtiHf#bP`0+5k7?L|)YF(HA={);KDr zFPQtCmPq`F#csZ!xl!AFI%fm+F7f0hq-~yi8`>Z%oS};5CxZDikyrzDP(eO~#h~VG zf=01=A9@ei7QJ{_86Ap*52A7<->%Mnlb2p4#PEg zsjaL#dmrL+*gwrEswk0R5u_hMgG>Bcum_O|t{)S_3m^u~-e;AO*+4vH8>Uj*BE3hz z(c(nY>rDsWcS({fuylwv&3*$&U)yJP{nDe=Oxu0xS`6uVJ!ZU*60`qk=JY=f?Cj$= z-!*OwL8k{m?J?(djMF-u{!TCL#BA%$;|&C>M?M&sQy(bT|L3Z={yZ^R!PO|CH2J%6{(j#FC(WZ&1q zZa)Ui`{JLnyMEb;T=*L5QMqYeE*6fC4zXKtNu_o0pp)d5Na!oo=lZIyX?HK=Uk)IY zhxJ;h6qX6yk_-$`Cle*Cs1uCC9m^ukG6}wz_Cx}lH}&Fgz9kuXqHZ>e!u~L#-VlLo z8qHJG(!2j3XI~vvb=pNOR~U&=kPsCq6)6Ex5tNjWZn$(vh_tAHG#3d00hLmakPx_Z zcZh_5(%sVCo!`0h&iKA6^Q~`vvs^ClkNMT}oadZ<_SrkpRgRFLX6pdu`?;ITWPrVuVcC!!TAqcI0;Cx{M|A$Jpf2A_#9K@|9rm9jX~jx z*sF?a5RhEhio1#<=HtJ->=3!?coJsH*GZSr4B}1Yif7_+&w*d`#VhpB-aR-^mT&mR z6x4ZAM0`UIxTGk@#}?OTInCN?{PK(zwH>~Dkn=EFAII)VYWs+>@#A$04#+--7gw@z zt<-lv75lyo2t?N$hO_xWn(z~R_>o)YsyP3CS#V5S}=#f(2hv`R&MQ85W zCRtGy`_GRE2I7l($EQdX2Kq{|-hE}*%AhE*y+^7c`X}|mp#>mT1kvG~=2_hZPGyeU zSGg4o>O7h#2>YbZly@bo$F-0!>e6^#%-{we8mC^rFR>9Y}q3wV!=R z!%&JkFXaL!T_~^I&IfTE+>8^a`Rd*GX&5+RoSclw!8a-5k zF)Z|bJ)#>z({lbIhdHP5s^gfUTj@+PG zj~pdtc~~M@QM7%WcIgHa(UK~QmjuCu0G(0xS zQ*uX=V(o_D&Dq{~-_o6#WLBR{(p=!V3shYZkPm7dUF0a67=J!icT@I?Z+09nxoMol zyVf?fh9H*N$_Wq-nj5cS>$AV?eVuN7bg-0#!l3KsTilOh^`tFaR-?VnaiNc~a0BJv z5!ZXrG=#F;xRSeKBoQekU>KWt$G)AxVc(Clq@8#7OZjS<;|10WYRA2Uy;D?Z;`jng zyDeVC0uw)LR7`Aq^`kJq%fMEz4CC{_t{~ob{`N4vH!2uZ-YOGuXWZ;+0Z)`rZgrmggcEqcg5D@BigL6celVavE9%BgeEE&9#{#x5xvUUy-&D>VvYhWM=U z`d2a(u1`1}Jk;3_KA0{00k^#lJQmOAkJFb2sHYCs!HCfX&8^QS6s51v55YvYi;L>X z=_U9m4A|faqa2877LW(5gD!1xV-wE``4`KMWaYz#MJ$Ae$Idx+OzEsQCu;8TuO!et zS}Y&*)o%@Bw?AgFJE06)858}_vIC%xbB<*EZSy@lQD^|X7BG7u%P(+GGWdG1pF0B? z`SkMyTCHUV<)Gs(*tNUV@%Vp?Y@jiaA$S()jVs?*+OZk^xNfhe3k#I|uC; z3^5F@9t82l(vqzYe|qj*4r)VNwjbT()eW<5=7&!wGCE(%J)rVET<6~K4jhs)8owpy z89(=FOzk65u`^XMA&vgi_1nQKqE;`GabBsO@hLmwUKP$IPE3AJPw=DR3KRA7zPIO% zvm70rmyP}x`ryXPcnX9YKNh^2i!eQ3saL~-vCP=kqw!ZPs7Sm>ynNeYL>0rhKvlGW zyWI(<+PMn1eCcpbJDlgfp{(1_!U>+FkMRDw(-e$zOgmu zN$m+qAyh4;}p5>{@E zNsgs5AeB{4sUZF?y1wcftHAeBxwPn%9b1AZ$GryCZeqe1{(QftPw6lyst%n}9%E}l z1s%rp16(AjQ%{~b0hZTUXUdOK4YNys#0khF4$cLLQ{DG#S{7BX>Na2dpLv!Ak7I2E zfpn4+#MFT^#kR8(NjsX4K4b6R74qELY!K5<)ht{oBC5LnW$zd%Rq!}M1~RaFlg>EwH17?i@`0G5l5^cHW^b_7f9 zk(6}QYCh_JA^Zm~j*$qztNPj{RgczOx{C^IW%NM$#7b$7$1Q zSw(N}6~BwK1}L>D3*I@`_uxgo)FU?em@2kDa769^S&?~{$wRKPVg10+9|K5W#Yc#6 z)afp=HsyXc?3$2rikh#VWajpUUOkiIVxZ8{sL{prvW+ml-2!Uvy8+wzB*SOzXMz}! zx$3z(RN>yqngtEZn^W?!DLu34hbvSQp%l~97m57w_MEkX9`)b1{-4&yudjG`0q@#t zzw2M;)UtVUQxAOE>=EZ(FcSw3r}>8ha`K87lNM+Zwz9gr8|E7e+>6gjLMMSNbx14n!WF)S2vY80FwJ7;<&e4>pHhEME!fX+;qzDn6t4CN=5)wM z`nSjJg~V5Z)WMqkIOg37{rFBs?b?Z*%|oiEGYt9foW@`f>Q22CR-3}+e4nZKAxj#> zsjmFszKUwr{=sLee+v9@Riyr&KaioU`1-Y-t#&J)?K=dn|IZ^HAQAlcHM8tHBxd{L zecA7?kJXWE$fs)~GxbEs53)`e<-^R2D#(C3maOFS6;erIFOXpQe^X%-{_LCf8Cvg^P2sTerS_s^+tr6W9f>#W%e&8H{KKsR74}CVIQJ zzgcz+I(_pt#AJqV^l8sAU-qNq?u>Lfu&Ekg1eO+ z20bgzkXiyfyk+8AXwwQM4QfUb)sCIMk}+5{#26>0>bF%ZB-|$$;uz=t?bZoBAcm`@ z0%eLdd1Jn<_WFTDhR?&kw0Vq|FltwX=BialQWi|d+^o92&4q&6L=hHQrU+4k=6EV zrpd87?JodLU30)rksz-oiSj7i+w-qO1Jt)!Z3yJd>sQj?1<{? zPvYy?tN03|)OT-NLyKq;o9mANlz#9uI>kgT%RpQMCdO36M%-4fq?dqcE@js6@bFR@ z<4hFp-U+}+4pBnc}Uy^@&O zpN^T0M!_7oop^~nn8gC}bM0s#Ds^SvDUVUKzqk6#4^h%>W8S;{o#;X6#25BlBv z82Kk~yQkx^7I*ruw=~vlXKu0|HUD6wSW$_A1w`qn;Hc9DSdG zO9q4bMWSoi1p;#w2m2u)IvWm-BfL_0yP36f0R11R)nY^rR!e|vB~ENpF{f-D1Wcb9 zt{)OCzy1J%uew-#-7@dFGGT(YaqI3zjdVEAyYIl}38D7Bw8vY`C&9opN`ZIk1#X_V z7ok`0WE5d8MmPtgpUi>9#`pU3V*8g$3{`SK~EELQ^*kzfhzRSQAk;rt_%t}eG z_1V6z-aOMu1)cUp`Ab-*&Gm$711-k-OX* zhAXXm7Te4@(w0Q$_T#Z7iR&PpnaE+f5r$(#kmpOz2HlVHd4l#!H*w81-7hW4x%XW( zfA#An|9b}&hqM*q;ebT!t?XKsZPze-WCec*#j~m-w(#C0RQ5ey9h_#se$W(VxJ!6p zX+gWv;2XFQ&sYC(^4jg5c13HO`F`WNH}r%--{kp!=YcJ_RRGU!61wwEngo4UM$=)V+PoA0Fl`#dd> z;p`CdF~XpkvpU`|>5Y~;R~N}!42-r0>dWL3W7RLuwT;yH8gakA_YRbc_z#DR;&FL& z5#Vu^Qx8}qd8{Y}{S|8Gt@~hfn?Y9NKISvtV7|5VJ>-_T`r-cZ1$3nLZ=rqI@-h+c zy+3uL9iUE)Ll0(N1vfk*zCJNfPM6n%rRs@+8HPw8Rx2$M9NycoPu!Js^=&X}eEZ$a z1T$|x-D-#|dTRV4+4!aJ<8qjtC!d-4@^1COMmT^Kv568O4cgh+=Hp4DQuyuSKlUcg zh0_HvOF?<+WNw_;{q7<|UmO@@FlbyDDCV)V9_%lysq%!-Us!V9zbGy3MFlnSFm@x< zb$g2-&9G+h`VBb5N4Xpn(tR?x9I$InOB+HI7#!aawEelZ$)V{HnUOWCzh zx0y3n`O^3MpCIEN$~$cI7|mZ*@Sscnqn=8c-$ha&Y~9j(>feRJU$|nQy1+GM90-yu zYnMG|Un%CB4VtOQ3Gz~3c?5!x`r*sj#G)668v`oBg|T)|U17G=zitG=acAgdE;y`y z<4oPxuRbBw(p#eVzhd?!Pcf^K|OSFQ#pCQl9(YYO8? zrjrV4_P@Yq##>~Y4-95doKEj~a9QzS=fLp-S?sCUq{Z*Ak9l+egUik%4mv~K8TUW$ z-QZ^JmG&{Yev;zW%>xZ6j)Pr8f=|puDwh8q9{>Kb!>qU$c$l^4+tYQZ4OedUwlgZe zba6;kyRl13cTorEO0t7?OT0+JAFJob4+|m3$h$y@x>~Q=XFO|~!_nDlc|;@}vfTr_ zKO|$Lc~y z)N#JRub7M05^bIFSe=}wbF>gW$E_{*s`>>LWzwhm#JyUZ7m-tz^h7wxe>flXQ7aSv zJJI4IQ5r6&I)8b4uMpJ48v?SP?Ww*B zPGbfHA+2rlykvb@WuboqWJiizot9hahW`8*@ZX849|s0D6_&H}-A_RyROG`7cLvT7 z>(TZJ&TUW5cEb^14wX-hd&ik?;e8-h+eh~$<aF$Mu)x{6Jgy%@9l$5WU9 z$o93=r@BBn(yj&r^S!wu=^50)l;_xUouDz2GWdbp-YqCot)|&tO25UX*vKyP1wDWa z$L+_GfmfguviVB>K1zh+-Q`689IMfLv+FIQXTT);&}1;i!w?MIN}g)$6QPPPMmr7{ zSH@HPNX&nHhkqVh7x-IJ)e^y1@5cz+oTaM*k9%{)k20A+4Y^eKJ!hc8peck!1My_E zeO63zxX-dY7c%!gqqm7)U(r6V7U-Sv3+J3mN{C!(4d5{CSn>WUMj%G6-m_X;6G zUW0s#ftAf?Cr(|+U{=l9TKe3QLN!PdDY)(jfpzO*Kij>4Jm>wL9*iafDAH-)pXkDU z+g{%!_SY9@0K0LFViP8_jB;MV^I!Iw-`ifz14TLqtYAYv>O1Y)#;sMY39{5w#p!(B z6;T-RyWXgxc#F%wr4B#FXNfYf!B%l-9n3jJC{#TXC}RU8<&G|xWia*pM&gD}7JhL8!22i&+WT7rQQ5|3zpv$fgYM`2` znCeQ>rRq}?zg|qxopBYYkwEE}#t}+w3J6ZN=F2117`?n=pcM1!B={5ba9Z|fK&LH6 zOd)8g(`j84``{*2N-pPvE&hGiqa=a*Kgw75WPL^%=FcMNUteP;Ofb{SfSG#V5Zo}A+#KXb)qzO|Z9*n17EcV!jL+wxL#&D&~bXg#u^usXwGq6Cvc>2$S~ znuAewXpmD|aYyp`hvB+&B0z{f1WYlCvF~yK`kr@EJQ;wB?4DOh0A)>`cGs4hZu^XG zeS87d5GV;6d?YQyD;M( z;bU0XL;^ql+QLT}vuas`NF5)ebs}?rIIofa!K^36-jFlQtaa@!mZwJ@%o)v$Azx?u zk`oXRbfl==C|8zz7*9*|1%a{mzBM^9v+1(++>Fl>OnL3sUW+OzYsGs}*{c#vG#b*p^}CLjvXTEm>m>yx zB@45zpSSn2PDp`-5RDuTjJBk8)%djqt7yf$mE!EIlE`lPejN?x?8-0SH}^aDq>RdW zigv)h&zz5uORn~AIT6lUFBUOV_r`d%0Yxj`v2IqZYVRv}(`88l%uR5DAaDX`4sj|WYC2wEi>aCmTiy~9`LV$MyVM?*Am+73#>VObIl5Uw zyRuc-T-*{we6i`S&`ry!y<=O*&UxKk!1d<*`NjJRi}x(5JMyYV^#l0O4e14ybbo9% zcd+`6Rr<2F-ky9PyQj5X#?>by)%rhc8FQ(bC|9!Oo_h8?b*TbLBmhkD_G^z^cD0;x z*`^w-8xs27*H*JCTLVg`4xVl5#RN8rii%|C&ok{7x0LnWN_o^#)<%ST6O|C<+)Eyh zL9t;yq!_bWtv7NnDuw6VbXhJ;^$&`OpnN#+kstR$=&{gXYH|uT!6P16Aley^l$3NT zCR2ZZqWr-^g(R<*0vT{`In z-KstFqMFMypWYC=DA3=!)yO~i*6%F$Pajw=3dcm{E0^O|#wjYEL}#a6rf#yxULH}9 zn{oVZA}#F)ReNlxwzHZn-+B<+Rv%cjN=QoXug)#6tO%9qcHrw6YN+X$23xySW&;@3d86=`zdKp8HMXHJVPj*S1f_+B#SE zVeY(>RdFr6FHcwg5HtU8#15w6WTEOlmh)EX4u@Ua&chX0TDJ4K=MNjXomnqIVCm~0 z;2y1=g+6?{FI(vt+qHZ<-thcbTDc({w?*sJGD5e5BjcKDMLBtf_!DkB{ULLOQsC_$ zTy6rg>ol=gYtXxQNu(+zCV}5=T0Px5TrBG@q3D`h$kb|UYm<$dB6|z=^4}E{8gf7H&v$jjr-YD_ zn{F-)*h6L2@j>W>mVJ+*Iv9P+CghZp%v&Re$rq3zne(b2K9FUoe>X8_pH-QUsy&@Z zmZ6X7C-CKVO*GA^qFG}2Uh66Mm1zkdw0KePV1MV-{JuUS;=9Ll@9EQ=@`94yd2Uu# zf4z=g&gYBk+OBRL_J?P#AN$|a=0`9nQ?HO|?e=~TLA-RV^_-b;rXR(v9r0zJ%_pEm zu_qomH)n>AEDsAb!hTT!HO(Ho=A4X@w)J`k-~Gu$r^8+Qp7?;E;NWc%9-BAUSy)&E z?4>w=S{zu|{>srCZt9ZCsc5tU7?lJE1&tBNq`EduaDn(nI#=i&5d?4blUZAC=EmQ4iy=LmG5|B&HLx{zFW?uD3IN-?I5UAJd#E zQ#mZG-$JK>v5KrBO(VbYkVm)TSdU|ERuiA%L1RQ1$X!I`OWM@(pG0}mG{@2Y>BfHK zY2aGnawa2?D^F<gmr_uxpS%k+6p zD1gYgG%8Iz!i7x7{TYh|ZUMcMKBku^jMBEY?_g$v4YJ|5xil^7!ME&X0v-Oc8uAZ% zTI0(eS%ap>%wTNo@`76zEzu*y-L&4_hZXBSr)Yo40six=Km?vDejT*)ZjOAtv0oSA z=7xyEzc1+v8N9S)=+$+S#f^f9s>~qb^N97kx-eyHKla_rNurT$v8<1>sZV(-WJ(f3 zZB)tLy3=Nz%mc^-()s@M;=B0s)f~MA3YkfBw(&KzKI5ObG~khcE8#vK8u|Xt!F+xP z98ZVuzkZd9N;Dal+X(Aj)X7p?5FB>LNx4>(x7O(2klqGD@G+c2&xDY#!rs13w3+Xn zrsvhRTliL3I5S2}5ms;+mw75VEp3DTiHsvCzM(AdMZ=hZ{Yp~8( z1t^ce@j*iR2_yII+q3QQl6g7^%$Th6G|#TBfY8sUQ=$t3iK{w|Y)P~sAFC-QGnm@| z(9`Mu%vV|d4iAftlafU#EHb%^UIX>lPp3_#Zh(KO77iqSc1E(!nO**rTcSiCe_+Fdh3qSHTTsXvzKg>u)3 zc0j-Vqm*PNB^6f-xXK+PrO{sQo@mS@G}%QCj`c0uO6JpBo;YV%HK%09{+t@pfp&+I zm3Zbt`J%H6Vl_RzBqnm9U|~wZokiKp^XC^X$B%Qhqcv>b+^8-InP@`Jrj8n#Bp)oA ztg5NmAvlw&+u?&?u@3eW(85#wkQ1NWYlT!*onj3!UkIoMovEE&lYqALUL7^Hcb=yx z(XcG0RcsIIsT0ym_Of*Lryyl&f0V2>_>UHVqAY*vfkoscHnt{m15r^?myRoT7f|+e zATnEOUp#g7=aBXHt=7^Lk&(qSrxggs-t$|bf2Mx<3R8=d+KN~rH%dQn)+Vb~W~!Me zkqsdtA_93cNP|w-gj=*Gr~9`#Z4S^&67dbQ zA}cE@6nO4!C zE;ihaopPgjIQYx%xbH~MlFKS-WROG`tV za_Wc*MbqMA7uH)`Bso9A-SGCvz_;ZkpsXCskIFU~m*6n(l%lw0)-1+JYY{lgZ8Ill zW0MzUHZ&e`%XH|&bN=tgG5e-MX6F5^hp+f)Z`P9OYwV5%23XIsV%d7x zr80}}##KNUU-d5fn-FOMfdR{O7qLo1ef>>`4Ku&9?3GQ~Js!h{X}b0a;m^ZI zSkLAQsxUh`0gADHu)COCL3ccWf>UNv=MhSxzj{JN=ZT-r$)w!kv!R{>LZlB{iB41> z{cr-qE;v`s4YrM<3W4HnSa7*M(&F7yQ)u9zwDPs-?Y@06#H(PJYt zDncA`s$SPpxoDO<4P%WL>p$yC8}RY*0Tn)t_AEn5@VsKqIB|FJx0gvXjFTdUscn1$ z0ydwV3~{?tr**jx*ny$`MH`DxOw$?XdxCS%8miA6Kk&pyiYh^OZfC*>iJ^V~|ie&weX^v`*6AQEkquH9R1Szb>_*@}sN zB($C1dxxm4{^by$is%e7Qs*B-HFa!+G5&tyJ~;~=INcIaVt zIMg-vUwK`&mQFh##2mV!!k|Z&P?Luzre@JgV)ad`Z+#q3^5Iw|6&cbp&>+3v*jr6;iFLQyls)REv;n zU1oj=yhvaFqWM&{;(MH$wxxsivnp zIk4ZLQ!lNaXj$%jXO1;Pt3dZdSdni%TlomS3zh`|r>IdfwS0;?+bO&|cJC3SDOB_q z*nUZa{!@)W0-=f)5)*ro@+dbkaca>!@cD^k;10|T6zAV5So1WL3}qT(;YHdnMKdon zq_7FaM)|4g9+cQ+rM%8fBkBto@qJp|Y2(;rZG0u$sHt;Ev(lR`P1~kt{J=o=(nr0i zUk)5x8o3h)Wo6~84)3ex9r#M-r&6P%1-^}rw3j;AmLBw)I{RN_WSm|tg`pcG`%pJ&E5x<|k&r>gpP=oU_L)atU(aZ+4kSA9LP->&!9 z2L?aTZ~ZG%pTSjEB>5Jjg=AuAAzj_|{uRU9w{P>keq8m=h^byWsEsI*5aGQr))amB z`JVR$?qz+EuA$Q9d(e)T87kk>Terrew{fHIX6X_=;%&+(4MXRhiIo*8sgiTYe(fQD zKuA~^S}-3WB`D|?6`J9sN}QZ(V8C3lhbdk%+GID4Q^du+ccO+4kjfp(m_Slfi0Hy0 zn3yfwUDyl|E%3Esxep15(3xRe%P)(p`bS)qNMM*65t3mt50bJ<8Y*#Nt?1w=v4EE^ zf#VUI^Q87v)X1aZ3Y1HUnm+O&GS_joVT^VQ)L@SNUG#|+hVGr z;hu7y=E05Dww0$$lqVnFUHo}(a=FOZVsv$TWT?x7`e1`8w zMnVz`r%!)Vb_5_Vy@gK_(3+=B`(FN83To@l7L~-vRNVFTE}cUj^Yz`K!?LpVRLg0v z{Gl{JFFDg&)JyF*kx<1W9LJs#qKZhOb#oW4_7MNJ_c66F7Nf4Dch4KWD%YA9f~F+^4;H%1xra5TIuTGU0@%G_!<2jhb@AARyT5S9a?AIJSl z>|jc!)g-!(1^3e@f5Nx_dYy>`DCjdLCnk!4BhYGic88CdM`#I)M$kZR@;(0x(*){6 zPmGhB_Q%2U_B=0H)ykZuBWF5A0Hp>n+7=8jE6w8 zeAkSK?DXX$9}M?GenpIkFD8*ovl!_oMw+WPM)>}So-JJ+1c66~0abkXM2bSXX9O5iu{s1Kf*CzcR9d2nTjY{TQ1 z2rlsXjB2S#@U8I)CN?%%&`V6h9B}XZ9@y%@L77wYEnDrb$y;U_t!x{=sONoQ`N|2! zg}z?>jv{(`F>s7oe-|O&_HAfuYum3bAWgkBH|p84pDwUenzp|v?R+G*c?{*rpj(Fq z(Q748SZD`W$#{7GAAzj7OH55)COdtf$RS_QX`M6G_nDX5uA3e%=^Cob=dQkC->_##f zCL)2q`3kv*?Lw;vl)7z|I0OcGZ}_)95n_O~1B;GJ;QX((1qqM!f4GTdLuoFX)d1xTDK)u`n zN}n#}WLqM_!WU|_pWz{fQYvmhg|nws++O&E-dwf(Zl;wLpRzTCA(Kh`j3`^N{~?5*f-BT4DouE*6XJeHuC(Y)bg{{N@J?ne)v7l=A@5!W^bIIT@brI!|510&WDtBJ zEZ)u$%dhnPc0)B2of|e|Qp)RG!pe2%XnS`{@8kt8F|U3e5m>Nm%|e9JwfqN}<*Ivm z8kWj;@1mR!z4$Q&j>%>uuY|2gD)Ngu0Qa?}hEH&@%P)iz&jS|vrez?%|Dk^n1mQt0IQg&A9*=z5xR}eWS4ete@@jlFduOs zSr3fbQ^FL*_8T+tBO`kI>%l5H&sr`j7x;eWemX@XX+$|S!L+k6KdZvUWSvaOfp-e| z;K4_o({)Ip7}{o4Y&T7^t(KbWsx{uf?EJre6#yWd^hK}tqC#j^5qN+^;b+#8CD#-N z)pzMQNV7}p?^W%Z=kJ%-h*iCv{UC7v{)ZS%bRCc;);BaPjiITAZ%hB|@#Dvil{4ci znjiMl1h`pPQmOp?S${*c1)_1gXN0B0ZZ3N#eoAX@$CsP@`Yx6hMkk(jlsWBguPKMS zWY;!P->6B*;ybJ)06z4)E3#p6gnU~9g#0TnfM%5Nr15qw;Wwne_lp-x>3Bhzt%TSz zc>;lfrN{FEj(WUfhy-NCm5y3JiiEug?tNkdfcSm<{gFK%gz6tjz8Y|BU@2O1Bd~6h z9$F2YPRPrjqeSVGbO%SJix7~b0denrSKgNJ2mfaOleDd(q(A;V8x61;X)+ZBUDI!| z4RuH(r;(zrtUMlN=#k{@?R_BFJ6O6qg~@O+(b#PLV)3K?Gd%f~9hBU8$#58-cUZ3G z6JKX*;+rKvsucQKGBYvl?Y-v>@D$J|#hSq-^4~}Rj^%{2pMXyO1g~9P*>0#2^}+CAb!qb z&OyhaOf4IM2H)mnH8ZnlLa&40YYSHb)fN*wyFxRW%87Ppe9gN=0ytgcPdTe%_m0E# zW1i(u8q^%7;9?(kYaV(6%vB}JJG18}kz83L9RTYlnm_nB;wbyAyJ0=)ET>8|qtr3DEFzGO0JdJs{ z;hotu#e02!R@c&h@kvWBnPG~OdNVDvQv$ATS;aQ%ILRo!Q#)S2Ee;fmZZbJeA%T&( z^EYR{F(gaY_Kn@Fm^RKKN1@60H+pr>4yI{wmu}Zk>@?^^S_gQ|0yLxmjPvz1McHk; zf)7GoOqVYU2L}f`Hv>R};(ccCB|u3am!V!8ZFcIYhzU$b)v~=C>vKH~^!#IEV-JA< zTC`Hn%;9q27&X-#D@r&t4^j*D3QWeh*hLlF`ZbBNQG7*Xt&+;)GAnaW7%O2XMC;fu zz80lw$+mb`%D=Z95ckK49SZToUr&TYQH0I?0w=W(Gk5Y=e7|Mpn)e~IjlL;JwS8n_ zU}#Qv**A@@DPPM;dx2T04*3>v zs_ z)S4Xmt^oz^dnuHx(N{UmRjyD~g%7)n#j+u%_Ohc6HOa=uvqQq!u8}&{LEY$`w>(R?Y43Nm2WRPE`*YL0-$6 zw+wW{2}LJD*Gu~n8lHyqpM!X{VpLRv*C@-OJ%TaDM&pfBov*A_bQ{e zd(f)J_qUCUOVd1sZ9@NvdT(Iy>3WBXDI|_%1?k>EW~f_+K?YOkp3KZBFhYZx95tI( ziWJpsv4(R?$1NRX@Mk)T^JR(nfN#ZbXF%^ZCro@))~JmFILN}8w!4Yly@=owSnGVu z$+=lxC>?%_k(YO%Nmj~!kvI2Yiy*llW%9CRdFs3D2Qy)&WwEJtb_aZtdVX*`^<^Sd z&LjLVAXv>-+KmUlEdW^C_vmyb<6Lf9qZ{wcUKJ4)HBFF=ld`TOM9vvCd^}NHsm#2z zJ2o0%4LHzNj@Lb$D&5)mzY@hpt)i&`+rgI7@`GGJ>-oyv2Z0s5wsa|gp)2BA(cDVI z?0EOo&EJw5?2oSB5&&#(qEE{MRdSah5VDmZq*4kBw{D3)p=dUS(yO+BBl4FH1m^mC4k(au-#wAqe3PAhc~wbSQc5f9S*HEk z+_cI~2`h5%bd7u&!o3Mj{KwEf=^NUpM%#RPW*)1Wi*#FrZ{z-d`8M>|2FMouxK^bw zFc!><@hyM4Qp?hFKY&@+yf@{Yta}FDW?Wp{y~)q6vr!d#w$~qy1J)%WvoTFqUb1V! z3#q6NF5xCl4`=_Q=MoL|Pr<&vv;0$w{%$G0xaSw%ap5Z-H>Kyo-{3!R4W4*oAu`TfodLMV8HOu0^z? zJ!0$JlR>-Q5n^RuA0Oxll2h{9D*-E-e`0=F__x~^7=|p<&23L)7|xv31%=^>_8M)+ zOqd~wKYrrWL)f3apo@tK9}B$pTicu((=YTo^jpSnpVV@FGw*qD>IUEM|4-N)Y`T*E z>(gzu3CT58Ra3cL+HKpDQR#qfC8CQYyjh5Y0|R4MYhD_!A&<2aVlkKa`}?%cE~v_g zi8af*Y}|-a*Q0lD+}|j)H}5yi3KR{oX)Tft-(hF4|2-347o@5GCazkKcFGr4E>`VF zUY&UpkqQ}=qjNDDT^~?8!4MN0J6qj7bs0ggLGwk+(0R>Z(S826B=@h^Uy($XG2S*h zGU8Z|mVUFye6@X;R_G>pMn)~@l1zbINMJl~H#YZ4lmL0b?m}@c;7t1ys1ul$XX)OG zB$^>z&cY%st!(1_xJB<6HNl!yGyiXID6t%o7b6e;%R1B5NT&4KVB4`@}H{z!IhwFd*c7M2XsHLSx zIxkH`(0TY@%g-dMLsRTzGiQKB1ThfYWbwGUe>*`iY142x8H0^TQfJDGbTIk=Vnqw| zE|ie!=%p99<&O3~%qF?QxVtg5L{o^6^E_bn5MeuL2e_fa?gpi!PhEs<|A$kQ+)zzQ zmfCM9&E7IcI5Dgd9+{Bcqa|u(xK~GW6mmxNunLhk_m)K*gPws(z_wBcSwpD9>j_r* zjs^awiBiyJzYF4f7F7y=mh$0sXTE=mb(e~ZZgpFKZAb3gZPdFh`=CywQq9Nf?_9w4L~z<~VDbJQoGdz(VaU|+d_ zyOnZXT^&?4o+nYRy`BTc1n`t-u%pXDAWid9c4$JyjH}VynpiZ| zX!_j<-Cb+CrAhunH6X}#HsAmJ^z(YxY%TxJYnz4sBtEB|hd}5JgEQt}uZqMvmpktl zKGHvD3q1oc=PzaAaY1gOr>7V6{(VY)y#&xX7>XtHT3cIzaug4w z5JLllsaMR1lt((4TdHV9`TF{`Y%p&8%1j@pIdvxM4^V3M*%yg08iWm8$ zZSg8^9(g$;+&^J^A0Ks!CO>ioy;nkk(upyUr!mbuOkO)!>cCvh5==!wk-WV+xjWWT zSt;1j-u}MbIl~GY`U2TaAxUVoMBt!xN{`CnCwnHK-#N7JUN(4)5($$`El;VKED8 z6+HR?AbmX4J=2@4^6RY)tZgr++c<0&G(rDC0c;pM3>V5`7hFDj1;}Md5`8?f*l>kI z0u0sKcd~7de2rzNQNbXvw6E$m1Mer-Wr!~q82h{Zo4`Qcx-8*vsv14?rSFrBj6k%A z?-@umFx`Q*uQz08i)Pc>fDPv8wgkhy)*xO46R|w7S$9frS`O}EZ`4R08Sez5)36y- zQ<=q&-irdq2&!tTjRAKK<8a7Jab>%BT>%4oW6nudts(|GIuSZ3Uh&m2#j5~d!*Ezk zuia0Wg(fP-1I~JzOeHZ3Ex|eXG!Qzj`}6GjjVh|Dsz;&@n3dhkfbHgA)X8wK{$JyB zM@I*QL({R<$;*G}@7K(2__|h|;`i3)L)URsOw7d|_WkLX z=gPhmsVoj+7GLW?rsF1?OOjM**-l+8_3Wn;)Jj9n`+HW}gq|YgN4}+p%?R3)_D_!v z)L7UhP!EIskTBrd3Y%2Cq?DAYP(Zmj>p)ZEW^H`B%~UfMJ2pa_rjhOs4Tr_j&9$ni z!xZWPXZU!%@!bWgTK3cNcUDuf+iS@(k%cix=K6nKKIE9?Q+{IY=uvfK< zhqW8?_8t3Xn;KRd;CkMkZ>fVJe9P*}mXQ89EPlH7j6}4!mideMBhyh=fnj{r%o$Ln z2L|;1CPF#%j+%l(47v8RyKs)7m6CPdOWy{ zh9g^xn{2Kp7LKwh;AgcrIXin{8Yf-vKn@h9Do6&YDUQ7AF%$_2e7LH;XBBx^-kO@CebTX>X#W z6r>Ios{_ThyNGhl(2OuR*&wr1R#9Q*;~OO35-FN&A;Nu%0%pOuc~1Z<5PQ=rH|;4!Y!Z_=_~GtB{W9z9+_A#`Qd@f^>%z) zg42q(XTaI-E~ieN>U`gmZQa>pv^%CeE9If_Ai}M~a?bp|C_N3)Xsc_s)?GAZdZ_l} z%t41mkk##!#vq=j7tUHvD5z}02mF?nh~b#hXV7c={BxlGynwA~1wNT*F=U-QGEUE+ zDqu9tdP2>Jk&{zJV|4{X+IZNTBbx*MDp4gSIIb-%E$h0MpPt5=hJ_5BZ4BKr9%$U( z60qqnU!Ix>x9kM-Zdj?9SKUwNYysoKa3DoemMDw%M7+4A|U!JjO5-SiV1>UjIZS<@@*VL%L1fWQba} zW{@D@-3%>Hg!sU8^(uylk=UGZ&AP6!Q#Ulxe&WTAbr8ULI8bC=rkeZl<2}H@%Q@4J zgqwziaTrv2KN;WjBE_C6n{%^4TU%?DjPSBk-EiNw3XPDI*pJLIM_l-Ow^47Bq5a3C$&?-hN zPBxz3oJpP;D(5%D#c)s3{Ed5+Scr+A?gm(>EPT|2tXu+0ySBS3(WM5|A$#uRLL23LGb;Vf}zrmh>myQGpf3hTnaC3J_M{aVgxp=gC?+ zcOAS^Brypiux^!0n71^h6jU5GX4b1imv2A>Y3?A?;9vQ2={(n?SFD9=3S`AO!{Ozd zygJdmkfeafvlytFcR^YK6It1=)P$7(^3DhVgnKolRdWRJLgNZCI)o)VzJ-5X#33^? zvv=M{IlQKdf$_F@OWG?Apd3Q@PJ|9h76t|b-kra)ahlGwCl!tOFyFKq z5e9yxA_TEkjNgzGX-cP;ZP2fD>%aEnO#@7?A(RYo7y7N@(i6B^#J*MT)Q*T0@hNiIH6% zGPre}Wmd!BBcB`7Qlj}HJx0l!tEIbmWLU)%NoL|tHO})whhRKSz#8O#U@|zV$a*o& zILdLP+{?>rccjzZ-92!CGA}?N0+*DWe72)}Uz$VI{~;jF7;d)X^30d)rcPxQozz7b zQOnZjZy`&EVrSd^`<)(kio3s@X8-vWmCgbMQ`ePIoFi|noeit_fm74M0G#!5#>Ppq z^7GRnl5DJu^4i*wkVN+OSZ#gf&v9-{{6 zVyA9ik!g<))%utQ)KReJkdT&ER#12Y8~kv)x?hk+0B26Mv1us2bD>*WQnu@sN=gx{ zQ3Pwz!xUL1KVM%(sCDiXBapugwEYv>->aiuDHc0y`2X_{KgaqZ_lkV2zxV{`zs-h91^D|PTq&yJBjUP`imSTp;pvVx&9}f<6oD&T zVgp-wB|TmfaL-Ha*A+0mf5y*u@7|>^;lK4yY5U6uf(SgerBly*xLqRj$8C}8bNyW zQHuTISauWE%Dv{JPk)(@0>EHDMM?&WY%;wtB?no_hjCWF>sRjF^CG0~#8hA{-I+iQ z<9aus+lSlkjnQb_w*ksCK2q`&)tX2b1a?dj0|i3+txG~1JjMT-8?h1nAI9E0km~<$ zA3wtgS;_YtDV-a8HR*qg&agM@}r*?W(|u{nwqg>1(r+p*^{&hP1c-}m?T zyMLcP_x=4Re?(rr&hz;g*WtKE>8VwBs zYK@?IwRS!~KMsScJ0%HF834TD*h5p7dFVRK>$0}lQ~!nTODZ*elVCn>U|>-UR41t= zwLOeBKFi}4SFc`u85vpl4)vM-uf-1?5S{=iZ}hd`Uyln=t$@Bl-t88k>4HTw17ON8 z3Up3Z6}UoMExaIKH<($7f_4LS`7wg_d8e3v2(Cq6z_1dwQnv023{&rMn>&<^$(x(- z3v|=aQaJ*k_wT<)4MZ8To;t<xY&@-EqT5=7_i*9NI7IkwsnyOCW>{YZOd!1$ds<^qzym-U0Ez%E==QHl@_#pJ zeL7l7w$Kp(2=RG70fBc{NnLOicbivzL24=%)n4M|w;JuWbhT*JK$DXx}QP_P2*du>3;1azn4hu(o^ zp9;hT9%UQ%>#Ya>_34t_PY=(5+4_#OwuuS9*+2n++JzrKW~cyH$I#bzKY@oLu%UR% z=`Uw5ws<9NXSNczAk~$9UCI$iAoxOiL6^pg8 zIwN~~`_!0rT?6FmwpFj8LNH9>uP+V_23ep@i`^v7C!4)>K$d6d3+PsQuTLuChZ_#J z9znn{{ia-GJNYl8_tUPgQ5j2VDC4=3=Wf(zGNx-J^se!sdCCP)oe?n(Sa!$d%gT}zerB3;UfHoQT z592GZE7gUU!+3hhgC^*2eWxqT@Vx`G45y?k;^yz)(hG0(nT0J^611DvzfhslCkRPw zU>+|ZBQsJu2WNwYfS0>F!j{M0+rRq$R|l};H)ImfCSAICr|GY8Xa5C+v=HjbXZ*In z;=t;#0i#~onkx>yc<$VE>chLxc$U|1-lPNIDi1(a_q_R827vSYbgI%zL^0RI-x8h! zDNw!~9lc}R2S48S=HBq8O$jVFpG1rx_Bcj z^RIjd=p{NPrX1iVATWv&_M#{hFi&@g1|QZzR??2twQE9#RjXsiYzky3>=K5w~xG8URDI#zB ztrk!A{(2Qp?*O$17*#`1N{;Vzi(S1yyY9fjoEzE@a5~NCl0Vb{9M;cQM^@a_>B^p- zRsR+q9X+^APWGxVo?zriv`&w@4c{SXprWQ zxsSjwr*waRU$5U__it1Ff9j-e1ZX9x(I*Jj?#nK~?E#9+HF5EQROR=l1&21i zzdW~K^dT@?+>#Sk@Kl>+WPIty%d#RyPfvexfDu&xnfBMx(;5c)C!JGblUFLGL~0+1 z?!WOG~E! zK5NQAC}#*1TVMc|1M;#U5HE_YUS3!;4=4s8XN8o65g;TW?UZa~|LungI+9TJ`@{uM`>>>vR;{y=w!#|Cj$Q@KS&KXVIl_Y}mza)d(Q-`~SzRBdW(y#F|H z^55Vqrw3V6jqCeWe-62H!S!jtLCP=?FpdI3D&RQdiL=jLY-P682HN%7y@hmuX%@6x zEph(Up{Hh-2f*z>%IC?};eZ3e%e;a=3wYn<@}DmK>xT?@(3i@Ze3# zfbsXx0$-|>EsDYftDqV!vtl>qJGogo;;$4%DF5xD{Tr z$p32zynYqt-MsZ2R6mWVfKycoXk`wMOu(Eod-sIfU}t^mEAWLlJi7VUr1Kx~0L&FW z_Vqs>>Wl#5Tqh8Sbb*bX=%ep+r==+<*?Ry|m{sF3zeKp`yxv;4D+^L90KT74Q>3r% zx9kkV{`IlCT}c7h`k47HGc$9C&}&Ra-zo72wC@GqiV5$AGM+X0;#O@HbDjsV-MIB{ z-rA%-P#01xWafT`uN8=Gugc76cReu)_$ zKYr|bXW;g?nhr6kK=CtG!74kOJT9)^5|q1!pfPDus|ED2C%=*wh2x!jbD~m%30fml zH~-Befm0W)3OF4zIx-Zc5z)~DryyKwB(o!s3>CPm6uLBSJolcRKWqT8^>l!CawU|p zz?6!HW_RM?UkL)IZ@=-Lb$6N~tMsEhFowuYkqfwnvp8>opZfr`3;7*Fbs9k5z9(?d z*C~hU-}Pnt*FgTCAw8rNOg)zde;3Tmn-(|#HkDR!xO)WCX<258S}4RN4y0Q;EuTIDqVde^~!k`9q31kyyY`mfSY#haV%!0M)jISs7o(#_A$ z|9rk5u%_dH%ZbwJ1|V^zW)Q%N4o4vBahQE+SZp2lsJ|5YOYd)0Nd2kHy(d890XOcD zDifcva5`CjztuGeb~FE3a{-^Hupu=SmC|1a#s6_Lr5WvXbIl$;Y!jN)q)}E?EzHRH z!kh05^nEiEL1q9qD{y;Ouj2Yv4i3cxL9qG76OvBP86uU|C;&!Nvzs~K-e}=xp322Sn`T8&_B0# zb?vq01G1*{@hg#2p>k8LH@-kYVdE(P|EFBc3JQ{MfNKEK5IaySf!hLrfUUd5fd6_@ z$5=^5O8Vp6ExW&_q4!w8l|3aN6k9b}f+b_UAe{yNE+{@?0OD*QhA7;f2kl<>U-QgA z$1l$#ge&3OT{hd~a*h!)K^3vfm%k_sQ)+@lvy$+jZvU;iC=$oJ)Ke3Qsm;b=oPT-n z(qwpzc?}-e^ttoBRFUGA*YErrJn0OVt1d7$ zlH)IG!{~sx_Ou@ib@>2r0T>&#yEw<4HiaX_hu@Oc81$6P&pCGdiFcUSWE(wdSo`tP zfZJk81=PC$Q%VEW6G!3+sILU+=_mZNr_Twg#jpEyjq%D#ckllAi;GU&lbQJM_TF4mZx2#dGy4c=1%iwciy6HCc{U zeVTd~ZIjXg_EOo=zPabK*rNiN{7V)Iu{R$rXoH1ndO#1pK7!dcl%b$Me?H5i1Thfr zSDsqjA4FW@*gE@9u>7dZefGb+0RDUQ3?YDKMN`5}U^j4g_?A`DM-VVT@sf>k7EF{e zt$Pw>lPI>Oz|6!{>z6aI znW7**+95wrMB!Nfv^oK5hbby`5fPC}AU!{wD>3kDtgB;oyw$5g{8G0~@ynU`CQw>m z1nQ*2c`ZPr(30JFx>AQf<)>28((du{?yimr$mq~BGtavOfBkCf^Uv+Ex@6tN*|?Gc zJCv=WVsc14ZY=Baa10oIM#rC@UrD>c{@K<>JXaoM7vd2?6tr0=YKl z7qy}P2n$Be2@O;~ja=-_Ie2$QQHWv&{5D-5qY4MolK6JQw~H=(Qc@=IuQs-1R{z0v zKr0TKDtiDUpA-V%B$ObVxQl$nfK>!hvuq7xb;$k+a43h@V2-=2>W2SKB#xLlR~F~@7AVocnLeJN z20e~H@p$i;v~ND@!c32m!YQ0AR6Pj`e&aFI^Pu9d0q*pQ08${(f@|(-4mFvjGGOjy>3}=98Bm*c|l z*%rgO=DfFOKe{#lt5#Sm7>+bD)|fUsAwLyI7~d>DUM*90J+x5y z|7QFU0zW`}MkdHWHLxA5H)O5{rUFlXz6ZF%;L>!Y@NO{YS!sL)K?>m?^>=Xp3>N?- zuM`D+b?IWJLOTrt`hBaG;pllz&b5H@#~nW(F>!mt$YD@3 zpX#+cERUZ~30T!B5HP>zMS=QVa;6gasGQVbiV_(GkzTE;MwVW2-YY}tfH?k9*8Z~) z5R(JCZtciy#-NGVagK0#@c z8oVk6q>1;08@Ati|u@dyH3t_bK>!};Nb?K=fPbnKMS21RdZ)~M5V~Bgiih<-<%!J5pU>$MP zqid(D{G@69XiGZakD5Z~t-ab3p|KHDkPxp^41B!s-x7IR(3znLX<(2QbTyTGbsi+q zf^2p3$|ee@I1aNnZ9+NDv#XJw!K(l5hyE$){?8wI>HsBN*4<*k?36x}Go*WD?^S7^ zduk7@Qq*9cVF?(X=Vx9<;%dL>nw<>4{0OXMi!VA?D*{dF=g>YtP_zdPV9@pRrgSMSd}O{Y;hlc2>3 z8rt=9N=*g5z&5WF@MjPsUXViJM0Z>ll}_FGwQf~r{0<2tJD@t_@b3Ov^_HgG?*7Ae zwXXH9PoB%5J9GeD(<#|e>!aJzLUKvH*$z4upI?6sZfea357GACG z2<9QLX{?{ojam8f)VV~hPrj_TDapToBe0wjADmNlC|De#u^=>FxJhm)FtF%VX^simDpAV!>IS=(Z=h7 zqr1po&cx+4MIwZFTF#TCK~hbi`#IfL{|P`0Ol3rls-{aTO^ZnR_PMv4o0xsZOV4Zi z15N89)A3Tf0o^AussCoKdU{1HfYXF&!bh(%K^YV44tX;jofH8kN{=eQLqF>IJ!V1w zCfm|@$^neQ6+V>xWIXrS2VcN0R19kI`yUr6^9eOyt_ZMwZgY}}EAd@GtN$oVRku)d zs!;Ec1Z8bSC*x(L_gysRY!YKTjv@k=ks-}OnRr@c!fs>b^_q;Y*sElEr=rMA{R^_G zOr~ZJOUf#0YjM25*`i95vz{0-*OgkjT-r3w8+G#Y>RX&GKGCHyU)$()%`oatsjEsB z=F!|($wEbLT{rfvUaCh#A)JgR*24F7Y*G=J37QAHM&x@phoHU@w{sPCCCD;M_eySBo7-gMv zF#``-V|uIbYP~6L7yRoh?=10`N$b$fJqF}JsL1G?xGVEj*AlN>8C4Y~P*&+C=xsk9 zW)b4hC@?Aq1nPajvzRFJ-7+yHMM%K4Qr|@2Pvu7PJf#IbNIjs^#^7QmW1Xqh%9Sd{ zVN+<~7_oIPeACDt^#DN7r zc<-ON16{ihVumqDD-0fY(zpAyanQMLw-GnuJr#P@VPv`3cLIZ?k&+^&Hq@a<3ceGG z3XbF$$5NZH9UuCHjYR>Eoe=iIjL@j?(3d4O-a*9F`F**=hTxk1Rw8YTR_yz z_j9OhU*+e1$dP4r_Orh9jt=7s*Am3+PxpUd{7xc%YXc%aowETLRRaODPp4fCFWr*L zM_gOaq=ZDUBEJ6-;QQftiWo<^A+BrorTysDlquG@aI@=ak#T@Y3`f7>cFFtqNOmmn zE3`1M!fdYmtH&JCneTtM`_Txo)89Y1w9+<(f$t`g{pC)$d=nx{!}n1P_+< z<2^%2nfL&B;p8Wq)^*8kq7-I*u6)qkv6#~HWt9=xI>8Q-g%w=~6!XJ`4_|9M@nC_w zO=vLb`yF$%PNLK2yNf_%?-ghvAWy5yn5kHxE>x+Hha;*86eWc=1jYm_%ahM11V&BL z06`A7)Qfvt(5!KfwFc5F0!@X*7*oINJ$y(4iC<6Zf&|tMD2uMw%N_?b%_HHe&|qxwnOCcWSS8$C|kJp3KnDWU35%4)ox z`$*r6lXdi{u`Az}27jl)+pcXXYiRwaNLTD#o|J0oOJPOL7lPo7i5SU$>ak z0^{wpCR-zg8>=QP>7AE295 z-*y|>GF!ugpiLg$s~4Pqx-=bo*NF5i%a^J+1>V3OsUi-mMs_&qrH`$DkrLfCVIJ%8GpF?z0h~h$&TXXo|I5u&-C8eH?{`>5=>;T=>4l-1nxuy z)N^R(d3N4xW1Ag96IzqaoNH=cF&xxxmB1w5YjXdlRc z&ju`9dJ${HeTSbx!A1_nZZk_UCDhUhlEJ_;`*c}`YLiXF1OJ?jwKbei! z-PMzOkQe;1t032UHGVI)WUjU+D|n-7Tg~cSa6;B`ckNlPLV~SFO1;Ey6@dq>VpilbeefT1*-nDvq{YJANMyepWZbq0WPwDUFKZ; zLbqCoIEv7D_-Z$e|%u1a)2l%enlv%L<@e8)hkSnDBLGglceM*G&yHOrm zRtdg$g)|IgJdf^kRlTGjW7rs<37^_&hMKxP^S^}Pg*bMhVOSFNr&JSRw6fYX3M*x| zMx4qGzNcAe3<+~izP&p}F=P5LO3b?<V4JOkO%#5SI3W~#Xl5d0-OFfX{^^Jx z(|iQzk^*+0W|_?NS*RY7t{=#*9+Xyd=H;Q16z)SF9^&gY^`Nm@|xuss8DBRM9xU zTfLgLppFCHTZdG~XK%QKQH$p>j6jOPec?&#J7_P4HiqHb=lMPS`fp%kY_Pwh1TMnOGj7(lj|$bzghm!r%`nRypX}X2J3h zu-gR7<8`hqf2Ch<4c;T$0TDIhNO{AmMop64>3GqHTzko75N;tpGVFe50MlpNr9S;) z_e=ATNdI-67{#o#t_b*TQfKoEbTe7>dVx6x)y(iFmowO{5Z{!ZoRJD7!~8GvDXkqA zI>I9aCr;q|@A;5)oV+hECruDGe_aVjWbOXyH<5X3h1AseJ&u^bsvW!*dOe$;o1_c% z@gsk-T17nBNlBThNG;`_DCw1k{FZ@L2aDr+e?i{@srF(}Cv>J($l5d6Yfx~H#5}*) zx%&5=O2JZ2Y~9e0=7TAS$!v`eI(JQ3#!A>`C?itPP*Fn~)~&dQHMZCH=4A^Gga)0U zV&vMXpgWPd(||u>WszJ2rtQYgk&;SEt_{_rGd=18-6z;ET9Ujb`)Bi30Xvm8I_T=f zz}2ozei!r7G2rLW$eS%%9B~wXlUy@DbP*S7C_POKL7-QdWi@6C^8I5_%mPW)x@yo|c<^BanF7+GV zC|Q1#?)7=>#E+L0I`zqw{zjY~=!~r)Hf{H)i%sCr{@1!_){6;3a<(aMckpW|QH?#e z=pH7qv#;dCWUAz6wv9V}z!E(t*o5l+pkFq*K&oAzM4EpKSFB3i8$i3*pj$3^J#Y7)BJ=V553JGRK434Bw zkLsmVhLP#<)HcGvywE#YvWiq}s4&Fl zg`(l+xqpK0SrJlJwSLlOEt{l$@)IZ;DhO4w;lkp3(c(F07sw_bW-!*1UV(Rcz7kw% zmH}9yd-eTP25Vy?;64^e^yAEFvcI|a*C=}gYH>J_AkP#Vo z_p-PT*jL5|tR}tQ4qgsDgc+W5B&YTlge1)uI!-ZY$yyFjBhFrj--Gdnpd=ZDdK*#C zZiiIqk;b;>$0_ljnf-w-!e+BkE2cjri~X9;82AY07wQ}Hl}jyGE0uT2Hj5oXe*1!g zD6G*PN}})ffV9HhjPwWkX_8~2<3~vI0_D0rR;*+ctt(X4t096sxICE@1Czb^VGN)3 z?xp&3o)VI$N` zh59@b)ywp|Zf=kN3=ErFBN^~rO!YIWwRSlc)y!!<6IcuUS{8%W_1g#k22%bhYt#o50-GUt^hi)_{X(dU?fo0+LI z@l~Ke(+@c8Pg<=SHm}DsD2vmYsy#_;b26xBEVC_pwjXig1R9tOt z_DPNpn3;{;*ou4+=vZ9j!zv4(VmIw$sD(T|qR`?j1}tj)+;dN$-M0jg`LZ|3;8g z84KWRzcbQr8PeM57hU`}hM+r8mbEj)5eV04ho*Ytu+8fRd+}e>~WU=JI)dch- z3o}!ez6RQE2J9KX&L~+@n2!n4H-|R5^DFG9g*kAv#)1$mHa#H9Xp?=6RU?Od9Ec&& zACX>qy6dL9?LsI3g)ujwywuSYv5b={GfJ8=En4k90J!H%?_tb03FO<3GR#$Bo6>zH z2D)PTF58`m6unWa`Z!ypXBkyq|b?jCiE2dCZpoUbtWnHEYfYSfOOvdpE2w zv%bRRCQb~y-(&6ei`?z_=4}Q0-}C-7u2z~AOmC~>clX?}Thn+0s6-Rf1UIzBCe__2 zxCObPBWuL7NoAQ6;VEVGA%KIf^p7g>@-8t~iMY0IHrmb&TGHpqu;~}`SGu@t6ns3o zo)9)KaFdw^&IiOA|I_sTF9j;%+KnPcHESmpy{qv$;)gUab8%ex z)Z}5YQw2Bf*7)Q0bA3i62*PO|1+npF`D&mm`E`v8Dh~67DH~CxRd^xJ zrzOdqob2`RV>|RT>=nN-?2vI@s&1i&^%H#lC#sVs+F@y`6wshN$3YV%xRZzn2bfspfB7U zs}w#%M++>YSj$Ljq4z@c{!C#Y&qpW3u&#P91_&%%mUU>#^ zHAK=g_$$)i?pm?5n&lO+Rl%A*T}D_e^Nm;Tq$W_4h4ny55+T+!=E=z2c2m}Em-bH~ zdx4r#YH-N6Wy_1hv(p}@g+M@({mqznTDE>K5D$+?=FV{{I}|^_FCfmc6gJ{n-JT6>79D%2liBwkyhbal zM*7>01ayy4OPF)I4ka5<;fsLG2kN&&v+ue{8Sa;2<`-wsu5g{q8i<@!PF4oExEF+B-ULOEHOj*n%T}H*3tc~yW4S5D2-aw>R`vp`q zh6P4H3u4^SE8asvFDTb{R#84utJO1(a-`>A&XCM@I7|MjZ~RW+GCeT1a=s3Sy^W{! zT0Z6@w?5*ZGN$TePz|Ih<8?u3THn0k(xnD>9k_fZtz_BsN?F%**S>d5X(QnlZe^!6g9_=qTm8cQH@Uf6>nt>I!dUEl#~3YF!BH1w z)w0-tapsqMHp1k3h{83>rF#D&P8h<`W$F0&MWpdajQrYn?&v(P=R$aH!=JJqk_@U% zHTKni3K9v%xG>9*F*7oaI@|50&f!}XiE_9+>D;D1i3o)r0=|l<$L=dA``gFf2%-~t zI|<%BYW+r{v-1gfK!B8xO602%=BT6@0f39|gbD5Lu=(S#IY-cpSY-(CVT^&0H84NoD_F0JbaMWRt<%`OvRSYiP+#nrh2LX z1Uuk+jSQ}b;I;0_J(Rb={T$Evg6<*zNn*c0I%pNlxUnabpwd0$gH>zTCa$IOlvD+N zMFrC2E#PS8BW5?xLf&xNyQdt&?pU5-q3!-^V*iDLmk&%r9KOSB}zZ|*B7de7|ElEqV@bLw^zg>d@U)K&q z5X;|f0US03l*y-i6l!vh)D*%a>Sp?GexP}Evqn>d>-V}ZUs#SgL|W95VDi{#i*Xhj zWJp9rbMf5ZMN?SY2DsIR)*R(r%4;J+H6hw&VQ?}Ax&vOh1ZzY}ak`bYgVbM-lO)pA5}~9 zCzdGIsYi?C!;+u8lHG}3E@9Z&!3Q_8d&%Im|0sThmW#r&i0yeZcDG)reinswd|hrpkFJGw zFciafQ?a=ORyNmO z+@HM0N6f6|<<(oS6O||_FDa#o02>5y?!l84y_qDSYEpNCw|-T5(W3+I$qebUJ8%uz zrUqa_I;u5AutR4m=5=ZbT;47e zt-eE3=F{><)v)`p4`Nqy;7&$P?YLFnEuV`SYpy!p!uWJ{ZCQ*Gq9$Uw)94}_a&bE!Rcv} z4L>*9v;$zNs$VuX{mLiPN{6#gWWp+Tk<85nxfsf~R>b85l$$eEbT9WCovYvWNbaGIkk>~{$`@pGZ z^BoktDf;Z{t$fE!yjB}}GLWDM!O_Pdc_*c*_;ZjQ3OD@2uQ&JBjYl)aOE2J!%ou$7 zBH^@>X-OBXub&&kr^9=9HSC^U-+3A= ze1}bRp)&8Qo?&s!%fs+xg7a}qE$_Ir7-8#`&vm0x|#Vun5F$Yh!`e*rhTdKS%I+E5d2dV_& zr5;yEl%(O*E)E4NSagTvd74CN6Ydk(KB$qmZHIhHj z=gye&66pS-NZfKlKq~oxpVd!foKZ5H+X@=(#L^!lHYn!F58M*}^_st>Y zmhf$g1!lTELp#V2{19!37KbpE#HSg|{-UNqtZ*Rix-waWgmP6XJc~zMIo2T^g6%>l z-1J99A&(FO-D`yly|K`03O0)R@O9CKNl~@(Abk+726|8C{Xa6G;Jg8ma87mH%oGz2qrdE&p%?!Sh+}m z6p@|vtqINW?33@4n2hlz6(ZBoq?;6CIhRJVPev6Mi4J0WRx?*aThvYw!KKSo_RX=sK7UxjrK`gC#=?mv|(NE5lTlY6_oP^v-k7BjL=oGcRxNR+ z7y7+#ZdS2@d<0r;H&c1hrT)_BYQpu0ZBkfugq$7II$3vS6#;7KMYC|9qvmJ9jAyKi zeLCk0(^_1-MS!QBz;vc}_SixF{&FquutRt+MzUV5f4jYVEMW8QU@{D=N0j<}&&VS@ zCTjUoamCf0X2%|G!II*Vh_4S-K0bL#kh)Tl@MP!qQUCMUCSU&29nD=MQ7!hOQdsdGz>LUw;I- zPdMvZ?*(bISpsmsk@wJpHr6$9T4swqdd};7%S=1>Pg)*zi+z97xs-Lt#&M(4J3Fw_ z){V{l?5#m2@;k{%Jc#~{%uX4ri|1ZsGxq@(xa|UBNuiLGR>Ry;ok><(!(xU@c0g}Q zO@zlNNv3ox?_`pY{MSmRtUOJazaSYsuagMv?x^(WFU3#o;T}b`x%E)pF6G12$MGhP zX4&Mtj|WEtI`g zTYuRv6&u~ina{8^qNB=g@GYEhWGq<_nJ+pmy|7b!`S@g&_2ya%puKj(U&EMP^1AT*K~{N2$ldpBvv!Zw`=sXH zmj|-H3ub=GO`ppb{qS9jGU;U7qw83h>pKv0ZT(K(>W9#491)6NvGWWyh>M~h!*C=w zvDkpl4sOQ%d`h$uTE$w*`V9fzxyYVI?j!a3+XT$%rXnR@jVy+nL)6Z7Y?Gq`)6*{S zOvWLBG6%_!rkdb-h2d)o%?S8XMfR z2tULG9a&ruqJ!qubem**S2vv> zP(^Yj%^+j4$^{K-uCQjn((XY6bO)C`J*IP!EM_v!=Ds^jG6LJO-u z*UaHD9Kc$jdKbI2v~PzsO%jbO9eSK$(V)9`gxa5a(J$IY#)ZFIlB=$lw&F_CFb5c`rrk-1B#rEUtK7c9lr0>b5|8lmX+U> zHvBN=m>b&?1HZ@0LJY1CWF^>(5I9hDh`a2Q`t79WuH@jWPwKZijXEYOV`U%=j|wc- z=vG@-9Y@?Ai#_bSx?0kMQ17}mqr!poqoVUl{c%}tsiL;+*_*Iy*qDy2F0~lxxsyHe zB=TtZs{gO}A%dFQQyKm$g98Y2m|-PFYA!F!z)tmzp7)kLOR|q?hTLf%FM2SOTC2mg zzuRp{p^Iwygdx6k)fm#-eVD9#H^)FB>}@|CX8Ujb^gpTI*A=P8n7-(TLJBI>LHJM|Q)m#5FE8fKSZ%U?)%^rs z13QU z-(O42G_2tyCcT&PVsMH6j~{&h_2$mtB-X;>-HcaBkxdkVCuboMz2;a_`DFBA1J0<> zWtlAR8nL23rL|xZ)fLv{}9W1;13;yhK1zso2ex&!_qX)hG~3!r+=5 zEciaJ#1mqTZEB&HUMl4+OPQYB=$9iY#n-)Esl5z{xp)DY$IZzWwSQEau3*9~Y|{7d zxqRwelLe*lWP(7Nm1{UX!Mv+QV$Aa)GC{btJkGdKZi#p6ej{9-D#DptTmAGN&Wh|CXdwE?ZhF%rQu=(qekTDtEHtJn1PY4t` zDO1*ug{Wdhc*2g~dpfs|d!e7C(GPA_rGjVU)WeeSS<{^TcFFPE1=|7|)KY>me0_4# zd+vg5-^5z$BR)jYd~sFWBK!!dzQQi#0Aw)Eq-stmntSkT5M3+{gvHEY^*kcq(d{k6 zAVi-NwOtBn`BuCdK03uZZ_qu&nJLsnH*!|^Q_EXMG~71iYegg&jq)QJ-M+-(cb3Na z@4&CreGV@f4r3` zB2mBOeF4Fu7GKBt3+j}{!^PuEdY$a4JNu0>Y)I+(*RSvxDROro5`U=Gb^zKqt&e;y zSo=`Hp7e=<#9$E0(E=6_@drdNtemIhZr&G5c#edNY1aO;Cp7DLa4_ui{VuTAUgF2 zO+~vp=29~cNWl>Am|fG|KQUtJW5jWsOB1W`JGm5-(E786aQbTj_GF80?pf)zcM`U z1j{0t*!eaXM`sRJQZpNU!Oq<}z4@I3Gz!Tgdfca{#S|T_r$IlDHp@ux+`r%&fK#{DxuU?7XwGIKwx$X0rC&Oo(ikF)b_yUa2) zk$Q>>&MAlh>py*Z_bo~&v1JB@8y)XZDMdTRugEtXl(whdcSPydDM*isRjPmVWqRx5 zH%&6e%XNR}XjhW9j6y!;(c6gS%b$Q3RnzV>T>I-wE^%N~o?a0nzcTLn)-brwY7eq^ z?JE%ZT|pdKR+^6oZbg}gu?36G?ZW06 zEnQ7p2TPO%TvRk*^zM8Hxl&I|TbfbjCb3+Wqpn}0Do?^En2^=NZF3lUfxzHN!_H=7 z*~L-6WK$xdj$q=7T+YkHcpBv*2A0bFGsZ0f#wxv_p@&fAi{UyS;L?>BoX4<}7rEJ^ zA19cJZ+}SpMvjVhj3i<$QkR*rx6rX7#q%_*CWsBo?M0V6DRKhcnA!BRH4)=X(lB4e z4@~FnxS7h%a>(+vFO1iwsT2(ww!UPZmQo%ew-BQ9>uow4&ACVF*>lk|aEg?;n_}PgopWiN&ad{`RPUEBJJk3XmWmG@jhSk>QIN~!TtAJS1$ZeB*V#Ge?9w~S&s~F`z%ydyQyRhq>rnHG* z0@*H8UBB@0=Vx?1L>s$&T1cCt(X`3d=#V)qoPf7uFlyv{~I^%ls

o%Dq6-SVrZO_tX4H$u)PmC3E&oAPXVL-pv+mrq{arn6dO#(q7LUIUyk(18!}cR+nhJUMsQ8OPCFb zk7$I2Iu+L0RHwPwkvO}pZC>p2G?d&5;ksW0TGdjI^CUN+HQ1+<6lgN+Oj;Pt%UV+h z6n-?{;~7=I#fGLo@}Z0*gmPzMf|_I=XVR9x-a+#zEV_bJ;lm1303z)E1(+pP*%B`H zQfc~Qm%r>(5g7tDCe=rOqa*)QgNWpvW8DF4mpm%v4A&FaD4o%aPO8Zdi7A5bn?C?D ze9(RPi#oxFj<$#>!KtQ2rDPuL5$%`$EmQ!x5Upwqys_`cc|g z>1UDDYb2d8ljBZCfiq3a+=w?HXHXY^eUqUEwi@T^HfE1 zn$PLn>A9?Mf5aWt1xcBYr50@74GLrK=Vonhx<&R1I?uLwkK3zzez7C20y!e(aB=#r z1~V5YDmU^O*=E3EcEW%y^$5x%gHdlxZ!AGLErUQ)GLy%rwM3Jq7YMNr6ON;P-z$>8 ztKh$|uK@{bukz}9fDcgXLt&G{L^5w}$tr7gRd3QHZAl>gRoP*L0|h&+#=tubaAHmB z?h?*itZD7_fM3Q*2nuCs7Bn|(3-bY%&#F)i``VeGBLqHNdo z{~3l5q#H>^0Vzd5IusQPknRwqYv_gnL{L)cM(G-Q7<#Ay>F!2Ex*2-D5AWVK3_Z8>$Igj2aT6OI(Y0Q7_=WY#$+^QF!;@XY&Dwqc~$tYlRp--=n zOw3W=B?shcUW-KC>gmQ)n;bCPbU^c;iTGqZXXzR{U7G8w+tmB6c7&gBe{0CiO*T>p zQiG$yBYW$Jnk|3JIy1xFmbvYZo)H|64fSNja{){c!|XPdZ`Jqw@}R#d@22A6%F_FI z=(F+T6_UH~RPG%&_A#eI8hcM%YC`V|^R_oz2c>dk#dbfY(kerq?|aD3gj(l0#l(td z)q@7t>%{rU;PaLJz{OD}jz6q({^PSNJbX}x;WbaLg<@~ogBbhskmpk@yK3prSdaG0 zIwVD$3+!=MJWDGLocvFfl?ohF7s6CBizK=`3dEYqkBW!r+A%K0{8^#yGS|W zW4#{=Aw0$(#YMe6W+ByPq5OXG3_4T(;Ig@4WI4=SnzxMS`=+p-&_GX4Pui zN-6BC|L}fZQ!?inb?Lz~VEBkhE)yq|p^5SxhZBr6zPOT(M2v_&4s|=TEqg1GA=RnZ zlXZYx4rjdV_pS=Jik#V6QK;e0#5YD{JZ0D@wD^^%B#~2bFd|Y?lg^s-`})*ueF5G= zv@B6bNSe=(&vzq3FkU%^yz3iU=Sq79HU|>_*QUpHcUjE|wn zi-O?k06M&OCu8UdpIUSS2NL`SmDnh7yVnv94p$&gM!7+u70)*o#tAwQeG(d_{kQ_9 z@4vm`%#ZFeZ+~3N(df^UG8X|XX6<97t_)^f!5_t>u@fJ7)#ji^aOw4Zy^9LZ3tV7;Q6IeNtk&~ln79dHB1vi|d71_dH zd67mh759fkl9D?GCe5*i^Npj9=IJsJh3WX3Hq(R+M8$=HqKEz zkWq=`v>?9d$fwalt*OiKV}UnKS2~Q?h8I5oU4T;OLi$N>0L*jfC+g~EIaEG9b zYFdEG^}Wfnvs(`plSXUeTt=*04{kT`9mo_7P3cviN)^E+Bn`~}NRnP+{9YdntOiPh z*GO%ZbuaJuLN>rDAlGz?)r;PHDRQ}@8GYjTmOOiYp%F0DdJRJO@O!Ff1XgsL(1Lor zjlMq!*okt*Gp+e#CASpk6+snMxZFx6UBsU|C6K4~7DN*e+7#Xo`O3Tm^PRlSjB;Fs z{cg9+DA6M1U!C()?0_zOOU6QGJq9<36oQ#6xd=yB)^y&7adwu&nk-N&y|QL zeKOmEXdTri5cpQRH#@=I!2vEIu`|={8JEZNO$b|^5GnY^>65o$U7X4IP{|D$NvxIp z8O*xHC*FkD?LE20ILIuL5azxZvPXNrvs$#aU)oDP#V{M4^`_OswW9ZNp+l}euRST9 z_6n(*CLHA=1Ier>mHvZ*iqB@@l*Q|hv2S}Q_^>$6;&-l|Y-$sLtQ;a&eSPB3?vbSV zA5ZvTYLW7D{o)%%I`$*%0-HOi5f}_JYv1H}b-GHY>+Li@$~vgVt0__v)=r<&Gb(px z3#baS-B3koNBzK7*)2ga)R*cr(VI-8bOQ97U5jaH>j9ohUgA!2v>grGqWdB2+zEZX z?$KP5CUd4Wiy;4!+kK-ra7R0eGdpt!@t;);oCL zrtP_2(Vq94aMO4HU;*4s6I#C6bOHAW`oD~{79_4$pxUhhK08H45?YhK){6q&<_KxN z%W?Oul?3OLw#7O}p=~>kc%-24w74OYu08~!qcFgYpiFI297wjo5#q95V2c-{`ZKc% zA_gKq$^qlW$B~c3B+`pG^pSM`sdhvg_z@6%3+IR} z-)gdWf#@uR1AzoGw;y^|1Gt@a6)AJtdJtEF$Hm4q+LD7IspDecGzL<0!;giG8LdYP z#4zc1j26bv0{U)+%OB0lat)AcK8b4Js|JfNeH|a6GA;7`;+4S#iauMg2Zckj3hZ#c zqIBW;(&A*G?lsc4c%>IF{OJ4w!))GMs$Y=U;i_)%G%F14ztUsX`aPOR zjN*)cd71AF{R1J*A4hyb-1yLJ!E=f8JKsTQsSNUPL4Jl-^U0j-Jv*0~GH{ZS)@AiZ zpugxFoPaE{huchjsaI*@Mr^0}E|WT5Mu$hRbTfx9UQ@4ARnzc@4qYs~&ivM5Suj5m zT}M!sXGBq=xpLzKk6|diNL7|z)|;^SJ|?*idtqN$_0X~7KS@GP15kg^0IG)V#wi8o z9}W^g#*&$Y!#CZ5S(z0~KOVjy_E9`|D|)ygv$7M1p*8U#7`XD=w2)q|&a|BF-RL#f z-&sYhag3evCRBY^?iJR(vh(m0I6QBx>+Fw|A|p;U6HvX?cCVjVzlCp1_!eybpfhN% zhaK*?p)aFn+}y_5aX_}ZbhI>iE5?5Cqjame|4&)1evZ1GGWp*4N01c$rj~v1)&ng% zI_MX_;~Mifg?qZOfuzz%w5>pmZgupJc?-=&-_TxADXlth)#1>}h^k`#9yP3hsqKS= z1<3Bm%^H2@6F$DwR^>1^Ze)IL5~>io++YF{YJg+yXm) zC#@r?yoQtZ&B;|p$$mrIsWat#HdRrveO964eyUvK;rBECqwvh?oga;bo#}_#T#I@x zFIi_VgpP_$^*gb-fC@-SQ&wW+vDC8XF+#MZqG(lh>o7yhyOYA>lSMS!nHdFIsYxy^ z@&8g!T_Axz*cDQmeYTF{j!wteHx6(OnuLDWF%`6;_`!M$pNV1Zk#vB0=ZD%yf;G4^ zk7_==8JWbf@f675GNK`n(p80&y#3|)q`W;B$Pg5)Am4RZ^is!kcOKACKT;-E1I8wd z##CsIDTO=9SxX;Rq?z*HYB^~->QfydG<$z8$8|*{VC`ikT&$NsTS()4Crw-%0t?U+ zCYN7d1yJJqVyGW_G(7zQX$ zp7W}Zf%9k1kc|%YP9ZLAbh4o*?OP=d#>)srC2#jfz>O?f5TkLTaLV5PF6 z+rqC#OxOw$oIcxN)aVP*e2oOQv(3R571`%*yHQShhSJQ=I0!4Jlmn0kqRcMkkEp37 z4~$P|=+C&gPK)K$1BG5|zMYMuO+nvcmClVEAP7p;GCphio?9;EO;~FZ?M+0U%rnud zyVE)frDGd0_4u96saR^NBdU~_x@eVo5}g)g@4SM{kMup8Y$fNHp_Moav;C(EMRr5F zN@0GY&Y*-K{{7e~WhWnTyQMUNQf# zf_|CELRF~)BNbZQ_Gqiyy3z3S{c8o>>GCgdj(v@(i=k~=uHQw$soh^2XaDQs8*sM_ z1G?g)Tx;Q>6v7wDf(T1V2}A^LHB@`$k-4q{`I0gCeiCu-tLFKpP6d!eOc0?_aB+An z9XZj5p61VjU$)-*d-pBp;i7T&{p;VVIY}-xViaW!n09TjHG^oz__@U|xMvWRMC38n z7pw?2F;BG}OJHIxX$fEx(EZ}rh5JG5t@9-R=-4<1N&za2q8m`I)m79OCtHzejm23H zbyShr4&^fjd#ipFjPry78nF?+$|v+Qt;n>gN8fk~9DjFqdh7vHdTw32Ds{1?-B#;O zQDLTf{*A%RmYy!`;fdGR=XCcu)1bz)q;&6c6@4#$c9gAbD$*FM`}zALT&iO+DsTAI zHv~j?VxVMRm|3?je*zY2-DnvKqa#Tg`mdipss|UYA12?+@z?f$y#9dvlkO@mSOfCD z?MIrF{pazf@Y>1`sPW-(dORW(drcd%B^^VsPkS0WZ5;CXi&ucqu*SO2Gpb74Rvbd!3fX^p)hCw)|Y zJ+Qg_%;u8zdeew5Wxb9I3a^RqRZRa&a!%}pSJ_?HvNwnE+!{14h{RE=HY)V-X5FBe zU(xAUdOBeBf7~DX@7+nLZ-WR@uF}7UwEJh_}9+ z;;byHF}2=Ln}Zl<;W03@J6+j0HB#e;A>8r1aOlo)WpBilHyqpnqXOP_+z_>@h0Zxc zj|6{8+GX9mTW4vLOq7PB3NDl_^&oB{f)U{3{&KUI9gqNY4Se1BVS=9tdGSCj&I3=X zuEH4{j8~g3i*3l^wd;R?wQOzA*}1|C)61rq=0N;-%iLu6TLx1qYney~Vq?qXjl;mYf!CJ0G%@A@ydZ_kHd9(1RKX$N43qm*ubq?XTI&}$ z&{~p|SibnmAKw))Zp)ecmS|myb<(EEyqFl%PW?r_CAFOc!6(jhVR0w=0Zs$(Ylues z!H%#!h7w2~XOhJd(Q?QzX3j~;MTJIW6&OS4*z+oFzy00~%ipm&;|u-GLBw`6 zszv@tU-ALz7VWfmpG%T2farbQFH5*GZ~SpJ{NnW3JATT(j1FcEvhEER znR!>$cO1oG$!e;Wr6n`SUvgmj;C-XZIZ30GayQa zH#vVi1}li|0E%)lE|>e~UK;XGbj=_-%t|sxYC*5XNO34r`_;)mw3Ce1uxaqurH*Uo ziZg-nYd{8WTUFV*m~CMaCcGyhtiC7j@en9DVD-Wyu~}+@SBf$KJ>*X&!`G^ND;q+R zXXVw8ne(a^XOzCBs~cFkf8s-JLAc{j7=v8~)Av)uW&wzd))?Szvfkqb@I*9nJHREx zd8L+szrzM%wTliqUO2wBlIYtXa}VcJ@^bS&3UOw*trS*w7kza3G+gchtABKu#&6 z?r$cb-%W3KyJ+VrVd<3`%|ZSDT7ejiyfZq4EYk~@C)EhO>+zu?Ce&y+PO@JA_0jfI z2dS+2EQqcy)mbHxSMPDkGH0ZrA-I&=A&>xjaNEvnVW9F60wy9_LsJoXp)CW;^9hD!0%^hlKKD*PtTxlw)VD5YhQTa zT+swZM=b~a!EcPx%b)2nUevngDvmm|UmB3cH*2YA_F4$I4I@4}RP77^AhPUHGm4ZE7tILG%k9*r$uc;Z~J z7pwc~SvT_*cC^h>t9pbnGp1jls=Yr8l}jS748$}HnT>6ngpSB8rbHV(Slg!dEogDw z6|kc3k&43Oi*f4~rwrKYSO+J?Zp`}6Q>A~T4G+I@ffV;I@=GetTRxU0{3K1mhqrg@+)6CwTy?L(66US6Cb20bmEn4d|EO;<0ij ze)uN7I0Lw1LhXGxIr5r5Z}c!k8(elvVdhkU_J?lG23(^1@+(4Pxw@b)@Fs7mECW+S zGGY|JC%{O-h?mALb(w=n>aEpXt%WzyPrxg}&{>wc9Rq)L{yGGgpPooYdt*bT1;oiOZ+Ghy^woIR7^LN^g6Pb85^=+$&lBP6LsqVjgH|b3QPvj{E zHj3k=wHJrMixxF4L_BJss+zHlKmtwBX?%`Cqn_Lx_d7Z(0w@fzWKN+$g$1A3TR zBwohi-FX{3*3xir(oX~}FAvY$UmN%?CkFI;UKbMT#OCLu6j;fKuD29d&uTC`H2;vB zyQT6w#iS3Yd0uOn#T$59iY;}rzX3RWg*-dY!HE&9@F?IWajD_ZOAy-$nD+0K*hUUF zRSOf`L1Jtje2yIFVDABI<<{C+9$Ejw!fP?a-+Y5UvEqd>)0>wvqGSNuahPg@+1sUP zt-IFasqsq^P0Rw6qD;PBw(g3bgN9rQtPamwEVXcTh2k51$@Far2%9$>D(fA z1q*}EY4t0g`U3zmbx{Lf9p-mQgaI73t^3u^0j4`d7#dRe0YR2%M~c%}ee$mO`DVoi zVsGDh3g8U@mq6_dt6~8U!H08TK0Qtt7Abwj#lb&UG~ENqSqUTW;}7o@HFi zBwYOc7^=SY5gGe>l?4{KE#k#mDd=np_?!y2$nA2R#dl_$c%mAA<|J!WkHF8}ij7L0 zMtXgH&f}t&1&x;1GB-$h&j-1wu2VXkPku5b?9{BL zJ=(CT_~f*{zVbDg6|RVytxMPYzLv9HSjbl`!>a7k=lnP6)5AwRMqi6|J}R||4oHHt zeVLb^Hzt#@2<7oV^JaH_k?0Ypy^d*d)?!YyZYlkly!S$)0+gDYVEmwm@CDSgIJtHQq)YL8!k2#C3a`A?q#iRa(*^w0&~?_f`WEAiYU;b4tn+cW zpMq4+|K#!ibXI5KU{i4#tEc@8Po-QyT*1TLVpl;zZLA& zBL(c?hnoDbkG6z{V;ms9hYXN@4#5{@TDz+;j+uD2OnhLeXtBey`vfBD=_|&MuonmM z*VOe&%i$bJR?;MnU_h&vzwa2+Zd1{(@#N`rj?{38p|KZQeLWXnH7U3wAlK% z=yI6qb{%GJ-%7NFpSkoPSb#zRgH?p40xw@-U7T|4DeD;HTWumWN}?(hx1c13op!+N z&C`939f2H7gL$gbR<+i7vS{-Z)AZLxYJ)ia{rvJ5sQ$UAzv8Woocdu~G?ak(Yh)a0 z!&S+JKZ?Uibk)kgz^pbg4KaoU#|T}RYHrSQedy=-P*=t0K^mTg1>sk z@kmEx-dT0h?tH88V2dN!MkVdWA9V&PY78h3GWh^VA^$=HG_krb_&Y8Ua>k5m=oUkt zOU%%tXo!ttbhY$yq0Ix#B&t6Z8;;UkS>N76JQ_ z290U|C?ozY9c}+ zQ@-Z7cH?zCRJqdU{M+J3vEvDoSb-O;nUc&@v5^$)CP`Jo#bt`EZ*u;3i8Htbp;_|H;YI zBf8f{74Hz7xivgO=+fNQW(_WGygZ&>S)AbaEo-MOTx(kI;@LphbMRicH)$e0Jq<6{ zsTBDUcV?`28nArv){ZBYB$pim%7`T*9$KidXq?&l$@Mzd?XiaAnZnxep)9etrIu8P zAJOpd-GyTP_A8)?tcopiTXhiy)D-E8Rg0p;ttn;v51aM)25{C8zZs?Tlg8E>g-Zve zJ|yPT@a9yixH?I5XNtMlv?TCvSQ$%`>IP(4pSpY1R^m>u#o!}2({_Fb9_Ydt8D~>< zG*;F4R%|84bQq*uGvTN@yJGKG2s&o~pB?XDRZ`h>96#Ud1}Y;h+6eLIWV%N+Smnjq zuGFK0f%ot{zi~Y$1w4Qy0bR$$8aKxM`-h1NDTcM@Hg=Fj;C=B8B=pJM9xt)yRby(B zWS+0#qfG^t7P_3v@*YL1E#z_yJU|PD@yra@xiQ;oy>F-4I0<}S_NEPI1}KzEA_R%0 z8uwM^ms4VXsX#Et+K7JXKykU`f`Q4^^_V~zmLCy3BQ|$Zz zK@^S9G(e~+U;M;4R^40(TRK?MsoQGw@==(cc1!o^Vug@v!iVl}F-y4e_Ty7q{V==c zoj~~>9+p8xW-T(qyYQ|NE@fMfr`2Sgfu+2H@oC#}{q6v8kpZ;%bmdpH(tX{a!lIwg z#5Wr|ScKDI8V|X-E=yZU3!!4DQy_OKWLsx2Pg8cCw#7J}S>}!+p(@pORlctZ9g&CM z-gG@(oLb+-#F?86pt(HJOPxUDt*V}7cb!@Q ze(3CNpDK=UtR{DtD@ByK(9JwoXdAA{t&m*2+~MECf!n=aGD0VFutuZa^XZPzI!WlD~7CBg*LP+C$LBfYj=FYI5_)2d;<{RRrE{O^{|%iUb83{N49VtkJ2K;t^`wz zl*qWKWx2@^)zcoUsoe`OtK6`S?WTEOnsU6~j`!#6rfs_cCkeyun;Bi-%?>&P5jPZF zcNol5%EnkN#jlXdU31{tt_}`|#`6G;9iX30^xMFrokqQIHO&w1yyYnyqzW$W(X>C{J#|UyTtzBt!o!6yB*DM*-KL8bi9GxO=2{8rtOcAaO_jcac&&RB9=Ct=Vx%tL zWa;IlLVPquageE}>c7`LC#OUw(iWR7m}dLs^U9q*TG?ruc8vM_3ajUC^M1(*OB2vA zxVm8c#rc8|FRWe9b<)(dh+eaj{P^?46LUZ(#_u|H`Veh!MQL&uEt6FCUHNHD&j;>@ zOgwDIB2GlKJIP7|8bCw#$D-(HV&&hIU4Ml+ed0B`1(#bN@}`#zO7e^-12<(BdU<5p zH{rW+3e~~wnspvlpy|_n0D1z=_Fn=+@PSXePH_?dYIP@oi})&f9+~zxVH;}o9etep z=8fO%JvZrg-TsDOs#9&JuYXU>kd!d^on1tRECzd9)(Q99A?Ll(jI@h@mkJ9YC1x5k zV&-H_(~fahXdN!n0f0T1^uxJ9UR44k%v1#VYrxU4$2yyhtudTRYP{(;G8 zBj2i6R6&V70rC23a{}mm*m+p}-Ptvp?*Y)W+F*}Y(t)Tq#{uX~cd`9E_RP8XM|Mb; zx1x(5X`n~v1%+^8`NdeGlhMErGS) zX$W!2?UQBeM8`{z&#j_{rTy;ibeuarqD)5fK+K6dtcvRrxYxRfQn{_q)I5bxsRMRT zUDtL?$2Z1DSp>8zy1IBY|I}&1ko)y&NLol+HSxPcfH+aKux>oqD4LHGt*~29pRrH1 z*to89j!#_ZBTTS563Sm+YQt<-lw#~(b`4An%IP4~nsRUkt?xr(@b(-Z?A44drgXI< z65UfoK>D}xTJdxKe$9ctiu&QFUlP>sq*Cu3@%sS?6zub572FNGa>! zpKe>~0kW&_G!GSjkTM)tkV;5Tu2|MiRJA7rx85;bW~B9G%DZ|gfiH1iMfktaq6LWoO z69^U{6@5YnJv2A;+-6<6v27V~wgd9_G|?~IO0%DM1bX|56b_SYUrvC>e(AI{WEsM~ z@&I?X=o~2*Rgf;vz_;yjeJ@)uK7>p@2l9@@*KVz7QFtm}PBXZBZ5eE%D1G{C^xk2# zlJtE#Luch67qK5hDRp^HBn4?+ePT32Im!NGe29r3hY_E@#y%a+hP2p`%5syRG+^d< zSf6|NFvHe>5Yc=LG(a2yDC~$(!`XTv%^j)J7}fQ=L{J)8D@R3%hl`Fckj0Jk+ogV! zMuGblZ)d7fGi|kV55%vzb%o;^26ec9e9Vz;j$dYlQ?xPR$9Pw1d~BvvBKny5Ch?BO z{VpEUWrfH0lhOSni&5(pGwJ}&@|dV}&UK@B1xV!|2)QqZi*RdMQ94u(UcLLB=9M-C zu;03T9f|=T_$C84Kr~b`8Ea;H)C=o+Qdf<3xo{ouQ1kD${&bN3x5vhgIw+;>$>`G; zH<`i-wNL(donBYb8lPv~)57#6IKDjpQGpInDP7F-9_ZG<~X~S66HUbg=L11Nr#{DN&`6=0ko9roofEJ#{o8 zYX>s3Olx^?3XZqUu;CjV(4`B^yZ@!E{O_mC((5grjv#yJXR06bFc|_7Vn{Q7Z*GcX z*V*)WhI(OU0~Rm(9V>xq=zcPf)f~j)iXY z){q!!;GxmWS|1A2Dgbm_6$T4r4VuHpsZp5t)c-N69MTX#>Yp5;jQ1$(YrP`V?)DpH zR)16=PG{rF?_@|zT1FA$!1@|E+|hfGR1`1pl|s%@_-D!$FnsPIY$#$8@p_si-ayAJ zLcF&|(Y?0wPH4>WB8$_csZ`gLwOhdgW>r}c-x54GZC|Y)q!}BuuPZjALU&VM z!)Q}cVq2?QZ?Xt5l8-S3dLj0t3@Q;fkj_ARKVSDAK+JSp>CK}8V9y0xjupKk4}zIp zwNAZ|^pLcw5_1#B)sIjYyaE>I-DW&uILoD2N>tTwck8UWj_7n}$w5xY1z3NS9kjy% z^d@ILF*{RLDfG79g;3uWZ{FFp6rE(ntLT4E=Ydf_1Q-rGHq3@OFtN_7`UgXdn}0Dm z^=VJF)1&k1PX>{?6)&fsI+&Pc?h72cL+D2nKDQ=(dOn-(d-f{P_{;r`gt1G^tmbV| z6Kb^3Ek1cu62YB(l>K*+! z5Kp;Sprx_0RPe9AZ&ChrSDqA819F6Fm9wULrS2z=@t}GJE&^po=gOzIIv<;%Y&Bj2 zmeNEtyvz^u9yWe)a-H;8t<~{d)pxxw7}UCcG;V14Ub-+(GmLLllSGS>&BA!8YTSSa z@xe`xQMbjx61Vj%aE6C$tym$IZs3+0&GK<>064n@5h2V4wd7z&= z|AwBZlkL==ZxbE60^aUG_p)*Y;4*P_<4SfpxTiv~D?}zR7l7NH=MvAp?$E)kiI{&M z{74^F$nYj`XH4*$gtvr+*D61+l}?)eiyw4lSJ#jnywV5UiC$THO+Vq;_+nV z*}WGGzy3#H@Xtx~?lASkV+h-!&oBl$|DJEE^3BisgI-NK?=u6Nvfp`7dN;vFIkNdG z=Ex3GG15>izIFIb8xwP?hb2yc)sYsR!}%t48RYBE7J8MJLnKY$aBx#}**i2g+2P(Q z0~roQwI20c*w@PXi19FGA&H9%+U1wM$asA#UV7I}icrUF!v+DfPRmhb+iL+dmjb$m z@|~@=<0)2cp;}e8zI?)C82@cKQ&B{t7P$IidQJ2I* z^K=+(N&MAFvIYAcpW}Q>km0R7d;HFg&`gw!vpq_dXGDP-_AZvA(qp5poO*e%n4eH6hor^(WUmFGVoU56)|-*- z4?fMr#X=xiSJMwEC|jyyLB7?j%Qg`YT#LYj1X0km-1ebweUOy6*3kejKWTwM$o*Zz zm@~K`f|1IZOmbIN43pwyRZ~ z4pL5!_{n;TySNQ}TStYDiUj+MbcG5`)a4EK|LaWligphoYE4V*m)Zw*ZHb1 z_RA`MT4x(JnRiK+CD7L6+U)z#Ab-`Bwr8;q_dSq(JwF*f469tHR}3T5LW(~`o0;8s ziD{*`PGCd3)ssED}3P4y;>8JFT(Ck zg3&(?J&ffUFlC|L8CofJHhsWh^pL~cd#OfiK-x9ziFS%LZ?n7q{#o|23tBwPRto4= zxtKGCPKN6bbmJJD&CuNZ!DP;qH8(AToLiMpL^Im{31__!~dYz;mrOq?sP+puSu&Pq2V>73-1! z=C^-$&*!5$i-3U}THuj6^jTlBzZonK{G(Yw)>f9ux#NA6rj3KNp{U{ErpKE}HpJ6a z(MbT9y#CDNe5-ogW}ewDCjR63vS-;W5^MrdCzHB($J~Ptsf~MLr<)ykj4BT09pcwe z?bjw)CUHCpe}Z}WB2gTH{|ITyHVcYxwum6~eUU>L##-RZDvQ);!ipZx@6je^; z68>WUp z$mUrW@*Y>M0VAG{_wY6ZV)!wWQ?Hbpi>CUjIbgP;NIAK`jX>H7BI~BC3f1Xjo%S?z zZPgbwBZ`1yRVVesBLP<>*+l^2Z;GeXFNK-$l!-tiRv*E54LOoTcNJ;2NV2-X%~|A~ z8v2YhQ&ZT{j~9l2H)I23hbXr$0b`~PjFJpGk+;kHHtp0@S;u*!sxEZn{OCatYq05* z-_I)VCJ|p#$y_DgeMI2RJnKq&uRnl{rDh@E=IdN~xza*%ExP(DH{QFK^0Em`1W)SG z&UQ^(i2Y#t3TQ*wlGho4h1aCZNTa){Dbd!)O&i}YJU(+Yb8|VVqisoj`6Z)$`75a% zAdBPcZWHZzU$#KAK!}?v;0i5!H-n>RRD}0S%JVSKge>FT@+;pkI{NsEceA3MMFMFV z#LWfh6W%|m7oCiFsw3dGqGsu#%yS`JjXp6WmEYOhlT(gt4MW z+`5?2SoxeWs zhJhhnYI+eNErk7!JusHo6GK;MarLiCcwbG_#s;`{<~~2SKzRo zFtO`3*qkN?LhRY=1t=2K@U#g4)=_PZBW|iN{tssMZd^2m#u<`5DR@5~u74Z^PHElQFimaKSaIlv?}COM=TwN}ocX-ZhS<=t z4KkUx=GV8;e521Nms&QrJD;md2)rx`Z=`WSJr3Q%pBKd5MzXJj-bh!yHOK#>42BdA`Mf*sJ`KIQRG$SpO*UsQ_A23dG=TY%2PA^{>$AzuSu41TQt^Vm22x_0?DEzQFOBnAq-rzYE5be8GR3`|Va zd@*<#Qm4P7X+Gd}9Y;7&D8kuB1Qlf(0(xBizz-nysrGyI-qJLuUp1Eb0l3kfUQIMI zYs0}q7-8JgDtbo?o;?@7eJXL?AkfDP>xYblA6Q2le-e;4IUmM*2N-7s$C*x5mpI|k zE?$q7tC)A@tE|JB(d-O5^o3&)?K%Hj+FeC`B1ineyL$ej#3i_X`=K&QmO^wW<7;t$ z4GTT$7@HlZQy|U*`c3RRt@5^P>US^gZ`&yZ-)c~1CfFU)C)j2rB##dn#P4l}^}b&? z&8LSxUT6dsoYlwiw~1$48%7r}6!I+Ev$u%78EzbS$gm4mzV@1i5B9kNYfaIR3?qnd z@B5Yj{$ja#z@FE)+SVIcJoUof=q)*KSsP_4>Q<(8Xq#dSyrdwsv!S{d zF&*b~JXhDlz-Fyq&t&pqMvd=B1Ge$J>rN=YP6vy{X2nfjq!Dv6638ODuAN0_!!d@R z+xzO;Po{xQVSNo!(W5ZfQzc;Up;q)VXQGi&mM5Hc-q91U4M(x&j^oFbzNsS^#HywN z=vfH&!uQY{CF25x9>(MJp?2|MWpX#Y#2(Jkp!Vs&RsOLZpZ6%2gEG`^x-tg`LpGD; z=6Hebv|*6alTz8~eq%jTzy$I^dfT0?@#QnNvEY`PL7$Z%4YXL8$6pmeQzQ<$kZ)pq zu13JR1pT~f;6+y;TujS zD}6^^%p!$A31V9y!v;D{Yk0F=V;R#HXR7g5mw|+3&P%-|Jl5~w1u|bpW?Is0d)FsfBw80+bOA^#K-RHf3%nXTu1@km|H|z^_F3+6ZmX22}Bk+MpGP9qR~MKv=fi# zP5i>0FQ&$YjvasAiyz^G1J*_c`X9EOjc=dq^Ax>9e|BKL*(e4-`|2mL%-eLaKbk#q z!YJ!J4O6iv6d5iCF!0-B#(Mr#1!ZN8UxE{~krIsmgwW%U>LieY^cze%9Ibi7 z(i(a{kjSNu-SDamV={hSXrSG z#yAy=4sh8CG>kokfQR~ezdF>)#NK>>%vc{4r|n=QsE8g0_KB6hi=38{Pn%<@Lu=Md zXG}jB3|v`{PuBZha}~*XD&=i=N9il7jj&;YiY0cvp=i;gL4doK8b5w{klwuyP>Ut~ zQlYAi9LBxh-j^HMcwJ2lzLpg7o#idZ-m~oL{||8pWWu|0*LS{L7cpmvQ&5U1ei@1T zwDioFo?AOYA0fud6xf4UE{~o5y68QH&AxJhy2C-7{;`*5N8$cCcln4)zi6$cu3h|*(){1yRg6@~qK3K>G^sXlHSw_6S-1O8c+f|4j z&!fMa`U4S$3dshE(ztid4o?im?^W+H8F4H`>E__|)4mF%mTxO#VdEcI-|Jv~a4lIm z{496*6hPrcKR(iuL}6 z^R}KiywOuzB1O{+(^%&m((foGbrL1_8X$VFlfI-C@}n+|7f3%aX6l>2*0D`G78b9^ zO(T#vUB{97k-RwA1J8|Eps=iCqG4kQZuPhmehJ}7m8SjX$2<-qlbOs_3bLEsSqx@@ zlkY7@N@;ZDnuY4e^1g@`2QxHnQOWHtpz*#lGjL z40)CAE;kZxgs!vM#vJ(nVbF|#F+mqND@QvNZ(belKxxBaid`8@A zgsaeb()6)zi(0{BigV*+9yqckO`X#F6`>WypF0+r>*PC6dcHN0wQa1R&T!@J15sEd zw$EEs!5nts7LuuU*6sfi8x|~c+GvP~8Q9;jZ;V@RUtgnJ8VvK38%vE zAQbdf3UK?7R^c9ni|=snc0&3KZ>15jrK8fjS}&ubj9B?5$7OuM?Tr87eLs=K{g#0H zwDm9h9j*v(wUPWg0>7UU@;aQh`Nw>bBG56VUlP81O9nGj@ntrlH!9EykNHi7#7?C@ z1mB%FynMnuo@?>WERaV`Jtou}FEL!bGpA9kGub~CHKCZ@6${MNZR520gG!Eec8vK8 z$Xw!dHwJFY=@aWJy;=-ufybG=7bbj0;cjsMy|o9Sf`jor{9xU+J<6cPl-D)3Z8;%< zuU>QBPHNj_kC1G!`&JtJ@eok`>Ck@uFgbtXuq-(@{#}m1%V$CMDF2(jtM)y*uPd>w z>!MOhN9o!XW>as)iX3~8g%Ql>X`Jb*WuISAo@sj=c-l~`sy{;_>nItYLB*e~vX86(;uMB;5(z{o5xTKUgpI@eU zNwlc+P=pK~kb!wHS>C4y(-}_!^|Cy#PP3(Q{G1EaeCOq(rsOcq4z-y2%Q0QMs3$6r z7B@sk>5@@Nk!zG5kpum|MA1JUNJVjOYbiA65>s%4@1zjj5Tbb4F&WL~1_)JcKkLzv zSKfKq?ti-^pda@);bYYy^U(rz1YmaGpM{={{w9qZN1;X;qe#nrb>qnrPL~&5^f1ok zSctlkzz1^|p28-v&PLmN%7fHev?CI={C4;rnu*q6y{TG+GeLZQ_@ft!`to zx76-ht0zqsGl934L?)BMsl0+VWQK_7a<}J``}e7T+v}jTn{(=y`jW|aynm!ded~U_ zy0J~jqaCZk78Ra2xgz3G&d8{?dH= z>bYbW;)dDcv2i><;+bNx%le3GhsLwQ8{Om?S6s^4((OBaLyucOkwi1DKNU;TCa2x+kN~FoNFfZkx(9Ms;oLaZq%jVS5 zw@1#uc`NWzIBWqL#U=g{iM!j+kx7O)q7mlfqT^TfpOzbd6XoOq_$_sau2U2GdGh&f zOeSDB?rDm+z#~G+rh2tQXIZsWU*?_&W0Lz)C8p_W=NA!|Ic*0;Qq-||sh785rdzPf zeN5Bf9|%ovNVSt8$8Q$Ce>$N45n8|>5*59{lw-tAlm8=I7U#o5sv8^=3Z+R!7Pr7z zR-*-{JEHH&i<&LJ1I7c>ao67`8BxN=lTgjNG?~*^bU`u>h^7>2St?^lD1CE;vk^Tqpn_{mX zOZYeZ5<{?~I_9w&89TD3te2$!dY=B{?H;Fr%EI3|l4LKEeraW~%b2ZosYs{hDNxOg zsPm&-KCO7R+OYGpaT2l@PqHyS4LH);n0FshIdCuaX&z!;i=`N_HJiKC#9j{%kB!IS zX;I<3F-YPc%EksZ^80RY2sP`zKz{I1A}OjU3FJVZv<`V{hH_MSNrF{y%j)~Z8$=w$ z5S(*@rd`x@KfgUxWZDuF8{;Vb{tp&F`L|y_K-=$hr|lDY(>HhD>~Fme<;;>FLO3&6 zZ~qQ?0eEVwxVibP#Kvz;jC9my&{mHeQd0S`1#6tuLz{8x;J!ZXB;&fx0YQ3spS-Lm z9am;3902oZ{+B*y`ME{OxK@#cxS}n>5j9zqi<~c^-41N8eO{Bo4}(k=w2WRe?Wa<( zU+i?N&#qPSYD;btFv1h>;?wRG`#3Ro7zCi^$QK#|tRH_O3{k4ldKfU35&YdS=c4bt5W(w)+&bc2L+cc;?b-QC@#gmiao8focYCp@BM!GWB<_YUURNF#~9Ce#uLk#s)ZsJfw$MaL-z_*F(XiH{7d;V)6XoYL}=Jd z4vS^I%mHeD2y{q%JR!t=yo#`2WJNN2na}7-6hvQHpyiO|c~6_57W3P*mbV6CEz+Qt z5~+MfJ8W$vpk`Wm5}+S#)z*qae$YH4tZs@46A@m~)+6{0(JZWTZrUBA&MgGIX zs(UhnQq5*dj0i_lcl&46Hpc{Evq8%AvC$)Ci&v+Gv@uUbG8=G;_lUFHC)Gk&=XZbjV?xv;2= zTO4X)?e5R@lc}oDA0l&&M$;BbRLaeOrk4hFDP~5cs;qR*OaC zMH=$Y)N(;5;n5Hke5+hG=+s!C5jjNx>i{)T;mA*`M!Q%ds(Z1%%9ohKJZQ~jee zkF65XBsvpe?zG4==;S3UbDmrd6>*%C|L3(t9V*CKR#0|+8rV)uC6|>##O0d<*b3+Q z6NjiFPw`&)p%oPX82~Bqw5qGxLLd7=vfrMYX-YnklBCxnlqv6@#XO7%YIpg6G{A}#+@^@tT zKPTBAnDH6Kw;R=3CqL#a)8i}{39a~eO7k?`ZhOeR*hQq2H&c$OFm4fW%Hkq237p+v z9Ty+O{S1fRJGW!u1Kil!O;VGmlx~Oli8^P7=F1-i?tYOvYg$e>Rf{wqtn@ng5^TDd z_E;1d_B8Z(pm?0RpJ}0jh48+qvAC9Zt}#ADK7u|NfLqbr&+vB1Bst}shBgr*j7L&T z(P@-q2%e6NNmM?VNcpib@vfRT^)&Y5#SRW8c6RMZ4yQJCqxNsQfHrGRfFQhq>oIoD zgC})DZ}+Jia^RBjPKUTAJ$~a+&|GQzENIhW03T^owOW#)QXqpJd||KITw^p1{-O1b z`}gHsc?(U`NIK8lar+7X!CYe{-*Q1X_`?F`{WgDHqp+wP`yWU}y8p-2f z39`5XN;n?6x62{91k z;G-=MSpQc8>z~(rAg^*)Gnq||GhBDP1F9AUd~;~*f{E5Vsp<`**CQibRX@?}65Xak zXw@{GiZAsV{QIl_ak|`4A`*$n(DYfv)0$!^Uv#Ix^F`et>M6xkF4BwNVn|WI-I#vC zNOO~BSA#>0OI*8Y2KHnvC7O*DlrD;QIO~=Nv*nf*A}I)}l22cFN?>Q=rt}DU8&C_! zOSQMi?qD%)NQm;--u4D z()8oJ^znWvh0WXpP%OJ3XU~q^52Kxqv;rct`=wiUjT4(3=k8|(X2A2-|GYwWByA;) z)&t;!?RqGj!uiO?ddFT~`7T{@U{O1z_H{k*yD4iToA)T?Uc-dDru7N_PS?V5`gzG} zt3WiAM8vjqXbNFm?)QOCqwHg|`=IZ(5;YTC=5D6@sJ|qFx+@`+ew+x85?mgb5sL_J zNB6s%yz6slqFS5dKmR9xuBr_J%6yw^Z77F4=Q@mX$Nwh)mU4 z#EzQ{q@g6HTw-nkF}VSc4$3gX6XdC(1bTbWGcbeN)M&dQ#3s(g>&*%yU|s&w2wv@B zX!}KSuQyA#$re0xF3`RGfgEJ9P}4g)tpSa`Vbi(OAx9#*DHd*#E5mIw0XV62%L;N_<42xeg8$9Z|6IT-YXp=ZKsZeVovm7Od7Kc4vWdCu~o*>XMvNXx1OK>ffdn8c^nN4vVT{#lpp& zV6-E^)qGL^wx@*hLE|&S=c>lX(4&7spLsrC?cJ3gl^f(3)(!!(7Hn22kgCMbo|m&2 zS(XYykKaPh_9Jn7hUU{n)dFK(=khSMS9vGZvj6wX_3~nSBSt0h0$B}_>xKy^zv2|- zs>kA!9{e{1xRfX|l1A??4=iKxju}cmu6N=VM1g}G+W~I9Iz}QIy7+tjhvj37V}o|T z;|SZF%Yzwkbbq^HH?Gif0`%M_BHFJG0xh5y{bqg_Cgu_y{W>N zd6xUF;#nhy2zcyuHYnjHvr+gz$C$>SKb7h};0yf+X# zuQ6w^qWC@CoWq|e?{M#5|0nwi#DVOPe~1>sPa)OFk=3^vGYIyHKXRdyjNzMZ>OFg0LAuozE9Y|osu{i1pQsN$wHNoU7F32Jd>L473{DV};PVO_v8Y-ThRUz_``b04_l zSLT1iVREKt@U_mwJJ_q- zMsS>`J4(LD9<1gTzQN|5*H(44yzeKxcBdg3$Dr4|bD~wPxOinw$9ZD8RJ0X{XxFhy z6sQDK^8&8Y>9Y3$u5N^Tp|vU2sFp7kU#48Da%E9yT&8?5+aPr!p!|InA9aC2yG3bc z<*XFUXHn4rjOYb0_4#(!pqkCHZU2!arosJx;!B&KXlwT{^q_*{R{_`B572h zLJEClozS0bpwhFH9#hA;$DWfv9-;t=4RGXnUx@HJt)a{-x1~H}JS?Z?&KJ~}#=()G z^pL zjRKj%rl4ZIY+-`?Tflb2+fchb#JDn1q1Wwq-vRC3B#yze>UD4FUSJ^3Na~q}T9^3K zvC?=fgWaI-b*WZ!O}gu>x=Op-8v%-lYQupThA@3wa@4YG6b}mw;BABy^6Ax|g}UkY z%<%4)9$u)_6)<0Jsz&;#xjeIs83BN57h2tpHrZt6UY!Fl7_gGM(<(FtIX+xIY1Er3 z1FpQOi<`IZ_y@b~ayM+)`svG6wO)JSc^hTQ~~b+@0Q4D+7-hp2Qd6 zc|pdO0+-kz8llYZUy+uUUC$4Jpnfu?pwQs+ivO9_z3 z=>jf}SC+VWFXP@MXs#vDYtqRdFE>~$FuTidR}y+2GA#k1gXedCoPk8Ls>lTm0K5Hz zA&~l(316=EukXg>%fae0s|<~k?3RlfiI_T7zX{So*LV#t+>+gs^;;>eiU%&Tekqg)N@1E6rLjs+Wsqv!onl|ngu z9$CNHU^I$(yOp6m=TWWZhkD>ev74|2K+OvJgFZg={W==}te2;bd!7C|K3?|jS`?Yj zPgYQzSLv%aLGqwv=Kd$0@6%gcJ%uJ;i@d5N(NT-Od=Q0a6(LJLb>A6IZf|*$qbgGF z0WXorutGe*hRhB8(oXrc-<_S37PjwEi8g(^e_e;mnE2fT?{v*XuGsB~ahmNn9u12- zi&!@E+2M3mKz=_5TjO}c`~K(4`EyTe({Jr(XF~+3!X~Mmf{>*uOr`E0Cei^9G5=)sV`RXKn3nmoOvsUw7NU;dX1y$jq5@BC(JuVVzcyV zs}QOZg$hwLYSAK)$YKes+EGt&B|d#2CL*W%f_Fhlh5Q~^-T!lu+$Gj>Z_l;ULfrcR z{6ZhQtOW9La@)aPs`~8DM>ofZr)FEhBd0&>T?(oo8x3I5%jEYwTyb8l23lx`q|_F#~wtxJV9O7Bmc;q!o5 znk!~Hj`4eN2S~#`cc3b}PVHv1c%HgrX)8{4eBxczX{-}>r7)qWk9(ZS$ResZ{Kt1(h1SDWCE2ioZv1(MlF*W^J$x- z@h!<%i-mi@KEdXrm_Zldjt z(ApRv!|i8IaKU8U%M1PzfFC3g+-T?~H57fVLII16o~ms3X2_a3X-L<`ml46Ed<}$* zH}4jxc8SuYwt@0bxCp%4FFFTwieR_!SFNoNh>dNiK093JGMKEycVrZ-##a^s9R}Mq zr`GIJL&O^T-Cxhf`INu6+$}TIn8v5@{r9Z9IEwwpzGG;V6O7I zCbKw_tFN~NOYLyTDQ^~2BC2U4gjOrbZLIyeH;-Uu%i%tz2bV@ouDKKXa_UEpfP~uU)0KmV{ zq+|3T$vzW6>rUWGNgE|Tmk;qaHtO2MpZA?ZmXuV{@k+pC^rctMNl&E2+<$CXJ!hB* z7d1;~`Mynf0pHw6{<}th!)m{TAbIL?m4p4#aM4$O;&IxVtybl-8LSJKh&5E2en*H5 z{~g+)NHoJpXgo;>Q=}<1ntWatp_f~$X%QyRJ(w*uCX_?l+O zJz#q{F4mb^=4+`mgHJwcWuB$eQD9Ol^z7?;w-bL%=XNZiS8tndO&6=Qw(G}dfLp=r z_Z^}|S`r`Bju(?0m)@?rJFFeMXy1Wptu)dph7`6d!?Z(+BGmVgqv5s=RufnPevZ9ZF8t;p7?b8*_=@Uf!gmtUX6 zA-5o478f`2$K$fQF=#&DvQ<@<{Z0=^;ck&-I&ap)(zy7#Et)r^$&x1`>pr_V7imY> zwh66Sqak$fgT4)>;0+Biq*J+k1|lk_Zx@-ul;%C9**Q5#5G*w^E>4FE>rt2*~0n z8w2HZ)7t!9S52sCATVU^?rLvyK%f4&W$0UxLid6c6h+5Wt*ZP`40-9cO4?VlhBMUi z4$6MzfHEXZhAK^54kx~GGIBQ6Vujw={`m;bPq~^_)wWVt{H-F0m2F{7jwP$D0Z#-J zh03Uz$@f!)JtYVxfUtFfTsAyo(2ir*C!qKv(IGb zB(7FBOV;-!qR6n%KqrO?nC7QQ)?Tb=sKsev=uvV6etBh0=0IA|Kep)KesNR{VwHqo zaYLKy`64$x1(Dfza?<#;E2ra!QHD~bfwS!)V*#n(A{%F&3(MpmA4xGp_x5R&OWlU| zG3ev!OqXU=Ds?Ou$ZE`J*A)r4JVgFvdyw|F&p-ivdBtQfj+#Mmh2|4g=m0)9ucuOp9EM&Ph)qj+e zZQg@!0LbC7D!p;sZ^y4q7CstGnPCFyCK|v@9|dAaEPQG9qMELL=0@J(H5&t} zW85%%z1d7nnw@}lSqM_US;pgp__=4N68n6IWor4vgWF@v<&&rHRt*8*Pf%yB{lMY? zc!FKozPvuNu@hAk*@mIPi_-E4)0a%7f{e&SP)aWJ&ZBun)-!?9mLm}I$C}LJ`~GmK zy{&Y!b*>EQfBOn5%?yJAITn^fC`;)T!sm5a3T7lo-UdY^$R+1PU@(x%?OH#CnBYN! zrZrnlnLPikA+2^n7+i&;)#eB|4*So4^k0|fec$x)%A)f_TbR;(gdcMdad| zL;tm#o{4=9Cd2loj{J}qSuvV-y>GJ9^U1!pl8G5Hxn>1qEiVP{*^fP|D9@f@Qt8od zDW%Ji^I&?O4d~>G2oC13F%*pnJhxr`T3wmL!!n;Vmax{fyd9LA-QY%=NBGz|aS*AL zi85Ldv&7N)oCj-*F=Xpsu2!AHILZ-opcs=?^<~7&(mSU$fHL&fedTms=~>-cMxtF9OMk;#F$fTQoK4fhQVX;l5z$e+AR*IxO{GPK&@tUMU5$& zbms@&T_BfjZ*4AfZPvdxD5vD4mw2!kof*!(dK2$XJ1{mpr<-`IU0zzL60=a7q4q75 z_AbZd4}|k9x)u~T^E4N_aqI67f&CW7<0tfhe#zdqzyK=ruImZ=*6-8&iKN()V< zfM!RX%(4WKL%ypIdyOpHd7qR*Q4xG1fNX?EFF~*bujs>ml7WKeu~xH}rVlnyNK8z= zSMcPcxMXVh{0O&{H@E)KEiCu1ckF$q^K)Jg%yIq;j~#C5Clxsw&-SNRtLnmRZ}(f= z=w(14pM6foi$y6c!L%Bq0p~d;&%h6)}c~9LY>vcMtc|w{>XFVVX+>He) zyMEi}ay{RU_o)wKO8~6^c8VOXTP<7xuQtl)Pu*)@8ML*g2R%}5IhhiRLy*uv`MqZ% zLj5@oSFVJ*fF{qscU*42JA6CRgIqoiFnqpSF8`P@mC!k0HB%tQ) zVix(0$$jvUM%Bau-jtP)L-#&N!f9{c#`( zYbYo4Bscw)0Da4%i1|GbOv|QQMl?jSw6{=Z4en5>{UR&C0HyQ)Qx4dDe<<4qCcPB^ z@W{R}i4CKrr9lQAtHloF?69!^S z(B*_txjz+JTbwL;G#QA9Rb&_Dv@RF`AoeKjBlmSyx{qK-;&3|q%G1|#ku zA1-ErmIfZB?Z%TzxkaqjXQsI>6N75JT)TZPRBEen625CM85XsrEbEKZSGGZRw(}9N zzuWmV|I;7P^+e&ri4M($GoV8#aUn^!HNp{STJiMllj9EH9j*bYNDIu(WesL4izRbK z>%!wuQmpqn_Rci4N~J0zJHr{4XcRKP4H-moljCoC&$YKp+_s{{0X+?DfuG?vIP&Yu zaMJp@CF;*vn&ewpM1$Lou4|}{4{N{N((%;HsTaxsf0&)#NcNF+HR-z#8l7J4M!csY z@^%F@_7uUYwNw=%%W&BT4dt3EC~s@qE+*fe5*+d{4K0DgHXnianDaeCfZk;nr@Z@& zG&2dpRTYs?RbUso5Yb?}r2-tAF9|a>!kvQ>1xt4x*I)usYVsP0ea%okiY*$Dec!&; z2I4O|n`_o7NQZC=lt6_XYX&yW;1IViWGqmbcFJ`)*R} zD+~rOL~+4cmBvxz2T+;6@z?QQk(=a(HW-_u5xR>`%X>eoR&I!hF$F*PSPY1d>?Y$x zsm1)-w%hT2-#M0;orv{~@cru}{ybIxeHyL_5>;6pX=FMpe%b-3-0%7R(#ke{^UIs^ za9rTP8ahm^?3`%3)ht!WFY%2n5#33Lv#*ZXO)SK28%vKwS zo7?<&!_O#I2M`#x)U&5|k%jLY3%`%voNgWhf8`q7XmL9kyMWT;Rn}7jqz|ud(ud=) zox!l{GrNxRP661_KzE3^-X{CI&WK({3Bi^M+YZ`R$sjLYG<~15$C%!#ydU0}qL42P z%d+ZiME5ejw!$ChY}YXY9tG?(W2-wefxvG>A_-BGK_ZtlX6&j{3c(&9VWJ@4T@j-X zD0n14<@HQ{u6666MjXP!(P7Y69aSjQml&x!U4@|2zV4>+N4Y0rA^C&%{ohW4L5lZk zP+5bhR6sI=d&6xgW7~yhbdG5I6rcNr&91@*FM=-$_tDt5(w~$0(jK-2&L^v=d0*nP zt`u6gHbU#MVssuWHcpFrh@HHzt-Wi4uK(B(ht!Z84|KN=RJ%%pwlzt^U`qn8dCY#} zJskkf@BSk2j+-g6{R$ZCB#|Zh)oXcDTVp3PI!-ExZ99u@vYX+Yf%FAC)<&K0xXEB9leGgyj->Y^{jXZ&?o*MN?-g;I*Z2$L^e(*PuKKX&K#V@v36y-DQUtgiy zF&(HIryGT0GG0A0t^EtL|6dRSIEU7p5*fX{Qn~C4+PN%}665dHs&k>576vXWWEN`d zRQX0iFz6d}-%05e-G3*|^crCE7hXsmF?-RqE{UY|o^N zDwJ}plM1n_MJ1Ou6MB|TrS?7YXy&dqA^eB5pT`P?z|k467w6I!SiC%_2 z^MHZFuhe_RQD-8lnXx*|NIKDNa+ZfwY#un?%jD9zb;xf`m4zwT&j9nE4muaGdv#8+ zR*;#}0Aup4`)h3OX&|Xk$9-!;{0IQ-_1{w{(F9!Ay5TK-O3;aT%V{QP{8U8>5e%jz z(^@?5kyDvnYXFck5HZoQ#|XwmNjlSBb4doDx=%XEVr|y*%rs6 zRcA`DOH1^2$jQ&tBwn25R29>N=R)apIdUO9!)Ik=$75vpMgj*2~yG)a) zh+e5FYPpbs9k0_?Bb~*#!n4A2V>S-B$PA}mNcG=Eo2w8As9{fR)ucj^r9(U3-tan$ z`L}nCc1GpkHMfJA+C+4v$y4JLfz0v%-I5sx*Hh60 zitK~_kn81&8#xM7UkMbR7dMv7P<76mJ5mt!V)lx1m5|^NFCn0juUpT5_7IoufG3(4 z)x-T`seU^n;GI@2f)|K%Qfm<3Q;okM6aOXdH)gMK01f&aGQ1lla9Sprc_9(CE{3{V zNgWSR7V92fp`Kp9k6&mO?9PkHm%4>u{rug9G|3^7neFGY1nurD84r)qRM6^wXBL7G zr@Nmu@`xxz$TRjr@QE>6gpQqhLQU-Bf6K(Mgi_wu5-SN;^^gn$-EK!4CD*ICo1yOk zu3ryj2QN~zs2utpaEARhSjc<~{qu^z3xZKg`f}PdX_UACu=Qgm@3hiF+0-2)NswQS z)o;LitilNVDElhPCpKp>D9a9Xy_KgHhg86OqU0z0ULgr)OY39^y2* zbLqVcsnZ$IK6u}j;3+e{9N&);4%Bpe2;482GVL1y-wLftThoi%CV^4&%N#9nV|I)` z$a5n=%6y_Ge`P$&*R#kB3MeGoRGWfE25hB8qe7Z4_DcaLgEIL#eXs`n8yrJ%eAhU( zgkP8M$nA~hHkGtGYF+J5SiYH$j@JI*gvL{?o&4M)gA|a=dRoP$zQgjaOY1iHFqy_Lr1nbwPde)S8^pL za;}bfPF$$JV31s?k~+of*izEKM2pDkvz-=~OQm%HVMB*CQt^Dj+~G9v!0s^dcBEaU zeEA}qE;POD<|&r3o5#xpv2dkNM^>0o9lsyW`@S=q!-9X7?@>D)ICKdAeq7l6LM382bM7e#4qgHRJdP2SuFd3l zwC%x|+|CV5C3--qq0sHS3M8To(7a9zK+6!vli86?hDY54YxyEK8Fq4*$d75;y%x~dXfk7!sPNaSU08uvneT`T%=-U?<{1dCS36RUhB5Y@jh?1LlJ?fG`C#~lY?>uG&B8?v0p5j~D_ z7^E(|f#O73{QyY9J-(eCbI%3E<8C9NTh) zmd{D`O{HIXWci*CYoBUfV>7E!T<&pmeT){I0E~7==XYlb}I`9b2@*+^0_h3>CT0(G^O zgUPcc^`HOL2i!lrG?aZ{{Aw|@CaBU6O!nc!3V?ONF{04TLp6m71zZs0L`%MqabVjD z7hvv58Q>IPx9JkZtYg+&*SFPvyqjISJMc#9K$Y3xf>Qhchz`gyP>S2bzR>Xb>vkqW zFcagHnI8JUpBkQ&7#P{K;DGJNg#wvmeV*+b-yt2q*;D5I{G`&L#T8$ku}^-YrnW~F zC|Cl2%J|n}lW(Q9c>RFmIUim>J`V-2l9ujvd1!jB6cGpet8=O^4EuyHx|0E1$$?B$=h~`hfp(J1~sb^>Y6^ ze85YB3A(K^@iU1x{4zKP!j(#8FR$kGj|%#lP9hp|I0yR%!$qU91q}BV+bnLrln%ZN z@bjq4c`R&E)hs43>VD>XS4dMSa_}$0|9cJ*FfeH3Rq5ZGDmh(XRp#{xKjJ$tujhAowul3Hcw?Q!p*|LeRBsR)iSPeD^uF>+h4@S0l%( zk`;=VNoR3yXsu%2`N-`EFzODyNS}t_yDPv2_04=rmk)H>^0)i%;Rj4oZS=BK{wj1a zv0T2TijjUDYmi9f^aHCcAwIe6NHMejy;zP)Kpuixa-v)&|H|3U2yOJfhqDO&T_3K~ z=i9Sy85F57SxE!ck$@nn0hBJ6MHm`O`aa&e0Bvq|T=Z*_jnWBpr-l`P^K8XNShNv( zXzr3AJ=0s~e(;Mmvip=qodvajbAE|N)z4!U8N>Oi&sU>C>$BCHEI@IX7kv}POr(1n|-*K zj+1r62QXi;1-6<}B&v_oz}3~d6(eoY08?d5yXoJZT=u5npY_wf;c^>2)Gp;MgLn%H zf&f~0?@a_|_bYgn>WyBnk4@_@(S!iH;EO~*swCBJut=`=K4g-w;g_{?2NJQvDfJa) zgJ2VMLR71p&a0MHf0$Z(r^mZw0&9j02emwU}gewZ*qb!uwPi zyJ-fUth;7*=dAe^Q2+5XPb?OvS4x~#I$T3r%VIGWieVaUH^o}D1`xDc+VqwhtZG?N zn@JqVqch9dK<_;E&xy5)BO$zQc<kAfRGj#%Fnv>Wa$*)6p91!K!RO47B1* zkE&w3$xKz0s88+sC1p*h&gV(R58hoJnO`ceaM&`*-hF3!=*V|C*gPuxmVh);5* zOu>$6WG~aTCe5!FYFlj3=BYfh8|B*N)C|Zo9wK%e&k|zbKO)L)badnEcmGB+6Q-C3 zg*m$!!87Y*0bai^b9AIf)DFC(ZS>Gw6dCY2%|Du1#SYF_6ZHwddfq90=KvHQ z+R0dv*zWC#{Y5JS3Eh6aSi)_Kck2Xupirzz0n6E$*Mzl*{J$>LwMsNW8{g2&_szoS z0;w^1>C4H*s$&_QE4%WOYJ$nr+q9}rm-x?jgTknEWs^>EbiKi5ffys+U>kKK{9K?J z+zH5QbW`RCc-@v!kKC7&hQ zAd*|11XhuB)}AOV%WP@ED2dC6;YotS#d*dJ*$)3nn-Y=GDn?vSL7yOZUN=OXcp&jf z%XLQii6egwl#ijT42mI-{gwq1ABmZiQ<`qufsVJSq_kbHzY_;Srp-ajBorRn=jbA- zbqaS+!`BNheJQ?MjO;o_%at=}-{zEB4w(hy@VE)xFFxTi8&hbM&_AB#-%eq1O1?d>cEMvKfx^M2p4x*Nynk zTl?W8reom{XzFk^2&nN?!0T8Ue2MyPXDm}-Z<7B$_}4j*wQRF86ezX4o$?ZoTJE!Y z0DtMZSXZ1OIJ5ng!3h}hq**AJepucJZpd}uix!mb#k^B)cXQ0;KHY7BD?;#rrWMw4 z;MAhs?2qJ#AePVIwZakKhHTQMgP-neT&1~Ew*=}%S1$KgDm8|ZsabQ8GXfQJs$?JO z=|9m_r%YX5TTWiIvFrJ07hi8`loYuj$dwFtM#jnoaoykq7vJK=tK=~5re$V&odq*> ziem=6PZ^{B=6rv5-Y_O7cSr@``wt0%2r6&06vuqV41Xih^|5g>H!(E}YH=HnT0CZq z_7>-l34oz_Wt6<84+d1e__^dzKwErZhrQY|G}H5b0#sDZOS2iv95`_}UbqH(Wt<4a zmAx9)UE_Zg@Bhv*p%WoabAhZuoKTjp^_=~}2%#iBscJo0)m8l@uR{Y{8AP6@#AVw; zN(AC&-Bpl2&<)lD6&_4OwF_c`Z&)>rQhgoi~s3PAEuaf$3?erfW;-{Ve1`KO& z5zAtWSV3ePc}Y#wXZjuR%sQElv+5o6ehLBZ!C7dKq;3#ef)i-3-DdSlU&M08ALMoi$mgQU3N?n zjM%QTk;YX!5JkUqtHcs`yeeCD&*cNy8HAv~oz8{4p)kM3naOU6GnCE~c{Mk+i+@Wd z*9#HWlPrYltD{|-z()pYfQu*(x;L6jGo2}!c}hVepB2gaX$}fUo;X-)FgFKc^-@+S ztEv3tMErQY%VO+Iwi&6ckud2lt~c(F(??QUeX4;zi3}5$?bRa^(Eik3Nu<#Sb2oa}IIwdeOJjdu|aY zcR<6yWz0E(I4JmRg|K|!`Yu8?2Xy|vjwlGXct=wtY$A!54#TlBd-{>m%4Jse(MxDEbE0pq)jg#{*U_H-%C*NZy`5C3I`-%3S%d7#s6r1871uT zSK~Eg@`uIuIvz`C+ikWh*jsIHy;NT4nj`bcA&hGo3b@bQ0P?v&xc~O0q(bh{aW+pkE~YrT2!E+Solwq&SEOg}tiEJ69^6q@n8w_Y|r^x2aTRN|;YLHhj^m zEUke?wcX}Sl)qu_u5(A3i3;RZ3}dCu7D4j8teE-GL%>aA(^V1B9~4XS0t&I)@;Je# zHm)M_HcLm1nnulz3`&{6_`WTMqC_pX;#R*5N;F!L(%g$jlyx1Jc*_3x$Anbt(?^4d zuTwif;r95u$d!1^E8(6F?r(0F`-9gEeI`Oo3V*;eV?3^FfcO+xo>R)c?#9Y>wB zTD$0cAAYecJ_OtftC-@3gpO^}I3qK{M77By+KN2DOFxa4Jw|B-YtqQ&roDAB7_A3d zFswGdVxb5zjOGl>zK5jE36Kr&P&##yLFBOTpW0tS?W71l$rzSS8hS4-wZp7b+-rn! z`U{8LWfEnDMjd;Pn#~3Y`~aSA<&@C@H{Ea z*!+Y4vE!5dSjFA(a~f*Vcmq*W&ne-zv=0?XJ!QcVQ#{S^&mWQoFIhfmr3K%;R^7?; z-`0?_2(TCF{XDw9(h{Nh3p`0KT^3PckY?Bn2L^eI^l-46tX)Ga%U71_f%Py4t`57q8RyMh=O(LYfyxz3J=HyeqftqT_d`JD#bHIq z?{B?l=(G=Ry}=3gBj&c=y(@|LXqimMnp!+fZ3%PDUwEEu+x`Tt)X@McP~1?zMe@|I zsn!Oxg8^)of+1IuMkCdN*Vr;J&PjAE$$B64i70aYhr?dlM#M&d!imTCUSOb1*SGO_ zM6z;U3ex|dro<0L_8#r+Vv#5(#t;>8lO$4XZz$$9stX>|Y2IUVQMVuNaYbC6IlVZV zzIq&`2#lzJTG9_+Lmw^IfBA&EbV<9~FMBatO>FNiQyF~4tb$bt;>^{CFzB^V&Xod@ ztpd7*Z+Ps8HOs!`drEqi=4CSg5HXwiC;D6hUu+|zwT zygo$rRuHO>z+(bNE;h_0LK`bo*EfhbKax9$z6;^^`6f;EMYZX3Op}Biklb`^lMuuN z>OOl!$|mqYYd|2LAR$s|zfI75a6}N;+l5XssGB(@J`~xyX-HEBb!B9Ce7Z{C+2H@@p_HK8OIg0yYZ7LEkY7+dSPT$RC=N2jiY$ZLNdw8CB7hhLU_f!LZADi8gcvS4~x!Ey}Hx)~T&eo-Q0eC$< zRYDR2T!CCW`av{IRGU~5tfFnH!_g>ZBofOca|)a`e699HO%vjGGxC1pec`yRMd+); zg*U4LpB}qiuK*+6UK+lo>aWH9(#@TdSLie?xqF)2kv)hgpA>d7JnN&*k2FkWetpRP z{Evq@x-Io%U%W$H1vx*9cSW>B zs=;^V_-nDOSC~7#c)P1AP^-#@$fP30zw~!#7edZQ9#|?X2v^Yxr#E^-_E{do%i|@m z8F@Q9-2sx=@;m+>&Tpml1Q-tGdGSfUg-;ha;%>w*|d zlc=PNGhls>ky!4jA}fPNsX`GbgECmg6ioC{>Ei-D zOhrsswZMTi?|*o?|IQnTZ1hm{Cj7p>#@Pl5C@mKiV94_;h9MfGZ+s|Lz^4~)9a@1k z^k%SHgStsrwp4rnoqmg-{^9o%U0n5=zxzOcCwC_vR$Xr5AGf=ACPXjI5Xu!;BjfH!5?F|TfCx%LPZaG5 z_V5;xL;(p!YJvztLMNe069f@Kdhfk=mC$>Y z-aFj*KIfcq?mh24W9$zMGRFVg-h1t}=KM|UqQ}gb;Pt+Bx)9a%l;_XKf@*;Sw|J`} zW}O3gaa=1w3Nd&Of&yMwvfpwV)4p(#>oHX(;r;8CN9xMB(gq-YbJ%fl(8DaB6QfSr zoi17xvC6prbwp#Y>bbJ^S^o+;@Jqp=(b@Bk06GQ_z5MO<{DQZetZ%jj%fZNI@($ch zmzhPnR~w>;po6RF%E9G+>_nV^=}Vz^>#qm8>Em4q-?r9CAu{;p453c8iehe@a>3LJ zVa{Yfc!W2KZ8fJ<-OrDhM~vp5LUK%!d@Bl!%f8pF9z})n5*P#y0Sql0nPMA+jlWRs z__&M|{Ma9ZWULv0<(A!RZ^QXI8YBg(MoyVPsUO#JsUFcr--utK{4)P1vhv`FtKvoE zmVB+tjgGFv@uz9&qh7^f0{5O2JZCb zz)?%Sdx`!$%|2UMVuYnA->M@_`+oF|xIt7Je&=RF{(|q&c1t>EfnNwiN!Me33%^;` zqRkOGwR7pcA%UEfsyQg`*|4>(v*?SwFB>VW^sH>D0wbAh>Tp%vnm zC^-a}2V-+l-O+nadV<1GDze#lYZK5@(fwy>luA9CVn|}icI?y}cEKVDzn@ic8WAOi zxks7D`Qyvv8r@lZ+`)T;uOHdTHCi2-N>SLVW`^{rtq z!eM|yjZT#PO8<6k$SW+@;|=L>Vqf(&aM7Xx)u66I@)i5V_a6w{pvS$*J23ChGK5=m zs)vZ>?%e!R`k!`mdNM}-E=7~9dJY_Na zo=R`$d2xHhC^h%fkpZ~}d{#Te4X4BOt9_eX66^TZqklah8_g z-2yaW89-)CacO0YBEuk}Dyut0arb25$~(}%aM9~(&IN6Gp8#qiw8k-$@=8w4{!pl4 zlD}x9e+HxZr>ieonC5Aol}qGgM)77SzPo)mssi&m!DNgEudJs;i4-bFJiq~UCN;gMJ&eoEz%G^@7I zD(q?tMVF)Gi|4e=Edc`;L>igic#8GZv-@!FU6hu~aLQ$qL(TTpc?vh^UA|6)|M~EA zJLlk#Gh*H$dv|c;3d2fP3-w@(r7vy)PPvV1H9cLEvEM%SWs-}V4^s(hjWr?h0QQ-Z|E)~z0 zn_qcU3Jofn^{hxqbJubUoK9SyOkGoUlrR^}9ZuSz_6McjMTq`W>~rFUIIlJ2_-fXu zZ`}=GRqVnT)}A~a`(04@w>8Y&byotVL*GiTl}L#F(Pk45Gog8$iq{}J{?2`N>`&6; z!lkcnubg1s|9u1Ne?4%!cFIkF<^QkghRzY9_;h6`n<(>HT^A>tnq6tD(w}rks%oX$ z!IM^w4LBk`mOx1a2vTAt3+7(w8!zpx_DIekt$%-iE=t1z$FjHI{|^n|6@$N(YH0Ph z&&7nqc@(p+L-uK$o+TJPQSeM4Q~($UU+`LuPNmlQ{%A*6yIfca+?=~Z77b8l4ZI`m zV&jqiXVb+{#n*qQG`W=#z`IIHkXlc*V8X3SvQ9bq(~CciY5L((V;w2HRg|~nAK9UE zArRUvQIZ;(5OMgT^$V&B6J&vIzfAOtiBdB;j)lPUZn|z~63S*}aDVTWv>L=KnyaG( z#)yv(cByvBVh4-9wk9Wvrv2&vSYcnUXuOrMk!?5xlJMy_$p!6mm`HHzq;6R8OjF=g z?nYJ8F35~Nn->dAk@5g(FV=?xLh9xAM!&c;_u7iu^$&hJ$l9tMEmkFcQMzia@H7{Na;!$ZbKYRKaf~Dy4FAl8l z*qQQ2?AE>f`8B-Uab3bkZ$en2409u5H$-n=%;VPYPf{Rht@Ky5wEbClDv#S7cza+} z|Izv~fE-?P0l8Fv0L2i4G>zQP8Zae#p+-^YYEqFky(Y@)@jU zi3wll1V(w_?RNc)2CCCZ>jcp(g7LMizRu<*x$FK#al5ofa_V}Wx9hmAbRs_P(j2RX zFSg9}Bqd9@q&5A%}k#fKNJ{;A^R$?_+e~6e&{h3|7hJ=Y$hr z0DGWXVUN3i=vI%0%j^7gLUrU>;|dL#hH0Im@(YEP63(mT$$2NA*aR`^r&a(>PUUv3 zALV8*Zs5%7BwYveR$_{QZz(F;sLJq~KqjTU@tNy{FQiuw>C!+(%t5V;q#(R$N{*)<) z$L^DWRX7tKua$OiDzLE{w0sO<%t=+PTD!$RMc zHii#!JsuYuDVz)6%Ih;G=zmu^a%p7UR98(ixoxoa3(tW*%kTjadtp2@%(g)r!acwSkWzsFFtSp_hCL-`bs0JKm37lZNk(lltE;=B$KTu6I@ULg? zl`cWUl#u&?7N(Mtr0902C^v~YI^lH!Bo1|3m~h^!+aAmG{)wnP>SXL|A>?!Ae$lk% zvzy)iuG@8w<{Nga4b1YTy?xMwqpWYL!LGVW)WjV)FpVl(tnr5?RT07F-AJk<)E~+j z@wd|^Sxv02aO!4QtE1EdkVDOS{<1N#_NEgS#RWuz4pbg?$zO_MMi%#QTCPqbpMar{ zQ{}qag1dy-A~Ff3=O2&fo?Siaa%t5+OADpbsK1Sjl^kd)%}ty>etf^}M# zYS36yrzEfv+ph(L{Vg#kQ@$n;S?Ukt3XICitt&Z@B4IV4+H(dBCjjz;o_E`~&?vEW zc*X~ojJcbQmpd+S4kEG}t|B+#e2)Wzo%@}rS+ky0;p-bBZq0gXkcDcL&o<(?$~kgn#%EjJ!#-2d#Jt14w*D#ZUIrvz zHZa&E8^zPJR=YEe60Pd@s{d$WRi%)??JP(M=2%u?k~2`Yugo7@_r&|U*0V21qC*AG z{htosreL-rd;4m&*^w~SS4VX<Y)vjz74cRN1gKVB_tl z)(?0s*=abi`NgE-`N7&7tlJNcekQqBh1+R3j)z*4(6=LA%`n%+Z@MFf{nd2A@{{F1 z%6^M?9DZnY$M!$-Ha$;P!3g=RAO2;A;4~p2<+pYPxU77)m%ZDj=-5S$sZU&);o)${ zmfPtdSN2ppr?wd}q@b?7kKsawA3o{o)s^^Enr6P&@-t4&n4RrkIeK02lN}C+8U?IW zImjYa)+4`c7#{(RH)Y^_uGp}pZCl8*4|GeIeTBQL+#SJ{pVm_das3*QdDmw69u|rF zrmN!X{l`0Z)2Y;V`6R5x{|$+{&2olV;0`*9D%Cd?U!ixS7Jxq#^9O{tLn-6l@Spac zk{`|cZBVPfpc9OJPcsepDa{S2GLKid#Uxjdh!W;y>5Hj2W%{m zF|ciYCH;2dYj`9P_ych4!rG)(4F;KUoHEm^xJeGKj~G2&o**p;hQ_ZlbahJQhS^a%cTt^!MTxDn9X)LajI zyI>oKU72`5dqme;C9^!T_X=vg85mxtAy#sW>+*Dy0t3jSeUYi69tCCxHDNL7>Ohv6fuxt&NF-76lE z$~d{{`Z^)rr^-cvG^2)jHoCEyjx@LjtO?IU-~ZQplKR`z?D8q34>j$rC-wC3en)(( z@((Lv^waU!%$r&w$Qi?nWrc9kXN+i34AE})Gr@|V+VXuw%mAO4{RwNK3wG-) z5!5p&R64>(JKiQk-LL1;h&&*C`{20Qs!Vo=<|Wc0GR|n$p9xV?5Y7Vh-&Z%&Cqhbc z&J10^LjzmE&{0&!X_B}$#6?|m78SsuEXQCaMEC|Z2mc1~Z7l~(RTkg{lVe2t`k8V@ z1WiPwG$-9xz*>xj!xJX2UyPJS>FXoRDYXwic&I`H1 zACfk4C`oS?7aGTL3Ak#rYS-RCPL72T8yn9oL zXMvPJcw`8R0LPUEi2eTDso4x+YBF+9lYDF?MUvXrGdY4l$EpLJY1BSPBs4)}2IZAo9mQhdm z6=enkUl>}uKSu*`-!nb&3R8#4QFwp&n@u8*cHx|w zRi1r3Ofl%JtxkEDw%$5ASy_>imjlA76!>QMC7NW7Z}LueG*6Vl{v0qwGpm~ z8i>VD{$yLFa;Ydi>iBMxDpz~Ibxv=7yqi?PF8Svts=4{%kWsI~z>mH!WxJT^f}gT* zTbATaPTTb+Y&m7nizHhV)L#_)nZfBla;z-loAR(2neq0{kCo;#3Rhm4tWxuF@!yhX za@UOOlo&|!;rVa37%N{ihppJl;h<@%`98gEls@zMy{C_Mx-J1X1;US23pG@}jXk@Y z=6%L9^)!F~4NdeW7%`H-@q=23aI3e+S$4T@PV;(V-Fva#ACQWd9}OW8Zu zlv!3dLtf6RP*h2IhC#Z-%M>v|`8ht}-xF@JU6;~lpYlXtoT8}Dzkwj$Ujj5=18Yu8<0AskIk z{jfO0`_*vAqHRnvFY;uUSV+DxKKag_8^Y<9w;SL8Z*H_%uD=8bfjETqSlPGkj7@G{ z*I=obkBl^dh89-on~{W?*I;_gci>k{a^L){xcmCpN8^)b`sL@+Rf9s9a^g4Xp+uek zsUB`1VWUg${o}Qgy54+`rW<(1wl(X)v~$vhQ1nQhJZjpIu9>pOa#i>w+R_}^SN>qP zp=ak7?N(a&>@i~GHRVMntoMSX(wXW@saSX!0P?JEkt!H^$F9iHxOe69)Ig8iRg+c- zK6G#XJ3H@6=(*WnjT5;EL7pS%my%6DVT@i!DcXff6%}MiQgr{NywqMev!wQX@|R8g ztV0x%SV@hCKB=!K-bctnWIcMy;NO^Ne`aaEJ>(p2c@|Ul6k_pK<59;Y;Z1xchsyGd zIHzdlU9J%*lV9pOWwzwt{0`iivqHa*Ks>~?0%P}qIMiOb1*G0_{Okdpr*GcIOPr z3iAR5aYV1{lYm(D%nd2t!9SH-UOTIrbiPA%8_ItDB?;m_n$d3-hqwW{zkiF72Z<3n zb=9vCpIbBl=&BkT22Y7RNNfbWaX2^=n(@IzY&6>r9+sx@t*kFH9=AtPM885VyctSW z2Jb~j#o)z}$obR|M)s{}{D~@H{cM;Lxo6zk4X`jG9rz59JsB3n3HQa10-FR@fM2-p zrb%5(rGgxO2o}*R8}!p#DG{dNP0Tx+q}`X%m`xK!3fSkM60mLUeh$+~s_k*k=SR zUjdFVZ6$!IuC>&5hulqeo90M(3J%kVf*#jwFVf|%SO!QPdah9;FV@s+mOoWrN!!Zi ztADq|E7qRo`aEWyC|Y=sdF7$=kk8AD_7QP613#~=aUD0I`z1+ zrWKlsQPwQ`#;O!+b&DR4=Me=VTGgIm>nwA7ZX~u!ppF80cCqC8EM*N*50N;tA`D9S9ASUe@F!@ zP;#Lfzk1|v7H#j#cvP&7R&J%OjSihBJ&*jU-rDYa+oiiJ=A0$g^&Ga{bOiXN7!{Sg z?>0IYJcb7aU6zD=PV#wO^KNqk82fb~ialU^!E{Y=)tm*r3xC0B34qIiJQddQ^7j#O zvw~=SWdt`Appmes#v~TT4vFmJk z@jFTvV9t{hcwwCtMTs8Ay%p$iZ z8kqCzg$O`w1nBVhfxlZN)Faj@WEBNjim)nrOO2se$<*OF9?^G;8?Dl7mc*ST_iU-3 zpEQZ->;XFlw6WQDyt)Ih3aLmd!?{Nt9y{ExJG@LP4s!vh_y2A^0)ZRJX!9lEq9{hz z$*855g1EHGuMiC~Wu*gT9+y8PBWb*hH0uYV6{8ZwOIw`?4$9aJ)S;(9>x^Ud)JwBkDH9T^4&veK``-N;XRmpi75j|Y$R1T z^LRxC&U6C;0Gk$9ysc=DWVK6SLALe_83+PQGS8w{QLE1;iJnl=0aGalA0$Oodd|+? zoG9C;tpf7oXirtM%Zs2sBlEiIe!acC`u5g&@}m zb)HjJO0cd$Y2n%LBW%7dwLQ*K+Uil(mC$$Q)f2}>B__G6c7Bckti#X}bdA^V=b=N>9U6!| zKXGQz4{r-$CZ8USeu*^Vq2&U;d0{dn2Z-#<@@0ibiNTP;WCfyHo*Zl?{JJ!$Ub`Q4 z_%@<$*+UyYUZl&ms@go#h?m@5$_OA$6FPMXEQO+vPqKD9j`(VWeqB^4>MMot^$?vm zJ{Qa=dJB2TF%~n>B=_B=`()KR28m8M%ZMimMhFSfl0U^X^_*V>JC?HcEcdXl=%R{! z<8el2LDHgn(p5V6vu{tny~z&RJ5}!f!mvK-u)O-!_(}jp^C=Kv$x=eDwNwB0*fNUd zY-+N~pB?3#Y%e0|Xu@UWM36f_3<4O#|;6-SiRM=*;@WV-Chk1TOt zoZM_G)fy8iA8XSNeD*cPvSkOKig&hD*%mKvEH<;ZB>PhlD~HP0qD^ge7mR-HD(su@ zY9+1AWQWgcS{gd4?_<}cv!od-ZEB-E74Duay!+5mP6{8x(eHw~(YNQ0tlBqqsFl&; zoA|siQ6h*c&Yw3cWMV&Z=?xHL5V!HfY+Wz>Y&^rvM7B@{d3eo?N<@i;Q0icKn`KD8 zqhe4UVpNGhx`KnlfVq~yHOrbHD2(LP^H?eBTC<9@xw!vUde4Qpjq^C3|Iu=+7S3Rg z$E1<3^R!rAIDg%CcmbSB+%lb3yr4Qm0jkirzq3;ydZXf@rHm3I}sTZm;lTi=HcrnV?NCVElI@ zzcJRq*&aKcm)5K|aAe+p`5gix(QNX{qSgX*#(8RM1SoEk&>5dlSZb zSIZ|?H+f%6>f5FG9;pc8kNpybBtrAxWYqy?x7xL=Ccp`u3%L3Ba(dXbr#_~ z^$bkTDx)+yR)B2K?)7!fkTJ#R{-BtTch%gbFg3p*Y&lf3m8&O(^qCxB{#LE6b@)Kk zVUl&`gSLCRcdD|m**7uysMSEJkg%XxgC0#84*ET3st)6{%DbuzOAq`Wq1;;3S&&kh zksx|tstPan9#2PTjp;P|5JpXpEvr1q`#a0JpfV4Ev3_;Z0NbCk>f&cmTb4PD5xdT4 z&vw>VZZ8a5SAZ7lJlBl6#YJS#d+JO1MU8U4$pyKdHls`#LOw$Ft?*)I5Ie@v@G|tz z1j@1{KrYzid9~IW+cY+{OF~FPdSeT;VUQ{aD;Ax21QF5*;+Rqm-=xDY7p}|fWDf&c z2G~2WZOM0T2u6=y91LP;rfGS-m=g(Zn8xiQeR@?NFBT-pJ38ZsBNM(3%!uy-Yd5gYBv zG+g(&bQQPOK62(1h{e6i+`~JDxWVbg5sjED@ znPGm$abnsnd81t_A@cz@?3QPNW~zCmTu*g#o%hifK-58WpxIHdSlrZAy;%_p=xl0( zN{oPSp0gMDZEU8vR=~~3GgF7czG0`b^{KFzVSvvCw3gow5F&Ic0`=Z0h?fsCC^gij zrIHMS?@FR`^3=hfrq@^8wD?-WSVSxtERSn@7BiDUNq(#67GJ5;W0ugvt9EA+0fg>^ zEtdU-k)-Hbh!py5#20qqNM_OYtsTlA3yi~DJ)OOYq5)4rS01?tWc>s_fL(C9UnsgU#P`6o<|ge$onO2}nMM@T*Mk1|bX`R3pDjj4&Q$@dt~sR9negu1ARV zUtw=EUKN=y%MKlZYICm9|Ei!a_z0+;U*E6CUfaI&O=ff432-JKAA`H>blz;lGea)y zGcj{FVgiJ^w>EYHEVLCy;Vuum+Ss%Sy!N64?vNKtB`z!mV&fKcymhXAy}FC9^ZxB3 zfxS=C0hc+O0{qd8HJO#pedyxAP&tywq@beLC>q@mmNj)KA)sV(a`7ddq-qs=ds)86 zm5;0JbHq>2zX#l`KG*vgcvAd;>dsjwc08!^7X(8`Krl=<;Y&4sk}^R44i-$<@D2W! zpvk5)irvz$Xq*U($25En6SLI^c6kcC#+lBHaE_)a%P<~uQicX0x6r7}R4*C&W5EYw zJqp1|mm6<0^sAsZ9vMz8V)8x#k|PKKDN2Ouqc+TQ3EAbEzJNC<_bQi_J1#WCca=ol zO+@;((b4C}n-zG>MxfppAnN>hyCmmn136Dt*`;W>yjQe4{ZO=~W#f{&KkA(U74iec%tS25H$l?@qnHiFluCHEOcU{Wh}^Te~BY@z#k#?TAwnv&QB$f!A@~ot#`KB*@)Y)eTNd7xcIi8-tygr-D&Oknkw4~ zN4<6tYdSolzdmG>Iz0H(of^-6auJ)KkbwQmVC8;ff4F1n&R(o0|AdAxgU&%zib z1t(u|ZN?^5XD$pH+g4W21wXU;fgo9f{G`|){;NM7BDr)X(QoZ!1jb^BZs9#6*!A5)@fwX0))CmUa1vuFOpXLq4GTqBN~dPYNy5SaKjbbTAq!Wx&gDZ4kiti`wIY=T(DW5uySIAB%CF2OY=qweZR76NO3Oo5Y!+Qjy2C z!IK>)tJJpBz&n=xa$ig&ixoj&3LDj8?!9>xGhU{q`{|MlG*&zlF6E)%&!A`QtAcxh z{dx-5luzgSj_%FzpRp7Sd8XWZf_WJ|u*wPoJ)?!5fe*34t9cG$5TDiN&McJL8mkP@{sd!j$vQUd%5Ck4a@s+h}->ISC%0D!( z^E0cg%82QRJEkLXrL!xudDxJmA3j9Ovaw!Cd%eETga0MSzLzg^@D=hS?WG@~_9fOv z$53SZ7ybskQn*=OBsQWrqAABvuG&$tfLnQWDSw5y6#UnXyE6cQ8eZB>S{(_Hi%1VG z5rQh>Q)g{Hrhs*n4>!hIvVMEdeXdB3U!9$Qf(Ns<_zUU~)o*ea*;~@P`BiLaLc2 zM(t7&Bl*W}4S3AuD4us3VAvv0Om(4lB5}kkG&fbJKET#*>p>Da8}>#%YfGH=!yRvE zyNFJ#%8rt@={DMR?PrG(UhSsxhpk!9PUn55o5-;c^s`E;(W1Ryr2Kf7YEA$JDAx~q=v#57y01DMn zCv&AMlDr%JFu5&qh;lwkjfb_rT2&=K%$(tE;sqkG?pw5BZJVM_gFPxL)2evuCnbYX z8Z>lrsh9%+@y;~4>=CM?tFN#=kBEYFdG|R}3L6a^Z%t7Ly6GiE@0^flE&R+d% z)`@<&=v;?ZirEaXHOXr7-i*4^vi6P1Q5(!NXh5!B$D7qN)5k*|DZi(bk34gWR?}#t zAOqf;i`u*oa^jo03TF})Da?#H>rbiq(5t!U2=>G4zILpif`6-BQQp|6EaIuqEMv0% z=}GziwCBVN@LA>jXztv=6j2ucqrkDEvbL-CEBmzBdQX?ApnEeMpWG4$@(N+wnpr5e ziP=B{?hprRCKNh`@6XKjiv%=!r@Wnjb-iQ^P+hQ7d14)uX4il_CwXRS$#8%Zxb1{V<*!=8~x6q9BWTC&opI`QQwKLg49UqAH z_>$R*SvBE@ zQOQ?P9Y+ee9ShHI;RB@(L(N3vN|p={1R`y`eXWh7)xW60JPGaU`IQ z?>qMK{wtc;g-9~wI--v2pRIcQcdPo;T3xM~Z=ZOMCt}sQb)G1{-y?@y=p1GbcxHrV z*FPu_#(PYB@Fd@6^t)g7%N8+9-$$)>{Y z#$Kd)Om~Nt$Kl6>i5)9)u%kudCFoelVI05oD|En&lX;8|8u-PMHHvuP45WN)p)<+Zkbh%qmY`{lG3&Q$4$%Luq8Qb+p9)x^g3wBQd(nywYNM`oRQogynP`szdL%DVn{ zeIAw5UA%4mMS)qJG94KK+odftxbpUxyGV1Mq}j^l3sW_4qAMz1U;T+KQ&_xvth<=z z2!EWYdOzE@;t1@jQTI~o$5f{AN$i18&4tUGr3}^?6&dhQG}V$=Pz$~!wTzakwz#_3 zVR3P|ucMnfYac5&+j{bSvCU-IhDOyVf>gWN6zWe$COXRH@jM=pVNrXmiH0K{dqO9O9wfaq z#ME=>>xE<7o?itG_+7B@QmE>_ONp^tR^{}27!sp<1|fK0yB+Nv{W#heh)%3HzbJ7K zf+eeY+Zuf_k2U9&c(m)J+c6;EaZ1bG|i%0pG;*5U@tmx~?u`SJlhK!Pni zo2unFzwT(tC+b|#US-v^MFne37`uy=Rn z`)|QgK3}AyyZuR+gB{^%f^C!+^I-~{*#(w6{_*z(a^LFusywPuzA-xzp~`7@bXaO{ zDFsL;^`(Ek?!pgR%}O0P4{uQa(koB(`Wkte7o|Accww2=tOAU_+rKL}^J0zyRy%9* zN=xXt$>{bev$Qzo`<(Wdf}Jp9{qG8AFBDbrPfWHr!qMkNk7bZG_j-2UnEb6Zon?Sg zh2D319}5b?8~b6LIPt5@QONiUc4@F2~+ z_wnPi7S|`0drvKjf2;m$U*Wgb|Fit5q3>NhGMS<;{^Bxp&O%7Dwkb&~?FSw&tsxgq zhuh;>_>8;=)URs-=G$f0^kU$b&6-~^VTU=~cDnO%Zh57ti-+BOrYhG+4>oU=e;p39 zbT@5&hTP{R?8=`Cm#nNk2>l#5894aSMBI6Yt)|)bfm7u^!~Mx1^2>9R5t zKC{M@GUG%GtQ+mwfecuD9;8miu?L)RAmnEFFhs2*2ZYE5J|e84HTPsk`GIp>gl_GI z{W9nl;ILySR@kzi0c#?cUE+<0IU9GoH^xc?u-Q%^tzzFOavdY*I7JOC#nD0_PwJ!U z;g7%PQhTL*M))WGSb;kvz=FlT@~1YmLfJ?*xv-W?VZ8uYR+x|%&>0Ls zTp+UIK?N%rvzMtE8myo$iXxwp-bBl(xv~d533F`pPE*C=wd$`QG)t{hq^+MWC%rrW zQ4!Q|>Tr_Z^HE9Rz+T1e#~&-Nm1sU7sMleZ7K8a8c0o>`PAoaU}YCXVK!x1uJ;ME)=o29=G!mu4rfUB zv%m0>tU_s=2?(sy8{sDK3)FRjijnzx}D;H|I6bC1to z8cU6EaUP`yvzC)0QaP&jo;2FTpT6Vk7c6a@Ac%UK$JIA#xF z8~>W7hRuWl|K3v&rAN)LGZM)BCef>lLD`AY?DMVOYmth^mWslkV{R9~GY0>3^IZnM z$=y80R^USb!O;BV2OKpbclAUwxQDMi!@Ldt{e=pdb>nzA)8nhBK|}Hxp9;(#{ypqE z(~S?rC;1sBFSA{{9}(LWP88527>LB|4x@B*l!9s@na-^>T&unF;G)mYKE#+ z9Db&U@3J+rQh)B100FZw=J+-~__kgUqx2t{_^(l=sUGy9KEzOGe0pSMIJ2yT9DidJ zhZ6bNcfHtd3BPII^8po#k3K+vai{xa=!2E>JAsOro3PC*cb=C)ZC6XCv^`OJ4Q}Z2 zT1}nF1HXx%ci+CoMMN5^=?sM~@&!pYQ47OldRKlg{-TofUuYB4$Z%y1u?_Sw>g-1i zp}Y!w_CWL8$EB20W{AUQH9gcC>orVMO+?kfh*M=Xhs_?EdG-#zKHr&0@JV>~HRz)3 z@OuFN0Msq)_>N9a?XRaocq$=dU_UXm#Es|EQs@B3&1zvfu-cXOcF!*w#VdA_6J=Ih z82!&5<}=7SL_IZrC*uQ?R*h(**m6xhEupu$PHCehjLi~dQIq_+Gp7NH7ZE#^)0|pc zzl+S+`$c@ayWV=_6y_C3`o^`(wEL8Hm`eB#U++p@uZpeFom3uB;kDN=g(O^Jt=zV z=l6aJ*0qFrDY_i2M&0T5+;W{uSW|;sO)f2a?XQekr?7}a43;Tctmzg^Mj>jZYdP7y zc4jIuwsf66rWeQ!>HYw*nfg?)aZCIceg)G^bxFtZU*Do&0l@23b$mx-^!?SX58$vx z?;vgstlU}u#5N)P9_&$9~7NSe!&hD|--&X}> zUir%V*FCd)(StgFZ>f`W!qI`^sb|#xy0D~93Bh@(zU|lEcQ@#wA4^BCWTs)owBJc} zE#$~_vp&)D=br9A9HveFrlwQ9tIy0WLVpR<4r+o?a6A0}+d+|y7*5URLv|`m6dfJ| z4b&*tGp6wpuMUEcj2Vh`AN8k-Psn&|G3A>^pSiD?dKha65uM|i-JZPTG(r=`Z4YjR z>gWDPJ>5Z=;nJ1nMX-d`QJ~+VpL9Q-itFAc`?V{wfIsglcvJDXJNOpsP87lUZH?E8 zt63#8zWd=%s6G`rwt5cFf;W%t5+i-)VdGG^b3Z>c}&PqtA+ z;^j5GcO%akbL1}{YB)jkzg$S8qwWh;HrBiAIs|Bj%Jsgdq}?FFmNXxLPjJk{>de-Zyz5&ER8e|gY=W7vcNLz!B`Q6){eLz z#>TjKbCMq215+d@4Y?`8zc=T7E$9Mj<|6r`OWC`Gzgr3oWG3t0R2*(i$wJGSB%?Pp zIN0wsNxbe1%nTPXrA`(KuV>pfgkTv`Wygz0m3-X4n4JDz+2;j*oU zcJpt*Iz3KmUvE(WipWrUmJ>6$Ce0}dkqD9j*@C?6Z9m%K$MiH-(tG@vb4S5!j7yK) ztQjXsVO}<>7(4><5^+4Jn|Xheo$L?~3Me_8uE=N$IopwBK<5LxHceud=prqDxO>HH zM}5;+5D)4>JOxHjqu*{xxN{d4btZv#@Jw~NDGG2Ryb=lS)YHR6f+-?>b@dd5{K zmO;B+iX;OL>g<}x4j>K|kxnku?e-6qFa6fbSm3Ih6MA+t^osl64_;sqH*i6(CLw8x zen`rDl+Y;ss%iaVo31FUApSr@w{mW1TLygU4lw--cOC+7#8J}bod>m9G)#;8wgS$r zhQUI*^1p~886#tP!c`l@$p4-XQol*q7TB8*CqwGb^Ii?H<;pMHe~(nygGT+XG=Icn zuXm#g_x>Qb67{QHg*4M?#&tkG)lGg7KTcw$ssxTv4lmbCe(J-D!JdH+F~n>UeuMsw z=L|xdb)%fEcT+!woWxFN;SGn?JSfvx`Ks9AQL#+1E!QXA=bA!4`w*0b)k$yb+k$+L zjG}g+;fQHYag3DLEWzBCw$7@Jxwyq6znRF*!@V)wMAFq~745VLuGDv(^|oO>F9C@F zG%6@lA|K8ph+NYxIuB)UXJ(L4}1m!@Tz2$o-~5Z z;dt!!3l)96@14~hyHSR#2^QJ^Vydm0SJxk(tsq#xhtMeCIBh1@O|X4GP$ajbkg;}W zo3;lZs&Tw#jl1^n@@-ai>#pGFFU}u2X0P91OWCKdr+6BN=tnZo0EgV(fE&@pzUAx_`tbB+H); z71NG{2o)>O++MU<2;9= z7F&EKNV7|yy1D=g|EHY%@89|7??=O+#y)S2a1ey;CDZO3*xzJ&N8$ZJc|rQ>-?^2S@u@mAnKd=F5E*4=bewGY zHXtW5^Ob}vI~LASH&pOI7^64SnP4hch6#C>R{cv7*OM-Ec>WMvE3xOY(&;$MK@8Lt?HUQCY#2R{JV5%v)YQiHfbVIqCB zUTcSAX5J~q8=0Xl1;Llox6A~6NAePn(A=i@P!(}#X#g?Bo{wyfGVDBrR{!pKr$Q=t ztoK|+h9`{jAl2_mT1a*K+3|(KATS;P^Wfj=S^{VG?+0pn9&O@qPBn++QF7>2^eYA! zis_cy_K-X@#Jb}`uV2A6uGgPq|Nk)d)?rm|+xM^_3W!Q7N_R+?N;hmuq#LBAyGxLi z?%qgCcSE%(L!hd)1j`nXwiUSH)( zUqcMNWt&`cp(OtlpP$oVM_pS}F;|{laS$XqtITv_UaJu2ERqYrOO4k-o+wbYJ zhRji!X-zyZ$WRHPE;4aR&i?lN@gVhK;AM=dAN0V<>X5F=+wP$g&d+jL@)b6*a_S~7 zpUpSS8#j_URH1>5IJa zBJhInm|;HKb-5yd>x{QkS51F_-m}aZfr3tY>Euk2(pV{#7}pb{r-kCL`2AiXIUqv{WzOFvs^WQ;VVDOebu9jRu|sIZ=w?J1tpKLMm`uqEI zB!lu26`nLjP>6O}EWxS22e+%sV;#9vhSMFdy-|d4*OtHfdtei~&61qEVbamLowO!- zL4>#M$?nlJE0)Mp%!M~q+1aHY*~BD=@4Miol|ogWRs(2VTup}0WO12H9UTJ}ETsd4 zMzPh~%+|#cuU*|mw`Ha4g@%QKL=u89-oJJ|NfZgDwZO zl{4;sw9M7Weg_E?{wDlm>Fx65>jDq4aXYA$)w z%TMg`B6wW|7r7Be8=#t9j$xYFZ@VegZK1yfwl!0#XfHFo2SsCem5ECaBC&o)QOi!c zV~51AW=w_HlvET;<-3C}Y^7@kEG{eAP9?D4yYHAZ~r zPu@LcXIg6FlOOboe8Oq=}$BRZNptiO^W^ntwa-p#2HG4l}`xepeDTnXgD^jBDtT)Z1s&s>3l( zPS#y*FrZ7J zIba#$k=($13t1A1S_0C4>nsLJ{}4{MMvbu{QL!<)4b4aDB1g&`- z*S^kJ>V78*0v`6H{1_|TS%LfdNBv(`4k10HE@DeMX1X{B$4d+?hr(0#(6S^<*Suz$QrYF}ILEL0{IeI^%=DJJw##vn75RTJ~lpAbUuMZ~ZL-5}H4{^l4u z)$!(rov;>Q>7QN4?rM8G`zDN%2&5pYyW#T1B` zT2tAw*})XmC+vKdew2?nT|m^NzQ~Mx{c35Eg0A3=W3q{23-yv4Gut7G!gdqPwVp?d?@q~Li zv(1#oO4W?)wrlUdZ=Xz=6$kcjb5%t8Nh-e^_bBTj-fmblN=GW+Gquyt`*m8NR_S{~ z96tzgt*^SSZ;+%tx>08JOa{GV@pdo9`-RGrGIM@4zrOeQ^YW55wq-b^#!wW4Iv|&p22y~Oo~+T~ zJ~Eem+c6u-WfYqs*VcSQI^GoIt^9Vdh-!evf6t*HF#0oO>T7I$7cLT- zuR=0CYAJgBaxk$bv23t=TQ)1kmP59VLi(o5cr;(%hO6LlD&?qIOe}>+Ztf1XQ&jr9 z)zU}Q?$LSjC(MmGULDR2*+C}-@2}2F%6iAMb zk+s<{$i!yIh%u1&z|8QYCW^}kWU^#!H}@ZoQ{JGSAB#vsu4#gYWe1rgzVCHeqF+Mb z+=eh|#8!p27A*z^s?4U0uP={LBUS@>Zh(XExG16Piwl`-^BE#vp6g*b?Q*h2lE(zM zVZvnS2c8hFrPHVQyC?!HJSiceyjP5poY!Z7*;irZ(i6*2IPqELYPFmH;mQA-ocx)} zKA67{d}P89%e>BVNvGGbh}*oh5C~}yLZWEJS_t=$r)WLq09WmFW?bcs@Rzy&xxzwS4+r zo#gr~9koES{zAL)HY$6k=_P-hyefj`pvvi)WmsgmlMxpYMszT5KcPXu3sTdjFy^D4 zTj0m%jo{GMYRx=z*}K~Tl|*bN(vFrt<=m|sYS>@iF_Bhi9M@OHa1}!$uaDjRh32+; z`$ps0j+4e&&pgH+e~P`VCHvFr)*)%cGv@Ioa#aHBiN$7LayKvH%q?U`Z2}^#GA_|4 zRxc(_R9E{rWO_q6(Hv2*XkV->f4)5r)$nM3qBy(C+uXY|N4UdmdhKl2Oays&^D|bZ zWfU38DA8r)40`gR1o)$LvPOiq`_(FkEB0Wb8<9Q9NKjo^L}5>omGZAb3Le^d zHe_ks5p{{g(D**`JI6D+*O^&b-8b^WD!qThl8M66fsd5$=6re*QUB&)4n@odpn1o= zV4RU4A^lx`d{hhUIq3WeI;erc#gjo~G2?&o;U2;FO6S`NJxp0NUXdwOB*gOXPSk(j zwnN{0$zXO<+@0Y6tw6P+6fAbZ(f<{A`5JqH-fWVUf3L?`MA4;U%4GDL4C&_1oG_1G zinU+2pGU>MC4%(_Z0UrgRg7&3hDN>9X*X%Ki&>A|dLp%muNO6xjwIr;I6Nu0LLp?) zQP=R7o)4gC;-syIzMDm;*KWYpX?x8>UsP7$bbHDIxcEI@-aUW%J=dH)?8y|AlJlZ<);YhNVFqx(@lAsEEF@boIvz(4giYcOCR70{bq*2w7^jkhLOYscAeyQ96&pjfkFL zFO+4Xba{8**SsUjOM1rbxPU#InpPsbx zpd|3%>XGw}Wl<{p@p+w6p|Vh-FZA+~<@#rwpSlRSaNL6X?`Dm9=L$f-zUN)3=5fvD z^MvOw^)VU_Q(Wjj3ct81%RaSMZ(@4ZP0sr_mE{cqY@#SMmWS@|DPS0#LkrguC=Y#9 z)$$;z33_jAOqc>;1RY8+3h3?klW#C2b-2Tm>oRuOfUVy)H{BCr3aNzhlQ0w^Gu5i6 zMGhy-9sU($O}YOZ8DNL2T+L9Ac<59?DXzJY6B@;^y5P-!GdXiQZRR$+Yv$*cC}Ev} z>&@Rowv8oY*VH1$e~}(_VITWc;`WVEF^=c_HtX8EhQcKJS|KNOebof+^HRA2W4h#NbTgVgrAx_Y32)Dk-j8zo9%HY0j zLV@;7?kZcG)*LKvyD&_>JGaYnS?$Abuwcj0lR~75l!-eXZGC6jvdkvlDmMw$o3N(0Jec634=!{VIMQbT zCQp_i{nZNzA zltm^o&DUz2?b}~^Eq;&T&;tdVu2h1do)toZBo35-c2xYXvYZFF_bDHst*_X`My)t@ zsmn2V1j!3tsJz6^CGNkz zVD{JD^o`R5cKnthu^%a;ZMLdQMvJs=b*+hYombYgKNpMZ=udk@(%(9xx}zhmBd$lK zxL@QH>~CL=LEURzPU*2FJdiqLaW&2|!u`K6UX*2991`6}RmwQ>qZ^kd=7_i_zM=1V zbuM^dyh0nVA<4BAkP;u-8TFX5BG$*^_hlq8{TC5g19E9ra{T8tc5%Bl5PGTTSD9{1 z>nIEsyfZ$d8vI9F3r3}^;;o^0Y=gNj9CYgiWQojA7#gpv(K!5`f>jXXd)l{zZb63_ zCuA1p`%6P@xA?p|G`j;97Z}HWyTmyW-V!>7VL}>;%WN0!@s#}}0VE#pj+}%CDNAVs z(kC>U$c&=SMK+B6fVW+eL^|1*zGN24puqmYl=_<=;`JBD0C-wd8Spfw?;Ca|kdy6# z7At2*o~6M!Bd||D87-K~1B?GEiOM3lx?HuD$IhC`=K7%cE%LrK{gK9E^!gX>do9E8 z4-Tf#q+^!(JYMG$nYis1pL!qqw4 zeXEq&ZKI?N*P&2pE~_Z4epSr`_i##`*L6!6xH|`i{ZMW%qJW?p;G7uts1`JOU|uuV z^8q>jF-UorZgW14U8_{cw_kaWegOlhsVWBxGzD~v-G_wem7cs#o#+1}s7gOi@np-UU!{aZIR8Vc0RO|88XH518n5Mt#?xE>nbkRy zxrTb~eIY|!ZsYRhgXPS+?6JN$CQ|>Lkvt{TfYKTbW&&RKB+8D_CqwsEkLbJHx$TT0 zt@pys38*9 zT=BsXoowoFsa%1jD~20Wd0qkM%!vd2?k#~`R53HMz6#LyBP$@;4#HvY zdg!?R(Hr}pqS!{!PkKEQ&^DD?U|qVN8M~DhNM9P%zWK_956^5L$7Vj`H)26wWhj?Z(|t@M^+KT!ZW}q2W=&_v z#BO%r{5I^qGF7UExKw0+g5iym6d;u9q;!5Z-sC#e)>dRG4r$DlRQgIaRV;JwiZm-#t;)hRjF^4J;DkYiVWYBe?EXd62T!NkEUkF zi&nb%KCq42_ zWvJomH%cO#NeuVt)uE<ucRq6iLD}jT)X^U4uHC2h)lFaE_J=dzC5Y7ilorK4CNDNrdm&TeYhUc zG8jcI_i(}*Y>gtO#)D%C&Q3kxaMN08ekE7A6|j@*`?rD#OD~|!=jJD3dvON|4TlcN zM+kGxl1?GO7+3_EuQU%3j=8~$hTxTOYnlZdQWaw72Ji`>y>BuWct7^`&I?M^h5&g# z19((4B}%EJk1(HLL8!Rs!A1x^=T->kZaF)&K^1ImcyYRQEAj>`zP}vy838^$Q^1%| z4=8J&bQXnjU0G6{;t>)OW=xi9?$q=n5?;+=A1D5g&uJH9d^6418e8EQ?QEB15SNLB zNP$D-D;v(;kDUr03=pDXr#BvC$f`bzm9?oU=5Xr5nkv-~oEa-gzpmB`PyllSNNLC; z{m#dmeyk(C&@|_Ed4(Z$J@MPWQUzl`O@pwua2s4&bGknNQ&1CX>JVmR zQFCs9%i~%-k}uOt@h<5Dq1#ca{z-#ut>j%BCtxu$6xouF(QLAOK`@?K{}C@LA&;q* zmDK{r0)J6c1_gWxAidcXGuZwZ0sFr=@^6s^LImH*&7WG59c@0>F!Sg+?ME;^Pzw4J zeu0DR+(uw^EX($0QRCB6V*#zNJA;{lGtQd@F+H~?18F{H)71lCp3@mu&DtlDOGBHS zkJerajkeOy{HTjS!@i_S$92_(~4VH0b+P-8>#f{ibc9_WE9V^B_f;-QHX)e&zGryXR7AI)ULfH}Z4H?-L2qyA-D!YM31T zZ@)a}$Qkv!u)4uk|Le2GP%xoH@qH~V&=eQ~SL$_QbVIpa!c?4inL2VMg}?=+H7r!O z-=wQjroUAIW<=e<8td436(9HQ9;OQ@V+)3BGTj}VkA3g{h3()WxiGE~wLo;_%kSU6 zz4E)7w<8oHFEB7J*JF!uTvl+>@BG^>Nqh~i=cYGxPOlC7s)%!llIV+0N`Y0{?JUtz z?VbM=nGwADE{%G1F+R8R@V6f={eY(PMVv@S9CMPALeLQg%Km(a3D=!RA&d{9dd(FK z`Kb=*wB{Q{W)YXLg6%zum0M1g)A}RNL4WRKdx}o@3l^~%v1jc$Z+dSMyA8xsqwZr# zugyTEOuEQu&QQ8N5Io|#d4LY1+4R}|YlEJ(+jHp6-#^Pg9`KpZz33Q_`^{m^q3G!9 zhaD9HxwvNI#Xp}CaJ_KHWNP0)dW8w2#6YHNRhIJgeusJlP8YUHii`l*$^WZc3Ot6n;%gQZIQUYzcE zu{{4gkR`;XF~80xE5hQ4YVSL#pgSMo)h)tPLLNMNfmnLEHXt3;bvlF^ZH^U`U08WftJR0-}fD^n44e4+Ra3HZS4#dqMUZ6K&+^;D8Wzx)-z3c z-bcg`tQtYQ<1PW<#fkut7nWVtw#XRK2M{Bskq-{gSkW@ept-Lj#)q6&l2Ksw*GB8V z;yf%?zqMZS-ySa^h2)UM&}%htWfX$9(9=ib0%fy&X}ddHAMi>BZs0YLavoj&L?kFi zp|Aci3$%23a#bPRr_+a{S#~C{TlwVXXejJ)INwJ$)w_S&CTA&Byg2!{Wy;na6#fY|=?X>+JXD z`KLf$vUAyH18xI(paQ@3$WrpSGrN64Qg$Rt5*h*VbG+YVZ1QPiRt&owMV`X<$~}KR zNo0s}FtvHGe1hDG6Us+mXZPfMGiNBHq&M-6-{1!jxSs@Mmh3L< zhVJ_jx)<-(sjF;r*ln#OnwJ^?U)|!`pR?N|-87gJ9`Z?t6?_|4;~ z6J0BIFBZ`mvYI}fy$8|i$g=35E&77%P zm1%|3>=@92O>L=^<=d_g!m^fHgR2vo#ik>2+01u`+mla6xp&40GIaRP2=cPw9J$Nm za=OZ1OvRjH`6^9rz+uI?fvqv%MEm*gT@2~)-ME$yK}X`#u)NSP zR%ayc`Xigwz6v|uTT@Uol(Y1`ZSL!d?O*BFLh~MVz2U?z$CQxRaVu16Y_Qs|lS+Jj z(u%F+jj|O<>7kF$Icou|1fc-8>q3-;yOwQ0=zT{!qr`hRq+UU&epqcW*I>ELpmlR4 z(n_Ao2n-cwtyg+p7N!!Hx3#vm)>+_a4^n*f9sykmw&TBj5a63)pYD-Rc4p*_<(GhZ z&l_bR3J#piOdxqxdTrH&khi^_0q`Uwij~=*=OZvrOr5bC(`YNVbvh7}mY*?VG3Y6# zgJSFt1~N=GhjQt3E9Do1M&TsD5*W+2-{kK4XGzdd;5%~FxD@QbOmJme5poQz3SeGv zO?2CWkQHKL=rxQ1WM|IB&4E1%aJ9+Jf+g;}+8CesM)OtZ9CoH-=7zBPKyZBjGzeux zy|_@VsxZ9t6B390*7*CUv~aa&+393(Y1+-cF|QO}nf&_d$$fn^q}aqzu9Pd^*%nM_ z0s80_)~hKNplVJDe!-)TJ#`!PjpuLs3gDZTwdj0&!ivj=CwS~l$IOMuB)M7Q@vqb` zVN#rG#cJb`Tpdx7-tujg%v_lBf-Rlw(AIyYMn z3)g}XO`!TTEu*9h%ld={L|Up6;Im0fS^{d{$(8_2v!7lMD(yBE6Sq2x-MFQI!}0S< z?dFG^t4TIn`+dn~U;w1jae%}nTd7Eh9e*S0&I^)63oDqBNBpYWV!52GryAT`!eqfn zmhME^D$>|Z44s;RVTxO2>Jtiym@Pd!;pS(ab7bIv&9$Uq--We>=8s6;XF$+Njo1Jj z({37dZrU)HmV+cx1jFt;vtGxCP4^r20gA|od{wZVH-YDq|^`UL|f-xA*tXy-_I2s9N7pA0HEd`?wx|F&8$0y z4*D&DQl9?zugp$x%jwdj#<%vNW1^=B-=f?k@5%SeknPDhCtn9{- zmODmz&>h8ICiQ}McGl_A442!v9DfgGGN2+82(s0cSJRw(aoD!QML9s{zqdfW#@ha@ zLmQXXF$}b|djOI@l~DE0?z+1oUpq6jd5Vxf2MW0o~#UAbzr+Jzw=h8DQtuk472Ipk)P4 z9uPIDM0yPf6`g!_vA%r(8&j1b)SaWF0)Mx0?v?zv554q_Tv2av-&%f+<~db&Ijuhx zh%ikwDXOr4GozPzRgoo?NUuVipnSCXnKaV|gs{Ako7%H=X$EOK)6Xb%5Qf-wIT1~vjx$yVvq>$K(%)Gf1!~JL^;j>=`2<-Yo>z!J?aWsg!6M(ET1-do+ z4j&l2ngE)ZW;?z@)QyCR#-;*>+xzg;w?7?@p8bypBp1Y&E1x3}>Y@34w2$Y~G?ClI z9zt3mS7nZ-bhmGSu_m_0Vb5Ruj#gtPM23HXTQ+O#qkH#O3x zEA{q@vLhF$WQwh!w3qLSG!;v9T3fhOHtr^)zy>~~Z+@tR`yPG;!rd{j6icI2m?Ra? zHDNrQZv<{=sXp&@)LPN)H4V~*bs9w&m(1zAOt!0 zXyA?W$>X#Q|AppeM=;xDFVN;tifG--Hl_?lcM7x`-A{geM#T{@UmwgYu!_vG{~VZC zWV>yAxY}O@ORS@{87?YASup$%IYakE>(1+n5d}*NpTjuJx0Ek|C!S#128dy%)72$y zf}1WUI~9PF^)>NAo|FmZ62pM3VCRNXbW)EA1^$WB|MG$lgM`mn04yx>Dv#%|GX@1v zJU*A>FK}LTYpj<`rEuR&)*f#bfR0W!Ry4qrQ>Swt77Sdsu5npF!Y~eEb+c{qZf9;3 zcb-xa6cz%W)5cjeiv~Tm-lS#=-^jl^lnKKF0WnMAZR!K}>*F!SZ}0gp54wv4M#u}( zD~yKP40;pvL4Apg>T=uqb3>QJQUDgsh+nXw-FeU;(+Gfx)dgz;t6-E{e5BAII4Q~? zwU`2WkXS*xD4Pb0PLWcLPmF3@<%_}Fe#cS>*vzd za++X?&?ofRV)|ZbXOahWTt&Vae=M^2_w4rP>-k|yOF#n>?XUNOe}B^KZ^tVS4UxRGNHQdZwc~0@-h=e@tB0$_IS)N;kN(;@YRhI@MK#guW=hn8%>)2)dtnndaG1Z<8-JcwY82&%XMYMSmJ9YIW z;;e&EdD%$-mFn@vW9_pf@-yk?=u9VWjh)r1dQy01K_97}QgYsjA8YVE% z3tO<`y^k3r6ab9ICa+PsK7i4*a^P7#JiCu_e0S*rR*n$K9IvK$R35DlO@#m!BbK*A z1D1HYitdksmeFgoNh~3STrd*`dmElnC3x}w1NoDnxxj<6z69u6)qtj~sU!AkPcTfb z>hi%R>Zg`4M8{D0fr&Lh-X3n|W{mX5q zy>rtRtY2F1FjrA-H0V8su5n&?H%*!J6rp-HI`)yo<%y494UIyfDJqv`<4B>xlwy&J z?gNx(rOBN3-mfI%>oLIo^Ogj@1Le^7i~l3E`P0E+D1fj;NG}T<5~pRq7uUF)ns>)C zq<~rW)nr2yY+67t__kK+QaYMOapAICXFNMV+3ihaE1M`YR2u@mt~)L}C02{=e(RbQ z)|oJVt$VQ(14srdz)*F{yyi#CI}vmkBf_`BC{PN*hJP~mO+KMqCCss}Ch1};7MbgJ zN0o3n9gO1?NtT<>aHs()rO8%SS85R4CW`fmq5$l_r3eA7@dyFXAo`-Ac*xjk@tO#u z)zxnkS*_CW#~XRCq}YoM=$#1m`;&8nQ4U5-hKuW6PGL%2(-;&$*BF#=nm5kSgXx^f zawFY!7QNyvDA{FXc0t48$<#^Dkn|K--0^NiOtJB9wDO>2|9@2kjW%sdKzGH%dnq- zUKX29mh4JMmU~D}5mccjAaFB_`|j_`n@898s90kwVKZo&0!z<|kvv5|vWaOZK?wlU zE>lAaiH;k_%i__dH&^GQhrw@XZB}TtBWgYr{be@m-)e>IS8xPtJcm6j!6tgK8um_T z3OOP|nW-9_4mi)gaM-SWXbr@!3dChCrk2Y}IvBezJ>nECf0^8a-Igw9_nU3z?q@HL z1b8z}bytz4B`-GK8a}BDWAJO4HBuIUOmJNOqXZDpYAYbA725uKeC1Bpi0L{3>5hEinIZLIu`M|D(Lmflx}Y#% zd1xja8&4EY>Pi9AQyQ)e&$^U5I%jm_t_MN@8$XAWmx#E|7CpADmg9nx;BbLP zc8Efe<_s)@G1Q-VJ;8bV>!c>b8IVd6i$l|3N4@FEmW5gC!Sd_w^C&7Al8ip+*PV}y zcYdO1Ebv@$?*=zs8YXEk)5sSK-u!X~)1zCFaQB;ze*)`ASl4gszQ>QmO&?fS5jZKe z=X>DD{Qs!1y?=m~cvBRZC}|c6dZ7(IIv6FbR*=AEwtpH}ppZxNxf(#XgCXAz;LB<{ zTjylI3vh8*svu|+n8S#IaUgm%0*#6a&?k55+6WKhN*o~9q+fbtI{r(w(pVpqN8Dy_ zKMLG+2_l}tJu1AtI_ytP7#yR|HaI{WJ3SMe@y{VE(gd914p|wfLqA%850JD z_~(ymE|RE#>BOC%SJ+!*JRaMQ7#FWKZE5*$@;MRu9brGs>yH&dGRi5?tN@OMQwDMr z((jUzZ~f|Df%XvEdz+Omeej+tVa%K6?(7VK>mHm$Bts+xKg8m&0*=}E- z&X(zS$4qcqG@60D@;KW6>3M}9NL3F!v6Aasb%b#I?#$r+d`;;77($DSi-PRM+f!AD z#AW=SAI8wR*yEm@uPUC@9nt~>h&#81|Nu^Im-bC#du({!ZDH`fnc@0138XGonoH{3$3W6Ui{gjlaOnfBh$!Jv@lo zpynRuB^cIhG_O}Elx^iGx3DnbcB=rJi`tHVf-*yGcXn3|AOw&&7)qoQE*x;sAS)e$2ywY+oc5*?QB>imA}qqGpr%*+W~tpB$CQ4%^z{hfV+%to?Hwjb z)nKm-e+!3gYnfQ;+!`PxD58)$fIDv%4N-oc&wH-dnKbbb6-SR8tjg|;q);1*)hxy5 zv>y*A^#e!4MB993MEj1g>51rfkFrqo3sxuPH=BGK{jR9di-M{xj<$-)#_P%gjk2~` z$7?&-#UhuC`{jPNfCvcoM2+T*6Vex?a+sbjukExz!Jy7o1wm>%8Za7NknoYJMo^xjC3N$Na594`p7rUnWq9xL7tu)Na&;&AC9wvakop_3CgUOyVdfQOPWr) zW<_?Tliq5(*zZ;b>HLyisi69r(nTO^( zpYE7R;k-HFzj=z!sd{y`Z?QOXbazcw&5Q8XC^y3#LI4zxC0#r0j?di9B6yOZ~>&^VX z2*Wo{ghniY&>g{+2jKjGyVs|e=m+|&NO`8T$T93T2ABELgq-`=rzabEMHfW&IKHqmgsdxOq8UH(s|rmHKKO-N}x3s$OF*f z`l(*C-uXF$CRZQ!!(G5ao;m9M*m(6yaR0TU=S3Cn zgOLxWp}f>t58YPgux!{voby_6xNhclOdK7#k@FU`X^ipj0wqH87D#|fyx)MQyv%0> zf%xCLJ-pu)&!S&C?R0Q9Zw+b)L5#V2kUX2-I#+);l}lZ0;|%n}L2bR2HzBwR4D-yVZiuch~FFF(Hjx-X?vm%US?0@cBu0jpb_?I&;f zQ%>F3tkTF^yoQ11|*!;Zi7{^%s}e$tBZp~P?Z0-`Qd6AQZUgT<#y3Y32SuH zDC9;hcPF-&>h=2mJeGKl^7&Frhc6{mx2dH~3RlB%`D@MH&}Z5LUJ~*8Wp}8-}A!dWWsPe9rQJ~*saf6wg>gQlv%ml2`HS#auudH z?APWo8&e#ABL{hMn`5?xR#j|{P9B?#(LMAY&XkB%rI064{bKyiBrMAr10KlXRJI=v zsu#in=ljVIqSM;S^D_gYZiD^xIK@X z3Av+>cR&MJMO7^FsreIF_fQTf8-TWAzW2w_C8F-NiRuVoJ?1Gh#l{qgf4}$jbr#vt z&5;~o3q9z6R+x?T^`-DyY)@7m|GbKN@zxLnVORH{1u#BlTjM462TNiw-H_X8RS_kJ zt&p=2WA*jd(qZSjs8a8z@E&;CY1LxHQM#U?0<}r6%@VjZilD~=`l*3vY+4?RPh!=m zP0am%IX$ta@abbU8XO13uo-B`*l(@L(0IQRj?y}>-kGVLAb_OugCQZa$?7`i`5$m# zMTp%`7Ql6C_I?B!iAvnX$lZohXs9p&zrf}%VnLYd2bwmCtZRZLfS5jsu9Yn@Ryewt z9-4o{(qFCK#Z=43!Tp#&y1O0#M6)K2WxsFYsZon5SW=Oc(mNxO7!;BpgafgT$wmP` zt1L9_fY4p|KGlm(wY;Ns);eyy5k>bKGE-{u0gb-am)t1%nh-FFP|#hKs+;HAt4XEJ zW@`TC_^x?*J_Pf`d*qT?)Rt`?2#@nY;%r5X_-w5#5$61(%^Ut{6HiCyJv~{Z&ZjUg z6tG_}FdiKBu--&!?+)GKNza3*(+)F5x!p zd2P3}oYkElsKDUiqa_)hM#1(Fdz_p+ATKRPZ}yu?f8oICdiHBKC!3u(?__;u>as&< z{CcgK1x>yvy&p@Tou|FzJAio3x9lsRrNMalJUX0SP;q&?@#-M(7DaEGF7eIfTg??o z(2j^+{3|`MIvK$fU=_iG zUj|Z%sxkR01t1$er%|L;1LK;Y-#AI$PYQXxe5PU`xkUe{CYrhsv^&cHjimyIQ~-2% zK*(j{@`YwdCcgXv`4z4V1)Xy7SA1Ug=}Mr~0es{s>j(_Uv>;=ur)5re8NZJ*87oi= zY+u?t8eLX)=kYH-KUftUG!jXP>pvb3X)kRAqec~EVi7Me)#9rYI33IvuRr@et~6H2 zn_#M=xa7r4qlr{vpSWtzQ*v{Svfl0jqZAZ+@*&|dR4RjS6c{zT^tGDbYS9Lv9cyv$)kL@E(~m%oM$|>BkpG_TxZB62}pV<(mC{H`xOUDs?aUnn(9L#)x#x zC(Ap3w}8>>e0b?aa`jK5PLqc}Cs7{HF>pw)&DOLs3^E>;FfZl7`1)2?}H#0TVCd z6p)NDV%?oqN1!Rl;lhtTSOYbJ^P_dN*hx zF?ZT7eG3<1iawPw?u}p%>@JQ{2M;A!ezY0wqgH99*`%YaF^1$|_OSELv=g=zn8w?P z?2AVNmPEF(8nJX521Y}fHtezM1?(kT>My>3cReqi6S1-b2L~*(qLzS?_+)wwi^HA1 zYLU-sZS&5Tu!^?c5DvE<)_-wx!&T~z*CS&Ds@r}C`omZ#`BqBj; zpUY`CpFLo?B@{$+W1a?41Cx}A_;uH;4P!!;iRJO_2NrzK`~6XhDuqE}X!U^V zjbYF-2i??D+dtG_3xa-J^{HZuZ6|=znhGNpGzC}@YJ7?LVt1mfojLXB1!7B$q&cS5 z4R7DYf9u2N`;phUuKR1&6hX4QO}zKwmy1&pP5#SkgY*y^~epQ5s&m4jXY- z4xU=Rx7c(&&v}c-YTP(+PylQ`9VT8g8L6#+QILS>(#;niM#HR27Y;NyX7sgxA-f3- z23%zwkuWq+x8`;+SAk4sEpq*wL*h9@B?-jX?J)*j=0NHTt-R3XX>Y397pL4{(Jy`R z>!veYIrYTGgD+BXj0DKJNUa(I(#q8r%0dux!EJ2ZJ&u z;_Kmcxtj~zH>P`5we9cSHUOTaA8_Y(Dy3}H@XMKW@p1A%!1zcoMT&$`V= z=cM5ADPEeu^Xh!9b*-_6M%Ci1V`_Z2-9Pfd)^Z&%<~ojA?uu^)zrLbgjbUo7mCoJ9HxxP680?rTx~)M*!hz2YugNDYosvHGxly%qtB?n% zl3BPs(4q0*eM-#s@}gbe9YFT(Vx|(jN4eO)PFJBWeV0Ar@>9S8mrA)Yp~Cpw#^Yk0 zG7yV8qPr%_^dSwt zH8Ll!ULf7Pq`t?b+focF6*VlfSKqE3;PJjv^s7=?jA9z)QHMYJ31{)NSQ->9kwkF^ zjPrpErawVz1E_u)f5pMy|J``CihX&usQLQiFCttv=W^6E3DxV}e7pbR`@9|CX+?XV zb35Deie4?pCWf`R+cSMJ`XsqEgfO&sL;vd{fNzc1GEb;~_JRzM0(;oXyk`|d{U8@HUkFq80GOxscvMCj+)5o<5b{ReI z$m6u%+FOop5^~8(m7UJU>)v=Dbsq03UUHmHz-`LYHv5)8>9njwD@qj{i`|j1IGpc5 z*$k7KDu{5*>Z1U|7pJ%akn)$ zKrNu$<#!%+>b4j_9A%iZ=>87G?aEN`)$$^u775+m}Px zQ*vSSh>zDS>^6pvf9gC%L%d(NpwqfLAZ}TlSjvF7kVyQD1W?I}k8_?bU4q?TDxeyU z#n(+}sV>od!j!A2NNZA=ub6F*uLj0Dtk9s;RSzCv?ZF*(DdhTJb5Clj{+DpTTM^z9 zO$0eG0(+SeYIEQ~0oJ_B!mx(trPL?*4G#&lO#cgqXWmrvaw|*B<}+0?jv(ZuhL%{d z=P@ED>FNVIs~iBaTHCH`QaQ;gzUP@_IFNGnccAR4bC&l)Ko08u-T#$gjx;*D=;a%8 z^>$Ium|!m>p=knkaV!thFw@>krF`WDW-~yZnS#6T?h(@yPlxVxFN8$wgv49{b%7BP8(w!nm4=JTMfOJYT zgoF&GC?!ZE(w#$`d-mSX^S)<4$92{c*YJnJg5TWtH$K;Oy*bA{nKlP9+LIJd*Z&n( z{$~yzN{$O9dCO*40ApvoB-(tX^~TSu!Oc#-PS#{y~v`OV;p*?L_SG55aM=zv&1@1|AXn z+06|M|2rC`7$G{smI?x6zt&~)Xv8PP$O((16(h2%8zf0vm4|rggI3~bwVq#9|brYMRS|X9{_Yd)+ z4wGZREHSWoI4`=yq+-bEqk}yybIGqBL^t9Vmi+@NgWa|*4Nrf7h*Xn0q&NL2AbwSGdUI1duO`O05ou90Gay6pwB6pBKh$tl0e_iuS?wI0Z@DbQjlHm*G^**CVgJFVLu zS;$TCPYTiYj^Zw+!xJ>B{%~EuWbB5Z;T+}m?x4(Ji-(H(|2>BL`}L7Np_afRB+J$u z%u&rnR4(S%<=&6&Sw|1fBVl>R+A(u%I>g1N=}U>Xge|w8)77F2FYFBiYJ7kGV;IjH zG?9i3m~F?O?{F21N#S^yymr{~4XHY>T9~2I`oM4>xB#fNxZke5fUp-&$@0p;{(KX# z;i$zojdiA7fa%Dt+YEj=9uegjOeJAE?tA-dQ|M`vs1g&j)Q)TUuAs(F`$CGj@2vct zaiBYx1O=uQXmZQ3qHBq6&{>QtT@CG)x9P5cca6P@XXV$(5U+WB?n^7>Ui{H+7){V^ zc%uEk#TAq5wa4SX=TlFCduxIY_RSAk`kH_Xe@%tl$!b8U&a-ucy^!&yCgdZd|54iy zP;*n!Pj?MI1>W+zzXm>bJ$!SDa?#NyWq;BhTJz-08)6QPa)qer0N>W#0AHp-39qbw zR_;!Rgib9euidABhh^uuMpp||HRB~c#dN#y93I**-H!np_uE$>)_K(zc#js#7@999VCE2Bjtl5aM+bO`ThRM^PloQ*4)JA58kYpnD|CT zu}uK&@Q>b^zSpVX7^=edg&{9V?dM;TW_9S)t6jH^d7T8cpqF``NJ=l(cU$b)V{Q<& z3f8!?6a%g%|2y3c3W#lGFv;mnZli% z;gxel_#eQWaBfm6;W{_01D(ukZL3#Slg*@}q=bGBDF5gV#V$bYOdZ`$H1#?+xQbx# z@~;PiFDbv1y9=Y1$=o_mQ}WK&iDJ5A>34U=fPn4vP%O|)75iju2n9XfkvO!+9vq;% zJMvF~NPJ}?#Ce>{6Z7#3f2wrro?i4g{-g7g{5+#mQO2LZT=oCGTKVs%v%#0t4X(?N zd*yiyfL55wT>J=4V$(9i@`FUM>G8L?85i67cBhKDLoaquxdbBd{gvU}Hajx^fFF&u zq^+I308$#0qL=g>FXt@M+qcL1VjlYe9=+W6c-Q#Q;pgdgqx(iR7#vLu*4_WNNiO)F zoDPY$eEFYcczPbJ8PdSKCelQ#?ZA4?->eqiO=jHqG@6uNxWh_^qY(A##dGwB3_2`c zoqpDT?|gT)2hp5Els(8cA_u6jqOxX(vgY$Q+D_52yGk6z0_HV+dI~1%LyI!J#x=#; zUee}E>&{xvAv-*Sg5XgA-V~UD9Oc+qh~vE{NjrQ>`eJ$pv-KAx?Mc(y;TJ+e2eH6w zVY|j-(=5d~OXVp*Elv#>FpW{E1Q1;@ z|FnjFITy2QVU}_@wJWzqs-n9X*1jV8+yD@=PHjRBZYyJ737RBsPVJu^+H=(O0KT7( zSS<=9YuUOlqOW6~9@zO5KJC|PN?!S&E;*DGS6UhF{XFWXkjc&dL~aDXQ5{7@K4g4K z#;2r9M{~RY!MRR6@H1J!&;pE5vB1|`MOO{udY9aMB*3Wgg;$8AUgM#_v4O$+dQ%8) z5HZKT24uJH6jDM&LVho=ijgdNrfIE*&hc<2!z`?F5t(t1V`mTFe+YB|6T{WfmKI3t z(o5h&-b|{z9}VsRZ-~nxdU0^}coqzRO^_B|E5Lf{9P-5rqJvZ4N4h#X0SFEIX_Vgq z8mzxGV@NY(U;JQb4-m5Gs>W9DR^#B`2^3&y<$z>_mwrJRvXnd1%sIddY8Q%$IB|Fw#4-=>Y*iheO)wa4qjH-()iv0t_Bj&uE+`@6U^yor>M~6!xHzvuFg8;uuD$ zr~JkrE4j3D#y)`ijHe5S%j{vsoi?S374btlK<;O!aHvo)PRwhkXs5vIsjJW_g4W;! zs{ExAkjvEQvB_Zk(L362Z#Fzj+BnBjwKsTlZecW#8KV-BG*A2&LrHOi=#HtBO6)Js z=frD`^|7QwI$nG;vI0l9Zj1`u-7{=|{%nkRCFI}j?SF5jNjPpID|c}v^3>~dT$4ff z&dVmkZniX?d<`rWFLO(YCS_y0tIld0IzHPu;ON{IKM|rT)sw)nzmVB?lu2{mFpJBE zumkeVg~5fl;({x}M6V8a8G928{=IC!Z@|>5sF5|QWz_sL;o!ou*%Q@4t(_&ZZIar~ zJ(!Lipy~1%ELu#CRn$Bm=CQrPTm=s&!_GZ4(eU;a-qc5RmzSQW-?Og-J=8nlF5L{l zrLBl?=zXhfR(XRti36~UJlf2FetxkEDC@D}@#!&DWF>6Fr0OZ@dDi-pouk|{dXcA5 z&3i-YdRJk#0L5z#pw>2SI?mf)`}#>~l$RopaxNp2sBl5i?6i9nAgpml>d8Ed2n z?)~O(1NTF)p4KMC3V48BYZC3W1zr~Y&mWuC+Ktck6cSN!xc0bx|Dc_GnW!Q|#jwRp z27}X6ZkI860yt&I$+~4Kb_s`afXQKqVGi|`R_lPVs^BxMI>GC8WbQlw%!rO5wt-xw zW+QzLoy~4C-Zud4)0g{!-LFK(vb$f?40cb}4O(@+kBf_&#vg{K5@L0En+{CnFJGd< zJ7rZ2NM9R2^t^gtudeL4p-(#&bZpj@qy!xj6a#pfR9yJSJZkrZos*VjZAVK#0zl%}-O7bb zUG)kL(Z$b?UyAIcvKX}C({a7Ix}BF_;Af2oCBYv+*d3IWiU}P zp%()4$545G!<}pU@woA9PN14GCI*>8FY>O-1xTdDC)js;Ol^<8z9#Z=u?I1l ztwTXYo3D`;yoN@Ri+Uh|jockEqk{lEItCmx+PlPjlT< z#VDvI*?ic&!MEi)jOCt;kR?DsG~gX@kS53}GGxO2{YG#iy5sw&@YtJH!{OV~YK6c; zs^daw(L-W%_>YY!zla0Vt(6uvu)gN}>wdFY;mMBsg;zS>iS zA2%oIJg1mZWhQhW1!3s+cUztM$v#F%u2jBAVQ46C{CBy=f}^pQk3?70y)C?^Q|l$g z$)jbGRP60hQ%tG1Nv6#IXP`u$AIHpYUa9Jci1H|qH}^A;w;6?TW^Iu?Q%~lTL%kl? zOC<57vLYOoC%`eITdbK^(nt=@kg-h`k_o@O5LAuM+6m^~j0Gj!@85Oa%>ORI1DNjj zh^W98O>5O4(+V+`lFQdJYIi30zpBJHv7My~!TC5ij)ucNcmdEVJseHlZ|3lHX&|f0 zBTfvxR1tN?@(Kx5{vTbr9-5b#`4zzm60UO@d;zq-<(XEEKak#dt`Pxyj<=k_JEzN_ z&=9lUFyS?=MD`YR#(z*&T|U}|yU(8Dr^h5Vi#awgCh@1%dFw7z++P1v2sGiIuC%@S{@q3qmLYiA%SDrCn;myye zh0!a65JxGYpuL-l`jJR!a-@mRS(n>Hg;Ca+=y2^3Qf!i4QAg&{Khyp z`GZQh3RsUBiM(n_7jvvRSpP8&i~-iAj~v@laf-aJ-o8sQY$WeXpFAs@*ZZ{R&9J%t zUtZHe<rG)ZSvFG~$x$!rlf?-^|HV3yug4bKF37e^yy})Odj>u7bieZc0DoGCo)Xb?U~? zRV&^X3!i6cB*0a=N^>_&U=Nsl7(X((`H#ywVJ2SctCAl4cP}PB=>J{T9mZT5gm7cD z<}6vPGsK;n?)pXj{(452M78A^z?YF7^WZrbqlow3GapcAHR2xcsIwvcUkV=--`+8p ztTX!|Ycqs2OGeqH2@81tQcQ}Zq7bwlF2(n%s>RNdrk207p*|fyQi6VudcCAQbX7HN zXfQuD3*Ci;alD5$EZ}LLH@kq+A{uW9tGfx<5|>SuUjnwKwqO%4ANE@PitTq6rIZyasTN5>oRe%;{xpwfu&95cBdDq=1?GLwG-{^0EA zKw<9O?_(dTfl+OtPGgPk10Eh;C#WJWPm%4N?P?$esIl6;5n!*TOAXgSs^ECJ#q=Tp z3<_N2yhc_aXVvP31+XyB=e%LMd6f_3TC%(RvY8h@0?sJTlY9&i8pXCL0%F9IMM2$a zP^acsJbdF!@BC|hYFo}hqf$Z*du*&Q_w!0mGI!}mV2+WTx`%ev6XrE4PQ|(>jK22$ z%gmIi_}bA8jB8Apv&*IKnN(zd*ID&uqfl1iK?`=!+#>Rw@{jx!(<7?KFiwP>cpaL= z2`tMBV`KLyI z;YiDQAXZI zv+~Bzmg(orq^?vPThR}OY|gy*P57)%o&hr(nG(?_If@T(Y-oq%z}WaN0>7F9q98Bt z8~ph0p8e6Q*^!&U#b@1XoX~~7@V&2K8R##~?Lu|^V2^PE<8GBzGgB!|#fURbyu@k@-(#{_NQzAw)_uP~a zw9y(L_07FHbB)mzYnQ(nr_D7y`^o~^mFVX2$|R6Z-=5OBXx`xZbtr#u29DRv^bUaW zBemBI$$Sh$i;u*TB_|uKUR&L_xFpE6 z&GLlD1PVV^;uzivPBr??N^vz&=MI^gB+NDEgLl!T>nGl&4A_&ZHAFR#iY)clgKaiI zH$EU*!W9U8s;nmVZ7>bhMJ=36@|4>&Su`&+=RYc#*@#QLURxPqLtIvm&_&%&(5TmN z#>KZ@yT9bSqObz&Do&xGO8ay%6;{7#V2fjoz13^C4%5L@0NH~a0stw-QdTc>EE1{7 zG1YHg-g>}9lxVSv&7K@C)IW@*HX&OaCA`KUAGsn7Ib8H|q(MfYwog`TZVe8SOYE<5 z>l9Na7>uVX{&=rUZaZ9=oB#Gfh=~u8Y8e3;!yYPNr-xGyXUH~5E$Q^8h6FAyBC=Q?8V~UHYSMO$h!CT5P8?D1h>q1+s~H<2__uVcL@S{O|WX{&*I zncrvlC7B`ZHq_v;>VSx=`GH%e8t*1!X_(wE>-#&7y-N~^FXUkQm&~z>%XU1R4cbFE zuA&}N4OFHPb5H|Pj@Jb9&QC0?+EqB&i(kf*<~sZlu4v7qoWU0+E8S@yl{2w~14@xg zXmH_XUa1Mnw?~ayaMnhI)Z9~UXFf9+MLq~mASD?3$Cp{25r@IY`YqD&(JS7R_(Xcz z+!!5}{%C|EKy&6S$T*qGsf7ezF-W=hDP<`$#r~5*5~_hKouBje176R>gse2pVrZl1 z_T0DwVJ>)UxqG=$;PvrQgczs>Bes6^9bb`OY6Q57WG{jGZp$qFhCZd6HTJ_ zBY(|Ur-+PeaB=p33EmTmUkFw&qE-P~k+lf#jNgX0xC=lYYB|`Yc;)b#AJP=}cB{~5 z#-iE4^0J&oDe~s%JYDCbN#(Y?+BqGlEHLPDyUNi6n)M;fx4qmHy4#%5JANJ12B=>z z;*_f9Pcv$P1!V6P|KnVHMGHPogs_zxC@T(l7Jd}PIV0q*W{N)vrtkK62^hw@DC1HS z3G9lzH_tZ+D8ko{wyDk;a;1H!SokoXRb#Z73A-a`y9ctR9Pc?y-ACJV0NaUt(+1B7 zO*g~C%g7d(6nt()uI`ZLzFLk`5W-H;6E{^q9@5y+nCssc z1oo%kE6=b`rI9tb0#k{o>j6W8R@$S1yPC3x%ijBT{2TM@ zf}%E8x%aBq6?hn8v%x2GJ)TVv7NpixmXx&yuTD*|wjNNGyyJ|0u%t-&Sp^ITYpA(l zb!$I>$+D*FqO%vl$%BYwD%Cm}2pBHZS_2c z1t@}Xu+uZmvJ&<&a(Y{b#>C`k<}XMMwdF;qkk=e5jwc%XKRWaoc-+u_iA$~+@ z2Uf38P@kof@)l~#=~j=ps9TJ+VAgx$G7yAo)*hA`|Yr$V=*XTrMRSh&35>lBhr(Nz{xh__jZ2zn5O-U_>*! zX#G7Z$6k0d1B7?t!@Er*MX6PZsrjD0k1N${en2Yd*GH0d9fU12#wUthwu;0kgueT7 zA_nVACFC^RAE;Y3#6C1z)_B20W*NoG67k$gvGRPtNbVJK$gt~@G)Eq80p^fHg3&Y%C_si6STu-sm}3XN4%%97i>{0LAK7A(y7eiYT224 zR<=vJ)=CEX0Pt#Z8BegV#Y=2(yy{%t>$B-4FQGmT0XotHo6V__-<>pmjZU=S?xZPr zM-!mjyIx0%I|LS#*2Y5Gp*C+-5$rGG5fhk&9vy)}*xu*j%`i2o_+0l}0+N!l1GM8NO zd!oiit21|u`U{N=+IkS!ZJVdKI~k4nR;+UIE0vqG$Z5K_;v2!fxW8cS$IxLPRsG&S z581Tj18E9!-kwhTBm4N2RNKI=m{sU;xcOc_l~&AuyZ|g{u+#Lfp3ZSSxc^5Bf05Ce z+@H=b6v_cOUwe62ZY3Ke;M3U3yC0O(nUP+*sSZ z2Ti0IiXbh)f;9zmyyVBsCw3tdkudlKQ)P+X zsyVJJJ?(z+^+jBu!GP>D=}qL#2G4Cub)qLC*JDx=wd;R2pe|4(8T`|}-v-UOQ3CQ- zan*6E#z1D;9WRWA?I&`r24bW?zo&kfCi_O*nMKNT<}InxZ5z5oC;v*d>zfMHP3Cnn zJRpl%bGX>XZM$ibLf)Dg#|^K>Spv%TgqU0DX>usadH$t+mrw(5ho%_EZ(-fUrG7bY zu5V95cApXVUzAi_*!fPCOk{4-6KmU<+)&~^@9)-%nZsbJWc^H%Q9)M4=CuP&2Pj}_eZEs*X0DCY{kP+b_c

W#>Moja!lrn=)RfHktTD3 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

>OBvG5{rJioq< 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ⅅ95!>!i^r07Ja%qsq9vpY9j41F`6z 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%0DH~= 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�ma3aXWT>? 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Ð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 z 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%0DNPk~?ABRx5vFG28_p=MAcMafupZT2~z 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 yYJDdsyz0MsNeDz=-TzO#K%DGk literal 0 HcmV?d00001 diff --git a/public/images/idee-1.png b/public/images/idee-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9212253553cd6a863527d74b4cbff25f224b7722 GIT binary patch literal 587789 zcmafb2RK|?_dXIKlL$$aghWZ#Q?%$Iks`WLMvrL27>Qm+iQp!pq#)5tv>BrhqL+k- z=teiVf-pum8126$-*<2B{mJ+DJUEVX_St8zwby#ryVja#>Z-RHAnXt-Dk_G%cW!D@ zQ9-h(sOYKa4}dfJIlkFcRMgHkii+yCinkS!cF4zC4rb;SH*Fjp?9ANNuTfE5dg&Zq zpJ8LaMz8HldK~z zpG6>o4-(FEUa{u=6FpMi)bONJC_ySd;$iGsq+SOE9$0c$AYE$Ni!SQ91s3PuOGv=$ zMtwRpt?||D_=OYC)iwO~(~kOVc81D@3O?2~RTm1Q5%_ZR?$P7uarMT*%Wr7{ z=PnhPP1N$Zdiosx?m4Ov#2RjSByOt^{ zRD9r=o@zfeI~6TBq6Xix)Es{uD^Xvf+V|r;4HZ?84b}etT%!tp?|wZ6-@Etx{7sWc z^WQ5VS&94pdrZH3C6$-;d@uNQ(BY20BNY|1%I-Jyn=c{4V1x=AZ9OMFmHU$BNQ98t zL*xSsAvc7>kK3f(B*7uV!pV%=4Pj^RDCs71=EoJ1;CT16@EPtOmpIwVoY7NJ=T<~M zw%`^Mx-4}0j4Xtkn_K$vLrY1`n@az=9sDJ8#@flrK~h-Q)zwwV^_md!v6b+Z>({Rf zU%o1Q^{ODaLeSCO-pR~O(BARv&q4k>&P@wP^T#$0PBut;?%i?C9w42aWX_z~eb8TD zKj-<-{IBOYI6t=g@sx+=!WMQG2n%~BN8u|%SA_o>9Na7Y&|K2V#>vj&$E^Pv?8o$P z*g5_4?C$lu&$qMLeJx2lGkYtUGj4(pEiBEP?VQfY-Zyi%c+7o8TKMNh|GfF<*?*2H zE&T7t|Ges#7yh}LKSl)0DGQMn{!29AUp7iGDk^!ZyEkuWyHU>!(Y}R_6Sfz);_AW` zU0wZ?6BG5`L!MASH|li{HG0Z9*880LQffx;rPQZqhK4?eD<0W*cwuL#bwgOR19=y8`(a3^yng7!jA3#&gAFpMwr>|cs`%wDhvA8VE_4(j;XiYy#Qm`lU`& zb`4~bPOj;Vfn2k?#(a(!$A35a$hqTp#&#N(<6ql-J^Y)u3RN&&ogGS25#`~jc|6&I zc=qgBq%6v#=?$-z-azPSDZ8>DUGoPILLZRI_y6uWRDS-4+HyS{I5=QV-(*)!}9)*fc{$I@D3W0thB;QM8&-Z=VpP- z41Ty)m^tnF_;Eg>FaJ}%MU&;yL<_EDb6v2?hqtX1F(B3yd)<+5a9`llzefF+J~&)G z#H1(lE{xOs_FhjJq2CXtYi`r={$P%}DU^hU>EswAFgn?V9Ts1n=Axfq1ojr-?qlA+ zr`lTy$VYF1lYkN!Y%V34Nv-A-_IGIk2Cs_AT z;UDi(-6$YmH{Iy9d_ro^OM-aA-xT7D?CusiO?Bwc4t`jzouPXzc2v<;e@~OT) zFcM#(HbS@O+3yaWarcEn1{8QrN^k zMjTo6@#D=}bmo@)RoUM>VdNZ3qS?wh8Hd9hdnuUT*`vJ$R$-}kUrz`N_kD0o7lajl zz8Aq~afnUmaF|ugo5ttNf|RJqg+qJ3|BpF0@X4F5=+U~%?0LyWzv?uV7=hcNr#x?$ zIupB@)bXpLw%vLG5SIH%-KV8o^e!-B^Z$o}zM`?wdTfz(Xs_u5`KHT*{cE?LZ{bN7 zC2FfPQ1U1REIX{f&<3$GjW2pUey@N%aX8o!BUTgbSPv7+zIU%;^ z`rPJIFS5ICkZbBkr(GP)u7fWv73FP&u<+TPyk=SW?b}1;*B6>!W=Bq*{nw`Y`%i~E ze!$LO|5o5ev*#n|W0z^lT<3}kZ8`&8@P;2A_mN2hh}CSP$WL_`Sfr2<{L^z5sj1c1 zr}y#`KhE7j(d^gJ8opw7b8j^*sV+hc2sloBEqXMjq`atu2a3tBk^B_Vn_Dx{5=Ruo z1Z24_{F&BT+?gN!=VlhuZ^R)%0@8>lrvrGkhf1Ue%L6l%svOm_>$y%|eVDtp=4Mdt zmd7HX*S0v(Y^$ID@L<84y?*CDkI-K@)Ge|NyH|DRZ?r;*JRK0w{-qK%FU^s9V%1whquIDN8r)W zBCA%;rg)h$XtrS=S_fl!R_So@u7*|3ZAf}6?WK-C&T*gL4>b1a8RDMO;*L0!VFcyD zgRQ1t>9uaR@aLyACL+*PLEzkVQk0r2{JOO(`42PxMgsC9=a}#K91DHNv-fLOAB6y? z+4r1<->$PhWHbVpLb=9iHPQSqNAayq|S*J#$-6i*4;a$N7vECWOLOhRb ziNyQu?KRS$R09VoU|#>C$bHEYYyy?uRPYu-6Hr`E{ijd*U=7s*j4ZhJ#5O-H|4aFP zZ4uVMCwq^-6TT~qy6B!96J%34RP@4ydduc$3kb%3s1*Oe+#CxmI?q=MBZD9Q%-xFZX6Kb74=3SaICx)gp1EQf{MoVd0tlGwq&Fr0WI7?< z_Elbn%39Ze6q$Z6iTJ&~?YlF%{_VQX3+6rlZ+=X#+--r-qnn{#Q-mD02YOZTvT7SH z3h&AVFi!8mgFgwA^ZRJhpHP|MwMH-HGw!*wo=`Dh(rYyy?!BH8PvyI=e(+qiH^9Lo z#=k@~Ef??Fa3BLgVAzZ7ha`iaJ@*3v@g!G<>@TWU{c@W@$tHSXidwu5hkx zkB~9|jtm@Py>P}HzCu{igIoNDB@Xm?9e3P2xE{FtZdcrK-ZfA|JZAEHy&nDh@*mnH zD@y>1YYBPJmxb1WZmEpo0aoe-rvzMQ2Xz4Yd&5O#`+Lxf-8D|#K?!ktirZ-av17*s zw9@WJ3L1zh-@6A%`mqW9XlU(5YXew0I5=w20Btk2UNTN{efbszXKn?kiu zx&L^Tk$Ir7oRuuCd#d!vdlq&7>Ev6%0zyJ9+nY;jO)=s*q`rcNj`w%Xi9I>R0f*RN z3lBaiB(A(4x_cmWujSZ17Y^S=Q2mN^)q6_)j=mp2GriHGwgM)VUShW00=wZ4eVz_h zr+GIf;t;dng;MD=O8OkXcNjw9oV0sy83~#FU0JXahtb@E^`*(;p)yy4U8fE7_VL8m zlisp2=X#a*zEhscZ%h#2`vq1j&poY1EH`xkbh0^yttcLdcd8?`02p(<`WGh^m*CMN zHmYr(dj)EP$Y{$JaeH z_{S5f<%Dvr+t2Wi+`#XehPLVY5Dx79cUMRKy#`*r5>Shm-dQ`*`#b&ct)Aiqt32gC z*k=m_F;aN^56Gt|K?6$=%^acD!5vVEyZWgcxZ#kN>kWU(6v9gGysSWA0AdwG@s^`) zuIm3oul%&`asxZAlWl0D%qm=TNVxP;`CR+PS<#&T6-E3b%mvQk_(fF_6?gqCy(=+t z$at1ZdTqdqvDczcR%qY=9byLg3U+couuuYxTup3jZ0teHrRR_*zX035X2gK~XFyur zcqtdP;WAK!FgQ_4n0(kAjdz*pH4BLmImp!why?##c+`=urq(&#=;nL!+OGot#mt9) zq3uXpT(~0rQ(Z&#xrIz*2gXz~-IpeCjx91hVn~7=5Kx{)Q&ivE_7ueC+M}df&XX;1 zI{6P9+bYow7ggVyKH@ZlmOyi4wDq8Z*+A2LP9nQzC{c2Y|1{eUH2bfv(~*~1fL|gU z&oslq@#s-kTD?QemrMZ&Ee4J;*0(+H?r*n_mJxRdoeep5TB>pT2i%S2q@g4f8kM=c zgZb~8C=kCKzR{IK$B-{bc;m4?9yL(yw@)yEPVd^f`4wRB{TZd1`gMU~BS<;r9S}C5 zQwr%GBzwjWEpgWx@*6%rWldfjZwji)MBE9E)+=y3`?4tJf=YD7XSjf7iStg?9EwKn zm(>H>e^K7FDN+z@p0xQI>5828jdVOlcc2t!TenKFip_HkJc#-ujCL;=_2Zo18|Fka z(etAEY`X%gK6qUH(5|MdXz69^7hEW$9I0ngXk~9amsk~)~+vMH_2X1T$F??B3Y0?F*Sp@Hlo^Q@l8EFr=-ySsTfwXhHTeAP zjXysHW5J5-YT*1SgmTmSyRU0ihOc_R*7fTHyih+Him4Te-ref0qjJAYjN4Zpe)PmO z%lm61M$OTpiYf3Ht$ay|XxSIVjdJvQwZlsv>+91ZN3S0Fy$0R{)QQ$N`FxIDaZQ~` z_#^J#FC zpks|IJj@O}1Ht{klnKQlUN%=3>)~urZry(H)cKg-Mt%}dfJ|hdVFDYw&?5FJ4J0KE z;HdrTogT-hw}Ux*hFOl`lQ}STL5z%uOshCl5o!d1h94*;kp~nzr*%!dZ4x{$t%MHD z<%V$DZ;@kiu#d(r6rJ%72;r3JpPlxKawhffMk*F6EmEx>-kXoyu+ag0y4k1F8o$O1 z#*CB0rvWQk+dK&3y#8@S|I=zrv<~3Zj@6>u^;Wsemt8B*I-H|{nDNhK`7r)!Bj3OG z&Azr052qB`=zQ|WP`F2SDTwJeyhR?(?6$;f(C>;*!0u3PZ2k?8_rnFesOGy!{c~@! zwJ~VnUZYPs58v`pPLSOqP+{VWLFmSGOl7hLFN>n+VY;zE_P7jIKJCw?VZlt_{@m3J%GOuaXX^prkVQm2@^;O*!F zBIxcUMYYBk7#iZX;q$@aCB$?>0EaH@U?%c#3LiB zJlmUhc2FJ~1845n(h~)qQ!$+*3k0{3SF|qdvSke4hlgP%9+?&^6I!%)m7{pgql{ei zOQxcSk)=Y*nF7jhE*+)GJAUE*d=IjalgrCArsCFjVCD{Dvz8`W3m(X>jA!W=WU0nU zrWNT7y%$u^P5cDn^E#yvh49Nh+ncP!8a+|WE{1ubVXmtO4Y|p#sM(>z<@4COp-aV- zb^j4v`AKD`Sz@``y?gmX+o(Fq%Ba;AVt4|dagylJ)4KGF`)}Kb1pHONs_;~2D&t(l zV~Xb~l!Nf=s)jFdQpGm)2P=yEcJ>8)-;;j%5xYBN0ei@a;m-LH!reJa9k9Txjz1>4 zo?!+^dY-3B7geGk2D1tkZgZ-~i6gUt0~wwz+wtbt&5j*%pN!L~u6rLPVr$7Lvz9pI zI9IV9>n`RqYe?MgP!@BZ*5242Knm6y=nT70l9)n=N<|xiva#BK*(DX&-7i6@tNS_i zROVTAhjIb1vvCWJ7AAIOBc>{-T_#?fjKrJhqO~(~IYSJ_py3WXBZxvdUYd{hRNegq z4T|)Xkhl)r2M?05Fx(g58Lh5dx#F2_JH&NkGAr`?@Yn6IrC(Xy%dYNktVEg246PCh!elqwTI_qI~rt4A?x+bvfa6;>F%NM!8e$+H=!`eY2I5oEwO*Ck*CD*r8JA zf@DGwx?Xpv9J;T4q{bf$#prmhB3>64pp$T>NeZ5dMRz$ppib&4HwEZVg;X!wbk<(a zbTJW>TxGrqy#!NUa~%n(YEN!(j_>%!@ofI|U(SETVgE#H0@A|E^7)7D%DV-+FBVo6 zD7iyNsw%rYV}W^pI=mA1Kd}OLZuG0@pS<+QAGFDq(11A++R{k9gjbqACS%RARlvd; zxvY!sSe9<|ZVwz6S(>H$xl& zB7uN(dpbwaSGlRd4b>{fyb}#7F6wws>8TUqr{!HWS$3tptmc}7LNRxApJ79(EQyW8 z&Ay+~#b{^dM>&ANI|%`uOr$|mvgL8H@6gV|$A1A=rxfISlG|6-K0Z6H=m4EVEfWA& zCJKE1-CYZkX#p+J&;2a~;SPVb%gt!McK)#~PrU>r?xIPp3uFW_AE`AYkD42DB~du+ z=M$&enB*(ALZxOlfX{6q{DE%3=Sq6l?zeUQ#1i>kTz7*^GG~-s3kOC~cu)`TNLigj z?qXGdG=Vc#o^fTYYKazYx}f&%!KdjAM# zKsAO2y%8wPa`}b*JZF1Le65-ehyBFYcXgc82i!KFv(((dmTVOHOs`E}D6#*8pFYbs zjde?ga(#1@c_)mlYeFX(*2O2?r?^Yq-4Kq=Z^XJa>0*I){twk!4YylaWLk;P$mFWia&zW$J4NhTE!>QQr1ppK+ z={MldyKDUE3=HI4flE~j4h}w431OSr=r=#8X)6OuUXq1UUpeuY5A!7@nOge%8fMLJrsRIo1-t$XT=i}Bso858! zj`J}EjDch|hy9C*uMzwriQP*|T>!cF>08BF)CDqJ+lrTRwa4fsC9lljoBDCKRv77z zurk#+rrf4?*ScZFm0kH(O{_3Y79D&@Pd;bp*KbLcA>LawT3pV@oXC7yWe^XWkIXWY;ADu*FH5Y7N^- z0GW0=>`RB?q2F~yGl0C4K7*un011t_JD}@u)u3p`tkk0qb6Nz1jRqg!5h@9?LtIU) zp>vcKqM|thkdSo?fTId-o^NoaY-jKmgH7ynkigkarIvrONy7x@RK8pgnv`Y?7=2Ug zlKxWBDv^p&{~s4a=X#+dj=T0$@!=s||2A;)8a0 zB1^57t?l~aI5xuv*!2pS?IN|^T0-ljF>-J!?f1(Xr)cpWa<5 zD=OQ?o@i}rovJWS(J!omhSndX^$fv;+l)6}7eCov#r0&lkYGif9I+zZWL@Kv#^N<$ zIQu8I{Ts$Io`EQKar;;nVU05{wyYas*p1l&G@R}Et34BMjcU?DSBzSNy>%{o0^#w{ z8H9IA}6V&_r@_!%Qxl2uh;mvF; z{qc{`JMz@mRc?GB_`h|ph*+8_;D7<<4a5+lg-+dBP<|0r^7^t?*?awKT8h)aGYi)2 zdmYVbq>=@>i+0!Kks5Lcq49-`^Zt=;krc!`SBWV=0hXXU9ceN^5;tQx+(pKJL)!?m z^lELu@81ut$dO8pTc=CNGR>$jwdqviSX-}V%7>m<%{stfXZs*ILP)FLc)QgnE7CLb zrB-ll*yHC5F)cx5m-Ns~sg+KK%%S)qP3|v|RC<~( zK^U=QYj2b@v9xMh8sCF6%__#IzPozfuxV0Qy;|g&Lf4EB{9dl^FA>HsHgA_EQ2-g~ zXX;ilKd#`JN#{t6)-*=MOl?l`$nDrwd5lf5Bi~4meZ5AiW0cJWSV%88QjioTx1Gyh zk>vQM7|r_Gq#BOTMvSA-P63)M`C4vjJhEF^F}WJKNCQnxH@k+=hn^!fbO@}P--oV! zQN=^vWfkOUepW6nuIRfgzE~YB+-saTsG#njE5JN;8d9RO0cGgwycr0rW+f#xpRykTdLKV`3%5H{wR4PQaJ0(df zJ&tT|OH!;`03mBEYN=UVrzXtL-nz;0jW`zm6}Q#<29W20M@~KnTXQ=mV(4JLWcT26v%A0DUuVSOp0!ppe*LfH$o%$bqV(XPbU+-+w7(B%gfC ztiyWPDgLvhq}=k_OCiX@1$X|4?j-Ka$V+c1TdTvK1#_0JnJ1oPwGXcj1=h31VcJ(C z2&U(eeN$^y3lySGxBur`&zTSU=yv8tKS?<+IlQtlx?dNkg6oA#eRw<$*_mb5#;+|K zF?@vZp9*mnxls9cF7~}QwGkUJTJ4&a-J<@5Wu6O0ho(`wHBV>}qfcmcYUDnr+wR12 zKKS1Wjt)2V2Wt1S!+#<&Zih?MTWYN|RY%bm5@47XAYvl;bc;sog7ib! zMJw`_91ZdxKEuI>`Z;`A`%b$Kp46#mu6t72h*qBjsal1%nsWSaGpLffxdPUf*RtMS zQ~a*h9I;C!9AMmTuZv$I1q&a5#YsA2F?77PJ!qRltU{2Q-fJxqW9nt$55oBGWaQnh zQ3^r*`SBS~$%&AycUJLNNRFYsr^w~vk(Qss2?i44eNWbxNGV~m`L@{~E<8Pohob|b zeHl<4Gd$jYFjpg`4q^=-=nsY6a2|tcwG$<5;^4B-*BQ|UQl7obXiRqg!(!Czhe-vh z#c51VQFoLv9HJw;IA2F5OU*rvAtZP&K65T7_d8tknh%qMm61s#K1R-j$%Y#YStdSP zI4&Z4k~{Q9$KlG5xXP`soZ)x|M}#i*P@NGOAp$*wZJ`_bqo(@xZ0fJ6f%0a6y zw{JiLl%4IT>nmG?<5CtkJlYcH3(}y_UYFtUsqKx#Nn-Cs_Y9bM`!Xh*J+i6rFA{MN*Wf{@V)iTqjrDIvsYE!!b#raOJ(-|;BvJBEyt+NIztcq7= z`kK5~ovYUV4CaJk&Dl&I-=)6_H_+%^F(uy1tl|e`XR<;h{IVwh6yUEF52e+se@-9O z?tT1BttYd3d@M}P{v>J#XE>1g+Gv7WLuDuv71cCXwPQb-;ImC|{-SKAcHIVL+mk)y zsRbL5)oaSAFL-QGUe#g;k~5svU#I;VU_8>2R^%B6FOYjb`s7W|u!DcaEFw`~#aIHr^@cFcwYRZx&F7BKHjt!% zgAhM=VqWGAaqOIbv?~URVNJ7=F{F!|gHN8G+o>$fTC~L5=9CGYYCW&a>d9TCZT$tG z*Zm>!au!Vmg#XfauUyA5^^ISNrA!0)o-ZDAAT=Sj6Mv5g0q;$K~7J*mu8}Gi5sRUCGMl8FkkiBUY}H`d)OK;qge2*ST+tNY0}`&nXB!# z80@!CQBV6uKX8Nr&f7z>r%2`+ZrV9LZ$*t!Jx(!@9Q%1zJyKb18A^7mD}O_TBqO&i z@$?XjDQc`)oK(;%dx#-6x^&5AC*cvTlEr$OoR}G4Bfi%$*3IX;&Cf>wYhG9xqRAPE zr>vBJzpzrdk!U&zQjm7!EPbA=x7Qt62gVvMMTw(Z;$JrP9mF3^>{J#TiXH8K8vV6;i}CCJ?;*VD}pZ5 zF>>0aD23&3%$5z`bMt@AuE*uR+|E>5QO{vuP-u73j@8q*;O4VqJYE#nq=%$1FP0JL zh$gj>ieuF$|F;lP+a3HV%#zY%7pT{&4O#m>*w-^=Do1pi8pK~uw;b8!zsQ;avP92o zbLAf#73-!Ya5=smPS50no z)agG=T(B|0zYqm%~+q8*W>o}N9Q<$u5rfy zO=E|9?B9io%^(dLxOyUHlj4}{^BL&7W|}^Y6ACl=UGnAsqD)u;WzvzH^`rD?B%B7) z$*Z1W8vEoaq;X0)NhV;TYdVG7M43?l&7<9_K@5veseS+ulq2(^)<9}^YQhR`C%LLQ zL40_+8)GF-a5JYjlAW%(qhc%fU~S%^&Lt}7BnuV3v;{G^mRskyfh3w%*?t9f^EG7H zazRN`5RTJ!bHq>M&A3*|6ymlhWCm&j+B;>=L`xZua%6K%aW13WT6N$N4$Iw4ocP-d(#`7@WP7)>=e}MNgs|$#`AkyaOQeJTCLchid=Va1Hz%NN*R96GS#v z5^tC#*jJE>98wHPDdS(F7^&}vIPaX7y@JnxY;Q5v9@cN5%Ch!mD?=ki zA-v#eki701`SDuismA0bjREx&F8Q9>E9&;35_WU&t0~U5=ZJZ>aYZS~NsCr7C34`B zX$2@8K?y>@-k)f|8Qa#sw3B^>Ym-kJYt zR!^j>9PQI!X5I(aDoz)hr6`TMd#F+~vJ-LbRgI{IhStBqX?nbGc7mfjH=w3v%X|9A zsdbDPrztvfWfSh5RWum7Qg4|Rk>0a^#r=OVct1;l{Kk00>vz_jK_v=aaC0dr-_n>YI!|WX=onyYy4Da~Ts*+RGS^66eq1JZ2Rt<-Abw z9J~$%LuX?`uJ88X+!UNa5h5`i(Z8%>+z$4VEB>#!CWCJb3$Q1f=FwNz_adZ@)| zITK-I=Y_(e${m6y!B?tUmQrHX8+ElZ1n^H!mo`nsH=RQdZ*DsBe@E1HR;;W{+h*rw z8dCm>ChhekGMoxCjU!Vqd`;g<%%PXW}LjG6IKZM36U&5YN?aWHq z&NUZ4{xiMREKHbd(>*3`@`vW-(2UJnIe`to;n6SKku`>UjED9Hg`a)GwqFF1oGhdOL z#fSCm8MP__rt1Exh}-d=xk4OB4`W$Yx?iC~bnC2p1{sD=0Xl%b5>!I-6&8U~iedZm zskGcMI12(_>O9{mkzAc&oSuLeL5r!0KK^o#y8qEweSk{`bpnbt?O;W=R=UF&%Hee$oyn&(I64Cn7uo||`(t`I0@BqIEX9Ytl1>UW@{2BPigM^LlQwKW!(mg|%K=H8*PqmlV76F0Q=Gvi#kXY_UQ z9-L>Cm^(bC6_Zz64S7sl*`PCH6w}%My9ml*@z8gf@aWYQKlzH)Hcvs6ylPK@*4CDM zGYqG?9ruv&x2Rh)wYsMBc;@4h!;oEDHlod}Zmm@#88FYR(A5foDm7y~q#;|k{Mt~8 zNkO*xedz{Oa|BP)*K4hXpvXE<=Sv?a4CX`8yfI_4*iOVB5FD2}g{@ zGw`p_i5T|VENO!i=AGt{!@|aemrex{v&)3ay(84rhLbIn%ckl%NH4CnUA*H_~Hm-PsDA;h)7)aP^mr-()qNQT}GUbcW15#Eh;53HI_vWA4QWY8Q9Mj z;EC7qY&h-OD^nR)OL$QF7=Mq^W}=Xe)2q4;tG{{#IvLro%Hq3KcB@sxe5Q>@QSpR( z2Azv=#j+;m&l=5uM<%OO+5HYdVJD8hC`Ksfd#(Seuw+|k9HM33qvt%M9Kpu|v%IJp zd!l7)KXPB?%wiKZ#OKr6dQu|X8>xt2Pfdf-qN6<4R!<`bpl$LE+tDE2B$o5)B^lG2 z<}42Ptbf2(XV;dV^^%4hog_O7K~`o5ZgPZ#%>CjTi+r;cSK^iD=tLallYRckj11Bi z9k_9Rhr3&#DzXc=++IE@i5u^g`mJ*`XSp+$bST30KcyuOwfmRlZb7(|YLsZ{dfZLb z#P2LkG?%#=LU@##k`w~kmy+jTldGJwUZd-iifdY0X&4pf57AAgywRGju@rgziAcQp@t?426hb>C64! zV;vQwzJq2Y(rnqBnCScX$x*!A_S#tySMT*tY@-JXV&gq1HprXoh=asqS($Xlh8G>+ z7m(t577<$geZx2yu zXlNMN&zQJ9MZ&F@UxyMw{FaMUsFh@lW_gbFpXrnS>YgZbsYc{p~#e1+YMmjizrk z{J$Mme&)w|#RW1P;=Of!HN`b?m)@?rn$;>IylS5w;QL1;0y_o&-Sou+{VAwUh-utv)+pjmHZSXF z;n0Nfq^`2LQvSloB2am_-zKMg`W|BsVdh4^U((8*nr5JnebM4bGhHKRsP(ta#U^3F zm>}+iRqkxq9l2%osjf^d|ACYpiZ1;HzH>1`D9N%vpS$q904da=3>}BZD`@D%iO~zV zCof9xVgWBf0q_Yx^e0`bOD$5uPfhT8uoR_`T!!m5eC_uMBOW5kuZAzRe!J0gvNJu1 zDNW%`qj#3Ln}bfnq$=`O#rNdktQvi*0QH>cn^w)SHZfZlN@0d6ZTZG*aZ(y}57!Q|JXys9wVE6z3T@7g?V)*99#FywOa_p+iSQ(UwK#v=x;kelG) zR`j$uVOoz&>S<*a(ld=Rc6o;)k&1HG#z->s*m^WbOuY*=$r@l=*lK&b;o+v&py5Xy za5sIu*VuCf?@&p6RG~zSo0X+hgcQ?YMqSqC&BXfmeN~fPaguOlR>E(~lIMJa64Bcs z-{#HN)99j{Imz>5>EwaO<6rb&i1++bPZ?WDLrHuqJMw<@e0$b0fIAQNd_1%X6HBSu z;Uo5hl-7r3W7SLq$*2C0^8CjQa;NSV3IDgxP~rl0z$){J7YgBU?iG=Eiv{&G1y9Jt zRN0d(04U*WsovLgYU&2;t7P^=3@F;GlO8cPsb33N`J#_NpH*)D0)s|2$k%Dl3Y&r zo$al;oMv>g^p4i1z&oHZ)5k&f5Y!`iKQE5#&ej^}#u{0zNH3#Fvr^vJv;D=^TkWng zVt51XvZ~&p?X9_ntf?I_LfVqA^=V`?z8OX9P$wyK0@mpNUKHM4xJ#dkeB={APe5g4 zty)fb&im0R=-~hdQ$s!?cacNf{uE4?P1yL9LMeoaaanB0Dq(?jsNGxuyEC9}t+#nb{WpBm;jc0TcPy8Rpb z{zBgUS}fZyYBM3n(BqS)3~z(j$07w|NS|hfVNZg@Sc<(UQ|YyDX5sSCy3GE&EKZ<9 zbkRt7as%5Io+D1uBaYG-Jbv3F#Y^XP{YC}vsupWKXd$1vdi>u#= z(_)W8xR3}>wfx46@8Sp=$^iVSztXfSc5#?F6 zxu|SCgLh1KkI7c}49cDuM!#dE+hT{qil6jZG(|En9kiteom zP*-gPjX9CB7=vvt_`e{aCC%%<&huO~O5vI*U0cSRxBl(t{sp>2p&-+h2U+y^k=^&X zDbIk>P!~-Vn+NqquqIYP1?8z=&NJHI)y1t@BD?_ z+MN!T%+UzR0c3-^RRf6l0|@1r;iv+@uJXBzU+Oxs@r6I+C?bEjwb7bx_2nvo}3~oab2a z&Uq}5!E6IwQ33or_K&%Am{DET*|@OEgkKV(^fzffJ!fNNz?2@y{?_vrlFj!SO|&sm zTr^9+^ZXYq{Wq%qam0IG-c&U8oIc}j*^NA!E#o`GdtDRvR1~18ld#Kq4P1;#?E~fd zP9KV)Xg}>FjiFem#Jn{ttsHRs4xp+tY3eHIdjN=WrA` zpaBk&^z|kqqH>!;bg7|b>%GGmTscmyh4ZN&4=X@(ev|G>=4gT|kcP^Nw>CS~ifZdZ zARo~P=QdrF0F=&KosAOjEecaLo8@J9z#iyQy>aEoQ&;hGBW)mf31UfIu zBfsDHe1a7r>(h*JygJQ0q^}cx3yrmSRRN4*mxTgnjhRUtC@k=fb&|m7rAO zFfsc<>qD#pxhG6?FAO7b`FtZRFhI;@X=+S9c$)p!C z?8h3QkGmNUm)NfPa;qzdhbP1Z=|Bkar@Y`^L z+hSu|iBw}43al44sF=cM7~L9HP@97+UkC&oy2MN!C@7QuqyORDqxLSWq&IxfXgsOU ziy&R*vBJJlt(XhxoYu2_Az1`-68fwWtU$m22o3GdU!^3fw$!M#dp!h7;+t&$6|>7Y zGSMTy(1-h8&zoqoB;VF7hg{-VCwusw?Rr1m$^}0W&f2vE=K3qxK(?Pr)^G|fr^kE^ zld0FY_S=YJI%PUa*Q^W*wmMvHqt#UMXe{eP&{2G4AEiUNj+u13RF{$fMco>e$359a zA=$*P#x#KORAgR66Z~JU4!I^kvo-s?*S3S0?6JIPB+a`NQaM+x^cE8?!({8mu8?y73jRS z_|}RCt=dYN{d~_-V1J+YOj(ILKjXQoZy}Y%1eX}mvTw&W+7&-QHjIfph5>%~r;fI>-&6Lm@d1adSBcuncD&#`FChUntB>q5 zwBz!qn_%bi@4v|+p-r`Lj8T-&sidy%Ekr(kD0g(HFUmhex#ljyq(&*=gy`00T%1%; zw~oris(z$w*vV`CutIB_vq~@MYwqGM@^Zs^>tfl}s=T*qT~+S-jH!qRT(MZ3`Zl~! z-@`6y8+br}XhgPqymh<@fsx`B;2@f-kmWOqQWh@d#$3~FVPe8gkM_Ud)H!|4qYwpj zR;(ok&cZ!3-k{#v$>92dUmZR612S0cJJ5R-*$g$eq2EZmB9*RjcH`S?wXC$cIyHhk z#-)#sV2H`ZcoXCbOFwZ~6njuDOX$LXknpYKKgLUWN)5kz@`_nbq#!sPiwv z!itZCWCKCvALQhdA zFyII0)^)ti8M&NvMRZkd#RZD;Rpz2}*d3tcMzZUP?yK9LOIMX)*t;S7$L*lYB-f+- zQy=H9_o$ZROVm*x(t|F6AVxzuRjhw#K!}A3`gzWak%>=00yOcoxuCf-<2ODOXM^Ix zjf{p9qF!*cd%(q%Ofj4w?L~14!$>qIpMW-KbiRY$(xz4#I#=1T@0qjAIdspZ@^wPl zT>mXLqlZz&HjX#P+EpfoeRhVT-R8-RjIQycTHSI}TJ8KN4Ei|UOnaOl<8)1MvV^Z6 z1bG{aJexAp3IGFwoH;#g2|PEbYD!pbvpem%xo~j?)J@%Q&Vk$qAJ8x$>1Li8tsLg^ z@+D0ze&~idKIC!0Etc)UksAZ!oDXGMIqu^nDHU|uEH|Nl=rW}B03L4My(g>(lor;h ztXvvFJ6mgTya`=;$4P}4&W?kk4g16>&8vnV9QB(bv375RZrQq9LwU4m?;YC6>-A|D zbB@oDasK$nC?_|`9P(;n*>@%yXZs{L^ifCAInNDjv7!McO|yAsR9CdvxFbuS{w1FX zELWWee5l0D+>Hrh4r#X#@ZB}5K<=zc(1KD+a9hGMMQ)Diy9o}2c z?|J9Z6Md=5EDuzUG%PP%jNdJ2dK#Y7!WFmFA79`6OA&l^&3Cje|fhwC&1&wDNP~=r6rbzt#L6B7lz2 z4vB%xW}eo%QE9Cqu~0>@yk3|7#s^;o+V*)w=$hYNsXJDoQs7(cBD>b6$TMH+GhkU5 zs)*_-!hK(X?`T^?YqV63npAnCFd#W6142b|fw1avypiIq%^w4k+N))7TFahNBKNkwc~A2Vy$uFb-xC`cGd}+a7Z#= z263O5iem!!ESv6&=X!5}($u-irJ~d&L~D#xkA2ye3uf#F0Wph7%q$Oc(olyEEarDI z{n;gJ+wXy^$zEZ~P$;JibgIc%9It?CH>W~!jXkDPImMb0>lIUlaXY(>KCE+yLiVy~ zoAEPqP);GJGFBnBbUhn^nqepytBBJkHoxUbX)QUfPfsV?AJ(lTexCzw~7Z& z<(6`x4@3lfT!uODg!x~*myBQbmTW#s@`FcjkZ1dvR(Z-QwpyfijTsal@(*%F=6 zh3y#m^$Z}Z>NwrM9p#uI<(PP0*2Ct*%Te{M0gbOOc)FDa1wG0+Gz-~hwK9U?Y#N#D zv>y)J-r8`tozr0)6`OacxoSYdq9t{my=?~}+k9?`=OyXtgg5E_COQ1J_Al35MxEgA z%i&rvR^5h~R_v&p|hz|JL19=k0zll8a*Z&)yUoS|@*~*{6)7 zTB9m4BOoXwzBhT#>lEy@}_uwa{0 z$(mNGt2_zF@2vLglWu>A@D^Hgw&*bzYG2k)Y8%`csN_xAP0`(8^fGpA7ENl03g$y> zRhQL-M0eTzjk2r`S zc^+AyDV2O9j8o^m^-f=EYQ8wiN>j-sL>qGAAP5l~9#B0V9Z6qTydJ1Q*!LhnrwPtufUz zjMhWhUQIEg-9l?7JrZFB^p{7D3F>;sqXI1SnJ+eoR}?G=EicZ9cR$O_c5h^rGMHB@ zWMEufzzTSxNJKo|_$FK90T*41SUH#K?(uK$t9u+`P3nWcWjlWrm+7uPxXAk(Zh!D3 z%M@Ote%+_y1My;xd?ku`%UtsnwcXmnC_|9>MP1x~N4Yv6%DvaIbmd2s+sPMin^5(h zA&H+4m5HK>We}X%YjKnhvTpn3)gjGp;9#6M$gvuNAWUc_<+t7G*0*pPL=;dPST8am zs4?El$q}*01&esAYrEA3*CDSoD+J)ucB5ZfpY>%KtCVDDoSp4S_=uSAs1}%Bk5#v+ zaO+-JToEi7fQrg71PD!NuD>)e#I?0JN9?J(WP8yK5|ZR*rU?d^%OE^QMk9Hvq2i#+-wR1r== zI9qjF55BNBWPXKW)x3PO2>teEol<|-@jTpSNo`(Dl!XJ=Dp%PVjE@7?e#TB z2B*neIW2S4>PypD7ZZHbh!)hXX`3+p(NNB}?1_d(jm>iA)8CzF`9zmCUEKf)VY!8U{_K3h{C9%PL5AHH_r5xA z720W5+B~n@WLm1?=?YfMx9qL5XEh7y08J^SB4X-NCJcr%OC<|4mLQ$%OK_%;TW562 zfM0nR^6FWx`aRTIkIJC+$9*6I460$Ew7gM#Qd_-5+)QuGqPoDQ({CBz}O zYN?~I5M%z4xh+NSa_--z*>bpwff!oG)Jns6ueLKl){_p5>kg*A9Si2 zdYw{SAEvF4jy^%B$?Diye!eqh*u3+TYkb!EPwaVq3yYaa?wYhH(6}dNez@vA?417m z=WdXB_O49T2?0vd_gz&wTCP;5i8htm`Toi3X2L^rkYNLf5=9V-^Mcwy&7tIUie=@l zj-wwq;s)~6IX>nW4au|SKX6NR539RXK|j=xT+m&d?4t4Al{o@cbCZ-5HC`;8aqR4# zTMov0b=tFC>wvO>^Gd1{4xzQbK6K5oox}ZzejsA`CZ6SupjJ8Dxtvk#*r089xfQW? z5F{NkeRy5ZSt8%;vje0U);PE62mXm2NoskZgzU_mvXPOIRG2GC3j2KXMZx@x4Q$-1 zBVTR*MdVuV^US!X7w&(`Ol8uNT*rpWJey|0#pO!$1wNrdlDak}g1LP#`6i*FFZ`~% zTr&3QA2`N;6ts`MBLbTt_v|oy6T$pw8RzY?eWT zr}?n|S%!D~Td32pQ|;QhLgd&AB@e)Iv}=jRMzjf(I|WC9cIb#0ry-ZF7Ud7Hh zZ?#bBk}&bC$On2vem~m#p1*EKmw+v)KU~By6_1I$`*Dn2{N;8L++}}6J)YSnDMrfh zh5Y#Cj+|x%Svqy$qE8W$e#e+Dw^B;Cc$wF`@@9B0Xzq86_0f^E)W!>DWQ9(j7@^Z)v4U(C_pUXm5&8XKK-Y8oVmqexlQ2; zgS5T$<;^~p-Oc)IuP`JoXhAFndF1Vro?XAdKu}1ti^etZ6H(YT@B{d#C1?;cE3W#Y z3QY|e65ahH8x)VS>X-05692y#V?Q3|`xU_rJJX*#iV_xgxb7i`=*D#>r4B>)C%T@~ z=%^7WO|JZul+ewjJs5-y>$_9u!j}V@@qpIi;^BJma#C0UTWsAkDIBCocM>c0$^0TS z>p|?Alk=_z^9eVH##0}Ce34VUgw9O3@&P7{&2~q;I1fjipB5h~N025_@Parvtse1)Fx1HiA>D0c1xG#lU+~;&ItG{Au(#i2BHEO1 zobl8Yj}-^4YZCYOJo0s3%yV8cGVBM9j)ctRdB?gKCvR_!n6seR@`lIyy(>aM#sz(93*wM#OYf3hFY zj^x+4N#z563`5GZ=5H|XeF(|TSq74VAJ>M3Szg!r9#fg8u8aAVAcb0nG(pDPO{Xc)J6cpw_?uFm;xb8(>bvruV zsiw8(8bLo0E&X8k%{|(Hrs;T6wATBi7w@zTdVvLk@^UCTywo(*6p!K8Uax$~+(!++ zUzXVcLX7_VN6hV*nfZ^VRGN0)2*%OAhkbh>n)D*6?L#Fhw!n6TMnE?|4M*3^!*l=Q zgWXNHd2F#wBP*c82lT%&NqQb|ZTODdUg5=6=sV7)7xel|4jwgl55R%C2p4>AOq;|( zg1&KU@KRswi&B_S%y$xMmnmqDwF0S&ho|D+8E7&D@ZT=3ioUF8269w9?~*E zV6$CX*OKFq`JnyPlRSq-hY{8=)DlD;y@_pHw?Ph;2h^eErKGM>OWjy#)@;+N5eRY&R`S?s0o7^rG zxgXiK}Ta<*p4(Ha` zux+%mKzg96;dg3tU(&k83>ISwI)cp2Y9T#Dbwx}w@j4c?cL~!W9W;D zVv^nMTcG*-TK{U7jiQ3mwI!v@sse_V>rW3hAGaOak(~KpB}qr{ zNGZ35RjjK4VCGd`Tzs#tn8(dy%Pr|14X7*YWuDEMQIUU1GwfAV5Gtue>l7*_~ z5Y#l+Z|3L8i@R-0nD~_qf4(Z{T2`JLb8g@`kCY$foSwiw@c{k@=wZui%r9p4u5w~3 zc#@*S5^C827gueP`K*ugMaW2ple}l@)cN7m%vtenJ>zuUyzHg1x_*FX%vEfMUy0N4 zfwz;Sv`BbP`HOnM3}iOV@Kkl?e&8s1fmU>}f3KtE;0I`9IlI#BVB7_RuIO|^5Gnv$ zG$pn?JVVnli!lQ>%)s`tb9ooJE6PU4pa41g`s|CUZ4bzv>kb3C{?rl(`xXTY{St?q z1!2bm-g1gUY56>>R!<5jP6drE)e4=9nuAO3LVumHW>PEh2VF=VHhmV2qGfv^#^h07 z;WWM8r-l@V(iOK#=jBf~Pkf4MZjooF%sIl8xy8)x_5}2Sw0t*tW~S(;om_yc%3_~6F_q4vv+ztmxs?V@hCMYn!b?eE zS%63tyz$X>i2Yq^7M*A|?}iL%eBadNtj$cDX1OTK2huG__ximr`}lC)}Zt$r%>2zY>UK+~bmE|fuXzIvYS zj021r`)sKn?&f--f#UrT1nl!L9W^gmtT)Q;d?zYCDHeSsyZjJR@wPDz#EqHIQy_@kWva@InWyoYJ-W?_bnPFM!##OLgjzn)_|~O%xSik%-xJ$$3i~9>}?sn>Hno z8xI8YKnrLd^txXrD41=|SWJ50Uy#D9%gxE%jo^$ws)@zDaXFO{;07`nb8G$92PDVD z4ZPG!9Og$!VuAzFS}70(!Yr0KVT3Syq*Tzs$V{L6VtfUlqQaJgdJASI-5zMn0VkY& zAZX^VG?Hf-Xw)@kbyk}tB`5X47UCT{19)yJ)b*Pf%lY+@DOpauwvHjhm_>?cB)j=v z2}7Lx&#nqz>EUCPs%1SJ!0kuwtL>GN5-Rz2#xDC?xy@YKd&}(ecLrvQ#|ppfHLjE> zyYc+763v4kmYFhtv34^PG1oYXUG2RajQg**2jfRhwZs$=V^`#G_Jk$w7#vw1N$y^9 zqmV1=6t~9|LpIXiUhoEPK;Z3N3F6P1USq zTA&kU(k2u^#y_QmI=9$R9Oo>0*%XERD`i#BNz-CBigOO}DLvn{n}%*b%lZ?VjdE$6 z)1*(@GQ!k-SO|GGLTBjI6rN$jO>?i7=+{X6TPyH;KmXvj7x4mnV7G2eJknZdE&uTw zN?Hu#6t#2#HjTQlphx*G0Rriv8##=BP1ball6#B;uelYq_8I8Bs0|~n(9HTMZjJCC zk2vue$*&e42Hk$sezNlrI)0Tp+zG(F3TvrQYo3(IyM3E<4 zVSy>}p?HBMgnWbDqFJzxTqBG~b+yh9H@TRdQzkCVU(q8N_|_0BHalQlx>SpTIGEC3 zEuVp4P+ZIFAPRM2g*Q63B;Ohq)4gii63dMdPH3b&`?j0Di&H%V$5kPgzA5E&)D$kZ_rjiG-w>NcH z#f6E$rvnup^f{?#Fm{L(G#5>}^xv;a{HUsIwb#nNA5!%Zxgv=?0($sV2(ID4`(=Hz zJ*`5~lG|#nhPcf@!$@o)YgnhyUDg5OP+@k>Cc&1Q+uype@0K?krN?m|HNI?hm=F;t zDZcC+aaYs54HWqz1G!$B4tv}vvIn{V9Au#k2bODdqp1~MB zpxa$~lKNw~m@t%i!UW~k7$&6nADMw9ZS+@eWmN4)i$?uu0@e_UPtr zV}ogAp{J@!h|A+3N79;AqBLP$3eeh&p=+K3;x9;$gAV=IA?S;2-V06Tpu74FRIn~W z`$aRmV{^A^x%a`)Zbal0Ra>Ek$jkk5&^Ypd=@>WO*;G84krB6;Zd1b=1~u>}1S+g1 zpa{g)?!^9ITI?X}*AT{K`KMF(^BX))YAzKK70ORO&M-}oks0SiN=n1x055ogx|Eyf_p;Y= zi#)vwAB)2Ixlg#z-b#^x@+L>S!nhQl+?sf2EH~ySiXx9&{3Se{3}uZLoX@Im*t#Q2 zUaep9Py8%S+YamK>puEQa}#yA&z*tdAOfYhAJm8FE55#*LYs8hqPa1{gOd zd-jGHPbt{Lr8Bl%@=;x3E`H}5`b^_RbyY?6T&n2LeyJLDT52#jR-y4C1;=ltDiCXM zhkN2Db7WBU*UBbe_Ova#!GQ#ZEdt;79hcG>|(V0 ztVJ(G)>-kheWhgO#+YzgcmT&mme0iPtUA*5AYM=w@;8QMlF%Z6RxxD~Xf23W&l!>;; zt>8AM$VE?V#fed>sV2{*r{YLoyDMLwUXAhqEj}L=-&o+*^4DjyDmWB{E>Fl>SCq+U zmLFSz!@v7N(>QdXn$b?7!%BPKboZ_Du1jfA(BE7)p!A3t8wxUtM?-YCo8MNjjpMmCPL#tjTkB)K zC>;HA8HyO}GgGAYkBt6ldxar@V=a-vRe|a@a*249nnfa)X<*(LR*Ya0jwa#DU5B?C zSq!&bQZ7`x54lX$7@yXYwyW}7ADB|m68~s&<09vM(Yf&XVBqyJkLly#ri~W_BQ_8c z&zj549HVuF>W6e`(!;`PJ8IMw9`0cgZCtO6aA~ck z#NOo$=x3n+O`V>(B zOj1W7w}+kVmjt;5-6r`dictXQEtHYrVzhA8FjnXXpwt+BXQ$aPXhVE$q6CM65X;X7q1p118wsiO6QDXIEGZ$@qojRw2A z;Op&{POifqB;&?uk)^Z9&E!P+)wv%17isL(jkZf8dUE(^o4u+l(GJ05Peg6JABb*6 zl5T~$HOx-LH8`IQySt2ru0+0(Q*NxVZ0J@gHer#BGU64&OC{vU#r-hL&*v{gQ zJ@W%ar@F%Ikp}eYHoe7(3{fWUA$y@`)noM{k}S#tL|J0`J=z(gr_R)sfLsB8T4bQU zfdLY^{WkDHQ+h|z9bfjdjjwodYhzLso|)*nQ0aq$0TR?u;%`&fa_lQ{tB9rsP^KFp zHd-~e%R}%d>}9pxV|kA@GW$=g87W-Ul5hLv|NV3Xf4uO3p5)8iRDHA+PPM%OWlG-r zgXSTX zTdl&%&wD*1K6eA2L`C4*ZS!{pE1BkNX(nK6e8)cY=AfTk%1LmzLeFQCX$vtgZX7n| zk*%2Y8nmR$F)AzQUJ#~Zp2k%$XfIs&jBWPra0+dm1FfZF)x6uF7}Q1GT%e4UQGzPmbuZZ}juiCAqo~(sA9Y4;Ytu3v`j`%B)j4DdzA+g}h5H2`hNGUZg|*)d_fk zRlkmY5U#)ps^?zAnuYc>6b&M6w{u0Ql>q?LSB}@5sHaI^Xg(=niD z*}2g#DzNl!y7gNXXgb>PpO}I-P1;#B*k7X4)tHQ!lB|0lu;H5ZD_FhZVTo@cW)$%& zxwrD;q9)zy^aLN>-xz)X^ch}vrEGd+tNC)+e>rU|yFIXMAI3$fqS|Ujm;GH-IDWFG zBP-EMl-8fUs?pXkKjNSuG^ckp;&AO2hC-;Q1*uoGW()AP1@pr~>pN7ZpSsXzD;T^; z0mC0KRSE2$wtTY1$n2(#eju|^7cCtY$~XBftHP7qEJK=`(MH#M4V*tM7S84AY6^R5#Z}}Xu7;Sd%X5^X+WyJD(&=h}#$wi0Gls0UKy4=#2 znGXnW`4&N@WOHn<83}HPZ62FaSjpPR13wJ?3+6)_dv0``P~J@qLATuL=M3&f-ldxG z^+zrUlPD{pI@jy;pfwru*3>4(qeI$W$XD?6U+}3Ir_lJdpm2j&x9S4xSH8mT55>al z-zE$*vXA3@8Ba~&UUO*x&XUzDQ_FK>q}YFiB%Zi`+^1pL=^dQ6Z^P}uc1AXsZ7`#3 zh$9U-p+jhAW;szLx0c2x&wu{lPwQCx5;T4~Ngb&DVJutD2kmaqJ1qYa(Q6jj6w6-O zP&vwdny#?GlUZ~+%&^Py6uGTQQY-y^FHbPrW6|Nw+0z#y)Y4q+B>Lr7iax5YuOjeB zq}=*&Y2j>hiP6x2i^x=V1F8#P{1Om0yRfi2_3(=c47*JhF*)gC`=Up_Y^~_&1_;pl zfN75x>f|zXW)%AGLy4Q+S`Bqbf&eu2N?y?x2@NIB9M`XnRQ+mtT&!QozC7mhfSfz9 zB~{C+y_X7miUNy~R=7Dv(Mfn5zsJx%UU(**)6|0#Usc@Ka_R~4co%i79H|<_@eOY} z28!%`u_)~vS2eB+6f1rc;-I|^t7B7A7d1X)*fO~&S*MWZX=s0^Xw_`5J|1-7qnIS8 z*3TlB&x(|L1`-#ngaSD=#pAY-$Tia^n0rl%FH82w-Z`(9@x84#c+-emW(rrd^*v!K zt7EigLH6Z`jYw`0qsN5et+qh-qq0tOue3t=YyxDb+O-YBs&DO*w!sS|Ov3dY_P(Ly zj7_>g^&*iu{%gv-n|I*^G}J$Ey9WA&RZH*TJn7SW^#IS{b1V2BDTMWW?f2Ucb1l@w0YAMN`+U=Zr|5!7e&i$tVzNl6u`IgamhUoIGt8)B5-!s3yKJ;ba-VVM5Q>iDa0)vx5ElA;Hd$fg+xq-0 zCNNbaxfXCxpp)7PN;jHBT3;{oG~A+vhi67WfZ$#Q-$PD-^8O_Fo@T(9;d$S z6b%oI;Z175p_dU(<))VB(YMF(bQ>!g4L&u0@7bTHoa);Euv09}F);~2m6Xauho%`( zCW{$46K8EqcZuN}_I6qlGjDA7f;$>8i-WQ6^74c@$*G6 zrBFjPhpaVT#kDN{aF@vlQ_aApV_l^|q&UHj?JH*^$KZUUpw6kBJip#wLGJGXUO}{DpE;!3Oh|DPh*bf@1Cw(E zWUwRli0X5q?&)U{OdopvqNbh!f_f3x)oIueyUx6&viyKFcSD_Nrp%P>bg0^AVUq^? zIAkqb6kKq^;v7^Lv(>$~-||aSx05$gmeWj@QvU3kDBhPnXX@wadM4}vSB$_jtq`NP zVoo8Qbf7~{Q$7iIfH^^t6>+MQZp&LN@%}sO=>5+U!4!;)&Rk)tmnt<%<6@X6>KQgt z&-h{TTDPS^)0wWVhkG?d^&%4Llndb25-F2jJz#PPBt5?OS%g(GNtYNFgc}aO#9Ut2yB2b{S6kwhNZuVW3f!Y+UCrpxPh!3NRgCm3TSXL)k=9@axE-r2uE5LpNk--!0PY z^x+Kh7=ZrQH@hng@;;l0&f_VcdB5<6OaNG6v%78U|{ zNvt0I$!he*cG>3e;E4)1LTqmo{r{BUKY#YWD3VJRcwfe;_#UcCwC$l`|Eoz*85N_e z`jB7#WgNR>qo8o5$rvnu582czl>J2`3ofjDy(ZkQiXQup*vpq2PbaP}@VV`KN3z!E z#%8h;w%fA5QKDP#g=lpyyWE_meG}hwLIRbfSc@${wz^1P+js%vK_U0(#M%R2qZUeO!aYz83Sbv4=9-$LWLhHJ=&MbR_paG{z?rPh zkGz1F;hr`K+BNCobi`Xs3i@Rv^vsf7;Z3_<9u7ji3}PyN_r|P4}C2&+TY%TFHCpG)pMbm#+K}@T+_;T{n{R z^Yb^&hnfXn#;|)gN;D4~)St}W{CtA)z9ESjlwv%U-psS;`r?`0IkD+5i@IJvfP2gM zdO=_W1k>G`2|X%2E`K%4;!9_o0j0d4u}zw_Q@{z@w3rpS$LlIvCI*#vqLSL-kx8I1 z#a|scqmh;5N0P4~=q{BL%P_@?%4l|zrufGzLzC?cCDIuc+na^9U1>9>>}E}sv(!Mf z5Hyb)jeNMa)SpN%R#rhA#MgTJbB;nV#r#R3n!Su=2Zc$qjNH6SH`f+vpOtsZFP8YIV;6s}N%37iT*=g%qZ{IibcO5R&Y~eK2JYWZXJu^N z3C5qIPGMowv%Sp5gU$FSSp8w2e@SX(%O3aGwS>z*-f?}U;|25|C|rsy#Md4jYf>czVvOIIP4IB3q27}4pkg4%Y2;JOCiFTJ<=q}OU|J+Rlt zfP@P3Ooe`K`&c$1(jm!>2VII%8FX%n>mJNswl5`hwb$lm_~Dz|t5$8zKMv|%LG>Pu z+WpPGS>Y^*2HAPZ(<-O>VL4?Iy2ke3H!Dc}75 zJuN_;!vfj>!zu#DNj0L)a-u?!@+F((zwiyjMNp7;oz-Ao;LPOBUyJpR2vgrtQ3vD8 z+HxHK`XPWcG%;46T80P*9^NX?`TPvb`Vz4oSmz(#oFj8J;d8`Al?w(>n}v@IGLjVt zof_Ei$fzjv>8TF5{ln1h@2mnwfR8+DdZ})#u3+$((}0~ynqc~EFxBAERs*q|EsnG` z1ttQpL)_-W+qWVNd%)z`?GFg?m#F+|wyzR>pw(O}qa`@VA=2PJM^-kIKy@W>mIBo{ zC2QBg+3#-8GW#yS_0VPSKZ>fdjpZwG92EGa(V#X)vImxlL5!J`ZWKJ6)Q<(R!OQzE z_cFw8ZIMd2BG-$;1<0yV`#mzTLrYr=nMoHeN-HoM67NjC2Z$!t0sUqoN zW2CqMkK1aSl>1EQdaYzR4{obg(iqSRinuI~ual7LJ|J03))W(;fAjfepa4@|%NO0D zWzMCyij|i*h72!f(;w=jKr!@`E0^LhNIxd zk2@Hf-*1ZloY0?eqDvXMAo0&$?eb9G!voDdCmQ=Y@Eo8i>>lZFfL&gXuR5{l$%>`Wfk>v<^z?Md*i4Pqg7o2TmS}CrDDjMHm4V=Kn(GKq{j(w z?|GMiYhGC%C5}e?6chyH(O_R57RKGiRU?GNI=JleX~C~))huDkOwL@4j%pA_o!s0wb1x?J-{xHp%bmWS!pMz=r92Ema8g*Cg?F=BF-<4Jovdc_W_E~>p`8bV%=H%tJK~49!Gv|c zeLT+b#jP>^sNM|M0lPYS^jbie&%>Yhx_Z|`PudU^HC8ys4S~Hs8*O`qkyqk^bs3=x z2Jx~%lH$A|Zqpm$mOGx^XHL7B(1T<~cHSRLDs`Pk@HAW|UaxY93Mqef1mhJEd&PKu6G zU%?#UKVeBY03a#vY z&|gnTjF%XKflGI#85~hlQ-jrK;h}FGuq*Zu)Yo!!PYd(jMN^(9jqp z-VdDG_$lvyz8Jm>+&^XUfir)*gQzo|kH22;EG{mFzLMJ*f1j1EH_#l4rDF80hxN#x zi50wfO65Kj-z=zH&?CcP=BBP7AI{D^S+j6Jc&kQXxrkQPc=mI4o#nIapP@T&ELZn{ z?#=CRc{j(rcUAF+9}I%YLaYYda?ZAdgj_O-sD&rg1>Z&gxAaz4B;GB4iupUYMz?=e z+oP|q4}jo;Xdmn37)Kp~)n2WNH7urfA`HqyZBKYin%SqY{#ok#_b1g)-Lw5}| z`t=>|t%@A!0+SBGsPVNmM^#^*H#5KKv5)6$7l%JfkykrT;a2cg)&ZfRp~n^7;bIa8 zUm-|3D9E8~eSnA&&IQyb?Ch?@WA>YA&kLCL$^DR(O2hr&;9zuU#QH<_G9JI1C-h|O zzCmd-3oIXF@^YrvG>)5hW6{SL$g~|6qE!QcoG~oMMQvdDBQK;0W#iW0KdR(1m)l+} zLp`qt#)|^CjDJf(4)*}0tp2*+@ud~w+60-b?!MU(E^2xw??csk_J=DUSq}v?y|#Ps zoAms;?bWAX`wiS*s0IG;8cMZ2EFmy6vy|A_-B{(9NijH_J#jD#&{VFk6;$YZX{!qf zqNzu@bSwt%2S`wAL2n@15ev7@mwd90z5dGysmwa^mAGtWWtHX75Snsc4ZTs00KS1p z1|4KY83txaV-zey1=D_F0Kc6^s(`kJ0Mo6XY7YG&t?|tCVqvGRRxA-Pb+R}@27k|H zla0IR^*|m_OW=MDTP_2T8#5c5K*5PC)Im?AAivbZKTqj&EKQM46>y)?A9SGu_ zm6nEvWnZDlOoI;=#CA?!s_J-rBTS zc-%2l3M6J(AR{F*vK(MZHGm)-bzlf^dHXRINF3zqaq?)4{^=AdNgn#j9Oe)liiIO% zt_C*A{w;bE)IDn=wzW0n-rJ!IlRCwQ^kE^%;S1?qJjJXJ`F1 z4Um*2P&@sA_hQ514B%)rvf0?BN7m)BAS5pXW+i^!w8s zLq3sz+@*)YnM}-uQ++x@&dl60VqmE4AzwD(0Kg4fc>k+OQt7Ut3M8`O^;%Z9*Y}^Y z@(k*+HB23VYSbEk*={B^xz-AJy40b9kAuK)m^|#h7RUKMR*X9VU4sA1&+q4|{_(;! z4PeiK@(z3N{Mhy4KqYSttqeVO(7x~#TNTV!Iy*aC(z46{H|W~q)+2JULtCz!)9ok; z!R41G{{H^hmKAw;#=F*R8>rYpt{c98e8;afcvb|yE$n^Yi62rs9Ys^*XJ#;*|C{n{ zE!*?d!IS>TnFqX=(5b1fCnqPRY=@O{^Yd##6&wc`()9X-viCFm&EwoVO8)*;DUUuL zNh8|-8HwV==b5kqIl;X@>Ky*weKs0keZXWtV}LMafm&aXqeEh|Wz1URkIOn*UeGJd zWXJ*rdx@>Z?&W_yNC*`TdY8+)gWwNp^F=)XLozwW>H@(L_F?Ab0sUkdIuPNa@prIs zc32bNf7^~c>UEFhDeiRLyYX3BA_0KW^DFicb!&kficm&;j6o%D7J!;yU#K;Pl3Yb6 zep}D~AtzKZQ?g+J9xIb+8`rN5`FTj>0+qn!!02$f<=HB)13*t6Fl~AxS+UWSWj$7dRO9P!@6XoN9yZ9^`Sz(EcZ#%je#THLd8glKEu)KtFMpesvgJE-C-P{) zprZwlPkC>!{DP#ln&-8(C_9I`fO!$u&S@#YfKt*u?C-tv_PUlT=?BJn?D&+6r8HC% zo|~I{)!yDd+IjS*og;l>S6A0{3kwS|F|jXT6rR!e*S8#+aa!%PJFGNVlHnR)bP*!3 zSmmFp_UDUuA9~CF{B(v-8PJMym?i=QRHI7fdfY%4fuAp6{vI_JO23jeR_i}&m?NsU zgQNg4pI)Hh&@3UbUsBlNbA7&``BXRJf?Ig z{7Qz+9RJ2K{{0-=Wk6Dq_z~G1u3vUPJ~1(oAz1<}$D~@65oo@n8k(<@Sg=mvQg%j` zU}PuA^Rf~MgtGR^PyfC;^_}4!`c9q_W!XzR9ds4dN1y^j1f1EF^mPA2iB@^(>4Lz` zWCPj3t74Lpb-;!i1JnufieTpd&2Hy!h{sdSLX5pt(htS(a}TI55ZaHXTNCU+w4-H( z;*_v_1?CUdfRix>_}BbE>vIhl8-X&xmbU!nNccRN5yi?Yf~Ogs&!{<%Oz_6h(HbwMYTi*dvLul~5~&nE#w+VnY_u>SBz zk;Bio|9R1JzI9-L3(O384T}6#fOTTk<_2S+FX-l9$fn{P4h{}fhZ})tjwyP-^Ed40 zN>Z9PR2Zt>=^#vd{5a3lGiw|ue+*EeWmKU7{^18ygm#&$!!!4cGC)EhZ|mrN`;UeF zxgLZ1@fjt|t?U2X@y`#yi)juI;Aq!@jsPRD%~=T28h@b-u#1I+E?r|F`4DFU7%a39 z`Lg%GPSOFcAO%1M0t=($4)?yQ>A{EwiboMpxU&K5(H9t6Dd3@xJ~G#qU;1*y7;L-< z2&aJ^_xJYp9;$z2@cX^}bk_K6{petUZFbzDJFK6_$8(uZ_@S?g;u95&pYjU|>HzBf z5o~lJps_WY4mx26ijb~Zr6VuNy-BY5-NX2G{Z>;t*ul{Bmd38DJ3Yod4=VZ^2?QNV zpB}(1DRc)U4*(h5*^lMr3IVbUg(!Uo8+-fP;Zj+F3=zM=hCfz}>*j6;dX@X#&C9O^D9>?jZf=p>feJ9=SQ`{VOR{Gf{?hipo`Gt2 z4!36ZMKvcC?eIBpr;1wdtE#GsNl09`H@_bv>15pqNcd4t#F6fRHU10mJ&gf1b{hs- z0nKJp{GVC>m&^#?0oz?uW?nv=HSbukUcu;~VHSfwu$#a9@NQ@w$q+E;k6x2ORsY z?7AMBUQxA)2%*x0Rs=*5+FRrA@9FAtmN+i>!TmB}c%)$X-=5X)%TK*dfESgZ^RCnF9h9}o z!+0PrYhsdhz(j_VDrq6MAY>G8mRe~nTnUgh8dzUy>+C!VTo{G=Q}$9jT!DIC573D3 zYv^J-0}I&UsBC6e*7|cA1B3;nV$NPwQBlF7B6(sca)mi!X$k<47XiUyI2cX}O}gZ? z^A||b&^V|(igVlvJ64iBa$M3{j|*7-d>b5(y28d|y=QILvOxK&cB!-7?I;;>D!=bk zw43!RI`5o@q^yJY4we_}fWe7)!#u6%>+k>n1qAZ8I6wmms2%`||GKTc{k{%F)`++u zPsIuW{k>iqXmw1w9dTH#4yY%DBI2aM&dr69q_+U%J#~sex>J5+GWKvy* ze#wWVq%-+egU7(s%>dA@4M|4>hceI&Uv&0TCpEg}kyd=U^KtN4ptd%YwFI{9AZpWx zJ!rwnbzU5vhQ2_9P)Ar0z0bJv`R=9naa(^KyP(Yi>OkIrlzLrrjBLrcv*VSW)i>Qi z)|B&}4Zq_eC-Z?%{Qk@xzfdv>{cWMYL~=81mj!U5 zz?k4f;_mQ6|313Zcepe_5Lp+D`@F+qadCT4gFz5eQo(!?%bv_|2`im}XB}!;AVFO? zwNUc0h)y$5c0tMz`_W#8%j@T%`uzpsj#4!&PIltVzYSHZ)}E(XiL&^@Q$iJ^Z{7g6 z<}?*l1b$1F{Z#XD1-LU+Z-HYDJ$=b$=iQdN0z9!mmbAg2k=rjdIDLnvH!~6m4BI`g zA0Y$KsaZgwPD5!>wEGVF0k8g=x6W_q`yYBQ9!;$#$V=JD9iC32VZS~I0LVEIyPvro ze%Jp}6od#OX+U?cMHCOt$Nrz5_EDg*|0xdt^FYT(F^GwaQ_-o9Kt3;hicG+QEa5t+ zt9jrB;dLJN0FEQ82#8donkzH^xZR&(6o2+WCt>_Er|eD}E`0kDn8iaizs`W9(+C)x zEHKlvr_{wh4O$@N80L-5@9H`ZJel0N{$xXf*IU=4J6#6Ijkl88!@YCEhH^v7JBSX; zbOOzWx(8Yd69A?m*MWju8I!plZ7mw~1_GegMj$}3t3RLopulbVDARxRa1^I1SxIt- z8SZe(_*%VaN*w3k0P#OA>iW!&OZpNF2K!J{Bu!OO?2qL^P!XK-2u2-=*=_ za&M~vn})kEaPr?)q19rK_d#wB0LNxcL6uRU7Qh#19sV>|Tp95?Wt;plA>oAM!a%PD z)9wEV`~zZ?)XdeToaYYWzyA8lUmM1y<^lFK1%n9$K068`u8iIwmzTMH%z#@76D1FF zIg9y>Ywz@j01(?pCziJ6@!s;y4xfYY=$N3OV3zGj)y%Ahx;(^7lNu`n8lpfi-(xi( zeeMM*d+_T%ejOGN5xfHaI?o|Z+0#3$NEzK7neU&DUwotl+N>ASE#1Q4{hU z08A`pe!nqBR??&;mRw3&+_ke3;Il0RT7X%racl=sTvhV0)NFb_voJR>%+WC?j_hEVfQRM8mNL6QE4EXtM`ut>jqF!vyM<$c>7rsC zR9(!27=PPSWN*sIDRH6JkDD_LYIhC9m!+#Oduew*Pb|)%AmTIiSl_|hRkAs1W@+gM zK*mupW-$;11K0OzpH++HBI)WHcW3CoC4$kr(qLS34`;H?ogJhC?6<8SNJ|7R(F5c7 z?_U7no)UfHK>&^cAeDRHL9Uc5C@K~NieJ8SvXL8o(j2eEpl z>@is4^yB;kljuC1;DhqUa!pc8ShB`yYvPwz8ZdA>|Dv%l;B*RY0;L4Q)mSD2L0;pyPm$WgUy2^KC=X0q+-k6$=s|J`(ekv9|`dUhx zL(9T~{C;G`!j*1k>Ez0wM#J0-@8y10<^EhF;Mm2UZSCvh0Ow$-l9u@k2xvY4C=F~X zwMw83#K}j_+TLk8VmZt} z9wfd#W@Kb=1`Gx5yvOm$2RgYf=>Df{4$#OtE%;FjAwk|3C4uFZb^HRVd5nhRFN>sj zYS)Fd&TMV07=xw);Onjr$l43jp@&@in*pq3eV734OFc-)a>)5aaH03NQjiR$mH9C_@#!{^0U_&6b=L6HZ9 z0QM~ajvML>HUR{$U<8AK*F({-#UOMl9DZ@2crL3Pe7^~m4U-482!GroS9V^Tv+1Pm0~wG9moxgBc!FRL4&G%q5XO}mqp zuyc z_v3s;==TfkwEctEhC$-wH9)OYsNM$vezE{ND)mrDBf1{i)u$$F;?!eg#DQ%?kxCj0 z{r>}4cl80!axVHGS~+1gW} zq{ok4J}Ean;PuV-XSC+gAQc7&1tL2|>eTOCRHcK}D=LxLK=3wJx5Hhy`YK5zE96-| zysD-~pM2*{nH#b8)kyW2l8TCh8}O#>Ct23$-Tk6+}YdZg44IZdZbW^Jz5-c!YpxWgS%*NF|B z*jxdj<`PzI(smE8Y+Ir@4eBqK*i61VAu!*1(3VqFVjFLDQL_nFD$N5KN%tR z?~SCs!*%HYarV}6QEuD+_%kyMDIwjU9O;xsViX0WyGuX`5rz_wnlV9A5kXo65s(gt zbX3BiBm|M}kdp4-p7Xiq-gEEa-1~j~{!@{eXFq%Gz1Dia-)k*w4NsZbabY4V(~9ip z$XgYHEDk^#1Q!X;7-&NpLC69CL;NByPXKsihcK;3KpZLf5Fd{e44(o=?Ogkdf2m0R zbz}l`u>^HQ5v}Ip>}z`a&#OBc7%6B6I82a4N3lo(^3>>S+F#!R;a^r9 zkO2H!Y*PNd2LAS!fOnP!{yp8&$cRoP=lsTI#-UVE=mZq1fT@Pr!QS0sehfv|)z6P~LPl)~rFf54KvyLz@0{SF~uL0v&379+R`OHHg zS`OxgKldngWEvco1)(yXDS*D<`%K5|F@bNLJr>+)Y5;}?QA-1nu_qzdz^!*_ITF%7 zkHvuiFdJfG3KSil;83U_FK-y-2;x3|%V`2Qf%oY^OnMw+&-Lf+2@#UVP>tMNcKqod zrUWLAprK(fu0P0CiT+kq)&FCV9fYlnri+w(gU1nM1ouM({PcG+3HD>YLj3~BSYZS{ z!o}4!0?esW1HncVtF#~iP$3{VAQ-r~HeCPJ`a;3?61P7|BK{PnfSwcr`aUJ@Hr1+o z$6fK6dt?NSmW=x#vyiE9tYo{KB#=@V9Jm6)`F%kes134P>?^k0O2M2wb~7-jSb}Kn zYi`Hral3)W?*H5cjkz6r^GzN_7gR6yHz)y*L`MfO8*tweurwe)T)4N~!*k596O0E> z0Vu{0mj%GYVgxZy7Qsn^pJ^_Yx5R%z+ zWt$1UznDGYAYeUs!QpGu4IleAgZ)2`Ax8@*un>Sjz6d80ZZmKwe$toypn0;*m$pw?qEwFbN-x;$nQY_`yfk@0bk_QR7y9B|8-02ui)q zv1nr+C2uwxkp#RF~`76E3YY)W@j`;v^P1yisOTF*M*JI8%yCjxC zl>!LP(caOqqN=h9#7|j;!8TwVLlm2=sEm6*4WMwmR-2f($|V%Uk3SXby4adwd6Dwt zjA>LK3&ePWgz^Uh(Lp%p1WK!R8F#R0Ugd6)8nXGl_W-C1<=0(3j*C|aJ0W@!07Yk_ zj>8BugD4dDS3Y=wN)vT}QvkSz$!}w$7gKHkSXd5|+Id3#W^_(SC4d=%^qOanc?n<- zGFw3Iv*?xEiaEyQ*c$*6PLi)bAAXX@0py3n1Q7>85Cz1sANL3ZBSCb#&k^)bneKl? z6#+1KKCLbE_`xxTG&=|XUPQR;2yf>epty27Qdt(h6&DW}d)9!GM=)fj;>{a%D=QFM z=O3H)0Rxhy2j}fRU(<21xo;)P#>R#a_JX2d#%|}<-zml?pW+>Xh|{Z0y3d%h03h+D zfOsrYt~d_l`~5J`m~WgW{NX<=0Dv%M=lwtiRa%=TKupcaK9lOBo9eguoxsFy&n>=b z0V<39s$Sp#l{2p#htz-#L0A0lgIu_JR*%~rxf(d2HA+D*BZ5W)zy}ur66zH0H{JSd z6?AH98j!v|-df)N5V*j*o%3InWMht@P=FORa0A#~EcL3-Z+}_G>>3=HIRVYhzvKtJ zf`spEC*kJqEvX3|s!8(sezmvbY|r1{r+@D8^Y4B(lZ{;15?A7;+ZOkGf&(ONCMj;A zVZdHn0L$(G?8pRhU6#G!@8lHJOki)v_&WbpJMgb}R7Zma&a#Q1nkNwH6NCzk^fI7L zBgh}4*roH`%s^~FN?9OwvD@)qzxHP{97QANskX>C|Jm;2PwxiRK_>_Jdh4LYN&_=9 zv&vV)VIv`>xz+NZmHTb;@@qN-xaa0l|H*>%Kwh9J9a!UaIXf|u^MW;OMH5;tG7u`tnNq!$hR!~7mW_kD(|gX;JN zVeroh7+5d*7&H|n#sFf9LQCTgP%c798wfi0rJB8^S7Olxgrfn1W0ST5Lc9MQ_{(E( z5Q6=;7-nvoa}Jgsb5qdBDZtq@Bj>lt=m_2?25=tVU+?}(d|Rim?bX6T=uZ;f5wckh zC~+TO;z|C0HA2tjUE1O|6oP5~ zy>HilY!qILNp9>eodZGn5$U$H_?(0*ia=p+^x1I%C)5iAJmgm753z&r%|9Kdf4e&Y z>i%K=tp)BFBg^a~7q%$-ZHeF^chr>AamlYd}yb5dy~5k36xB zn>T)p10c_95U4h`Z2X&$Ox83(TK1Jy-&9yOD}1ik9rKvLPRZbh8`XTNXB_|P*0@(_ zk!MqDfV9p{Y$hWtlpwq#C^iTg*P533##ePNg7n0^#&=Fj@p10ogth zv*6!11yxMjaCCG`4O)_)TEPEKSb(}iu)E{k89Ukp z(p|KE@-aAm%P%gx{JTrl5Nx)_{DACVZ5iuvx&(}O{@Cdz^LkTgF~1sst-=IJBB92w zrw>fNP*siMlzf>I)&F42to~lOcPwEIMDBOJo$Q21flT= zuU;~}ff1dgbNf$Qge>dd+^Y;g$6h}!m3$1uj-6p7P_W>Yv;gGLaT0K9AgoajeX3+- z2IRsPNQ*as)+~4KD6%xq2=e@U&%mc26hOV@a@-RDj2Ix$SzdUIT)osQu!QCsAZ-Ft zV?xAA5O@$s)Tg30tiV~%Ms!PFJMKfkv706+A9u*kDjxH5n=>T@-X2gdAa*xf%-arWyAzy*lTFD%4<KZzy^xG(7{&mW9*T3_6VO&(CPF%qJD;Eh~nM^w&sDgc9aR_cE9H!o;3hpeZ* zA~)z*y_wQ^`_=KL-_`0E7{cMpQxQTlR0fX@nV6PaQ>X&L38~|FQbVZ?A-9+>;SDB^EF=N~pf&yOVkWHFWt_q)`P zv{8fyDR>vC;4o}UmhL8(FL>H>yLo-C+X%e&upM`lso|$W+j<2?#o241S^VylpUU5F zUO$?=HC2M=hDoK{?&uxrENi`6l?ZhEL|oQ9?z$z3kLIPeyM~7 zmbb}h0k@>lOH{bI*e5n<3b60^mpW<5V3y#%akj=IN;8A7vj6$=G>{J&KNkGDRA`1I zXA(`FK3Gvrmh_JqG?KjxSYsnrdGCt@4v`{;00BoB=D=}YuWf3-mCWC|L76f5cgHbI z8&)>*M8rx4FnhuwyPx>-E_c7o1BgZ*$lYLNPYoHR9HMOd6d8B!x z?6M`OSQRwLYHa3DDgOR<&l;$S1zBHCo9u`p#zcl?%|G2j()ne6Z~i5v9X1;A1;U<# z;Q?#LLpCh`^FlZxr*A(>92GJjAs>CE$tuSv!4F1Nhlj=b&pi&cF6UjWStyzVjqmiB zYy+;i4Q5{!cAFioP%ECgYZA7<+VbSUYQ%4I=kE>b&;%>;X7Fq@r;@ zT4g`(rCvrlkYp#KSDvGrN$4rRu#U-|@?QIh;eaxd6({u~iDn@kIWPak>H_2HdFc%y4bM z*DUiBd0+x_zW(#~Z*fJ3W18EjWA@(MlRVDE5tLv*vfRi2?e7Ta*9EK^ zYln@TLbL;40yiB3+R1KHlY*B;o^LtY^Y=MO_)M9O`N03UiK+`R*xo_Y3Mf6cNt5v` zdf=4JAn;LLm*FPG4b#aL-MZ&;n!NRuc3-{d^4OSf8ovf+5qAMugAsW6F3^#UF>W4A zVw&)0ROJWdOhOpVoyULmojY2vhUKeE`QSEu_>=XfMVsA?*#S$eN&(*T-JD$EQz0|a z!*7y+h%q+7yFEL5)gfLYZ06bOkbl@_h4S!!-4cyPe}zAK0T7mp4>QK&=fj?SBq<3u zz@f*`KfZg^E_MYiHwel0rn|o1UL7l|(L}qAfLYM4e!x4;WkrhV@~FpN?kz<2oJ1;w36{{TO%2rVB%vaGMO8z{~=pz6er9S(N^8dwDm^5_|hOJ}d0n zyJr9jV+8{$+(pwtLMmue<2&Hkp#(-|)IS9?I}-#wOE0~{+1uUwU#DkM07>q;IyV!% z9GGueq-|?}L2BEZkVhuUEtcR6Ea%44gXcf_t~MoRf3U35K7-8mw*KmHsrw$2HFG4p zMc?U4_Iq0c7Sh=(VSgC#KX(U9Sp+?kdMGF@H!`%{p#CX+LW1Qi#tim*B*ZUA4!uOY z{^c{+U+Ow?u&Fgvb5p0cYFMGS&`LJCk9dkuvXe@&neeBm;n>g#m2Lp8*1(qnzph;} zuh<9khaF%(AOa$s@;ucCRC#fuJzY6pvQs>21Wbx;m28&>bF>7lUb?$=Rk&ILXbEoI zX5R~hOeC`kKGWK@1=DRWZx(_@e7uT0>ymNF{xi^Tc<;~!EBwjW_dUs-Qs{Py5*eUx z)jl)L#lUFE&81U1oLaVX!7JY}gDv?l9cU&9=2+~qwGFo=AM6KBeRc&}nF!%?_LXKbsI80=YIxYt7VCE8^Fc;Ci~J70aYZp|8H01K#UO7(Mqj z+8IVM+kJ{xnyIbnj*pW1(BeLSdNjOU9;zzuen%_Da7_w6xI&ruH9&1Uf)<_CpL3hSM! z-QddT297jM(D+qcRlh?drc%yKUL+K99qWqENf|_&&FF!P4NtxwhzzB?4!s2ZYetV! z!z-$ViQ+H30ZQ{R!^ZOfU(}@I(~VkBX>1j)Un=g{3)7wD`H(?i|{35$qG5Ami5~Wc`*!KWW|)e_vZ>sGa`HvHDLd zNu=lRQadAN^3m_pIdZ4S$M_uF{Oj&<7ob%hUj^M3;~2@i1hbH>jxkESt9#WmX^Hnw zaHdYXtU7{DQ-@O*pelahn>`eu9vc1Vz~rGSS%ITy)l1#~uH$zD z3`jMH@VyFk*}oq7Hae7?n%bt?-@M0hC>&&S6e#jBG{Kl83W>XIY( zK%P=ui z@SLVQ*hq_Bwq-X0I^cekM%9Ui#MO|fK4n%pacLvg6`cyQ)m}5Z%iXzQiTP&5oHN&q zDA%YB@073J4-B8-S$J*`qA64Yif4@T3<)7%zFpWBG!{WYn8Dc?4tkg55L8Ku{aKm} zM~l}Gm5)@u{Z~&Qq#wt?Zy6`n-naQy0OLr#LQj#5%QFO%EFUwvmR2OEn)>&9wfGLW z=H?Iw{d^=^zyHg){94<3&LD!1qER8sL-Sx=qTrp1 zf>CPg@O;mDzx?urB3KsufwA#G>oPLOaH)PK-M6i>Pp$4}-y6^5bN(IxN2~7w(fi{n z0O3dh-b>16^m+%UQkTpR_xR+`&sfdorv|t& z=h19$`HmcGRCd^2kurhY{Mx7qFk_OC_{eAosJo?@QEl+&2wr*js5c9AnV9=5RHQ+u zBHrB_IZB^jZV1A>&P@xgX(&!hu6kW|)nVd93S~<)M@s%IAkw3ae(Wvl1{n?g|fQrZb z*(tT=t;EmpvHy}x{BbTPU&8NItgIV(q<78;CV?~X1Y_h_`7!XPL`ycP_9Sug>mPgY zNeTUu(Ihw9IXx64PCx|SV~%PXYiS~Ed0YmAeG-vOlLdoI2GS<8Ta`*liv59Y;LcQr zjcJ%=;w3E>0-!0_0n7QTDd`VXK$i0-0BR)Z9Ra zl)oo00|#XmS5ZfY zbJHoFRQwDNdWVo%RGfnU{7e-dyHG z@bkcym;to;rI-kyan*S7cK__+_e^YN<&AFbwoBv%OLc0e&IAOuokyEZS#HlcfDLzO1Zx40zqC&zJIJ~_#Nd{|-dNhrZf=~opT zht}r|9>rcv{s@$q%8Mei^R(5TPxNnn8U``Dg7U7*{9v9BjwT&F9uc^A+xnc)ii#kV z8pj|uc~x`rDC60Sc@V7Ah+ig-AhaUuT6rpDCo0W|`+Qq8^AjOX)>WR%HrAl1$8$bl z_tuch(S7t|{W;tqA`x&^8hmNN-nc}Q&i7(5`I!9diT&*tv0ZWR?sQu?XQXikZjWIu z=6`hc%fT?BdOeXvp*$K-b>P9g9kDbJ1-+`9eWFS(>S-7Aj2z?4_qf%dEwN(fknuM$ zZMGe57cxGzKMT>_v~16ikNvWf0wH+pmrb8YHw zy}6M>)!m#(&LEim)v-DIMT~+V=d$pFo`uPk!>@R(Ye8YvLv5Bif3q8yx!wY^e4)eu z@})xetmhu?XNjy|=)Wb*2jvm!YhpGA2|_^I5lDUY#p#psw=2+JFEr)lxppXRX{+$J zKZ0dF;s$Y8f!h6WvHO%-(nJ+AsbP#!1zRTnE2P8UHw7W~eGhE#uN`4SNFBDt{_0*2 z0jeRX)X>!YnS8ES+p$7pplT73_mJx8zhLA7HxKpbOfl56H zhO<6pCe^hHf3z~#+h-k5NFo*dZfVDjcO0CI%kj)mHjvGQHU=|GZ)vn;eQ=_P7V7gPO3-5Rt3u#UCzXA1PQobMKDy(OS ze2dP6%SWoP*l#Q+td#$s4~{c}Iq*6XiDoMjcRDGasrnXI%RM1hnvp~$w+lK6y!{?Rt4ZHoU!t24$&+t1wYu@F=4ObMEAFi}SJ-~(yynFVnhR5b$paz1 ztKv0br|uJ(tg(SRkBH1l@ zr1%Qw{NbuzZ(rD`oZRjPEk5ls^#^X3Mut`B)jr@PNBI&G-ogQ=Y?P7m#O3HP^$NFy zVfyTK@Un6`5<;J~u@}ERyyf2G0w&VUg=}yPL~piCE%BV!PksBgtEfvBdeGnhF5saM z7s}^SQ{oQAbjul~t)JxvBQ3SQmxH7|Qg=!9o4pdRlL)_mo+u|x=>5>*f7`kGTiVS5 zf#GHIC*{uDgyaKx8P@efGVI05&|Qi6?UwzhnOwai8JYVlw>InVNhINFtm<#ULeBD5 zT;GZtHaa`l#=;felDZ6bSVx^J#P_|;3h2wFtL`%BTn@lMo$i2lnT>0p_K2wD^Ne4g z8pHVd8*f#+m(fVs5nrQVG0PY7d?_qdG|)HGQP7`GDM7S)y$fv_k{z;#c2SvnV$=mB z6l^IrxckJEY)!mO&8P5PK-br@RhYZ3be#frO)F7Y2Vg*Ig7+u#n(s6m?B>Mee*ycS zFqLJLES7kYeMp^De{uLlkiyYz3d0@msrNRO88K;@%kFnJ4x)X03hhFqPs#i!A#;pq z=1q6j{jz<#ThZsFl#{kEaMhWk{P<}B?%?Sst!V}B)mPoWO`M})%i3N#Ywpvk;C=1p z|8VDo!0C?^b$iFW6{@&$>gl~MHqSZP-&PJi4) zS~J+$+8Wz8Jv^e895vJkL!xJkn|3pZWa4TGykl^}=MIMS&&XTZGTzvGd6uSAWJL~zky06zU z(&5)J=};>`UbMT3sH&dOu?qNY4SBw;(2$4?^#UcN#66$A_Sw!|b5}5&^LI5G2z-06 zdDMiYOA3@c&xuR93Z0>NpSrfuXB*j*qNlui7n7Xv?lL!n{WCBKR&C^mYM#7V{@Xa# z08rTzEB7Pos@6M+O1c!dhv5n0SDc4UOmnw#n0ed8<9J)(Ze1Bz9@uq^-YW!E){Ykf zHed*0A!qd453asOLq2uHugGZb7Fee#_>C)P>)`CluMg`jlC~mVmshhJd__19Ub+3~ zW`F43`o?6j;}uSG68}M%H$}@kMtpcciGO)Lg8s}^!4*N*MAr#I7Ip_r(u$jdztdVo z67}jd(UWZN)9ETo3;|vW)&?*8B@eX!ROs-ITpJfj?o**}FHZ=pPU+ZuISG%$=7*~W zbM}$G>d`@qi2H(}tyv9_*}0!3s=F(9sK;;3(diHwhdd8`C(+1);%Q$7aUp<8D9HC2 zwL7js(*})ofwx5?tfHLhZF!1__r+!m#z!yQIPIW{+EljwialbP8D8E9bqc|gRRaFV z)vh}B=E?nz;8?Hi>X~${;?HC2K$W2LW-!=iKue$mYXSyoDHyPwN556xO>(4lTyu&( zl68r?%DJ+;Q0zL$kq$;-yp~c+F>j9Iq$`>KFd%mpG^1EAM13#j4QA-<1A-WbJD{qN&e!QXjp--4X%)`+}~JO#Y!~4@yIVZWpwnj-#FS_gB6PQy3tBq zRP*aI#?{NPFyA~ZwmJEOlqX0Uj2xG$?=`<+y|rwh&XK14sQet;2^KobS!+ru4+%4S z1fwGbn-H_sGrsaw0EKWl24CE2z0vDP>V`AN-p+v}658}y)5-(BD2?QLj%-tN${eB#$M}tdo0e`6qAF9L1|ra8k(<;X`EVO z4J!_E#GJQW)`D;P6?xd2KzJ-1lW_jNg-sZxQ|U^KmLNBR0*!NfOCg7 zw-Yw-^OH}os&yLZyKOPzAa0&6fDJDp_MUIBubYTuOzPp9Fve|~G18H}81|c2@l#r3 z1@$etzNiV2n#I$J14y{cIi*c=R^DwA`y?3zyy?JW^XD>Bu=n8_0@wb;QN*&dLHha< z{Y=35nIP@umS1J_f;IhNU}l7B7HFN>x+@a24cYJTpE+O#XFHo`X}1f@Nhom zxUTBnN9r%H-7XCGfhriFVm zlFW1t$e0uRN&6pGL8Nx%W$zDS`!#n&l7wy7e}`+aBl?(XGe&i}-}chHA_G)UAjq#$ zT{>}EZR|EBu7mhAUW@xkr0UgciF}R5)3(k$WXm)4vescCtgk3pkbx4mJYGRJ9F3pjZUixx%M2KMITdUbxyO_pdqYciB75pu%UAR?uzao&e59j1r7Do zzmc-*1$}(>#GG=J?B~uy&hoLb-38C^Hqw?#WzogLQclu@XiY!qt%bwkAlG5)wbP7r zEn9=-=No?xRQg{owB$HBWA!?4G%q*pY50)X7Xc0^AsW-l)}M_DHQS%ynp3->c_lS; zu8FBT^WB{%FKeCP7eZ`HkDzEC_slCr;_m%3$t^JyX1xu!TcHkSrjfY4E$4hDM^byi zQ6WbTw)~_$alX;=9mQsy_2MEgl6n?BNs=F_i#u#>OSypF`j|_;V#8>jabe%yk;4nS zEZs=n@Pg(+QulPL;A1_pzTV&A#{Uc^|HS-b6<-2wMDZK<&T|FaAw;Y6YvqGwBR@Sw zIkmuzUsvI1Fsd`*rS7wQ`cIzCw}m6q15ZYMrdIHL?bkYLgi_)rMv1XDgd+e$P(f1+vM@2NmKZo#dG~04A%e z5YsMX`{v^vRf(y|Am}4Ze|*S)_@u9l095`kpCs}Khwi1bhZIRuA@-8MoHoDUuN4u4 zOeze*>YA4f-~VEzvdVrsQ*TWY83s5~YM0iye!ISjudJxM4Nx%oD9oix6)h2RKNKE( zqGC4>~3>yo?N2c-BoIrR~u{U7rgaRQzE=-EWO7;=8vq>N1x)0|>= zUJOxO!Xc%;k#UJI=Hr@o$b>awYK2T#(j)^$y7z`oS0ks#F2h8@5zp8~-tFmSl@m6> zOoF1|CW`XjyYZ%p`1TjkT4BGCy+w`lb+MW1!z51fdVP&b`j`7Ir(sN9G3kpOq+JL( zJEJfzS5yYQnLR&pRU*YPpw(}M8KUJ*nK;xKQ=X}ZKDcyLqK~pf#Aiai)y{03rShNk z-7qn`lsqkqoPhRY=;^9=k&_rIPtti_Y@wb?|>20dL&%l8myw3e$E`SARVeGY=_Aa zX%7H>L!*54$mI{g+hgjDGpXL6^PWp*gbd8(K8PRs;g;w)IZ8sh_mneC3{wS4y+L#L z1AKKx4uZX8i=uVL<}dG*|1Ew_PwcXHV^L>U`z10-p$KiwcN0< zB&CzW%lr9LP}SgPm@dpTqPo#&usDw?=0{W$s<@oK`vLh)j>13`5RG)7jy~BF>E#wx zW*|Q7t>c^)Qk81g(u8YEBH7=K@^w%}I=%;O3E65EOFqO%FhM;{SJ-juAU*D7wm!S~ zVwKW{`s+4PX3*{F6B{O6P~QNn&@&!MJ$v0%ku}%ol*UB{w_0*HCPSD`gxKU%#c#X0m73!D>%%EJkQ|zRwbECD>UM zWv>`IQu|AfPq=@aGN<{;lK4YaVV-)?)tH+^+Qi#X3@nbQ$O)Dhsu@*qI#F{#+NT{! zgyhWboR)Jl^sc%=d=no1gmD{=Q9Vl8ICwql$d?*$0VNQR)$Xw)VB8SdTl$}HZDWJX zaatSdEe$i6q?{|fZFK!hAVzp@#<3;p@|Sg%b&>J2MbCTueoYp4)5WTs>T5?JTAw`+ zf}lFb2UM<^D1%gcY>gMiRQkI|Pa7!r5wAW;tGsTbz}3Tbyv6Eya48)yaX9gG=!ZE` zpDYCLxbza=(jz^hkZbnx?H_O-4s=k{MScq})&2BdoTH(`$i-3Zu2TCuj(V?$8i@Kr zPqP)KD}$D*&t>u$imdI(JvL-ohg#=^#W~V2YA~HZ>dde4dddRk`PWc+xSYqyEDvg5 zNVR);j{A~hE~aKKv8#?`hS-^D!w1J}1W9irN#Sr#p2Y}NovDwSd)_BR0iwoKHB_Zm zr|af2&N$GO+qujj59_+NeyWHA=dW`9b0hh#XJ81iM~Nb}F>xJ{JL>$0vt4fccURqJ zG{<-&+o9@4dFvdnSw{r9Zg6&bbCZAL$CD>xp;in%;8q0M@`aXS^vaR$@xPL5p383} z@UK3@w^|nv5KuN-STo(UXp~r^NOSIM^bx}0n(oGau-*!vMBEPP3O|}>Es2CH043pc zAv>0@8Fs6z^iB&Z-pmzo-k^Tj`-ZvWpwk@`&ggoBk?F*DO4&ggHkI%N{1f&MgAqL& zJrU-+=`xXnp)DM%O7QJ?^9Ug&KUW@edi^TX!Zf5sC>!+i5!~o|BYt}y^sR1|>ob@j z!thOO%ENU!I*IR@*#@4Ge(b}YlEzFDzThYQ(mH6!kBqM>{bfQ0irYky{&;6VI1euQ+x0#HFgy~t{lh>`T*QsBZF#+{D zb`t)fQ51<^unAuGCDL~s0Z9q(QL>!L3lR%s20nX{JDz>$mRPg4{;!O~0Zwc*^nI`x zvMfY1f)=5eA~2ejXH9dtzDCV&bg;m*@We_~lLEK!e3QeG%Xw@$k^fI29M*WCj<}Ab zzbVU>BL~(Z61l#Dca;nDvJqZ^-G#PbuQr&>&!Nyl5HSrYnh7G|W>t|VX+exqvYa)~ zt1ZY`-cW>)R8|dPp}9N<4-#Fdty`gW7d!4=SGYO4mE*b82bH-4ybw!2Y@g(AgpnW( zN$eaoCI&ZF7Ou5dild-^Y;~_e@7#n#W0p9E_aG~1i}UMNwYn~YV$dOI;gO&UIm?p=XFtAl<@W{wZILZiW(_MjW+aKar2fe`gn&SX)fq-b7J%>CTcLc)iR^M zaqHQmxi2fD`q;8D8XB=j%n!aG&f3mLLW>(vu7;Y&|@xn^X+lG*ghQ3vYlt)OmJ%G|8t&OfVHq?60ao6p=8LXOi zFa6eT9{Tju#u(52FUVRa%ld1T!$y2#j5>8r?Dnd(;=EpoIxIR;&B6wC?{oa(1~0?( z1gM2P(sCspNkm9Q1vKu*n&YA!*d*e87GEtmTJM0$yDlI*qn&ui#45|&_gw?h_&iP2 zocdw1bExFX3-nvwOEQjBi-gwXjndwsgP*=%#N3hIAks%_H(4+SFp{8~xnwBC+p{=k zrfXP=y}l6>U;Dt-DN2=#dd(HK?gbS-V87*}pj{f&nHk$n{jjz|ByPE=>j~xU9_(hW zlDx`2dF}QKc9}HsEIeiM#2u>*Ke-%9VhPM`|2Dlnf~)=LjI`LbhW0J}hK@4%>*I~Z z^u?PG`!#?5zg$57fEZ;TuZ<1g{a^s9=ir8xFOV}pNBL4RA%<>t+829Km>m)RNclUM zNdV2pUP6z;8LOd0^c38|;Uw3q6Wi|1QOoapX}6)0@l{cq)6vpJVMgn=jB_vn(3QO$ z!;R){A|obEmg-MU@hw4RK!9s1jOi)PRvfZiVP48h5WK+|i4KgNy81F}S9+AQ1#w$H3@@1p>uU3+vNz6zc9lFFFhwW?#u-nJ zzlte`sP>8M5%iG8yR^p(rx|w2H7WGSeNnZ5WhYiVf8c#Vcz@{^80uIQ&%TxC zKc%+MZsDcyBGE__c<(6mWd=?Sv-Vbj*6EFg(8f(?VwLagu^z0K>#0zfb*B-L!)g^z z^BM2@v&lD?GE@5Q96$gcL8etDsb3`e^q zj}lnQ70Gvh9#m!B2t!RGDVQ``i1W_hx&K^f0Q5XkJ{+^u+K0coq=la*A!6R3LG7nO zR`y1tznUTw@BR?OyJ&^&~gG^!D_( zvCl0pW2+UY(&ULho(R|sH!UQpFw?m)sYu$WqVEwdH~X!-8rBrRbwF&M&>@!F0Tne% zFs(e?gX1Zj-Nt(~0wNVF!s}Th|vP zzcN1HCZ(j?kL6mLF`&la5QjPk<{#N3<(dW`n}5Ea z*-=r7s29{yl?fCVr8yF<+0F{LX>3JM%Zc0gELOVCSLB`SPD%;M@`~HxUW1R16E#^6 ze~}*Y>$92LkhRr|RqRrB;8dvW-6*rT<8|U=q&!jS>wt)HiFSBbnE^SDemiozWxGY~ zZEkOsP%mG9$@#skGb!hoC#V@-eGX7ndEVjvW@uA_I)>#gLC_Gy6E-NZvCQTD=`zDJvhe%!!qdq@=y;{K_MCbz;ZL6aTD( zkio%;O=SbD7n%QIP!>@1WC{d9QF#it(gj^m`PAUBm^mLU`VQ8Cfol5I6hGzK6^ z_;cjw@4vnCM)BYaP*?F(cw*rt1OxPJT%Qc37RFca5zia_!OtffqD0ZAHldS<8sV>h zTl|uMAT|51~$^CXVk3I&DwA zeJytF24$RTFnsr7(5SXl3kMZHtvxA*rIT8{S02uRC6Bm)ONR|Wm*9riEMJ6eZYNS7 zQgC)|;$N@d!0-%CVo0!Ac@sBo-{0(7bFBE-Dh-{IVJL}EmGHPFtbpKcqtzgveE5TN zOHel%R}V9=_5O4Q7VaG)Y>9YK<$0u07aLmdJ68rdVB7O3GEF2yi1VINE6k4Kwjg6K z#X|Ga3krHMA&|OoI6@Zo1&$aJfk*Jrt4u2NY|$%A&UH& zoG}y17ZBXMOCwxi*6}y{{9v!(ztFL_HO8~GQ{cBf^7jf8x-<~Ev|LN^Y~0H^!>4bK zhmOk`sv_p$50`kHO;ahn6sHbn>Kad?{02|J65N)|jf%1>-={s4yCmp7YRD~&vSJVR za%p}P*H1L6`xENCz=hJo8z?WQ`gBB_-xiWTNT^EY-S#QTlpbeuErAV0P&U%zO&mH2 z_02UWdAx2<`9x5&1Vh|WJmMkDqYyX63d3x=&Y2WXTLF~FF2#)x5{-6CFbp#DV3{cH zYm8h4C-+CTxHozk!!QT08&L21J@h-%G=~?MrE?BeS2lhGEj65TxH{dg8I_|#7wN@G z^zf47u5o*i5MuYRbuj@}a^LPK%1wE*LojYbr9cB#<18Kqi_2?z9!H3`VVcehY-vJUs73scymF0{QC9mk}j*$*UqgAiv zfanSI1t0x{OJ8s9)g$XMoai5Dr;u1~wXtOMH!Q_=$oPQ}-hj6Xcy+#u+b8tL1$2Cs#x zvGa-EWReP7^y|xcL7#&D^3p@jlkUa2PZ4Yy>-!Xn*5p&OmPf?wpvbCgY5TCt zb^(Xg>$-3J9oD{H1yi3=PA3_`3v6F|J=%m}rsN$cFnw>l*=Fh+3-@}iH5$uQXY#BF zNhHa&?8i)C-vx-RrpdJiJg%--i?2qubcY4hDQgkGo{oC6u(lTL0aCzUFX8U%4!SM- zvD+VTP3(`C8=PpzYC+?7FX1~=Ytsoh)8px;e_dR0Tnzl#D%wZxVF_H;Ju zxlN9Sn5v#}g*hn;3^IM!l446vrj#beF;4598HB#m(~H5JyMBeDAA4^ne!96-Qr|eW!kB+Um5)IoE+$Iyn-kBn5(xO4ti<=ik~`AUpe-wq(xyJgEu5v3W=L zk=ggpF^<{+8Tq!WZLbtc z@(r$mbo!9MFbi#STTMEjq;{4plC=7WKux3$lHhM(gfSElT#8`CIeNtEggB;w*xjBueca_EFQtuJQ@`PkXY>7s3!fA^R)O6Dl@_o_I5fdpz6a z%9QGezmP5iWvN&S1gJ0)nQPL}6eDC1&-Iz9uyartWPq`P?)@@+9%FHYcnG(Ks}aS) zWZ?YS)ZW>^KlDpsObBpijtO@ z6{mZboD%?)IcMZ-gOfpOl|%6Pu=JVXU6!AsIeX)|kZEArbp&cU{kfRQ=N;= z;g|ox6GYu{k~)l%;gqp(9Tq14q=4p219nUG(?Fg8(aFajJIqQ9yr0*EW8QlLWsxqg+v`*&n8Ks z?4&>?*1%j4+rN??+sL-Ow%K!Br&v0Ay(0g8x#Cn&xXU{=r1DX*@KI6henQ4_$LadTC z$vFR_rHmh-hZ`lMz2+4o7&l+0d*kc$pi@4<>nD-{0DZ`^X-5Q&lX}XgxE;vcmll zsM+B10;B45Y3+mVI()w}2L^G{|GaezRnaOLp$DMe&w37BY<>s zX9(d_V^?FNuea9sU#v8oV4LX78-U{4F70^y{9Rt~A0j=i(od^n3GI>uCyDCNYEzF!+h`eT|dK;PuQI@3wdvrA?aqu0~xk)caidLI9 zM!_I{=wzx9Oa~LIp=EVG<{l7o?jhx_tWt7ESGvPB0D|XDlR8|yc;8{p|nBuz~ zx?D|&5!Ew;jDIfDNtzb|GXuWrY{gWnHN{LT=KHHgwH2;g&PSMCml5YFq6aCgXx>Z# zahkZ(nOrSVv~l0}J`8_NYyb=sMizE2jDAJt`cnw>H-|DXcTrJc()~}_+SEoaGA&V$ zs_u?iZj?9Gq=Th2E2)RU#{)0vW}qIh;B-zL0hGaz0XDv;MS}nOx>I%}bfM7LMxQ(K z8(sy+8{1VMk;2*8af!)>{Q-iaiwjoo!bHCHdB%GkVVpB^R;@%s*9O*x<@aL95%ZxG zenN-vsGED~($QK<#Z6Yij$^YYL=DL=a3yqxrKW^ExlPUv+ndmi z+>>I>6cCMRG)w34pbeUxS*No%+&#BQ+!n?Bc+) zezn$?cM0@ExYB8Nqb@hPjJye?_u69C^`8QyF{@Y!WXtdg<=;eol&mE~SZ37MM;jo; z#_!3F)z18okF{*bL-W)GS2*3=o;*b<5}gvN9ySvab!re{anup0=r>jqXeYBd89Wqw z#6Z--lE!@L971p{UO7Ixe!pFb@;7ohos?Df8>qogGPmkP!RX_Q&4Zo{M=&nxZ!h!L zknvrz3fDQ$2MvMdL|>O@3#5By=KLF(#+f7#&W__CYq)woRk5I5>@G~K*d2NAn;8!t~Q*K8Y>`keN$6=sU8xpej8B; zYM`|F(tW*qU>pII;dD%WSK!yr*bnv%hS>#62y@)rKACraSAOfHPayXomWwiKt%wo# z(A12yIY(?+NY?HDW9+QMqTIUvKQnZrw4@@E64E`00)limf^>JojD}5PY^4J7?;X<5hl_!qNL9%WQ*#0OgMeCC@iK+1dd$UJHAOI z+4w%VhopT^YcbgSSy%FcSu&n=QK?bD8Bz(JJaQVMip0()p2a}nzkOQX?7uNAGHG#- zHT(@1*0Q2Uy>7Tw1{QaYg)NQ-0>f|?F{a(uu5X=8;i4E@DKuSw=>%tpGEkKlD49-@ zM)F^wXBQqG`Sz7S!2NJ8L|)=O2_)~G=xO1Y)N#hoN9%}33d4ldcqh@R4{o6)555RA zdx~ffYZ`Q5v4URaItfZ!X>4`U5l3_@4NEoL@6J%On%k!vofg(ZS-*6GJ!7N(i8=a1ojMpu=#7jO6we(!ENeXhg5zu1VC`ymBx zM`FRfYX9F_qjr zm!skYzsW-N;RlV7!Ab}6S?@M4CSM5lCJ{n(o)6)Q{iO5~;&3Xra`(`HQv!|T{8EsB26y5NfE)lyd+h#U)lwuY_~lW5>MS?PHjDAM)SV6OYvm**keecmfsdDuxZ0%K#Cu}O)KtU2dA3Qe62d!w@XMz~ zK5A5m`e-{gU}=lfYB&DK&y8y*tlb6^PINeyCi7_sJ!--1DdAf5Y}_qo^`q-|_#`AB z=gE4mkVP4hC+&yE#wNPkNIF-;#(PYwL@)ijt;ISXM7yS=g@ys^@&OZmVtbh3h$nqj~cV+U!GuwI;r6 z>=)_oV2DgjCDr0vuw~SI9aIPv^;Zf0O=pSb0y0e z4ROjLFN{CB@zmcsVb*Z9L-c!*5zd|@`nv0**U0sqS7%-5^P;W9b<(MfG-fg=_E9G1PrSBQg55|4)7Bq4T=f5&EB-@&9GVn7k=2dI-H$SIQjk<4?LC zZ>*@)s2g+Pu$a}cruf_%rewp_a><{CQkF2<&Pc&&D5H(PHo*|0qRr%Kgp}_gQa)j+ zH2J%R6;PFqaA*>QdoBsV2Iou)5m=MOv{`4KC5iilfn_p8x((0OMO+$yZ?WNKfr7SY z;tXbk1`Q+-{RZ>^J8pT1&&6S$B=)R!3WhaMST>&0MpGeO`YuA(p@xM?&f!d3Yz zvME{NG}R~z)Mb1X15wYT0{h-C%SfN^2R12zUf6gTPas**m)7^nnWR^B^$j2ob{a+9 z1nw|0Ny9ItHG{@2Ooh?{4_FXX0Ause0ENBs1W5`NtF{vO#^0BgMvkVRLqY$_jsLq5h~MjbH?R zK0lq+1o3z4b(PkLCD>h<{&-4KyaL2#DRH&=CJ{CAuC?h~{Zw(QdS*P3yJ@J~e$pz* zpFWt1Hk-BhYSg-`&X1yVC~H|)q*|L@q?^s2X0X7ot=cJCFwoY7&g&(#GluckgfsKf80>PxCz}EUs)fGPp_S& z%zk8s$yrJb$Y~n(V8E4wuQ`fv=cD?Q)&Lz2_af^Bq-N-=HJ z8%u0nt={TKf=k|%*Tfa5(EJ?&4wlwE{uAsYRDc5v6t1i(8@L*+NdC9m_AdnLR-+d(AV zU2%7SSQv?$o|3DPRmY|RAs@0nw2PmtV{i4{R2ev$=$g)ENo0+3|FD0O6h z8-tGg266crt*N3sk?qK>IR$YC%ANx@RBg&Vch5J+%H-ko)ipCf&jgy{R?vcYqar1` zNo!Q33K-GVD&szrhpwwz@=s}n_R8Wsk`XyAc$>ax68Aex91g@+pSei$#y!~7)EXbG z>c^LSK@>{%{r>rTq8E&y6ootRMRiNH%(41&im`2N4Ht&bIY(_%d`fjQ;B-E;SrF`PpWP__no>^jMfU zMBi0LQa=&{fo;19<$-uY?jrmZstD>asbQm-k&sC!9HU;2{s`~R8_{tnH-v+{{Iw_o zR1*{ylI>$Y#L&aQ#43k&Ux25|zq%^AuSJ zR)cUQOrXURqs&#>vam_Seqif6e+v?7&|y;Vqh75;eEE8)ENf3zm3=zQv3RY}bKoNu z0rQO{wpn~hCoc#dDghH$JYF zi@S13|C~A*tt$12F5BFvLE}kZ9D6;KNWd>d7+j7o_z9S5pszp@A;{8@XuFs#9hnKE6;afBE|1tm4fhpdLuO?-a(#>bN=fmzY4{=jK(m$Q_sG2;DZ-wuKOnX=UN5>qc@& zB?u_ zrD$qLMgJ5adx^)YzC`u?PF){1=y9@0kaiAoAePBmTg-f!&au&4{~;<#+co~f6qLtR zsKNLYN)I_-u?`g%Nr3smu4A-16^-;gFF!!Eb*D}bW?nXu-KyQ|*-tRj9DnIkr?Vkt z;?6E~N;;A4OaM))BQV-zB8@8{@HtU8W*i|PS30$o7NU&4sVNkmMdF?ceZXHdfA-)6 z=UD@wx1=*ho+6H}gnw+Y+D!B!k)}IkZ1*ZWm#vu*9&E!BqMo(tU3O-7@u(;aK@V?e6N9P0Y3`z@OXU$r>?&Z#o8jkWPv=}-YViiVZ>uBnEr_OopZl6 z`aHD>#}`WYa04nJL%U1nf=e0#+b*>eRLNQxMXj=C97(G#@yvlcia)&RIw6J#FN6*>5MkCAHPi?(rNMn0$I^}F zW=H5>$AVAYIfZ4Z7Sg6=<{8aGrn#w3p2#w*T~{NVy*x`8xS=fyhbhC(BbR7h@Ro1G zua~Hn*&8$$f};-iyyoZ-XXF#ANxY{`hg&K@>nLOS-qiC4a;Pv zt6A$Ho=@C?SI!8qxeDtZA@O~afTu!i823kcjZYUP@G_+^prrm)X zCrLnw`)T3i2M_5Qp*Bc;C^7Uwe{$I6IfGoWMiyh2r&u;MMpwwWjTDw^n9WfIcETtF zGo8+HPx}v_n4upE^=hu6;#Oubm~$ zpC6nq+TDv2l*Ix2Lvh5&-;u*0!)70O2KpYwF{|DS7iPm-fCiMZa-x7T(Kp^N)s2d? zLYvw2SY@RTEGsv260VGVCv&)hdJ((kb2#S(EqG55KGxv(BQ&T>GQ{xo))Z^?2RC}* zyaH+}*YgkCN8QllA8VWkGm`0H{mK5A-=jYU;^HdNYL?cRoy?#A85)_gq3E7`VRE>2 ze4(BtlL^7kRe87*q;x@bRCb1oBK?U@C~%4_=#BTh%|xCZ}4YWak@HdvX<(H&a!)!rBl zE+%4#*7%qshH$xbBb)>Ai6iX+_Q@&w8r1k0ue4pgGzl)8q{EIVfNAd zoZKl+#IJM*Yt%UuReQR~@I?>PMkWCBPVo7u2}}+L2SN}%s_P0KfH%e!beK5Q%zh-m z&}q-1k?-WkWWL1!ZG^pqC6^w-`U1sUl_oi9daZDuERV}|KHX(spik~a>9_-=@3RCfOQ?__r1E&8GR*gCD#=?Vqh)u<^Bf=#V2mZ)OY9SK)XF(N z=?2oc3kFL)r&rCCCas|Xt|yq-*u@TC9kx7xTuPhKc01!phK{1P>T&Y5IAgf-($#Kx zNIW!whAdwA7B>u1_F@i+Gu}q+yCFF8>_%u*oRM1zYVgAf7P25T6`p-C6`aa6PGxZ) zsy7v|_Y&%TYiZi$)Dx!2sMM>}MK36~=j)IQVZ*+>(RUW*F*0?Kp`IX&fhp)beN8!r zV1sjfv30cP@J>UG?pyx3M*Q^#w_(Mal}dv4dBbl^p|OTqW4A{<4MJn~@#svO25-a# zdPelMkMZ7_t1ox%A>y3$KIuYR(S84O@tUQpBeo12LKly(2Uj&;YRbRGR{Y>HtM6I( z$G5!_U4Ll5{8vL3^p^%qxD%&ZMwp^g>d^8;HTkF<0?J->j7QpBv2wGSyjl`^2bKVN zP9MrW}Id@YLgxJa-|H*rhEEghM1Z9Tn zT8#lUkeC^&QGFE%)#iK6ER`4gVf7(WNDPJz?331G1s+Q2Vw?o1hT3iv;2tcTBZ0 zSt>OSQiOoBjgU@+cUX;Z-XNZl?+p5QJfM0;dc6_8f?tKD0-A%-yAG-DB+B z2o=~*B3RZlr`g6eV{;7^CEiN~$*|iHyAXwy9=&imcfp>KQL99kY3w%R_kQ!d;x>Kl zwJD!niB~IUf{wE|Ue<&zgiaX^0&W8AEgk4HM>SSWkKZs7V~pKfSryD16o);)+23N^ zYt)fvU|$}%IV^RM8I1efG886pQ~iDQ5~cFB0!a&M7b{~&9U09@i5EY*?~VqzydHnG zvx)=lu)#xh`Z`5_TCD(jBcN_>UO`)R#sIW#!P{DV1sF5D^0P~}ab=oP2~V$=Tf9*o z%uINN`}JY?$0e-!V1OXL%>%benqP^?s43!3roO~5SWn@t0nUX#-g0u_IW4MPUETLa zei@>YH-MXuKli(}OBy)m(aL8B_&_n3|Nkbt2oTx_ExTuTKW2z4}YiF#s4Uw0|Cs;fq+a z=O~VqY8Ek(y`pi8)q(+I>CBJezU1M-+Op{MpUV`#5!MpCMAh|jYrQ7n)#oeKdwf@I(amF$%C;;>dUt{4ZjE96FUS)9_d$WG9 zv4oy|-0M~4so&R-NS(L^H81^6;v&N_UjidS>_Xr!A7IxYI{J*8g*AaUgZBea(g{1dJdESkJpx)SURbC?;N_bs)LzYB}x-i}oQ(7a__6^pSg#(O>r7e5elYt|~ zb3gU9iHG6msQBfsiUh4qMh-8C4ITU8YwC}B&jxMyW%B6cPas~cfpoK^ktu%0fj_h# zN#jnIs{(yKxIZbqi!4hnM#|0`iD*;3A^QP14%BMf z35-|=PEE4iaoki7Uz(iwZzFNc2R{*u?~Z?mI6BuJExpx+OzqONtlDEnnQ%Ve)pW#% z8}7qWHl|M-JU-&FW@e=X+#;f)?xu4f`$B^Vay@xyf!WTdirI--{V@MZfiIp@&3C~& zOt-j;%U!FBl?HEOl3_fVpYB=0qAQ!(92ayf@Wn=L$-^EaU%tuXBz{VCS0JR*GDqG=akH|RN!^q&BhyCAnSk1WyYuvM3*o-SZ z^hG9MTr;3(WaUfM^h*$q1XaRy(XHtbQdbgL7zTS!J-%pb%P$$&v>U~j;9G-dGyNp} z{cVMXK;cE5#vd88;uH$AbP@{+_gg~avptJQB9mO~UHm1Q5lR!ZP9YPaD zZ8U9DRe-6nEzZlc5{!Hlei;G#jv??ko!ZFBSLP00pimZ|iE6~J6FK(yPzF7(;$AueV7l(y{y+(;Z zE%)tNCV6Yoy{ZSFq~eZO;xEL~?o~~@DT$P)aBY*LVtwZ}s-`Gsd7LJzw}T2QPjxIv zP#boqJr#qxZ)rVOCPkUXSs8*Qm=@a^w_aZ)cgyL+^F)f?Um8(?xDs6Sz@%C4`5TFuORg!_{15cMgd7%r=W~)2K&S#W#Q&|HV6+32 zIMqgZBPMGD=sHba8#4Dn!gW|GW?jpYY9MnEMg%WJ2%-2@9y$uqg3>|5A=e-d(D#_p z9ZZsRtOOq)DXG98-OcRABeS83ECNzwC5KP=?SRPRC;c}bC^#LL9JD?S4-0{b`>fKU zA724yL?5!m+6+l@VTh|whmf+r3PWfhM5^Nk4%mwt(TXU2 znxU6n+{7-BEJ)!3Yp5z9$~hslMVJTA0Ccf&nuiqs`3v%|f|yMG2Z+}q(uI#Rp0&w1 z@ib>;ggf-5H8)XU^~LwLZ;*J`*ug5C>I#(Y1~Tq_tO*|pj}>Qdp&-4qe2xB=(~}JT z8$b9_T-<@*JQ)Xrg`@UJ;FPFK#WxRx14S@io;lt<$+)P>m=z{xQsMLNpc{MP>Ru6r zad3a0C5>w*ijOK%niDv{M7Ul(Nj1_YdU_y-#k!fl^ybJr9dcg+Z!ePb%ExIaxst^FL0`eF00qh+92 zQwVXV6I$EfoD#of7{KSC=ioHwFGai*AZ$Tsxfl8$70Z8$qL7n7%FoV;v-VO7NyyD4 zl*<+@2sn_|aO)AHK+lW~mJ05^77Rt;R)&p_SmXm34KKsAaKz$n~;m?A%sNK4QS`Y`A{y@-bq^3$vLCP~U^deR}1 z)r&%o<64nB-mpYW)-|bjO^_5=wO1U!iLA^NmjX;-4&EX8h?d@rqrGng@?b@kJWU;O z9j*zgdoom?Ud3K_Gp8MO%*Sx<)yiktc{dtsF>lFr9PhpE(IIGD*=+6eB_Ya*45I2B;oKP0x3R5Yn>%Z2RED1Vs!^z5!0RmeTUYg81m+!$I4itf(T7=^+;m&IX2Khcm zJ$@&WA;+N$_ciB@ICYd_QYZd<*^ZVMWP@(DY6g+=f;C}8T6QzCB$5LA5O|A>LuOiY z`nOu_L+JP0ozveGmAkJEUlprVNjBCPDV!QG7qx@Yy)LAu;z!90eE%9XafR2d#~jX^ zb;Wm$?=%^9|BgNzQ@qfL$*EaonuVDR=$2AbMb$~Vs4t?0Hh{oNzRX3!*!w1Z%#cSY&>TU$4!eG>VQ1s2GZ?loWknz9m0xJ>(rnGyWzrQugE=ithac@wk^-+Y^$bL zKX})ADitish33(xu^;@nSv8%2#^Ye|6v&Ca2Dl{T=dS8s#lVq7=_sJ_O`1pw@_h6&N2~U4_!70H`mtpuCtcN+ouL8e zowp1e-X@?m|F0sTG$!DgS1?tsV%KJ>Vtx7&nZ6*T*somcn^wI;)|M549YoGeUmY}^ zRbEu1j~G=D_V2hFg2@~5N)ObKGqZ@MHq{LD#$OpA*iEkvq4cO^DDBSX8?~ zvUyi^k?4q_{&K#}59QJXuTNA`uiX_mXG8Q<7tDtfW-E3oY%;>F=~VPlCl|%ZKokFy z_R&`%$B&;$a4P|{Yp&;2A}6W1O2cG?g!Yf>Y`C_9bN${ z%I8kRoz_Rc=e5%Z2cYtkXnkT1+*AP&o6iHle)cr+erW!VC(;p!)$y_U;M5Ww)INhb z>T$m<)6OFK|I6MK^IarzJKMMrMUvj+5VwGhVci&x00X;n z-E^0ER6$A7q{Kb`2yvX1)_eNFvq+q?2@9dH8494rak?qmX0;rnfE`;x| zRhxks9^%Axp6M&v0Nt5`5E_Cx$) zHaxnQ_Qa>TV8mSeB_d?`0^b3Hm{V$`r(d6MRO7aPX?hQ6l4er489GkCzw5UUHiA_v zL|CP@Sq2a`IBDUWoUh(VR4E2JR5DPh&w$HlqaSQe3f$v+046|A;iNXLkOTGk_s8cE z4dTdwJc%vL^MHz6MWvXZfu^Jiw`s+xdCeYQy)o;96zO?bF?g?Sh08rNtG9dq^=Pu| zjpP;;Z^k$GL&+wm0b7;wu|B38*JT9-8<}J7nB42yIf@m|?lWt#v=c43Z1*Zo3RQOk zJ)8VzjvJefV|x1=&X4PJcvj9e2lD=kNJOic9d6GZb<@loE(tFH!PBFr_5m(YfV=)u z#FIfIG$4rdNM<@s?E4K({tq%78ju|;cmzXy3^mKlChCv&N^?HxwgaJ+;kHtljcv&X=4ZF6_Y4V34GJ;+!Z&OdKIL~}h=(X41EPs=OJeaTsB z7sg}xuDjd`2oU(Pw9g!VnduHTt@W^F=v2~7?Crdr#O~mIgZvCS9>dqB;wlv_q z-Vyc57b2#N7k}nuP>QfaPuHht%Qf7{t4_!*&2(9N%@WrpT#7=sm#yZk_(xaXo9QLj zP@ed3dayY~+j~BXKHT45Sa6N!kF}Xs@#|=ZcHiW_;vo{D`}R)|daLhMFnh zW$5b<$hNM`7|EC7;LdoT{y1tn7-(7;K;!5Zyu374@hocWQ<1dql$nAI4cD)%%!^Nw z$dI>nS_==7%JciLvPN>aXK;i9aM4SDsht;x8bYlHSwSmtyDLqaq#NGB2i^+=WBYSC z2JP|e-+P%pbOME#^^QzxQ#wFs>iks5z8IT}%v@>L^bu5MPsz+wqL2Xuh${e68QRVm zETL0q6u-qUPGFhYXJ=4pnVO|o;63H33(&)?sY~_D1TC4iU7Fby90WDQ``_-{2x@Bw zx>xgH1rKhqNBdi?^l%j8XQcFRqrG6(xrv!udgx6LPfx30?-<|W{l(93q8|0F97mtY zX+9m=7f!AecRlfu0DuvIBmAD7PsdO(cFuagCpWKBKv-V;XI0Xfm1c+Fsc{y|=~Nc# zZ}Ye(0*)3o#?Q3;c!;rhuLnd;(sTOD^|%@Qjkla#ci2l;QHjsT-b z-3`c_kB`<IC7?`WlJu0D)oL&*i)HG*uVmu06Ho=;$@#p}QdsAi z<=n8Ub&QsCra=18B7dxnv|m68^#un!AMc~K zUMum0Ngpjpho7I$oFs~Pd{?{QS@>!Fv(;w>lIw>5COZE2MF3h8Zi-KSe(bQ)gu!ZYAiYB{czg= z>)3}$91rmGQZDWIabryz4IdaW$WQ#`X|^{p{YuxcXAaRL7G7R~OA|9_o%Jt|a@fS9$_@EjCX-8e|ieK{u?UiAGR*&8Q_BUqIUYn2r|?jTIw|KzY9iZ`FQ;( zI|>W8)-4Lhz#(oqKMg)j1q^et^Jry?pv8`;`p%V(DCRvI%OE_UTO`(@A z|Aw^+N1%>K*&fE+@b7I$(pk6=WF*q9EIXeqInVcqZ-s)Rd3HN{dyBb`Pj?v4KLvL@ z&hYf~^flWb2|69wBVEzfHIA8~zIO}YkRt%c~Ei)c`5PCXaBH3P&CNb{Lb~4eRyCwx7+*k4eT^2i38XB`%V{dQW}dcPWbjamARmI4qsNm^zibB@L;fX7IgPwUo6&(@;Mu*aKk!@4Ff zx{9i=O$56MSP$!DS!&YYZAwSdg_PDFjxzJ~K>A)I2GC24q#N*AB8SQaApWolH z@zW+ulDtU_Oe!Q4S!*2H>2lxr`!ghU1CJ+40NdaK4l5p3KZ&^q@JBaIqLCK>k7?%Ib+AP~k50DemaiphmiU-CcL3@fo{Zv#tm9;ELgF6sM&9lpEj9(3p{mrKIe z4;GmmIrbxkVYlVZ+J0`h0uI6w@@w$naZ^NYZth!tZzl#n<*UO(LHO>O#SXT%E0JRN zY$vU6=h@CWQ`pgKFk%0VT>GpT6~2B&u{P)p!{wlp7p!hCz>4m%u8fa0?iDp~7ijW& zEmigRS@h@gBOA%t9%@thAD7BF5-B4EJ{alh>Pi5SS>M*7j7SdGlT+QMDFD_14m^!@$TamVsV0eesvy>Al&sVF0I5T_SUQ(4f^9k6ElcF*8pS1^_lin>` z=go{Qb6jr|GLw{=hX73JRuL-UQKnMd%~v)0cZbNWzI0|}-by>NcNDs7oRG;~k;+jr zeejJ(-d5i>V4m!tCEH=V_VXLocA&RDzq1v{bHj4Wxq9wd!1%Gp8y4-$%Fto*3`sIA zp77vYPIfv?`P%3783-iVLSX6nYQ1g_EuB@ zM#N&l-qfF|uyJYpZM3$M^012ZdFq)an3XMG3k=Hwv*c@CU*9hJ_U)T5N>EvSq`&`C zSXkH*Q8c-Pa@U+}h`F847eOooP0L6CfDmY^dHtwF*U0rQgPQWNfqVqRX}Xl3>|ZQ6 zxM}K6n0#rx^8m&t<*^^J0>{d=R&NSxGS+V4kkCChMSn1T3D94Q!`fL7N4&WH;UUv_ zu(b3xl)hXY*TGN8?967*Psnx6$jxLIsXh8JvIkk+I$sN>Pdz?aUI4V1(9X`eow}yu zx}DuF9&6}GdK5=aCVs)E5R%@J5A4evoSb`#**UlDa-WOw5maU7=Gfl5I$EAlY*&lC z<+j*y;*-<43fyN45ZWB^Y2pe6TKzI(Ne|z_@!wqlEV8=_XENd)#Kgt-Mo6q;w4EC^ zDo0bF>IhqoxDzvqJ_`N)WX0XDLEz^Fs)&`-1}uaLn}ZXcBccfMhYbfQ{`1RQwVXwx zCDM8IwLm*muiQsHVCR+T%c7I1nN~pXTG)&TxIPdTwYj+|k(PitVPKdpPEeXTYwNGW zUU7|}Br}nXy#>AWL2!cG(cQ{7&#@<9Ddz9D!5fV=kS`LJrP3N2&z~-l*qSMt`0a+V z?mZHctdNMo#~taVI0()%oL65A_@kTH+f@EOt`~bX(w#Z&<7$m7y+%PMevYGlw!mq| zYVMb@ayNi?kIIZ!5|)%Y+lg2n);y0hJ&N&JjFO+{Io~asZ`RJ6Pp~ig!kIrEu=fRQ z@5(aXR_tG#5~3}ofdNoA(zr}dPv1X091~(ND8!zfP$})Tu16>3!DdiK%Vm4?8E)S= z5d4eD#N4HEpfvJOUmq=D?hGM%wY$43@>*MSs@&Crt|K?ECs|xrgW~Imu;crGav#w~ zX&JqSL$i@&3hxFUj46kg-+#+{mE>I}Eu%3oggmD|Oxxvw){k5`-6bG4-<1^)npoQB zGr2MnZWja}#1yq$ct4-eKXwQhPi@Yml<&no%4%(Gjrv&3UY!t2uBW`F@$KurFaD>@ z*;U|qr)Or~AgN3l6PjuM&Eo`J@0*-VGPS-}Hg+;7eP%Hq?#mh33z#~pIPGWSX1gKzZ;OnA(8Xf zq5lz|l^UKdA0eltgZJZN3IY;llB#gr$Nb>4)N^+&OX0h1;q-~RKNJT0v~_ithYeJ% z!Lkpf-qB2BuQzzDZKB+jICDPqOy}2IS%htDZ1`#qXJ%%eAZLMhvAf1+E0+`zv~F>9 zU&t0ac^|P2Li3zUfAawUvT?>#m0@b+#8t}BJAHS{YEgAY?txF5)$NJJa3k(*CeyYhi*3W0+e z(t}r2Je!Fac7IKR{pTIm-0zE~eMdrRL&T!Q>m|9Q}TIHrkA2~u`)~Pt2|(e6z7&!1y?dVl=bYk~7l!h`l%1RV za>Kbk%J_{aX$T2p_|Km|FQWCK;o(+ga4IAXPr6+I+!i06kP@C>{{LU5-$w~~TZlq$ z%P+spc0T1V2^e7NBe^j$@$P}VI>(Yt3T|aMVY?Lwq!P((< zvUgj)e%UTg=u9rr+JEN9U#t(RjsgrvmD^9||F}&5-pP33SmWd4yK1XZpF+|b(wPCI zj=@mKIUJO=UXwbF@4cg~Jq)3bclz)A;J^PDOygj1<&7e1xu)NI_5M2)$PLVcnbu<{ z5s3B(rRKW^qRb+&nx7I-wH<>~aS$t;gEIF(A1&p7vU-g8+pq)C$Nv8Q z;)7u{8vRzlRwI;NTxh8`l`%OvnGclgG?P4d^845CB7>==*TA$+toWa&`L}y8dxBpN z@@9MwK0e9L%L5x|sb2LqD5cfajI5}ymw5T=ReD|?XYfsO{N*b5aJgSEaPi4w6Zq3% znc$a1k^jEzfBp{M^8W5CbC8x(*U-59;e(~Ry80zx;B4tcT$mCP66S$#eq{YIxAEpb z+&ee8cS)+;@xQy$U=aFxG5!4g)4}|>IFvcy($-R*8hPu7?c=PMq2c~4S z+SOuxtbsM0LG&`KYD%~1)>()Adr5+Vvx@+j-@5xbh|Q@*-4^{tLj&>tvY7todMHDD z-26sRBLAB~!j3~-Bxkzc^6`01R*yzM)ol-BWUQ#Da0N1et;XIn^byiKcgia&+W`0; zdju8s?0+u%mtW9N5h%MR5h5{}|4g2L|H14eKAohWz{PB5VPPp*98g*Sz7!ufL6J&= z0DCaNpcsQ1%40AU&L+L?to`OL!F1uheqn_cZG~-qnF`2vHzFV9GRud(bTq75iqT08 z{5i(P%^m(hDQ-zy+d1I;*kZNZw!g2BcgW@+!_mj^cfy7}pIqr4{rk56>p_qNY%Yg= z?<9)FI0y7Yr$Ca0IO6>vz121Q~9Q<1gz{Iiw?6|9|t38=C6ThE85TrK? zQ!%=5bp6hMy_7$n#LNsYluq;(2iR!Dx9a&Rx%48vgLW4`U!(;X<4j#aqeIF|umfh@DP-2I=?aC)DAHAXfcbnP--0$2Blc87c~6VZAc89 zd5|Ie9AaQ(MAsF2lh)xAKtca@dVXhxJ)L$~VGZmj`rRM&M8U1Ct%3c&gP%!BLDAY4 zMr#40o}E5flDp`2pz;zPum4=oQBy<1E!^*&{_idULi1c0M?Uc|zw_j;w;-#SR$eY} z@n(7pP3S@T#I^q})i(;=t@^#5`qkBxsk-#SLT-|BVs`4s|6u9%u7Tjt_kkDbZ@!&M zCk+^7um`@cs}mnMW(SULjJ9T^V1fAFo67$smQj09QFOOL{?|#9#)z+_tJ}UZn6<}| z+a6ATVW#Eq^PI-3`A7=Ayu3i-5#)4&M*WR{JLw@vBsWvBSYL12*>ARc5dtI#jM_l{ zlWnXyr`_K6!FnneDrED8#(@w(A~Q?ti%qiTQ2?k#r$Q0^Oj=*%m4LA$l#Zu zLSE(S8y`>5)xXKf*~M7^f`GOZNq_SN`=Zv05tGEGCY!mBAO${8s&mWZmw*0aSVgE{ z|Bte_j;pF`w?Gw8KvWu3q&Hmx(%pNL(j_4wBBcll(p^fIbZioy%}i zXWg5t_r_GJ?|#1y)D6SMV{7?wac*w<&fRCQ-(1r47NGltuXSc|!vt2KD{9H{X{!Nr zrfzJU=I{~pCr=c4W)IRWd64q=S=<|l%9j6 zdOJ2ea~TVPT~`-)u`1wN!+dT>#Ru%F4JwstrM{#~}8LqKAHV z6ZU5-C|Fv~5)g39!hKB~0>N|)x%n;AaF{9fZU`WJcMxxwb%$9NoGyI>1I=v9178-{ zQ<4}>lLQ}|LA;u==fSLK?elxj7xLj>;Z`CbYbn244gP>x!pHbNfq{YfB_-h?u0dh$ zYl;vrh!)d6Ui(3bd~Q$c`WeVgZuVMzHT_F+fpvHn#5i%Lewsg{sLv_W8|UQ#us>x< zNJ(cu_4hRjjJeQ5$sD+ebt?;y?cnZZVsM(Blx{u$OZdSwmNa#4NCzFv|6B>bb}^pJ zeGO@DZgy|{sDEn*h=JVThSdi)cHfF#4*+(qJ1HATJIA{(f5M?Y=o{C{_(VT@_wgGH zDj~S$je(6%^#b^ANVVqglWHr3-@G0nx`~VhVJMbGb1Iarq!qLHwZ1ps>k63t4}D=E zbAhx}NyQEZlPu(6+yd5BNbV;n|$$aO4UpChoAUtxt z;bhPm?k{v|WB@oYAbRFL0*8?8W|~ zcjYf5e;6T&I$I1)gB!R)k^GWDw^BP8M()ba)-kGjE6fj%?M>Xv>3!|lkn%Is7NkZ%lpf@tAva+Q0b|@2vV&Ol$6NH7GmDjeY|2P%? z>oKO_7DH0<79fyi0Wxh!M0l!S*W{&|*CB7&lljgcHI_;v&&EBGN!aelmg zLoGE_d;IiiWp(xLs8rQoq8rv}kat62DF)04(b9bH{&_t>nikr|F90~)UHeH4?tqGj zOE4l+6Fabg?vPVg*C*uT~f`X}MYKL`8wGW{ol2{ieWfe;S} zIJKbO;b3`7zp6jUyk$x`ai_4Tw9~Js7G`{ZPk;#?NqJb`M~~6`UAVup;DrGtLjof% z=2XU`)pmw=Q!i)@4-fwrrRsx5TH?UBs{rPeeD;EHQ zp6)BqR5voB1WH&L0J(ba9^G@_N*;d^$EG{CE+Qh5U0J!kLQ%y4H^NY$!1Kwf_|eSx zAFJoTW8URQKIEYP@C^!zty@bF_1=B6v?weoTVc9px#UP)yB}m9=fyQfnf^Tcpu^>q z8Ej!MQMN;v)s+!(0XoP5Ob!F~=GlJjpeqz)5bDP~+M8D>?D$*+`v2G|Ckk>aDk>iC zFC@WGvd}X!IYHWZ=j`G&i9g=2A(8;(U~W`MG57sPK(GY?wLmkk`Q78`EOg~<&ibj) z#OM=at(oY_$bIQ+h(G>4G$EZ8-bG#W*GDE{X810S&uoWoQwLZ5O=3pn;42jT5LmSR zSb55QTyy$KbUv=iP=^AC3BD`WIk;H_T<2R129M#C0hpH{Sct%w zZi$FEs^5&;|Dxu}14vu*rM`lV*AAY%Yy0oh!$2r~2a0C0DvH<`RZ@OXe<)Rhf6A=} z2+IAP3IeH77C81xYB$^6w>S)|n*gO}1~O#8j1hn!0dBc_fsE7DE!KO?uQK!(o)0Ib zO0rwu!CD6HP`g;%00^4tXeCZ4E&c(#%3sqZB)}75bd4za9%|VR*YMTtHei-nv_+p6 zk*ECIvSkCy_DoFRISi)EP`hC4vD2^j-qG^5fPezPhOu$+^3T-NjP?1nO-GYYlv4z` z$?#t97JO)i8*KpDrA_@PAu2qlgBTmTkjn}8=UT|i40bUr25HFDMl%j(QZU`i9_A4AXl#R(;r3@M{9 z<8%4850JHgynW^ni%&s@N5&ouc7m*>rKPc*^J)iI3uG$-hbqt{_`V0`*2BNT_b%{& zqXXO?F_>@QLHh=rkw5l_Y+Utr=8_%4CmVwlz-l5PCvS?4=@)$I5p9 z9qa%1Z+v(mXpN|aSpnB(Fo6Fk46H*)XN+M|m9-=@SY2EUX$-mwXb&TDlcS-*sXec= zJ?!_slQ4+|051&z1kCRVu$`4*zCTuHX#=KF?o% z)UrT{tF(;M1p@33uA@>-_|Lxe2Fx(_?m@2`%m`UAL>3m77=IMrT^UPtFflSp)zvV1 z)Gb%`X!3LI=Z8vUdUg*U2o~+y!koLmx7Sz*q&AGTU9E;AV@)S;EAQXyt6Ui=qgUnQ zZwBYh^!H4ejbG2|De@}XivUV}Y0k&D@w3a5KTuoia_#vgZrH;UXWQmHsm{^PVz&^? zTX@jl0lYSoT1s%%N>xoED>&!PKKtW71~%6Wrq7(hR@=E*h(J(@i$b+(T_H|W4#c%8(J>uXe)s>5&59 zEUW6&qK!l9bJEak!u(jVq#+50|R7G z)&vy1YhurxlwXMoQF-o9K5%e|Af#822dDnmcGluQ{l5PiFi8_YBkWeeCLr4~J|IRz zgfX~awh;fMS7J7^AM#K^iUg7rN@8p2iVBl_ibf;Q@6%TWfHrAdoNIqSl(-hls4KEXWq*R|F|R(C($KIoWkTDF_S%g!MCON_F19El;mYz)mZ{Q46!N zZ{=Umc;F0>G>~e6F5C?Hl?j%C1tsh4TLFHDv71lIS&Ou_wf%-Z!Qm+I?I(`GDh9mb&S1z=4Y4_=z84;Ed?BAt?*iBwurA(zTlnJS%u8Ej za1ah~7sP^2zf2)j9@uCgYh)Ni`hh3}NxAq%)m2qreocZ#++?OzFgxd8%q0M!t2XMZ zFppmd!ceezX!f(*(zQz%@GFaXX`#Rg(E>D+vT8_i2jp;DfFC7LKSt`6ewKN&i_1kU0! zF8kVz6R7$m{bxKr{9Jf9h(O+>JhN(;tmM|Y3q4Pk3$m6##*_tw)~9PD*P&b)-+clT z3LwD5qaOcSP3^6&me%D4!X+NK3B|(MwmQG%wliOm?Ev$-he#T24N4(L3o0FzIFNl9 zWYre4^V^LiQfF3G@ePz1u@w&~j3xbPz4|>H)W8LB@)*A!W;U+HVnB2dC2{G4V;S{+>)Rz%bz0rz^kne~SP9=d4Y^1OAjJnT0Aa!TChl6jHH4Z&~@m5(8sn zs-wO22sMu-O>WoCncB^ztu6^_-uqt{tUeC>&A`JB)dHE%U#${!-L!Ce>O32#L+y3E@#FY#8OnZhnc;XxVDZxV%`+;?9G zwrZ$SaWH+lCpC&BFW_<$SK6Cm&P=QcO%)!6EvEmRuA2fv04LgpK{>AB&o5?H5lJ|Ero zn!y#%nfEniHeHK?`_wmjg9&6GK;~b7+^5Y zL&X5zLfXP`zQR#F>8TsYltuR^3V(pQ)7ZGUk4Jt# zV2o?O=l>WFBcRyKHyZa0BfKBxH7|xWOcrM?#TIC0-(jASd45=sXV(1nm8*0A-p6&1 zG9bYK#lr6GXuPfgCHpl0RhR$-K6QZ_N)IBoGRR>b(ODpAuBi$6ZtFabroMmjdu&9e z;qj=y5SRj_AqOVshm~?>a4%mLUBczA#gOkXs|Kv2z8om=D5M!!4Y;n zaVAQF6uA}{3_-F)3c_hCTS0s*P(gI^RMM%g=tnvO5sBMws4@{CSh8Apw8dm5bn)D^yj`?1CLH-5MMgbjV`?FREzbLn1sXdNu`t)cWaz`r2cz8gX zDe%4@?g%=;gg9tDUCf1Y=8N|ScamVji_bHO^4>H;P@SekYX z=#Z^kr1ul>@>G*|RgXX#UW9qYi**fvyU7BTrPQr>HUmwc{IIit z+u8FB|CFZYLk)m9>EVFYyHs@bSkn#*<^#Y=O~7C{Dc2Q-lkz3gFDbv`VSpedK=O); zO6I4>7eHy)Hgpa_{tb|f$TtBZ$$Vq#i~gs6Y2bY}hkXi|iAa^L{xBc7LHfjTM^`sN zR|~SsU>4YzcnWFs_b+w#gYww;{g^HfPT-Hq2BH{f*MIvR_lv*GMCS*|ZdZvcOqe)M z18^}I`Kg=);}_qO1r&63t-huTa6#0S8VRT(vO?1ENcF@z09vni^sJ5+0be z;P>g~!2%d&lZOvs5P_rwDKi&W1jvom3)#`vfxk zgT>bT2@`wMj!`-B(bJbhf6-8JQgQ(KVufo7C(&aXnSvBtJzm?u$YtY;>z$pD7U~G7 z0@#N=|9RKPz2+UzQ{+tidrQF?%s7LQ|9%FXS4ZPQ-SjZ?Y@!H8X30q%1T?`F6&T2i*L zK(p+u!6#A7>Z$E`omf1F36;pRwHNpn{gAX^e(aA6R0ci6;h{$`m>mLPJ|KbHzOR)2 zwonT0`G;|mP(?GK^$XbF9rgfHwrkv3cdQ;0I7u()Xa@9y9spmyUgtH_las4o`q25u zM*2NU4GoZecz^yo&YwFCr}lLND7G*kKRtnp!Q}x(3jt+d+2a<&%jXBAt)Y&-GbngH zumK*X;c6>PxbF!*_m?V`;#gZVJlSb_NlRO|WfoNILOzZ~4}-#rK~R@2Yi(^^>^b); zkNXd!0W+W*g`^7|*X`WfGoIUI~9#o*2kKedVUvxD?(KyN0#(pId@se`{hloXi$vz- zCZJ9bfU6P&JuOy7E0};ahyol{#<+9z|*~$Kr&Q8cx z4@APU^l-_yu%jbsN&{$_na*VqxVg4s0&M|EKyZ@TRk@h!{a^sOpx18=PsDR={;0O=zMLG0$q8FN3yCDceH!hMFm8)zouGy+hT)s@G19C|A7 zGmSO&5vZ!4JoTn8W%hPE__nUHHCA6ON)-3kj2A$wC|%mrPO;WxCPUx2nAIMckAn%7C zHhx`E_3B^MLWsXw^>>E}xuyg-AUTs&P*4C?yq1^iUS1@Z0t6jrknARPq7TEVUVc%E zZ^{Htw~`Wjf)@h>@BuHQ9;zXJ%bO(uvywY~8i*q#s1zzpmq4>VD!1L05GZN@I(-V5 zkixzJABk@LVL!;#fw`yiQ#T)sN|BpZb8h$RBS!Jw_f)zXTKj zG!vj`Bgn|mkOHL8k3m5ZM9cx!nTPLAdbmIQ*)?YEV(!1PU} z40RPU?`?hwFeE^zbITy%ApuG^Ioj**UQ6)dpFBKY!X!nKoDfZY`pK6CVDAJXjcCL3FQmG6;BX2wK>uvGghD3JI`fP3gTufvS?w@R6?By{ zbRd3Ue?XxAIwbd~B=diXZHqaYKlfM5Wu;`B_u9u!n21F4NCyM(dJur`&@B$W&U?S< zbmc@&KdxU(yQ*aE%xYb9qOx%9*n@xF94nlkH_tKsO z9*wNKip6p0a%vZ9u~32xp7(VZ?<;TI#DDnJAR*oGc}YULV=L)ze@pT_!y6EUv_PNB z+n_AmX<_1%)(6#8t#XStr*@V+v;O1V1(!o!aKbmTCBAk3@4tMGl_&O( z?+PY-!%}X5`Q=EwzmOe4B%%D1t$uy@ZA8NMMhkUI(U}znYH2l|kdW`>ao!uhSN%fnN1zZuh**Fc?k$>6b}l!{eH$X%Qh4f-G`@ zKfkiiXJzlnPimqYP0&>yh(MAqMt^l8ii4HyUNtq)FUXNq1C6Ym|1ceKmOgJmIJ+Od z2n+^MGkV2(Ws&o&x+OQ)_3^hXI?C6cbcyZt?)`k~Dp!&%8tlye7GyymQ&Fw%qBrLYRU8Gd;G^wm?yA8N3sjN*ZsmAV1}ke^t}If zeDQr6taf1D6|m?Wxf9tJ$yPC_{M7>Im-2*#=UAy;o#@{UMzQY~`kc@K)|%REjNI-}gP{XIZQ z{%>l4{!{7xvwVAuY1W+CaZV1Aa~D{p9P4-eh&1$L}Ydr$SQu$6Vc#d8k;TM4)cZ0%kn^bN#rY8a_WX?%A$^S+x^v zjNZ3ig~Yce1?K?jUDb-&I<||DJxV633#z@qSOletGJxI(~kmUtR;(f5CJ0HInT=ZUI{^*7CuE-Qy`6I@L`^&$IaAy=S?vf`9IP_Gx zO4op^ShK`wLR_}lO3|2wA_SjwON}Yhb@T7gO04;I{PQs1@y6BD<7mL{lKXQ%GLK+6 z=D9^Dg|fd2i9*M2ir{8-N$lPAo;Z=pd136n@x^*|sEW3LE!z=sd)4jx_Ww}6hc}@7(B8L}r z)nL>f*aMaZHRt7ir4M|Sf{QQmQauflM4lN7%h4?i@!4p&q8tEOsS2EL%Ix*}L@abS zec7g%3-X66jiT>%Nt_*PbfF@vgx_Ko@Aw zlXVlc6TC!)E{q?nBaMk{7v}^$JnRM!JCKj$*yZ#rsSsiaV}Grt(OE?sxl=g}OX1mA z&8aPyEwAGUo(3`EptA`5lQ`U)&KQ>MvE4hm+$DTH5d{iJ)ivN7mgXr1-GYy4Djbbm z{y8+<@~K5UO0h3Kwq*ZMd$(xN5@tWN5S%})lxIAt&$V4}@ke4Qpw-bxG`9sxLz$2r zg^=SB)AgN={t~8HH1JwxK@`-@_J}itmftLO?-IT~<<>Fxt)Mu5wxS}A@i1uyG?>F)5~nR?nT%+NHw!!<5^DcB~2!X<~6%&u>-p zN^P=ivTZJ0WGJrwFcVz~;tn%4Zh?Eat>X2`$~z$?Rw<9=(Iw@j$qXZ9C*a&hlW`dM zd%p!_J~A3GPck?z6iwdF>0E^PQVG_;jZ=_`_>mBJIiyL))55vE%0cP@`=L~urYE9dN44e`fcF{)o1_|No+ldD`#ErCp}N5*Y0KuIpCj)3{+NF} zroC}z7|t^l&oQW!cKmT*P9)Mr=A_VZ(Xrj61K9!nPbwvv@b)^GKWv+c-xmK0Vg>g*r$EQU6QcCY89rzPFCyCDtE zX09C2y*%)N5)r%E*tHG)_hxd!Mq7{BqYj&2QYMq3ZVX_5N<}EPC$+WJI)3G~j@yf+ z7vTyo2>T>rNP`op_2Qa@b*;X?gVuN@SP`SZpA_xwA)*d&zwB^sq){TXhM%pk~%#789rsG zMVB?v2ZA~R)HB63X{yu$Ew!fa5^S$3pRNvBPc-<@8UyxCB92*|?wiI#TIm^3q9=3F zkfUJpHY%zy@QTvg@y80Fj*>}pT--zYDwv-yB(F$ai8so8d#<9iwF)#0vK(n!>00=s@k6KSFF1z2WkT2&nW7%Y%WoKP<0=m^FA%$8p)Ie&{c3;gD$^g;vX)ZFH zejRioAZ3qq)F=OnvS00~vY`v%8&(Uauml$z8`uW9qA~-{4>PRBZ(+*cr1n(M%Nb8U z@nkpR8XG)T%c$(M0;lrZJf&C*QLnLDs4M?%)xlfR{ElKoPoIX*pNTo*{?Cm4_tgEz zZ!Qt}OgjbN zIN|uAw+bLA=w$B`XVE&+q5N>-kYUPT%UmLi-R_!IJho;08ADr6$Q*^>_1XSH zZj4-Ih@ex5?hCmsEHgDzKjN&L#7syM6>SNs9jT+OtBtT!iL~)4MH8+?wj*6>OM@aT9V~&v@;AaXQWeEL*I!lJjo#o{ zyt#T*u#$(R`QsMtce>`!FJ!f6R6UX0a)AN77+lt+H{WXHCNm;~ZQU z8{$m+Df+To^lpSXwyvyLuBBp#CB?7VICGyLN11aH+PGD%g*eT@)%u03o4361-;|~) z(?}3ysJ@e&m&iJ}+_sCL)ogjp@iz`5{iI_X~qjJ*dwQ2kl3D zB0u@{f|mFMzKr6!FoLd?0?pHB;WERsu`;12k zMyb6rEw?==PfWk9eT{CY{ANf|a1qe7R4Tp%6==-1TZ2Q%Iy9c1W7ip#k7(qv72L9q zUuip~b-Z6tQVOVe4O_d7%=)9WYA^XRGuo!8nW4Ll5xrLOE3!90$`JA5ZkR>Q!`XH% zwc#nfa+QIu4Zz0U8Q^1mHvDw8NAX*jcgHDRGY_?;`E?7CKz=4Ue&Sd*8?PT^^W8d> zGUy=#MPrWK^2qqGL_A_5?QDm$Pe-UEyF&dUo!FSI7h93$ZKAe8cJzFW7a70$Np{%q zQ=W<+jg&Gzx{dQ_Y%NYNeE-{yI=E&$pG`30edoK2f>!UT4h#qW{~YV!9B)vuwV&X& zFykKepT95U%PMf-sP?txiiCammWaUGldx;5rtK;n^~wLv)k&N%wx5+_yDZFGptiPs zcn(6wpP_6mq&H<~zzqk;GyneB$l2-wB>?UAv)2E z?j26vu2INP3 z)$L=7i)pd5W(+szVoD6EShZgp@HGt+HU6Ioh%OBpbMiT^-@BWWYS^Px1N2Vg@>vXIyALRuS_MAK4$5 zi!^(%rX|q7VSspCC4m$ST*KSWTRb3BP~v>I>p3$c8q$JADg7QR1! zb)4IT(X;#t)(3Xl_}OyTgA)gp6)qkYX^we1Gq!r(GS6^Ao+lirf|LZM*o+!&I!@~{ zbak{|*vwbggw(DTJj(#e9>;+*E1_^a%lpPNL$>WMmg^@EF%-fi*M#Gj&-@#@rOxB@Ir7O8733u+6_WaKiHeZ};Ea$a& z&WIoF-`*r60y-w*pC@v~kBS%sMyh~waXSh7Dffn6QU8pZ97V~?HOLx`&{|(&*(A!j z520l}0aW~Uwu|6{Hwd*RRU&C6>vy{lL=h8nB|O@*aZ(Q3Pa zvc-$Mxp~wl3oYDOyP#^cH*kky%5679{AYyc@w8J-j|@4x9>M0k_vuNm{+F;kz#lZ< z*?6_m`u!I&wDoRj?WQ6!!RleX{rjDPN}vTXed?BO`u~>qBLH98lC-iOzI>bdug6PxbHlh$mz^g~qDGCvEnktpE-X*XX zy3dZe3^H;rR=x78Jt~WDdlclbslz+()TvZp0IpX^M9$_ij|v}IgszH}@>EU1XJZ%8VY zV&nT9a_8W8r)?eKd$}-I*>>|R(KYQ9UzJdl+qwV$f*WYh;}r$`%6OgtVTLrxr+#S^ zLnHok7pcq7W3b|Cqs?ilW*+=#;!xC)wp{?m;2O{>VXFDIKmlj~L-DTc+qZT0kT!ug zTc<9rFaHaEJ}M?^<>;mrqMNZKJ|RD(xojCOsBp$eOiZXu$Q>mufULgDwo#7i&As94 zAz!oIv%BbnO@&H4_ev1(C$P0`$>zMI6QMoi zuD!i%mHc+x)6F2Cq^Ec1;N}&%h?xUm%m_j&x<;y4btXn#ynK_H``5nHYSm!CkG8{C zbDgOa7!20g>&P2&4?qHMGXz!(x{SyF85fP#!Q!^dEzcn9IjAI3snddBVk&&%;c0^tJ04qHa)_`N>5>p;} zJIvkfr)5GwpP&KH;`?Z&gB04e$u9mVZO{-7UH-AizxRm-gn;QIL{k*w*yC#U76?6* zb|b{++&8k7x2Y?Fa!f@)X#nz-9BWQQ+w*Vt|ovPz*?*xw-x)`p=OBy>v&f&=6;qZf;&lg zS*O1%4Tf3z&!|9Cic9idLDRUjZy5rLKA)w%n^>C8*{kx#GFvNQBVMcOhUx;iFM~57 zVlPi`GlP8C8r?j^Li-}QABkD)hoG>3UO_cC&q%vymd6$l=lpBB?SF!VBeA5nOuo!J zG_?@>Li0rA*4cU7%- z*ElS*FiH|oT8XTM#lb0tNV~YN2D0TezSgN>oY5phG&{?~0%e@54_eXggTO;N;T!Ab zyZaifjYSW;qm^i@pf>@`!;&W=7P1-_P%M^-E<|@N$nGvwVhR zYoa5~Y@2L@Yf&ZrwyBt#D>0F%03#n5LZlJSl9b@sJ4jgj9CB#P!)B#}Bt>#fCL zfq}m0j~_o-1;E^6UWyRkQqSa78 zWNuJ?ulIWRvrromQf@TEAgkKm+y{zKel&ZX?7l77;~PW+ERhFTn83^Jw|ZOM_D1(i z6jRo(%}TEz-bed)Um|6DaKvJS__U3=!NPFw65&>ydbY-@u(O#M;E~j3I}#$cpI3K? ze-6az+v+>>W%FP^G()027z(2OL;XXsj!HaPAGr41VHpHscr2NlwL3ONVi%~%awfyn zxCod}Doe?I2J0$Nptq4`p>pUBx>zc8#8QEOr_l6G=Xr=Je8N)Rrdq1d}3PE8|e2EokpQ^1JcLf0lp;Y26-pX*SM6XT0h3xaGUj ze`!lVY@&IKjCT_n^0MdwS}hup8I9;u7(KtpVq% z!gE&q85+rx4SX-;;9WPnZJ&5+6O@?Tv5cwQ^Vv9YvK8PujI4ROdIRHuN?FID#T&-V z*aIYEYO(Av+UH@^ZzRZURanXNjUA9U?TKBpMUD{oVP!@Ad@P>eZy zm(9jxbL;e-?f)gK{&#q}5au1w@9SK9*8r>)uBdZu_edEKw=CGr+CbX^`l`#~sFmo}K7HGkw?Cr7!3oN=+%E&slrXx-~$q^_hteRP}1 za+RH0iIU1K0e1e^7ihWRqkQ$-?oq~2M^-x0*F9crTZ%|{)q#)74fBr738#9A=C5=g?p}MG0-i6n>lZ=8+0Dw9osrhx7mh@$mpBA3&jgq4>ktH~>Cr3MB*w(6q z6dDR$-Ho?#aztfi+F3>-MeEN_)>|UCBE$|KAVN2d6mooen1<+3@mk%$sw(d*dX%v9 z?8jTo=;s}2y8O<|V`5l$nlyHONHp4!W-OLW-J~VxcI`_(fAdT%v!DHJyuUd3&`Q9~Bp>^fES&%u|kVQC3R z9|OW14d8!HO;SC&2UCdub?l7}o}1?FZQL@K=H6+dVc=b@G{5jvzQDw$zddEK=PmGaX zztPMoN1D=oXu?f6&--J|kj`9;t{@=0rbCA7H+ld4##a^L9&JJ$8%0xnbfvZ|?hHYl zmFFC78=jQkOy9eoOa-K_zI&~&`)@mOH4fevsEm@;OLHaEKalbS4bxp52&X#4PK`hO zKC&8gWxStW;SL-urj%XEN|nLLq0BKtt5}Fr%}J`FJ?8EaGGZz8v>v?Ju_%bI%s~cL zHfrW7htSSOkqRtGk@(-4(WFwO<%`+F2}9WPC?7GmrL#v=?yvB6ArNghanrp#k2kdR z7gI&=NV_tzUT})1vY_3l0A~{-@R%_thIa0)!!T88>Bn7z;D_j3x^x~{ccqZ1vxACs zIcer`UfNeZ^AloQG?zARbwE{vb&t(ka;LYc+lsa|)7+;*oT@E`_A12?qoAZCpeba3 z2xwHuljE&)>WDgAv-yV%LD4+z&#%uN5TP>BiFCd?@$W7*&ON`S@Jpu9WAb3WciBwI zD{$t!&TGRKKR#rkXk~@f`k1VSO}aRjyaYCj^Y;uX^?@|8(ieR$Xf3o!wBnOa2?>iq zRs(YDvTd6mOcv&dA9!)T21-P%xK%f0_R~r&`5lH*atmMFq(JCnsmmH#bk9a>2{m&V zR4dPFb)pmvb4=nmI$UMF!Yw-3O5V|R#sRrYfrn;Tvi7;5Blo;ED4Em@59jXqKFC@) zr^*VL?8rBG_h{5)bX)!95s~d zkweAE;O=uez)>pv&VT4@@yE{6qe;hq_C1g&W02|K%{_in05Y&Tn)3)^|7$bY7FPpZ zW&`MG)8{eiUmLvYK5n!)r4}zb{ku$7#BVMeeU7ON=H9 zOfbrteApG8;TR}Oh=n^4K;u^_tskjOfZ$pDEKpNFA+&DkM2%_*N2`1M;v8N*S!!cbxSyA81JoLWPw69AY z(#2^X@Nj9cOtHw2#yk&2C?+ep)uN^r>BO+4uSfE{y4IXJIT|JL^S*NkD9d>YXxu{m zyX8|(xM{O}o%rzwiklilS`WQRe9KbV!gCaa#C(ZLKagx<8r4 zjwB>z{YOi0)mLEG$XiXl&b}Z+vrcEWMjG^Gs7pOseq95D6~FJ!RSPwL^+R%WEq&}~ zKZGWhHdS%vy7Uc}6QXOMsf6Oq`we(l@dtmMyRv*Qs|z!TBl)fD&@xmoD#|_%LY=9k zL>?-Jk@hQ;9Pst8qd(V`On>HI*o$mdGzqOEHRG67!1@+-^ODG+=+X9*ns!XX!@DtY z4;3-kH#txhH^~tu?U(Te!X&?lcazJQ$*;X;(rNvMqx;JuYurEfE8Fll#!h|4y6GqF zEusobRwu8!Dx44cvBG61er?Sm=Le$Vx2zZ+RpQ)v);pk1u36ecMf2LeclpWvrkAA7l&7M*V%G5?8d**oM#vTEiL{aP zHp=wBWlX3?sKYynjS9TYjkwf4PvLjnvi@Hv>}H50V+7TrhWwr-AWrK#T4N3=D0^)-ZuVM@$6(2z%sE6H5h@C+XNgEYN}iB1iXLCl zUsMX;?3XF_D(9kIaG{LJbC$pgiANKZ49^DeUPWQ^NAf^7Svk#W>wejdM6h5>Gq5CH zo>m=hlcC4q56%qRxrGz*3NH?)g})@G3H2e&=_e2bnXxPPH4X7c)HWO40L-dzBbTGV5 zLyKb*J>XZ-dAJC)*WPE~nv@>{E;)T^rK^rNxwH=!h+k@Ju+Cq`pSVlQl34CA@{X3z zegr|JSW$NcW8*!Ml2FNZ1c58~zwxLfx1?Pk=ljyuI#=tHBs~$5AKPM6Tf9nN1Py-h za`5zWz%b$S@q13-XJJcamQk1cGM92HlZc9J(qW?Od7W3k<=*Z;69||10i$%`X#f2- z2uSHslJR6gO;S@gd~vgI3yfrpZ$uAOTOTFdvx>tByjE`6aUaD^og0HNh?K6@F1W`K z*Iot8#_ytnUNjO^;N+%T3A_CA_W$WYTY5{BQyQCxV9_L)qBy-v^k2c3#2Dj!0Hf?3 zixykyOK34ks>w<0CKYjdIo{+*NV{Tx=|*e;IvK@$(YYwzxgNm^U^Bb!Y`??sho|Jyi528jM(qyN^Fsht;Bp9ww9+ z$xIzf9?1x^EZQRzMJGPhU@Ov{M0{Aknt8G9X$96Ds*9N_rOcURgj+`v`%;fy-F|FV z$V&Spalr3UNK2cqXdS~mf2SqM4S#}?ub~9ys+x}+{ zk12+$N=B<#(&qCV>>;423BSqtvlDdiOLM-4 zp2-tcBV^v})E4|wf&=O|Hl6tb*Fb!rlt*2sN0?2!ki?M=xJxd{bkcvMQ;YUK05|L* zGz5Qg5eY626p;^`c_FoOj1UL0vr)V(Y~!yrFD===_S@M?o18{D_zf#5>QQq1jHV`1 zMPb;{;y#I)(cHDm{P8K@)9+$bXNatl{yiPd;kyj?NDAW7+8W&`|Bry{)xiALB^oSX z-tVa!sTX!j>4OKdhl?ebz3bOjYaw3j@lcIQvY6$)2`*+k=vRtTA3zINF9#&U!pbP3RO+@V2`e*c4L)Hl3tJ`&*5;HyIXKIid4hU@P--_uP;5Xnvn` z;<+#C>3|UsaBgQVs&h+uq;q%6;ah^ox-PL`5|*He?jkLj`~@MyRTBJrzf3Xlqkp|! z3@F@Ei*Hqw@Z%r*f7RUhAS(@Dx4DbQ2&e#Q!{qj%olATN?nTsOj<}aHwj+x0Hofh- ziMUe#fy*wA#IYi9YqnOleIk&jJ|a4$QALEP9bAM~U{N&`Roooeh@@~8qn)yF)L5H* z^7ASko>?r@?~~t$p1Ae!TJW>HGy^Ssf|MI(Ogk(+5>qri7eXSDFD)6&X!v-dbV6l= zixb5Bz5NfHDcl$?#fO~Y`A(`{QS0JCyG2X4IZ19_L?r>MtIB0cHE9MO=H;dS56{r| z>7}DxLRNkPnM>A;Nt%8be2Uh4jiv7F`8*H$KtnI}#_AaM!);BqFOj>!bSv})S!&`N zvWUPUx;!?+YCY0~*P?EM8__s3E9Gv8TD0bE z&L|yHzOT|=9-!Ua?f0a!dAjhOmZSI4=ix8-`f=z@OGQaLz^^_BeO@%wa_Y;e(SCGU z#@U-2cW`H!i-Hs)QTPwWpDkZAb{lp6ZEk5yD=BwB*&WVKe{X)Ys}^G}g#Gk^;qcD& z7UGRqyW#|z4)NY_`aVbdUukxZ;*XTsw2Cu$bi#KNr#oC_lF#0?|GYb!bC+F7n1haE zm4Dg%oy8%6drQ+nV_k(O)_tl+`t;|6xAK4-P1{13dv#%4Vraizn9FtHg8FrNWL5EA zb*TqOd)pzQyIQxXGec5*f|jCJfa?#1eeN=`PHn83m3s;MpU(h@+wZ}7G)jpwIO*YE zAWd#akTiWiG`rMa)bd{0Fz8J?Cb#G{O*MR9cB68{(B6u}ELSFuan8T#)PJkG|I4u5 zz^&YXTh#LFQ&*VLd>|#U01waNnpg-8lFR|s+DjR^Klb^d>94aoGmPNE5tr!{SrTb> zgItULQzH3L;+f9YJ7N_;Qy|z zdcN~jwpLdFZB~z$6hDJ&GNOY=@q6|7<&((Ccm`(Ul0@! zsiFc31QNQ^L3)RTPUu~vC?FtRKtPZdq$PA|f}uC*MFW|+(~%s6An$vNk~@9X+plC519ZtK+`0cKLEgXK@#1FfQ{dzA7>cFMcIZp?DY zSCttxv8Hc#c>y0;)V$houaue3N{(F*ARf%Z-WVX$zKhcJQq@<;MNb+Q==P?ir9qDx zHQ;PiEd0wrh*63P$4bJv@8;woxEsUxY#yBRuHw(tbjc^dceV`y3ed-TA`K|z^VBjP zOo*9!8ikka$D_q8PDy&mrO(*0mebn4-(BoSKW8!EdyDI7k0a(`^r|NBe@7^c*KJ#1 z&1&r}VpUVZ;acYyk~k|SM7af`jpr>{Yr^V!JPpb51*w;=zY*1}K=fB!C>*3%T$RQW_(t>x3y$9$ zgagY$uh|t=nT+r8vYm5}IgR~LPZd!-tu$KSG~V|fS%f zN2*iOPVsK?8L6j4V4_=4;_&O?q~F1)SpM&~Js0<_@hw>K6d+FdE~OxGP^#47gd6A+ z4*txZ55{N%PTzWG=pGm<4#tZDizHfhn)X?Qo+t*3sf+AT$h!7`EUM0aMLD6JhNG;5 zO@n#gy=|3ZvH|t|O~Mlxq;T!$9u(ec+eJ=9iR;4o?$JPN!F+K9-65#6*M?6U=QZ0T zPiTmIdC2J#+gAm!Ww6xw8N9@lJc0p%s>jyQRgIeWq~V{tDgXhgdN25fMk2IxYZ;uq z^A$gcY4@(SxOSQOIaJo>wePAaf#SRjO2vR(o!XA#8!CRl%>G^?j|D5N+>>;2N`57M zK?vt_JAtO_-5rBAl@qZzh#&Kt3hvgyxU?>e#Oa?(B-IBNSxN-*j;_LhDmWi*exmJW z+fT-Un%O{tEZrK%a%ENSmwbxv1=^6R%u9qI$sI{@1Ex?iZS0EZm=*`5w#uj`1CRF9WPWmr&7Z6V*$kl3m_Rl`o#jiP=uS=n?H-v3k|_lPyja0YdydA|3IIIvG(2=!iE$(xgjIR& z-zZR|e2SMq4M4T!rRsrn_rW`8NKPx$lqq)sK{;`GxLX`rpw9%eh@#UHGz<`@&u3i2i)#ks2{ zsmCSKT6P{Dicoe!UzpXslEw8BC6U%flOnh~V-KKtfGM2RWmbIpScCKsqkumjLUm0O zo-PV|W@VL=fYN}OsZU1z7zIMVmMwr3dMs|~yA%@tq!FzMR?L-_*wgv|&WhL7!U{cC z#aPpJ2S?Uv`O(bx7E)>1$=9e>EX?3_PZzi?Q82;GBsJFL_Lvr`qQ_#t)8S`i0T5Nd zCM4A@e~biCvWEe3z14zw9R(w>=0WoZ0*yK{TK*>|T7PbuB6VSEj>C=K5;Az2a2cd3 z(r4PBIU;MtF7w5BtQyqk5!*^!f2`#5zBJ0y_trZ*J+03eP|mq200A?t3x$^lD~vWQN0YlNDL8+26?J>J`l6{3WT zl2bh4;2Kw64!*v|W|??Q`IP-|+ui{w4pW~52ztfWqd(_KzAT(mGJ%TM8&mO&+tPw{ z3FvFOTx3WULv6FkRp?bxVxcSKuS{Rec|QrhU|Rr1-HTQe^7xa|y(S@-k)v*Vtfs#p ze(;WiT17N8?QoB!!hywh>+&CU`^Re(A0I8s_5$NbWsA4CogMpoE6-zjH8KNh;tqHm zPD#Ex)rbGJ7XRY|VKCrn;y6v>o4f@LH2d*M^%`FYqk=9~6~%d-QGXQaJbrMvn!aVY zsP#>ZuSsT{N{E(h;pi_anYwQ=X*2Xp%7@8!_eyj^Tpoj3nfmANDpO?J_NFEH0KVNf zm*3d1G%yeG_zxYTk;U%>gXd8>mwpLq6qR*Kb*0ePHbk}xvn^=UEE@UzcXOPL5E0{f=3T=8%$<>1`+J1ou3anQ>#qaGTmKY zy_n9DC-o&4hs$tCPuw@h0MJIe7;t|#%E6mG9CN>deU^u+yNK!yJ?us(7mD4H)RnD6 zD0R7Ke|=nJ`1`gzr_v%gB~2F_w=bVbmf~66N35W&(67GQVa9=%bby%u1=MOC+id#@ zZg{eHSO+1W`K37))8m7?waPP_Giu4iTo#~xQ4r0qOhdC=RvZty=%%0M0^ zCg1xA3`4;6!S=zMpDey}UDi}W{m2-yyUq{y?~NBG3IC-{{*MoV%@m(MuL{fvP|8@# zyp&=3y?CRAI1}WvMT?TB?FyP$er-U-MJ*zpeB@LnrJTr~wLk$&j5W-o10KT8<&ATQGTNJf1-@NjZYr*qerEd<$Ku&1qk*nWywgX8GVpYGs_Xv{(};P z1F?3*4s)pYm9ZtTU;f%m4CC0)%WVJon~3xRC&#d1NfRQ{8sEplk~(amkhF z9v4RxPhb6~3&rYXpLsv~A`w6-?qi#iOX4-KTEEDMv%wJ+fM%ph!*Jj*pUo)#Fv-l{ zyR!gY3RfBnaa1u>oPA15W%#Qf1dN-rSE4v|j3CIL8%)ipVwDCCM~X-zky#$@LMUf? zp&*V<$RYH#&oPYwT8J(qLoCx@OM)9Ddl#{9cl*0)>HyGx`Yj0S`t1lVZi&59CB(_K zmQx}_vS?TWc%6oIFlU#Y`P`8Y8eE4|AW?@AQui|V<32`2s=^;paqw>wKMUCU9jIHW z)a#xWEl$qpf-wctCRL49_Hi;aKPT6U#dLeOYqfNiLo3sG!c+(933Y4M|56t*1yFu$ zVv9=i{|Sf`<^u1H9Tc8?sRt4hwkb%?Ij@fC|MnA`M8FNWUwY**kK3d}Yi#5anL=(6 z-}o7A=|ss^1Ji&&P?o=F`)b}{zflk%C7@%^45zrw9*I0ge^U$YJg*NB3GA19o9fUB zKUB?SCf=Zf6f*b6!n?OR(o%oCQ~TaqyW8K71P1xq3A&Z%vvhJVXO);%TEWX8Ll-mT z#p>VQMzq3P&xD5SD{+~{7#S+`g^Vy$R9ru$h_@jDU*vo$3=L3z2{d)Sxnxku^XLU} zU|Br)&Iv=4AUW~zYekS}N)bgTwG3XMgR2#PG7Avo-173;bT}eICCe%V_-VlLeZEL%ZvTv1gY>x@9UMB zOIjNZx3&o;Sk_{0ZgCo2^bODP=0!9PPu1AZ?`LZ`;Ni5mDh6Cegx(F^9@W7f>v(N|@#HM4qNw`|L z0(u&$5H=BS5|mLKFNU(ZPeS*r;MwztCuf#qZO}0+1SL>#O2I=(2EBZvB0m%-e9{|mlDBsS2StglKXPSm9gCq8;_OYR zgEg?hCG2v*Sv>la-hi4i*9#(zYCxF6n1$B&7pRmok9IRZIcD~B}(XCt|rQ8=&o+|}$IG!#Wn8RxQ)*V)IK=RM(yck}|YUFH8W{Hs%?CuF@kmJSg zkkX3@f^|;r?6Jg}z}i?Jeo2-pN{*vm$p(<;;^ZKv;b>Y(u@mO;p_pYrIX{%6 zD*riz<|Wj^CYvWnM)fjep9hfY_%BIzO@KdQYX;f}YzGoQpFc#&y6N7q9!<#P)|_5= zYduB|@nn97Qd51#u~Pi!dLvKMJPMkhquF-w!i&OAguS=87z{trhql$Pd3BTKkv1hyQA41ZR;V~LueMq{0GrW2Pv^^McAOO@&K zsl)6Tx#sr&vs(xWWIlY+-9zJJ77}x9_6GKWH25=8A~gO4z?q>%AbLz@5<6S1EA6RH z5xO-)MFu&;DmUp1zWJR*Iil2eubf%K1pgXswqIa zqQUg2bqW+k?os5Xfau|iq>*vJEPLciWKABtr7{jBS!C^s!?}T#cSSu~uIOvz2qqV^F>q1qM6%Z7dJUf=4+h;lf_e!xNdZoOB;XN96<2F6oSja(5Mr4+LR3Up$*K8le0+>ul#9K*z=IJCIRf z8WAbxweev8o>*vdgO1H&7Qrg4TOP}`HeDMKz**|ZY^a9aAu2$3Fnj51`^AK7o4RiJ zR1@A4vA^R;Ajd&k;5-AB<3@4K@~q$FrWC4h{DYI|{6th6-f*TdD=}`(;6Lho5a%Pg zHn^2>5Gs~FZRhnQTJ1-_eDNV(xx;0WxRYA(h8IPSSEM zb$Vs$J*2myNSxovLu#R#P1|||7@MEIb1zp%k-#j$CKzVCPZ0tNJ| zG;k$Q`;u7?3x0SSks^^)rz-j7c8p8q?G#RB;@99wmp%{?a_jwG7w-@$qhG}Qi}}nm zVUU;0?avmS>YEr}D0Z*_l(bzx7`8i3>E^BWyOQ$bh3p43Mhs1$PySc!p@kowZK?l z@pt&D2j(Lg}-)JIjesqV}1vmx_hp1-EGHA=}u|w%Cs~ZV0B~9Xavq-hjPstJCt$IiJ^zY#eRhTbZGJ+BOS)nKo_AYcCTm~H zNB551TGhYLtH~N>>xf6ic}}y~#d;ucDs}p!?5~rBRm+fQ>nYp0IDFZAIUKVHKlddg zK11)vLHk>U_8v~MadIn9o?8C5`^s_H)#u$`-e~}l{Uc*6JNEST?^?(RlZUBc0sKQ2 zfiPAVrfPHan+yQViU=6jyrdNoXy>wva*w`}qp1Tqm)L<=13J5KOR9DX6R3ifC~Hju zBncEbpQyA$bLZY-KILx-1r@mnjEqQcU6$~Rfse7pV(hmmwo|gQX+1x<-3F23A=>V@ z4OOd{KFV?<*XEMeAnlKeR|&e!tdC@7Q!qj{>)X9}d2sW_arN0TvH&pUTR;N232E>W zYT`~vR;c+B4jilC8Zbe>Ex-l#Y^XqoEj?>SZ*46w3P2I$Huy}|csM}wxiwvnuk>}U zFPbrabCQmH>s-W(*Kd%imBe#Kjdsa1Idcfb@9C^I#U+^c4eXJwM0~7QVqU9P;Z|G@ zxTs%}n|LloHCU-o0w_8-j2x7TsreE;Kj0oMT1s{nEv-qy@^T;|TTj2*cI8&v4@LVR zz@ghn#tHm-hz%Vqw`& zaLw@Z>{>P%Fv$NDMxM_GOUf}1rm-vj;q`ht@G$&tBeSvf{__JVl8=|$$1}|BGnJY`s`!`iPG0-rSSqJ@ohN3 zgWlHIDS8F(=46|>;gTR&vv@+LZPP#n+z^nyAA}u0nCk`I6p@7<%Jhk&++A^jb=Q;= zzCMQBbkzXSx;%EVQa`W-pCQ@9M~BKRnsI=ThN4a5Tw$Xa@U{_Qxs#^ZP}eBS>e}l9 z!>zx!ZIW8_?sv|oh6H}Q6bSsJbZv!d2IUa9M#+)DXx-hb!l@{ys9#c)dTH8El&FTz zMjb_lckN92?m?}<A$qFA0vc#Y>49sb5lk z;@Fi|rPr8ew#JNzZ@9s?C()Ix!>SoQ@4~S2`Y0wq4KP$W2s;jQqhyRW<;f-E#Z=U6 z80LY_1B{w2m(?fy9f3Zo$BylCZsUu*|71}^R>+tR3hsa_rX5$l4@rm@#;3iDm(UO+ z_BnKHd4k$wx!6bmQthAY8egG;y6bpw{ct)nB7YsIK@o`}>KKKhb>TP)Z_nifP>jIO=wRVcVsqd$vQIco<#9?|xpVHyP*z)|Po zlHRi{#L(NEnLh0IZIX9ml zKyRN102U?)0XE=bxHg-C4p0q#5Vf+cO1&)Igv#YGOxIf}i^+OW!|i~}4~t~A0)oo! zi&S28-no1qqr?j>`(j~gm>;0y+1I7^#vgZU5#Ec%P`>41YMPt4%Jx?Un!cVf$ZS?f>=Asfw?-@iRV&Yp;QX6%Txm zN+{OD93bLfQL^?&c-K1Jz-Uxm`&J7yP*f$=s?!Q991C}Ir=EKYmn~xFpji>5)~BsW z){VB9@O8Ea-scry9e%|!CL1PAO%{uwH`%%ja%%i!6}4 z>jRaWl|Mj0C;(>qpi*XJ#;0lTYgPam0{L0YL}VL4`Ou53+uf`;uP^UkGB9;f{F|4i z08@1G#h`4eU@5^M_lkLvz@@M7#i-go0S62+874lKaGN*2HfGwsAT23M!5S2F7_yBB zp}2#-1`*zZ0~%2*KnBX*kVo01IFx;P97Qi8+?ygPj*&K5SU6NcnNjM(g0GA_oJDO0 zV|I!1u_eH%Q=ED7PFTw8A?nmC`GKk<+3DK9T%e;N_{a$erh(w5I$Rn@`FYA|2zr0HAn&z zhCTxLQL1^IO(^RqN)<<7K4n^1Iuj~lA8t8+5BTh_!)Bhoo?}r*_edW7-W>EhJb&yI z4uri+JThtod;Gz1STh0>ep1OFpId;`YAs{iZ>sGQSpUnW{-^EaC{F5*z^wdwqu~7H zu4dADHCOY*uZM@jCb7-Z;O&&Ed!dtytaL2`Z*qYtE#e*c;f{YC6&Z|9!lYG;=D)$Z0Tpw0nE6!a)>H&sv17#1?mEkAInZZJ%RAQyBRc=mE;7 zF(ap3*GlZt8Tx+D+)~g(wb^?U8q5^$*4^a#*@kjev`WSdzdxq!8X#-3j?Y*nN;C#muGK?{AM5});u=FOJ^K^Px zdQJfU<9}|ov4;e=99S2ya?*9=Wi* z$h`j&JFpp!cyKG!pOufC19``Ik*%JbuacKF&ANqynbYpwVEiAr?$QJhPt4-D#}t$# z#bs2eoA!>hz)T%h2xedo0M(+1l1;R@!k38PoIwwy|B#QcK6_vq`#p)rA{RVYxczVm z!A8wqOps6g;#S20;v8*`zL*p53&70fik1Be&WFiuix)lzm^`%P_>uI|QVaRfSCZ6n z(;qC~1je4^1Pmr>_cI52u1<);RVY;o0*<2{VjXqZwx1HN50O3UU+UZw_4)YDCTuM$ z`rS>k+@6HG?){Tlpp7vyT&8)?{Iz9O95tI-cvYdX&*&WYts&kt$ZG%d6K$pWkz0@Jn1(w%DT$7<&Z=5p&E$O?3Hi0XSM)EM7MUsP zkDCnu;;l;YQ|f?$BK)C%k2|^$Yp}Sf$?h*iVs2 z?t}Fhi%Td@C6t79p(2AIMNcI~zR@y&2JiYw7`Sz-gNQ%nhgt2t= z8MEVbIg5HSuT)f$3}6e+yYC;J6+`K&0{g*HoPArwk3W!TCgOZvAk^ zHW}`4>hNT#$ag=&GM#o2Q#B94?mtm_rEDu4Sk`OsWd7DL2a}5yM_y$s1_o7l~Yz~YzN7As#UXLhC$bMK2=;TN5 zW;$d#%vb=8JY5aMZ|I-H%fo=Y!0R{AlZA{0;)z_c2?lN0<6Db)G%DITQ#p@j7tbVe ziXQ{YqkYWc2lne!>?4#Y_VG-C=Ng<@!cIGASV7~M^y&ku7`xNgGVlDdNO9lY7W;ns z(;(>2drhjKXRmgpmHAhEx(ZDPq4_UAMa_=_7jZOTB2uvDgg;tY0Jxb^d-??W48|Y* zLT=hvdRycEh$$y8xYcBy-D^&dn|u7CP?A(0c2)ZoNuEY#_yBO3zq?kGZ!^VLpz`DOfj=!bDyE3kyC7bT^k+ z8-du9z*-}#DbizkM4U!rg`u_$XFEL!X+{trkAcT!clpW*uj=vODDv<*^qC^JdA+M5 zr%8<|piarK($=z35A9ZJH_LZ>zh@ZQHuVWqvH4{av)3AMKC%Y{6{6STzrN=^$PeW_ zy8_t88dDZhcJgo6@}_hB!n}IOl#gtG|2Y&F#@<2dLqecQU=`gZ@ zejg+-XVy5j%#bg97d^O%`<3=7EsSU>EiF(aw>&-D0TNF1IEH4a{qEwdb{D^Woi$zgNk$c=m2~Slj#|Rn`7mZj1_+_VmI%|bYF%C$a9pzF43Z z!*TpvIR*)ir3h@-eSD#*aq+i6lAgV-G2bBjOd7Si_Qf+~IpT>J5VM0T^4fe&5wue& zh0-@DlKiwTX3#VJs&#(_Fg|Ihf-%gU8GA6QU7$q`2k3~i#?18|!1b@76#Uu=%TfW) zND90CK6t1S-02U5#FJ`!R8ScJyisI>s_ta*8o%->zu7|mCz~FX;xN2ZU@U==4|D%U zcn>YCqN8}ASe5gzx6L^D+YFHLQ>nHmMzSS8jD6$vlEyc8eo#6Im5o8Cx~nRP#9Dr`FIKxWV;}p@oxD zaVotUq204fpwF(<#-gY>ir*Bo zB&T;y^UoC?fOGC`p9˺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

@>udTQ% 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�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�AC4TaQmiDt55yU^DrRJh`2l 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 dFoz3NreD#A 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 z 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

JGJSg{}EZt15 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 C!)opT literal 0 HcmV?d00001 diff --git a/public/images/idee-2.png b/public/images/idee-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2993b4cc13ce803a427d117d25c23c74e61cd211 GIT binary patch literal 1237790 zcmafb1ymf_wl>mufChpDcXxujySsaE*Wj+f-3bz;aR~%Za1ZWIAi>?`Z)WbyeRtl= z{aMv?QR~#HUHfeP_C7=^DM%tC;vzyoKp;y?iK#$9AXY#?z(c^pg0E;-2UI~oK)P9p ziYnQNN{TwzIykF38k?GnS-Cjc8oyU!gMgq;aEou3?N)l-s|Zs0&J%$`fX^B!Iz5T# z?qo^#TAW!82BezlhhXPJPNU+4p-FQ?r1e$Xu_i*z(a8}g28Xti%|p{{>A9Mwwn)0# z|KpJ>+vSU17oO4^x+^H^U#SUlJw=VvE!*C~;kl~i@9Ihm=n{&JwB=jf zfeVUyX=99O?zvE^{*U@Id4rj_k89JyF>kQe6CzXWq7hap2w5y?Hp|!BhWmr281r~@ zQ_Qk&Qne-#t;3q7=}UMoeBjce%qts%=U4M)G}C(V_moGBF(`4Ol#~MjFdP04Q?Y`v z49=QHN{n$(^h09OXc%=p=ifgXqq91}3-84@yX^a+R^AWV*&So1+c}OgEiQ^cbLD(Y znps-(1mNI8*zd`)t4Z#CyxMW@x<_D6hYCBUt~cKKM&jY^|LUjr#)Ijr69Oprl=Et` zu|wR@yg<4~IBXj0HdR>RVemTGnrlhFlb45}1)sx103dN8V8CaP;Ew<#-rwgEkkk;+ ze_V%xfC#sO0Q_r=0{HvoCj|U?x#!PssC=luMj%$?L;rOS|1uK7$MR$z{Dt5srR@R% z@ml`n1DQM&!vvn8%}PznRZCuu$JD`&(b&wv#GKL7&hd}i_&j;Qr*`J9#>Ad>w)QSO zp8TYLjNk#Ezg%V_CH`ZGs|`P?mb?b4fqpOvJJ@L!D#wHGKuKc8=FAw_r=TAD#O#gn4qnoqsA5SqeWiq!lw==hQbzx#* zWMTSya`3%;W~Mx@R<5?@e^CARWPgw^Z0q`;S6{}zJm1#p<+XThjqNS?Nj(|N%-dLr6La!0{W<18@BQ=Ye@@BA^v|dNIqHAB@1M;4V@5DH1rYg|{$3dYL|m-4 za0mz?2x&24HBZQc95^4nnTcLWyBY7}RPSmdQ(K--*9IcgB=HakBr)V6Awsw$J_s}o zA?TUEa*VuK=GP6(hdHzy8cU3O)+VEnT{=A0uO$3(W7P?=))E_F>@ClKQ-K2dO46!Sk0Q9tXY$+UysT9q zq)-4B67)K`BlhoD8ipMhW|zZyU*~$e8;NK3cpl?Ct6yl|)5hhZQ^|0U9J1{Arj=OO z86^U|d0#h!m&(TCWZye?{u$2`v)$^TBrqfkK5%p*h&k@RomoY@DV zIg_vMA{RHq(WgMK$vJF$BqG70iZS)qZc#e%C7jJWDZNjkxnIh)vXSj+(utT<$D~r( zj`0~bSU#esj1)+BH(j0#NdFhXF*-rdH*!14=16Ce(v?~G96nnXoidoHRgDYV7oQxzbbXSkRX^DjYJz~ zmA_?~kp)z{0n0==AaYs2v{CQmyH=zEN=ix9Jf)j>&gA}nif-$UbZY{<=J|z;r`*7pLx0|H=l*ki!KNIJKGDs{wS5NY1WMtqjKY%B*(`xn5|-A5Kn2fMM^=rLgG?A5L9LDXvnn7*`VR@ZTw@ae!Bs5>SN*My(gdQo z$@3rFFHlNUuC6D)*)1N(q}nt8h9Es@u$3CjsK|L*UINk#1razumxVe{R>Ghs?Zr2o zq9wBOn4~9e8UJ@_ct!CdlE}r-o3+1n1YJTT-}f7`NhN zlQ%tddv_009)dT`9$jKse>9kttsEpq6B03@=Cv;9sVm;Bz$3T;q#Z543vrVl!Tn~j z|B~1POh}%JBTSBth~GMbj%=ZLi8aDbTMz&SM%qlI^b6?f&dYp?Zj^QFLCtD;m16j) zI^m1vJ1LKF&0bI~dKMw&Eo?7RwXO0BV?d*VazUy0}n zpb+}H7r@WH%KCzBJ-PKVth0uey$a`HI~~ zN}DdfQ(`G2PIy2#>>$}LwzOk9ZPmqEPg0^>GSB%pH7k(w@PO!6k$t`FGGlc}2%NM> zt7e^rgsh2QbA@l+SFx&CYW2^~WH0YWqL4pF7bH+WM>SdgXlhfeOKkK*;x`tK*%jft zvD?pFUBWlNBU^wHqIRa)6y59x+2!7A9CEx|heWW6eQUp;n1#2K&OCg0Hdwi(DRVXe z@A6vjQL7!_$v5`(NOW3H+lg;m{{z>{QvCFX(zi1>b-gF&p%}qe^IbJ?%Rxy@J+pVo zIQn%V?%+wss_bWK^9XZ>mqt|E^R5i{#Uj0n(&LCduGPCkj+1*%=-=7sCl`LAiP^+oS?7 z&jBhBukU2}So!ga0nMduE4jICNcP1&)a}Wb_4|t;Qtf-S;7DbXKCj1A zR;xb#8GZ9O}bVIGhvr-Ou$ zzD+wJp_6m)%MEEZ$PP|&L`JAKcG?3$Jb2z}-)HDn4h>GPN*{^;5Imf1z&G`5!`gCD zX7>ZztMuRtuS2}1_DaTwSffa3q@;xKKIsM?r8Gu6qHW3H6{>&Or$8o3;9W23x$-}S z_|Hi1<#!+x*}C;vn(fMsNs^j_qjjWBxEwcwHV1<>tFZOnyc7ndT9vzu%loF3ZyhHI zwP#~Qw8aNo?%Y?O_)=S*SO*?>5#qb@$${mYbhae1#8%aA;7E^^f}U2(nxlDy8&e^O z=&@d+Zd#m~he9s2Okm+mB6^z;$Mlg@3&$kVHCIuF~8PahK!uyRC0Xy!lRUkNK zeNo0+^;uQ~6y(G_Od?`^JHp$kibjn+uN5}rv!nv;$*EsS-mwctV}aNLJQ`Tf#WG_L z_dnZjr8>f1$b=<_tZtnHlnXdi1Hwz&_Y{^sd+3bv*Vt;e;(JQBs8t-qlQTpkQwiH5 z)2=#;g-Y2_=^a$v0jANRr?U$acO^%^$emPZa@Ncgb+KiyBDKDv?h8RNtW>hHDI1}fJ+ zufqTH1U|%^;2d$mB0Zn`wKCp_o!hkWDeF_SSRm4VEb3w<{#AnDSPG}VF5}Xwb+MM) zoaHSxSUQBIx^_>a)t79%UnCanF3DM0)bwKb>-K8BT#!E~pd^V_jiM_P#Z>A*-A54Z zNKM!f3|l>9B9)H9r};lkEgS+{k;iwUe04LD!G9Lz;y zz%#V2>o>SvK*?}<-{Ny}O`G9o5QXn*9(Hke=UH;&{=(-PB7`pE7SN21iTXr~J&Tnw zdO;kwdJWIMjny7G4*ddKVe!ci$`>m!(n>p({R!iopzbu3(l4XBX)=u zJ2lsULG-bs{h!`3I8-QtZ2pe98B`Fb2ToW#TYUDYS185}^y%aLDy38;BrOY)hL>+a zbKJcpN9Ed61&_YJjJTDKsQxMQ2aqr50|Zu{%s)-v-$FwCy;LL^$_*m>IftG`d(xgU zplMu-;TEn}X7NTU!__*G{tHNFMcv!%@|%}c^-+RL1~ z8ZAK7sG6tbn=xk4RNp4!eJ(4l%4&PN%2^3C{BoT**lnOK}3TW;qZqo&)kB^T9 zgmxmaqMzGlOiZS&EJ}tTv5N=`E@i;(S=}Mh z)7wkEXNE5K$biPHT|0GEpA78d&YEubw?o!q@W1t!Zyz2 zWxLyXZt+jofHMFHdb^b|krU_>*6i>PX8!#rbSy-+>e{1eN`+sW!D9I|zibW!$z+h_ zWugVuK#pWZ+RcIEOSrReDx8JyDjxO)RwrZMaVH+N8Dofm6cYVr2v9Q#EE+2hMBZd* zF5*aYe+edCo4n1z2+!G(9j5avzv=Y*MFyf(bqYg&lc0yg?{3bQ-m2TDvQ0yQhKgx? zm^a;#HBR1XJ(g>@SZKCC8kA*tsmTZK7Q1#&z)lGq!~vjwLbtC7?1PB4LYq6hf>lF7 z22Si(QVabAiTrFjIiCpXb_QXkanTr$A8J)LS@9F&vF#Z_z=Jh4e%(|-EviD4xU}sA zH1th)6%RjOLjqISa7#lRR$y%E{a@Mn-yHE)1Vc#e7X6xuf8~i_68`7$iVcb#Pw#9s zkFMBN8tgBuTEJ#mxQ`%KKQ7- zyQ2NXQQC+LEg*?j>>hXl2LlJHFIO~CnK996qVQ0cmD5T8QZkFxLT)ZsG{PsSPS{>5 zg`YsOCzn%x6zqncf={{T=@f+USpTV4O0!i`gy8Gd;?*Ld?5hBHdM;Ng^8?4A5mPWQ zgi`}pCndl=I?i&(IuZ3GN_h0sne@f7y-- zuL^?~q-S!M@~8K0=pC04S2-+5EAM}~<5w_H4K6r{776{##PGz#c=Jk|<#Q#%fYcI1 z;th{~3L@Cg<6HpN(Q)z);|(y8M_PGA4W8A@z^Gn4g@>lBr)>oO*^1n+(*1;n(}b)0 z1KCNljbdH$FT^5Mo_2L|TqI84+14RnR-kJa!E*%{eg?U?nm0?`2p7$Sw4$^}$-8Zi zZnCCQ7VHsJ%I8|unlax|)E)EN7wVlqz2&}sVmUi~Y;>L;ccyT0P8LeXEsrf%-_M?0 z*iJZU2GZ3cWA78DDK6jr`JS)dLIDp<<>5Cca}^G61Qym4bsGC<5+X@hkJ805d}IH$c7sc*qHA3MzYQ8$9>?=az zJ}CUB5oex<4_Pi+GFq}aVnR4@fFfkr51Ld>9lw)Sp~EVw;R=PQP=zj=7imTXGO+6&ZO`)7oueUeT@Q zgP5=v5xiyg#Gb+WJOUi`KnX(=Z*_#`dBSm=rK@VYxSf zR6#BE?jD}t@KH?G9+U)X!C^h(iPwd>jsb*GK`L5Qx5(NM6*GPZCTC8SSCLa#pQ*ec ze5chs!kt&!KXi+Y4B8NH>Bz#bn$6|Boi>xs0u~>EQ1%stF(haR zo1WV@SP5P)U&n%OUi}h(=HVMBip%`ZoWN)e2tR3bufYBOen<3{h8)a&*G4N!f4Ndv zbRR67OV_&w{1najH%N030NE9V>XZtZ5u~{TZREZ^7qoaG;0&5L+tye2u`iu}TZw<4 z0EyStow`~qaEpFkVsY=Jy?5RZNpW89wVGVmOo(CPkhXo7E><4lwx>;VHqp+0bwe`u zPWq@qD;jwlA81-oIbE9&*tGqJ*5IfBpnjBZ1mNOAeoTEn;o0*BR0TWA*;P9YgFU6S z!Zgq|MmL@sLqRTC(@)2QbY>aalp&U9FTyiYK3q!Hu!N!(Ez6DFYcvNaq5*HFERpqx z>b~NFYT4ZTb&AjzTkwoO@s;)`_QIV;^yPb--14-`arPl?kC@bZMVjQ>wZY`cxJC0H zWNu(!<#pN0c4ENkPI^Y3%8tGpGcvpFq`ZL`NF{78>JH1{%3&y6A9|o{soM9M}IsC#4QKqMwLXId51>T(f5GTIVcGD zAPviSVoG*7bhYFt6;0~?pg~@&>=T@xa!-L}04avZs1r=Fc5}jiTH-&g@+$+V8NBSB zM6V;?LUV9Ro5&%c0)~Bb%QTuRKF?j0isnnY)7vL4q!kZWR2OHo?s@x{H;`*Kt0`CT zc#aERX9J|x{V|wHlA@&0;KVB$u9F-sBQ)}Y3?&8=Io|ILRZ@oV+^WgF00{2jgmRqc%R+M+5B_yebhg7WqAD% zb-NM(n=1Fxo!RoLaw){0NVT+glM&6pGQGpMX>(vm*u}%Ha{5U-N5h7rnSKI-2xSWE zrO4;2xb7cgHFDZ~ESPvK^>5n)9Rxw30oP--u5iEv1)oc5snb+8g%wMymLHW*6$E+8 zjY6j$>MKgq3C0%9ev+!mf0T88*Ehev{u+o+N~y=7JNuDBZ?l3A)1dzGkpo;F0aei& z=yzGqT_a*P172HM2|Z-2y$StKb^HUAheZh#x}CA8rb#8m zR1_AgIq1-lenUVapg(f#bg46gdEk_o>dk)~SnJ%M&CY6KP?1vEaWdfqy=&A=^`d;= zQ31r%jc3!in!RB%YCsL{hO^gV3SgKoMLE28cq{Ez9F(Len+S$x2k@HI24YclMpN#J zbdicAVXA)`j^FND1{SU_QsI$XXnatwA4Q+j1JMS!vJ^T5R_APd!Fb8=CYZtb%veAs@cf=n-K^J)}u<|9R3BV zI*|%a^H5Ve;tW^Wdv1)6M~UEAPy5m`M~l;kaVF8Fd>ZMT}d&+Za@Ds}fjtXcCR|;7gH|GoUr-!<9a&33V zc`2Dm7ki<|I<-tavss`0zf*41lCWOuW;j37ggW0`*B6^vwO;xg{$MuF4jP?0>`dip z^zX&RyqjfkXv|cWb+Jl|)fXkV@oKR3Yt)|X6PF3E@=x)b{uEc}fXafFvjoFppFefo z$7iBl=08`ZFEFaq*1XanFalJj-?I-kZp`&VdFKypEBg*PAV_2hOzr_EEu+ z5M(>SzigchJJBJlQI7O!mFz&yvS3I$r8Ed0Gs)hpp41VT_6sQKTI1UI-t4RlT<=*i z9q%nr)mJW=b~sFasm48bd{iT4$8f)UU#1aTE=i!3HQd5bzc#gEQ{4*?c+S`IepL*W zfX1n)ucaj6*auUViX4p~IfR1=YH6dieUyP4!2UnWLl-oV$rTbAvp-O0hZx=uGq`^* zBrUhq@A2Q+GXd*|oSSTht_J8kVq`7C`;8rq&?qppMxVD>LKWfw20)pO5QMU$aHu#U z3V_!kCnn*PXPmbCDv|<~%qhq5-G1?8m~=}&F0+O!m*0v##+Dkfzk&ZeC!7rv9N6@% zWb8}5jBviwlfI6W2g!mN8U_9N&Ba1248V=IlO)^6>4>DRJIuR6()4Iq$|xUr(&Alt zEZPZ6Q$p6)2|zlf`TSnfd|1#nbmvBoPAd#7F1Q)=YeeJ;>F%2k)UTC)%dl&E1X)^ns9IdgY@&fP|b1g)wx!6Ha>Si!AgSR z4|m_KyJ)#rwPFN%g&H(!{esKj(C%M{Q7Ibyr1MYwAFmqghqi8CK_bPLgJ?NkT_|q? z*aF1#g}#N!Daln0r+H}o!bmpiI#=o|H$z}G@E%RL++IRFxaED@idiuGJ;G>I?2z3; zJz4y#m>>^@8rF)|9uq?8G0QIAn^be1Vw5VvN8i3%zmK%5rQkBu{fD67E&4*tKtW$)-|UXN>}sA|-u+N*xAWKTrvaonyQV#Q zK^?&<6NCtcF5~zkRp?zGXGQRQcWDqkI?OQh??GBK##O#Ry%+p0Q=}wP3k@$u22s5} z0G=H~N=;cKo6lW2L9fZArR}-|4B~rh*If<5f)VDzaVPlYKBdnsWkvgRt*?&S{2$)0 zqgjI7vn)|e)Z#vu1<;udCb|!%zb?Mk30G&ZQ8$emp;3lDhG>=~&j-|;-HC7BA&+yG zv&f`Th<>y)yj?W=;XA=|&xYORdkXvunST+RcM7!1SCG+X4RL9e)vbYrc^ z_zHx@gh6d1AHA}0xHd<1&r+laB$3RoZ62m|AVss-U#g@u5YJ<|ivYBD%)Gx$x-=n& zf(Zvi&mFSO{UCu0f)o2IBw(&Ucu7QRD7%7*&H%tyht^X}JoA#;Fv-l3A5a^&`nH#5 zrpZE?ICZaZS*0Wi(W$@{Z|z&loRLmi*;&CQ%cIiEEM5u^_X-%XgqhTM3`TWOPMsch z`3WJK)5p}5mc0otx-G}PH3@Lw1rlV!5+U>IBlH5M%8W^r>biq%s?PAzOQ*|2Xb z!lK6iC9Ho-EjTkl3j}u~sa{XpmrdUanm~p!u@493?MCVD-kJ|DGH?X2mcP^{Cc>!( z7E5r8oKsXObJHzR9F-%VZn}wi%#LVZ()R=QKqhoXaZCKGA4JDBH+!;zv=ft4_D-|j z^a^+tRpoF7iT1JO*Lix>rf~}Ko-touU{7%Q2bVX7xv6%(fms$MLJl7DA>45*TEM2- zBby1I89+Qh2loD<<$i(qWBf9dWS@yjSndnvG7kl^1XxrEyt~!s;pS$>ql(~0zB)>V zu?On24<}C~fMG-l1XYX_)hDh=u{@$xZM)bhsYF~BPKCw&W#{G5+p~v8UbCgvO6OHy zQ@NffKPGC=>m}aAl6bCAc2;uZj~85GbvL%jMBxiav%@vBKWq;Yx~qm0E+UnoCOmx< zLij*4fK)*xI&p`$Adq!j2q;0es|_X+V4UE$J0Iv-;6Z^y7;!)3i|YrdQP682qxgxc zL&w6XQb^H0&Tf1B)`?3lRjF~R=#AfDh@{-VWJdG_h!cH$b$(+DMf7RG zGCjR;TKdboGqQA;gi=KiT(9MKIv1G+aD^Hpt)<|t6?ba0TzF;;?7}&ay7xSY9T?Bg zFEJ}PR~j@0WKhK}w1U-zuvr=VR;O6&WMja@}Sd4|XjpODmDhddC0R4)c==N{X>}bG;cRl2-08 z-bJ07S%j`gt$IH`5p~J@!6}lGqf75;v3P2`a!qsK0aX7Mfy1Eh*P0RsW&!OV{c_CN z2wn6Lv3{4jyz&Pj>9l~S^XkE5`RY=L@>vFKeu32x9pJm|@fh|%wIfKDD~}#4FnkAs znlU)_L(dcc+RTq>hrH{;JReJ7()JxbS?DMQo}sYga#X{`UycBeWRzlsRmJp1nv9hG z(<*3lmVl@sE1rt)-8$kf>=O6-(-l)7qg!-Xw24QnqKtYrvT0Jp4fE-*dA9dzMLY^r z(xVb-a)P`wi+=haWi=Qo(nLG5%u}GR&5o5|AWYQT44Wu*i(?~e%plZILWrwCqhyXg zF)}Dg4X4U=C;Pf@GxB8(I*aANv0)-7uf*7GKTd|DNa6=RdIj7jH=Eu-%Owl0N(oXH zS#fubDIZ1mio9GTY^{fWfeisP;K9{Y|Eb-5U;y{+-j{B@SGzz=HoPVegjr9PV{4F8 zmaL;LyIcsYWM`b%EBMmdu@7!mebr$~QcfE!4|2I5Gg{ zje4RB&g<5N7?qp-AURr_WB%ztKZ(4Rh@)1GmP%PuXoKq2W3cF~YE zre(%`d5f-TuqU*6*~U>56-uyZC z5}^mbn$yd932XWbRYS%sj8b^^lp!h zAVKxFFK**+b^MX3X2FnDnmA`_#yTcSoD`+!E^105JA2>k@S-{&b-Qq;PySIQEqw?O zm9*`#@#_rMoZvF8)3Md}x_y>1W8XU7pQbH3{Fy!*pAn;O=zFk8o(_*r7TfX_1uWA$ zq`SCR7S>rL-Ea^;B8S;*LW$*~@aHw#ub1k#H0XnyN6QCV=RQQi@~|GT^)YC1_TjRi zyE@86NP@j^77n}Au|Bg()VQ;j3hbhKgn{e|ts`p0x8NDE$p3+gg8Q0YSD+NvbAO0~ z(Y|sN3Y`aJ-1DL?v%G-^l*i{_7ZiUYem$C1`Q~G0#$3@+X+4v?rsOnj}6jJg4r%Lz4U3)6aNT81TupJezlVk+bXH8rW1{GS-9d z>oy?@`3e(8`-!bKu9FiKaC*s%!$+VL6NZf->GMA9Ec)o#@Y^uhDdso7oPIrVbN#~U zlg|iOfD#Q7BF6CA4HhQ;q!}zTt4Ow9@KxKMyhaedYXuHc5%68v1o_&bLH2+23ImA) z$mhWAK3cZ<)|FFO`Mg=}XIGUef7F6zLys*w^y!lnq*Je-s#UBJd1nYpba(vNM8WO2 zSv4tJ(Gc=};CePr6@Yl>tG_K!TKH%1kUG$q`0I1|^`{{l&Xmk`qH*54Fg^@(`l++2 z2)blYE4!HTrLJCLI<~P(b0E1|=oB4CPjTh=TrfO-^<$vnRTM;d=0{&!!)3-dI+<-I z=B)_sv8~*SXDAlB<-dWh} z(wh;E7y@JMtfH&U#d=k1Z&hdcm#8Hl$t9Qf>bSsYFB|tS>(im)aRugD|E~`>D|;4> z3_{Dh5eOU;pIW=AzSKY3&%~AjBPX@yvszYR()vTO9auin+*wv+T)MuePz!a%Gq6l9 zn9~6q#sBm+{tR_$l+p5ywASWeBJ$3=)OD|!n}l#2MC5$7VL!p_+K*L%~o&I>j{D+gw|J?k0MX^s$<9tn2!Oy^90`-MW30WSLn-Uf4c zO(#LIrEffli>LN6EUzOK<+EWYJ%7pGo*?|4Z+54?l-)(*f>qB#<=A4*SFWU16F;D!A#1vqoo&jrvX%@<8T+a zC06}V2EN8Arg$>AH_ss73D@OLmSm!?Q+Z8CRE7-z;tqHEaEUnrl zK{F~O#XTw8yve=63j$=QDxFcN)xcwARbg1da)v8xZ70NcF;fKOlPAK}zyy)O*ARP# ztU)V41$H8<%JCie${UpgyzN7Ve?B3*`Zcz=tHx=z^Qsi?3(XTZ#18 zj=$TQv0F1Vrvv7q>0VHZ#Yrt~@T~n9k3*>_zj$AeoG49gCJ-T2{tK*bqsZ z&7*R$&pG^h`<0<5U|x|An?)Gj2HGa7_3jnUT-P#eRhgqn4&;tZ~-Ny|)f_>$pL)R*A_JJeJ%&!4; zd7o$RvEZ4>E3d=vm9JnQgeB-F$VpMZ*rr0fx@lg=Dh{#9gWf7lxh3{~%r3bV^eA_2l^z z`Dni#1vX~sdHIPP8ie1I%%-d?=1%z48XQizAo>|KUPZz>(V%iIdSB)a-LDDRqb>g% zjR!|jDTm+&_3vH8`1iI@6_7M$TqctX4TZz7_wYJyzW}d;9|_h~1`!v^fs%=z$w6SZ!8D*Px3ajMZA+I~@pu3er|N}QNkfim;5V?kWya8hLh8#~8$+%j?)UejX6 z{Y}|BNH`z+I z|MbvzyS*EEaObhi`4wHEEF#ULH2%%0b58=X-kw@8JiPjFTGNtOmz6)ERjoU`$GQgg zr?Zr>=V*`jQ)q;fCMeRM-(7x_li! zH|rH`q}1R)ljN>DvT|deVWAd_D~yx+-a{QOR0Es#iyG5RWVwYGF9h78F+G0zacvTZ zp~s%t^jE3d{`-?^tIDa%avA-5TwkrW*ZAmE!$cKRbMFt>oE|sWHoiqUoo=j+*U|=h z9%c_u!t5|COchot_FaZuM@CFJ)%4BXEfqo33RFyd^zX9}%?|gL4>@9+JuuP=7VInH zs<07C5yMAKq#$1n!`5^rr3Ity&S&F83I-dFf_nEjBih zcBaOpYh_Ypk17%h{Zm1QGSlX*s!KJJ{fKt6pEb+&X?KjdG_AG@JNAyQmiB9p-Q|C2 zQEI~!7kho!ZzzDv?pZ4Ll5<@uNa2~FYP)Pjbjj#{-^IgmHxa``ON6P|3Hr7op%1ris;q!3feNsh zwyd$z_^dO`ks?6kg_^=RAqe(S%5(7kpk#1do*8jPog?&>eWutvg5#$dsXkQ$(AIb| z)|n=~sCSpE=u5*=or)8z?YCLDq^_^;Iljz+Ljlo9Ayw%#7zi}>vZ*fXvjHiW0tr}u z&{aKrv(ZO{Xn3&t3L^OMXnaQ%-sylTXw)wlQEyI_2zCi+>Ze-ROAMp;;3_ABh=}+s zD{D#;P4Hvnukv44E)af1{1lg7!3hr^u;>OU$gyHPsE(SWYUbie-cNX$q&GO(YuSTW zlkT<5aQnFnK5%58GtG*o|8+*i4}7+gSIgp)U!7o^(_Y9-fzW#({9;s}eYLB+Gkv}P z@WXlglAG3K#W>vObP7YQL7i$p*D4;o38n0$O!QmhTShTSAce^j?C#9tmyOlfXJ)ba z_qlI?diD4`E|53mD#D2bC9IK}D`XQl$cDNq6kHi{_61=zSc3Wq||ez32>MS;eLUno=+?PP|8 zviaa>%}&x5<%|7Tpr-Kf2+!N+VPE;(O)Bq8Kq0@V-1Ej-xvf3KSAMZ?Hy^|f9ZuLn z2BAr=VlGvdHI<#vA8GJCMvFB}&wtu*c1)M5lkl@1HH*C|-ZZC=-^_hCR~;qOIiyke zu*KS4;VV4w;k@y^a#BZAy0_Oa$wQ9tAPnya#K>J=-l@$7B&G%HT}V4bD3g)Sb)_hF zy^CEBqIQEZf5(cRUph>)R)y%@(~-^U1i`Ad9!{NM)IP*G@75Q;HNvSDy^VlSC>AT(q8aB0phBiC2n>80usRe@4VnV^NK*WW6F;_ z;7l3Zpq2-Vlt2)PfFpBbY=RQFH`}B;4MU+opzNdZj#j_799Uu`N{K5*15`F2k9c|u zLO&`=4}lv>pC^~>WgPGmrKDiJhZat2a;x(yO0};Ih*p3v=j5TVvrU#4!)@S$A7Tb@ z$ZfI+e@&|OjJ)pM7swlZ<0;UY)b&If@c9ijL68v=6y~xN1OUqXI(3q+keDnI+)Hk&SzL{K8AK=xvLQ2Q)?e!t%jgpS_eiqNW?}+hN3GU1xiEhM2%Kp^xIQtrpDj#=v9tOdE408<`d~Glf!<^6FAxz!LWTo>?PT}_8a8st}B8@-3aRKqNBHDRqKJ2y1$nBzymt6j2 zo}?)uQTtOf!_kij58~YD9^G^t;@IfOV#y>T5}zO(fJnB`t1p7rcBSo{Ln_@DkSOnQ zMEU&>-FbIiW&*KOlpIm}e6fyVu=(Cf>>dL9VKSg?PFoppO;J;0c_LDjSheY%f8It- z=Q;TS3y0J_c;E+#iGv*@P3wH8f{5p@GO`N%Ru%RMBQ^khu3`H+@M5krw79*vSRwC_ zmw0|uv`P&3U(c0CTYXNceHIdrcQnoRbWTKgcIW z;}eVR63b6@;GYdTI>aPKVjA~Pz8{+p6Tnp_xVrhaJ^YY9TbiKTHo^pQ*d8X6O+#MY z?tj)L{hA;+m@v)qbjjGHK^Npr`MK*(*l2Ww@F1KC2+?siMevSmOG%g^qyq?H@7K66 zdsL$UM>SE>**FRavRL8Q=`9o9na<8HaO)&q%`56~;T3z{sGi0tIJG~tQ4>Pw&PemC z$Sa1@AHh($XeOzXMEB8GPHTHEk-_L0Ya{Oc;7W`bqJ;T~R!+~OF82mFeFYu0;wMWU zOFXuqv0}Qz!(`amo$WnQ)klz)?=(&f-t#yJm};Ke#4pgnTtq!``iQpZe0pb4`yrhBbCuV#RVZa?gN^XLTg3)t+!?P;UcnaBK{vQ(=iTNn=@Rlm z!`#l${Wobgv5?5ri+3*%A+z)hk?OER#6~+@mdNpf{pAXjumBjjLJI)1D&dQ$3Q@V~C7Xv>y1;d;x_f5G-fN&5 z&O{^uRQiqgI(INEtw%Dzoz&<}9`1#>x5OJ#fHp8+2ya&ciWf-(ZA8@F(Wv|Q=ks?p zV94RDz-y@IOI$T!EM}-eT{U1th5c0$r1e8b69Bj_`5hC97~bB59zrrA1G^}LPN$qQ zu1g!{2XskZmIGe-eN%Zz#NH$%|-q7zW{ig+i?+GWjhd=6&_aLZ|^tuxAzre zIn&hP`D!+v5EIaP!W|LcPFM;O#eOM*earZa;5}bLdKHK)9S)2CyRQARdJXut&BvrZ+f(dyW{cAD=W=~wHCqXKZ{NcqFTH2 zuXBuTzeA=Zbw}8*hz(s2!O`0 zIq6u@%d0Th_?3(> zPKO+rPp0i~_B-6xC(x>S;Eq7QaIKvE{1^Z}&qQnoJvZth?m2aH#3v9Ahe2-v|H@NO zmvhYM&Ug$PC9i<(%q~pU$!!^3lMbd#MX!P&r}~O2rWQ^CVWBTkRKk(HJ z$-q*UkpPYaE9P^{(=Fvo&3p&zY5h%>o9)(jnOuZLgZ5Oe_m7{n&-~dmhgmuY*d~ta zHL-P_x50qGH28na9P#@FBgEBy_B|5p&lEirRHS{YN_l~nKJ~4c1l%&xUj1&N9b=!R zSz@b^^;d^U4HMTn+utn$u$+PMS+01?;a%-SRRCL&NKax)oI3&x#^fy_VrUFhIeX@e z{t!UMJW!e>iO0?-nclx4& z^UZ%P|(aLis+4oFGm@$U-oj!&i2M-&0|~2j0wZO5cgoE zhi7=d6Wo^{$%kMuY_~I|4bzfLLnN+jsOPD6w}~`aK1Rcqz{h#64K0Hv2oW@hQQcwz zK|z&hJhB~;y^h48bTI~KISOO4G6$20fm{A{R=Ik`oPc@8OHY2Fhi1oA?kv%OU{68x z0>uaYKm^bAD!A(}tTCcrczxW7stu~mlP+0&9D4K&hXXm&T$g-urAwb&zRwv#&%Ij3 zK3uLsZWlOd?wrgve2r7_jZIIJ8ZP#nh*<(YJ;{g<>(ktdSUMwEw zGxJlAm)hyQU8dX$8Py8Ux1l+*DxTd*SK0C~-rb_4MDtWisYOyRb7W&@pRgYnz?&=0BX!z4h`FCPYCkiEokI$*z}$In438#) z3jQBiZ=n@ev_M+l=F^m8#6L`VX>NOhM7I!KR1SE9|n zeC_?%`*6UufmlEFO^D9eytjQ~>51}#X?OkBvsrU%&UcTmrPdGou2VeGN>yDY@_gWi zE)~aSw@}6=i1gM&zhb?bf(%AU6vW?XqV$yW_aAH-AyM@;(bg^Mun8M9m#L3kPusHr8tcRb9+v5qp5gnlyxS50xX zwfxra<#SbM6pPiC!n(J{aYO*zo&{&TdVMkDvMA}}m>Oin9p9m<)I~GifukjN3c2)Z z2m4aPF<|qgA>Ot%1=fw&Lk|~!QbaLJE!)JRe$}Yo+}K#-bxME=^Jg!v#8L_VTa6WW zbeaZ)-e0zbsw_T5Vw4r$vmDBkoJ_!gX59)e!NDiIs$9=!3x$eMzJdFvUm{g!#Ex?> zOIFOdBW>mK>ldti_H8c5%s3xx$VgoLUVt^%OBc)skXX?f&3l65=CG6^-HUlOt`{^dhZD!{FQ9 zO2AC~iN=zYmPCOzfRkyMp{SF>vb|NGQ@y9hb7p-vsKNb+@10GL`swc;Mr61tieDrC~=pQEM!5h*VjP}qL%8sWfi>3s_?df6F_!-8Y;i%t*Z zy61h=I=LBF5r1Ifekx`~`r+*#_YDMEPD{K4cRYeGLSPIJO#R02zXv%)O#%}k?Mh^& z;ez-d5+cvJ3shED&iyW2k)-{WL2Biqfd&K+3HwDpmj3NK`wh;&SCr)p7GWo4f2E;q zRRl>6C}YE{X74*|+`csJO^v{hQH2Nn-?I|a>8*N!9y54E|Abps{A?bc;b#j$lj7c? zpk@jFwqq(P0*?>0B1K6fVlaC;gXvrxvPS+f>YR0hURbF88_g!5FDnu_4}Zj^tBK=- z^jvZ$i6owc>bD6MZeK*XFRfrtMW(jxrwYLs9xDnDOIdLTXY=|>9a)N$PlyBc|C(7y zgTy6u3{mgt6!*3Gn7c$Y<$~Nd&u0C^1`Pm6{c>|S_YAQZ-u_UuEV)tvK2zed7XaG&r3mdNolry)emA~2 zvB_g<3Dn|cw!lSRBRH3FxVOsX!!UMt?=^G9gn@};v@)os>(aWPjZ3gx`a z8q(pLwQlMjInYUEqkme!Gf~6+a-W?^QRuAKRq=+kCTxAQa<6oHi5hAn4(q{-{j{4H zw;#<&bOwdCRs}rmi4w;b?L!%HT_!nq$wC6)|J7h!c{=kT-}!+e#dv<=l;_N8ps`Ub z(7om?{TrG2;PVba(cj+|c^{P+>t3sMWA$vmIBmhLmeKycYCTx@mt+FwkkGPI9vOEw z=o~k5B+Yq6F2~OuMATmbRJ22BSY-#uyvdd3_;%{pNI4#IwHYPWICbi3guM+D7VoRZ zVge|nBqE+jBHJ>*?QhLckgQ=$31nL5dr*Y0v&Q2oOB^T51*jDYBcf&Ki|V=!lY_P- zmY#im_FQ+@Qra}WS2bd1~$>~xA@M9!@bBB1$&QsfyL`Gvy06!Mzzxc z0EPpsl5W0^=Tl1+X?7#qtw%5v1bBmWi+G!bdCdDi5f21~SBA)WVsyhGOi~ymMajXU zcP=5RWSH>utORwImQZcFQG|cJQb&pWYA}r#X3^55u+qRF8Z|yEAvI2oJ^_|i5j2Kl z=HSrZL5bwMsAZ}q0;7+N-@>LF(PVN1J!rxT<)O}{kQk|0h^OF2;p8OYNnql@miw9_ zj^xwl*nQ!sjR&*rJJqprFt6tesxG%lNFNI~7aS$=!dT$K>-(>$sTibTvr_QkWc*p+ zR3J&$H|)m){WwX7D*AHDFgUxkoq#APG1+;xW8yIW??vI-aQDLw0PJ%pq|{i10CCJD~=ZVY85NE+@Or9q@_cwJ|~Vl-=0WFc{7wx zJi^m@Wv7d1m$AkN?Ln3Hjb>ag}A#2-l<`~QA|VYljDRK^Oj37v<)?f#o!*W zolOOwZ*R|Y9$F-EU75yDjOsNPSu{~N^9pEw<&UKK{U#HK?wKrxzkjtNryd;bPiDQ!$o0N; zmYxv`&hyotVrCj!>zg9(VBMn+yXb?4^(j~XKD-@~ z)XF1oMqq%=rzSSEAN^#b?9HKs_CV+$O(HQ3qLZzOVd6>b@VBV%eftDs;Db!d#Ux#}&J^R7G$WR-@}F#fZFsR}YNt}Ft7xY6!x7SY?6RCxLp z_n1Z~w~!iKG`=>O13$_sNfD`f6c|(|9O4{lO89;~+k0tVBq;=JsARST)uTw~XnK^v zkD=9z;XuDyHd-_+cF}k+O{kpe>%)T(SdtN+cjjn^HKj&fWHer3jKg-Dpm+HL(J>LT z_UCyNn9n4O{&->2E4Q59PD&Y=yuZ7QFD^h5f=l7PNSCDvaSN0dpV`VOWhh+823BZz z`^f6f2&7!%={^LpO%4+oMxqJ+Tq$y(VE2KSt#HTcpEk_whrt-s2-|Ug#{!A`XFOnr zDpXweeKkt%(}{&Q_ZJVeNVG6pSXOOo5Bz5)Ay@(XQWGSMhF zlo$if?ZE+{>4!G9MjI`nI470l)CuBFA>D_JOpie`8(z z(W!;LdqMH}@uP|AP-f_V3C6y6`cSxE|JXhJSJLn=KK}2C%6LAXYMbK zaHjzaH!)m%aABJ+$HLY74%LNyDcI-1G4p*jI1SSAE(R5hM5nvbU#|EzGEz~g&x9dP zKmPD~VF0>S0s_Y8m6?zoQ(;}rXh#vi`)<=i^y5Vp*2`(tEZE}7q2i9lCNW-M)(C>h z_=v@eG0(zPS*_{9HUAUvniQa~9p0LD#7>?aRr=DswU$~I5KU8`%r$yNM z@rIk-nt#7gn5LF@Xh7}r`Nql{^x~HI--lU&R>!%3xDM5x0GTg(7t(XEYZ%Yy&2{O_ zmc5X+#&bFxow>0l6{7w&6W%)Fp%ht!o^U_Ikn*fC5y}L9;Zqpg-m(26>(^{lodiMg zrPzZV!&?^9X0b9#kP6vlugbvNiU~#mc94e12VGU1Z%nqnEuPpHZG|~{i0uax7uNH1;+dN*Z$gTDw%e9{qt=JEE12UW;<(FO zyG-+}Y!`7N+=oyg5>o4qhZ?ajx3{0ilvCN5RNw#sFXo=L&){ouN3tj z;&+m9Kl%Jf>h?_)2#77WG;l-g={)Xl;805azoq3SQo)TqvA(%?hFrN z8+AJD7pa!Rq@dse1Nc z&~AFOqAnsBK|rEaQ=hE_D=r!*>qhQ0mZT(MP(3^;+v`6@R+3GU@t`86TjYF2QfrvQf$K$)#r>7GTazXd^o1Cqa*@uGsf$$}LJP8^k zq;DNZ+Jf$n5oG|S>7~ZdLx}q$>EAc>mtTD}3*TiQHs*)c5rIwUEpp0F!u$IR7H2Du z9|&+*$x%G8q)>psC>8;O}0uBj(Z7wgljP_~yO-GQF}Mw14uSe_lDU-5sQDGCM@Ae!&RflQe|J!V9tz zTc=>v3M+o<+czAQ^OtNJqWp_s7pj#=_<*VVN3v)il8IN*=vE1JRxf^5iFc5nN)qsp z?dl;%#!&pwCrv4ic%#*ouQF7gU~JydK3FrIgwuv=)qwH>Z4f}KxMx4%bR~TIM(DNP zQ+&WQvOZi?*K28>%uAWVLL_kmkNiGEn7uCjZVkyalzwJeJ;mTi9@3o6daAsHe#A`46?hM$5VCJU zJ5X=oT-Z}ix{VTfw6X9F)M;|&@2bT)o-c}VY;p`Dwm&$J1DUwuBZFWP1?FS#vg+2UqUL=xbdjS z!4b|ti#9WAAyN;kww@x66BR11DfTU#q7Yq!0a7-79KxCHfrM7bTm~IJWCv<|uo5*m zk7Z;lr))9J@t|2EiT7dh;Zr`UZn>~B3uN0Eftgt<5Lt@;TqS12iW~`xM%<|a1-QG@ zaT;bEH`MayM&s3`N6$f8BJyYSPm|k#s*Za7Ou!2Enm4;)Y4t94!hL)XIhRZfTR$9E zZ&1r_UKAnq6vKw10Y`PJmauPsJ8II>N>?7oghp9@u4B==Ry6&}2A)!m0+@Cr^5-8N z@lE^F&K`rE2W>U#(E97i?X>k*CfRioaAJx01_4(-f<4lNLRB)}`46>ce@@ur1r!5L z*w7a~!@c((Ap&E6edBp|Pg=LLti5=U*o*JLoYEjOLHuTD+GthnhNH1oJi|sLxbYQx z!FqBZv&5j_pD2P?8ym3J2PrpktigeYB&mmN32)MAPU(A}5~wK`UMquQh&n#LM;r3- z3ywl)hGv^v5{l1;z|S-I;hXX`&Igkux2|wQk1yOKWzWyid{1=2klufw5eR|O;|G+go~y@Mqy#ZOG?l}wa0CJMs_s7R~$ zW0#nL&9vzJtm)k+CC|*y>h1w>V|=s&VE4&VoCk>@rU2kReVl=*)g(%7j?ZvKB8DIU zVF=EdkJi@ll(_hx+R-^+K4OZr5;>s~BS~3exTgJ4+14gNV?}^0SVTE5WAl#U%KK;Q zvh5=ZsJ0nN9-t5`h1KsGhw8Ax2qVRNLAogS-Y8fy{HL7{p_G)t(K^zx9UGKw2w2E4 z!EMnreo0e2S2F9_%e{HTpn`L9R%ozoQVT9s_V>^;S6F!M-o)F-4; zuaTx9MD(^DHoI_As%=d&swg9TZ32{!v5mgKPAlhdY=gEB?k-lgiNW|I(UP3Q)L}ae zJvP5={*NUM&X%+^N9zBwUZGx*MYz8JPZNk4Z&B~w_IHuqizDn$eJKp8-`&@8)DLvb z!I?n2D0&`Q6D8HO{Gsl{^Wx?80et+gyFM_p%#hfEVh641cvjeJU>JrT{|~1{WC6?r z2d!kHg!q{0haJ0-`eb|-6PpMdh!o)o;TFrmM=+a#)TD)iBsr40u?j#4-|Xm!8ScwkZ|gw{V+ zog!MO{L99FeTIT_0x0KrPk;0`Rl%l-3SD8Ab%lneI{%#6lnY*-h54p8h(T!_rdUx& zHY+|Y2EgfiYt^j!WSI|m7z!dQ?a+o0ei1S*$Et z-~&99MKwN^kzp5lepw5&SyPqv_1aD+e2o_G2oR)gqs^VR?D5*6bNDG9dLZWPWB#lu z8y}3_AgEi}w}DEsbdT?JNINkp{;ZH->B@ICC>u8~Rr1*PH{163I}>wWV!GTh3@|67 zY~(I6lkdnQ6EmyNY}FOmDVHm?Kj}?$!$nIvpax9Hu$D0XU1f6JRvYmu>QM28em05p z^-ML+d)rsLu$$e@C!Vy#H7}DvIt`hM-Z~(2zHpO<+%>V)5oKzgjp~;U3{P`a~TlyYlz9h*X?IEYn~BgIS1`j`j#29 z{(RiTSJ9Vxk8dZkt^xd_c&QRqQJ36CBsfEyX5{_ZmcJKRguMu%o*M3vt=O#x{yA|l z-Y4XR(rUK?5Fcv+_^IPgt1UWE1-?O0BD1x)w|`pEbtuT+jh~bSuCPsCz$wRSUuBZ} z2Bw?hZ+j>UcaG|Ne)mggYgKI{VsNPpk`fYC$yaIO?pQK7+2l&oSaexQ-H!0kTMR0y?r2GDG`YU_=ksq78ellsgVH`BiUFsGJm8dgZ{x$7 zQ(gCk1bWRzlSlk$=dWE8e69f3BSBMWtn}&7)8jx+IH%)2WT0gK(Edg}re zQ`jb)brQS|)6B_N)%0+_k9&y*xV5i&zkSap(DbLazs41^zwE$bE(wcLJDneHXB)sh z@rd)b@UYu1T_HZO1g__}B`v|!z#F4B<9}qEF)nE7J8qP$s((hxV8^Jt2PR>kQvZ1r z0bR|SKOmL4g|x)7Qc9J4HHLbZ%n1prVs_rHiX?zjBKNEpItZ7O0>MJVr>LH*&qO(w zsYRBQFmr#I_(2Ws3dzQUVmVlVVh>fyXIQ~4;5$gkSZR(W{{YNdbcNo53D2w44Gqv^ zHpor~lu0AOj?=iPT*7`L1`uc>oED`0{fN9?^)_2`g&8PF=v>wO(^#SvY3Blp(*TCP zCcXKxP_`wcvPodd>B#)O48|I0Pgj<)0#+DAiH{LQ?t(JAjJCfS89BMALy<}=Vm z-Ky+qhDCiMmA~@y-tXjl`%69oh|E-nQ(9fhV!96gqr3zj5#<)5HoLe|O$8 zaC3cMhWs5Qox=1ip`GfMysSyYt()#^!*%NJbv_L_EREL=z!Ok@w+qrMpw<#(87raE zVqO(QVOZ;>DPxY2j42TJ^jNkq({iL&#vI6N4r1};{C~f0y;<}n_fuhu83|?I#qjNxO*A0ebGsmBG;{$Z44J- z^!JaIgjQSVVDY|G1@4f&Taum=G_vG0F&ESx9TqVC6x`C^eJ(_5bIo%=`W4mx?APu$Cozw`Z;Y% ziVm?VKFGUBR`Mk7h}7m9yO)QUf0=QuE8arp%R874?tyZfCc{!Q zx6>_Qy$|JZsqfO=aO(rJRyJ4Ap1!@0+m{|G;eAID^UU;bG_t77K2fOgFkCpEj}>1I zcJky7LU1!BOaSeZrp1j6TlDPwZkoRjh-+@^X@B(v>6`v2Kx;r_=ayjW-(8gBMs;nh zP1ReS^IBL{(0cdU5-Pvcvu$AsPKG%HklC9D8(>9j0~cLO8~uXQ${{+2kNBL`TbsQH zer7ep(HJ__wvMLQ>$W_e&;~Ip|LkW#ieJDHLg~bbhSADw#%5R352Nf)L~D0{YN}c~ z@J~BQHzgvwM4aB{?JUa(bj)-09g~Kw>UR3lzGi!$rPN+DfNT5v0M%Uxqyh-E@{)9FNuiEuCu$UuDD8Cv%Or+PJ4RHJ2W>U%8kPjfysWLto*I5 zRUwqT+C{$ge54%4KkM$PWsAlxuSPn)s;ZHsRdF%xO8txG3U@ji&EB!XgR}R_`%0!k zhnV>xc!L<}}p@P)SvQ4UJDHhmw9Mn!9W| zucfRVDTs_o>CmHBmz+ag?oT<$CB@RNSa>9|`Ee1PvG~xBLzmueuEneII-VAENGqvs-@-_lPxa<55K#Gore+@{b-Rt z3_d$llK;rInBIk|B@7|4F{lDS-)=ejylxm1oKr#~wEu>Tce+B(po~RwfWKn4WF>Z= z_Ks+2qEtmNVm)>FN2byNioQR>fFvKm>X5K90x;-QIWzY$%LD}t{#;A~?==LY?N5vE zWN)4B>IPQtK?=6T;&AQoCM-N|mI#UcDfHK{z6C4tJVQ@%8=Ob;6L<6Ff4`qJcxHrg zKer@?Z}7DDHDyawT<8N`EzwzH9m>OA6xezgY}dFBT1$=R%Fl{RY-0xRxICKa?e=34 zizu_?p_&1I2;}LlTCL8A77Rk3GnAALChKg^3-c+ooZcyVgj%hKz6Ak00j5kjw`YMD ze@tRekHw6cf?o&c z71z^M?*iAJmhW^8Cf|qng`qW#iUx0^o2$su`Ms84Iq&EYUfI2FFdN%}ft?gOQ!r+c(`Jn)sG456JLBnBISANz3(h(Y9d? ziHpytp;qKRR0{ejkH$`iyeCuZkiCA#av%v(*iC&HG8ZXpxw_~TFY`Ke5c!mcg^in| z0Qy?0m3M=dt(dp9eP>!G0d(IicyT4ZW4ISDx-(*nnQf#YIZ6s~V9_ll~5YA7MlCqK(6CMyj- zg&CQ-54&~TkPC4VFW4(7^*vy~4^yO!@2oPJ%nfPwVH}45*XQ%f(bhRy6bev|T-G-D zuRv>@+WE2bdl6VJuqjXUwLYVsW{%&w=)vjztqN0(4Gqm96Z5sGxvlr!zSRJHGEkmQ ztRRkKqz4LPJ{EVZno@GhG|VKy&a;>PuGg^LpTGLk%OQ<5WpGkqrCx|0!(`D5^@yLv zsmeOE34(`p2EE8{1~gGmkYDZ==9>SF@fbozRet)Uy=1_4xLJ0x!Aq+Or%XmPN!OMg z80}QL_J!0H{HLS*SI!0^%%N-DM#mCKY=4tXWrhyz02C&#{UNotU0SrQz)<251^4Om z7!7s$xRqpZ}!P{+OI8K6_fY%E-RVE@o=TUJ#HY70z%L3vR-O7e35wUA(Bd(viUq+MH(ilyUSFEFpVmGSx*BTXJ(E#0cmT zJK2$E;@%XShM6TZ%B*A#u}U&H zUUkLq3x~uSoFT?^#pEJYCxIx7>OYyMY1uqHU7z6Evlx^!=NVT0&tkX<2Hq`B79Ggr-wRgG2ti6E50*UMt_^z1bfhj9S3tSBF}1=W;#w@keFJ zOKYt9uK&LaO}(Uw;hF2r$6x@Ssdsm%mwE34U+;qe9IP!$qP5Q7<+o3j`8n4q z;QN`AYnXyGN)sn4Xq6Pb8>$?co!CBHN_xhco1rhk%oO45h$hGwbcQL4&}tZX&m;%- zbvU5`=FTI#^3+B@|Ac9ySMv8l>kFPUABk~D;%ll}(j(#9Y8tO!U4r%G>ZtL;^dzgb zagt>l%3vm+Z|_4OC#@^0rV}?4T>GR}=r7Nr!fltYccWe3QzSP@D`Qt7vu4iFWQls{ zqKiuF?=?F3<+55)vjI}`7t`WMoQ`S!(~sXA^u}Q&hq-S+%@58Sp>D-#NbFnyOjeiap_WfMIW0hKgbJeS~ePCTkSCnU)ScD1EKAn&w+ zsxHtWuh=_{gYkUUK{{OB6SXkJOpsh${mnUtdW*PZuNf#KzZjbmfa;Bf!cIUCtLRyvO)bl)CL< zQZam*8cDIechIU)>y#2RkDxs;(UN=9{yiOT4;5lf<|76Nu4{{aji>0=*ru*?Ce~wS z=D6o*lMw;wZ^lIS6N2(m?LED9Yqo%guDMO(e8pZz3P0=;PGqSZERmE+$`ba>awEjs zU7jd7N#OL6FYf<)V~5-nM_i$S#MelC4@|$;wep|ynEnno1~Z{$bePqfkH;Dd(d?gL z58xguf|WI_weF1sVK-Doqw9AK1%-y%`?H3M@YWB#t(7a2_k=>cx?d4(8QBVlA_b!T z<_|Cd-e*+x4nT>bM4(otpqIbX?GFG<@UAd(M&Q>Ys4T-G{~xHXY8bR|^7|2+Olr*6 ztKej|xKFutSorb&B{JbsyDG7{Pc1IbX6Fph^K^8&W zYr>XxcA&2n>g%sOQWX{+o&#Re->yk})|Z%V#CN0qV`~9colo@lLgpiN6H)(-1Qd41x&{H^_7EO+pOBdEYg1xGy zIluUX#`Jyv4x3zB{B{x&%Lpv&*E%M>qZQ{G32wAnk;8l9ZEIYYQ!ANsNF^M?Tsj}=gt=w+@JPJGhUeDhvL zX&a?pZr|@_nvBxD;sWZX3#H>e`5C;rXXY0TR)usGc-`9i>Zq0 zpIHXfBUH*nq?+FYD8 zQ5%jl|J?e@(H|AHKjpMyp65JoF)c0*cGMujgO#;#`@w$zn!RrWCo-2g7RoKHIY9~_ zw%*N#JP^FacQfTmP_$t?$f=l-)Xo6D)U&1OS~cp>9AH%gk3x);95C0=_)n+wg@_sVE zx`WW65}MfUi(tB<0BOjgRgNngyWktT(J-*Q2}-;Rb49YdMv=f@Vo1X>eW@9S9)ijI z*wU#q4keOmmxL;mUnILmvulX5EPOkC6A$s%b7}n@q8zlIY{(3iC>F+#e$`r$yo4{k zb7+KA^nq^FBKfDFB&kn{KI|W8V`Lv)N#P%52?Lj6K!QGQ!5Zo^i;j};c9Ej2Vmg{d zyy*=u=P3)fK;~Ds_L@zgN}7=Xg(ca(y{Nyg}F_ ztllu@(B3G@9#`YS?qfYWXeHc}D~rY!A$AQQxn+5*Bi?|0kf(f#VBX!56dBtk)L-WK zFlB-gwFG9XKKxLiU1D!|9#N}*L`l@$N?toFlJv|K5AjGNX4Hjpq_c%yTvCUshxDk zNsd*!DKe!0fI(VKt5Vy5dU~o&B7Jmd(5M1z#`i12mo#@qxyIjUtPTx!D!4LsvJO2J zDdr8|a1)Kwi#Jl@v`N>vT=stYVy^ZA*0TzucQu=BS8iuw=Ey6&58YFnp5@`ts~c2Z z$g645EyPl)j>v1BY*r)|YWJX7X{oKP_{FCbir}>DCaal z54*k|{y=dM71?+&^xlvUzutmH{(G93sTAI4S~lE-^x`7ZQku|%7X9jxyapLM3%uHZ z;m$5rak=}`|9M5)L(|5|^a?g!M%aMuorC0rv69SQZa&K~W7l0gO#ebTk-OcviUA)s ziS}riKKU}u>``1*JofHs62gZ3xmWU)SO_qvu0)zOPar)C8WkC(Tv$81!hJb?31sQv z3qi#%3x!{DQbW$9^zxo!=?_xXC(LoS>|R z$)z4v`SThHIFJ2}Bc^=hv(~As==%PmiLZ|$Lwb{hNYl-wbB z5>;EhRp`9_?IOeB~f zeMXL|m1*f~b|E9n^Z>=p24HN<>#$btS!YI+%W!Wmxr6;JzrBTgD7Ug{0U~-M? zrW~U z?Fm`;vYswM`19Ch@7~bAR2?k5^Y?)-GSADTC#frmjV%qa&Q6JjRb(hA0931lR33)1 z52~0dc>o7vXJ-jXS#{!T%bnz}?%HQpxPR`~=3fGcs&^L;S!3HsD3I;h%~}&1@p&Pv4m}>eYDP zS!g7JsXQ-0p+8iM8C4Z*vp8pfG4MARA^oYBprl-ND#YPmsE#Ku!lk(W4PVLov<;QdA_8zktE0RQCI8h^At=|b93n_ z{HSqN#5p2 zvR%&mq}SDtdqWmBNj%~e#CR?+G%R{K9OFF@s-e=vhNN&EI?cK7vE_PrEzXz*A1a1_ zEInJh6nzwS`1LWNRe!MwUuJlbV_TpU8%>g@AmI-GBT9M0QEfTk7x4?o)ujiZaTX*g z=v0rdau4}N_(r?fI0MN83KOSO>mAZ66s4`i0})ciRxu%5rY*T)CqSc%T&Yuw&xmF? zFgB#T!S=lwfr@H18`|-H3nsNm-|X_xD0dflcdjX1Dh)lj%?uQQ+6F>r4wG2wbhe4T zTUoAE+%X;E?ZZ7fPu_F|k<*dx|FRc%5Bd7#sxC0Y_IG1)JHQ-Er1=R7cO=^OCL@P6n3ch!peNnLYs+?0s)cf*H2psz6PF9v+8pSv$3{N`5M3Z zzVvD{O+83n-Wzt~*KY|8k_Yls&hE(#r3JR0Us*Nv_;vSEz>Mm>9RiXrLC~F?p6-)@xE zhxFv!K+zkf0lFCq1`i`v?G5L(pOM!e*oc&ljA3|Ey{dx0=O0QAm$-j4?707UHt{1+ z1SQpzbyO)PC+)hN#1TGdEM&SW-%9%_I8Zw{xD6CArtd*-GHX2$)lw45k7n zZW$1w@IxkEX(gGaSED(Tz|ZHN%)}MqU+`7b3Bi@V9TjO z(Dk>A?iyUel-r!RKd9+C%d}A?*39}TJisDEIc3AhE55)wHfDyf1uhpY&y>*t!=<)Ck#UV>JUK(2(5DYZTRQOJPCEA0H zpEQNgHU9yPiTe%~5=tySz4PN<=o@uE0}DLXXscZ%PDV5sXya`rh!}#%_sq8lc~~&IK#HZoff1 zvMqKx9E0zidva#1aKIFU(nUXBns@SNa4V88}0xDC#5uH8_J$z3OT%i`Z9qHNE_Lwq($v>)hBEyZ^7yRLyYs3VlayLrixct_Vv z2aqo|;Z10+@VQMg3Bm%Y{AoCvqP-z~@&m_gOzC%^`+2%Qf?dJCl=S~YR3H~%2FozW zN6r=xy~V;(t54iqzWTvPK(is5il9b8(<;tXh8|W|9q8&sjh5yn$!0K*=J(iXcdIul zdH(X4{~lLK_Zgq)W#|dFk7^t$Oa7u$u7zeHBdlXNGL*$2>VO$)8`K?9Rq5FTm+2c# z`VwWKUXD@)+_!{r(Z#P?5;@VCXF-~y2UP?h4Z>j~Rc>Myn8OzazqN)OgB$UJHNw=O zCMtaYAF|&1FUmd&*98PAX%LVuDJgwv7`mmq8-$^|ySqVB>F)0CkZy)Xa>yZOfQ>uO z{+x6Eh3A)Neb;^6*Fu<4s;y|p{V}Rd7{ZBca#QTv(OY!ruGn0o9}-r*#2CcDwaO#% zoTE%?gzm;+xMq6ZB3$J;5y%J1VnbLu&ktBtQ$%YH#MC*Ubbn{7leDn*YO{Px@QEI7 zP9+khG(YJ9I&u*Jv z3wq!X1i4xZD(VKpMG6NZEXqeen)zOA>74|ti?u!p1 zw4ZH@vu&3YH8)3$>(|Hmq9n=G&xl~!VW=hMaqjgs!=NCxx9rQ0A@>RU{BpdZ$}R(b z_U1($r)2ypH^x31ah0g`&yKLzl1&5g7$HPtk1_82&QC%pcEW9z$DL57_n|8SH&g4C z3JriVA@nva@6nnIS69p4R(a+!w(gP(PP2Q1MO5LPaS2eiK4P>dqa-g+2%3ygx!w8f z|DutW5aK}y5Uz5!2#>dCwr^s60_F(WLQ4ugW9&fJP!NjOs5pK1$>B8pkx+rp+<3=1R{alihC}{^L&mXoe4_b91DUGGs}H zvN57K<4;#Pfd8!GugwJuk`1`)P;{kyT-7uM<_C(C(|^rL;Ur)wjDa;Na<_OdO$Wx~ ziQ1)VFz50R>UaPOur`aS2Vl0b8hwZ9VX;F)fL{dSA9k^YI(VkEwe$7NGn+Uq0$ncdVYe%R&~FLKL<|uIE~|*wS5oGDJ-2WjM6LT~eaOZZHY%-I0VurPy?y z)6TAr{|=H)eb08mK(rdrp!_lv zzdZqfc33yoohaJ}a0P zf_CL?bu?NN$Ey3}sk|VCqkC?6J^z;VoQ=mbn}zaI-tnQ4jAvS&H{`a0J8nGxB{=(2 z1xv(zMZR0#T0=50Uly9%(x54dEKc$Q~+_ie~|WcbH+@d4ia+4NpMHGGKN;k2uC9S*pExnORvezxRi8o73m9yu(` z*X4-?1}yejbjGbUBbY7!T1oRdzmIEU3|SO9;^T@poTDFaP_@R;$VT1cJ-YcOD?Guw z!TkC@41+&hF@Cj1(K6m>lcvF*XdZxPvG9h0{J(y?xy^5EsLsc@cVXKZCj!&-Qr{`7 zqEJ`i#?%7hYuSD5#pnI3$~d~pf2%d1Jwd)xN9jzQRe;OQmI*+46i2O!Z+H9%i258$ zsPE6zVyxD$l1=SdTnT#eoMz|XFupNaRq~~lpJdH!)MYDHy??zQ%__%$Yx9p}mHk~J zc^+!&4eR3`^z^A+I3ovWA*#izJ>Oj}S4{|Y^j!3bI+XUh?2De^Bk5k|T-2(VKnZ!e!?i+(d(z zCJcW*y|fiNX47{f`yqlO?_j+tHrm4@I}@=QpaG0MaTB-sI|$1Hvq}WecR8++_=tXl zE7$&};IqimWbpxmM@oCY8N^a{12}E9MaZ4LIJ?q0NrzAPHZ5yTYpO&&o@tw7yX1O8 zy`*l9??*pdkkswX$=8c*WG$rrcwUhoY^==v?!%|kUJX>tLN!CeBZ{Cd=knebJ6$kC zE#T+UCH*bC=3dt7mfuC*(O$(JDu=e~1DBO^h?eNiFnPmW>(mLaGU9FLqb(%gJi48! zSJ1vU56ughZE1^TAEA!{ckWD@@;xS0vI<$|uYuViL*@0DoA0BBl{aSx%6zZxxTnG1 zr^iSX6=8WapNKD`6~5u2XL;7{vi=B=Nll>09hRdmHb-ksT3Ig9<_{?DR!cu;n-oKRh|1=bh-#0Y7G`sE4rZS zJ8GaUq%~c_l3B=b5(Mrhy!FaLve^&r<(P>XG!hxiC>#Y0h3BBV_ETj+2$8Ov@{Q(Q z7by}sguZU;51q;<3OHNyhAr|#2PF37P8UvJ%kqCF)@@$Y5GgTnN;7oySPNS&m$se} zAti17{04o#`SbK8>QcH2;14!!DQixI1k@>ywlmn;Acta?Nl)HkX4hIB?Yn=!XrHEy zSi$xbNg{NV3S?4&KVXnyK7YbDY^+f*8kr|G|&AAc6O0*--ZCZ~nsQ9z*G9!#N|G(C>IOgpS9IwU0vh zStHFD+HyW;_m^}WaXhQ7%5UHvrh%f`evvZi^9u)edi!rohNv(%?;_D-iAA(d`r(*e zOVgpdXFhS>!tW-ZrQJ|e)b12{PKu`~#C{Z%w%jN`SEzz`mFKuw@!$7X#h^+|&6VPE&C$@0nvn2@{4s&y~W?jQu$UM1p)s__Yp}%`XL{x8C_s3 z!O*N4#WTNvb^0~D^Sm1=j`pUlkViOvwVYby2;NmRDI!@U?WRF!k4vzRWVNe*yFmS}gS>hzse|#F0v)wB<` zutS6JReGi2fh^4G#X~c+j?^StW}$F{vuH;t^dZ@@YCYY zhjsoap7<|aiy2c)Tut4cpe?Ec6^Tu7uvmu;E-vpPP=Y=e+EB1iev_&JiDHk@%$L6` zBEte3k}*Bmb|?>N4j=X9kt^?;EY~r`TfF{a`jFhj_Ns`o&W6GW?XQ`szI$lXX0DMR z`M`_D>*ZPf_6krrsZ-0PmlAA7$6Bq-y$U|=9mw6bZc-Y1GUC>Uctnd2U`!|#^ zyzUv?%~i4F$wPM5_hdvy)ZpL4lxu97_b&QRj``rX=Fx9t+FGDCWuWg~89zR1u7A)< zxl#Yqrh3AS(G&(C@~&ichM{^It*7sS=sw7=;+muB$ohXaJpP~jxbhEzqD+7JU>c?T z<-T_xoD;lJITQXKsX=1E`^YB6q?WZh>3zo~o?D%d0*05h+c$@Q`x(AT!Wt zfO1EOp4Ul-UB$Q5sNj@wNFX;4|D5A}df>Rzkzom;Tr4-u1+`>bV%jHu#VvFZia6majJfFXFZTx% zqv(-Ej7obWgj`7Rf;mc}^n1%W3cb`QzwrFlqCK%e09}CfExQ$K=^WhrQOcMcnpWXe z;NHO-1++{cBvH|4a3hGF8z4HJ*SYDy?TmRLhrma9xGiRW22xP^nXG-4sn*qn3&DbE zN0$WLDyzOj^M;^=No$K*m8bBkIddP@t8rO@kw(k`}9>x(yUt za0V}JE3Dg70e$9=U$&GX_o66zZ;JTS{QH7mW%_VL;jZ~Be-FNzCEd@$gG?^n02@=B zv4}PFAx$XbACN1M^Yd)Gm9)j^3QVCYjR8+9Yty@G@zFp9Q^s9l#x9kpM{tbK7XD_j z-vU!xj8T(F3|A0hYf8*WP>a#Xt$Cq+ZIp=h*g4#=lnU$aI0O+k68X@a6jjUyIM;p&9vk? zThdw4^2eZZFu4Bq-4ZO+0b8>uHc3K-9QU$mS1ZMe8uN%$l4R!6GwCTn?Jnc|^ve%* zA7$*MmAo!YC?m-uxx)olXMGiqpX6s?c{=T8s(DmdDe=Ec7kFCin7L{Xr$--LMXGg^ zq!1)y?lUQ3*}ldMG7SBKitaATs;z5qyuz~bebP*bhuCoCV5U{rk27Z$Q}^0Bb6#xf zctpJ^jci*08JCdDd5}<3(s7a$gbwxV82<@aO_}w>Pc2+kC&MqV?Rkn3d5z{r(d&k* zp6Y7^Dwl6AAGLE{+}m#1sHTy<2DpQ4^lrWmn;*7~ab!=SIEy-o*B7jP77wVyjcqq! zsx38^)j2d@Bd7UTwC}D~yL~nP7Z36YJ)&q(3{7g#%cN3Q1u-I* z=mb()q^v;86zDRW44^lZ`p$$IA{4RbGh=x825Ny(x%!X`P>yvT&@Mk9VfdWNtK3#0 zHT7Hxkxs8BBo8(^Jl>_5-uXEBAy8}`ty(73WkU5zE}?^;u?7_gMp%1#4%=!bHE9{| znaL$T;GSNV;Vbt2Jfx#Qi0{6-l~^RRhcr#_QMB34Ot(OKx^?Ji_NXGSBx+D`ehdhR zoyTe(7{i!eoP6oKtxXLOhFwaJBp%94-s7rPu^OYoE> zm~US6FaPcY4Lafcdws&*c>sG;R7-;IV?9iHpZ5q)s`_kpTXw62J*Gdee|X4>C63fn z|JtOa%U|~Bm!b_x42$^1!=g?&O#{_0lJzySp2I>%&OBEsmA^=PS(z8Xmw3Evh2m9* zkpoI`i$AfAad|JU6ILF^xaV4!s zcOCPF{E(L#ZF1Cq1U8ewWF2hWeLAOKv8@g3`$*{PtdO|D7IA$LPJgZ*^;^wi$d3<@ zecP_f4ESAc4ckawF^H4vblR3`kw1O1Cxd`=ipCvHo#Yt&tDr|7up}SFilT4W@bKwby$^^<=&P3 z;u9UgsKqwqV5fzE$-7cM+#q+l!yVIyt*M!#F2T#s$oP9Dx>q-u}Al-UjuusytX$`F- zYDrP*O2z^D3a7f8G#y$$Tz<02C!iyxgPtoa`aDWxwog!{^PHN<|Z)NRwKj8@w^`*I| zyJ&u=e4EiNS9x(Cx%80e?~TkXOnoOK_Ly zhlpDWsdf2#?7Oy~)->%gSG@MDtinGMII4GJDA!R{a0!z+z3UGh#WA z_x>581cqZ<2$m9Pa6bo2L(l+?l}lWf>oC8Y#zc44LMh?jZ);T~mFCBQhdprI`cxGt=E`%M4tt5=LBk#;z3AeMeroskC~SPB+U8@LRmk z-Q{P<%`!jWL~t5uYa7{4@|q_gRJ4B();5JNYP4(M+@?=2wWsR(sdGD1u(n~n6aShq z!qX&k?ZhZ@vq+Ry*~+sGTnH{T3LPx6G-A7AvU*o!Wu`)6KQ2hM?I2=3-UlEN!}#)Yrk*@aIbKa`2?h2m}>XvGlDmcqREaN9FfaUwYS(5$?3&fVK^=%b)7Nbwdn#mPUjHxxRAeM+~q zOdM`#1xg#3&CIgiRtBwAv!AT1P~N_rLQ1nyR6ZZ@&xl9c0V-Aw?@G>;Jc*GMq*LSX z1JJ3&#wngp#8mNsEY(Cmq(kH(zOR3*W&V904b9+mU*PxQ+k9L>k-7Xg*&a#Yc`!Fv znU*W6FqZ=+F%q==;vp)o+P)C>NDi2RcMc$+%w`%tY`7GR6?uueNguai57m4&(mQfz z9G$h(+v?I!)_te=3VYa$;wc01tDV`n^wjq!9rQS|Py73(wk|GhJ zS&J(uK9#opK1Z=3ZqWpa<87QhNHES|wyP!%SSUM z;OyOGI(lL-Ew5uv%5EL;_(;FW34ZA(iz#uWA{zIfc?;WSV9nT%a>-;uB z26Vkn7X63G{UWbgd%|wH$u_xPyj=(xno3PTt!0BMz2Z0D3zwcb` zukRB2N+l`*ps&&&2HKigXsFUOnE(tfl-Ed?Gg zT$#b6={?>b(dy=B!A^vy z#dJ|X@AGMWu=x7?jE#AoEwugrK;{3&gzYh4V97^g&Y470M&l7GLLViA9W}J^(!5fG z1wKa`T5x*#tpXGR@}EnN3YOm@Iq1|3R5bO^NayTZwV>JfZxHaQ^~& zfh>M%+BzO-DV!wvV!x>Qm$|$X0T$Xg|5=QpxCZvc+)?Us2lXg4y97VK^zpHdBo_mR z2|-6ELUqcDr+B^(mQXBEwysF$uQxv{6t{M&icCBONx)}o^E3TZ>Dgb`jR7)R4i zwjQ1Rzw_OqCh)t*vt>dbbB*)oB~~bZlco_{0*vh>S{N<58`W~H}P;~5dxcmt&5)iO|M@RKd7+5C&(RM>G~*g zEH~IObtV=CoJk8by_$)+Vd;!kwfHT+*gW6p#pZp|t&>QhVRx zP7arQ0|_(O7>RwAXQ&=a8&#tC>fcc1smJ3idRK$npE!?ajpQ*wNKSc8Yoy5;N(>EL zk0FP}k8xjGi3EPmWTIwYOaqFRW6P0|6{$x_!ZKd2Y-#5<^={y=QV#<7hO zL^UUjPcJ@lN6nK$tUSaY`5!yLS;6s)5IjR}@17o49F7hL4WV?l%oaf(Hnt!|7?!`G z{>oR_5Fd;1A=|+7gEJ;aSSM;y;e)!!RaD%2Li>v{=o+~5qUv!yYT7vOK&;*0@jsLF zn$h3Vh700`w?A!@Z!*#a#wu0Hz1>hmb-D*~_O0;Our|BgM+N4CU5e*)o*9uzs~mpy?u}fJw75HfKnV^Zdgwq#$SGD z{uo}%O{cJu4f?r!p|1(=IQo{ftC%s8p-jHrQI?KGNkH2fByIn|s*w1vHHV{eP|4s9 zDR&Ha;4#|x%$YuXwp`<^9ASy}d59Y3jnpe{ny@7p@BZwVe*N{qaZqdkIX~xnC8Vx}O;WtN+Ywkj3sh~#KOO$9f3ud)HkrIcY-OnKiq|D@*pg@6 z1iNolN=Ml6P}VI}D3XGBZ^TrY(*w4{Vc-9T_m?Xm=Cb*mZ4GKjx71496cck}wKQD# z?tZPSq6S>09^F*7V3zmWn`RneFDev@?Vry=ZIs`98MtE4Ry*(L!r;I>klS@fWVvZ~tAj@(xvZ*N+rb1?E;XspKl_u_@XbjDadg zWIz2UGKDg=i(Hd80ey%BwRc*^3KRWn_n=o;jN!+W6keO`R=5Ty(rIVRtb)Uyl+glLlcYqUqPfJx;q3XbR3XLH5B6c?13{ zi#%JDz|+BP4b^Y&@q0$+p(NL(mQ9`}J<7)!`N?V1Eb}V2)@(;8loBL0QL0&jpj>Iv zy>^%5S}qXoTEMgXsI958i{J* z#GwCbjE4`fNfgJHB99PZREOJQ-e;ZuQ3JmwYeVEv>5pTi#(oZos$vTG_{F>GS8%di zm6(ycWBCm2Luu=eRN+Up`bbk|kzuPX+PFQ8p3VXt+=pyss>vT5J8PJa8xgWbo1fa= z;t6X4wR4A+v;*PpH^#66170fKX@l*Zr~@ET1Ie+5&rvVXdYZ;lI#L~O7tmC?Q;U|O zHV)64utK{lYgPPqnw-z?;zFbdJW&@fj}){S*fN4EULE_{Q3!#rFPZitLXA$974f4X z?7WRrVYuf_TSLM4A3QP~y8oCKA`g+_c^yRS7nKD{JyLD2`iYXTX0Ke2F$uv=)KlS6 z^(W|lBVIjuoWF4owYDeO?(aK9rC`#PfTOMXH^Sl*`if?>2Vwm$F4c0kM2k{`6`&-b zLlN$(gRlG#=wX5kjTYHPM~rMKzT9S}^=sqVI_58;MOp7J63*(=21mZaqc8BIKJi8l z_xZ@ydC32*LZc$^lq5s%7qF2=igF0p(QpFMcB-kIo}UWl(JK)w;=Q&$N`%!}zO}P$ z0{DNSly3S`l%ngRzrG>02|zWkcckZXz5Ah716&Lt=mbjvQ7>8X{6@cOJ$CZUAl^)p8>XOXBi<2ix6JmxXy_y zikh%|FF)M6mh1V&Z$TaO${3`xffU<-k>S4qb&OxeVQ@jZ$O?+5QotOufkmrGPkR&W z5PRziVaKt4{#`;!w9d=DfqGW@*%a5H@znhS#Ho6iZVCb)%K)vpo5DsxQ~uy~AO*?R z<4}ivbp6a9752o&Mn9#xFGHEB*_O=CHHx>KhfZRoKbD$?<300_406Cn!P>9Z^3lF@ zLv(ZuuB{Z-X1hXYzf22gcX{PUw=8`VThl_6{yTP$;-Y1J2wN(8P8KdUt2&^da5R27 zzuEdNalOHb>R8TYFKAgp-Auhn0kNmyFX=pOR-qG7YrfZwt_mCus#~h;tC*9FwKuXi zLbhhtl^|GrDEzzIZDCPWGA@|>!>+;oLX8%S%w7A>0?6i4VoTTXX{$AC&q z@hnx0{rM`EGxJlX^ICW&*C1zFd!j12pTE9$oJaX7+a@YA1OtHHq=1CAFw+#J{$145 z;OZC>ep?Z=+?9M5%<)BD)Zui}UINgyhkVtQlQpwQ&TJppp@In89I&etEu0EEC!+B| zD+B@&{YM?ek|t4xQbxG29HHeDYz(hWNx8t;_U3E%ZZ88XgN$@YkwwnkScKxz=ToI` z^cph+O?h+wM00C4@ZIG^KftEQ?}hSoUk*>U=X4df>z|9mp4aFjoi24(h;w`IcivrzoN72x*lhc~T;R-mDh}OGfP4DrDbBlW zgnjWvq<>@P*BlHPo(fof|rWs0S$?lZ>r&722jl zD|`2uJMp2JGpDJfNj~UjB=E^bsOD<=$T9GPHQvDzXC%~g2r0n)nEN^V7zJ-gr21bZ zw&k_QH<+D8OFb$(2-tbonG>xRZ5DpXNZ~S=E~QRI8S3k1%C;_Oac2HeJg2$ z)TYZi3OH>edt98&k?Y}a8LbF^UN42_r}lc7b|;z!7)`lZvY}wIiZiI8@{4tdQKw>2#T@p zg8AG(+AmPHqM}#05*^{^i3XpbR~C1IcBQ132p?c3eUN&RKTTpOA&3W`xXX;B5E|`( zyel9@A=Herf-fB_A#S2ojj?&B6ft!sXg$R%8cg5fP)_L}CXlMa2 zBi$jK;erg3_hZdM{B|k?vJnlN;deiv`#;Lc$3dUcHDQ#p6_FJ9lmKqgQefJQfhrk|P-Gnu) zm)qvH!^gfbF!Oc64Bm45YL6n0FF|yMA_=0uiRMu_)jxifS>yVPkxE1cBtg^HUoZCe zi1T^;oq^`9SDP22Ln}uRKf(o$A^Ga#qb@yxjJH=Un{|U`UgIxz0&&OI@aF{Vz6}x; z?9TZ^;&uIgMGWo5qevP-5>K>yV0Z7IQvLx^BkTz1Xt@XSk~45|0b7Kik&nLaiz)7v zyIDw0!qS0a?)?Ro#P$}QsD^KW!%16gspv|qbv09~x`RCE|4SqPFEsJ5 z47z|hN(BO)0#9g@ETE`g+K2{Q6jRBVzE_wDDf^j;^oxm!|V7b^@)_lEI zu%*;Uo~}|@?hozuB4)7c2$dnxEU!?x#B|dXL|KQpTe+;>hGfi-<@lT5GE4eYjq1L`S6__sOX;0kRATYMC0ki0HQO(XBV1l=$z95oG}1MGJpXlC5+Z ztt|CBXuyXB&9X)~kH*kKG<0d_Jf$J(o` zn<#*<2i}I|AyC+zI}?@2pQf%_5fsX5JH*5k$=|Vw@?FBpS=5BZPvgti-s@$i-pLX$ z)qZN*1j9q%=m)#sO47Xu_vQjhfZ9Cx`v8)qxO0RQ*pulz5ag=>r;^$ZF|#J>mD;r1uXc)Lo?o|rV=}GH+MdjA-*QMtHPra z)vqku^|$BHLUF4RqM*KAo?Mmz{{ud$SADt4Xh^Fimp8rqC=>k(y}icvZb80oB#vxJ zSM%;wk0dYT)x_V#^#0%_k#6(b!74}DXE1e}L@H&Z@HmEUJg9Mju#EbJ5y(fKG8pMx z75C2bq3;8{pDN)h{mh0A9;k3B^TGCF1kfmgGRrjF^!K`-K<*LOjbkYGjK$b0IyAie-6Q^ob)I(_gfiBE~m^cG#DIfzM3&zAu& zOVf19BRhup#s=S&Zyt@4FB30{!u>7TIN}NZ%3R8PY;C>}?de|+(dnXH)vl(0*0S3(Yw%H(*|8CX9Ig&u zLS&e)ZyXD)t6{iQQfi=;U>@cY8hT!}&;8M96RkpN%GS2CAR&?6sL0^9!dM0WsFVbQ z*g!Ek3C6r<{5>Mz&)#ls_UPTr15*K8xqLsh@Tm}FcKcs5R3m?A#e|Tlj5dIp;f{$$f64F zVwMoLJ!@qZx`3?dqF3Ugrx)01Y z)?KK;i2uj6DGUEA)|{TJTg2;_=G^n(RzI6~vA}<{U&kNY5qk4V8vx>?P;ZLd9>PTC ztA6#Xv4=I3`r1oXm5mwueYwk3>^2L7mlBmu{u`QkxlIZxlwzlA{?GKyC;A~uD^Vsw zb@)B~zB$DHDY#qzl8;2}N7rd|)qnxYYm6De38ZsElj5c6k}kFvpRIx%&Y+EOdayc@ z?jk&kU*$4x_OE8IKlCkC(6m<$|7~$;XG>peFa128TIupSim%BYq6Vis;ipXXKSpiu zS*ODC28g8cB}~*J?%qbq(iK(iFiX-7`GX;YhpU}F2~oFk*Dgrm)v-#0>#C~=A3ES> zD)_{+_maU!rBkXilhjbYB!X=2c>Ca$yBUoMbX!5jH^XPAL{LkkPKEJuxc4o8uuXo5 zbN#64!ce4mV|lP)kl`I)52_5t)pVw)O_+UE0M^GbP)WaBOdqMiJTi%G5>Ta9kw6RQ zZwqE?^<{p%0*Lvf)tR57)iIt)QavSZ;k~K4KzXl$&3kV?%F_Z5>A2w=zYBh30&Vx} zM>#$`T;K!g-pQJadq5u9&1RhhpB=k`a~AmU(W}ZQKN}u_n)K=&_u1^@q2IFWmgg9& zIwJE$rps1N9{;cK{^j=O6vdHq>vB)y<1ty0uzLyfkEnG;%vT4*A}%=5-% zHFd~$k3DjL44sxS)tvz?_*~Ti)o`Ay@22^E#!&|g{aU{($Zbo(HHUB1X2H8F!O>Dv ziqVm*6E7?#f{$lYW->Of%Uq?*#tjF%V=2oVM@R`pmh+=uRApo@{j2PlmLBTqUy>cH zLUD+Qg@m*Zh_fSo%2k{1%}PK}EZVmWEImA#3ygtDBcBbrp5z;oH7Nc^gi&w1oSWnh zi2H3_)0D=ypAtFO%bd7^g=ICX!*)^P;kOw7ap{{#HDS0)1(&8?wASdIZXWjD{bR}R z(DYLUcwG}IqM&=Gb~Pw>GAer+^xDe3Y=6GPsg`Ep;b=;#CTGAHKK$M zrO$()z5S@)==z&Ck(?j>NLcH6FI%nD$~On}7}LE)A5-p`UOgi6rnTY(QVWyLTbV79 zK%TgON8Ry5oIVw`XlbCphgdX@q{~)(BK+wj$6dY%An|K$RhL1F>$zNeH;h-JMV$L{ zZd2=$&x(xZMUm>w+1bqGnO;&;8rp@UC0Oe;#E$x!62f$fs{H<@&)N3>xBt-HW)#yp z*g&mEEI<%aH%74gh3gcZhjWW)Jc?6Zis%ufyB#6C)ff0`$`sE~U&cCTlDIqe(XqdU zDBG=u>d6rXuS7Z@jEA_%ah~f$N>3-eU+K(Bhs3DGeiPUFe_Q|verns@0wVcvQU^7I z8ReoP7`tb04C|Ys`Y=`cpGNWY4A)W(h!4+9pURZE{l4s@3Q z-X94)h&eDlihKGS9a*_t!Cru~*}CZg3#E}wPr% zh<>JV497TLH9Dv+eZKVF^s_!aTqK-jPsbFNN~;%A$%3<^Eni*l$Os3Y0XK~e4?n%t;H}e0(h%TA+2M%dfZUu74b_&(1ZfJ-8e8qD z(Vm_qPe&%8Ei@l0=M?mIn+GtN;rJ&b*0EB1(jddzPtl)z!lEm2>N}jz4S1%OnNqs%2R*dFh{e&dk`( zOm^!SRf=oaM5(=>ys@FndyqAHTRf;HXw|PvX6sou4`%i0KPp(e4 zzMCeYfU(2vG$ssU!?DHLTby;cso%b%zhz4LkWZN^hyutGel5G@oqX8G%mg^?@C=5N4NX{u?5U2(`9@=JEjtcsDs{ZR+=>>k>5mvDQ?tebphd{+J=xV%)HMe+DKH5pDp|~Dhb8uBZyiG(s4fEpRy>0{JHzHm%%YnNEkjAFY#B9n33Xa31NRJ8 zT5ySU-cc6{(jfl%*BZr zSh9;_JttV_+AA$8fv$3Ol7OnP^*N_Mt#q00&v)zrGLgTLX=U0e0g)Wj^oPJp^h)UB zDlG{fQpL5W=>)w~ZONU#32t>1kfAMRbPJdZxX)4c7bP79jJza`cRfkD9`Ne>6Z&ud zq+NPX+#rFkhmL!$IQUWU*+4vdLJ?($R+eK|+xhQXZ6JaT8A?1QEBQYa(&*-A0Qqj9FH7dw4aGTlar) z9jesN8)y6B2k}Ds97^zCcfV8m@4f@C6CF(#17PjxPQjHG=`~e)C~Pdeog07!3hHu~ zaZGjt!HTcl$gS>v4?%?IisdL|5)_h7EpJkX!_!wuqU;gKmGwl0^HFgpX{8w#q%Nhn~ zpN{b<%&qD-jy&53;{rpVskY!k*Gi$W47YjviShdeDC3IFvXnb)v{zb z3V+8<{)|nQVnBbOdY-vDp(TnVB2y@QGrvMZ(kY0~OQ$>nJzLD-(>95OAW-{d{y)6Q1cGvieIa|P$cN?uYH zz_zbqJM!i^n$2Oma49Av_+H8G=EJAW_#oC>0PyOcuwzBwRwmz< z$m4j!9M#Wkb2AL3%l?U{uJLw=5Yg}jSCL(+LK*~*$bu_S>K$fQ3goQXRFUp2eH>&H zyOHTEpSlX{r#Zv*h&LW`2+!wu>2GrND-EM;amEPNqaL@34o5C(NR{qo4sdtoGU;n% z$>!V3zG)?@h}qE%Ut$SmVb{eoO0*Z{T9fOZzU_KSsj+AhX%?kN{ilhpD&s!DFYAd{ z-wL==JLa5K^-k*0gt3}fENOC7a2i%W4bRW*0`_kV`hHC@)5`8^0;hu_C(4y{s=(VHyD=1YiUzgG|j6S`pxKjub04#qxOAP&mM6vYGvZo?*!rB$lu|ojm{_|PX`+g zMyp{$d5FV1J|3u+er7sVuaMF@Z7I}mG2hb#I1EU7IMZxJvf>jbALQ9B!|Tf8}(;ndhfN z2AUnSzr#NiQ?a5@lSep5*E(1Ru?a_&v(%&;WfQt`qy87kN|2a5)6;;!Hg1=KiDb+q z(gaYcV-^;JTydv{ly_9W4&^%;AmNhEK~*+SI!SE14U)#+Mc-0xi;8CXPt>d3N{BFu z;NFR|U}GybZes7#kd<$VSGEHF2U~9$6IUBXYY(n1UfdmuySulzI|G#BR@~if@S??v zyE_ypPO%xRI82KTQgo2Rd*sVWzVmk{lkDtFp4|7d*1FbPF}tic`nK9l-%(uxHuYQ) ztg8{&*hu>+%8Hj5+#P0>4UtAz7J45;#t2_kY}0bM2to#Oqcp2bEiA3FRZb8bDvMaF z&83RVsKx#Zu@U{3iEWqO%LhCa>or6Xl={P)Lj+#{W)i3j$|^JWJjioQERBkXB@935 zcysh9s)`V*y@#mWvixVJM7NDwZ?X@`oAc!LLA0S1BSme^>BUm3v;iH1-f%AL<@)g$ z5!u-kz})EYvyzOZ|L%Fp_3dYgVlcYRL}?1O&PbYCKOYy|9WWO0n|TEPoRwAlCa*37{CLjm?G*Qh>Ozhqme76sbiM@vRI#QO{jo<>AOLUyW=M? z#~|l$)<{kprZn~-0HQ8 z-Y+!|pO-oddScHJT#`_{y)7P@ZS0B*91;E*?a_GMUa6rIXfN?hf)a(q+2Szmd1j4F5SsD#dBYi^weu8Oxzn)tH!tzhKneVgj?7=#!beLzMd(fl7RAEJs{|6v> zOc}V7!6FSYUk6*}Kyd*!n`*(R=_=}}#VDKBe}}P@#5uF(Y_1%QFa!N$s#D+2sk$xb zIDXUw-U^QQW0&M>n6^f?@U~X6pv(kJE}7;*3y(7+%gn7^n<1*z_IQ<)6jAe}DrGuF zX(y?G_QE^WHzz@y3Ngq(S60OU^#e+}}>+nwRAti#qjAQH2@)4Wi0G7oelm#H7Qt$pTMem_^b8 zWGlBWuMq2xhT)$7W3lp6zrp6|%PJ0Zo|L~KD8OL=+^YrRBcu9;1}U){!qo%ByHUiY zssm4YjdW`m9MTM1L-=FvD$wZr3m+U`Nh+7^J4K$9AZhXJb64eqM zvaJ+jz!?jyqT7~YP?uK@SnW{qdHXQZo*Qr_rWEX~JN6SvVf!_yiUzZT9dftd|9BhK z6KgyRTeGxM3beI>>ipoWF_ccQpEK>Hk<{GibT*!U*_G(fJ7EzDy<1`CsNb18rxxTX zx_!z1MzlDrk=jq_K`Te6W$w58=s=p%$?oI*nlF{t^HId)_^Hd8C`!AP3)&6pGC*19 zQfoR`W}azqq2YQO`!kF>6vWE5mhnbdo9!s}e?g=g>R! zTY}ws{*Gt1)k8>~aPP5VL2?z)I8T;Nkknj+F4t5cDz>kCZ6=fQ|bG8sE42nK+ho3sojTTY>M`^v*Wn=YF)@DF=rYiatoFm zNTnBeu#iZ6geqs%?mI)~cIZFx<}8w@b;fKPvon z513P@kEzE4TtDu5C&-ZNCs?U(MBs=U&i1NS_Ils$*K~UlD#>R0o;9vT5D_LbJ=3KZ!=<_1Pc>X|aJd_v`-STSZ$GZ15Y53u+zbuM z9q{KetQpL8dAq#4a#ynB#gt)h{)o85x&C){d}B7lAlaYn5~6 zyENg7o2Zk>?Y-0!Uj4NCS3qR!>BR`gUYi=XUXgZKsQTW9YSljKvW9?uEfPHZuBFCUTh^(f>j_d6OLiwx z;%lT)p+X$MS5SLE#v^blW(!u`IY1}9A0FiOJk~$BdW}@6^Q|SObE{$;0Udf>^YE*% z3gIO*4lBL*6=UQr)UWEyRK`?x=nz)mD90lEg)NnDlmcBHU?Jc5X+uTU*Cm$wBWT38 z9&UKu(Oms;vCvh(q&U~H|8fSm>ds)?;g$Xjsple36(6&3c(V=5`>uRH?u<_XN)J8M zNq=9K{P2%K0AXpZxZv_;f=Eo0GEKL<`kS*TBN~IWJ8mXMT;YGwhP219lSfe%Znnbz z5_ScS!Oh%pdMYC_nSXegTc!BGkP+H%cBhu?7ex{_!RTQppWoc8;me#Yi&{wPoY>6R zpY$=+cfsv0ci2QS1!Te>hH#nc=yzvK(g~ZH%^rTYs$%0!OK7@QsP1)Xd!=nRGSf(3 zE;1zjhfjTo?OQC-;!Q%#3Gy-zls`_p&TL5T^;^9?TsAl&Q~nfNi}~R{vUUM=zc-L5 z|6@;?+TRH%B?w%D&fFsRP?l_SnvOm_e4}al>*=}h&n;*@BV>do_Eq>iBhCGKO1Q|1 zpL%jI)otNe3kHpql{u!7v`DhY&hP44MGH{yWXC5l6f&d9sAPZ1cl zz}_~cNG%a2(3Wh9>=oW|n(YIRq(HUVC}^qtf?PyJYh0<5M0xE$w>mHEc-@oyjXj-w-i>xdVwr;Z%u4xj1>VM8q}0ko7fx;fN= z_Wen1O9msTY#+G!J#~82F!bSSd(fxT@2yg8uY1$EZWF))bu;#4mzp;=C&Rz&$pmj3 zJj5^xJol@HEd8!lcJLx&h0EWrY(9V^ivpP;9h;ZC-_L@}1YU8^N8P4|@s65}d)?^B zgU_E(iRYK2U42!NIdD_%NYL2^Ui_7V<1w1+brxb8K7X&nqIijS{mUMnpzgZ6DY|0 z4_?c`X72;z(dBf@c5e%(yg4?G#uj0J#JNa_Y*$j$*K0%>$Cn>H*P34LR^kefK*uus z@`Amh7ZA1nCNpSAa%Yn~YAU`3d=G>6?b{kU`KFaL3raKLNvej;?yKRApEwp0O=CaE z7t>%;g_g@Wgb@A9tNJT}y+Yr47oBN_}-Qs%AVI7h3Ik5iB zZ|!$~Kk*hTg%A!Ag2Ppk`0c9;rUqI{PZnUzXXV}?VK19RWPR43$m~uwUF7^$x$qEV zc@N|nHQFtlX>P|yKffIkbJbU>8dg_Wn*#)gw*aV83i5I1asGe^XyQVY5aFL#Y1kp0x%gRJj-->lG-Snh;C{= zzmrsvS=i`)_=zQ(FJJboW;G4uey(ULRfcS&V?8;85&VpcN*BvaxdK<s_c$W=t>f;|JkE?B8Qu^S4je!2OpCLM> z`qSgdAMoi%sFukD;ulI3(M}iZ^nUOC-Gtx!Nc`4u)SU;j#II$LDab{CP+^b(jva>d z%@(A*;;i^h+(MN5w*r3#g-F8OH=(9bQHcF1@$OLtyun0-P=vtdPC|06Cw6%~`+SJ4 z{3f3N{ebMKK85<{!8N%;U0>JW5id8Q$V<91<}?0*=SF8IUih#56}Fq&RipEP-jqJu zWZbc;Q_(rxiB($F>KoAT$E!n$)D)ryZO3RoGM&BHFYh5w-^imo#BOb?POc~Vuh&j` zp!slY)AJtFZYd18Db5BjH#y}cr!GT{{FI!8&=WuSh`uoMKIxax2s_#sf2J-JDXD=g zx%VUWTRD$?eaf8?Ns_RZbO*EX4v_$&KTZL<9hJIs^=N_vkRo3LD~_A64NB1awAWRv z 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

WFyuLb}17g{Ho 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,gC?VvvOv@SnR99tzXlb7O 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�tNR9HJE+p%l6 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 z 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 z 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�YPw?w4qqx|o);fEbckNQHHr@N-|iJ36#7&xtNH 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öI&p^XGz_iA_J2-yNed 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 0?S7W((OcBF*1} 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

7seUSBmkxM1LLsy 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

LaZIOMwq?VI6M-}{K|EkkZ7ciF79|*68 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 z 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

WFyuLb}17g{Ho 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,gC?VvvOv@SnR99tzXlb7O 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�tNR9HJE+p%l6 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 z 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
FfKyYf-m1E7mG57*# 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≷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

4c9fe>kyKVz_45L5L3l--MBs2 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∈iKWj#PMrkI+ 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�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≧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%0A{c{yVmgUbd2px^7e6!zg{bEwWPJ==phz#` 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 z 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 S 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 >N7?!z{J&r0O#Qig1% z0^!EdLWi!0*mNqgawHl(_Gi9T6HrQ)^@p8t>rn6ZVQOVlJ^I+iT3No{s_apVYNPJ@ zqI13wzFfF!`1i>C7U|5cdMZWa?d{1YFq4e#%RP@2XTuuSA-}KWQY>RK(VckbdT{bmGRs%U2dg)Bl zsb2Y(%juQ~w(TE+4$h6M<>cJb@tjL1?3Md?B(&|j7xR`j;s+$QtA6aHQhZAokl0I@ zx^~N>gHywaa)m(<7Q&x1+%3EZO|}kHcmW05m>=fk{=&nYYv|blSm=JZuze!`qoFre z2MPI?ZF{kR17#$)!Ij0xc0rI@ti_^wc@)H=nQ}-ni1nMSm447w$A~LS^A=tpBeXlj1qnv zb}IAh8zh1;xE4#|S7P-HFkBFi(~kL|*A>uKd}9mc)p(3Vq4WOGa%%6P)gX!-eTaEL zv!p+c5U+Z0Crm@xLNxU;YGv&C_mNJWN4Wq}IMsiY`iNXL*@l?)Y}&2Hb_4-G;k&3R z*djtHwt)Q^-v|Ly;Zx*LQN30{wbMl&8+5o7*tuBeyZcWAx#}N@2)%kPbw`^;0NbYU zGu;$crl94z8g53Cyg7p>F!N-{_@ zdxHewXd4F);H16X*kt2AztYH<3v_$GW*zIl<$}J)hg*01oEU3nXK{gtY+L& z|2i`7W5%-ZmloZ;lX;$A`>@YL{|Kk|1tV)u#-Zhb8}~n10E$w9M2lkwCLe~7AChCt z*gfP0^A%>0?BDw8OGIa#?iTlc6fzRHM>WaS$nRP-J=;-90#;;<(sB&Hsj!Jh9p|%M z5J!LVB03Wm{G-C&#|T*7yUe)v$jblR6(*$#%zMc5jPJ1a;(KL0|0Rm;JB6Rqo)%d~ z2X!fj9qsi75xH~g@lAyI_9V^(1IOOAXR=q0w5*ppn)mwUIi@j3BfkPe7jJG5&7#k` z8&mN>bTC*Y$P$B!t>T-7xvjKTs;a+fU9Y2!R8;3U&|M&qG42~8TX^)fcW52<(i@A4 z^t0YK%1*=s5#Iz`C5w5vXy;?cPh1S=M%3q~T}KW{5$Df&ojJ`mX^z;L`4v4Ry9|2D z7e&{Pg69s__gT=>e<4$5NdUT}vhtS)He;#MBEW4>_4h=a?^X6UO#>gG{jM%kd_jCn zwoaf>q~_DmKa1SH>Hkx|nmNiBh9DK@4|o#U%1%BH@hi|L@VNM$WdyBoIQQG`!9igs zI;qVVw&c*}{x7oGaW{26JHIX1f>p@FO&!AYqAkQRdLvv2Sq)Um`9Lx;0G6#L3|ZJ* ze6J4}O@91tu+Gu=+Vk5Ac7a^N>o97e*3hHRXO2-z z#4i8gJN`kmefM`pTV0>O{1ef-BY%wpiPS%%<&Uq5AE~1#<@drvhl_dF>a5!SgFZYQNZMk#rM!0OVB8p!d zsgCJ|LZIA54qL^%bajo3);{&O#d`Vm$%8eD{^S!@INKkMHHF8VT<2$Tv<;cHhRPe$ zZx@T#XTx$s&O34%^V>Z4B4;kynm>*wo}9lDW?Oh{J_k67CL9Lr4z)Uvg#n%v3RGBH z=U+g$!Yc))2A|bz-gF41{h}$Gq5ljE=853^NhpHX*40AwHJBiE|3~e(Wl!Oq?{`(; zV)k)JD=lNpY{PA?-e6-nWcT{`@r`jNprPZFj^SET^>6^a{Z~5&>`+;k`6nuG&P2X+ zq*?@t5B|4kU&6zbzdulC738m&qm+s{jK790zPw?h)J=X%El>;Fogt{Bt}VCD^#liE zW3vhh(a-yU?mOJI9O7oOXU)jxxyC1VE9vjO`5XOaOIC{IF{3nIMtTcuB!2my450wz z0z`mC(lX<4A^XEbu}p^>R+2tj0nhbd37Ukqcp9jmE>Un(J#uL5e{sQQ%SY>wM(x^5 zNWzwa6f}S`VREw&M#u03{(QDZ{6CzwrQ^C>`&+l-UbOH_afumK*IL@Dsm%w>sqikEI6zV@3nIEDM%fzM1k zZ!a*<#sY4WZ{iIKFEVs!aeVW^vklMk{dCl|bV_!dNc_hw*5O`+g#Bg-W~zYMBAiR% znP(AcMft~0)X~X^#v(_R010u!uBLwl_mA3$K!?_v^lhA6%=?nT)KcEzrs1wR3hSb~ z6e~v=j!69n=`aL%Q*2Hb5!`+Ec|XW?1DSts&xwyCa&jzEy1q`_iqrXj9w5C4@Brg{ zaa?ZxXo$cA?0A6E$%R&6Q)ZmA!e|M|5`I@?AVJS1E=EG1f<=f&gCoGj=|I3XuGAo5 z$|hlsBg+H~_@y&s~w6C_`9vW)~r#@j~_Lo~?M z(fzvk2;L;|{N)$?7e1)u=RU zco{?ZOj6wZVpkJhuTHj$*sL?Cbx@U&P*-n6XyWaCA!8CzJJ6RXZ;9vmJ1Zk_{jp?K zs#eQW*()AR^|e^Qplpi}-gY;1l2#gF|5n9SoBy`RP>I;L`n<1teITg)9?t+0kT|k4 zSui&DoYPj4l@sHXwAGGuUROJ=_L*%`MAw_v;BvuR>7*ybQ3S*kS#)mf|AS~~Ik|vq zQ&b=64JQ17UrqQBpC&)u9YvNV)5or(2cvmI9&*PhMNBRL&+n5a#>glh(o;G&4cC6PN$#t`8R&3uWy7AJ)*y`O3E!pivq zS>-Z~Y*yi5wVO&qI{t=%hCNB67Xafhhcxm5IKmy_bhw+!+ZR*}K-+9l{JHK|y{HKl z(bkkx+R|FuOSGi5hWE7j6e^XHd;cN^n>miVp#*!vcnJm00fx~7LXF$DLK?jKqPFg( zXr5&K!ZgFwt>gFb1%38^g2z><5f${E#_UmP^YR{`puD)HPV&8#Z>A_`YJO$+eXiJN zywdgzRXg3~H^nBHi9GCrxZti1BV}|^6os9=s8zq{!TT~<&2VF#v-y zFscU#o2Dq$rFBtres1loQ|_{beP#+0!A~PsW%`UoYjV zls(Lb$-y%5W0uCyZ;|CaJ4b@pE3Cd|oQb~T2AwEH);HucE_2!F2Qfy2xB3~p68MQh z(ZO^%n**=>F2ib_J}3;BJD9u~3d28hJPyJ&qu%FixRH` zAEN__e5u0uIctjB|0H)%28PoC_v(hP^*8M@z6J?Oo+1t+Z7X z4g(%cR=^8xn8Vo`Ygd~bY?nZ>*GkdHyYJHibk#S>lx1$D8nAO$0a{eIzuxpL1^GSx z)TP#8-G|q+vg1fNAupe!ICNO2>pl-!Pzc(Yelig}QH0@0FhnodbaG&^eK`O20*Ep1 zfYAjU;mW=eb5nT9$VT3-On#oE+jN{oY$dCe9UF7~ZSQjJ(BFYOr_~l5C>iDjIQd+6 z8Mc1SyG*S^R!2DoD=pU(vA!hsU4OmHw3zeRmdC~b8M)aK%x||spAM!9BAHRFOR>)5 zJ#S9?wBrAFJ6RTdEJ=u}0B2MCpr2|wL)zZfZJ(3or#eJ0zXrgP#A3%RgpCq%hOP9! zlGej4Pnx^eF2=$=rYKNh?gggBbv=8_6f)dL->8W;!3HkQ&xX2j4P)E-{=Ylf5E`Ww zlA^p6nAJh|VoYxX)G)>LJqniZ6wiABv-kcss-|aZ2$xRoDWEtDlZitcy3=m8)Mk`} zQfXq_Cp|190OIH)3o@E-grDZ#;nd}K7NRSu4(WRjttzN`&d+kJxgl!m?@X+}&Ns}T zq6SNfUF+)`dJ^^phRTd)n==QG0|Z-{E9BecAJ=QZ`S3bOmq7( z4;HtZaUfu&qPD8JX3l+K`6c=dYuQEko`->XiNF$F$s&ZR-KSgJUe4!}H3=(Mvu4Qa z^w2}4?p05iyi8j|?S#aK9aR)NBl*A4b}~Nl{%s^v{sO_i-y+~kLDs>q^Qz;tEYiW8 zG0~!i>#K_JYwEf@L)ey;S-ex@cQY$SmyT^Di#1qR(LSDR`A~=oQecuitJ#g7HtmoH{8!#9p8h~ zkIpz}f1u+TcsH!+cXZhN;Y}l?tX1jABvY5 z^>UpCCG4G#KQ@4`Fb!Jq46(*LWn4tE4)Z7G)WgCH;5J_e`3Q}do-2L>tmI1Mmkpj? zHx1VPW9>T)-5Dn%keOF|_xi#&FgA&B~yUF=Y% z;VkZQ+-Q5C;h|o^14uUW7~dT4I?e876J48k z4F~^PG5;4IMsXkzXkXRRSxcjgRw0;$=BJl*;+;r@CCsr)v#3Sp|O{g)QJP0cP5#R}M4viuR=gWRSRYMY89Tt80Zk# zM(qJs>q5tbNEjN^MEFG6s3PgviMX;K%1|#}1B0OTAHy$Y;E#J};sLDJ>%ZTVm=0u+ zB=j*<15Bwif)8ba*aKGy*l2FrPU-fR&plLGK7_+`)OYH-fqt86BYX!1k*)4;?nOn2 zYrf(wIeHrtA*&Nw0HV%R=hO92A`@v3w_V)qY*F=*Hi@5DzNrftAJ$)4d4>1!NzRFmi%O-k)gMxyE^C1 zjxnoGd8oN@$aVh@_Ycu5p+Yl&UyHl>?{#edtkPZO-bdU;*f6&afOLPt7ep6=3Lqk;g5A}BO&w2sHFx0GxyH_`Gb zV4~>GACl$zVuo2cOW|lLgfPEq8}h9Jr=8Q02Us{W}%}s zBJ@sIT|S>4uy!WRu1U?fYzL$RH3UyPb~Ms${`N{5L`E8S&T;FLmk}*prg*UWflj87 zkBEIVZPE=kHoC+(lI~N%=J=b-?&xO-7(`2vRi%_WvCFmd%h$_nYBEJVnKj=w1he75AKnd$$-%)LUy6*u!Wr+mu2(dPZm@*=Iz0k_HABojEg z`iIQWhq1cTEgS{F4xI9wyLpEfu&nb^@<$g)RbEF`?n;oB5k*OqyC`S~*Zko8wV=hJ z{SP7(*NrN(-l_U58#%%qwX~jy)rme7gz#f2QsCBQ<6BHHec1{Q$Mrhl8w`H{S2}}0 z0oT=cw=o6qcdH-OCblo=05{M4V*`NQ1i$f2LykUDIav{%DI8@UG{)7rhvusOPIdKP zzV$$-5_$*cP%VMI9y)*`#X_S+1;_)E@x?S(unW`0H%G}>4o>AZ*9)jOel z4B1$uk_rt^#G-MXZ7DHXRJpMEH~S^5Ui=7m{_n z>6(;F5Fn)Zel=v{P&544nstpRy6R|b@6r-rIUW2|^u;iE+y6dbfrM1g_dY?A6HUMC z2=T$ED9C5r)?);Zo1cHT${%fZ>6}#)ImVhJaaSCheM^{v=l?r?d_MwxqbyAH*E*2_-zr?GzNS)l6*`UaTf|4^2ky?_Xxu__W) z^4}@P&aQZpeUDM!Q$>01gux@X1ghKt%8AKwA0DZb6NIn0DH0R2@}?rcj2&qGF{W_P&4{6mr&~v z;K|O4f~`V&BG9+rK;?qqc9mozJkX z%`T0W#y~`GKwXGpbL=VX16KYTKpCeB$2-A?t$1!uPo}5d4gKwo58MPlm_j^%v;-6$ zf+LNOKZkkStJra-U1667T!v*PH0SB`&l31A3Iy;S|GLIHT@q12TaJso+=*L}ZENg` z!_a?(#g>itYu)2=m*JhSaqHvKE7EN2&XDg1=tfrT|6`p7hGWouW;8k;#h(K;!#hdp z^pQ{KNmwe6NL7HPG|%2Ne?h(arFjk%K$9hwjd+%WO*$l4)-h{VXl?-bOv>0!P2+Vu z;!1Z4v1MC6s>T6Jt-Rv;V(dB89(*~{+eO&sGzgCoiIBN!5pIsq6-)gcQv7d8Z~qDj z}o;w@8*w)~(nVVokj5`-}x9I(j)q$~iCye4+Ded0G4)aykM#W}W zEsY-Ux!1t}dirt0RF18)5b&EIr?me=4CSFMHzVE&*X@`2S*i2i)avOPX*tTd9I>;G z*rSH}?oHZ1R48MQ)-C>P;0K=H#{JY@ZwuE*ZSx+-*>h1k;Tdao^) z)jvbtHjAo~;2yLElwN8kc6I+X68F(fZ*FNgT zTJyv09xyLA;@bGpvVPKRIL9#36#c?+zke}_1voWm>HycASoPJZl+YR8iR=DIWocWz zrsEsa8s0Ldn37w!Nf!fgYw5qarLmL;nBgpI?*Xv~)08m6CLQ?(s?376uK>W^yXpFH9kx?~KWDu7R#A)@0O z4<_3V5&9U;t#S#g4>t?pW)r?FE@h9xh(AZu)(?E!bteIt6?+Bs-eDRzH1ZPg9qHGi&qL=>Y zqrllRzxQ?=41O>EZ#bTwj?Aea*^B4g_x*&18_@8Oa2G|BL@y*3=<{+>NKt99CCC$L z)E>?49rCXAGuC)>nnh&YQL`qK}zYAkPayo>F)0C?z(hINq2X*(s}7_P`bN2MLuI!X(DD^nOW-(1E!vDYe@X&ID;Y@k1~*Zx8Zb>us5( zdQijC=5qjJ%KP=o8th_!Jb$=d{PmATy@p$Fl&i2+{^6I?veI#fDIM?KA zUP%+&D-}RdbBuw^TJj5nzv2gqo91XEZ2517UMlap(G<<+cMoj~Jwy>U$T|w&EOmB@ zR~c;=!@ZKPqh_0j3iT0ZB_$7vA#i^Tv?0yLx-Y&)6$ zC$4~q;hy4&iF}}?YI&FN3_hpC0T7cSJaYKsH5AD;*|VdycQHhY0Y?X*Hk!p~;D@rY zMKy*E0%Zzd<>V>s_2r$tphbx>CHO8>Z~z!$>25820Gd$L58V514~8?jbT85`AuhPJ z&vMOdQOwfx(;t#-~n2isnyGgso2Trodkh6nrAUr3r04>%xE5C1fsAdKg zMHc*0)g_)npp)jjLXw})4@|QgG`caUBO#-rrRys@+51jhpoz44`&peAt?C8Kzh?;m zx)gYJ2faGm(tn@*6V#ia)S5a+GkBe{d}AHk8@y!ay=nuJ0)HI*5rcNXg&(sg$lJeZ zJNCsuz$i`A`P1MA+K+uvh=QGas(9n2fxmpgXDCFJykN9TsX5vY(vCD=JjUWU^4+pmW{6g82|^+O!G1yyw1O23UX` zff|jiJSFbI7q>c;YkwTve{-x(+<1&#ZLgTCRIsjUZkZasnOog&Z6~xZ@f)^+D$#gu zb~TI?5X+GE-SU(hoP-Q_CpX7h7_+DGT(0lt^cV2~STYnpPH_|BH!lsakh)NMJ~*cv ztYj$zNr^z(Ap(wuI?}`9JAWBid|771s5wa@?a?Z}r?e&BeAj9BfBhH=#BD8{@}|}{ znt#i~`J51ag*mJhU4RE_;U$(PH$Q-(NDFpxrf)&vT~Df}#-5wvCce9(%PM9&)W%%k z0gx>gp_hGD597=I2)0~vVF@&)@7Ihk1s(Kv`RA<;#tkMB0cw!o!QNKFo z^d9}IJC`>tYIUE16^thO2)Z9=+M_v7Q?JIpM>AAqj)}gUg(iLaG{gB!W9-yk;U(6F zDUr8u2rRj67z^+!@_$){L~O`XT>IoiRl9#T#6wFC9st@{w0>M33oXRl6y>d%9t(%; zwz^UC6l+1$$=v`9^bR94By%8l({m9sB4?etAJyZ^{66RCZ?CvO99GA~0QPZ_atS|0%w0%gbk5`N8onv|qc z+Cv|mPZQ=Z4xf7~Sp43BKS?d%zppSJ3ddl#u>HTm`>R7(o?=v5G9Ty3MrNaaocO{* zKBW>wJ^-Z;0$g}LTz>Z^isU?KzO8$WTKwD?5nZ|w3yL`q2v=pOUMlM>1I&I4tyjj) zwm{3Y4Wt*`qz_w*Y$|r(EiqujcsNf79#R<1XCPw~_lZ~gs*KeE^MKkPqRU%~$iW@K zz!qhpn{l;+*M++qrl(Id<+!G;MGFD(nd~-;(Lw8@`n)vz+bBkAZ@uZa6rGI{p9Srg`q2Qz?=^S7_({cf1tQaYY`n(SfTi$jubX zk$2!rVGg|?0syl=BR=T7Mv+Oxd!y~4BimAfel9-%ZwW#omPC78$e93d=bQdl zZ^%dTM#NAo!hB-TTk@ERXW9hdHO}!T2w%B(4n`VGyWqDFxw&W}a|#nSOvUQ?5x8k$9oQ_nYJb!eQcoc` zGYD?=RT_6#@^VKh`c0Hv9lH%yH}f1@4i^Y&tWc?FKkYAJ#0A&8$f@k>R_+DOs%yOb zcPF&j5Vy%5twTju{i8m6>yvpYO#;SWgK<{eTmX8Bq=3P68EBD>+|${ICF4x5R;fX7 zce8{Q;I)k()fxr6xBXj+L-m|5JD!g4Luo0VbJR$lHJZWu@8t5gM;;^j8Vu6kkWM7W z-tpUrD+#LW8=<5fl;K%%{|p49P=uM;CH7iLy>k7H=|Ounf!d8cq=#&Ij)F1>yYB&G zss|2BY$Sh#|KToW;cw@k1ytmRWbFRn!Ts2%rC1>J_S0YX0YR!JM~ct&qATyi5;d;p z0!jOu+E1LVGe@{tMNmH#lD|@A;=lu7+HCH1_y;guL)nL7nSNXikL|iEG%peL z<}ZQ6nS331sx)QJtwJrLL0fzdKW9tsAmj66WdUZ%FGU=-Q^Mvo4&+Z<@qucaacThD z?@`U*`)j+Be0dmP5L^{a&gWbv6Gv4zXSLZDJbrQxIk1Edc+&)wnVsiC;|+Y~jA31^ zi%y6GAGBOU%^-{TUj)9j>njn_{+v%$OyC!_{E))h28mZL*lQ?fser>~2K|bL(Xhtd z+8gm{tuH1ZA#1?$rbU7B&4Bz*Rum+NSyJf4 z`-MR+;Y0TXs`7LV!GBOxA{gpb-+T>;QODkUaj{}Dyg75dOvqg?Y}g}iPGorXtpuHtNMGxHqD{?RQ_`Co7~=0F2p039Q)m#RuS= zk$Oi4^A2i2%yGee0-@&v)#lwQMVRAfk0@Cf{w$X)=h9`4Nf;oNWpyWMJ2k1OOuvfn z_n@%%5|1|Mi%$UU<1yK)PL9gXHc9>`^O17{ZzGnvbMIpOyHQEv7L;5?F<>a4TRB;Y z@_n#oLl+g}Ia8AEb7@c`S5@B1J}|gab^Bz4oI)V zOkRudhV=%sKluNE=8+ZqD1F6?>^Z13mw|)p6W~cYjFLzz#EQ6|k-bfv%&RA%zFK6P zLH46IMy!V8#86R1d$r~|;p%h9{VZ-oabR#k0#5A)gY%lW%2UtA?vjuE*eCdAqGEt#RJniY^B(Bu_`EE37(Q{q zwbFLo@wbMfP2$z1pb^2NCK!DMuvS1O^?3uLB!YSIOuPougRq~YV47qH7GgE{_oD;S z8uEu0{%M$qWmBrc(YsL1f`bY3gi2Kp))O8PL~bS;F3AS2uRGp#r`873AD{$WNQgq3JPsh`dHQIY?pd&W%o{`w>`L^UsPtI8iML^EY-QC&iHbR% z$MaYTJ&e#7-(weaO5Z;0uqH^z-8%5l#A~(c_60yU{G_6()BkZ&{EI{~@6D%&u7=Zh z>M;k6%m%cf)L2lt_dI;#%c*j&xliEZhYEgy^tP|$UVIG(q!iwIwRo-^G*`*F!SNFh zHZJ5m(BhaUAsyr3`{AAFDuh5sTts`#Lln-u8JKvFa4bIp|+9UELii3i}|yAHgo zUr_~_2L|@0uzv!et_^xjp~nE>ClY)OxULMRR0Xf?J_Vl`Wyq6Kb`6pW8NQ_^FPV$E zdhz>5f2YYrAt(*zows4&fRx|N@XrB}_xIw@fsE4e?P{BPhJu@_a@S*vQK9$cTP=H@ zsby4kQMnoy1tGu|R9l88P6Ti3@chJJsWedj?DA`HYQCPqBmaiE1-Q_WSp8{ix z3T)rD!zp_d{oc!NP6Fs^%CVIr6YYy7pD zi43rGpJFxi-eJ^3bvrq~ZTWSs@|!pmo+F*ZUVV+TzqF8@Yq|p~Y3l&VdC?a#uEaPT zWAr{iPpvj_={iDFq#r^{HCW`*>bxbZy!}@-j%=GCUBR9-H7jMC{#QoI=YpvA!TlUo z7?>R6%wnkxxOAxs&(-vFc*B&%p1&Kr6;T12t2$)Pket!eC0*kV(LPM8cY+wtu^K6( zH(LRbRZg;$FE|NV2{;)mSJ66Ra1V4`FjsH-Qi35Tvl}-fqXy8_tr}mtamdTr6!UHN zGGG0dHn!1Txrn7vqPr9Jzgv-6K)olpia<1FVblf?s)aP4a3J8;tBG^?$T{@UfvEk> z@R@Pn^3P>1VnL`sP4_qe^^G$Nk)Nw4473yS_nV8}8ft;`2ZjeYGuf@YGNxzP3h1Mm zg3eZG8nPTfYKkKLH-`dYg8ji;wMe)5 z3;06KIrZ{vDuUpx>DEBma4gPa&n|=8gtYp8t;}cRcEcC3oH5 zCgq=Ot5b=FZC#IpM8XPEV7kpz2c&uM@fmO`nRKSXMgUV=70^B*$BIpb$Rs`DlqhcE zfBNKC;!t?L*aPjy^TgQk5CJ(niS%($eqFoun%M_Ns=Qm53lh+cAp2kCt;`oQR*eoGGrh zd@dXG()hT)&ZGT?2KCXe=y)6S2tKBnHzAG0CIV*BR)*v9e%1|%MRa&?;Kp%tuXL#1 z&2}i~)c{16$Sa-bLnJi3sUGam&bfWfg674AQc+V=aq)Yaow?X^QX(Q#KIvf>k1=}(#pd1nmh%g{{dBjZE}bPgA z8+>s6vdD~g49i~teO>?!wP>!5!rt1|}qJYg1M0ZUlQfEF@=7+&3lzIk&PtG>?& z8nvS)L|@6PoE%vwjIN9Emdbc9!G^Co@aKa<3wn9V^N&8d!`$X1=nvhnJa!VYY>$Tu z7B(t&x9bor@d+UR?moLwt;i%yM=8Xn^6-$(uOam{k#B2-EjLs!vnL`sPyHYO2YR@1 zNfX^c2=`stX=qj-ZE_=@jkjxY(FOX@5S>92~MP(4N1BX zQS`5&TDc{P%t-YPSt;HeHH+yFbmLyKT$~@jyUC`08HR{w|2CNlJC%hv9WP%e|7{>#>?ED?uu%bFe) z#8#l{%Y%VBXXF7j5m`mspqtwYXBCLDY2I?UGGQ~jfN}>>R&O(Rlp+%zkJ?dq8#=O8lQ-Aq)-#x{WNYL|Hp1ef;-Vt=|N;MtU3xD zKt%c2($o#|JTTI*lYiD#Ty>Pr#=vQQm_XVTGIY&6F@G8$N2j6*i?ttSZF(|=w{G=2Q-C=Uofeklq`s0O#RfghW8Zc-GC@ah;NvloxO?IFBBa9Bm zoETLh^b()fHOPMQyj_iD2VMpPo)eNbIBY}ewOBQT!y204!S3ADQzUXb$#6ZO%}|m0 zT-aF5R7UIMeLp_G#Y`}8&K1Uw^y{uyx?xA)UQK5BjBB@PKE85tJ&lW-s;4zPc=WoQ zeqE5%p1t5EBlVMZ=m#w<2$V!?C?i6JG`~l2mjf&s1yn2aVI-hjt@mq9@E5!@ga{MT9c#fI6UFSP7*g>1luWci;x5)47d)sPiN5Tzk#&b%AUF0d`h|N<*RG}D#u4!uC?ZjLYk|T7=eOwR~ zoQbs|h{oF*Ahm5=Y-704!&Y!x<18tA>$&uJ6yndI{JLlpCnRj&6Zgui{b$hH00||4 zm(8MFP@|G!J186oH`V^)b6q@3*B3_b?5d!vH#Kl;H>Z`=F-0REp>`f7kT0C?*dIkq zkv*g){;LTH!@jhmCKsvTb6Q3S3ygP<)9$;=>3dY8^g598%fufp^kA zd`E1^eJ7HjdFf_Jr*_C!Bnc*#dg~V^x=z^5FpQ0t*55hW@GCm#XrcCnqBprSLMzjd z&R#a7I4Kyi18)S{q-zs9-=axL^)J$C+wm_YdbklRcnFUOekVmlcm*tt=<>(h&#SsY znfZws%j;hc`)3qeXCZYxDl_I=BVMScpg*js1Tmcr=czZH&>>mwAQ%3b0V0XbneQdK>i0da zZUWjl6D+i+%O27G zFL-@L+nG&b!i+MIht6RqTpXRJFLYM(Wwd7rY3-~SZ`Cc4eMkyhu->ycCYRDSG5P#2 zLpH)K@M~SWDDWesREpV5EK{gyCNt~;6niM$S{U@iOAEiQH3hXdo%1cYe!iK%HQvt; zX0^4S`#*4jg&B%eg_C)qM)98^1VN%3jv6t}vKvwmB!Qw{#XQM?fdxxUK;r2KZp~!we5JG(Xow%BOfr`KVMs}^}XqGk~S)4UV~$Mj^f9pdSCH-SrzsYh&=ZzqPF?~t{9@i?Y^h0 z431SjF=^{Ayu}@UA8pn}{}Tmk!`30c&{ISVRz#3z&;m_YksK}(LL#SEexM6G2JIzu z({KkJTl5sHf|D!5tV;sQJ$p1iQpi@<9xlTaTk89bMm03isl18!IZ+2cs@R9qNClz zSCN_Kl{4zkJgvSiR@33JY0P5|Y;_iVsLZO`yJj5fvS+GT8ktl|nut*divdQ)MwY0E zMWX|m6d5*3b(|$JZhS6n@i9`BSKp=ruwm7(rU(p^SfScZdT5 zT%AuCLOcoL&_U@UMz?vun(FuYuJ(j(FevoJF~lKhU8c-gIcFe?sZc-Tb`RqJe-@+CKO=8XojJZvrVo0~TtBTtpeM z!A7CRe^EBl3J*Zei-P4(hJ1ViD$@y#I()LrzJl8EBa{|3))DcsASv*307S7s`YMeY z+?U$k{PFVRTY;~e;Pc~#Lw{}!9sG#ATh^sopxnR$E7S;{u)t7&VHfg@7yTF$l9j^YpMmLj>(dzQbqrvZR7Md8}$AfODSiX zjyk{6A{w3`1t`Luj%9t=vX?2HQ*~@dC1u061f~c-HvJZC`3fDo)(IU8O``b4*6q#n z9@ms;IY@aBkVrn+Gv zWRnGHr`wLEQr%s>tve(SAh+}a3aLigzlQnMJ?z&5iAI?a(J)wFP3~)%fW8qrq#!4otcBv;b(1&<%Pq}$F|bXpc)czgbm~6&6{ZEcP-;jL#_JjfPK9BBzYqF=Z?DZ-nU6Y~t#>CC znf$+zA=#KW(QO=SgGBv8G+nqYw3HER75PUAG?Ziy3jUc`rpoL$3 zgl{^3UPI*8i=~7k_${nxjR~ZK3OOUI4%2Raxc0$s9RjPbjxfK@>^t@E=>=iJogA}6 zE2CRm-gJ0r`j!GUu`E)r4<;<86ZvdRm4Mw0xp09j2&=ptPboy_YZ)+#F2XB2N_7QR zqAIy~*|+jSM!74el18M~B)$2!Zpn+a5t+CGd5SfH2P>NTN?{rDyQb>)s(Gj1ufw;{ zy<91O|Mc&X8|EkcMijd3q9y%zBn0+Isv#u0+h|g`vGQE9Qe2~#`8Sm*t;;AfB|u6n zE35A1W?y+v2VVDBL-0wL$s#F2?J~adHMJvtH4JCZ5nm}Hh-_u%&y>I_-Z`3d zUsXZ|olinhsZ`5i)M)(z9DE(=VBOnnF3FlIM^wq3TI1~=V}iwT7+z?RC%TF-uPgO* zqr^(|)3GXhE1SVNwH}>P-Xm^wKUmBX|HoMw66nKr6Kov6pjM(hlu9V77YSjAj2Wgt zv8Q&=0B~f!=qpzo7>A|A5uj<9(91(tk3C#8PmkI4lPcxN22IbQ{~3GZv^IcPiNVi%RuJ$7Irm8v zvXo2F!TkM7Vn|D=t922DOd?*=&}S7F_Zj?1vBBMfhdTv$U-Y=KXEiYQt=FwJjpKHY z_~JCRUsTGH8jtfsH-2GOD@MwW6JMV6y%{NfhM!~~khSkwwis@OU)$~za|G)SpmYwD z+r4}62xdpkhxO4|$(1F{;Mm!L6f+B;Y*Fk;E7=f2hmETToyQ%t#$)_0A)T+FR5&{L z(AY{U6AgNmpAc!K)%XQ+zI@IHJ~Qv6%oTTr5HosfEm<_!jPHmjwIBC6Dxp=Emg?b= zjU(F>%${FXzo8GOW>?M$J?JzjL6ryEFtsV3%nI*Wd^=SNt9|mH5IxI}e zMh;XcRXmy2(mmIgMi!jW)mb8KeiXt-xB==Tp?NmiYIf!&ieNsxh-pd#R_E=+lDdjH zu%~GsQ%n7lo+2;%Nsg?!sxkz{RFh(76aZ89s%Y?nmQI+(52K_nRiO|C<7joUK7cJg zoLIi%O_jtff44(}m&f!cssTqUWvY{TvqXnWpXx=KItf{8U<8C*hZ?R*I711(#Pw)d zvPEOKWA?yA=rcUeL!NR2YBMPqh^3+?`NzQr>DEtQ^v{i~imE$ut|#y!bPp6aVIGb6 zxTxP;tKHKX?u_IEeJAsUm-2qB(1FEm=Q>Pq+@f*2K z)t43x5}K+;3BF6bh;BJoA>W2uG740q>M2l(hR zjA^}S*yxG2BRDl4E}sCTa{A;nG#LN$FAo>q zcEVmkaXNK7u+ay8D(6QwMXKmEIUv^D!M(kCvqSS^c8kyEg8;$Bq{^bT#YZ1J1du(8 zd9R+rbdIqNEk>CP0+VYO$Mc-d^y6KVgLOu^&;m22rtEHG@3jU%_o7Hyn)Ook0a&BM;3&^vTs@b-k)H z{jce$+U7I+c1?RWoxdWO&@VuW?_LW8m`Kw+42v~BS z$C24ulRG=SqsoVC*cx14m{^koVq~8Lt*AC`B%~0cr<6OCmGO_U9EJ-!-MR#5UZj&- zcQ+q2?2R|+t3B|MR}wnkOh!fH!g(w9GHC&wB!GXrnj$i?`F2_@vM^xhIl@Ui1sRBpF< z2MFtJ2oI^!B0)`%cN1B12Np6Fej#wPNu)BUISuMBTj*CgsbF-?o^My-XZqX_>S;H#3L8_L?+@(5zn^cjup;HxRW@Ud|AwAo6dgW) zD<5>{(a(WFSm4h_*?z;Xc{?yuEhK9<3dKl+_`zQrULvHvMNM&73gZ$1nz{ph{Fjj z2%-x|sh`_;13RubmkCZcUTLcCa&@^Wx@cmi9o<&^wdn_?+ZKY7m^Wt+ z{&Y+qNE%$$qt;bhjZZm4 zeOhjMdk^H$Z^7CctKBUDBi&mK%a%3z>M=}DW%uHpnCG1@V<+iDW;tK%`&XGYFCW8$ zq!zzUxpwhDN0?>@c_Ape;L&_tmyu1^ANg;~{@S}I(Qr`QzNgU%WB&je;9KL+M==Bp zAWDPz&)B|&vj*+gj>e&I`fNDv+ei^t;4%;GqL5M4FckJ+1M%U~YR1xFbr@e`3sGUB zq8~FN>?Jy<;?TFZGITpp>(4nW?qt-E_WE?bl|sMwg_!DivTc#cQ}yH0P)*;?-1d4?`256RqwMzxhC3e;a^a~EdI6A_UgtDQ2 zS;bk4#7|?U2LpIKYvq00xO#U zXM4VBGcNZh+&)}@gy3FLNl=iG3nZGb-sz0JT+w4e=$xD*ldTK?I0$D&t;8y} zN#|5qEiBu1%(SV-m8l^5CHtT63w*pN9O{TS0-7-hqM4;V zOxx6F^8(K3c-T)t18K-fk+T45w)UPrH<(Mmjevk1CpOWZUI{NM(D$rH1X5MKuva!R z8@=#?%}&yHx1E?~@FP7`c$uVchHgtAgG@tWVGc)!zs@QiTb_0usW1y3$~xf|nuXQ% zz2!`N;Qn%8{pgBAN+sG#D7W<{ct!|~!s-$|=C`j8ua_+^<5SS{U$u)XPe$*LFu3LX zS8s2#L-dd{_^IOVCsyiIf8s+<3R`n%$dbUD z>T~`9`P;619?bvD4>8c50LVhYC}zCqeFdk`M|>qu0IHZBDtqcuX?$M7n7)#g zd9d?+oe91G8C<8IojCLYkiHO9Th9V|SHREhY?9UNGLr0aYl7SA31!5PFAs-i(yfuy zZ^+=Rb^D<#0gN-5!%5D4mK4R&MNA~U<;cOMD_&MoDa@y~%bUgzW@;{3f-Y|weg!9?8yvEKnh0k`ZbPQRiKXld z{!ya=PhuSZNZoY&Sw$r6-6y_J7$v@h=eZ(r#EjQ^Uk}s2vXIU)7#?ErcNGF<3g`}* z<;umQ0^f*cEW+w3?f#%8tR@zvLYX$^c}6IjT(e8g8P)Q5-J7kW4}+xzkIzEc3*Q{+ zEFg!&XzmQ$47|dV-F=_TBODMeEKjg3!Bajk4Upl*>lLw*;g}Zfm@FJle2MU*dq>t` z-)?3k_1g0=z#D}x@97MNorE+*T5tW$>OKf9M#TXKJ@szf?wo3ATeAiRDoT{Pq+*aq zraJuM=CjVs=LIq78a`*uls#&vZCu=GjKyjs{tD>ke?vH+rnZM{N78Nj+FkAY?^kU} zIaj<^U>f7T?pgBZkHS`Qw*nd)C!`3Ch=3 zF~X?iunEY3I^=y8;YHy;%T+}M$((6A?|xHW()6(>UQ_vySdm=0KyDnQNO$Q5sp*>y zSH0JrB{wl7VDW^GuT!{^PEGSHc`jQX1+`lqDD+(S^Whth*B6(z5{67A-rCLPO)CHu zyE)Bd!sQJLS}j+(EqMy7^YALC_#Y)q=MF_jqJ#S^FM}p>-~FY&z3TE^2LG1SA#!0w z8q+q()zdYk>RY;c+97UYHewW(Rybz}Jg$kP)%SiQ7hIew<&aQ$=uuqDI?R5AYmYID z!W;nl*iR?-6ZbYvG%m-h-NDMoP^|%!OC)1=43im`ZZPZEh>q?or#rr6qla1M^S+b3 zkpn94mo-5$5_44ymT}1^BHlp`Pf8Kv-@d%%cvSZsLpuF`oIa?+ElJ!XZ z(Pa~?O1X&i>+lTB2NCEux%Km+APyj4q^YG!{&w*IVgnuo{K!r!i@nJh!M9#5K=PQi z^sMh|`GOl@*_pD(;i6FW%IvfGz+zlnKXC)W8{IBn^o06b{wj2D=#|VWF*$$*ktU{ z0D6-WPkGDwppTY}@*+V+$3*C%S0?Z-KlIKwMza@J9_vn+p*C!z5ZNArpIWOj1LIDS zLL8`MO4^wyG4mK+LYD>gM9SJXTpd266WY9?3_k{z=AvAk)Q zP>qMD9)}_iUKhZg@yF=z2+3l6IhNYN#Fw!-Zffdrkolj8WRO=tUvds>5 zgsdhqt!6bx)rqYB!pG9_QrpR;(xfxxd6OpoA~(Uc0ev(*bdh@Kg&R`A!9y~zsY|G~ zmYVTq?_FWZzDOPRE}{_7K}6P}9!T2NtBhTX=oER%po>?8*ePhzp{}R|c%>d4GB(y0 zSVE{Bf-OW=-1WhGm@N5AD*F2?;Dsvc^>7|VOO*NW;rq$f#XV8uC3ZR&;g~RzQ})-9 zwd(hJC>jy)$R$#^_{zKCN?N#%s8^q!s+oV$dVLdGgp4}=OUQl z-lg*ol_$pF#VWVCTQ?s_w|7C7y@0Fj(V(j*U6XYxPc`Qb@9AA}Lksk!KX0(8?mNYE`M zVOAH|4LzIO%`V+Q)keRDmQOE0D##wDe!q;(5)M`1Hlsg#32=@0_=qsE9`a3+nH;(w zFFU%u>7Ay)ic0X5s?LQ?eF9k}lI$ujMJk#^lgEzJo!!|Bs5@U+)NtOwb0@E)a`-}> zp2EmKAit>=@Q@sG+R?XRUiEi^WJ`~Q85SrmmS3-RjGGvaq($~L7SNzSdvJP?f{YJ> zJYSTbTYu<%qX@o-$+;-xHmS|4qmNYs+2Tv=jrGUzq1Uu=Jfl!8`c>(AyYOYspuU^x zHkx0}?HdIOpOCV`ul0|&$Tlu_36s)HCgrLg_$SD?pHSX>^G=8cJp1t{@hiwOdI3V6n7cU!A8Xdml2;*yf zK7Tbyp}{Wo5t_WcfK4OX0d=>rMB6JO2Yc#N>{XqvUiJG@K*?8lTpN|h zo>Fc}09`7<2Tde%$hQ^%$;y^QC-=KqKvgyoHC_sK)ULRnOKgP)tg zZhGR43D7AS;6!2@p@3?2{=GQrolC)qPpNQYE8|n;$>$*?5UD(T38lh{CAw}q8P^=M z;;XP}D)mYIQB915s_y4EYKy1EFjghqO6j_-Sf4WU$d6(EdV&)^C~STZdcKi+%P366 zOFwOkR`*fBMnxEQ&U zS9cR#)~?3DI}QWGThCEI!&Q!ef%gm zbx?v| z5#Hhozwhl414(beZT*9$s9$j6K*ZMfHMVfuW2lNg+f)fTR~XgmLH>Pa0Q^ubiCiUHsVb`Z|xg;n1Li}BLH2%bQ& z(zc$!O%(mfaZ+A_%;@em9_=&U_f;UH_B=TH{32Cs2N*&49r7ocO5J#YYl>hLV>i$P zzRVzPQ@XUj+Sm?0<$A%eR8Stx2kN=ECpWB6ML%=$K;n5#zPt@>g+%fFtULT^bv};Q ztGLs4*apUt^H{__^w6>TSQ1#}QHp#0kw#{Lmwa>zl1RiCUgLWY&MN|YlPuV34^u!C zuR{uD*opo0UKL*D(!;t-Gp>HvUOh~YbHSJ`IX-xWvN+Eq{_zfa7}4R{b{%@6Ia$$H+M6--6nf-C4Y6BgSeBbg z7p665(H%WDln&4#c!r;owY*DSVC|Fr|HcA<-#B2H#{AcmW{9Q}?N`FWKl;WRX(;!Z zpUM8Rim^KgBkMznrM#b|aLP%@(vrzJNGzxw$B-3IBz{@u8L!5Wp2b-J&`

ph{LS zmX*{z=EggB&!!Ik5n@T&NUaI6Pe|?QI4y5lxc4%~eVoEpt2DMcIQQrbEL!`! zcJJ7QG*cVCCckWa(Lb+4spHxCJNR@*ve&Eq7q}Nr)^vfu!m) zF6!H-ugUu|Rl+)?*+L0gVDJ_9I_@~w=|BX-iC(X}f`p@6G#1xBU^M`$MKuS!Tz#o3 zOR-T5G**l)j#U7poreb%M~0Y`Iy)O{xjX{GIwjxomr`HPtx+J=m>@ieipEsCU z9~|zHgbvrVE$m;r;`>$v^#sa(kgDBurbSpASjlH|esht;tE&a{pWsmmPV`OFnp#lW zpFezO(NTJ%Q`Aci_}o1{A<#*w01oYxodR*YnKU)(=X^&C18y+Tbxqr`PZo7-MCd{{ z^=;QrtT69(DDGJqFILy(J@5OS_L%>dFh=%fkj#84MGq_apC9Qbbvz^tX)!FUJXz4f zdSH1cBrP#p%eJ~6J8LiyH}VF8;V-fLV858&n)dd%Oa zALt^q%A@galVBZI!KP9}`oK^uq6E&4xARlH&^P{e+r>i=E+X=c?^F9QK3WgnZD@YL z*&SCVM80WYk=Z%r?cZlEUbIh|pe@MHV#b!GIg@T$37rqFEg{C13QEw7 zJ5a$)lfdiOOaA3H1YBB8`;VclLUG7@gXz93vXdhxfaoAsap&BT+7;uv8SH&>N5TX- z&==}g&g~C;r-&f!eA^@-tgMAx$RkT%DG)3+cF@Ba_J~#4x@?mu zgUynX-*MS|Yy_vH=Qs3W2{!(fM}Jp*z!4UxqW^P*g-!?3UNGxyk0j&BY4o|K>W*_q zd@A}!q5sF$SB6!!c3n$JmvnG7gRJyxMaudR)k=%5r)VF+| z_nhN--|xEkv0(FOuQl&E#~gEvxo|)h=pKs#CT|*$(L7$HBbN^*#4ns3S-6`IneUvv zaL!*uh*k?@h80eJCP@IoLJ@J1L8NY|GlNYFI{HG|juqKhR$4V`wZbgfD(lWHCdM7| ziY??bNKnYmw6?!;k@7r_pU#m?FrnWIt96NcTcKnOYe}Qv##NZF-qCQd z)rHIF)qbvLP}c<=d=<5$RgslzFBl>!K_W5Av43}g)3c~5Q5v1R*&|>mM8pU1oqu)1 z|Gn@q23myrA2OFfG{^hw{3vy12+yCa5Pvldyfx2>hq43-AT%s{qfWg~D{T z@@ohWYi_FyLxC3a!6g?}b$46_F|od~^qeaY@t9Qd?v(h|gcvhO&_TpXO7f>1j!5pO za{txC3Ng7Rp_4el*}9gjU+TK9E-{B4zH?k{Usn>xK%@l$Z)bAdPw8UzAcaox7h?UuK= zDp^6cj`>X@>STHcY@Od_XO<$bOusR1u7cQG;&POmyVjidi?B%CM5+)* z5dxg>ce^|~$bt0BvYIPu8}>yAP31>HaP-ilXcC%1)FZBp!Fyq#o5U4jSt3U$7Z0O7 z>?@?#MIlfd*u-rlm$(;!ti!`sNry}9E3>8oQyajW!i-zOlf3wz`uQmjc{NH%X*2`P z;2GBR^WWmW!@cWz6N--mU|NJ)Mh)MysGzy9JXD=btV|`X%)PP2eD8s>hXQz^P6U6$ z{Q+k{>ep0nOLx7Y@Ax4ERYew>XkQIdE=sgzd*^BI({p{&iWq72zjHp2`I!ZP_%QH* z>Pa#FK@$ObrKBu1@+ZAc{o8$}m5*(t$SgGR1cusMOnp-P#R6X?ATw98ZxSZn(0tp$ z=uHU)MGFA)lSOQU^GA)slVoI;dc0gHK^(?0FMOKSmgPq#+g&jUf(?XJjfHmq>8;qW z4mWcz_^*_Pfk}?tm|gwK3zzvz^@ihE?B7fmZ9uaMO~O3ibV&J4cCKm*-sIYsw-~D& z7-5C42Ay{TJc6lYHzI-Hq%o(RSD7RlTjx=>w=Pnj*s{To8QbSy?z zB9xlcMwDCC4_G|RH^`dx&!w;#7$tla6_z7 z|CWTw;PY%F?cqnwNIC5TjaIt75Ia3geqqu;*?mS*d6r-O&!yU+{DnJpFB)lh3W4`I z4clYmMxAj;!|)>1fz1)psD2A z;4ki3lIsZRohhSFSrI0Dubg!MD2m_U>VMA~8({>|w3sUl83H5%*aUAi+>7_$iEgk&l7K}0&UD>W2#^|Hlxam)NrT-F#f5DARc4{68IziQh@YcJ99Qkn9On%mQ=E$1S8T_mU*~DsB-Y1^YRyTczIHb1;mDB z{^#p|QBYl;?*i=K;g+d1wcP1aJGwz*ak$$=sl%giPJKrMeitj>9A2?;irl(M z7PDd!Z!%-dGpb}XD7r?9V_<9Zo{do#!#cdn=cS19Zg=ZDyHmVmW_ZEhR<#S+nAuM5 zjdI3x+m6#Xf*UH;GMUurubXxLTwZR)b`Ku#=9uI2Aj?-^^i ztl)I~{uz6Rcj>)UdI6)d`HsNjaeQ_S_j(c|=bW1Ft;$Km`al631JnRiZMJyk%)>1t zi^`pfp?K$Ea^(J8^4Lm~x)T;!M$`xV!z#wroP zJj;E083dT$$RP?vk%x!71q)%k!l=_bI>VRAd@nBwDa$?WmJqT*DqEL2K`+@+)DST( zmR#TJ5Y>`m@v>(&J3@M?j3kFGr>Wk5$ zY-G*(uC}{Ck;{kY3h!-4JU3UI!s{kq)Y4iCI`ZjUhk7aIa5Rr_H8D7RJC)!;Sa0nF zdK>#N49m5yj1x01$(3xZ;OX?_L+8?k0=MPky7{0d!%Bay#CBdqvDMo(40qjin|%XA zON3Yb44Db}1K~#gCNqwzlC8>rbRTK5@G>T<0~EW)Ad4=akct$>rmsf%B=8QntC9?G zN2EiLcd_QaIpR(XA#S*EZ;I1oEiVraM?m%irc(kEdAOO*9kNa?yIyqqB)Cr7D&V#- z$jqAeKzo4g>)?FQYqB6#!1HpjJ}y1l?P>R#EvzJpo=o|UQp?QQuRtm@nDz*B?eS9}`M4i2;GFS2eNsWj*$=gS7 zIkp06uF(|pvk#fK(t+E}k&`ZRHP?06x(P3Uz3)y)3V{BI60k<-EFq{#u?)s7R1w$0X0XNC^sZ3?mJ~K|}Ba$(c;W9=!*} z7=Mgr0-LH+DY~%{JroR8@XE{bbFU)d*1U(O#+D~A=0kItNZ!F(QswR_TItWXy_JS} zqicF}J04D3Nv|RZsF6^am~XcVM)q)DOpfi3Fnu)R7N&-CG_eks6}Gk{w#K0gsZ_;F&e!YgHg<2PuFr((^U%CfkX7nSB5C{UH%= z?SM^|z5<~t2lG!?a8E-{$y5guUkm%n&U`{>m)mfPq2VE!Tx>xhoGFH%8=dWz8{I*1 zm-pIMGPBl}P)#BnBEq^I@&j&C^^p!;|O-`ka4qar88^h1{af4e>CEwwsuCO#iHk znr;2b7gUBkFaES-8RjQoJ>wYp`J6h@_kL)Tgd(+f$lRi3Zu@-es5J#AFjYL@P}o#m zlq6sSyHX0}^&ITQDfmhpKH)@NBkzzA=lh6(`j)gA3PakG-D1)SSH6$`>qiGIqS_5i znsR{XS9y=C$t7ufV>JtCr6+_bYI8@4&?bJULC_4pJBJ7~X(xlM0f z=hiu#RJ`skrw{G(>28@A;P?oC-{1LTCzpVx=+>V!m#Kwp@-X7A{BPMb;3dR_;V}^t zk*cPU3Pp1NoSQqO^zGl*mc^W-g5UshK%&9dn#Xq2^ z;FbG&D`ekjEJ<34=ri9^#HM??N6do7?@Y0Mw>;~E zX=;5pLMafVJJRADhpx~i=!z{-y(v}Aps&JvGjDX?1xAAaZ)nzk~i-@J? zy1CQnp*?~qS|ffbZb6mzO7)?r(a)9@(g}~2lii%e%ZMw)0t0AkcdaC(j3a61XgE-z zQyt4hidN@d<}b3=Cjr|Ler`~dV;eED5v$Mr>T^9FFZc>ckeW$B`iK`h5r!0?a6nZc zSUc7CpV>t|qwsC&71q5co#c#=_Mw?n6!=s}I6Ly7n*c)&m1pU%J{OR1GdMT{VbCHaZm1cqNEUNoGFXeF6h0@P@ z*vFgiu8Yb&$q>FE9HWQ@zLCslOj>%(4KncX+&N-%zal#x(jIvSk_}lK*hQ7e4t*@&uIeRFrw)h z+dIH5j?greBT%uX9p_80v*l_K*JO+~ULio^#)({r6NIWzZ9o20g6(o~n110AV!M|z zQ2y}pfIy-RH%}!^)&RHU6Q;iIEkEkY4KV<`lz;6i?)^b_{Y~lseOXesUBoTV9{}X{ zhk>Xu&t3)^*Aac*mw$!r7`Sq@7`7ZyV`1EPbZgbv{#cpn@uC^waAJ31D(ExEVj6+I z{^+8Q&@DyKd*XNcb5hqs>R4NB5%1lzso!g<97q{c>gG)!hD!6JV|(zzFvIM9?8 zVhOTF-0fKYI*2s1@m$EZda;h!kYs*0fi7%#T>f@i+|!*%=uv4(KXg~E4(*V8msx-< zzE(P1HdAA8IVKGjm1b@?T%v>}QswSi!K-y_4*}$d(uMv8^?FT!G+V_DFp~>VDO}Ic zcJTbn#f+e z88dTj6bwpYJt@}>_i#lbX-m|>x^VDm*8H?Y&U#BV7WAHFr(X<|b1__?x~+O10cjRW zS@*$PSCP}=g%t19_-Ug-u_X1eWK;x(W1pobv_%OLZLq!D%t|9e+ezUAc}$^THLF|< zt(S-5MI%RjR2SO*=|-oweMU+aCz=&GxMKdSU~KAVTl@9b=*lO+XW-d31mSBe((B^$ zpxkir8*iL157=j-tdJMQB@Wd}-Y-140Av9UICD}1ZHmt1oVRl1MWt7+zHobe><5%<{3{u2c$sQ5o)68=^PKe*a5#- z@|dwZW^vkLwvy8!`@4LlXgD%faE_M@-J;!al#QqQV0&*Ji@0>Oi@x%C^GyPko zJwnyhw_=4TS^C_`U;tSCzcs``GnwWH$YHU8L0rA;>bw>Iqsw<-x;MM*H0PEuE`|9d zTRABoI?kE7IvX&EAONwnbBtI!Pi=3V*JYckPmbl1yPp&djZLkcelIGl7<;ru8kUmY z2~T%$A;JBk&AUVJz>fEpw33Ri?CNMVuiSP3uz&3^n{zP7)*hb1Eh^UaAap}QPJ+FmU9*}_0nm)z&Cy%bb zb^*`{Y`F+oehhk@&9^(n8=4l}FZ!B5dH`K|w3H6yT5aewBTRKMVyZC6OA+D^Y7w9y zrR9w)I!TGPdhNVdoh=~YUb=N!WmNT6Wk*lcc>61Yk|fKEK0CUBNYS~>-nJw%L^}4O zv`>uMZzbQsA=2n4Nl!X@efhbVr@AwFH>vz{_|1V-HG<$Z6C4#AKc*v@-fCjVTtUS+VLxEBBh?3*|t4PAi`xyMy0br1MDxNo&n9WTy(M=tA%LRV= znJ=B2SxW+wD(Jk*lciEi?#-^T=>|*!^+BGJ2}DGW3Sdz;+%)FaiYbhHE40`WI;&pS zu0x?;>3*Ht9(HzK-f(>lo&+T|Sa!gq%MP25PHCqFfG>X0VMj#gb0CftS%3qDF&pqm zJ@=2as~!5lqQ@VJfp(zLvjH_C2(|8m1?80Ic{_@Kmn^>=F&)@X?9s+RX)46pOvzGx zkp92=H2~!i&;|YsV`ZK&g&6!3Vsg_&E;3sCk7x^trYu!mDw%aPTIY>~v>`n+}7O0(V7qo-;R*jM0n^p45 zU;VtUuPk>_{`rf$>+;2+kb7Q;DG#}X3Cre3Q9dv$jJMFM43;@mC?gpUPCv-CV0w~g z!HGR^tUK5bFUu?4sKP#K0qw=S>er8r^PjDLSR_ULce*j-1k_R`K8AEO^1ZuBFID-1kM35!5Fkt`C+%;Y zIxPcsOW#aJ;#b~B;&AXu4|g5VrwqaYnBL*R?8AVRZo> z7jVP|wiDTemc9we12K_F%1ODaxk2)Dk5pF)-P|Y89ll*}Vf-YVn+(_|7KpFkz$~#{ z-p9u2QBOW9Lv2*k!G$17=7B8C*8qu=GaxVbJN+!_Gmj`o z;>dviER%mnfL=JTz0Hd%$Ca%1FVOZM^cL`p%u^;ppJp))tEdn?+mcSAs245UdgpmB zJVUlcnuj+^MIz{Xex@9qMkxGxeET*FL930tI{&BW_wQUL`ai`A$q{pW7?D_kdz#xH ze+%kZ`)Om_&lB}xYCjcC5yNbdR6TGUpB7{@RaHYc)R`d z3Zllv>D2739Fs)BMXc){iwHu75}_cA!4QbmQO+-;(f*`+aWQ>M)O!AOSeMK#N(ciZ zg81SVu))j&w)z$u0%1g3&DM<(@rJEsdADn+)_X6qJdIYchWR zHIca=i`l<{Zcyu_>uz@CFE|}s3sowt-Np-LNQI050K94@#Uvoi4jpzJ8%W^ zXb}f(Q8pJ2%Y@=j zuO|P|aIkQ0)z#^ExcV71{HSS(rKRF*j>oe24md!1m{G5YxNA%i5wd~hJ^}pJ$%0q& zesOr2RHQ|+whvQHx!ePY(a3bMf-SB~duz_a6-c;9mCfY?2#tEe(93AD)V!1E{g<)^ zaM5-5em>|c>TDhqqW2Tx0mL9?5dXU4D4(#dMv^c1UH=NG*I zSSN8M%T@``+~Oawuo`||b_jl`(>-t*%vlIgwh7>v5^8ftW14Oj@b{`=Q3eejNR+;( z!J`M6!)8Q4hPSIa8_5)S!q%)kam$5+a0g$0eV;1V!pt^LPn&V;gv>4q4rb{`5g2SE zr;{V(5rKZDdew*X$hRyn`%=RI6U3|UsT#x7+A)l87!v&0kVG4ijztmdg4Yitx1hQ? zd|6+hZgt+`?0vBM%kG+6sti{8lv;PtF(%A*ttk0%;Ww#{Jj*%Dy9J?2oFnn?Ag@r9 zZar8Y%NaF*fg1U7Sv&fAqiXmVq#0SRXB-ONYOg&i2X})L0fo@=-jN z1=Msux-nSf=AK6hQaC4P!1@thCEY}Z1jM1^^z zdGmWU{ef;WI@xH;&8L0BuzmlBnzWG99AE-$@V@_{FfD<4a2-%_0551vERc_6r(f7| zW^^=>_2O%z!MdABNL-)L^BUNw+`x)CyYZ0I%c;aX0Iyq4kUfN9nEO7C!1mAz3IBYl zIbg@gzDb(AC>)(~1?Q+(B+CGiNk=gF2IFm=4_6torxd8yPKYs~o8or!?1?MKf1p|RN*=XTQ z$#HKFx@~rRCh)9wjK-)m6S@9z_t-E9aX*nNWFBu{@2tDwB^FA#^yCXE7QR;sJ72%g zwJ+iC5ZHOS@y<38cE*16wz;y6oCmYyCS~ci#gK!Jd4sJ64z6)b`31XTQI+t|L6`T~ ztf-6+#C_iPeEks{oIoRy;<4t$?RM5r7MFqyH{!*kK3q`|%=j|G;Yh-Ycp71Gum4fkF1cYHi@zQ#$Z=y|K^vI7RYX5i#Ll5=BMQgC7bC*(x#Ax)bSoJUI`s5~1CxKyn?ne~6OoAUoQ(<|#RAV!7RVCrpcb zBXlt&)VkfM`#|Wa;E^Rj!5FaFp(Z9ba+qSGhA+n@CNXlZ`T{St$)haFMds8Y!A03h z&rAQ`TloGGM~`Cw%`6zh(oXVUoi4CFQ7%{omnZp+2W(n|2;V%YP|#v1JCsRqquv;B z!+W`}YCjDWm~Q3s4<4Ku+PJN~Tn@k}7<+{fj)(3zdOIA?PeeAK0fLf5B5@n>(gY}y z$^EFY69}m$hUPrOxshvA6uH-)Ck@2G)r)bIXZ4ilrlF~!r_7ti2^qj;tBs-4myZ)- zwFh*sm-t_BF(=SnSFfd(L?fiFT5@Ux={c5g2`B6#O+Esk(`8cp**j@6t4tZEXW2O! zl#zfPITZS;xH--?Y8c)JRVQWT+P_86czpIV$V}%LqB2RATmWCJj%VX;!ybp_#)t)Q%cUum(;7V2;A%$0;;dRZPXD zihXjV*WO4*WO1vc@uG)87{H%wGn6RJV^ak!1$o zzU+&vght$DmA>Hzi%d^p)a?-EHap2Ad*mObAWC znf1Hg=9<=g6GTD>Hb0UcZ|?T;?zoV}yk5q^L_^Y(W)^;;15r_`jmE<8L41Q0$H~K* z{cr7a(b;G_(K01d{hAsr8*k#;U)+t}zU}V=6_-ELjr;&NF?N>L!xrvE<+vqu=FYyQ zmr2IEQ|Ep9G;I}jMBHfIly|15{F6WSTrb9j9pv$%lX`Y3^>m$WAS#;ddt7V_=%^^3 zD_q=|v3q0Fh_qWP7+Up;tN8on{DxZN56jNt)qjn){tj1x-{C4?YWMG<*fu&04KMv$ zbDI&M>1e~VW7V%>9jbvP@eYvO#w>7$>=@`}NkX`bX z%}PK{A);9IGlaZ)E2`mrqvs#hAIHruUiCebo2ryL^946bQ8K1EQ^6$m0md^uH7_(V zb(-Yn9Hp{R9B>;xfQmU({c1eMJ(nGu%@kMkYv_!&T1NK8bAmgz8y6?oxoiLf!XUur zppt&F&=+xpNbwz5^AxI3ww~LF&$i_E=yptT?(IBCyO$Q+Bt_f-ON8zeGIkp4&rF=1(*5uK#qVdVZy_NDL zj9(#qjz+-men>*F$Ca+JijcIEtt>seC6oLrTTyZ0`6enuV;PN&p)YR80G|dAHRZ;e zqwg!CAI~-!MT)Vuo2St=;=oH>aTTI?7F|h*@ zQsY`Id2)#a@?~wH-Q40)Easq(ivw3nJ^(w%A3N|zRe8g>o+)-x&F>3bnz+}< zurrgfWfT-~*(RDT>+F7}kYG_<{!iktgUT6(t!X!(!;{*yHwU`+13sz^Aa8;bCe_v-&{6_*H?56Jhmv8oedMZF>lce+Ej25R4lxM~u+j3Yn zW48Q>u&+q`sA(8K(bj2bHkJEnNX)&P_w@Y>5IKxouhLC^cz)GwoSzY=mrq$xfo*-?hNs~E0USp@)KP|0ElO}uTQK3Cna!9aP zuCU0sl!vjxiGuhIB^LVaJD2pFDzfA3|eFuT| zn+!1v=kO(K+h+IZ3i`R|7~fywEvrB}^T(fK)*RaWAWQW)oIprH_G__Gw(7c^rf&cW znoKdcqSa^GuJ>2R4zXTN9F z@cO*KOuO3@HBwzxY$m@~n;@me20mMIKXqVvK1rbvL@DU?)P!o(T<+JD>8uniO|=hf zzFLAwDo`JIh3lyydZ8Uf7;!#DrzaDJ-D~TqsOlty#%5K=zA2`NZ&barx8{H3VmSkd z+(f7htF>6+5vKy-i1sB9dhy|LqiaN>*VRyrc{PhC>RogfLh^B2yb|zZi!fd6omYcR zizr=D6e^{TWEWui4D@oA=9o4bo|?a3$0?N95xi!#WN~3**4Nio`zB@i2>;Bv6bS+U+hRrm)E7VE-!v+8vC{`%4Kx@p)#Ju#x3Ld$$cW+?b zz`&c=4)^y3n&*M})uKv8+t&r0bX#xfd~3WQ~6?glSL2kuG?}s0S?}8r&GwR>7#C$ zq_1Of$vHgbQeV+LdZI_WZZ7$L!z(c6O9Qsyw&#YOR%GQK&os_Zu2F=9yACJrlB}p< zcAtGQ|C!SYnCgyVWi402glC}4a*DpDNKn=TJNexy3C%CMkG2WRcij3%ITDRDeCli; z{BJ9{TB`y~;2KcPZ8Rc_=()7qe3K1@ZS{Yf+W*#pv0fuPc7WZ^ibSzrBV;jV73k6} zww=>vi}7}DE+xIx-~-io9L<{otF1IbuFi1XRT!n6sF!t`$0ev|5mMFoDxJx2>%WfP$ZYtGj#$e!53w2sxtCM6YYs1eXRzo96tlMnhC3CXFv+>2kN4nR$ z_`=Zuu0)RG(Y-X&gdI=s-I3_-_Vi{J zgsVPIqrhy%)w_><7niy7D5I&G;+1nI9xaJm7MNmA+0~ODNoxsbr8OPJ4t{zs)9Z_jycIjBl9OlADnp~R+cd0^ z1QIZrO1ER*eJ0abZ2ZbCowY*=C%>d&>GPLFjCTN)hQIuYTtWNV?bSecEE5ksYZ1o_ z1Q>{@z`?Q9r(9SSzE$?-(crgaX&U!Whs&Pv=9<0~Cme$9*K&&P;BQ1RZx`N?e8PGW z#TfjI8qI>9pDGIHfXDnr$$?DK`)>zoyl!%5Qe0VY9KO!wucs+diI^N{!N5x}5~GRn zFT5s{E}U=7$yxDk@jkoDo(+nKkA5SvJHF*oYEj&}x_^Cin{~U0!^6 zw5?|m^`T+a;2{T{(JEm3L zlv7!~wjS6L{}?08tI^0Zwq0zy>2)!?u~mP(sMk5J@zqvxj919T_;K{q?NRv0Q_|y0 zk$`6~u<%G&R-Z)-Tr3>fST@i1kD5A0{m)y3ds8Qih(u>X*s-|3Zdt~)S@`5r3ug+P z*AICm>aIFISEAiNhC-tPt)7puS{Mj#bJ{h;SX8lBDtbde$)`x+7HO_f-FN%YaLeQL zZ(|jwv(<%N3r)s09RlRs8v1t}B*VTGf;!B;HcNT+?X@8fD#7x!`{U0%m-z{}*SG3V z*9I+yf6XbsT;*{1G6I$x!7eDz%{B3f^RsRXwT9B*+w@wkpk2j0In~8-X3C%6wMp*- z83znj@;oIbsRCC&0*9fBabmo-gWCv(fy#i6C5DbHKuK<2QS%T;nOY)wGC#oVAwt z%iD35^H#wLP(DQ}z4qkO56Bm(6y| z9Vavx_5g=M&0Lg2WlN}8GniC(J5IHXz)F_P&ccuLr&D<6GdPRI+Z)Y}otJx@TNT1W zddxl#Eqt`JCaB;gueStWYY)F#8o8o>wGg@a#2xpee^;+>oJolT%jaUK*?CtndiGF- zgE0O${X8q`F?Hod)FZa@GQ|^OaV&EZg9)}U-1pi^*yOR&+cv3};TbS<0?x7Qn_1<} zL@zz8HEl(SP3Q4-lPpSSQW(OlQ4hX1SC8#^K3uxj7?-+aHTPRRM*X-QZB>ucN&oL_489(<1v!0vs#HGjCgLLEz3|_Lo(jVN`uC2 zPV*JY41wBEVU(<7;b7C&>>UrXY z=9N*GtZ1X1f$Sh`BYjoC9YRy()83ZO;GXiGr21?hE!slddbWQ1cxw!F$$Kpafq+Rm z*y&oSddl|KU4~*w!ZwKAs~U#vqt2VyD-voE+|~ z;BoJ<1uGGgs--5VNlAkXn?w5LR&+ijAK!1ede?#?=9R|JBKRtHvuNw*6(VIXd zGgZX~3AN7mdf%hKL67hSyh(u%y67JnbssR7YE zaYC++$b8z8nK;*T^C+cRLiZ^KnmvD(jyg+pG@4S>oEUXkeb2|lo|hT5BTmAeb(@`1 zNL~FUTQ_Dqp)=R?JGG%D6@H23fTHi+DH@U`rRzCfP&LA?v;OBw#n?_h^rl@a(s@L;X-hA*VXO_ANYy7=`(UB-D-hy(HbQ797(HOoEs9n)nb!$caOPg8rrI ze(7Y2W*K7@Kn>XgiFptNuc8UtH$Tp&PU7TpD$qOXIetCx6g09bq!TpK{CdA)b=5Ga zZvIuW@eJv-jlZ!hdb!24z30)BQm8Sw?wi9l%kMn=JHi8N4e}bwa$;?+q0CVnbuFZ0 zrJMppkP1(x&TlTp{sUGVWf_oqqA8zWrL;D>{z6%hGf(+!ewNKkcfWz}*~IK^>D*OY zoNl3-=fr+{Ct~dyM^QFs%dIrSSNo9J6WbM$WYM`cWadioa}LploNZ?8+q?FlQX5vT zRTg)K?_d-g?rR_KlJI*^a?f*pMR;)+f$YLseo5#Z6j37K??Xd;TXzM;0&1^ClJ-IzT^#1Gn{HMSGU#tsLN5tq7k!kPpj{x)#4P07h zhl?i~AC;VMMhdg|$sQE1*VRYqR>S!Qa#Gc7mV0B7esHai7eU z0X!ZB{diH{`Ae;ND>qxy{-H!M71dr(mn5*Jnv>uIrVy!o&gA#zjltQJK?i*s;sq{yT`k=g|{t&#ECRlJCE!U2_YPot#R=ne$;K%TQJqTla_5UhD$0ujPf!50-|uEE#LVKAn1$$E3~W(630T z<6%R1$D~ni)8d>zG6N^%Q_+8fTzU&RH9=>KCL<3u2dE1)V>)P@>;G7rI?yjo82|j%9a_T2U?BcQ} ztZVDS<~O2_of88Yr}?s!0|M(ajHx#3_#L^5vvK!sp*~qSpf~0`wX7vGsZitI@07$r zEJ|%v$CzYYc%Km1k;&dYz4)uj-G`%WT7E>ca3j{ik?%b4j+I zk3@7sMZn$Y`|9_w|h@DZ8$~v-s ztz`aFq5~Ih($U4|H+gZQhUfdd?suD8m@K$(%n8{Wi^1{R>-Q?2KR2YPFXr{(vI#mr z=zH!c#z{`^U7aOcZI6msi*TcVRw^4u)pD0UyM6d2?-QkcS_5SAl{MB%N%T32!Y~t3(%vnG0$=2zd2!lmIEhq&LZ98lEXGEf1}q1RdXC0d&9lIVh4-zZkjNU67+$a$>%-SrAT8MIX`QyJ>K zKbZ|@J~ohZ_A{5X6q+D9CLSk2dC_9!`>+(@Jm$@nBqik9#s$WR2Bj_==7dvPx|7*F z7p_Hcy}Pur4!`c=E-pl{F3NWkuWPVy+1(yNER^KT`1CR>V@xsA4P$oVFac>m=nOhI z64MD%SU$Q)=Pwyvo?P)-lkYV*`ds33WGJ9(K@G|{s+|P2-i^?XSi$>D`!COS)Esww z{nfSs9+mt8@?Cz(DVSRL@OCgAn%)rS>($ow3(5`An77RvHnQRR4&;P-wxbpHx3l`X z_S}YSTH+nLmD;MS93;krR45*9bBbAL7>VcNe@ z^Z#7j8zH74G0g{&6d6$b}f{inU$sNz{9%kgZzGMFic6~BUmHuJiUtB$*3>fmN2 zw+{2VhR*GjtIEe)`N;r2H85@C!vT@jy!H8ws*Cx>{iCyHuw%b0>8eVPLTi`y#2gpr`&RQLhxd2aK!K`&mp0$(SM ztO)7osvZB@=$%aBQ>pMiE+zy!N4qflc$XS>h&~>SGQD>ZVsFY|s+sTk47DjHWZ!-)WHynA-`fTCfrOGtqtvpp1ZcR1D zCfNp!QSOXe*^XUJR~)I(Tro*dauDlKJ9-^UVWvVJ+L<^#yiW41WMj5x(Ar}q)r#%(~jfN)tAQmg{!lPT(VO1 zuSBC`th<-OjbER?zZPcIuhDkhcnxQ6@+9WDh&awb)Fary5Bp^;&3MUYmDGV;Q9|_q zp%OC@3C42K=DDtm0Bufo<$3&K#kRNE_l8#Pk8L$yXT}Ww%#HtK&;LFjzaQ}M8vZ{l zmOTFHQi1nA%(r9&jtQLYr*A~ni@rU}Hg^RNgKO2_1|=yz=Hg%r9Y#3XIKXpgCWG$> zIJUkam0K9GXNquCdA)HV>caxTCF| zWsK5J#Zy)1g#^b3O?S;;Ye;GZ>&+fTS=&IXu!ks799yi^&$qorVdUvC7IO*E0go2F zv+aZhy*s&JFBZS)_qVgDG%^i?S7@#?@rM@)s^;o-*&V03whX{wrdRa8G>h&mS-Oa8 zn5}eQV%00ZTH@9I-Lmbm`zYu@R39oj@u{EbiGN$Y45#=%o!37J5h!|vG?Z1p3b{50 zWdAO6KN$(q1nQLViwn*;VlOA@T3FlF$m3GLXvG#rZ^iR6nMoK|?|UMg`&$RBM=YN! z0kz7_r209N3&XELAwdJ?2(BNx{+GLFzYK*+Iy9b}lwjn(F}$1Tb{?tB);zigBib;#CX^Cl>D*oY)|W$D;ARqV&M9rS&fr#&1zANY5jS-^yRmn(sH?1`R1o$0$vSr{SM;5V#aUfo zw_JhV>3B79(%5V&-m1Y3YQ?e0mGq#*#N>)H}O1r3DeEIBddVeG%W_eP~tLDJp=$ozgR>r4e&!M=u zB;RYrT(3b{K#XvCYok zp%p8Iv)^2)qq=Ge0N8~`FTOnsC~fM9UaFeBV#Y#kEv1Shbb#9%MW`i>gF_J8G;Y#ZF=e?vbCPB`Jxfm%C52#yN znrJCx!d!Z@hI59YjaRb}-upS*c_R6$`B$yCk=@P!LPlyIpB34!UUs?kHN55KN&*0Z zGr(i9+Hh7G@;b z#_oEQs=uo;HaGU|tEiRowa?C-EIJq3EEq6Xdw1P?2Nu`xsi2<7Oga4GNQeRH%Xv-`Vx zY_XS%5A{2%H~n&<-QMi5>BsGiT3XRZ`$Nnt2hp%y(rCbkGI`_PTJ?q z?DY$;{MjdLG}mTFKy-@rdCSlD&lR8hGjlysbYt=0hawJOH&y1Ww%N;0b;7&! zz#6KEJEb^_w`boJVN2zZs zIwWl6-JHRLl+y5r7;t!wjhkbQSw+zt%Ik zX&XzwUOZkvm%6|POsr;S78zo3IZpRV=>T2#;ACMIj#$JNca3JivSwSNSZ^b`6YvD) zXjX#6!DvPydP1%r1MD RBv}R^@O1TaS?83{1OWTI^Nauh literal 0 HcmV?d00001 From 55f17a27b1a5d9dfe36ed2ed794ee92dfe254684 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:15:06 +0200 Subject: [PATCH 12/90] readme update --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 41eb2fb4..fb0f48c3 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# DICHO +# Dicho di Hubentut +## Youth poetry + +### Projectweek 3: Hackathon +Teammates: +- Jevona Magdalena +- Keïsha Alexander + +## Concept +Voor de + +--- +## Inhoudsopgave + + + +--- \ No newline at end of file From 66a58bca249fecc1823f041cd3cf90d375b057a3 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:15:39 +0200 Subject: [PATCH 13/90] updated package-lock.json --- package-lock.json | 60 +++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36f60336..9e25cd89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -237,25 +237,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -712,12 +693,11 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-symbols": { @@ -1063,12 +1043,33 @@ "ms": "^2.1.1" } }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/nodemon/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -1439,15 +1440,14 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/to-regex-range": { From 621dd2ee9560ab1c854a3e90e16b130d9be3534e Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:15:51 +0200 Subject: [PATCH 14/90] header added --- views/partials/header.ejs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/views/partials/header.ejs b/views/partials/header.ejs index e69de29b..d693e643 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -0,0 +1,4 @@ +

\ No newline at end of file From 7cc1b095e977d65cbe9d7ebff904865956646464 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:16:10 +0200 Subject: [PATCH 15/90] routing for the poems page --- routes/poems.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/routes/poems.js b/routes/poems.js index d9aa16fd..732b7cc0 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -8,4 +8,12 @@ router.get('/', function (req, res) { }); }); +router.get('/poems', (req, res)=>{ + res.render('poems',{ + title: 'Make your poems' + } + + ) +}) + module.exports = router; \ No newline at end of file From 18f1843bfd222191c85c57b35d8478c6b1d5d86c Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:16:33 +0200 Subject: [PATCH 16/90] poems page setup --- views/poems.ejs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/views/poems.ejs b/views/poems.ejs index e69de29b..80ca91ef 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -0,0 +1,18 @@ + + + + + <%- include('./partials/head'); %> + + + +
+ <%- include('./partials/header'); %> +
+ +
+ <%- include('./partials/footer'); %> +
+ + + \ No newline at end of file From cc0f8161120c36bb9502eb106ddf5b3ee15fdbc5 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Tue, 11 Apr 2023 23:16:47 +0200 Subject: [PATCH 17/90] header css styling --- public/styles/style.css | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index 76d78de1..945fad0d 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -41,4 +41,24 @@ li { a { text-decoration: none; -} \ No newline at end of file +} + +/**********/ +/* HEADER */ +/**********/ +header nav { + display: flex; + align-items: center; +} + +header nav img { +width: 10%; +} +header ul li:first-of-type { + width: fit-content; +} + +header nav p { + font-weight: 500; +} + From 89b4e0dd602db9ce37f34206887e795d992a4888 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 10:49:01 +0200 Subject: [PATCH 18/90] css styling --- public/styles/style.css | 133 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 6 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 945fad0d..97c4a137 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -12,10 +12,10 @@ --light-grey: #e2e2e2; --black: #000000; - --title: 'Commissioner', Arial, + --title: 'Commissioner', Arial, Helvetica, sans-serif; - --text: 'Commissioner', Arial, + --text: 'Commissioner', Arial, Helvetica, sans-serif; @@ -24,15 +24,18 @@ body { font-family: var(--text); + position: relative; + height: 100vh; + background-color: var(--light-grey); } -h1{ +h1 { font-family: var(--title); font-weight: 500; } -p{ -font-weight: 400; +p { + font-weight: 400; } li { @@ -52,8 +55,9 @@ header nav { } header nav img { -width: 10%; + width: 10%; } + header ul li:first-of-type { width: fit-content; } @@ -62,3 +66,120 @@ header nav p { font-weight: 500; } +/**********************/ +/* DECORATION GROUP 1 */ +/**********************/ +.background-decoration-1 { + z-index: -1; + border-radius: 3em; + position: absolute; + top: 3em; + right: 0; + + +} + +.background-decoration-1 figure { + /* background-color: #feb63d; */ + border-radius: 4em; + width: 7em; + height: 3em; +} + +.background-decoration-1 figure:nth-of-type(1) { + background-color: var(--light-grey); + border: 3px solid var(--orange-yellow); +} + +.background-decoration-1 figure:nth-of-type(2) { + background-color: var(--orange-yellow); + height: 1.5em; + width: 9em; +} + +.background-decoration-1 figure:nth-of-type(3) { + background-color: var(--coral-deeppink); + width: 7em; + height: 3em; +} + +/*********************************/ +/* BACHGROUND-DECORATION GROUP 2 */ +/*********************************/ +.background-decoration-2 { + z-index: -1; + border-radius: 3em; + position: absolute; + bottom: 2em; + right: 0; + +} + +.background-decoration-2 figure { + /* background-color: #feb63d; */ + border-radius: 4em; + width: 7em; + height: 3em; +} + +.background-decoration-2 figure:nth-of-type(1) { + background-color: var(--coral-deeppink); + width: 10em; +} + +.background-decoration-2 figure:nth-of-type(2) { + background-color: var(--orange-yellow); + height: 1.5em; + width: 5em; +} + +.background-decoration-2 figure:nth-of-type(3) { + background-color: var(--light-grey); + border: 3px solid var(--coral-deeppink); + width: 12em; + +} + +/**********************/ +/* DECORATION GROUP 3 */ +/**********************/ +.background-decoration-3 { + z-index: -1; + border-radius: 3em; + position: absolute; + bottom: 2em; + left: 0; + +} + +.background-decoration-3 figure { + /* background-color: #feb63d; */ + border-radius: 4em; + width: 7em; + height: 3em; +} + +.background-decoration-3 figure:nth-of-type(1) { + background-color: var(--coral-deeppink); + width: 6em; +} + + +.background-decoration-3 figure:nth-of-type(2) { + border: 3px solid var(--black); + width: 12em; +} + + +@media (max-width: 30em) { + + .background-decoration-1, + .background-decoration-2, + .background-decoration-3 { + display: none; + } +} + +/********/ +/* MAIN */ +/********/ \ No newline at end of file From 2dc20e9c15b1b99f18810f4e26ed8270053d36a7 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 10:49:09 +0200 Subject: [PATCH 19/90] working on the index --- package-lock.json | 60 ++++++++++++++++++++-------------------- public/scripts/script.js | 3 ++ public/styles/style.css | 10 +++---- views/generate-poems.ejs | 0 views/index.ejs | 4 +++ views/partials/head.ejs | 2 +- 6 files changed, 43 insertions(+), 36 deletions(-) create mode 100644 views/generate-poems.ejs diff --git a/package-lock.json b/package-lock.json index 36f60336..9e25cd89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -237,25 +237,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -712,12 +693,11 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-symbols": { @@ -1063,12 +1043,33 @@ "ms": "^2.1.1" } }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/nodemon/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -1439,15 +1440,14 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/to-regex-range": { diff --git a/public/scripts/script.js b/public/scripts/script.js index e69de29b..73a5588d 100644 --- a/public/scripts/script.js +++ b/public/scripts/script.js @@ -0,0 +1,3 @@ +const startWord = document.querySelector("main a"); + +console.log(startWord); \ No newline at end of file diff --git a/public/styles/style.css b/public/styles/style.css index 76d78de1..6881fc05 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -12,10 +12,10 @@ --light-grey: #e2e2e2; --black: #000000; - --title: 'Commissioner', Arial, + --title: 'Commissioner', Arial, Helvetica, sans-serif; - --text: 'Commissioner', Arial, + --text: 'Commissioner', Arial, Helvetica, sans-serif; @@ -26,13 +26,13 @@ body { font-family: var(--text); } -h1{ +h1 { font-family: var(--title); font-weight: 500; } -p{ -font-weight: 400; +p { + font-weight: 400; } li { diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs new file mode 100644 index 00000000..e69de29b diff --git a/views/index.ejs b/views/index.ejs index 80ca91ef..2d9ff1f8 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -10,6 +10,10 @@ <%- include('./partials/header'); %> +
+
<%- include('./partials/footer'); %>
diff --git a/views/partials/head.ejs b/views/partials/head.ejs index a4e10ae3..0e639b35 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -7,7 +7,7 @@ Dicho di Hubentut - + From 52e34ad66746e01a35f94a0cc72e2b7282a46eeb Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 10:50:44 +0200 Subject: [PATCH 20/90] API setup --- routes/poems.js | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/routes/poems.js b/routes/poems.js index 732b7cc0..3d6fd025 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -1,6 +1,14 @@ const express = require('express'); const request = require('request'); const router = express.Router(); +const API_KEY = 'dichter-a6a8ae46-4c90' +const options = { + url: 'https://dichter.responsible-it.nl/api/poetry?type=5&theme=mooi bos warme zomerdag', + headers: { + 'Authorization': `Bearer ${API_KEY}`, + 'Content-Type': 'application/json' + } +} router.get('/', function (req, res) { res.render('index', { @@ -9,11 +17,20 @@ router.get('/', function (req, res) { }); router.get('/poems', (req, res)=>{ - res.render('poems',{ - title: 'Make your poems' - } - - ) + request.get(options, (error, response, body)=>{ + if(error){ + res.send(error) + console.log(error) + }else { + console.log(body) + res.render('poems', { + title: 'Maak je gedichten', + poemsData: body + }); + } + }) + }) + module.exports = router; \ No newline at end of file From 095d0722bf1aefe89c39c5d5d3d283bd2bfb4820 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 10:51:02 +0200 Subject: [PATCH 21/90] manifest.json commented --- views/partials/head.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/partials/head.ejs b/views/partials/head.ejs index a4e10ae3..0e639b35 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -7,7 +7,7 @@ Dicho di Hubentut - + From 91ae981deef24c16b7c1ad1b078de3fa3dddee9f Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 10:51:14 +0200 Subject: [PATCH 22/90] template engine --- views/poems.ejs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/views/poems.ejs b/views/poems.ejs index 80ca91ef..cb707106 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -10,9 +10,67 @@ <%- include('./partials/header'); %> +
+ +
+
+
+

Maak je eigen gedichten

+ +
+ Kies je eigen thema +
    +
  • +
+
+ + +
+ +
+ + +
+
+
+ + + + + + + + + + + +
+
<%- include('./partials/footer'); %>
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+ + + + + \ No newline at end of file From 30b691d758a06a9db5abc92b18f2ddd626d3c1b0 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 10:51:21 +0200 Subject: [PATCH 23/90] package update --- package-lock.json | 223 +++++++++++++++++++++++++++++++++++++++------- package.json | 1 - 2 files changed, 189 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e25cd89..5f8b9831 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "ejs": "^3.1.9", "express": "^4.18.2", - "express-minify-html": "^0.12.0", + "express-minify-html": "^0.10.0", "request": "^2.88.2" }, "devDependencies": { @@ -51,6 +51,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -217,11 +230,31 @@ "upper-case": "^1.1.1" } }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -265,9 +298,9 @@ } }, "node_modules/clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.13.tgz", + "integrity": "sha512-QaBjQEHrnq6nHpW1T7zXBrBBnPOcYLdXXVqLzbzt4X+ktcYCPdeQ35g3X8mFdKA8mln/EX2p0jMKB6LPmKQ6mg==", "dependencies": { "source-map": "0.5.x" }, @@ -275,6 +308,21 @@ "node": ">= 4.0" } }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/clone-function": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/clone-function/-/clone-function-1.0.6.tgz", + "integrity": "sha512-xI38lcQwn82379jMLIHwBKEhV4xItrSPB3tH9PC8TmEKzFlkj5zgwGcyzXN492GAtb2/IxDSjXellM0fdy3JwQ==" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -303,9 +351,15 @@ } }, "node_modules/commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -368,6 +422,14 @@ "ms": "2.0.0" } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -484,12 +546,12 @@ } }, "node_modules/express-minify-html": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", - "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.10.0.tgz", + "integrity": "sha512-Cq534cZeZRh1lO/mfmZXuEPJSkvFJ7tk9wJeZwsFv6t2ncEe5ou//e2mS+mGfqASSg2lF/C2rPFxTykhsi/txw==", "dependencies": { - "html-minifier": "3.5.7", - "lodash.merge": "4.6.0" + "html-minifier": "3.4.1", + "object-merge": "2.5.1" } }, "node_modules/extend": { @@ -660,6 +722,11 @@ "node": ">= 6" } }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -720,18 +787,18 @@ } }, "node_modules/html-minifier": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", - "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.4.1.tgz", + "integrity": "sha512-/EFUlY7bAU4EzkJfCMIj5Bdim+6LSnCE99xDxXES+M3X7dsfVkRmiuT7NxhNtopaGoqfzPLP9T1JukGMRee5eg==", "dependencies": { "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.12.x", + "clean-css": "4.0.x", + "commander": "2.9.x", "he": "1.1.x", "ncname": "1.0.x", "param-case": "2.1.x", "relateurl": "0.2.x", - "uglify-js": "3.2.x" + "uglify-js": "2.8.x" }, "bin": { "html-minifier": "cli.js" @@ -811,6 +878,11 @@ "node": ">=8" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -902,10 +974,32 @@ "node": ">=0.6.0" } }, - "node_modules/lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/lower-case": { "version": "1.1.4", @@ -1102,6 +1196,11 @@ "node": "*" } }, + "node_modules/object-foreach": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/object-foreach/-/object-foreach-0.1.2.tgz", + "integrity": "sha512-q9B0lqCsKtLtvE00OvHR0RgiyRsNOk33wMI1g1NdVJLUlUI4CWfNHY8XUThuXpfxTbb/dut4yAYfNYDjiiBMtQ==" + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -1110,6 +1209,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-merge": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/object-merge/-/object-merge-2.5.1.tgz", + "integrity": "sha512-kTM4Q/vbloBFJxfbEI0qW6gOJV78k8irJlr1R9l15dWOfAkxtjarevZJyXxJlAEUWuz1wa7ni7eRgVujP0m8TA==", + "dependencies": { + "clone-function": ">=1.0.1", + "object-foreach": ">=0.1.2" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -1246,6 +1354,14 @@ "node": ">= 0.10" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1285,6 +1401,17 @@ "node": ">=0.6" } }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1523,27 +1650,28 @@ } }, "node_modules/uglify-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", - "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", "dependencies": { - "commander": "~2.12.1", - "source-map": "~0.6.1" + "source-map": "~0.5.1", + "yargs": "~3.10.0" }, "bin": { "uglifyjs": "bin/uglifyjs" }, "engines": { "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" } }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true }, "node_modules/undefsafe": { "version": "2.0.5", @@ -1610,6 +1738,22 @@ "extsprintf": "^1.2.0" } }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xml-char-classes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", @@ -1617,6 +1761,17 @@ "engines": { "node": ">=0.10.0" } + }, + "node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } } } } diff --git a/package.json b/package.json index 6ff02e35..a39d9df7 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "dependencies": { "ejs": "^3.1.9", "express": "^4.18.2", - "express-minify-html": "^0.12.0", "request": "^2.88.2" }, "devDependencies": { From 5994edaabe14ebb5a603a7c7c4ffea8140eb2ca2 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 10:57:10 +0200 Subject: [PATCH 24/90] Delete package-lock.json Not needed --- package-lock.json | 1777 --------------------------------------------- 1 file changed, 1777 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 5f8b9831..00000000 --- a/package-lock.json +++ /dev/null @@ -1,1777 +0,0 @@ -{ - "name": "dicho-hackaton", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "dicho-hackaton", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "ejs": "^3.1.9", - "express": "^4.18.2", - "express-minify-html": "^0.10.0", - "request": "^2.88.2" - }, - "devDependencies": { - "nodemon": "^2.0.22" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/clean-css": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.0.13.tgz", - "integrity": "sha512-QaBjQEHrnq6nHpW1T7zXBrBBnPOcYLdXXVqLzbzt4X+ktcYCPdeQ35g3X8mFdKA8mln/EX2p0jMKB6LPmKQ6mg==", - "dependencies": { - "source-map": "0.5.x" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/clone-function": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/clone-function/-/clone-function-1.0.6.tgz", - "integrity": "sha512-xI38lcQwn82379jMLIHwBKEhV4xItrSPB3tH9PC8TmEKzFlkj5zgwGcyzXN492GAtb2/IxDSjXellM0fdy3JwQ==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-minify-html": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.10.0.tgz", - "integrity": "sha512-Cq534cZeZRh1lO/mfmZXuEPJSkvFJ7tk9wJeZwsFv6t2ncEe5ou//e2mS+mGfqASSg2lF/C2rPFxTykhsi/txw==", - "dependencies": { - "html-minifier": "3.4.1", - "object-merge": "2.5.1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-minifier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.4.1.tgz", - "integrity": "sha512-/EFUlY7bAU4EzkJfCMIj5Bdim+6LSnCE99xDxXES+M3X7dsfVkRmiuT7NxhNtopaGoqfzPLP9T1JukGMRee5eg==", - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.0.x", - "commander": "2.9.x", - "he": "1.1.x", - "ncname": "1.0.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "2.8.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", - "dependencies": { - "xml-char-classes": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-foreach": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/object-foreach/-/object-foreach-0.1.2.tgz", - "integrity": "sha512-q9B0lqCsKtLtvE00OvHR0RgiyRsNOk33wMI1g1NdVJLUlUI4CWfNHY8XUThuXpfxTbb/dut4yAYfNYDjiiBMtQ==" - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-merge": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/object-merge/-/object-merge-2.5.1.tgz", - "integrity": "sha512-kTM4Q/vbloBFJxfbEI0qW6gOJV78k8irJlr1R9l15dWOfAkxtjarevZJyXxJlAEUWuz1wa7ni7eRgVujP0m8TA==", - "dependencies": { - "clone-function": ">=1.0.1", - "object-foreach": ">=0.1.2" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "optional": true - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } -} From 06d013590784f4f81cc0aef6d07c1fbf8fab06fd Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 11:03:35 +0200 Subject: [PATCH 25/90] package --- package-lock.json | 1622 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1622 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..9e25cd89 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1622 @@ +{ + "name": "dicho-hackaton", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dicho-hackaton", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ejs": "^3.1.9", + "express": "^4.18.2", + "express-minify-html": "^0.12.0", + "request": "^2.88.2" + }, + "devDependencies": { + "nodemon": "^2.0.22" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "dependencies": { + "source-map": "0.5.x" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-minify-html": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", + "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", + "dependencies": { + "html-minifier": "3.5.7", + "lodash.merge": "4.6.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", + "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.12.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.2.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", + "dependencies": { + "xml-char-classes": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", + "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", + "dependencies": { + "commander": "~2.12.1", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", + "engines": { + "node": ">=0.10.0" + } + } + } +} From 1fd9171db1e3b078b6dd40aa74f55aa64492cbbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 11:43:56 +0200 Subject: [PATCH 26/90] readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fb0f48c3..93b12f19 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Teammates: - Jevona Magdalena - Keïsha Alexander +- hilal ## Concept Voor de From 0a772a9f35571cddfca83f00d443fddfaf9b8bca Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 11:49:47 +0200 Subject: [PATCH 27/90] start page important part done --- public/scripts/script.js | 33 ++++++++++- public/styles/style.css | 125 +++++++++++++++++++++++++++++++++++++-- views/index.ejs | 10 +--- 3 files changed, 155 insertions(+), 13 deletions(-) diff --git a/public/scripts/script.js b/public/scripts/script.js index 73a5588d..f60ab3c8 100644 --- a/public/scripts/script.js +++ b/public/scripts/script.js @@ -1,3 +1,32 @@ -const startWord = document.querySelector("main a"); +const words = ["Dicho", "Poetry", "Gedichten", "Poemas", "시", "Poèmes"]; +const linkElements = document.querySelectorAll(".link"); -console.log(startWord); \ No newline at end of file +function animateWords() { + linkElements.forEach((linkElement) => { + const text = words[Math.floor(Math.random() * words.length)]; + const splitText = text.split(""); + const innerHTML = splitText + .map( + (word) => + `${word + .split("") + .map((char) => (char === " " ? " " : char)) + .join("")}` + ) + .join(""); + linkElement.innerHTML = `
${innerHTML}
`; + linkElement.classList.add("animate"); + + const duration = (splitText.length * 0.5) / 2 + "s"; + const lineHeight = linkElement.offsetHeight + "px"; + const lineX = linkElement.offsetHeight - 5 + "px"; + + linkElement.style.setProperty("--duration", 2.5 + "s"); + linkElement.style.setProperty("--line-d", duration); + linkElement.style.setProperty("--line-height", lineHeight); + linkElement.style.setProperty("--line-x", lineX); + }); +} + +animateWords(); +setInterval(animateWords, 3000); diff --git a/public/styles/style.css b/public/styles/style.css index 97c4a137..86c1ba8b 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -19,16 +19,26 @@ Helvetica, sans-serif; + --text-color: #2b3044; + --font-size: 16px; + --duration: 2.5s; + --duration-line: 0.84s; } - body { font-family: var(--text); position: relative; - height: 100vh; + min-height: 100vh; background-color: var(--light-grey); } +#start main{ + /* min-height: 100vh; */ + display: flex; + justify-content: center; + align-items: center; +} + h1 { font-family: var(--title); font-weight: 500; @@ -55,7 +65,7 @@ header nav { } header nav img { - width: 10%; + width: 20%; } header ul li:first-of-type { @@ -64,6 +74,7 @@ header ul li:first-of-type { header nav p { font-weight: 500; + font-size: clamp(3em, 2vw, 8em); } /**********************/ @@ -182,4 +193,110 @@ header nav p { /********/ /* MAIN */ -/********/ \ No newline at end of file +/********/ + + + + +#start main p { + font-size: 18px; + margin: 0; + color: var(--text-color); + font-size: var(--font-size); + line-height: var(--font-size); + zoom: 1.5; +} + + +#start main p .link { + display: inline-block; + text-decoration: none; + color: inherit; +} + +#start main p .link div:first-child { + display: flex; + overflow: hidden; + text-shadow: 0 var(--font-size) 0 var(--text-color); +} + +#start main p .link div:last-child { + display: block; + position: absolute; + right: 0; + top: 0; + width: 300%; + height: 5px; + transform: translateY(var(--line-x)) translateZ(0); + transition: transform var(--line-d, 0s); +} + +#start main p .link div span { + display: inline-block; + backface-visibility: hidden; + font-style: normal; + animation: moveText var(--duration) ease infinite; + transform: translateY(var(--m, 0)); +} + +@keyframes moveText { + 0% { + transform: translateY(0); + } + + 50% { + transform: translateY(calc(var(--font-size) * -1)); + } + + 100% { + transform: translateY(0); + } +} + +#start main p .link div span:nth-child(1) { + transition-delay: 0s; +} + +#start main p .link div span:nth-child(2) { + transition-delay: 0.05s; +} + +#start main p .link div span:nth-child(3) { + transition-delay: 0.1s; +} + +#start main p .link div span:nth-child(4) { + transition-delay: 0.15s; +} + +#start main p .link div span:nth-child(5) { + transition-delay: 0.2s; +} + +#start main p .link div span:nth-child(6) { + transition-delay: 0.25s; +} + +#start main p .link div span:nth-child(7) { + transition-delay: 0.3s; +} + +#start main p .link div span:nth-child(8) { + transition-delay: 0.35s; +} + +#start main p .link div span:nth-child(9) { + transition-delay: 0.4s; +} + +#start main p .link div span:nth-child(10) { + transition-delay: 0.45s; +} + +#start main p .link div span:nth-child(11) { + transition-delay: 0.5s; +} + +#start main p .link:hover span { + transform: translateY(calc(var(--font-size) * -1)); +} \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index 2d9ff1f8..61bd1c0c 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -5,18 +5,14 @@ <%- include('./partials/head'); %> - +
<%- include('./partials/header'); %>
-

+

- -
- <%- include('./partials/footer'); %> -
- + \ No newline at end of file From 1092b660cd8067f944826bdecb7f6e0450164da1 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 11:55:53 +0200 Subject: [PATCH 28/90] new collabrator --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a39d9df7..7f3d206f 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "AI", "Poetry" ], - "author": "Keïsha Alexander & Jevona Magdalena", + "author": "Keïsha Alexander, Jevona Magdalena & Hilal Tapan", "license": "MIT", "bugs": { "url": "https://github.com/RainbowJM/dicho-hackaton/issues" From 87a29459ab0a3d6901b65726c3dc473a06869af8 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 12:13:42 +0200 Subject: [PATCH 29/90] started with the offline page --- routes/poems.js | 20 ++++++++++++-------- views/offline.ejs | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/routes/poems.js b/routes/poems.js index 3d6fd025..e67630b0 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -16,21 +16,25 @@ router.get('/', function (req, res) { }); }); -router.get('/poems', (req, res)=>{ - request.get(options, (error, response, body)=>{ - if(error){ +router.get('/poems', (req, res) => { + request.get(options, (error, response, body) => { + if (error) { res.send(error) console.log(error) - }else { + } else { console.log(body) res.render('poems', { - title: 'Maak je gedichten', - poemsData: body + title: 'Make your poem', + poemsData: body }); } - }) + }); +}); +router.get('/offline', function(req, res) { + res.render('offline', { + title: 'Offline page' + }) }) - module.exports = router; \ No newline at end of file diff --git a/views/offline.ejs b/views/offline.ejs index e69de29b..3f475176 100644 --- a/views/offline.ejs +++ b/views/offline.ejs @@ -0,0 +1,17 @@ + + + + + <%- include('./partials/head'); %> + + + +
+ <%- include('./partials/header'); %> +
+ +
+

You are offline

+
+ + \ No newline at end of file From 285e9603b499dbc009c63666dcbee193fdb55b11 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 12:20:42 +0200 Subject: [PATCH 30/90] css wolks --- public/styles/style.css | 19 ++++++++++++------- views/index.ejs | 2 ++ views/partials/background-decoration.ejs | 16 ++++++++++++++++ views/poems.ejs | 18 +----------------- 4 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 views/partials/background-decoration.ejs diff --git a/public/styles/style.css b/public/styles/style.css index 86c1ba8b..d0ccb1cb 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -32,12 +32,7 @@ body { background-color: var(--light-grey); } -#start main{ - /* min-height: 100vh; */ - display: flex; - justify-content: center; - align-items: center; -} + h1 { font-family: var(--title); @@ -92,26 +87,31 @@ header nav p { .background-decoration-1 figure { /* background-color: #feb63d; */ + margin: 1em; border-radius: 4em; width: 7em; height: 3em; } .background-decoration-1 figure:nth-of-type(1) { + width: 10em; background-color: var(--light-grey); border: 3px solid var(--orange-yellow); + transform: translateX(5em); } .background-decoration-1 figure:nth-of-type(2) { background-color: var(--orange-yellow); height: 1.5em; width: 9em; + transform: translateX(-3em); } .background-decoration-1 figure:nth-of-type(3) { background-color: var(--coral-deeppink); width: 7em; height: 3em; + transform: translateX(7em); } /*********************************/ @@ -195,7 +195,12 @@ header nav p { /* MAIN */ /********/ - +#start main { + min-height: 50vh; + display: flex; + justify-content: center; + align-items: center; +} #start main p { diff --git a/views/index.ejs b/views/index.ejs index 61bd1c0c..f2c20766 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -13,6 +13,8 @@

+ + <%- include('./partials/background-decoration'); %> \ No newline at end of file diff --git a/views/partials/background-decoration.ejs b/views/partials/background-decoration.ejs new file mode 100644 index 00000000..880cde0e --- /dev/null +++ b/views/partials/background-decoration.ejs @@ -0,0 +1,16 @@ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/views/poems.ejs b/views/poems.ejs index cb707106..392a251e 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -50,23 +50,7 @@ <%- include('./partials/footer'); %> -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
- +<%- include('./partials/background-decoration'); %> From e8487a51d7ec3d34339d9bde661c9b3bd62b6b86 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 12:32:34 +0200 Subject: [PATCH 31/90] offline done --- public/styles/style.css | 16 ++++++++++++++-- views/offline.ejs | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 86c1ba8b..7239ec67 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -195,8 +195,21 @@ header nav p { /* MAIN */ /********/ +#offline main { + min-height: 50vh; + display: flex; + justify-content: center; + align-items: center; +} - +#offline main p { + font-size: 18px; + margin: 0; + color: var(--text-color); + font-size: var(--font-size); + line-height: var(--font-size); + zoom: 1.5; +} #start main p { font-size: 18px; @@ -207,7 +220,6 @@ header nav p { zoom: 1.5; } - #start main p .link { display: inline-block; text-decoration: none; diff --git a/views/offline.ejs b/views/offline.ejs index 3f475176..aa0b6839 100644 --- a/views/offline.ejs +++ b/views/offline.ejs @@ -5,7 +5,7 @@ <%- include('./partials/head'); %> - +
<%- include('./partials/header'); %>
From a729b270abcdfbba0cc4f63a705cafffb8f25c59 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 12:33:30 +0200 Subject: [PATCH 32/90] typo fixed --- public/styles/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index 7239ec67..a8087320 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -115,7 +115,7 @@ header nav p { } /*********************************/ -/* BACHGROUND-DECORATION GROUP 2 */ +/* DECORATION GROUP 2 */ /*********************************/ .background-decoration-2 { z-index: -1; From e4eca0122414244c353fb30248b00acb44e42823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 12:48:06 +0200 Subject: [PATCH 33/90] loading --- package-lock.json | 153 ------------------------------------- public/styles/style.css | 121 ++++++++++++++++++++++++++++- views/index.ejs | 1 + views/partials/loading.ejs | 10 +++ 4 files changed, 131 insertions(+), 154 deletions(-) create mode 100644 views/partials/loading.ejs diff --git a/package-lock.json b/package-lock.json index 9e25cd89..04e43de4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "ejs": "^3.1.9", "express": "^4.18.2", - "express-minify-html": "^0.12.0", "request": "^2.88.2" }, "devDependencies": { @@ -208,15 +207,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -264,17 +254,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", - "dependencies": { - "source-map": "0.5.x" - }, - "engines": { - "node": ">= 4.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -302,11 +281,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -483,15 +457,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express-minify-html": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/express-minify-html/-/express-minify-html-0.12.0.tgz", - "integrity": "sha512-T31JAiPYPCosfiBeKX5CTkIUhbs78NHAn8dfvX4T5wz1PRLkgGJmLqEzDk1BgIzzzXcmbsof9YtNF6cJQEsPrw==", - "dependencies": { - "html-minifier": "3.5.7", - "lodash.merge": "4.6.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -711,35 +676,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-minifier": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", - "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.12.x", - "he": "1.1.x", - "ncname": "1.0.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.2.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -902,16 +838,6 @@ "node": ">=0.6.0" } }, - "node_modules/lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha512-yP6Me/9MwNfgOdUmMspV4xyjBVktgzlKDYLC9tSmldZGD7stwi6D+bbKihbMDLvFWnP9hr44lidKv5ETe82DKQ==" - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -979,17 +905,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", - "dependencies": { - "xml-char-classes": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -998,14 +913,6 @@ "node": ">= 0.6" } }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -1121,14 +1028,6 @@ "node": ">= 0.8" } }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dependencies": { - "no-case": "^2.2.0" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1238,14 +1137,6 @@ "node": ">=8.10.0" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1399,14 +1290,6 @@ "semver": "bin/semver.js" } }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -1522,29 +1405,6 @@ "node": ">= 0.6" } }, - "node_modules/uglify-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", - "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", - "dependencies": { - "commander": "~2.12.1", - "source-map": "~0.6.1" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -1559,11 +1419,6 @@ "node": ">= 0.8" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1609,14 +1464,6 @@ "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } - }, - "node_modules/xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", - "engines": { - "node": ">=0.10.0" - } } } } diff --git a/public/styles/style.css b/public/styles/style.css index 86c1ba8b..b5d4c6dd 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -299,4 +299,123 @@ header nav p { #start main p .link:hover span { transform: translateY(calc(var(--font-size) * -1)); -} \ No newline at end of file +} + + + + +/**********************/ +/* LOADING STATE 1 */ +/**********************/ +#loading { + /* --length:5; */ + /* --length:7; */ + --length:8; + --duration:2; + + margin:0; + padding:.5em 1em; + border-radius:1em; + list-style:none; + display:flex; + gap:.1em; + border:solid .05em #ff4a61; + background-color:#ff4a61; + font-size:3em; + + } + + /************/ + /* A SQUARE */ + /************/ + @keyframes squash-animation { + 0% { transform: none; } + 10.5% { transform: scale(1.2, .8); } + 21% { transform: scale(.9, 1.1); } + 27% { + transform: scale(1.35, .65); + animation-timing-function:cubic-bezier(0.165, 0.840, 0.440, 1.000); + } + 45% { + transform: translatey(-.5em) scale(1, 1.3); + animation-timing-function:cubic-bezier(0.895, 0.030, 0.685, 0.220); + } + 63% { transform: scale(2, .5); } + 72% { transform: scale(.8, 1.2); } + 78% { transform: scale(1.1, .9); } + 82.5% { transform: scale(.95, 1.05); } + 87% { transform: scale(1.02, .98); } + 90%, + 100% { transform: none; } + } + + li { + width:1em; + aspect-ratio:2; + font-size:.5em; + color:white; + transform-origin:bottom; + font-family--text: 'Commissioner', Arial, + Helvetica, + sans-serif; + + animation-name:squash-animation; + animation-duration:calc( var(--duration) * 1.4s ); + animation-iteration-count:infinite; + animation-fill-mode:backwards; + animation-delay:calc( var(--duration) * 1s / var(--length) * ( var(--index) - var(--length) ) ); + } + + #loading > li:nth-of-type(1) { + /* --delay:0s; */ + --index:0; + } + + #loading > li:nth-of-type(2) { + /* --delay:.25s; */ + --index:1; + } + + #loading > li:nth-of-type(3) { + /* --delay:.5s; */ + --index:2; + } + + #loading > li:nth-of-type(4) { + /* --delay:.75s; */ + --index:3; + } + + #loading > li:nth-of-type(5) { + /* --delay:1s; */ + --index:4; + } + + #loading > li:nth-of-type(6) { + /* --delay:1.25s; */ + --index:5; + } + + #loading > li:nth-of-type(7) { + --index:6; + } + + #loading > li:nth-of-type(8) { + --index:8; + } + + #loading > li:nth-of-type(9) { + --index:9; + } + + + /* I accepted start counting at zero ;-) */ + #loading > li:nth-of-type(1) { --index:0; } + #loading > li:nth-of-type(2) { --index:1; } + #loading > li:nth-of-type(3) { --index:2; } + #loading > li:nth-of-type(4) { --index:3; } + #loading > li:nth-of-type(5) { --index:4; } + #loading > li:nth-of-type(6) { --index:5; } + #loading > li:nth-of-type(7) { --index:6; } + #loading > li:nth-of-type(8) { --index:7; } + #loading > li:nth-of-type(9) { --index:8; } \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index 61bd1c0c..c76ecf42 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -12,6 +12,7 @@

+ <%- include('./partials/loading'); %>
diff --git a/views/partials/loading.ejs b/views/partials/loading.ejs new file mode 100644 index 00000000..f79ae629 --- /dev/null +++ b/views/partials/loading.ejs @@ -0,0 +1,10 @@ +
    +
  • G
  • +
  • E
  • +
  • N
  • +
  • E
  • +
  • R
  • +
  • A
  • +
  • T
  • +
  • E
  • +
From 8d803af082b3dd075a75c5f719db821bdb3b6602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 13:09:37 +0200 Subject: [PATCH 34/90] css --- public/styles/style.css | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index b5d4c6dd..74726d12 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -194,10 +194,6 @@ header nav p { /********/ /* MAIN */ /********/ - - - - #start main p { font-size: 18px; margin: 0; @@ -301,15 +297,10 @@ header nav p { transform: translateY(calc(var(--font-size) * -1)); } - - - /**********************/ /* LOADING STATE 1 */ /**********************/ #loading { - /* --length:5; */ - /* --length:7; */ --length:8; --duration:2; @@ -321,8 +312,7 @@ header nav p { gap:.1em; border:solid .05em #ff4a61; background-color:#ff4a61; - font-size:3em; - + font-size:3em; } /************/ @@ -355,7 +345,7 @@ header nav p { font-size:.5em; color:white; transform-origin:bottom; - font-family--text: 'Commissioner', Arial, + font-family: 'Commissioner', Arial, Helvetica, sans-serif; From ca4f4541f7ebdd441becbe8fff0d8db87cf6d270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 14:05:11 +0200 Subject: [PATCH 35/90] generate poems --- public/styles/style.css | 1 + routes/poems.js | 14 ++++++++++++++ views/generate-poems.ejs | 40 ++++++++++++++++++++++++++++++++++++++++ views/index.ejs | 1 - 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index 74726d12..84e8f11e 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -4,6 +4,7 @@ padding: 0; } +/*hallo*/ :root { /*color palette*/ diff --git a/routes/poems.js b/routes/poems.js index 3d6fd025..60abe812 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -29,7 +29,21 @@ router.get('/poems', (req, res)=>{ }); } }) +}) +router.get('/generate', (req, res)=>{ + request.get(options, (error, response, body)=>{ + if(error){ + res.send(error) + console.log(error) + }else { + console.log(body) + res.render('generate-poems', { + title: 'Generating', + generateData: body + }); + } + }) }) diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index e69de29b..dc348e07 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -0,0 +1,40 @@ + + + + + <%- include('./partials/head'); %> + + + +
+ <%- include('./partials/header'); %> +
+ +
+ +
+
    +
  • + +
  • +
+
+ +
+
+ + + + + +
Preview:
+
+
+ + <%- include('./partials/loading'); %> + +
+ + + + \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index c76ecf42..61bd1c0c 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -12,7 +12,6 @@

- <%- include('./partials/loading'); %>
From 8944303094e17a26fe1630e0ffba7385b597c907 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 14:31:26 +0200 Subject: [PATCH 36/90] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93b12f19..197df8c8 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ Teammates: - Jevona Magdalena - Keïsha Alexander -- hilal +- Hilal Tapan ## Concept Voor de --- -## Inhoudsopgave +## Table of Content From 137ad33a62778f598d6abd057d9d9d47272a004a Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 14:34:02 +0200 Subject: [PATCH 37/90] url update --- routes/poems.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/poems.js b/routes/poems.js index ba3e6ca1..f976ac47 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -3,7 +3,7 @@ const request = require('request'); const router = express.Router(); const API_KEY = 'dichter-a6a8ae46-4c90' const options = { - url: 'https://dichter.responsible-it.nl/api/poetry?type=5&theme=mooi bos warme zomerdag', + url: 'https://dichter.responsible-it.nl/api/types', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' From 762dd936a7d9f113b8c3b7d4b2c69a91eff1797e Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 14:34:28 +0200 Subject: [PATCH 38/90] remove not needed stuff --- views/generate-poems.ejs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index dc348e07..5576eba3 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -5,7 +5,7 @@ <%- include('./partials/head'); %> - +
<%- include('./partials/header'); %>
@@ -35,6 +35,5 @@ - \ No newline at end of file From f760ee342ba98d63f3f950349c65925b0ce9bbb7 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 14:34:43 +0200 Subject: [PATCH 39/90] refactor --- views/partials/loading.ejs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/views/partials/loading.ejs b/views/partials/loading.ejs index f79ae629..a4181816 100644 --- a/views/partials/loading.ejs +++ b/views/partials/loading.ejs @@ -1,10 +1,10 @@ -
    -
  • G
  • -
  • E
  • -
  • N
  • -
  • E
  • -
  • R
  • -
  • A
  • -
  • T
  • -
  • E
  • -
+
    +
  • G
  • +
  • E
  • +
  • N
  • +
  • E
  • +
  • R
  • +
  • A
  • +
  • T
  • +
  • E
  • +
\ No newline at end of file From b8b2acae85a962b13c0936adae29923d39f9484e Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 14:34:53 +0200 Subject: [PATCH 40/90] new style --- views/poems.ejs | 73 ++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/views/poems.ejs b/views/poems.ejs index cb707106..b57324df 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -11,61 +11,48 @@
+
+
    +
  • + +
  • +
+
-
-
-
-

Maak je eigen gedichten

- -
- Kies je eigen thema -
    -
  • -
-
- - -
+
+ + + + -
- -
+
Preview:
- - - - - - - - - - + <%- include('./partials/loading'); %>
<%- include('./partials/footer'); %>
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
From b839e27a626864f641ec2fcc8b8679a24ae6a7fd Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 15:45:55 +0200 Subject: [PATCH 41/90] new collabarator --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f3d206f..7fd1a85a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "AI", "Poetry" ], - "author": "Keïsha Alexander, Jevona Magdalena & Hilal Tapan", + "author": "Keïsha Alexander, Jevona Magdalena, Hilal Tapan & Laiba Choudhry", "license": "MIT", "bugs": { "url": "https://github.com/RainbowJM/dicho-hackaton/issues" From a9578ed359f193174dc8f0ccbe2161b5aa259b9c Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 15:46:51 +0200 Subject: [PATCH 42/90] update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 197df8c8..b92035be 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,10 @@ Teammates: - Jevona Magdalena - Keïsha Alexander - Hilal Tapan +- Laiba Choudhry ## Concept -Voor de +For this project --- ## Table of Content From d0c80ed17594fa1dcecb1203d4a501e7c628a03e Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Wed, 12 Apr 2023 15:47:00 +0200 Subject: [PATCH 43/90] api ready --- routes/poems.js | 6 +++--- views/poems.ejs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/routes/poems.js b/routes/poems.js index f976ac47..a659596b 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -20,12 +20,12 @@ router.get('/poems', (req, res) => { request.get(options, (error, response, body) => { if (error) { res.send(error) - console.log(error) } else { - console.log(body) + console.log(JSON.parse(body).data) + // console.log(body) res.render('poems', { title: 'Make your poem', - poemsData: body + poemsData: JSON.parse(body).data }); } }); diff --git a/views/poems.ejs b/views/poems.ejs index b57324df..f8ec0609 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -30,7 +30,7 @@ - <%- include('./partials/loading'); %> +
From 270753bb8367646982d758e26345e077115472c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 15:52:14 +0200 Subject: [PATCH 44/90] generate styling --- public/styles/style.css | 49 ++++++++++++++++++++++++++++++++++++++-- views/generate-poems.ejs | 15 +++++++----- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 84e8f11e..d3092b64 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -298,8 +298,9 @@ header nav p { transform: translateY(calc(var(--font-size) * -1)); } + /**********************/ -/* LOADING STATE 1 */ +/* LOADING STATE */ /**********************/ #loading { --length:8; @@ -409,4 +410,48 @@ header nav p { #loading > li:nth-of-type(6) { --index:5; } #loading > li:nth-of-type(7) { --index:6; } #loading > li:nth-of-type(8) { --index:7; } - #loading > li:nth-of-type(9) { --index:8; } \ No newline at end of file + #loading > li:nth-of-type(9) { --index:8; } + + + + + + /************/ + /* GENERATOR */ + /************/ + + /* #generate { + display: flex; + } */ + + #generate section { + margin-bottom: 5em; + } + + #generate section:nth-of-type(1) ul { + display: flex; + gap: 3vw; + } + + #generate section:nth-of-type(1) li { + background-color: var(--coral-deeppink); + width: 10vw; + height: 5vh; + border-radius: 3em; + } + + #generate section:nth-of-type(2) { + display: grid; + grid-template-columns: 1fr 1fr; + background-color: white; + width: 80vw; + } + + #generate section:nth-of-type(2) form{ + grid-column-start: 1 ; + + } + #generate section:nth-of-type(2) div{ + grid-column-start: 2 ; + + } \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index dc348e07..9b383782 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -5,33 +5,36 @@ <%- include('./partials/head'); %> - +
<%- include('./partials/header'); %>
-
+
  • +
  • +
  • +
  • +
- + +
+
Preview:
-
Preview:
-
- <%- include('./partials/loading'); %>
From b77afacf18560ef42b8b001c73305fd3fb06d13a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Wed, 12 Apr 2023 17:41:04 +0200 Subject: [PATCH 45/90] css --- public/styles/style.css | 47 ++++++++++++++++++++++++++++++---------- views/generate-poems.ejs | 4 +++- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index d3092b64..e70e0791 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -419,13 +419,18 @@ header nav p { /************/ /* GENERATOR */ /************/ - - /* #generate { - display: flex; - } */ - - #generate section { - margin-bottom: 5em; + #generate main { + justify-content: center; + width: 90vw; + height: 55vh; + margin: auto; + box-shadow: gray; + } + + + /* section 1 */ + #generate section:nth-of-type(1){ + margin-bottom: 2em; } #generate section:nth-of-type(1) ul { @@ -440,18 +445,38 @@ header nav p { border-radius: 3em; } + + /* section 2 */ #generate section:nth-of-type(2) { display: grid; grid-template-columns: 1fr 1fr; + gap: 1em; background-color: white; - width: 80vw; + width: 90vw; + height: 40vh; + border-radius: 2em; + padding: 2em; + } - #generate section:nth-of-type(2) form{ + #generate section:nth-of-type(2) form { grid-column-start: 1 ; + display: flex; + flex-direction: column; + font-family: var(--text); + } + #generate section:nth-of-type(2) label { + color: black ; + font-family: var(--title); + margin-bottom: 1em ; } - #generate section:nth-of-type(2) div{ - grid-column-start: 2 ; + #generate section:nth-of-type(2) textarea { + background-color:var(--light-grey) ; + border: none; + } + #generate section:nth-of-type(2) div { + grid-column-start: 2 ; + width: 5em; } \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index 9b383782..c813ea55 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -21,13 +21,15 @@
  • +
  • +
  • - +
    From 2da7d0e65e81cd0f760cbaac6a8bdae1cb5610e2 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 18:20:30 +0200 Subject: [PATCH 46/90] start knop vernadert naar home --- views/partials/header.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/views/partials/header.ejs b/views/partials/header.ejs index d693e643..8026fc46 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -1,4 +1,5 @@ \ No newline at end of file From 0b9fbff1b99e8b9f307b7ea8a16edfaac96189de Mon Sep 17 00:00:00 2001 From: K3A101 Date: Wed, 12 Apr 2023 18:21:23 +0200 Subject: [PATCH 47/90] clouds animation done --- public/styles/style.css | 133 ++++++++++++++++++++++++++++++++++------ 1 file changed, 115 insertions(+), 18 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index d0ccb1cb..8f6cc777 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -19,17 +19,19 @@ Helvetica, sans-serif; - --text-color: #2b3044; - --font-size: 16px; - --duration: 2.5s; - --duration-line: 0.84s; + --text-color: #2b3044; + --font-size: 16px; + --duration: 2.5s; + --duration-line: 0.84s; } body { font-family: var(--text); position: relative; + width: 100vw; min-height: 100vh; background-color: var(--light-grey); + overflow-x: hidden; } @@ -57,10 +59,11 @@ a { header nav { display: flex; align-items: center; + gap: 2em; } header nav img { - width: 20%; + width: 15%; } header ul li:first-of-type { @@ -69,7 +72,7 @@ header ul li:first-of-type { header nav p { font-weight: 500; - font-size: clamp(3em, 2vw, 8em); + font-size: clamp(1em, 2vw, 8em); } /**********************/ @@ -81,37 +84,70 @@ header nav p { position: absolute; top: 3em; right: 0; - + /* background-color: aqua; */ + width: 30vw; + height: 9em; } .background-decoration-1 figure { /* background-color: #feb63d; */ + animation: moving-wolk-group-1 5s infinite alternate linear both; margin: 1em; border-radius: 4em; width: 7em; height: 3em; + position: absolute; + transition: 3s; } .background-decoration-1 figure:nth-of-type(1) { - width: 10em; + --width: 10em; + width: var(--width); background-color: var(--light-grey); border: 3px solid var(--orange-yellow); - transform: translateX(5em); + /* transform: translateX(5em); */ + --animation-width: calc(var(--width) + 1em); + animation-delay: .2s; + top: 0; } .background-decoration-1 figure:nth-of-type(2) { + --width: 9em; + width: var(--width); background-color: var(--orange-yellow); height: 1.5em; - width: 9em; - transform: translateX(-3em); + + --animation-width: calc(var(--width) + 1em); + /* transform: translateX(-3em); */ + animation-delay: -.7s; + top: 3.5em; } .background-decoration-1 figure:nth-of-type(3) { + --width: 7em; + width: var(--width); background-color: var(--coral-deeppink); - width: 7em; + + --animation-width: calc(var(--width) + 1em); height: 3em; - transform: translateX(7em); + /* transform: translateX(7em); */ + animation-delay: -.8s; + + top: 7.5em; +} + + +@keyframes moving-wolk-group-1 { + 0% { + /* transform: translateX(-100%); */ + left: 0; + } + + 100% { + /* transform: translateX(100%) */ + left: calc(100% - var(--animation-width)); + } } /*********************************/ @@ -123,32 +159,64 @@ header nav p { position: absolute; bottom: 2em; right: 0; + width: 30vw; + height: 9em; } .background-decoration-2 figure { /* background-color: #feb63d; */ + animation: moving-wolk-group-2 6s infinite alternate linear both; border-radius: 4em; width: 7em; height: 3em; + margin: 1em; + position: absolute; + transition: 3s; } .background-decoration-2 figure:nth-of-type(1) { + --width: 8em; + width: var(--width); + /* transform: translateX(-5em); */ background-color: var(--coral-deeppink); - width: 10em; + --animation-width: calc(var(--width) + 1em); + animation-delay: .3s; + bottom: -1em; } .background-decoration-2 figure:nth-of-type(2) { + --width: 3em; + width: var(--width); + /* transform: translate(7em, -2.5em); */ background-color: var(--orange-yellow); height: 1.5em; - width: 5em; + --animation-width: calc(var(--width) + 1em); + animation-delay: -.7s; + bottom: -3em; } .background-decoration-2 figure:nth-of-type(3) { + --width: 12em; + width: var(--width); background-color: var(--light-grey); border: 3px solid var(--coral-deeppink); - width: 12em; + --animation-width: calc(var(--width) + 1em); + /* transform: translate(0, -1em); */ + animation-delay: -.8s; + /* bottom: -8em; */ +} + +@keyframes moving-wolk-group-2 { + 0% { + /* transform: translateX(-100%); */ + left: 0; + } + 100% { + /* transform: translateX(100%) */ + left: calc(100% - var(--animation-width)); + } } /**********************/ @@ -160,28 +228,57 @@ header nav p { position: absolute; bottom: 2em; left: 0; + width: 30vw; + height: 9em; } .background-decoration-3 figure { + animation: moving-wolk-group-3 8s infinite alternate linear both; + margin: 1em; /* background-color: #feb63d; */ border-radius: 4em; + position: absolute; + transition: 3s; width: 7em; height: 3em; } .background-decoration-3 figure:nth-of-type(1) { + --width: 6em; background-color: var(--coral-deeppink); - width: 6em; + width: var(--width); + /* transform: translateX(5em); */ + --animation-width: calc(var(--width) + 1em); + bottom: 3em; + animation-delay: .2s; } .background-decoration-3 figure:nth-of-type(2) { + --width: 12em; border: 3px solid var(--black); - width: 12em; + width: var(--width); + /* transform: translateX(-5em); */ + bottom: -1em; + animation-delay: -.5s; + --animation-width: calc(var(--width) + 1em); } + +@keyframes moving-wolk-group-3 { + 0% { + /* transform: translateX(-100%); */ + left: 0; + } + + 100% { + /* transform: translateX(100%) */ + left: calc(100% - var(--animation-width)); + } +} + @media (max-width: 30em) { .background-decoration-1, From 05d7dde1de3c6455e4b9b6cf424e58c86604d013 Mon Sep 17 00:00:00 2001 From: Laiba Choudhry Date: Thu, 13 Apr 2023 07:41:02 +0200 Subject: [PATCH 48/90] error bij mijn ejs --- .DS_Store | Bin 0 -> 6148 bytes app.js | 1 + public/.DS_Store | Bin 0 -> 6148 bytes public/images/.DS_Store | Bin 0 -> 6148 bytes public/images/icons/.DS_Store | Bin 0 -> 6148 bytes public/images/icons/icon-192x192.png | Bin 0 -> 2220 bytes public/images/icons/icon-256x256.png | Bin 0 -> 3006 bytes public/images/icons/icon-384x384.png | Bin 0 -> 5021 bytes public/images/icons/icon-512x512.png | Bin 0 -> 7063 bytes public/manifest.json | 41 +++++++++++++++++++++++++++ public/scripts/preview.js | 6 ++++ public/styles/style.css | 38 ++++++++++++++++++++++++- public/sw.js | 39 +++++++++++++++++++++++++ routes/poems.js | 3 +- views/offline.ejs | 3 +- views/poems.ejs | 8 ++++-- 16 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 .DS_Store create mode 100644 public/.DS_Store create mode 100644 public/images/.DS_Store create mode 100644 public/images/icons/.DS_Store create mode 100644 public/images/icons/icon-192x192.png create mode 100644 public/images/icons/icon-256x256.png create mode 100644 public/images/icons/icon-384x384.png create mode 100644 public/images/icons/icon-512x512.png create mode 100644 public/manifest.json create mode 100644 public/scripts/preview.js create mode 100644 public/sw.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4c0bbfe245390b26675426205da68830bde51b08 GIT binary patch literal 6148 zcmeHKL2uJA6n^fyl9nNggv2gLxo|60JE=lDAeGV`c0fV|!2wX0G}RW!;;KznK`H8; zUjV-WiQmC5;J0vs@7V@5X~%5{kl$o~&(8avm(Pw}6Org;VVkH`O3?qiNb|eHEpx@^^v#U;^8*va1Gv!bdnc zLC(BM63gTm{miM-BRasO_vrz!i75{Al9f1ebwN~Ug2~G$-LMFF@qAiYJlk}JNf^;= z<8oPz1ku_>D_|ChbNQkNviYq7R)K#`0p1^66vnQ>rAD=Npi)-=U>V)Y;Pdg%9M@pi z;8G)=z=Wm(HC31^hR}5MyC$w{aH&z#NtnxrFe3|dLlJ6p$(*fgFUM!Ci*kg*#&JuHih{}<$I9WOco#(( ap1JG*y9SpU(F3zT1e6T6vI_iB1%3d(8ourT literal 0 HcmV?d00001 diff --git a/app.js b/app.js index c79ab2fa..9b1a19fe 100644 --- a/app.js +++ b/app.js @@ -2,6 +2,7 @@ const express = require('express'); const app = express(); const port = 8000; // let minifyHTML = require('express-minify-html'); + let options = { maxAge: '2y', etag: false diff --git a/public/.DS_Store b/public/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ea0f82e64eea83697a04297532c2645af61a02a0 GIT binary patch literal 6148 zcmeHKL2uJA6n^fy)-9Uo0cpD+<-)C+nn@Mf0Vylvup3ek8~|;}TDG7pu9}o+bVa%I z3*b-iJNO0s7EbUz+e}RhSA>wC^!(W`-*fEGZXFYm7|q8%QICiuoUzeC@f+jk>>Jjw zkv351J|>i(r0P6QRlLD=fqzi}Ub_}0bVU(eP<{P)Qyjtfe`wRguW{otpW3zl8c)+C zF9w5eqOsN7ZndTC%I;40b$F@Du!xFzK8j{9x%D(EE@NANrc`=ckK*Uaq&)52d#th| zO0vmJCnw_xD6d{5*;th$HP6Pm?k6-4r0mGfX>V__7#$7xU;H%QL!8)fIGN;H|{h@#@?ys?1y6e0uCD;VCb!v8=WicI&thP)GKeQI zVN!u6RoE+rFzJYUmKRv844QNj_VOX@n}xlh2>o{S?`b-Tz@RIg0#1Rt0$Zlpo_Y*6OoNFFV@%yi)v3olx8|PiuA+#DHO6g+s6a#(iok3h zRf>suQO;RLj|ei8F?`|_(LM#_pYt{YMggP1zovlrc6aG1xpXSO+F#!P2I_76@5C)^TT>io`TiNZM3zn6)@_YFwtsbAW zVmBU-8t(9s=pDLo&(rM(oQI3H>pcuQljFjbyF7~BAnFVyIcRs_^7tr-+I-UBGcBjATN6`I;8U=%P4EEEv?gN-7vu5qqV zZXKxP6#$sUur##Aj|IW8HP$uG6=DX)6cwnbOkXjWqGR0Feszs=g^Es0u8cT(Wu|W^ zOsSuHz$mb+z?SM3#QA@3{r!KLWO_ycqriWq0LwO8O=%$-EYi*Ph s6k)<|u251?>El>7#8F&Ck%l>2G=O!DbA=dznI8gD22&XY{;C2$0gdfS`C z%)sp1Z004|HzAV&kY;bIG0*@Q(FF&G9DXo4FTP^~Ul|gUUgHd7++c!tV%R=AhusC*x`sv`H zEdWt|Bh@&UUP3t8u{d^yJVQ%HB^ot(i;;}Z_3UxQu`@I}k~bg8@0`3tNqTo)KWjKr zF^n-32nDtkIIzP;>i=!M|KBFXQ78}!{3`|0aQ-l#aZ6rXcQz-rHq#&JViMOGZYZ2+ gDQ2vc;$ylR*RxEB#j!Kw3N3yFRE8Krfj?E?8!7ika{vGU literal 0 HcmV?d00001 diff --git a/public/images/icons/icon-192x192.png b/public/images/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..59f887b9eecf7b5015aff1f47dd854dacd5f91ae GIT binary patch literal 2220 zcmb7GdoHz}VNSVK z822&gxHh4sLY$d&5yFs~DT8m$AK&`^`TjX;?PouGy=%YwUGIL^yPtj8!_7%SR#O%L zpx}Ja-c!Pye}F0frwE#d7obC4?J3BTvLCVw)hq@OR zjBcGJRG+py@FGj&L##rs!dxp#_C8vA%gp2Z9`=5}!qS6NFMF5#NSAt~`S_;i<4VoP z6x||J_2NL>eLq*+tQ%2f^9 zjfy3pFas*Dd2d1#6O}k*$i2S2?nrqjST5&s%;zG`j6XI3s}UP5B|dNb)DXod=u-EP zYbb3625}2}dqKuiW<$;LY9aEe@v){`HqW#4=z&Fu$#KFz~+RdS;q zx;;9=K(G=1N|cKtc5$>kOeoo|7dZ?JKk2q8euefqQu6$9T{Nv$k1%jWIjxg}?4ZTt z`Xh0RbubLoU~}4As(WIi!C9hZaRId59_0q%dsD`0we7aRJv0U&n=cQx3pJ85VK=j1ThRQWGauW!7go(e@1IG+b0`(d~ml-0^qoHAxI(6CDHUIKvPag-dBK4y*rtmVprfC@I?aQIhuV_&T6>Z(r(LoWiv8A5# z;x`!ECt`SWU6X>XvG4vL8Qw;vi|eS7NNkewI7xp}G2Vt4F&tj02p@D0qgKQ4XTAyFH1FOZ-+EO}@jxlzIS*Z&5@b7=1 zPO`a>-TuX)z`?z~n*MWF;adLkjLF8iyWSTtA;Q*ngf4k1lSJxSqC{tX8qz&MC-yFV z6R=QK5$!Q@RnbE!-TvZp0x^Kk#ZKaFNCUBii~xUx?uqxhwYhba;oBn+WkLUYRDe*o z8r}mAB5ch-E|eor4Fx5s-^Q2o)l`JDdCVZniQAC3J^|Wi$0psnfD)y7MS_Apb$&vl z)tz_8bt7CwoU7gc_1p^A#eiPPVS%x9gOow*>bQxXUtMRLeeYzTJC+t*_#T(k`u0o` zcuNV$n0n}cFXnQY=aCEErJlcUAWlbP3%T2|6p)!4bbnmeq)>CWtyrYbv8@>`niZw& zv91Vd>V?n5bHmIrh{cPuB*obxhT!RV)Na4&rS~{{iT%)O*`K3PEUPXBTQg!%OIj>B z8#g5TflkuNJw5a@=}JkD5SEM(DF`GH8}+baKThH!$7g7f%oE(}Q_<4V&>KjpOmjAo z1MzPhDqU)qE^EFnnrQ!isMJjLQYB1>P|VKzIf|f|%53sLI%bmMHIzDW@B!d{Y)Af? zpb=%k(LkG+6A>-K5_S?fqD2WlpxRaxVkpmpqL3^YQL%G(n%RJ=kP^@nJ(8tO#c~!h ziPkq$2Ifyi1ZBhhsD-pGK`uEIVV<6p)=}Q7Y^;6^S?_6UIXh zlU7J2GYk5=1g*>BZ3|noI}%=%t?(HBzy6D;8JguhC0w8NI+C>hDMmIQ8BksM1nf)46Hi=S&`8>@JK*i$~v{4?N}Sqs48*m#L+< z-7q0dpKevrocg}$gC*Cm*>4m%UNB~T$WA$Zg0Z~diz&msJ5unZ->V1V`LTJwdwSi3 zFW=?SdnXZ(exti%zK{Ln5yLr|EGse>yc{Mk$VRS1{OnMhmQGW?8{dIHbPSHKh{;h#hBjniITk^zVfE|EPG$&M$50Ry*#>A`fsR P-w)vI;AUTC7nu4VbR7mm literal 0 HcmV?d00001 diff --git a/public/images/icons/icon-256x256.png b/public/images/icons/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..87b1d0d7d1c5e70b0d9d584b72f252ed047a8f52 GIT binary patch literal 3006 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 literal 0 HcmV?d00001 diff --git a/public/images/icons/icon-384x384.png b/public/images/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc4d86ea7ed505fc5f308fefc65b245f1fc5e3b GIT binary patch literal 5021 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 { +preview.innerText = input.value; +}); \ No newline at end of file diff --git a/public/styles/style.css b/public/styles/style.css index 537246f9..27f81e5c 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -370,6 +370,38 @@ header nav p { animation-fill-mode:backwards; animation-delay:calc( var(--duration) * 1s / var(--length) * ( var(--index) - var(--length) ) ); } + + form { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + } + + + label { + flex: 0 0 100%; + margin: 10px 0; + font-weight: bold; + } + + + + input, textarea { + flex: 1; + padding: 10px; + margin: 10px; + border-radius: 5px; + border: 1px solid gray; + } + + .preview { + flex: 1; + padding: 10px; + margin: 10px; + border-radius: 5px; + border: 1px solid gray; + } #loading > li:nth-of-type(1) { /* --delay:0s; */ @@ -423,4 +455,8 @@ header nav p { #loading > li:nth-of-type(6) { --index:5; } #loading > li:nth-of-type(7) { --index:6; } #loading > li:nth-of-type(8) { --index:7; } - #loading > li:nth-of-type(9) { --index:8; } \ No newline at end of file + #loading > li:nth-of-type(9) { --index:8; } + + + + \ No newline at end of file diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 00000000..cd78c130 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,39 @@ +// const staticCacheName = 'site-static-v1'; +// const assets = [ +// "/offline", +// "/styles/styles.css" +// ]; + +// self.addEventListener("install", (event) => { + +// // The promise that skipWaiting() returns can be safely ignored. +// // bron: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting +// self.skipWaiting(); + +// // console.log("Service worker has been installed") +// event.waitUntil( +// caches.open(staticCacheName).then(cache => { +// console.log("catching shell assets"); +// cache.addAll(assets); +// }) +// ) +// }); + +// // activate service worker +// self.addEventListener("activate", (event) => { +// // console.log("Service worker has been activated") + +// }); + +// self.addEventListener("fetch", (event) => { +// event.respondWith( +// caches.match(event.request).then((cacheRes) => { +// if (cacheRes) { +// return cacheRes; +// } +// return fetch(event.request).catch(() => { +// return caches.match("/offline"); +// }); +// }) +// ); +// }); \ No newline at end of file diff --git a/routes/poems.js b/routes/poems.js index a659596b..dd81a88a 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -33,7 +33,8 @@ router.get('/poems', (req, res) => { router.get('/offline', function(req, res) { res.render('offline', { - title: 'Offline page' + title: 'Offline page', + pageTitle: 'You are offline' }) }) diff --git a/views/offline.ejs b/views/offline.ejs index aa0b6839..e4bbfe92 100644 --- a/views/offline.ejs +++ b/views/offline.ejs @@ -11,7 +11,8 @@
    -

    You are offline

    +

    You are currently offline, please check your settings. +

    \ No newline at end of file diff --git a/views/poems.ejs b/views/poems.ejs index f8ec0609..f5be8f51 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -14,7 +14,9 @@
    • - + <% data.forEach((type) => { %> +
    • <%= type.name %>
    • + <% }); %>
    @@ -30,7 +32,7 @@
    - + <%- include('./partials/loading'); %>
    @@ -57,7 +59,7 @@ - + \ No newline at end of file From 45015d7fcc97b60c95e0f49bd6800a33d8b32744 Mon Sep 17 00:00:00 2001 From: Laiba Choudhry <94360732+laibaaac@users.noreply.github.com> Date: Thu, 13 Apr 2023 07:49:45 +0200 Subject: [PATCH 49/90] Update README.md --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b92035be..ddfd92d8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ -# Dicho di Hubentut -## Youth poetry +# Dicho di Hubentut ~ Youth poetry -### Projectweek 3: Hackathon +## Projectweek 3: Hackathon Teammates: - Jevona Magdalena - Keïsha Alexander @@ -9,11 +8,10 @@ Teammates: - Laiba Choudhry ## Concept -For this project - +During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems For this assignment we will have to fetch an api where you can generate --- -## Table of Content +## Features combined ---- \ No newline at end of file +--- From 1c948a2b8b2936fd71d207af3cedd648a1cc21b0 Mon Sep 17 00:00:00 2001 From: Laiba Choudhry <94360732+laibaaac@users.noreply.github.com> Date: Thu, 13 Apr 2023 07:50:29 +0200 Subject: [PATCH 50/90] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddfd92d8..3858707a 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Teammates: ## Concept During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems For this assignment we will have to fetch an api where you can generate ---- + ## Features combined From e17d7d256f4dc45e6104a79493d6f00a40717efe Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Thu, 13 Apr 2023 10:31:46 +0200 Subject: [PATCH 51/90] adjust size --- public/styles/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index d543182c..4f6b463c 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -20,7 +20,7 @@ sans-serif; --text-color: #2b3044; - --font-size: 16px; + --font-size: 3em; --duration: 2.5s; --duration-line: 0.84s; } From 1ceb1876d279029bedc6054d651ca23d30be6cef Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 10:33:13 +0200 Subject: [PATCH 52/90] fonts changed --- views/partials/head.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/partials/head.ejs b/views/partials/head.ejs index 0e639b35..44625260 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -11,4 +11,4 @@ - \ No newline at end of file + \ No newline at end of file From 56fa6358067f31f6e7f622ea1d95bb2220058ab3 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 10:33:43 +0200 Subject: [PATCH 53/90] loading page added --- views/loading.ejs | 31 +++++++++++++++++++++++++++++++ views/partials/loading.ejs | 10 ---------- 2 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 views/loading.ejs delete mode 100644 views/partials/loading.ejs diff --git a/views/loading.ejs b/views/loading.ejs new file mode 100644 index 00000000..7ebd88f2 --- /dev/null +++ b/views/loading.ejs @@ -0,0 +1,31 @@ + + + + + <%- include('./partials/head'); %> + + + +
    + <%- include('./partials/header'); %> +
    + +
    +
      +
    • G
    • +
    • E
    • +
    • N
    • +
    • E
    • +
    • R
    • +
    • A
    • +
    • T
    • +
    • E
    • +
    + +
    + + <%- include('./partials/background-decoration'); %> + + + + \ No newline at end of file diff --git a/views/partials/loading.ejs b/views/partials/loading.ejs deleted file mode 100644 index a4181816..00000000 --- a/views/partials/loading.ejs +++ /dev/null @@ -1,10 +0,0 @@ -
      -
    • G
    • -
    • E
    • -
    • N
    • -
    • E
    • -
    • R
    • -
    • A
    • -
    • T
    • -
    • E
    • -
    \ No newline at end of file From 0cbedf48b720f9a92f7dece3d29a829224c05c23 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 10:34:01 +0200 Subject: [PATCH 54/90] url naar de loading page --- routes/poems.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/routes/poems.js b/routes/poems.js index a659596b..747874fd 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -31,6 +31,13 @@ router.get('/poems', (req, res) => { }); }); +router.get('/loading', (req, res)=>{ + res.render('loading', { + title: 'Poems are loading' + }) +}) + + router.get('/offline', function(req, res) { res.render('offline', { title: 'Offline page' From 4ba9fe21b0a507c90fa973edef0c36a4c26129f3 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 10:34:16 +0200 Subject: [PATCH 55/90] loading page styling --- public/styles/style.css | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index d543182c..27733983 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -429,8 +429,6 @@ header nav p { list-style:none; display:flex; gap:.1em; - border:solid .05em #ff4a61; - background-color:#ff4a61; font-size:3em; } @@ -461,13 +459,11 @@ header nav p { li { width:1em; aspect-ratio:2; - font-size:.5em; - color:white; + font-size:2em; + color:var(--black); transform-origin:bottom; - font-family: 'Commissioner', Arial, - Helvetica, - sans-serif; - + font-family: var(--title); + font-weight: bold; animation-name:squash-animation; animation-duration:calc( var(--duration) * 1.4s ); animation-iteration-count:infinite; From bda4eb1a99a0e1162b7beb73fcaee0a891c1001f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 11:18:24 +0200 Subject: [PATCH 56/90] generate page --- public/styles/style.css | 64 +++++++++++++++++++++++++++++++++------- views/generate-poems.ejs | 8 +++-- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index d543182c..0af15d07 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -11,6 +11,8 @@ --orange-yellow: #feb63d; --light-grey: #e2e2e2; --black: #000000; + --gray: gray; + --white: white; --title: 'Commissioner', Arial, Helvetica, @@ -541,13 +543,13 @@ header nav p { width: 90vw; height: 55vh; margin: auto; - box-shadow: gray; + box-shadow: var(--gray); } /* section 1 */ #generate section:nth-of-type(1){ - margin-bottom: 2em; + margin-bottom: 1em; } #generate section:nth-of-type(1) ul { @@ -556,10 +558,10 @@ header nav p { } #generate section:nth-of-type(1) li { - background-color: var(--coral-deeppink); + background-color: var(--white);; width: 10vw; - height: 5vh; - border-radius: 3em; + height: 7vh; + border-radius: 4em; } @@ -567,13 +569,11 @@ header nav p { #generate section:nth-of-type(2) { display: grid; grid-template-columns: 1fr 1fr; - gap: 1em; - background-color: white; + gap: 3em; width: 90vw; height: 40vh; border-radius: 2em; padding: 2em; - } #generate section:nth-of-type(2) form { @@ -581,19 +581,61 @@ header nav p { display: flex; flex-direction: column; font-family: var(--text); + background-color: var(--white); + padding: 1.5em 2em; + width: 35vw; + height: 50vh; + position: relative; + box-shadow: 0px 3px 4px var(--gray); + border-radius: 2em; + } + + #generate section:nth-of-type(2) form h2 { + font-family: var(--title); + font-size: var(--font-size); + margin-bottom: 1em; } #generate section:nth-of-type(2) label { - color: black ; + color: var(--coral-deeppink) ; font-family: var(--title); margin-bottom: 1em ; + font-size: var(--font-size); + } #generate section:nth-of-type(2) textarea { background-color:var(--light-grey) ; border: none; + width: 30vw; + } + + #generate section:nth-of-type(2) form button { + background-color: var(--coral-deeppink); + padding: 1em 2em; + border-radius: 3em; + justify-content: center; + margin: auto; + border: none; + color: var(--white);; + margin-top: 2em; + } + + #generate section:nth-of-type(2) div { - grid-column-start: 2 ; - width: 5em; + grid-column-start: 2; + background-color: var(--white); + padding: 1.5em 2em; + width: 35vw; + height: 30vh; + border-radius: 2em; + margin-top: 10vh; + box-shadow: 0px 3px 4px var(--gray); + } + + #generate section:nth-of-type(2) div h2 { + font-family: var(--title); + color: var(--black); + font-size: var(--font-size); } \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index d5d68d9a..1fa9b62c 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -29,13 +29,17 @@
    -
    + +

    Make your poems

    +
    -
    Preview:
    +
    +

    Preview:

    +
    From 21a9554cb10dac9524a9d2239613b7aa2e34ad62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 11:24:21 +0200 Subject: [PATCH 57/90] background decoration --- views/generate-poems.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index 1fa9b62c..3260c95c 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -45,6 +45,7 @@ + <%- include('./partials/background-decoration'); %> \ No newline at end of file From 6d8ab75f982d98817a377661899f6efc24b717b8 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 11:30:23 +0200 Subject: [PATCH 58/90] url changed --- views/index.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/index.ejs b/views/index.ejs index f2c20766..a18ee435 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -11,7 +11,7 @@
    -

    +

    <%- include('./partials/background-decoration'); %> From 6629b7ca5f684816b3d6008b6825e422392f6bcb Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 11:30:33 +0200 Subject: [PATCH 59/90] loading page styling --- public/styles/style.css | 373 +++++++++++++++++++++++----------------- views/loading.ejs | 16 +- 2 files changed, 228 insertions(+), 161 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 95d78f8b..489c4c4b 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -304,6 +304,7 @@ header nav p { justify-content: center; align-items: center; } + #offline main p { font-size: 18px; margin: 0; @@ -420,176 +421,240 @@ header nav p { /* LOADING STATE */ /**********************/ #loading { - --length:8; - --duration:2; - - margin:0; - padding:.5em 1em; - border-radius:1em; - list-style:none; - display:flex; - gap:.1em; - font-size:3em; - } - - /************/ - /* A SQUARE */ - /************/ - @keyframes squash-animation { - 0% { transform: none; } - 10.5% { transform: scale(1.2, .8); } - 21% { transform: scale(.9, 1.1); } - 27% { - transform: scale(1.35, .65); - animation-timing-function:cubic-bezier(0.165, 0.840, 0.440, 1.000); - } - 45% { - transform: translatey(-.5em) scale(1, 1.3); - animation-timing-function:cubic-bezier(0.895, 0.030, 0.685, 0.220); - } - 63% { transform: scale(2, .5); } - 72% { transform: scale(.8, 1.2); } - 78% { transform: scale(1.1, .9); } - 82.5% { transform: scale(.95, 1.05); } - 87% { transform: scale(1.02, .98); } - 90%, - 100% { transform: none; } - } - - li { - width:1em; - aspect-ratio:2; - font-size:2em; - color:var(--black); - transform-origin:bottom; - font-family: var(--title); - font-weight: bold; - animation-name:squash-animation; - animation-duration:calc( var(--duration) * 1.4s ); - animation-iteration-count:infinite; - animation-fill-mode:backwards; - animation-delay:calc( var(--duration) * 1s / var(--length) * ( var(--index) - var(--length) ) ); - } - - #loading > li:nth-of-type(1) { - /* --delay:0s; */ - --index:0; - } - - #loading > li:nth-of-type(2) { - /* --delay:.25s; */ - --index:1; + --length: 8; + --duration: 2; + + margin: 0; + padding: .5em 1em; + border-radius: 1em; + list-style: none; + display: flex; + gap: .1em; + font-size: 3em; +} + +/************/ +/* A SQUARE */ +/************/ +@keyframes squash-animation { + 0% { + transform: none; } - - #loading > li:nth-of-type(3) { - /* --delay:.5s; */ - --index:2; + + 10.5% { + transform: scale(1.2, .8); } - - #loading > li:nth-of-type(4) { - /* --delay:.75s; */ - --index:3; + + 21% { + transform: scale(.9, 1.1); } - - #loading > li:nth-of-type(5) { - /* --delay:1s; */ - --index:4; + + 27% { + transform: scale(1.35, .65); + animation-timing-function: cubic-bezier(0.165, 0.840, 0.440, 1.000); } - - #loading > li:nth-of-type(6) { - /* --delay:1.25s; */ - --index:5; + + 45% { + transform: translatey(-.5em) scale(1, 1.3); + animation-timing-function: cubic-bezier(0.895, 0.030, 0.685, 0.220); } - - #loading > li:nth-of-type(7) { - --index:6; + + 63% { + transform: scale(2, .5); } - - #loading > li:nth-of-type(8) { - --index:8; + + 72% { + transform: scale(.8, 1.2); } - - #loading > li:nth-of-type(9) { - --index:9; + + 78% { + transform: scale(1.1, .9); } - - - /* I accepted start counting at zero ;-) */ - #loading > li:nth-of-type(1) { --index:0; } - #loading > li:nth-of-type(2) { --index:1; } - #loading > li:nth-of-type(3) { --index:2; } - #loading > li:nth-of-type(4) { --index:3; } - #loading > li:nth-of-type(5) { --index:4; } - #loading > li:nth-of-type(6) { --index:5; } - #loading > li:nth-of-type(7) { --index:6; } - #loading > li:nth-of-type(8) { --index:7; } - #loading > li:nth-of-type(9) { --index:8; } - - - - - - /************/ - /* GENERATOR */ - /************/ - #generate main { - justify-content: center; - width: 90vw; - height: 55vh; - margin: auto; - box-shadow: gray; - } - - - /* section 1 */ - #generate section:nth-of-type(1){ - margin-bottom: 2em; + + 82.5% { + transform: scale(.95, 1.05); } - #generate section:nth-of-type(1) ul { - display: flex; - gap: 3vw; + 87% { + transform: scale(1.02, .98); } - #generate section:nth-of-type(1) li { - background-color: var(--coral-deeppink); - width: 10vw; - height: 5vh; - border-radius: 3em; + 90%, + 100% { + transform: none; } +} +li { + width: 1em; + aspect-ratio: 2; + font-size: 1.5em; + color: var(--coral-deeppink); + transform-origin: bottom; + font-family: var(--title); + font-weight: bold; + animation-name: squash-animation; + animation-duration: calc(var(--duration) * 1.4s); + animation-iteration-count: infinite; + animation-fill-mode: backwards; + animation-delay: calc(var(--duration) * 1s / var(--length) * (var(--index) - var(--length))); + text-shadow: 0 1px 2px rgb(0 0 0/ 0.5); - /* section 2 */ - #generate section:nth-of-type(2) { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1em; - background-color: white; - width: 90vw; - height: 40vh; - border-radius: 2em; - padding: 2em; +} - } +#loading>li:nth-of-type(1) { + /* --delay:0s; */ + --index: 0; +} - #generate section:nth-of-type(2) form { - grid-column-start: 1 ; - display: flex; - flex-direction: column; - font-family: var(--text); - } +#loading>li:nth-of-type(2) { + /* --delay:.25s; */ + --index: 1; +} - #generate section:nth-of-type(2) label { - color: black ; - font-family: var(--title); - margin-bottom: 1em ; - } +#loading>li:nth-of-type(3) { + /* --delay:.5s; */ + --index: 2; +} - #generate section:nth-of-type(2) textarea { - background-color:var(--light-grey) ; - border: none; - } - #generate section:nth-of-type(2) div { - grid-column-start: 2 ; - width: 5em; - } \ No newline at end of file +#loading>li:nth-of-type(4) { + /* --delay:.75s; */ + --index: 3; +} + +#loading>li:nth-of-type(5) { + /* --delay:1s; */ + --index: 4; +} + +#loading>li:nth-of-type(6) { + /* --delay:1.25s; */ + --index: 5; +} + +#loading>li:nth-of-type(7) { + --index: 6; +} + +#loading>li:nth-of-type(8) { + --index: 8; +} + +#loading>li:nth-of-type(9) { + --index: 9; +} + +#loading>li:nth-of-type(10) { + --index: 10; +} + +/* I accepted start counting at zero ;-) */ +#loading>li:nth-of-type(1) { + --index: 0; +} + +#loading>li:nth-of-type(2) { + --index: 1; +} + +#loading>li:nth-of-type(3) { + --index: 2; +} + +#loading>li:nth-of-type(4) { + --index: 3; +} + +#loading>li:nth-of-type(5) { + --index: 4; +} + +#loading>li:nth-of-type(6) { + --index: 5; +} + +#loading>li:nth-of-type(7) { + --index: 6; +} + +#loading>li:nth-of-type(8) { + --index: 7; +} + +#loading>li:nth-of-type(9) { + --index: 8; +} + +#loading>li:nth-of-type(10) { + --index: 9; +} + + + + + +/************/ +/* GENERATOR */ +/************/ +#generate main { + justify-content: center; + width: 90vw; + height: 55vh; + margin: auto; + box-shadow: gray; +} + + +/* section 1 */ +#generate section:nth-of-type(1) { + margin-bottom: 2em; +} + +#generate section:nth-of-type(1) ul { + display: flex; + gap: 3vw; +} + +#generate section:nth-of-type(1) li { + background-color: var(--coral-deeppink); + width: 10vw; + height: 5vh; + border-radius: 3em; +} + + +/* section 2 */ +#generate section:nth-of-type(2) { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1em; + background-color: white; + width: 90vw; + height: 40vh; + border-radius: 2em; + padding: 2em; + +} + +#generate section:nth-of-type(2) form { + grid-column-start: 1; + display: flex; + flex-direction: column; + font-family: var(--text); +} + +#generate section:nth-of-type(2) label { + color: black; + font-family: var(--title); + margin-bottom: 1em; +} + +#generate section:nth-of-type(2) textarea { + background-color: var(--light-grey); + border: none; +} + +#generate section:nth-of-type(2) div { + grid-column-start: 2; + width: 5em; +} \ No newline at end of file diff --git a/views/loading.ejs b/views/loading.ejs index 7ebd88f2..7a713e91 100644 --- a/views/loading.ejs +++ b/views/loading.ejs @@ -12,14 +12,16 @@
      +
    • L
    • +
    • O
    • +
    • a
    • +
    • D
    • +
    • I
    • +
    • n
    • G
    • -
    • E
    • -
    • N
    • -
    • E
    • -
    • R
    • -
    • A
    • -
    • T
    • -
    • E
    • +
    • .
    • +
    • .
    • +
    • .
    From 36a4fcd22ab0ae0973a923aba37bfeaf6b1bcb98 Mon Sep 17 00:00:00 2001 From: Laiba Choudhry Date: Thu, 13 Apr 2023 11:40:12 +0200 Subject: [PATCH 60/90] klaar --- routes/poems.js | 18 ++++++++---------- views/poems.ejs | 9 +++++---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/routes/poems.js b/routes/poems.js index dd81a88a..17a2c896 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -21,33 +21,31 @@ router.get('/poems', (req, res) => { if (error) { res.send(error) } else { - console.log(JSON.parse(body).data) - // console.log(body) res.render('poems', { title: 'Make your poem', - poemsData: JSON.parse(body).data + data: Object.values(JSON.parse(body).data) }); } }); }); -router.get('/offline', function(req, res) { +router.get('/offline', function (req, res) { res.render('offline', { title: 'Offline page', pageTitle: 'You are offline' }) }) -router.get('/generate', (req, res)=>{ - request.get(options, (error, response, body)=>{ - if(error){ +router.get('/generate', (req, res) => { + request.get(options, (error, response, body) => { + if (error) { res.send(error) console.log(error) - }else { + } else { console.log(body) res.render('generate-poems', { - title: 'Generating', - generateData: body + title: 'Generating', + generateData: body }); } }) diff --git a/views/poems.ejs b/views/poems.ejs index f5be8f51..d135c4c1 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -15,9 +15,9 @@
    • <% data.forEach((type) => { %> -
    • <%= type.name %>
    • - <% }); %> - +
    • <%= type %>
    • + <% }); %> +
    @@ -59,7 +59,8 @@ - + + \ No newline at end of file From abc75066fcf6f3360028f9d5af78199fb96e7c68 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 11:40:54 +0200 Subject: [PATCH 61/90] poems page --- public/styles/style.css | 28 +++++++++++++++++++++------- views/poems.ejs | 24 +++++++----------------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 489c4c4b..15117588 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -291,6 +291,10 @@ header nav p { /********/ /* MAIN */ /********/ + +/****************/ +/* OFFLINE PAGE */ +/****************/ #offline main { min-height: 50vh; display: flex; @@ -298,12 +302,7 @@ header nav p { align-items: center; } -#start main { - min-height: 50vh; - display: flex; - justify-content: center; - align-items: center; -} + #offline main p { font-size: 18px; @@ -314,6 +313,17 @@ header nav p { zoom: 1.5; } + +/*************/ +/* STARTPAGE */ +/*************/ +#start main { + min-height: 50vh; + display: flex; + justify-content: center; + align-items: center; +} + #start main p { font-size: 18px; margin: 0; @@ -657,4 +667,8 @@ li { #generate section:nth-of-type(2) div { grid-column-start: 2; width: 5em; -} \ No newline at end of file +} + +/**************/ +/* POEMS PAGE */ +/**************/ diff --git a/views/poems.ejs b/views/poems.ejs index 34530e5d..f8018e43 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -5,32 +5,22 @@ <%- include('./partials/head'); %> - +
    <%- include('./partials/header'); %>
    -
    -
      -
    • - -
    • -
    -
    +

    All Your poems

    -
    - - - - - -
    Preview:
    -
    +
    +
    +
    +
    +
    -
    From 96ad624c5971f1d90d405bcc44c92d49df947c4e Mon Sep 17 00:00:00 2001 From: Laiba Choudhry Date: Thu, 13 Apr 2023 11:47:58 +0200 Subject: [PATCH 62/90] label voor preview --- views/poems.ejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/poems.ejs b/views/poems.ejs index d135c4c1..a7b218b7 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -27,8 +27,8 @@ - -
    Preview:
    + +
    Text
    From c8197a0e60b99b597b30a46b4f89291d09c62a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 11:56:47 +0200 Subject: [PATCH 63/90] readme en styles --- README.md | 25 +++++++++++++++++++++++++ public/styles/style.css | 11 +++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3858707a..5592524c 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,31 @@ Teammates: ## Concept During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems For this assignment we will have to fetch an api where you can generate +## 👩🏼‍💻 How to use +### Install nvm +1. To install the server you need node and express. You can do that with nvm. Nvm is package installer where you can install different packages. With this code you can install the latest versions of npm and node in your terminal: +``` +nvm install 19.8.1 +``` + +### Clone repo +2. Clone this repository by running: +``` +git clone https://github.com/RainbowJM/dicho-hackaton.git +``` + +### NPM install +3. Install the dependencies by running: +``` +npm install +``` + +### Start server +Run the following code to start the server: +``` +node app.js +``` + ## Features combined diff --git a/public/styles/style.css b/public/styles/style.css index 0af15d07..b7cbe702 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -23,6 +23,7 @@ --text-color: #2b3044; --font-size: 16px; + --font-size-index: 3em; --duration: 2.5s; --duration-line: 0.84s; } @@ -319,8 +320,8 @@ header nav p { font-size: 18px; margin: 0; color: var(--text-color); - font-size: var(--font-size); - line-height: var(--font-size); + font-size: var(--font-size-index); + line-height: var(--font-size-index); zoom: 1.5; } @@ -333,7 +334,7 @@ header nav p { #start main p .link div:first-child { display: flex; overflow: hidden; - text-shadow: 0 var(--font-size) 0 var(--text-color); + text-shadow: 0 var(--font-size-index) 0 var(--text-color); } #start main p .link div:last-child { @@ -361,7 +362,7 @@ header nav p { } 50% { - transform: translateY(calc(var(--font-size) * -1)); + transform: translateY(calc(var(--font-size-index) * -1)); } 100% { @@ -608,6 +609,8 @@ header nav p { background-color:var(--light-grey) ; border: none; width: 30vw; + border-radius: 1em; + padding: 1em; } From b33cc678195f96170f193e7202c7fa67476d4a7f Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Thu, 13 Apr 2023 12:00:20 +0200 Subject: [PATCH 64/90] mini fix --- public/styles/style.css | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 3234d8e1..4ca52378 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -512,16 +512,17 @@ li { animation-iteration-count: infinite; animation-fill-mode: backwards; animation-delay: calc(var(--duration) * 1s / var(--length) * (var(--index) - var(--length))); - text-shadow: 0 1px 2px rgb(0 0 0/ 0.5); - - #generate section:nth-of-type(2) textarea { - background-color:var(--light-grey) ; - border: none; - width: 30vw; - border-radius: 1em; - padding: 1em; - - } + text-shadow: 0 1px 2px rgb(0 0 0/ 0.5); +} + +#generate section:nth-of-type(2) textarea { + background-color: var(--light-grey); + border: none; + width: 30vw; + border-radius: 1em; + padding: 1em; + +} #loading>li:nth-of-type(1) { @@ -679,4 +680,4 @@ li { /**************/ /* POEMS PAGE */ -/**************/ +/**************/ \ No newline at end of file From 810ba12322a0b686590e10a7969808aba1cf8d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 12:02:12 +0200 Subject: [PATCH 65/90] readme --- README.md | 10 +++++++--- public/styles/style.css | 3 +-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5592524c..c4260bc2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Dicho di Hubentut ~ Youth poetry + +## 👁️ Live Site Link! 👁️ + ## Projectweek 3: Hackathon Teammates: - Jevona Magdalena @@ -10,7 +13,7 @@ Teammates: ## Concept During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems For this assignment we will have to fetch an api where you can generate -## 👩🏼‍💻 How to use +## 💻 Intallation guide 💻 ### Install nvm 1. To install the server you need node and express. You can do that with nvm. Nvm is package installer where you can install different packages. With this code you can install the latest versions of npm and node in your terminal: ``` @@ -35,8 +38,9 @@ Run the following code to start the server: node app.js ``` -## Features combined - +## 🛠️ Features combined 🛠️ +## 📄 Licence 📄 +This project has a MIT License - see the license file for more details. --- diff --git a/public/styles/style.css b/public/styles/style.css index b7cbe702..e6046355 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -601,8 +601,7 @@ header nav p { color: var(--coral-deeppink) ; font-family: var(--title); margin-bottom: 1em ; - font-size: var(--font-size); - + font-size: var(--font-size); } #generate section:nth-of-type(2) textarea { From 3253526985d93de05007821b76827ff068678ff2 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 12:10:15 +0200 Subject: [PATCH 66/90] Hilal styling --- public/styles/style.css | 174 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 164 insertions(+), 10 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 20d30351..6f4b3000 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -605,71 +605,225 @@ li { - /************/ + /* GENERATOR */ + /************/ + #generate main { + justify-content: center; + width: 90vw; + height: 55vh; + margin: auto; - box-shadow: gray; + + box-shadow: var(--gray); + } + + + + /* section 1 */ + #generate section:nth-of-type(1) { - margin-bottom: 2em; + + margin-bottom: 1em; + } + + + #generate section:nth-of-type(1) ul { + display: flex; + gap: 3vw; + } + + + #generate section:nth-of-type(1) li { - background-color: var(--coral-deeppink); + + background-color: var(--white); + ; + width: 10vw; - height: 5vh; - border-radius: 3em; + + height: 7vh; + + border-radius: 4em; + } + + + /* section 2 */ + #generate section:nth-of-type(2) { + display: grid; + grid-template-columns: 1fr 1fr; - gap: 1em; - background-color: white; + + gap: 3em; + width: 90vw; + height: 40vh; + border-radius: 2em; + padding: 2em; } + + + #generate section:nth-of-type(2) form { + grid-column-start: 1; + display: flex; + flex-direction: column; + font-family: var(--text); + + background-color: var(--white); + + padding: 1.5em 2em; + + width: 35vw; + + height: 50vh; + + position: relative; + + box-shadow: 0px 3px 4px var(--gray); + + border-radius: 2em; + +} + + + + +#generate section:nth-of-type(2) form h2 { + + font-family: var(--title); + + font-size: var(--font-size); + + margin-bottom: 1em; + } + + + #generate section:nth-of-type(2) label { - color: black; + + color: var(--coral-deeppink); + font-family: var(--title); + margin-bottom: 1em; + + font-size: var(--font-size); + } + + + #generate section:nth-of-type(2) textarea { + background-color: var(--light-grey); + border: none; + + width: 30vw; + + border-radius: 1em; + + padding: 1em; + + + } + + + +#generate section:nth-of-type(2) form button { + + background-color: var(--coral-deeppink); + + padding: 1em 2em; + + border-radius: 3em; + + justify-content: center; + + margin: auto; + + border: none; + + color: var(--white); + ; + + margin-top: 2em; + +} + + + + + #generate section:nth-of-type(2) div { + grid-column-start: 2; - width: 5em; + + background-color: var(--white); + + padding: 1.5em 2em; + + width: 35vw; + + height: 30vh; + + border-radius: 2em; + + margin-top: 10vh; + + box-shadow: 0px 3px 4px var(--gray); + +} + + + + +#generate section:nth-of-type(2) div h2 { + + font-family: var(--title); + + color: var(--black); + + font-size: var(--font-size); + } /**************/ From d443d594339d5ae4ec560a27c0f24f6e05f6dffd Mon Sep 17 00:00:00 2001 From: Laiba Choudhry Date: Thu, 13 Apr 2023 12:23:00 +0200 Subject: [PATCH 67/90] UEGHBWJNKADLS --- routes/poems.js | 10 ++++------ views/generate-poems.ejs | 43 +++++++++++++++++----------------------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/routes/poems.js b/routes/poems.js index 573d0c33..6d4592e7 100644 --- a/routes/poems.js +++ b/routes/poems.js @@ -47,15 +47,13 @@ router.get('/generate', (req, res) => { request.get(options, (error, response, body) => { if (error) { res.send(error) - console.log(error) } else { - console.log(body) res.render('generate-poems', { - title: 'Generating', - generateData: body + title: 'Make your poem', + data: Object.values(JSON.parse(body).data) }); } - }) -}) + }); +}); module.exports = router; \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index 3260c95c..ce583033 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -5,47 +5,40 @@ <%- include('./partials/head'); %> - -
    <%- include('./partials/header'); %>
    - -
    +
    • - -
    • -
    • -
    • -
    • -
    • -
    • -
    • + <% data.forEach((type) => { %> +
    • <%= type %>
    • + <% }); %> +
    -
    -

    Make your poems

    - - + + + - -
    - -
    -

    Preview:

    -
    + +
    Text
    +
    - -
    + <%- include('./partials/background-decoration'); %> + + + + + - \ No newline at end of file + From c0faf865123971f4acdfb0a342963cd0dd873233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 12:25:00 +0200 Subject: [PATCH 68/90] readme --- README.md | 49 ++++++++++++++++++++++++++++++++++++++--- public/styles/style.css | 1 + 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c4260bc2..a53ff464 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ -# Dicho di Hubentut ~ Youth poetry +# 👋🏼 Dicho di Hubentut ~ Youth poetry -## 👁️ Live Site Link! 👁️ + +## 👁️ Demo Link! 👁️ +- insert link + +--- ## Projectweek 3: Hackathon Teammates: @@ -10,8 +14,18 @@ Teammates: - Hilal Tapan - Laiba Choudhry +--- + ## Concept -During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems For this assignment we will have to fetch an api where you can generate +During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems. For this assignment we will have to fetch an api where you can generate poems +- leg verder uit + +--- + +## Job story +Leg uit + +--- ## 💻 Intallation guide 💻 ### Install nvm @@ -38,9 +52,38 @@ Run the following code to start the server: node app.js ``` +--- + ## 🛠️ Features combined 🛠️ +Leg uit +--- ## 📄 Licence 📄 This project has a MIT License - see the license file for more details. + +--- + +## 💾 Used technologies 💾 +- EJS templating engine +- Node.js +- Service worker +- Express + +--- + +## schetsen +uitleg per pagina schets + + +--- + +## hi fi prototype + + +--- + +## 📁 Sources 📁 + + --- diff --git a/public/styles/style.css b/public/styles/style.css index e6046355..1107b85e 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -571,6 +571,7 @@ header nav p { display: grid; grid-template-columns: 1fr 1fr; gap: 3em; + width: 90vw; height: 40vh; border-radius: 2em; From f849d26a03383e13b8e8ef885a5b5bf9a75b007a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 12:38:40 +0200 Subject: [PATCH 69/90] spaties --- public/styles/style.css | 80 +--------------------------------------- views/generate-poems.ejs | 4 +- 2 files changed, 3 insertions(+), 81 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 4e5e9cad..e3f7cf37 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -613,186 +613,108 @@ li { } /************/ - /* GENERATOR */ - /************/ - #generate main { - justify-content: center; - width: 90vw; - height: 55vh; - margin: auto; - box-shadow: var(--gray); - } /* section 1 */ - #generate section:nth-of-type(1) { - margin-bottom: 1em; - } #generate section:nth-of-type(1) ul { - display: flex; - gap: 3vw; - } #generate section:nth-of-type(1) li { - background-color: var(--white); - ; - width: 10vw; - height: 7vh; - border-radius: 4em; - } /* section 2 */ #generate section:nth-of-type(2) { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 3em; - width: 90vw; - height: 40vh; - border-radius: 2em; - padding: 2em; - } #generate section:nth-of-type(2) form { - grid-column-start: 1; - display: flex; - flex-direction: column; - font-family: var(--text); - background-color: var(--white); - padding: 1.5em 2em; - width: 35vw; - height: 50vh; - position: relative; - box-shadow: 0px 3px 4px var(--gray); - border-radius: 2em; - } #generate section:nth-of-type(2) form h2 { - font-family: var(--title); - font-size: var(--font-size); - margin-bottom: 1em; - } #generate section:nth-of-type(2) label { - color: var(--coral-deeppink); - font-family: var(--title); - margin-bottom: 1em; - font-size: var(--font-size); - } #generate section:nth-of-type(2) textarea { - background-color: var(--light-grey); - border: none; - width: 30vw; - border-radius: 1em; - padding: 1em; } #generate section:nth-of-type(2) form button { - background-color: var(--coral-deeppink); - padding: 1em 2em; - border-radius: 3em; - justify-content: center; - margin: auto; - border: none; - color: var(--white); - ; - margin-top: 2em; - } #generate section:nth-of-type(2) div { - grid-column-start: 2; - background-color: var(--white); - padding: 1.5em 2em; - width: 35vw; - height: 30vh; - border-radius: 2em; - margin-top: 10vh; - box-shadow: 0px 3px 4px var(--gray); - } #generate section:nth-of-type(2) div h2 { - font-family: var(--title); - color: var(--black); - font-size: var(--font-size); - } /**************/ /* POEMS PAGE */ -/**************/ +/**************/ \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index ce583033..adadbba2 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -27,8 +27,8 @@ - -
    Text
    + +
    Preview
    From 7f1801624da6c96a1217833644d1518af037e74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 13:27:28 +0200 Subject: [PATCH 70/90] styling fixed --- public/styles/style.css | 30 ++++++++++++++++++++++-------- views/generate-poems.ejs | 13 +++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index e3f7cf37..c8683b4a 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -499,7 +499,7 @@ header nav p { } } -li { +#loading-main li { width: 1em; aspect-ratio: 2; font-size: 1.5em; @@ -521,10 +521,8 @@ li { width: 30vw; border-radius: 1em; padding: 1em; - } - #loading>li:nth-of-type(1) { /* --delay:0s; */ --index: 0; @@ -629,19 +627,35 @@ li { } #generate section:nth-of-type(1) ul { - display: flex; + display: grid; gap: 3vw; + grid-template-columns: repeat(13, 1fr); + width: 90vw; + overflow-y: scroll; +} + +#generate section:nth-of-type(1) li:nth-of-type(1) { + display: none; } -#generate section:nth-of-type(1) li { +#generate section:nth-of-type(1) li{ + display: flex; background-color: var(--white); width: 10vw; - height: 7vh; + height: 5vh; border-radius: 4em; + color: var(--black); + font-size: 12px; + justify-content: center; + align-items: center; } -/* section 2 */ +#generate section:nth-of-type(1) li:hover { + background-color: var(--coral-deeppink); + color: var(--white); +} +/* section 2 */ #generate section:nth-of-type(2) { display: grid; grid-template-columns: 1fr 1fr; @@ -695,7 +709,7 @@ li { margin: auto; border: none; color: var(--white); - margin-top: 2em; + margin-top: 3em; } #generate section:nth-of-type(2) div { diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index adadbba2..03c295f1 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -22,14 +22,15 @@
    -
    + +

    Make your poems

    - - - - -
    Preview
    + +
    + +
    Preview +
    From 8b2a578d66e38bd506282616c47b54464f701921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 14:54:19 +0200 Subject: [PATCH 71/90] random --- public/styles/style.css | 19 +++++++++++++++++++ views/generate-poems.ejs | 5 +++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index c8683b4a..d415caaf 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -634,6 +634,13 @@ header nav p { overflow-y: scroll; } +#generate section:nth-of-type(1) h2 { + font-family: var(--title); + font-size: var(--font-size); + margin-bottom: 1em; + color: var(--coral-deeppink); +} + #generate section:nth-of-type(1) li:nth-of-type(1) { display: none; } @@ -655,6 +662,16 @@ header nav p { color: var(--white); } +#generate section:nth-of-type(1) li:focus { + background-color: var(--coral-deeppink); + color: var(--white); +} + +#generate section:nth-of-type(1) li:active { + background-color: var(--coral-deeppink); + color: var(--white); +} + /* section 2 */ #generate section:nth-of-type(2) { display: grid; @@ -691,6 +708,8 @@ header nav p { font-family: var(--title); margin-bottom: 1em; font-size: var(--font-size); + font-weight: bold; + } #generate section:nth-of-type(2) textarea { diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index 03c295f1..e22b2b54 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -12,6 +12,7 @@
    +

    Choose a type

    • <% data.forEach((type) => { %> @@ -23,8 +24,8 @@
      -

      Make your poems

      - +

      Make your poem

      +
      From 3c1d125444cbfc3c5a721fd094491f4c75161d80 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Thu, 13 Apr 2023 15:34:10 +0200 Subject: [PATCH 72/90] fixed header --- views/index.ejs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/views/index.ejs b/views/index.ejs index a18ee435..40a03974 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -7,9 +7,12 @@
      - <%- include('./partials/header'); %> +
      - +

      From d07641993df3760ba5e9ba1dd760e2631416951f Mon Sep 17 00:00:00 2001 From: Laiba Choudhry Date: Thu, 13 Apr 2023 16:21:22 +0200 Subject: [PATCH 73/90] inbraak --- public/styles/style.css | 3 ++- views/generate-poems.ejs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index d415caaf..84b2a625 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -722,13 +722,14 @@ header nav p { #generate section:nth-of-type(2) form button { background-color: var(--coral-deeppink); - padding: 1em 2em; + padding: 2em 3em; border-radius: 3em; justify-content: center; margin: auto; border: none; color: var(--white); margin-top: 3em; + box-shadow: 5px 5px #888888; } #generate section:nth-of-type(2) div { diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index e22b2b54..86b5dd82 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -24,7 +24,7 @@
      -

      Make your poem

      +

      Make your own poem

      From ea8f7b2a6b305d25d0dfc291f416e1a0b7cde2db Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 20:01:21 +0200 Subject: [PATCH 74/90] transition from the loading page to the poems page --- public/scripts/loading.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 public/scripts/loading.js diff --git a/public/scripts/loading.js b/public/scripts/loading.js new file mode 100644 index 00000000..83eb9c64 --- /dev/null +++ b/public/scripts/loading.js @@ -0,0 +1,6 @@ +console.log('Holaa'); + +setTimeout(() => { + console.log("Delayed for 5 second."); + window.location.href ="http://localhost:8000/poems" +}, 5000) \ No newline at end of file From 1c2af2caaac83f170e75a411d2d7681e973c5688 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 20:01:36 +0200 Subject: [PATCH 75/90] script tag added --- views/loading.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/views/loading.ejs b/views/loading.ejs index 7a713e91..21e1c148 100644 --- a/views/loading.ejs +++ b/views/loading.ejs @@ -3,6 +3,7 @@ <%- include('./partials/head'); %> + From 75df75a72297d344d157ea6cee6cffc6ab86e619 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 20:01:55 +0200 Subject: [PATCH 76/90] poems page css styling and html structure --- public/styles/style.css | 81 +++++++++++++++++++++++++++++++++++++++++ views/poems.ejs | 30 +++++++++++---- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/public/styles/style.css b/public/styles/style.css index 4e5e9cad..5e86b3b0 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -24,6 +24,7 @@ --text-color: #2b3044; --font-size: 16px; --font-size-index: 3em; + --font-size-poems: 3em; --duration: 2.5s; --duration-line: 0.84s; } @@ -289,6 +290,9 @@ header nav p { .background-decoration-3 { display: none; } + + + } /********/ @@ -796,3 +800,80 @@ li { /**************/ /* POEMS PAGE */ /**************/ +#poems-page main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +#poems-page main section h2 { +padding: 1em 1em 1em 2em; +} + +#poems-page main section { + display: flex; + flex-direction: column; + width: fit-content; + background-color: var(--white); + border-radius: 1em; + box-shadow: 0px 3px 4px var(--gray); + /* height: 35vh; */ +} + +#poems-page main article { + padding: 3em; + width: 50vw; + +} + +#poems-page main p { + line-height: 1.9; + font-size: clamp(1em, 5vw, 3em); +} + +#poems-page main section a { + display: inline-block; + padding: 1em 1.5em; + background-color: var(--coral-deeppink); + color: white; + border-radius: 3em; + font-weight: 500; + text-align: center; + width: fit-content; + align-self: center; + margin: 1em; +} + +#poems-page select { + cursor: pointer; + appearance: none; + -webkit-appearance: none; + outline-color: var(--coral-deeppink); + border: 3px solid var(--coral-deeppink); + border-radius: 3em; + height: 8vh; + text-align: center; + font-size: 1em; + width: 8em; + +} + +#poems-page select:focus, #poems-page select:hover { + color: var(--coral-deeppink); +} + + +option { + + font-size: inherit; + /* background-color: var(--coral-deeppink); + color: var(--white); */ +} + + +option:hover { + + background-color: var(--coral-deeppink); + color: var(--white); +} \ No newline at end of file diff --git a/views/poems.ejs b/views/poems.ejs index f8018e43..1562c3ab 100644 --- a/views/poems.ejs +++ b/views/poems.ejs @@ -11,14 +11,30 @@
      -

      All Your poems

      +
      -
      -
      -
      -
      -
      +

      Your generated poem

      +
      +

      In a + full of + a child meets a strange particular creature. +

      +
      + + Make another poems + +
      @@ -27,7 +43,7 @@ <%- include('./partials/footer'); %>
    -<%- include('./partials/background-decoration'); %> + <%- include('./partials/background-decoration'); %> From 65f8271a1b4da9a15558c91fff0344cea0e7f4c1 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Thu, 13 Apr 2023 20:07:28 +0200 Subject: [PATCH 77/90] font size fixed --- public/styles/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/styles/style.css b/public/styles/style.css index 5e86b3b0..068188f4 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -829,7 +829,7 @@ padding: 1em 1em 1em 2em; #poems-page main p { line-height: 1.9; - font-size: clamp(1em, 5vw, 3em); + font-size: clamp(1em, 2.5vw, 3em); } #poems-page main section a { From 51bdc2425d0fc67fd5f9c8853624f27b4e91b7bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 20:10:39 +0200 Subject: [PATCH 78/90] changes --- public/scripts/keyboard.js | 30 ++++++++++++++++++++++++++++++ views/generate-poems.ejs | 2 ++ views/partials/head.ejs | 3 ++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 public/scripts/keyboard.js diff --git a/public/scripts/keyboard.js b/public/scripts/keyboard.js new file mode 100644 index 00000000..01b50987 --- /dev/null +++ b/public/scripts/keyboard.js @@ -0,0 +1,30 @@ +// var textarea = document.getElementById("input-text"); +// textarea.addEventListener("click", openKeyboard); + + +// function openKeyboard() { +// $('input-text').keyboard(); +// } + +var textarea = document.getElementById("#input-text"); + +textarea.addEventListener("click", function() { + openKeyboard(); +}); + +function openKeyboard() { + // Create an instance of the Google IME API + var ime = new google.ime.InputMethodEditor(); + + // Call the activate() method to activate the On-Screen Keyboard + ime.activate(["transliteration"], function() { + ime.setLanguage("en"); + ime.setOnStateChangeHandler(function(isOn) { + if (isOn) { + // The On-Screen Keyboard is now active + } else { + // The On-Screen Keyboard is no longer active + } + }); + }); + } \ No newline at end of file diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index e22b2b54..eb0e5926 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -40,6 +40,8 @@ + + diff --git a/views/partials/head.ejs b/views/partials/head.ejs index 44625260..62fda575 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -11,4 +11,5 @@ - \ No newline at end of file + + \ No newline at end of file From 6c57b9ce34c1d946388937a6765f2e998226d457 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Thu, 13 Apr 2023 21:35:44 +0200 Subject: [PATCH 79/90] more words --- public/scripts/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/script.js b/public/scripts/script.js index f60ab3c8..f7a67082 100644 --- a/public/scripts/script.js +++ b/public/scripts/script.js @@ -1,4 +1,4 @@ -const words = ["Dicho", "Poetry", "Gedichten", "Poemas", "시", "Poèmes"]; +const words = ["Dicho", "Poetry","Şiir", "Gedichten","نظم", "Poemas", "시", "Poèmes"]; const linkElements = document.querySelectorAll(".link"); function animateWords() { From a48fc9f8e669cbff18c67cbe769f7094af717342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 23:20:40 +0200 Subject: [PATCH 80/90] keyboard die niet werkt --- public/scripts/preview.js | 2 +- views/generate-poems.ejs | 1 + views/partials/head.ejs | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/scripts/preview.js b/public/scripts/preview.js index 28db43dc..67392a0e 100644 --- a/public/scripts/preview.js +++ b/public/scripts/preview.js @@ -3,4 +3,4 @@ const preview = document.querySelector(".preview"); input.addEventListener("input", () => { preview.innerText = input.value; -}); \ No newline at end of file +}); diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index eb0e5926..32786fd2 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -3,6 +3,7 @@ <%- include('./partials/head'); %> + diff --git a/views/partials/head.ejs b/views/partials/head.ejs index 62fda575..ea2ca836 100644 --- a/views/partials/head.ejs +++ b/views/partials/head.ejs @@ -12,4 +12,3 @@ - \ No newline at end of file From e9fc0766cb5c4877d7ff7da60d986a55eb4916a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Thu, 13 Apr 2023 23:36:08 +0200 Subject: [PATCH 81/90] script --- views/generate-poems.ejs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index 32786fd2..1d1ef5d2 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -39,6 +39,20 @@ <%- include('./partials/background-decoration'); %> + From 9211fcbba94384a3207a0f7abcbc6258028a43d1 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Fri, 14 Apr 2023 10:33:44 +0200 Subject: [PATCH 82/90] mini fix --- public/scripts/script.js | 2 +- views/index.ejs | 2 +- views/partials/header.ejs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/scripts/script.js b/public/scripts/script.js index f7a67082..fbbe398d 100644 --- a/public/scripts/script.js +++ b/public/scripts/script.js @@ -1,4 +1,4 @@ -const words = ["Dicho", "Poetry","Şiir", "Gedichten","نظم", "Poemas", "시", "Poèmes"]; +const words = ["Tra bo dicho", "Make your poetry","Şiirini yap", "Maak je poëzie","نظم", "Haz tu poesía", "시 만들기", "Faites votre poésie"]; const linkElements = document.querySelectorAll(".link"); function animateWords() { diff --git a/views/index.ejs b/views/index.ejs index 40a03974..ae50312f 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -9,7 +9,7 @@
    diff --git a/views/partials/header.ejs b/views/partials/header.ejs index 8026fc46..04b9c968 100644 --- a/views/partials/header.ejs +++ b/views/partials/header.ejs @@ -1,5 +1,5 @@ \ No newline at end of file From fd86eb75a079299cfa77d3617ae2213348e59257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Fri, 14 Apr 2023 10:44:20 +0200 Subject: [PATCH 83/90] keyboard gone --- public/scripts/keyboard.js | 30 ------------------------------ public/styles/style.css | 21 +++++++++++++++++---- views/generate-poems.ejs | 21 +-------------------- 3 files changed, 18 insertions(+), 54 deletions(-) delete mode 100644 public/scripts/keyboard.js diff --git a/public/scripts/keyboard.js b/public/scripts/keyboard.js deleted file mode 100644 index 01b50987..00000000 --- a/public/scripts/keyboard.js +++ /dev/null @@ -1,30 +0,0 @@ -// var textarea = document.getElementById("input-text"); -// textarea.addEventListener("click", openKeyboard); - - -// function openKeyboard() { -// $('input-text').keyboard(); -// } - -var textarea = document.getElementById("#input-text"); - -textarea.addEventListener("click", function() { - openKeyboard(); -}); - -function openKeyboard() { - // Create an instance of the Google IME API - var ime = new google.ime.InputMethodEditor(); - - // Call the activate() method to activate the On-Screen Keyboard - ime.activate(["transliteration"], function() { - ime.setLanguage("en"); - ime.setOnStateChangeHandler(function(isOn) { - if (isOn) { - // The On-Screen Keyboard is now active - } else { - // The On-Screen Keyboard is no longer active - } - }); - }); - } \ No newline at end of file diff --git a/public/styles/style.css b/public/styles/style.css index 66b2eebb..774947a7 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -635,7 +635,7 @@ header nav p { gap: 3vw; grid-template-columns: repeat(13, 1fr); width: 90vw; - overflow-y: scroll; + overflow-X: auto; } #generate section:nth-of-type(1) h2 { @@ -649,7 +649,7 @@ header nav p { display: none; } -#generate section:nth-of-type(1) li{ +#generate section:nth-of-type(1) li { display: flex; background-color: var(--white); width: 10vw; @@ -661,6 +661,10 @@ header nav p { align-items: center; } +#generate section:nth-of-type(1) li::first-letter { + text-transform: uppercase; +} + #generate section:nth-of-type(1) li:hover { background-color: var(--coral-deeppink); color: var(--white); @@ -713,7 +717,6 @@ header nav p { margin-bottom: 1em; font-size: var(--font-size); font-weight: bold; - } #generate section:nth-of-type(2) textarea { @@ -733,7 +736,17 @@ header nav p { border: none; color: var(--white); margin-top: 3em; - box-shadow: 5px 5px #888888; + box-shadow: 0px 3px 4px var(--gray); +} + +#generate section:nth-of-type(2) form button:hover { + background-color: var(--white); + color: var(--coral-deeppink); +} + +#generate section:nth-of-type(2) form button:focus { + background-color: var(--white); + color: var(--coral-deeppink); } #generate section:nth-of-type(2) div { diff --git a/views/generate-poems.ejs b/views/generate-poems.ejs index e1e19e42..05495bf9 100644 --- a/views/generate-poems.ejs +++ b/views/generate-poems.ejs @@ -3,7 +3,6 @@ <%- include('./partials/head'); %> - @@ -25,7 +24,7 @@
    -

    Make your own poem

    +

    Make your poem

    @@ -38,25 +37,7 @@ <%- include('./partials/background-decoration'); %> - - - - - From c22e0fd77774795c9b1c99771702b51b8a2bd45b Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Fri, 14 Apr 2023 10:47:33 +0200 Subject: [PATCH 84/90] new text --- public/scripts/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/script.js b/public/scripts/script.js index fbbe398d..4ed507ac 100644 --- a/public/scripts/script.js +++ b/public/scripts/script.js @@ -1,4 +1,4 @@ -const words = ["Tra bo dicho", "Make your poetry","Şiirini yap", "Maak je poëzie","نظم", "Haz tu poesía", "시 만들기", "Faites votre poésie"]; +const words = ["Tra bo dicho", "Make your poetry","Şiirini yap", "Maak je poëzie","اپنی شاعری بنائیں", "Haz tu poesía", "시 만들기", "Faites votre poésie"]; const linkElements = document.querySelectorAll(".link"); function animateWords() { From 82d87b74c4aca221cccf2a57f75aa0ed5bf50667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Fri, 14 Apr 2023 11:43:15 +0200 Subject: [PATCH 85/90] readme --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 55 ++++++++++++++++++++++-------- public/.DS_Store | Bin 6148 -> 6148 bytes public/images/Startpagina (1).png | Bin 0 -> 43144 bytes public/images/Startpagina.png | Bin 0 -> 27792 bytes public/images/loading.png | Bin 0 -> 28000 bytes public/images/poems page.png | Bin 0 -> 46783 bytes public/images/prompt forms.png | Bin 0 -> 39566 bytes public/images/propmpt-page.png | Bin 0 -> 43721 bytes 9 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 public/images/Startpagina (1).png create mode 100644 public/images/Startpagina.png create mode 100644 public/images/loading.png create mode 100644 public/images/poems page.png create mode 100644 public/images/prompt forms.png create mode 100644 public/images/propmpt-page.png diff --git a/.DS_Store b/.DS_Store index 4c0bbfe245390b26675426205da68830bde51b08..5eb303377b6d6c6b128a9f19f7f5d34d5518055e 100644 GIT binary patch delta 130 zcmZoMXffEJ&BAKUz`&p}*?`4}jZqxPoH03r#fFVxC0KM7i!m!mP-8M5tHk7AEc~pk zP~LJ8BXdg~1!E(_S{;RIb8`b71ruYl$tPKh*cd;9)i|=LgUy~XIhRe98)V*$|6s7O MFpF_BJI7ys02n4Ag8%>k delta 130 zcmZoMXffEJ&BE%)z`&q4*?`4}jbS~QnZaVi#wZJBu3|A}?FO^>SS2R^V&P}~3FR#p zF*UN(Q7|+$sMS%Zwlp-a;7tj3W|9c=cR$+>K*+#sXZ{0D=Lg;|W7 J**X650{}dHA=Ur@ diff --git a/README.md b/README.md index a53ff464..8853ed33 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,28 @@ # 👋🏼 Dicho di Hubentut ~ Youth poetry - +![logo](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/PW2%20-%20Hackaton%20trans.png) ## 👁️ Demo Link! 👁️ -- insert link +[dicho-hackaton-production.up.railway.app/](dicho-hackaton-production.up.railway.app/) --- -## Projectweek 3: Hackathon +## 💻 Projectweek 3: Hackathon 💻 Teammates: -- Jevona Magdalena -- Keïsha Alexander -- Hilal Tapan -- Laiba Choudhry +- 👩🏾 Jevona Magdalena +- 👩🏾 Keïsha Alexander +- 👩🏻 Hilal Tapan +- 👩🏽 Laiba Choudhry --- ## Concept -During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems. For this assignment we will have to fetch an api where you can generate poems -- leg verder uit +During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems. For this assignment we will have to fetch an api where you can generate poems based on themes and types. The user has a few types to choose from and fir the theme they can write anything they want. --- -## Job story -Leg uit +## 📖 Job story 📖 +When I am in a museum I would like to be able to generate poems based on themes. --- @@ -55,7 +54,11 @@ node app.js --- ## 🛠️ Features combined 🛠️ -Leg uit +- Can generate poems +- Can put own input +- Works on 73 inch screen +- Works on touchscreen +- preview mode on input fields --- @@ -72,13 +75,35 @@ This project has a MIT License - see the license file for more details. --- -## schetsen -uitleg per pagina schets +## 🖊 Schetsen 🖊 +* Schets 1 +[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-0.png) + +* Schets 2 +[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-1.png) + + +* Schets 3 +[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-2.png) + + +* Schets 4 +[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-3.png) + +* Startpage schets +[startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/startpage.png) + +* Loading state schets +[startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/loading-state.png) + +--- + +## 🔮 Hi fi prototype 🔮 --- -## hi fi prototype +## 👩🏼 User test 👩🏼 --- diff --git a/public/.DS_Store b/public/.DS_Store index ea0f82e64eea83697a04297532c2645af61a02a0..68dc925bdd8c3669e859e705901d95fcf008c19d 100644 GIT binary patch delta 33 ocmZoMXffDuok_&V+)_uu*vPO}N1@u>+(1Xc#Mo@}YbHri0HoImBLDyZ delta 33 ocmZoMXffDuok_&h$Wlka(A1z-N1@u%&`?Lg+{kqEYbHri0Hl!#9{>OV diff --git a/public/images/Startpagina (1).png b/public/images/Startpagina (1).png new file mode 100644 index 0000000000000000000000000000000000000000..9ccda3de3e6e92b3328470c8eb8b4171255d2a44 GIT binary patch literal 43144 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 Sje>-n(e#4Vd4i!!?Ee66x|FW~ literal 0 HcmV?d00001 diff --git a/public/images/loading.png b/public/images/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..580932a5c69105016527a07c06e796f13a0970bd GIT binary patch literal 28000 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

    ?I?0qSLx2nOVe@ND z>q_lLj0u)V)4&EuS_fV?cz13;;3~zIVaJ6@H^dWxyItJ4 zIAZnLE)mF8P`~@&tmTCJzkN-++m83x$SRY(f3B?^xOe$rKT+64mL~awa{BwPL4Nb^ zm9ICeMqoAQWIE4;H|^n$6C;QEQ^>(OLR8n5xOzqs*Tm-?aTDUik7^&RbhRLR>^#4H zA}2wA8%T@|02&p)Up?fzhhA7zT-`T#d}D6+WPxJ0l1Ut z(%gZ#wqZVfEtx`hEBZE1W-de5Y0QuEpE6es;xqffD6Mks{`FwWOPO~Hv$aFK@hvnRht@Bjy`&_6Q`m>5c0(x%cu!SQ4R?obn@cvxt1-us;bu4GQwz96uO1e^k zGPk>uTEFuQIHB|KZ8Zg?%ohw1iOKX{T6d}X?hYs?-}8ySyfRELb$5~NVRfm=>>6v} zLR)RDA<1rX`!UP>?S7x*ZQssH0%@#MyMIDA!|~Wg!B7RM7guT1AyhYo%r{#Lb(H{1 z-|lYFL?0%I4Uj&XkGI7v_AVDy^r;5ZtnM!)o2moH(E?u7&Nrb(uRb)N?px~4hDxGL zb{Zu+8X^wD0Sg32^H5&JPGzGVtDvnV^Zq2527HP4Z}(nufzGsmnV{LTcVC%UDlJ&E ze}o>I(FbR=6`#h@&nnoFyhz@Z@e>FYMd87ne*6uqCh!w96%5=yp7KFwKK^T7=y)%W zZo&{{&p1@GKW?8cGY#y*LI6U5<#5k zv_GZ*?ik_o&hRjL`Y_tERI_Pz6C0m>`f|L^%h|&32smDp)?qxAZD|=etLN2w=2;NP z@m(6YfI1O@eZ_T>80$aJ@%UtZbYI!!)!3+L+w}AL@XGOnD!Ku*Si^9tl zu2VZWm!~&M%`4DRCkxZaP~P68D%57di}dcl_L43XH{t#}d8xo1Owa1H&iXT%gBk>% z4)QUHT^@y*GB8`AyP23C1b!C9aAy58Wf_UcFaYTmDI(LQ|C7 zQJ6e~KKk>41WiD&tx!vgcoto|#{v+Yiy5i>Ku`7KWykSIg=K(gEvUH$}@dj4aWP z%LrsS`Md)wNBJq%v$PW-fLr0hFjLwQzd+u{Ye>UoE9m>pY@{LA=96`qA?xk48*n}H z%nWZQ>y*vg{oj76T3J~o8KiWnFNFai#cq&Q+@}Vmy9Pi8oWKH?+=OX$}`tu zMrs=?hpL6RYJmpiWVi1{fiddSP~#!Xz#PA|O`34=7-Rp%M?U`o=J9NqHjsRw+|z)L@qkZZGX?G$ zIJa;bu6}8$+^%x0K9O2Wzve7$o#4gvA8v=QLo1Mm?91E!mp)0Xm+w8SA#K|!v4Sum zjKiS8gkV)bFXx+n&OTvC!E(9b^>m}Azy`-9lc&;n=}k^Rv$>2nN`4S>ve}S zfjg~@@O<0yx-y3ewJ*X&+Sh!ajQs9?WUOdd2C1m*R;JQsNqa-n?fh+4* z#`LAGF7uzw@+ZlhqLT>3mwp$p?1xj!qJxC;n3D5EiN6*Q@VW$15?qcCcr~qF?_^2s zNO!gEcrEXl)Cf!}@7`f=*E&1=al~VjiOAqm#)J-x|C$Ah;l4rVD*bTLf}GJF>;3BC zo$G&6771jwUgvH~Hb_-vnDE*&N>z<-bOqO@LTK>iimiY24HW-XelsuDUe$JfI;rlIWPluEyt!g=9d0~X^=;W)|#_qLf zZ=yT78m)?+1Hj*N_UzY$6V(fZ&&A94F~eDRU_=omD$UHpKEh{BhRKAF%!9X}vDbw#lV+MV;9$7hjS1 zAj{-fvCo~X?csfgIkbrnHKp}#is|r^JA0`3Kxb>_t~VdDP8GNcg^TO^_m}8&_16(@ zu{S&3T+t0qDzB|d^xvW#;y;nI-agj3JR!%#I2^gY4qj*H)exO9K4to&jR0=1+l|n( zvmAD~A*G#boDBCA5U#Q7MH6zzT}|6|p`O|mE9>ekR4d0mI<4qY8bj@h&Q;B;ct_Ww z)#tCBdZRF&DLgGFOs~r8i|U45=i>vuZyNUs@F6Tbn9qJgkGPiMfhX|iqG_Rs%w0lj zDQ)->;nmgsb^TMR>LVjMrUEX<6#s1*s=uylH&!L2Pi_3c^sDQ!ANoKHgkE|Fxxq zvSr+G?`!{}d^z~$xBVOIFIkJEevR1CE4~5_`l!2n;CqX#Ic-cmJc)(4(6TYkahTwA zPQoXDe){7iyS742=&?EEGoD#+73DF+8@T_G9CoMb8TOsfSN5p?!PHxaMfJSz<4Y)5 zAQB=CDj_M|C5kA5s7p65y1N_cP?2sB!KFK-B!#6Emk#M%VriE6&cXNRcm4k1V)w+( znKSdu6Zd@&#+G%dZs@Q^Mps6-@c-5(z`%)jnRQ&LPIh=mn5m{$(e%4$0Wsjx^VbrhQq+0 zl^qr*UD`T{Cv@+dv_P3GSF4J~?LN;s2?Y|X##sv| z>zL4#c&Eo`cWV>zs@|cq1Y% zWopy2r}?9Sj!wtQnv3V^UPT+jf!I{jVS>K{OVL`7wZv6Hw3_>;nv4OQK;D(ZJ1g({ z6}1JFxIu34$}Hc|1K9#`T=&fyu}5*GLretW_WGm=34-gM;tDXgbHyo1^?&JRT+NQox zODHM)P*`A7tlK|n?e?Ky2;=37Nxn7zx8bD0nBlP!2FKT#=NloBtVrVLZTEV3V6{!n z@tS@{*-X_`Dbu+d;P_WLc|g_%w=Y3%7|P~C{#w!B!i;O;wlKTEE|~Z_2G2V?I-kI*9Sz)te;A2 zPi-QQ6RR?YK`kf-;jiRFk*i%EQ3u3nG=Jj>%ADgGA4ipAzRlo`l_%G39y`2uJQh;d zeKu2wD_Q^^C|w;9{3eZ+_%*1$rKvsIVid1Svh>>hp+uM|{&(Q~%Wa1nhTqlbU zTW33xi8ae^%F%~M^=J{FgO4#@|E-Dys}yCO1hvAhuOm&__@2Bepo{Gwqjv}_UghK;cES#0{ zwWigHA(<5Up(vOr(ewGg)uJuBL^<;m{#G>kf?_{=h6w9!$-856sWuNhODR~$9k_?r zcH^u?dSZ!pu=$(O*b#}Zg`a3Td@zA;B-jKuS-O+qCEl3W3`L;cLp%f_u*b1CZu+U* z#a15mY81_F?KetolFC?|pOS5D?f6i#d^8e0Zsd8CfgDhq+IvN>HvLlF9CHWCPks&> zP<&4~1|q-K$|HTrM+tY70)=@(!Jms_E*hy8U}{eqVh5EnHS8F87(QdWb;tSOp3f(I)Y*2X^@0Zi-L_%|3S6h%P3Ilo zNg7bYQO@45Kk;1YQC7RW$6tJS01Q02zsiX&gC>v&4(wC|`&C!9dA>hAsY zsSDhS-QDw>r=l6fhh+*n4V|r3RRqCA!Prtx#v-M0UjUB(4}B-ieJKkT0SC{3!g1Mx zGzUEuSHl~@28m#(*U-S5+$W+}yReS$#2`VLDAK{e`X0o)bMykv7x|BecOaw|1ZDuG znMJN{fmP(285ibi~yZY)iFpfqmQRS5aZ+OCEQ zf#ctzZzt+574h;|9_?M?fnh!PIJM!6WS3e~viiaEd156K^z9b^*1&zU=s}UzWrG^t zh{HjLlSS+t7y+%N*U}-VkbY0Qzf1w%sH(*Nin9AQ=FeN@ss>w{$w~|AvQG#CXH@u! z65WW6yHRo)&7kv8bM4L8aUBmjf^rS~fyI_!`@bS9cs0ELMZYNaDrX$lsJK3FvFPL; zkgX$4*UX(T3-q!!SgiolV7$#!0G=Ur07qAcDb*CI+%8ek7NslMa&6kB^_QVvQ+gyo zI?=_T?04%;UElJLAOI-M&ZUebSCu`Up4r@$ZD@9?@TD6Ln{`3NO_Bt}co3o+@hJiS zQJu^b^G+5Fj)W;e>>y2+mNSg>YF;6Jcwj*NKFtrAAd4I){kKKKHWa$5#QaEfv1XK7 zI9`uIwKo9K0Kahcs!7!>R;#mvPj6s)2h(IM5-xf?OK8=Iwt4 z@enMzgXYD16q8_{Q!5cbrF zOV4I@%ox;JmCb~biWQ}^gB(EYv$na$AcLQm1)ni$nLCnv$8*x+M1{M?5j*}80eM~u z23|)oc>bqY!lZ0NXBsXodKQwui+E+)SrjENiD-BA-H-J-WCK+Qvv-aEx_kb_kw4{V zT}_-BO*cHBcNpcUE-9B42v`@UM0&p}n9$*{gk|0Y<32u9`IZ@J%sPSJaRDh_l`rOVJ;5i)(VXqEYq!+hl$zgG(e#U!?rlw|4MlO6+Axp;rqVH>~Z#0(1o4Iy~9Na&-Q0+)53CAR7= z6%n`M8#uBRi$5pgVIKAEE^j2l)YR@Jl@NtC=ct%_zGJCACY#=E7uc<89E zaLlLZzOV58@Vp!iXD@rz<>{MuHn@wGJ+&szCU!Vi{I!ZzX7)3ABljyEz_ZMM;H;u( zzr9pQbRsd?94*T+Zy}e8`PD{SNTfz%)*)IfMi?F#oByf5WQdiva3QeRg_8+E5TtUA zd;(q(*wiq!s9!n7+x5dVXdE3d-oW);ICX$#afLfnr2|eMt2=iHc=FTP#^h4 zU9MwCI~3(iTQZPOE4+*@L-D?=;p8Ozs!Rk<_BHhVK3-%jO1?!~_NoS(a_G}<5n;WZ z?zy>o)Y$wMh2v&)vU8Ziem1{e3zvHGR9!s(aCcHqWSV~BRypPFuMIx>$Q(?MeciPw zO{gNJb&EzwN-BehPCW5oYbIm*WVnWTt%~}2b=~Sq0R9!X?J%e(61MSlF zA|<^6m5*92pOHMTu$8LM%zbN;*Q!5G23TmLIEREAV+QN&FU08nc>2DRSdOQ*FBcA& za$zw-sNIrFDV4eKZZGfHQPCiw-M!1%)46DC|GBzst@eIoJjDL7o^BAa9xY|;>+eSd ze`N=D%L(F8tqd~aI8o!8b*4!Nn>cXKav)MVb9wKqjn4cy+I4L>JrikNuXV@*k+kgA zORl>ARFwFBwK#>p_{*U;d;?Zk zTplhmZtbM0q0N~}BKgD@Bya#KM-jO8+LE|DQ$0U=f<=xPV1sq#eX1;hx0U0TIKC zAqv*^dlF*r{8o2CG0%9_5^ofzWhFFT9Vk$}SP`$)#~=C?4axsOh@_~N5Rc?Tm<4K$I+u!`YrF$}MTo2 z4H@!_72Ef&-p71OP5P;HiJa*mdZ&EfZ?z7IG*BC$OIpn8019ddq(V_=elA^ARySxc6_*wL1{A0o(d*E$Z2XGCH#{*&D`0gBoAbe?b*8a+FJf-$} zAz9qgVE83E%s^%HA8vx@Iznwl{OE7swX3-_K_cxf(Sy-o>H>rSXLIC#CY>2q6w56h zs(i<>f_17?y?Eoy5Sa%GkA`E1kIihV4j=D5@~}wA_7$v*jX2Dt{v`OEMboZ5`cIO0 zq7@2uGVQtb3KqKrb?iYS5@8_TF=OM7%htNg?KOMj+KDq3UBk`Z9y;(7fSZg1R3p=# zLLiU$Epha7gK{{xF(C8CvIe|=Qx$%Pl9)si)HUgK4=M;Vb$&dRGQ@ssQeOB$o0X(} ztR0k0utZajHU%cj^g0m@llUSvZ-(xWW@G74aLs5sr? z7V&6h4X#bX1jS1%X-)wMH@#5w0-~T;l+7y|{bHXl?RP++ZXcc0kh3H1@77k?WPrz! zkD+^In&It|ovu=ogirF*3QSpV?8J=j$ryx;oatJ@h@?UY!8tBLc0kJYU{}6a=4-?5$u4P*gCcd**aNaNX)<1>F$Hn8>wkpS7fIFP4;sDeRnV*du zHeZ}Ub$CIW$wU)VQ&OiVSNJ)4$OnO%feOx4z;!d`ZsP=<;r!bkN3$Wy2tpi6wKBbk zo@L+Dmt^-F5&oa!_j!Kf zQGI>+&Ua(9?8%mxK2v*G)o32vvjaEwp=8aZ^N7yXm>eT_9wc_FdBzi8;$z$(F%*sf zCN=p7>;ZZxAm<9FaN>Wz*tekZ42mmyIWgG?CjCE8x5*MX^dRv_X_*Tf~<|PcYZz&n0AUME{D{vTIit{Y5}kZxDgw_tZ4i{+UM`_4J4HRjISQ zs0(E=bR|AdPrCb3QYWWUW>>e9zUU=bg1V)2p`bGh0%8D$QO>##<8Nu=}s3lqtjj>;1{4wZp*Uf`vk9I zifp~v&z3JvGll?uZixG|m76f*eq+ z+-a$e@Yb-oPll}>9l-&JH(+A`n26K1*&yV4EVqZm^0r6=c4|ur7Mnep*U`jv03cX_ zOhORe>bdzCEQpKEzx%GgqINdj+$ZNiBHY*q2jzJBx*|578;FWy zH!6@#F?55lSQDVOfo$?UUQ8f`NlQhhTpF}bID`h_@35Im{`D|s1?L%xvn?Ee@4H0+ zz!SoW`hSi^XLQ4`Utc8E5`m+zvLsHm=2=jxAHd+X8HmH>{e3$U? z*f>Uh2!%%O@&z1+v9OLp_(=87u3ud8|9vqGeeoQbvO4h%f(oQ&s>c90>OUj_8T!{H z=j*)R+8)jL~L zqaGrJ9Pi(@=S#L+p6L%Xf;bW_IbF3zz-c*Np^ zM^YgT&W5^D+y2CrX(k+c9Ht!eQ9{#+K4&AojcD<%Q!q94#Laa r-U#N97c!A8% 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�W+LM8H6UJcojN@p984U{QTHM z+d;`^Xql#5e7)i_s5s~q2{;M>k7M|i6Zcm1oxaFk_6N-@QIbU{=YXNxtT50fZ;BV$ zy_&)%8Akb4X1!pW)pIUaFW#Uuj)*FbOEyHp&v z821l6isTN+!ymjkk8(Af!Sa$&#qyO=MDT$!)taVjE-O(f>5{EMOeoLG!*27`F941z zLwCKy2$nL5%y?RLfL$8{wk7-tjKCA#RrMzpc*C_|qOQ-*`meOg8Mn3DN#KQ^P%p%Q z(!4ysZ=Twz!jg*qb%zCl0$9RVY$Wi2&4j{Q8&53;AOZ)?M_-ur($ z3k=sA=;!tDxB`Hf7yIOU<4T-zVs>PqI-?m+pcQ)elZK0{xIKQ_BLXU}?^8-K;o94@ z4+SeQjt%bx$-&~!@jxex1RqDc^Y4Yo;}+#`o&H3bv64h_eBCgRkRv*vgwKIk%2lq- zD)YA&Cq}3T04GKSx%OvFu-9la-Ab8@YXvTz%n0XQENcbFX?t2feB`U081|?!L%ifb z45jclZb72bUqCNfZR&Xe=lWm1`FK90Z~#3pZvtDTH!}nP^q$8z%iN?e?p2X#am@EPJ6v@}@CDYd@wd?wU@ye1BzBuBdkf#h(?JMkL2c8)v){`KfH-7NWpj_(B zk5?4Tzc2q)+y8VHp_@cgQ!DJaF|`w^mh|8gxP~?qSw^<|=D7R11n0_Jj!_s-yz}zR-EE>~*A}9UZ-Xn;9ONtj4&}k#nrwL!n})ELG^l5BzcB9;NUP z?&tYlROaeP$nl>8c?NxiAXCZ3#N;a-SA23Rs#@~uTlllJ^8>wpsMaAU%+6My)C`@R z9!4oS*1c+++%$E}xN^uQ#P)|+d265aZu281zskqJP%wI|Rwn!N& z<*&xuWO8>irjImZjx6s-G(A>Fjo*UApT~Zet++MzcR@fv%_U$T+1CeO_C_FeEO+>Y^jiibD46^BQE_BvqLK$n9PmqYebpKFE?a*<~wRB@D8T zeVbvdVJu_Da}9l;Kc45W-yc7(vfOiD_jRswo$H+Ud7pE?G&0a(KFWO*f*|G_*EMfL z5FHAFXdy;=aD}U#{1*H;;(7g!Hv}=UQ~pyyiOHwHMJn&xIvP+>C+|G?gVyn?{#6Jn ziDufnM+ZTP!Z$Rpnmndj9A$d{(a%O?4>|5wgN?g+?j@7pf3{VO8fZV}?^i9ZejAmU zpj%;}k|Zuq#o%JN#vj^!zvZX07=!EH461{?P7ZR!yv85po|(Ju`M^!!5YEIca}$C)s#@ArEV5I`5ylvYtPVbQ-S@!kz%~L6F<$ zN!o*7Y|eyGmIk53Xwe53;Ljj#$}b^B$JJ>lzo0p&ohUz{8V!h<@>AWM5k*D$1$UH6 zn(`B}5&XaMkQS%BA2a)VH-~rZ)RKFuz1t0?mEU(VcVL(8Go9V z#X79(0?6b}IN?=$??^@A1!m^62ck*nn^JAy$k&`V8ik$fI<@5MV4@w$0x zB)xsRVM4l+`Lf)BDlawCqT`*myXWCU0jh6&8#e2lx3}Tc6mjlepxQtrE5)Bvdt^9F zBJ3RB{jqlN$VPvf0h-+(TY&+Jo11o+8Z|iLTqG}2I+9m8xwSs{42j&Nxr?GD~8@yB8LV*b4tC-wnD07@10nD+Qdk;G`UgjW1$~XR-d#q zo)y!i)9Z3`g!rrsUx$og*>CjA_ReheJ(wT;G;Qh!CPc`IB_U3>S1VN1` zcJ<=#39bV1EVYDK=eY$Ht`yl}zt{W4K?jzMdC;&`}H_bn&kvKSf$3#Pq+dl1$Zdl0Zea)*7 zcQBMb0opyG$rBZETJ*2+o1)I20N9G?BVo<~rU-ypjmfPPR`SF07YC|+q*-Lt9w`*UVS-?)gL{;v}TmGOw+Z%0=y?~kpJY+Vy$o4xGFf8#5I>(?SZZjP_< zjmOkvRTm9bzrL{~xTWn{gvWJf z7LMBoT-#ebsjg$e>t4Sz$3%_W8`%n8*(y>DaUXx~9`R*)~y*OY9Sab3vmnAE^i#r^{yAr4SZ`OAoh9hmU0B$%muaY@^B{CrI)}mFd09U@IoxyLO_Q7gzM~VqK4F}_BoZFgKY9p^j}4Fd?JSH$+lNl_^fU8hn4&7l-(OV-&88n6Gd9l$FPW#Dtu-fb&AQizDeP) zB-8)i<`U4oX7}NG4vVs63OU>{CqYtKETs#(Z)be5>RW9x{sH%X^OL^t zF5xEU-JS8|Y+~)!dW)vjD_-9@GtO?`=_7`ZHSqmz7&e%4{j62}!!<%#jtZ*%FtOnrmOttJU%UI@LdtI%i+qTjXd4&JDayU7|-KTThdqa---t?4fykM!2{aMWTKSRo=E2bu3CvPJVxIYtZ41SX z>G7nf+PxOju&#Wz$%iaanO%R!Nu%Rg4LeB<&ZEOtx--}$ab=;qFbQG$y?}k<_;{ik ztLLdFu0-g0$HIagsm~6kFR)(dsOHs$540*az;Fn9|G4K@#`qFrHTE~o4B}NuNWw=g zz0%zXA`--(ulifr@9dN?rmf@ahsQ?NRGaCZA73#|-M>w|L4j+t3nx_tcJc&ZqhVcc z|A7$kHXXijVIU`Sd=obR+b3F2<|papwVb0vjBiREV!c={C*5-iOG%-ZbdwMc?-ZoQ zTL-1&!%K7bI`BW&3mnhXS(vlfUn?lC)B0gKJ8o$Th7DZf(+|_5JOJw}dr_gje>3m%x)lI(qn3bsDgt zhE)n3ZgsL(Q}!~sPNCK@4mIhi|ON^X(P{& zBCVvh-HSJD3kjlYb65UW_~xZ{_R8d=!D$Woc1by4>iaLpNhzCiA@1JpZmQN}vTr;0 z-sSfu;EQkMH0&nspm!Fe<*Ktb_f|(PD^zO+?vtl_V?UY~4${ok!O!mYGQ;5DFsji`foYUbO~X zJXMmc(t`zv&a1(-**iNp$COGn_wE({Ld;40OO_h0$Y+>lL=HY4d<-{xI58Wm;IWv+sqT`II?46;=T;bART6?1)ZK;%eURki!hVXnMe?G z6aMl0+nS~386F`M;7YDcuNm|WC^(U-(}>mmD{LdJWo&b{zjn=q5t?nPbF*!Dc6{JY zyIt_NGB&7fqeShFn+J=peVSL_V{dd*xtUs%cX^G^$5zPLDLc7etHh*$ z^+0uUJ~Q^tm~_^QWd2a*qiI9Ot`P}KO7Zl+38BbT-{9GlPXft9h@j#9zJ?FFeaCJ~ zmd9$Ag}(6jc8%)0DL{pH*ffaRYzYa^|8&B(gD^|r%D0)*ZFfR;n0+m5?_dQ}{K=_X zSz8A6&Yh-sG?HXwmOtK|5uV^c7TpLPS&Nh8K_ik ze_e1yXhC(a6V~#3Kfw(3@Rz;jj1F&+^`9x`TFDR2jxU>_NEq_#CO@%xip2gkH6CSt znEM&U6t*qvUMm%`+;VIqeC#zgynz-w1c13e;-<0rX@<+&t+aLj9YCg#S8o0rV=Y7x zzd+-swkOp6deP7I4^Tgs3}Q~5J3#?mqb7Id6Nz3$E|J~{|EsH7${9DZc*XcwRxc(s zrr*_f@h^O1LE!o|Z^yWlx!?WxgM7d(ti+hexzgoUEqk??`2iH+KR`Kj=nWcidCGcFCpwNgEy>{+{>j_Cy0|e#0?3WF?%bicy04QJK0iiM zlxfR;0D;xdYR?&5982R#y@_`H-#E0Ja0ow}dT+qth5ujHi#mbjhRHqWS(5*M)%J3z zwK25Go7xFsc(`@3@^V+oA0wT76|WZm+u;*ZR%u}Ny+5Hx5dStfR$i$B7{lNVD(O0r ze==S?f-+U_W%#!rFQqW4Umn{*`f7){xcb=)>fOabjzS^@Ff?z}9YNgqXDkZk(@C5w zhBuM2S0(>VDI~&kkk1&P_5QbszvEnct7CrllR!ip_Cy>1@A^pKwsIZbKcc|{Kr`Ap zp+jkYNn<>3^6yxK@f3#&>#y6yf6yz=ZZhnH@-JsMyz_Ow3 zZkW091t^ve7jdS*!wZlYng*|6_H!`}0c zC^>ZrTz&E6h+pt5tK}1ExA*BFa;F^RVvUWb6}->b`0qa6Q~ZDDK0DdN~_%)_6UNTTwF__fDzda>@u<|GSff?xE?xPsXA# zEJ0@?QxKo0*RjthqH{ zxf7LQ?v@`4-!$jr;)%D-sAtnTgsc){*0Nxh4ueX5o&=Tj z+lie2Bakj9Qw}kNVmf>h^nb!az3Og0dzy#Gb+omutrv%L!Uw+~!Uu**9eYPctQGy1 ztrflJZYHLr=;s)u=t@aR9i*i=fu0^yZhn3PV`F1ye1Bo#XNBM#xkSPJ=4Rj(8M6%2 zR8tI6m4|juUzMRqhE}4+MZ5^{#&)LYJvG=hwm$iSiS`i_o2H?mVP!DI$3jVl!1d<( zj+NMl$8poO-vgE*pyXS?p?yH3B{?3_ZxIfYA!sB>VT^5v?GT@_0&UPbtIJr;_jgLi3$yoJ7F zRRRc%Y0fXZt_JcSQ$A1&kLv_Aj#rh5$N6tH<<5{uIV0z!H!-m@U2RWj7|N!>HI#g& z6hlwHy&q*ev)6RglC&KRKc-i+zx?Lw{`g7?-?$X=t58Y;!bP!~#ADUai%av)7b{P2Esm zKdW7`LHV1dCd7A@LQ`(Mn;c?y1`sG47Owi{t}t)IRLlH!>dFmp{Ex_5Zc@QFHY59a znwn_j#)R-E#pU^fx9^cC@fpXH>B#bNl;{rI^nV_CvJcHrM6BGsRyvty_|R{0P%v=r zZ8KJTR++LGidMJwzpN${y)ctl+j-S>+U;ZByCJ7KHn}Pjc6Rnc9*QWp%SK;#8Z|i9 zTu`;Ubx$BoZt%P*1Ns)}7(VML;9){+BT~BnY`A7J=%KbcM$3~m3@M7HW$sHAm6*f7o z?lD?px+%pYs%nV13LfxzC}Z~yo*5yi>bJHNx|w$+q+jBR`@eKKq@!#J)z7ohIdhLn z8gFg`@x|udqGIL|7e$4K=kr&BKpmob1w?sQb$MJYjz&e%`_earNqn~RJ9RmI1A}uw zg27`HvIaF!!Ar!@;&0hNg}Vvv2VU&+oz|QceY7j^2xl##7pQUKRu%u@;z~+NDE5#f zXz8h5tgpPF!HAbi6uqLVn)>|t^B#wtKRK#>HGC?FvQ1+7fNfIhcC$#fqw0FXOGPbK z9Amnpg9C-yg!kfJLy2QNiAe^Z`AzB2N!|N9KVpRE2au$J-eS^larv^}7uSKJjh^^= zY0~emz1Np^FRxjutTxgV60;i4Jxaeu@p9^w%pIxM(XLIZ;RVK~;_}+s+PCGjLJ&>N zav!bSs~--nDl~gH>=PT(C|ro9OC3wRjqe?NIp(XMhiHl{FOUTKtk_pRfs12Ivs-=2 zbY&TdwV3F@kDCEy(`O1#^~XEG%kuVNU>MFAt9{P&YOlBV zdfGLM=)AXO?gV6%=$OMc?~+W$2}KQ@?`4}Z+;R1R8*~)IPP*s&_)6qa)O^WMiOP}w z%sfbu{ssPdu2cO|1%?y3Um`#(F>9<%W=u6lsLrJRSd-FNjNKK&9-ZR#ZCknJ%y+-u zK=83~LCz4;KWpB;hBq0z2_LSXBNY28^=DLfl&Ekqtz+ym2bUkaWmYnQ8D-lOV1_p` z!}k@hN~Z8N2!XBdqp7hfWE)$H^1HZ0iu4GyuQ92P)meVYyETpV8L+ARZ>F8}iaU1jGVFIe7B*ggaqgvmQg7Qzap0_&q*DZ2bW6?sVP%h0$^Mv1k>ZAGl7ID* zxbEL8nF79?rqgQ{^|QWbJ77_>a+M1EW6o+x#kZ8x?8a+h?RB#FbUKCubvU%Mvu_N~ zf6Dm}Xpb7_{qhR_CbojsK(?ON ziE#Z6-SH0+*{p1h^(#Ruu7y}KamCIpt9#7sW02B%Et@L#DyR1c9?WqJZ#!uoW?pKZ;J6l zG`~ts6|6*Z&4ML$dg~(fssk!n3m-WrD>uN`{?cb|R_FToyoS1)-=cl(9DN9o3`H;E zt0Jj?b36&f#Xm}#qQ##Lv3>3>yxW^*`=wS{pSJR{VSrU60V+S; z=)m^f*V4T7i$Yvlz$LZqiBP?4tD;zK+UBK6@3H3>Sv5|5^DD?a9a3!SZPZdr_U%|z zAt`ys0S^L|7auI(D4vi37`ZNf{?t zC)bvJNPW45p5(N{htUhy>p#Q}zt+U@V)%)kpXyREGImKLikUXb{lS7LlFS|Vu}ID| zDWLGdi_yyDoSsx7^1?R2{RB!B2T#|c@^NlKQj>hWBbr+eYF-Geonk`tFg}Hkr8>T+>342n;mKRG} zroQ&ZJ9kyTPl-XPJij~RR@6glNSFfz_qQOfw-J8j-zI6%h_ zQGfca-|*a=y}!|STLl2Z089$$ke0iWz@j=iXC}`$dLpfuG(f`iW0_@jO*zn`$LKTf zE6{JX3%ZR&ThX?6-xl5yv6Xn=Dd@_QD*RuR=#+Ww6bB%p>rdrgdOFe+&YH9N;^CaS ze81nQ&p zr(=cT?rJ*|x>NqrW!=JEnM)1erLX@@bQa$!#!*pXfaLEe$*@rKvHf=Xvk#g&+^T&i zh1#kjc-;yX=mi(!80|8bv`waDo6x+P#oA>BFD4Yi%S)1DMZ+acS>n9=JPRbhFB|k0 zYMH2DgJ9z;4pn2$_10JUpLls&d7bs4-RXeYE|6olr2JRUw9s}2_OmR zW=~{hS4qoUdj89?COwan_ZHP?2h~)@Z8?pZDw~V7k)q>-g{co}8jFlZ@ved;w@8VZ zQwkMQ6`AiWkjMC|I7>#Ch$q|q$BAQ=AGL0L-K+88wk{cZE9~K&Gk;&Datz_>nrQoq z+|}($iC2iT8sCNOHihR`r-OC%So+VZsxcG=H0@#Mb)I#>JJ9t(#G3d)LSwACZNj;8 z=ME!s`G1;`tJ2?l`ZmtHn;mQ0@CQeL1Kq)Sx+K*=aK$p73sYm=SeIPe#f2H4!`F;0 zjb0ZqOufm#%6}6~iI&V}L0*I@ZBWsi{Nh4MgbWrDwiG7*NKIi4gaCAo3Lh$}M&<7h zVP^zF5r8rE21*L0&;M0SKe?*X2MH(3O8W_29_(Z`%pQsXbsLOv@9*aF`I$}+T}nmd z^PM~<09wL(r}?+4Xh&CPC6PmC!ob|nXI<0H5SH%DfisWb*UH9^t5R@!y5*vJnA}MX-&~? zVcWdU4U}t;t2qqfW8qVLf49y=?cnKIr}a4^Y|)RBK76?Dc_HKPolPmoC<$a0<@K{1 zYSXfEa+TZi>T=A?%;mu>tgMyGZLkLq9;`ir7L0u$K7Rk182DzNIkD}vOa%L9`?jdF zPzbl?1n*UEmQ*T);6BN@;&*aFf^$l#&UwCj@DV6iXOn6Jq(WBWCw-TOWABQy2&j(i z?m^Id(Wj~MscecgBnhOHusfS}bW~K{Yx-PGfP>|O_a5T~ik2{yA{LR`zn$u+p!d3~ z$KGEgyK9-k_xK{bcNjD2x}n)T#PRRhPFctIL%y{%V`l)&Is&0I*#?{C&#xJ8g8_Co z+mXG{`Cd@w?p|4*_!g?Sd-Lko?Z9R%ErgP0`=fcCovW9wOI_bfYvYq~&R!7Bc{I3J zu;|0`c!M3IzRp_pi>`1nJf!aI_3Z9R8|aUyos)Mby;0ngqo~m1i3VX^Aoym88udwC zI`1V@#+d}oo~nWrXO0i6S%7_DOrr`pk)q(;dimI;H&Y&Vd(5<`eZVR4O$p>v5Xb!X z+VsnB94ig0r=jz=HZ(R1RqwuO8E@RSVpK=+3_^-ZUNhGbGch`W4<9u)6N5l7?p)9DYw-YNMl-xL-Wep%Ce^=JCEaLbj;kowE14}Dtj5T=&# z*7WprX+_aF2q#CrQu)#aSEY5f>`V;{o3a1}2G>)AZLD{Y2&A{L-HUwfz0H_Gg%hC0 zJ)Aj%pro{y6oYTa<-(&T?z8|a3zg6A-a38Pzgl3UxmlAMg=9oYPR;y$S7;R&DMDt8 zID=@96EDgoqz8UxTQRp*zEpJvGK$#Nj$b`JF*T)pNi@BD3c?AHg^F)4SH@%HUq?q* zQqONA3`Yd``TIRw-pv%Jww_^sq^5!0V~0?(Y|3qqSfTt(4hD5(Oq^{7qY_;zfag}U z7xL1m%p|vd3-IvhK^tS9!0qkc4m;l+OcPSxUBgHbj0!>-YDpSX9c>(*6?K9Rd9@(j z6~_=gEYE)s=_&=H2mKgmqv{tSKW~-00pY|cRKkW}`jN(6=O!xj0ey$NRgjo}rLpIm9PNKH7K^B8HH(8`|OWxN0iOb!l!MSaK+B12FVGhY}V86bl zBe1K>t?KVG={sd|pR`9u53(LmFCLU9XH)C5iAD#_w>#r=mi4UEg6zaXvO&TQp6D28 z!wcQD*AFC<&2Y*-*c=mCk1Gelou-m*Y+aM%ptqv!Qrce>URM*izVZBk)XI&6xar?b zR3EOr3uk`x^CMdHC5w!l^`foXhCcUD^1nu%SCyn|ejoXe1U8ja;_E|3?7SImCwO3! zGbVib=7zu_sbciesk(%?ALPfq-(!A)^p7Y!DFPBy5B~tX2+39cz)79d+_q-Qy|D=yZOST_mh90jAM2j1vpi?t{<{N8|9yrRAVcGaGjd||GVQ= z9u`PAshOb7o_|GAF%d8`R+Uw1va%K1@{mzQsbg0*KpY3Sc&eNEHhkGgH&D0^IIg!uB4ikihd^4;npZpePJa zO-wwYNYfY+VgE#4;)T_R)Kmk&8knC329q@N*KZ{5d=j*K8C3g6s=aUYu|w*{)~F~e z6Rm?2MG+z@H?SX(8Av0bt|N(Um-u>f^%zuO$t!2=KO0+E!3*dI=gl_&kjeH}u#U!@ z9|u&+TI?`zmO0??{|ANW#bCU70qix%0A%QR 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 literal 0 HcmV?d00001 diff --git a/public/images/propmpt-page.png b/public/images/propmpt-page.png new file mode 100644 index 0000000000000000000000000000000000000000..7a66a93d386a3fb585a95b327cdb9bcaacb697b5 GIT binary patch literal 43721 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 Q0@=V*X6B}JW5 Date: Fri, 14 Apr 2023 11:45:11 +0200 Subject: [PATCH 86/90] more rm --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8853ed33..5cd9f527 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Teammates: --- -## Concept +## 📇 Concept 📇 During the projectweek we are given a choice between 2 projects, we have decided to go with the project Prompts engineering with poems. For this assignment we will have to fetch an api where you can generate poems based on themes and types. The user has a few types to choose from and fir the theme they can write anything they want. --- @@ -77,24 +77,24 @@ This project has a MIT License - see the license file for more details. ## 🖊 Schetsen 🖊 * Schets 1 -[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-0.png) +![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-0.png) * Schets 2 -[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-1.png) +![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-1.png) * Schets 3 -[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-2.png) +![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-2.png) * Schets 4 -[schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-3.png) +![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-3.png) * Startpage schets -[startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/startpage.png) +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/startpage.png) * Loading state schets -[startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/loading-state.png) +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/loading-state.png) --- From 4fa63c326f95480cf63fbe013ff2cfc65eaa810f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Fri, 14 Apr 2023 11:53:04 +0200 Subject: [PATCH 87/90] rm --- README.md | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5cd9f527..372f3921 100644 --- a/README.md +++ b/README.md @@ -76,30 +76,48 @@ This project has a MIT License - see the license file for more details. --- ## 🖊 Schetsen 🖊 -* Schets 1 +### Schets 1 ![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-0.png) -* Schets 2 +### Schets 2 ![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-1.png) -* Schets 3 +### Schets 3 ![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-2.png) -* Schets 4 +### Schets 4 ![schets1](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/idee-3.png) -* Startpage schets +### Startpage schets ![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/startpage.png) -* Loading state schets +### Loading state schets ![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/main/public/images/loading-state.png) --- ## 🔮 Hi fi prototype 🔮 +### Startpagina +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/Startpagina.png) +### Generate 1 +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/Startpagina.png) + + +### Generate 2 +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/prompt%20forms.png) + + +### Generate 3 +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/propmpt-page.png) + +### Loading +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/loading.png) + +### Poems +![startpage](https://github.com/RainbowJM/dicho-hackaton/blob/Tapan/public/images/poems%20page.png) --- From 15ae42683c896bafea3c921cb33ea4518551fb7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CHilal-Tapan=E2=80=9C?= <“hilalt98@hotmail.com”> Date: Fri, 14 Apr 2023 13:13:09 +0200 Subject: [PATCH 88/90] readme --- README.md | 26 +++++++++++++++++++++++++- public/.DS_Store | Bin 6148 -> 6148 bytes public/images/.DS_Store | Bin 6148 -> 8196 bytes 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 372f3921..0dedf634 100644 --- a/README.md +++ b/README.md @@ -122,11 +122,35 @@ This project has a MIT License - see the license file for more details. --- ## 👩🏼 User test 👩🏼 +We conducted a user test on 3 users. We asked if they could just scroll and navigate through our application. During the user test we discover various things like, the user can’t use the keyboard.  +We noted all the obstacle the user had while using our application. Per user we have described what they went through + +--- + +### User 1:  +Remove on the home page the home button, because he thought that he wasn’t on the home page.  +On the screen you can’t type in the text in the input fields, no keyboard +The touchscreen is basically just a mouse +Keep in mind the touch screen + +### User 2:  +Everything went smoothly +He knew where to navigate and what to click  + + +### User 3: +The UI of the application has to change a bit, it is not that easy to navigate +Give the user feedback, so that they know they are right on track, the user she was really confused on where exactly to go +She was second doubting everything, she was really confused on the page where she had to generate the poems.  + + +In the future if we want to continue with the application, we will keep these notes in mind and try to implement it to our code.  --- ## 📁 Sources 📁 - +* https://codepen.io/hilallx/pen/LYgpmGr +* https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting --- diff --git a/public/.DS_Store b/public/.DS_Store index 68dc925bdd8c3669e859e705901d95fcf008c19d..564663ae8df81b0031362c21f6099e5bb654a9e3 100644 GIT binary patch delta 530 zcmZoMXfc=|#>B!ku~2NHo+2a1#(>?7iv?Ji7&$icFex(DXC{{wB<18MF)%RhODf38 zEG{uHxGx~U$i&RT%Er#Y$;HjX%f~MuC?qT>A}A^c z;+&t8U*wcini?;_U!0L&?wOpQ7f_U1mYG@}QIc9w5}a8DloCSI5R{q{msAfoB&4zc zs7M4&k$X{UYF>1DQD%yNT3T^xNdyu*5@cO+QGQNNKz?y%NoIatWDMB)lGI$!ytI6v zl^`eh7l5RS!%~Zifi#+)`ux0z$i$+e#Ju!Wr^?uz#H7?5|2(Jsl9K$~h)keAKyC-y z8C;Na_1Gc0CU&v2089K&OVuMGbgc^SnRl^C@dbr?+<%^4jS9T}Y&eHa57 zgBYVB1~4%~4U&b@P>L~Svn;a!<7Rdaehy%aZ)Rlq&ODi4#E}E2o(ZI8bA-qmW&nuD BitPXZ delta 68 zcmZoMXfc=|#>B)qu~2NHo+2ar#(>?7jO?3vSQHr-v$Hd9R^YhByqTSYp9837vmnQJ W=E?jbjvNd?z{tSBvN=Lz4Kn~M`3|lC diff --git a/public/images/.DS_Store b/public/images/.DS_Store index aa90de731e81c91ffb51316247513b6f34657716..3a3bf0d9716d283436fc7018d96c8cfb5827609a 100644 GIT binary patch delta 398 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMAD7G? zZRTP5#Kh0dki(GAkjRk2kjaq8kUlw)Oq0H`LFA(x?;L1FS- zb~!DkL^LG=KqW;$MY%w_gh7EJ4ahD6X#g3hC=OIzfn*>|bpcepF3?bU)>e?J$)DM7 z$_q0D15HT;not5XFOeY~?6^drxf%?H44NP_)j^I#Hj^K_9-vw=Hn4LmCLd&X+t|>> yB*+Z*6@vsfkah(H(q=)9@640=MLZ|_^Kfu5Lc)(>ay-vex&QyciitJ7oe2Polwd>v delta 107 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$SANeU^g?Pz-AtSPfU|P2%no+ tX1$o5gF}!Rs0auIxPgQ#Nd3mb@640=WjsN;8JHj@fedHZ9M3a{82})Z5~KhC From 14c7a440e0309aa513a2a178481d64a88e5f98b3 Mon Sep 17 00:00:00 2001 From: K3A101 Date: Fri, 14 Apr 2023 13:30:26 +0200 Subject: [PATCH 89/90] url path changed --- public/scripts/loading.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/scripts/loading.js b/public/scripts/loading.js index 83eb9c64..6cdd543a 100644 --- a/public/scripts/loading.js +++ b/public/scripts/loading.js @@ -2,5 +2,5 @@ console.log('Holaa'); setTimeout(() => { console.log("Delayed for 5 second."); - window.location.href ="http://localhost:8000/poems" + window.location.href ="/poems" }, 5000) \ No newline at end of file From e4168bc399de20e64da490d4dfe3f92285cfbcc9 Mon Sep 17 00:00:00 2001 From: Jevona Magdalena Date: Fri, 14 Apr 2023 13:51:38 +0200 Subject: [PATCH 90/90] service worker --- public/sw.js | 66 ++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/public/sw.js b/public/sw.js index cd78c130..e46f8259 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,39 +1,39 @@ -// const staticCacheName = 'site-static-v1'; -// const assets = [ -// "/offline", -// "/styles/styles.css" -// ]; +const staticCacheName = 'site-static-v1'; +const assets = [ + "/offline", + "/styles/styles.css" +]; -// self.addEventListener("install", (event) => { +self.addEventListener("install", (event) => { -// // The promise that skipWaiting() returns can be safely ignored. -// // bron: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting -// self.skipWaiting(); + // The promise that skipWaiting() returns can be safely ignored. + // bron: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/skipWaiting + self.skipWaiting(); -// // console.log("Service worker has been installed") -// event.waitUntil( -// caches.open(staticCacheName).then(cache => { -// console.log("catching shell assets"); -// cache.addAll(assets); -// }) -// ) -// }); + // console.log("Service worker has been installed") + event.waitUntil( + caches.open(staticCacheName).then(cache => { + console.log("catching shell assets"); + cache.addAll(assets); + }) + ) +}); -// // activate service worker -// self.addEventListener("activate", (event) => { -// // console.log("Service worker has been activated") +// activate service worker +self.addEventListener("activate", (event) => { + // console.log("Service worker has been activated") -// }); +}); -// self.addEventListener("fetch", (event) => { -// event.respondWith( -// caches.match(event.request).then((cacheRes) => { -// if (cacheRes) { -// return cacheRes; -// } -// return fetch(event.request).catch(() => { -// return caches.match("/offline"); -// }); -// }) -// ); -// }); \ No newline at end of file +self.addEventListener("fetch", (event) => { + event.respondWith( + caches.match(event.request).then((cacheRes) => { + if (cacheRes) { + return cacheRes; + } + return fetch(event.request).catch(() => { + return caches.match("/offline"); + }); + }) + ); + }); \ No newline at end of file

    +

    +
    7-9{tmh$gij_x!J`u5?~%a16QRtuBM~wIV!hV=6X+hL&wuh z$9(J@iLf+3_R2q?XU$G8=X5KjASY?31Xjd;%Rk9Vd#<=~-BCiN&{90k!{wsja#0+P zjGFcK)h<3ds+R zT=zT$WC2{ni`NG*CS_#}OP$`)Q2b<|V8?P@p*CNZURnKqVPitzlTYsEy4(5f${&zM z2)v(?Z=xR}HdY8^!mKy_Och$QC#SNmg3@Q+qB*r>-a^*bOm&LD!VhHqk7Qvm*^*$6 zi!MmT=>%cpc4(lW$utgsM*(bU`%-Z@@9;jzm@>z5IYPB|uSI;~Y$Mffcdu45&0psSkDqj}t|%o-hPCTF(f zc2A?BvFsn#RXcW8#RVxycGip|ArwSNTur z2+Dw`O(1$#?*ay)4L%)CM_sdQjm;8v98e-lkKh}fDGhiH*ErK;`X2}rb-PDcnKyWE z8tm&hRDCq2#fBQdHb6H+f|@qgVxAO?uuZk>+hq+pZfdaVv#`eXn{+X~_eC}w?R8H+ z!#T!UcP{80l$TM5EtaA@KSw`+GT447WQlyK1%EN~Upr|85H6NeO=|k6LE`?1?9Un* z*=K6y-SW3UdSIAW=WrYAlBB_%tdFi6%yy+-@MfbvJQfVqzcaQynm#$7KJtUiqVywn zY$xG)`#yHmjWGV6W1acHL}#Iqar$JU#vj%)MKHsuTf4f2D)>mE@hTv zYXnjlhTtwW4^4Rn|BmTGlDlWq!Gf4O~QJr4RBBg#(3h^U^Yw!I> zq{hCjI{*4j3>&!|Uoy9vb~SISlzad+9q^tYlQgotyjUvZRR(Me|8@Q~WAs{FEujDF zw~FtYhnXjSqvndKF016;8anLnPB-AQ!{mA-NZFRDk@u(H*X)lIWyZx!5u%=JBNfNbJUFY z6W4*rqElrEdMKP~9`4;fU#Wyab3Wu~eg0comh%fsoDFTX_jro@`F&y$&utpN%10J0 zN)G2aP|K#1mR3E+7MY#@0H*)FG8U{TVEv#Tv}=8+PcR>x5bpasFTi@(X|2#2RpKg7 z{>q2EF?07&8uUARsae*4Dtloqpl@;^wPRs}_%Csmo1_QFTyS*P)mK=)^-q!^xUD27 zsWn}AZBIT3wyAI4EHo-c`_eS}VgAzaPaH}vtBD~jYgDAq!D`UmUPILQt=6#gMv3dC z)~t`s#^jKQ+h^~5=`pcf`KHLgg9f2vdxLa%*^Ie*p26phC)VogeJvF+ER&N@izwe^ zwGcH{jAXaE43B19iY-ZPH!9>gK|zlr}iFNfP;c%4UdO+|PDJaQjAb*724{rbWPeB3S0?fQ}zud_ew;c6^$H>zvZ~M>|`Uy`suX9WrM1;l|xVWnEXf=tdn&^w<}7a zA(HLr1h&AZ(73PxXlH5oUibHwt`N4YRUf-M*jNy#-K8`8=qtH&92KjM$X~2%BaxSl z!n3mufmp_iP?O+ZFJ_`;4om{{bzGP_uk+cp5S~?adPU4)D3#yfmlzWnHdedenB>7vc9yWC18igvd`}3RuoBi;P~8`)A-P%GuGsWS2E%Ts?_3is zy?vaU9<8f(4%1!_;T+O^krrSa&@t`nA>!o(siLi)v86oz{kIjl89fBXnI5W)^J~ZE z$L?a+uJl*wJcX7SPF$2YOp>%)Rx%Z2!yl~_UX1*DwSE7Yq(o*~4j~8%Y+;7#<&}85f_a={7v*pnt_Xjfg(ms$i36ewJ93%O z?>{OBG!mluhtL0EAdpE&Sc=OKM*RX}c|))tYeT)&Q}Wx@cMnjeqd8_}AAI{|V+MK) z79#v+2Y)Ep5r>tkASaRhGQ^2|vZ$ra^v@NpETc?fIzZARb=G)$jb5+4!r%a!`N8RZ zmvci?0|oeoDSK^W%1?aYbVyOIeOWqg_>T?-ejPA!qwpPqgO-=LaGX+! zmE?#FtXj#C5hGICtegLkhTN!IN(*NH<4eA1lUwY=(mdKeF?z6|^g(NL$3Q9M3EuU3 zRoW=i^TM|XrpF%YCZ95rpl_FwII{19XyK=GJ2z@--i``sGzAlL7#6g94ty~SIXNvN z@=Z$lH)i0L0I!@~y2L;$_AIkLTVt>U9YWWCkvj_tM|0e5AD~NfLA~6^fu%nJ34qz> zMP(NWe1&cq1XbfyfW?dfyYZVROTINvbW@I1T7zGg3ubWo5$_OZql&-2Y?uoT9ub$` zJ5H)`UfXFXD^)We;U>cj-UJz_^(+)8LiM(VxpmEolgw>O#@Ddph z8hQ}KC;T-Hd9<}DTlTGI+GK=D_e8AfXCayMR1cdZ`D1FE>&Him549$08Gw$n>H?+d za!WfQNs;hej8!(O@CM(y;P_rzDjRleCD)ey$iE@v_rI`m=~`vz?i{KX^&IiUQ2I3^ zerL}t#NRSpN9#}fLXw?*&0_aipH*$1k%|{RVcr2`QL$X8=u`wDR|==SOq=OL-n7&# z&K?Dz2l4jGiyD_l$WiGn64K{;q}Agvb#64u|BhZ=ZS-Ph^H!@qqb+b_lIEk!y&QwHwu<# zD$iLI}Fhr74(m3sqX8bQ&`Tw~wUB}B_KzOSl(_a2CH+gJk6sD!i0>GrbtbRD1 z&Gz&+TTYXbj~;<+%>1yf3B6mzQ1I%^P`<#$_@6GyI6%P0u|R21SwQYkTV4op|Bwld};tRGXe8gZrU&S_XJ3R=II^ z>{-24eH2cGx?wMMmuldHOB6G?gdYqY%&c;l~^8Fz(9zXELZw)u`7X*L_n!EW; zuR8V2C-nQXlRyQnhxolg6l#>Mh^tjVWj(9ILFv}<9A?az--m}vdKfR;7JMMq>min# zkSml{o43id6XV>r=y*Ic9*j7CNKa8?zA58{=iPl6l83LWc3$s5Zp)pvs~kdon};11?E#{ zK%b|{Gm#~dAx$Bw31~7qqEN>efVc$|ac!k|%&CZ&KC&LcS)IT8Urx`zCEFF&#M*O6 zcq=QoQc`Y+yIY%$&8IOQ(KEeG(+&$dKEl4k|7FIi1nXB1jUfKgT?Et}hbgW-;3lSdRdu6gZaSm@8B-H2B`1*hCtFS53kLA%RStREj_SLbZ6$w_R?wvO6jkP2Bs*FSTi`N1CA-&naN45+HF_%K}$vU5{nI-uY zt?ke}e+1=Sf4KhD$L{sQ)9C}a(UlaHHm)wM);7y4;k_8PJZA{t>eJP1=25g)vRAlB zEIaif3FfFS_6U2}o1Xi|0T|^F@zdLue=j6<^N{Rc0h8sJIf|9jjWW!Z+F2JS>UC>A zoc4(aa5}JW+F2-NSCxW$)o+uvz2PW2MteCAHZ{-P-!~3#kw^V{9pb4H8^WZd+O^v! zv0YR5?A$aHu8c$Dl#i?r6tAX)Law<_VTtRMv9UU^QZ9LrQn}Dv*uQPuIJ|*l1Jchw zvhbHuXfBwRD=5UZ#lM|ck#8f}hG_>N^H9-Y>$%Q}T0y<9q}+jE^i8gZYG3s^(fP!IL^VH#q8tuG$D1BVA%POhHQ(G zds9RD#}(O+)X5u&O4zm&-^No*2PG{?I((aZj7xcuom7Rn$1Rso%;abB>XwbvoGDzX4`;yXN+4}%vmChH=g*94 z0F2za{>CA!wZ^D*=#2~qzJ|F?=<4qm)R#3Og0#pejMpu7|0k~m(QPLX`7b%>|TSCWILqj{5RO#LMcL=Fe#$`79%y2PJi-u>2iW9 zNa(61DG(aA`lV)(LRXaJo3}OR(U%NET{Ho5psdfO199*jhWhW`G7Ky3M2kt zG(-NfNgvsCVP@?}lfuGpT}XadWmJjU6(WAqx*wxa7PCG-JR&$xZZ_4wVqPK7=x?W_>?Z+iU-jxyTvQ zg2u+tz?w_p;=%(%6$zT`*b8vwowc@-<)d30tpiiqa9(jov&_w(lj~^JN~~~aKHtN_ z$h!7i7oPGcDk9Q$b*yw3(`nx(@zGXLwTYA$7kt;goKSU7Gv!r_Ef+C$Dq;>o(;!jm z0?q3Yk8(2-e^085<8E+P`F}AoJI;Rt0GWU)n$?>x_Z+U=t~~I+mo{z(U<%+eVN)U* zeA0ZBP+6A<{(O3$`{7;l3hl+PH=CJu&+%mQhB`vW022CJzZ2#f>h)Af#z(nBPF7f# z`Uk+CF`qd@wnq88G;1vY5XuUq#Jtsdur0dzl;B-wh4MD=lJaimPa>Omb?XtM=t=3@ znq`BsW_AbVE(vho2z8A*SR`3}dQ_&>QOmg?p5Si)G(vC5AJzB$VM}XLr|Kjj9`+bg zzdLm~JEyliDqBlO{@duA|AWl)Ew6g6dAV<}+<-W}n%J7Ve!9@CLxOhzF#&qG;p3S< z62}`$L+BaccrbTMMjs&RKvj6|id*$hKm}(`>!AXmCf_xw1CD#DKT8ww;qd0JK81f`tFNtB^*Snz=(z88{PFK{f6f2*>omJqMO5@sR&yjbRa}CcU^W(@q@W9zT^W zo1fp4<{`v7z)ERp{t$T^S$7L3M3x~DmsL?sEqePh&nws4+7RB)WqjiIg!;?*2MYyN z_vCPEO(g42G|7V6u`k*~v=T-;my;shpsSQcTwBid zZi|J>kZ$|?USO`Y^Hmi~l8&js)Krzc!^9O+&v)B^`wKjLJ#N@iX!efjaOR-`_1eD)Ao6;#-E_6C7;PID zyEk4z0UwP;XgXWoKgn7V>uA|*e`kj77AABp;r~26IxIfk4G+Gp{T09WhGOaL?yWA0 z)x10{;72_#c&<>j^&352tw^<6pe!{!L$b`Pfad6~i&Z8l+OxMXSWta`r8PGLOR$@;%h+vOc{5@sZNXy-Oe%s*%n*awH zlfJQdH&!02^Lg%QS)k*i(X-t#-whUG^CI)_FkQk1r(|E)V<_hh*zp{{m(8kCt=rd) zBF7ttVurpcfU!LSZG~-KR+GZUCsv1&JSmux&%IQkUawj5+u52&Lba`5(23=i=KS8m z_j8EEK;$t5JZ3#0=?>zwRO8M3BR`WAH$drSj-9Q!hgL!g4U0e8{n;ZrPnmBOapKaO z!CY*cAJxmRew*&7N&!@^~*P)JIENWbP;l`a`S@0Ws_txZZ9QyqYo< z=WRLrvpAs5M{>DqMzF;Wom;q#HRwCrP7a#Yf44|aJkbJ&_*gf9v*;LppSJZ~jhE>S zBwIb>_lpsiF#YpPWQ0T_Xq^R*}u@cE10`9CRi zPBm4oDUexq>G#4sn}4U$$!t+_XD3T`e7Mw zj*g}jjS6V4HU+d>NB<(oLB?PB<43j7ZD>bEBL$s%!oQKG0Y~#%6)Df*AM{9z z8rnAsMcZ-BJ41b=+SXOK?s1mAi#~Fjt0DMMW zRL4!Few{RiYlULEBYjiCbZRI(l*l{Io)Wrerr(F*qo1t=$VE%P`CnJ}ETIf|RUEpmjGiV2bY(4NgJ1#s^ zI0G{pUpGBH`vNwmsgu)*#)5%NI&DU0DzPIl{{0vU3)sq9II`aMS?E$#oi+-b<#Wk% zN%`^O4eYB$kC%8#Z?k%vJv`O~_Q}f3LS+71j}aQ1$r;_=iN8LsLh@C!u#{ z;~_EU@Gj+EoSOA$aQLch+}GjbbSkkhW2%K(E+b*>!|8?oqXc$vN%DasB;CDLh>8Ex zTaI-bq4W#4W5@AF%Plg;>9%?s(4Nxn{2|0GEw=J~G$G`@fv_0#Vfpd|>r%t_4M`)% zTy@y^ReS)AkBO}%f%@^!jaK5|VROQFoH!pbXB4IHy8}CKn7U8F2HQ{}xnS0yV0GG1 z8Uc+XRIC7a(j47$9a*~JJ)~g*Y7;zTmXtU5=_-g3=dzOmn2!xN zA{X`9^jL;dkYPU1@qB)LdeKV9_>_$FP!z?>w3|rZjHdt6R(L3A zceqT)Xp$yEf|zIOP@<>0MNpSlSzV4MLP$vkgvAlZ<^ujczN0l%1e^weu@4rYFgobm z0m;g`32iV5`ScP=Pw!1Zl}C_&bYmgA#6Gr(d&Q(XeVJ2b;weaB7AN2a$Y(e;E!!!Ym7h0 zvG7>1Y0xJ-AgO)$W;~q8iz!XFJ_X;UGOqE#AKQ=Dj{WN8JS+UeyutZ0mdIh&$ITq%@4w6LW(GWF5f%N~8EbKZMWDFEnZ@{O)hJ)!oT zucW$WLWtyQCUXQlr{{2SZ@gD^w3y~rDk8x_&)88h{_fs`_-5&>qX4x0Wa7%KIQ`VB$?_S>h~!5v0~-N2$_6yUc-ps99yktvxr}S0T9en@_}_v zX-YQB<7b}YG%QLV$kXj>dh_l(yfCN9dKF;N!ByhcK4Egonu0$QvKFg)(4qN&WLAf` z?oG{3rQQ-2e@A@40i$X+&Hx%qd3`6Z;QK^+rj!U_0RR&HnSxH1Cg=0VzQ^O)MFJ&k zMaP|8JI-+*FQZ(a7s${j(eo+JI)c(_Hb5|RT$}-^PKy8IaE__n9x%IN&7{^4J$SfigkydL11U@BG*OLeH}sphn9H+-(>dKv`MycsiQyKGfi+L-9C@*z%$*s6P zFy*&>Sk&SzDn-0U-2F3rfH!E|gTtI%c77))_05www30jf2`>W&VjslUACf$CnE2sI1-fccf0?7j97r+_zIeax zPtQKdqsSOzPZ|jcLN|ql+D>ueFei%X#z}S4*ApL6Qy%8#+adv40+E0x#eujYb}~s1 zttQ)_eOJh`nl`x`?-3%2NTdADqwmHjORXd|XTDt8n~ZHk#W&5R2)x&O&D-8N;2Z<3 z$!M@2gkGc2Q7=SOsS7DwXvF^S02ZZRAq>+tZ9>;aU*_%)pR=`9IylfKev>J-CTl!P zmNS+f8y0yEy_1IS@IIJ-U9YEmhM`%(1OY3>s>ZZ5A9rc z`5cs?i_&%^^OhcO)%V^_p25H>j4Mko{~v(Tz0krmM2KaPAGl$6e?KQCdQyu(RoSrf~kzp^Yam zn6J`$-#GZN&g{AM)IyRK#5F(S4KXm6>1ms+RIrOX%F=;C)tw<7-c7L8#5)beqcwh- z$yRess35#wUu^GB;T2@>inkmS;sOd^InA|NI_mgCP#y?BIyg})wuqVMNQ|>z8dr#PR1W9bPT6~B#lgsj&&o5SL}oC>2-KS>4b3-C8BB;bV^q+b|8;qFd&(eoNDRCB!s!nL#Ja^R5+P^Y@^e zuoqb6%mLy@wi-2zEm*|hlw*2}nN7RhZA7JfEP#1gKDCV&I{UYjXE{lQD=BQ>mZ!d7 z{76WI*1E8%eYN(Hp5x|0fa}=sWoF@!n=_t}IM56@mHI;m5Vd&gZ=lIM5Ke|7z)mHR zl!L^j+sY-UnzbcRi!hnOKXY0H?dtC8>2A?6R*x}Uo?)YC8Gxv(5SVz~i@7ZBMe-<3 z=Da*lZEI_gmae81T4i$p@h8f+^mML-A80ET!exgIT1D4U0Q7;Q`{Y95WfmAC2uR*w zB2g_)%UlIgd4qivqoU8b{&^(W^LFFT|3%kXaJ2zNTN;7|*Furv?uFuRMO&b_YjG{b zAp|R~#hn7h-CGDyTmuvc?o!+noZ-#9x7N(Oncr~Nx@X_B_x*NiV^6O*Zsm3B=SSwR zygncAJO3MKX}!k~95m*7j5H`CJSEY0$wf~|#o{S#gTS%k6Z>fR@EP#|!YP$z7B58) zXFPFSW{Ot|8_pR2!RLPNLZ%AobdNp{sZVt*aZaySA29Xe?{-EKiF4)T>jk`C8W-_a zYpY0lWh+qgg~zHPTdL`;`!iuX^o$6nQ6DN6lX}@@;wt`a<-Gmt)_trFXN?Dqz1QRV z4O(JUHlOL{y=vD+& zhy3F>w{%25r^v6@E$;9B&D=uLVJA{PZHhs$u(kGufN#)kPg_?jJ=lGRe$5!Zj|&14 zis1iQg}l-laFhG|8g%Yn3qke$&CITw5YRuis?Zha#7z4wz1{_{+mgd{#Ftr0V~1pz z%A6tE;Ek}gbi&xrf%lKNydiDqbF2?F0`(gu==>LAEXRY-l;o}@9R5^!J}T%g2KB8J zbd|XRUQTv^Kk7!TdWB==G)MMCsyiiK7&nszw>VChdFiV8c>tdjb ziB-sUJHUF$);FNvtZF~-LMSaI>rLX>=(DY7L8ZT}(J5O&>K{rV-Vqi%AP(H;ba>37 zBaXH#IL4m&UiBA*fT_QdKE0|Za1Wa_WigivycY2E;W}WlyzBYA-TS?ci_Qly7#Z2d zoMObwI(`ii9o{L{SdBe2j2gq$zXm#ggQm$d6y-`}-PJkY%S^tYWfkN~1xQ{NRW(m4LfW1o#$D?|BnHJxXwGP3G^;WdoKy2>) zk9~pL(wgLCDG}moBtiD*0*<_zpq|Yp-RlVY6d*L>hziCPm$Rodb`GNw&AQibn%4QIxXAOq}cG zb;EOf&r??4WNPTOAZ1+WfKdKkThS_*vzI#kmAH3Ez9z0U`4saGa^7;CTDvaJ`-axX zy#?ia7vuc(cgFkR+lx$XmF4{+KOk-hw-%|*co(eLO z^)Xq$>a_+4=`%9u1e+VO(TR+#1!<{P$y72$BH)s&o8EgV6B#eQ4n{?S&-rtxlF+E- zc_h2s4h>)_QT+!pQ}Qsz>H24^h|PO@i(3IP$G5@18u;zej-j+DQzrD4#A9qN>G5e*l>c@M^$c&V=aZ%ZF7C z6tHluws1=MtdPxp>rBl5jOx!NIAM*oL%elI>Xm(n?iL9q7Pl580!OXPQuFQcQ{Jk; z3k;5zLasz|jF2g=mFhw^k4r)R_RZMLh-!Vm)ok^$n%%HLb#|o{X{B~RVM7;O#z;W& zWA!m+$KeDnMnys~XhR$&A)C+KcYtXy{l~sD+wX2C&jZ_4e?!p8N7D}pacLNnCT5Ua zQLl^d%x}CZ^mbiUXfCSm!ru*!lz7F{)Sq1%{Y9@n$xXl4kWDM4bvQ-+_7W7Dnq|p< zZXhpNbejBWGW|sP4%xRPpQ|Z*q|?uB%5}V&57iK3=z_ATkyJTwBl%VH{La7)-=f{l zsxH+XOAMe&_cBMvVCZsIsFv-YVc;y>F7!V#j+lbi8{4WyA)~EzkJ-Tm9;{?RTrmKg z_!&B^U+6U0L}6Nb0WSVwY%H-gw!o8f*i9dLYR$&qA=l$hZ?S-X(dbX&55D&$|7}G6 zFE-(NgblJsA|~?npj)QiYw97mV#oEZ0V zkyjo>yZz%Pm>T35*$9s7ys=cmI3%1b7%?XxY$8E8Orc~~5*5-1Kou$P1YTuY@xiZR zp9fcikPb9;m$sh6CjEhQbh$*IXbZh-3RpvEqXAx=di7@4hUbg*{>QJ53VwuuqYJ*G zp%!}s?2E~iWU=Le4|BF%j?cT966#BiwVf?q-KOU6HU%HP=%kpN zoT19-+$5^-xm}g8IpUGc*xcaabgw-)J-zM0b}q@mO87omlZ#e4s(sk26mrc zTZAiBo>A%Nn^zXYn>{2lIH<~xF^)zhpT6l4QWPeJmMvj_Vt$?N2<>z+I2G#=qFVf@ z1`cfASPh8ijsTU`_Sp1qvZgw)s8LW)4d|_N>zFV*e`E5kaoU(nXR_30+5R)iv5-JALpdOI!`@VqO_AIsPcOMOt51BmRvP^Vr8NjLK#9GG?Lc> zj95rpWLU~qIom=xk77K$<($AV!*lI6rHPulJ@$2{VRSkljWl~T$l-sZqCG0YwBnrj z_|_~YGIhRCQ1#@`aJ{#e%ee!@bhKWdqU!}uk9&d)3sa{Bv7NA|smd!+E_SwGUeMf< zwxPj~1DKzFKHt2vyne7m6po)PtsS-6fD}P9xTPGL zPWI+HVAeqfnFCaw@{1I8KZIV0u1(n9x;^B=S1pGx+66zX5nh@JJ#hsswBLmIC}(XN zL+&S0+KlY2jy7E(i=nh$c_oqu4`H zb1A}6d}n!a@AP@^28HKQDu4e{_BkQwDfF}`+Uw9j_0R?h7l@Q&8h_hY#`=rA0E>@) zkm@ZU)7oL^9TNIZPS9C?D_ImWUAOe#eUX3L4l8Bf7|I_@a$D4wo?W{9^qr=uopzph z(~(6l)xesakfR)KSaE%hTaY`cPNg4Kw>D+d@2sdQ6WYZVt?O7i_i zdM!^R*zu(3ol3NVE;nZ<*$VTd3tKh`W5;;!SMBh+2XI;ozgwhn=sB2=PpSXQ*D5dYrNFiKo)A^?ML77l#!I5 z#;W@#^HW{+x}yat^>y^~ahMcmh%F&?j*!EFURcc@4vCz#d~rh?(#Rb(vpWiD;^zyw zKGbB9J9r6X?N;%2r4c0qd3EvV1fx+HcMLE9C&dZ8A6WhkJ<#&DotjBcT2HzO_?TZ> z%*x;WmU~;acy2^vXzfUf_c8|Y;Q^0)4X=ftkUk@;?9nCoN+cU8=urJGN)3gUonF)5 z1l13mTW?+e_N_lNSOP2XWHe~+^KzTsWkJ>RA%7mhG(nk!P{AADm#W*P7d0fkAe_=_B`#Gw%q8Nf~2SLVg+xpXrePg42pu=lc83 zjkt&Ce^@{|cO6XZaS{!9{+SOS%Iwz1UNfzwHq6HIXuX%e`EMV8A z;opceN0R)buCFiq$N*E~RDetG7ro-XR=nGoM{iKi`fhCNc$tUB+hQdLHG03}tB3Ju z>quUeU|2@y^%#?;!h97lFEYu=F|^lZfURE%`fwIIRjF>M4ZXT$iLI7wUMb8L{LQcv z-gW|VM!F_0ZjzIPDDZQk4s`zT`ZbPB3HupMgw%{i%Qd;?vGn{#;z!wSZR7(q*I1ex z4cVi{AE`sjMZlI}BpViMA+H#?D8M;(*WwRwLV=rL_yj?hBUEHaUdJjax8EsiW);Y) z`btZ^doRvXK}fBt0~#l$f_q~2+$H;ET98C(duTAK!>v=jX?3 zTAP<8C6P9FMK!e=nwO4lHc+He;3n~z93)_3%b@@H1?h@~Qrg=5Fk(C)`;GUF-oVW3 z@8B;REPLXl8Ffi{RMWgfMc3yA_;EGzG+QQ88>m&ewnb};PV^xTpXjFy( z_(ZH#TwK1ULA>#7=t~5q7bUlJ(TEU3!TRK=hF8_*r2a-c;|3w5aF2$8q30K3dAgus z_BFmot0Vo|D&>!Jh$|Io^HKOX;b0t_*dabZ>b|3<6vt7Vb10x3CtGrV0cSYpn#T9} zq83^^4S+`r_WZV9W(YI=USC7fFIh{IWxj+y%Yqg%)|*aE_QwhEC9iPLK{7?;{jDdo z40B06_j-c-dO7dQg=p1f9#0J~rS5E>K}oB~i7TJ(GX;J)VJm ztaew-&He6kNv`V9QJ*T9#lZdaXL(F)RCOmaRPQ+UM=ZqR#9Yz84do*wlozZ?K`H(6`W-P~R>{cCI| zZSSKZQ4z%|Y=v3fL&U4RO+@S)kwj7(7j7Dm7E}!gk1R{9lS7Ik8mG=gs3)QAdbUft z^_LKw2hh!jW|2L&x*}RSPE67tsB~(SAoR-)mTlPY&FsriLP6DaT2S?Ue%6;5rREx3 zt8iEPD6A%3B<^%@BXPz&BNJDy>xi$nB9~xPQO`Z&XVtz}O(d?t{ym50N^X*{Vpc2` zbDHB2Gun_}5O&cz(Fhe&Uc#v1GXeeY9wO0almVD{*fAkOm)GeS>I7pP9b!J1I4CZd zM&BM)HQ)x$+oP?)dn)E}CiA)ZUGMYuC3@`FBi&G)vpsZX47cvFDI8cjTKcJ1q+;#P z!t&0*P^BzVTT8LFcbw>HsQD&o^GO~JJ<@$^sXlzaZ}8KOsIPiSdB8N}G}j)V?J5B! z^||#(MU#?VZsLMz7g?Z_E;uh~033lb&|w06Mk=^aUIS#mD}AO-N?K#GG5JFK70U1eTF|+jy>?#n*|V_>m0wr zCga#aA&eysB01G9+)V0weQOnt{(%Z*`nNAWC^!DOj?|H?{Su6-K@_gJ1k_tL~li+t2a)1Fcx7HSR zbu|sRXmd!UeUhwQ>i|}LOc4KBbecvhl_-ZHgS8#NpqTeiQBKF=qHT~F5iT!Xe>s#A z3=x&bh`;5c<7TtygdPg=SmMb7&IWyj@|#Xh$?@88>rsc*-14z#0q7CGBT4Dv=xF}o zsMH&GnY+YW~fM%R|Qx%-*`|y~)YAPL_JUe7Ka`y?fq_3oSJouDmAt&&t ziaqoZ(vwbBKG4akg#s=lMa-72XxC%s`&MKJ~zj<}6g;QH=YE_=cP={O1eZaeTA4Om85AH>PQ}|9t6F>3lT*I`Y+5CvmzW zLi^NYCc|#_O=_LtcyHz3x8itgYqUsR1+}s^V58|5bAFFUzBYddRZ?xxMky zi%4mf(I$w{^R@Xd^d}N3C3Fm7-PQ@j4K7Y?JR#ghpS8wg)Rvs5m1UelG_N$GEw6Z; zB=3IEJDv}4TGmm}KtrX=pzoV#KY=8+3#yi1m(NB}8^Y}_qw`&j5RMko%V{6fH9szW zn4b~-Y_Crn|FD>GaJe|bjaRJbMV{xi@_I+fV4AOgskd+1`;)!dv(XELd|5FmVp`E~ z|6ByNY=-nh&@TV2u=#eDf?LONN1}ury8K63RIzQVBDpbR-Gedpz~?e{XtmlS@+rB& z`av+wYaPKtqS(3}F+NBVD{_ca87{NkR%@wSghu;EN}13fjXZj@=5tx5h+&=!=PU!v6q99WWapGl*|1PtFwh#|p zFCB{{fqA-#xFfjU{TLJvoO%>m%UD~^^ap(6*#Bsdd;qv04=Ds;3$I8r$}^1*(uf!A zUMff6SB<~1#t#>+#A73pII>4gNj?p5pW_k#uI8=Ssg){IMTkPUe;UIUdqJ zxcsfdeq84L*BpsqR)NnFQe7pxzxUrqx=oxh@Y`J}0^p1#6}ygsS!VsHtGqb!*? zPI&!#lP-LuIhxAJgWhMuz&EWmr@8GY?g-1+J7}oL3a)5=%qH=0$8qT(F`dtdLz_1d zlN@^8FWGJEfP-l>pMoVg4_@TZC%#6$B$LfQq?LE2C~<^BJJgyN-|Mb<2H{z$6Fd~geMv%?L98K^tulMPcN^_V~Ow#*rRuS7T$olW48F8jMi>|K= zdPPLp=CAJQCqI$F#S^#3dF~RuRv-Q{DeJ3P%E0M>P58Da0toV$n$I}&ttV6$*N7jn zPdW2iQfD|hRtP&7_r5|}5^l4Lf+}5kBCfWMxm9umib^HC@btZ9qM{}}! ztX`l#@90B}TD-8!L_uUx;EZjRYOnV)ZSjU@1&`!8SMQ}bziq$Gk>7&eo?cLk*;`P# z9i>!^i&5Hjd+VSal}l(nplq)E)6dx zEDNIKq?#BCGNyXKXx9$m6Ay-BbtRKv-tT$4u2xv1$AGN+8N%(GdWzV{xN%)(yOb)E z*L1jKhr-mmwQow~Da)Gwz|1R>Jy!5>$kL9%{B-Y$I0%ivh#od`WL^njDm0x`7jtS} z``Iw_>O8b(;(`8J=I)JqUQq32`0X9Acr@)wWvwTWbOaIc`M~u- zAK9#}=1bFV;V%lv~9;yZyO7+uF61+z8h%Oe+HLbXy+CNkTwzzZ|3XH#CdljhN&JP)~npScGP zBP^mVjqqxFXqr1wO?1%#fo5x8Yio{;??}U8a6eNXHStH#EX0)M^lAV9d4fC*U37Gfeqb*m4to2Zui}f{vyQ@CVio+|zG#Jhv$VC}4!JE!c%b2M=jv-y*fJd4L)~ ze)A-(JRm_z$qkq0L&p??(9vY=bZ2cq>bsp{z$YgPo@jh}!Eq>)pCDZT-V-{qOq45S z2@ys-Hn&{VMM)tl=*9`c@NLAqw{$%_rCN7YcWHO}VP%V1CNu0VWaXjp+%!AoNTG59P|{et(Yjl-MTEoG~%JUZ;x z#8;q}FHql~>ssx>mf3M<_!tuzJQIG?!kam$QpnKEw&G+dGgfFES%s=rxY#}*`dArIr##kJ zU^9vbP7?bu#uR$f(&$ex#h_jtvbNEs)B0($e>DMP z0Z8kx+%3(IWDCawGk~A%(qlcD-(r34!mN*2EO)G{e@WwRC62J-nVy|5pvlt7F-U24 zqGV|@i_vcaz2bB`e_)2L*Yt?G z4PTmE9dpKYLfU_~Biv_4NsWZ_^C-jnA;y%M%A{g^D{QrSpSCAdyNF)>N_9wp<#v=Q zX_i7<9IojKwvxg5(n3(E#}SvM0l`CUMEa{XjH;Jnu4;edYiWnSd4r@w0pJg8?C{U~ zC_(8MByztP0`auv!RI2~9O0j13ZCSfb!mzkl(`VmSCo(Vv=Q4%f$HxEVv!nBSYD(F zA=*#&ExdqYCCn;R>RRdx;etuTHMG1dmO^GkT8rU*n9k27b$PAN9peI|Tm?)GB+1s; zhPA06?xi>LQC}4$wAdKKxCCjxyQqCaheMJl7eiRT8jxTiEic*PXmU&E!Ac|00?UJNF_uw>VEf;=3ZB*+u+oB1J0pwb?kY*XvI; zhzt6RML?pELh@`MQ&c@_R3?|C0;lBSpU03$oTFWM`ui%XhbnmD(|37N z$P*X z`qzdbi46jDoM@v95PgEO&d6PHc@(ZEU!$H+4J;WK91A_&)Ksx~MAN$D_<9M# zSRzuK#eG0`5*HOne`N;aKhm^GJ=T{$)l_>V$I>HN;icKzoV1)g?Pg!~Hf_9lJrH_oWYY@_nWmDx2T?ML8-VHc@+!+Vjz*-R9I;%oQE!H$9i zI>e$nh3(u?Oc!tM-EAN?$OzVKiph+rv>>KmoAfT}5X}i5cv)vChVUJqq(>Mr#5%%$ zM5|Won6-0xto&hA(Qpw=W7VR(*G?Eu*hO~?_x#A0aJwGClm7|Mk8eVJPwSrDIyP=q zv>6-Vic5S(!YC@Pi~*OQnNJE!%3MkCmA#e2WY;z#+#dY=aI85K^-Q5SrwbhwcglSSzc#vehbrE)HZAtn z>AZ;K*-jaR_y1`<{ilWslEOZ7-q3!Kz4wA(RsAij06rrMZ;l?`N~RV8OV1kv(oVkx zj6~R@=sbMH5bwPY`0^yU^YQZoW0|g{U%+RKuI5h3{J4B*zW-HHo-DBIHQqmu$b2Re zg6Fb;<0cviwufD+^-Vp%TtP6Fr{+L0)g)FboEKAZPw|(~JjO=o&-{DzEBJ{PQLVMI zOmjBqSDTxw*XFZc3D(|-?J~`B%JbIplb6J6lCf+l)LI#;z_UC>_NbIjbL2BljNj)y zI$`u}$fbl!;OmR7n}ZqM=2y(<-s_ha5*Ar*7Mrh0BsSbA(JG}w!clJU#=1NIw64o{ z`J9f?$6gRxWC!>tpSU5{_GqqCN-PUiNcP}ZGy?J~TIjMb$QQ^UciFC7N}pQ=I5yI0 z;xfeO+h|g!{)8mIK5E-&>Ys%f%ZXiMDkq&8JXOJ>41{%Kf-ny^F=8kQ-^iqWCJxl~ z&-uNIopzEbmGv}I83>7L z)Ll@N`l^12KhmZo71pl%^5bm)1IMA!z1-nlz&H_QneCfpn9oEAA7!zE z>$vdEYH0PLl_bj2;owrXX(0*ixn7QxeP)6Wqrk*mM z3}I|pUDBQ5x~<&sx6wbicEynYZt0T<(b8!ah7jjRcZHkvVC>MunEWDpwx`LjI*V*7 z<&AC1SMN=q9(b;V0{*fd(d}8O?m5+CAQJF@;8s6UH`*gcyTZ`!0{75bC8Li*{}rLI zGljl9LqCn^EPMtJ?GnRk8yKj(6)8G~CeosAU1ad-ewn@jA6FU?6z@k8EN}IC)p^8GVAPOEUJuzwf z5pMeNWWe=0W#tOVLJMxxZXMKlHs=wNsZgQyh2k7=PRJ@7d~Q!et%KBE&rr)+aMawD zr7cZ(wgEHCGeUYz5A@^>MV?Y2qj?5Kgz39a=Z^m^`gr%ZRm~CaZv9`wVKMKaI+j6v zR(92vZJ@>BCp!g3O-Xcpt8NCh9Qd96cwgBVa!(mD^<&I2R#g^BxM*<#O_#kPvNrR3 zV!~$Qu}zes1FyN?wj>s*d^u5n!onhz_tnVVACc{24C$Fnp+l&M9M)5i!=7U$uKKh5 zo&F+9$`n~rPD)Pc6ULFu?ckVFi}WeQ zkk-f<(jUC1fB!zI1^(3$yBZp0OE{8<_M1UYlF6YgpVpU7Db(H%NIB!gWAHYT0^2Tn z+)6b2h_hIyXj%QHS5%OBr8x+=Jh)^|`(k4>N7ZxKN07)xQQKwxiBK$#|2q$wDyp{p zD@K{X#X~;WXBmBAq*86}Yr1V_l_u@C5*+6BTWqJ)nhwq>>xrkawU2T*3M1|i>}R2p z6OX_G$4XJw&?U!iQ7ar;o1cmxt5Z!n2|7+qN^RXo+tVD=mY>GJhd`g(Xn-T(&d}G< zKQHK0kC^R>Q>5YiwlAS|%$|F)f_-n;4B-=jY^`_oi*2}EFoCCYafsHx~kF&PBDY-}kkv{;qcL9WG z{P+w6{vUj~D=@r2l*+cfC)^w?U8#xacK-WyCki`y{+nBS|0-okegsn1I390~N(jjA zX>F&h2e}N!{w0-fO)sym%n1psxcI(KcAFm`xiGlmvIsp2j5mXE#!$`9!i*$sv1seW zdW9zcwxCe~gVp7G$+KN3ET(`|z#$N&z{w-r`lIq)ik^D)he;0z-{%=KR!bqO7^+v=uT3fuT%g^6GufEq;m@i4Q=(z5_iHNxoxXoeG zamZVil>ITj8J?eG!uZZgIlDP`Gt5^9o($E%X!Rn`7Sx$hMqY(IxoPIE1r(V9jeXwu z>d^SmMo|o9qvhGg6|kO&&X}f_D_)g++Fzifq{kuM=j}7{D4I4W5{#{W=^373_0M*# zQISH*al{9RG?XHtD}1o>kq5zcKeQYXVpT&|VXe*%gq)?ulUk^q{0AvwR3c@0-=78{ z$v9PwQlP(ASAX+}ibW{)p_gBS28tUHcavNO7)ghwXSwwP%(3c$f7=w-vy*Y*^YbZR zO2aU$L6nvrPsjEc{$_-L@(-P!H{Gl|fCrx80GX*}M^MmWgd*8_I(_Zl;Urlt)U@xx zlADGY&2ZZQ>(|jwS8DhI7l(U~sKrX_fIBr~oPH^R_qgLpu3tS;j>m!`t*TL|({}Zs zf2V_;2cjb-Y?SIp7+{A8Yfrljt*c6GSB+8ABRMcrI_doM*Blb8n&C9lzv8+0IXCqd z%YN;3<2P39q18MyO4fIH3%$k+MiVzC9RB=UVGdOwrKt51J<4oq+(iuNm2pL-ooK3g$bd4%3es|cm>Oxzuk=e`cNe+(0S+pN)dHhvlC|6YX= zSTGQFnyH$QpwbCCUF9ATIXXR}48SK}^%0V~jjeZ-m`K)*LYWDTbKM#S>8z2l78iVR zoQXvH4);H-Q<)~za7OtW;*es(KA9>}-l^vQaxs=GWSr)|PI=_e(QXkv0aH4pni8$RLTH1-)z2|8oBZ3!l?ebN=pUd2$cN>__23$_ipE2E`Ys*9px?z8L=OTUIa5Z)R6GFf2 z=R%^#gkI_Q7+^c|h#EjD?3(8s;87c$4$=&%fq&y%V3ToWxycjm^Jink+#5*-p8#vZd?( z_y5PX4&uQ+E4;g7e~^CSAYzxw^E+hTctx8YeO!J~o`sGV)+R_331!kO1qH? zYq~iwy?mpXWW2@j3X*hq*?-2__wkKSP(|#8j!}MoKIi)}`>j?9Y7D9#iSx_8hI1El z(wd?;VYHR=TH9dI%jLYT>EH-`n$~@F^Q@c#Cm2Azd=ts(?E9I$Fe1=mG?7%#5pwx3 ztRSla@@WPOVgy-#^|+%fB^}1vSF;U#!F@X*1s<&_yliK#9I0hsoUVI z+WBsq4FwbU%`UV~?(wh=>S_>13Z`6l=_+&5G)C26H3>M0u$^5m`MP@#y`P(>_&S8s zO%kRTdRs;l%aJN8{~E^cmTIZMDz_}m8KLGN`uNp7}W)dd4scYo8k1q1tclb{ia`tX&#E3*{TTC&a*Q} zn)eDkw;69uXluShozyh2v|ezfaaUactTXi*4BM|$^&^?HPagJ5QLF`gex_6<$K9yZ z+4D!d`TdIa8`3pREzKeWjB#}RDuo=vzY{?KBG5`yow%JG10V=Q+1fhKes9Ts`Q16x zq(U4d@VJC};zyb&Cn@<$$^ZHMo5lF^$6vpsP1qe@dd@DdFr>}Ov8*kFU{@wFlPW8( z2*)k0k}<#ygB%l!Ew@7%l@4kKI7nfqS@n)_p)?AGv-GI*XcHe)?7hqdE;z2|GU;IK zMtH#Y53=lvbw4Ck4G6)Q>+dB|zi|Y5ZtZ)|b&8)KGeqOqQ_%vovW;JxU#50t%s*WG z^=MF%&*VXTFiEdq`GI>aVr_^`6(Tx~?};2!hDM_7(#)7jE2c@^#u4qd6yD)$F;R+7 z`|J2TnhwqKfMb_TDyaiK*0Av?hW5G9>ZGh6`U9;gm&)z62u_mMn0TUJ@xA9NAq9+D9Oogb9EBU4Dtu<(I(q@Kr; z`~BZlqZ)u94k3(P&FrYdTgVm6TlU+;KSR7F9W>CmQE6GZX%!fd8FcBB z>CHd=LiIXL`m%CFYxOOQBUNcZqDG2~F#yghh)S8bNjNIu2!#d65Bu2>a?o&pd6T+3 zDmx?3s8I8Zbz}~}q0M$J5XaJIf)#OB=y>QFX^G^>G*-Ur zHvz1gds8f7Z8VGr5D4MBqYEh(ahoPYapd>vwa2_DmZC)loaVy#ziOZht;LDCeRr_! z%m^A2*flEYNlJAdW7MU!G$k|-GMpPN?eMoAFP!6sziIjF_X^dL#zSPshWsN4wl)w( ztIVZaF!*|vC;F#g+?;vXHUFw)(Jnuw`oY95VPJob(}O|pSk$gWaEw`?*T-^Yb~2u+ zKjPEODEj`X8Le=7rNf9_d5@ZVA!*iNKa!=bGhBPd+VkS?6qG()J#YPJYn4d~&+wY7>uj6jhoE zDD8~l?WT^{Ag;1>clXzV(1W#ea9%KD$M(H{y2iCt8<_UTJ5L5 zRb79VcOKrszR>?IqZ&0YFUYdC3$r2TqJpi&_~1!g&w&C$#(LZu}YJ4(Ou3>H!;P_>cNhYsA0kk>(psN@>pPU3%a`I%|_)~AkoN#{hr zxgDF9<>KS)KTmJ%3aH0lh{*~xl!0Gr8I<6Eb1WpBqY{bo$6#}~+h(vAN6zdB-axk# ztKZ6f_mE>V$|{!r%N}l(m+$Y44;=*At7)fS+eb(yw6XCzJkt*;+4mbpT)A{@u9hE5=kiV%fTLiT#C8m2<-%!RO}OQ$eisj->)&zkY$tpA@ubc~Da%jJDkRCMdO~ zwYqp)UD{8-Da;G7Jitnp$fB2R5IDg3k#s<{LG*CLG?AG@1t zJ?4xVv{u15wFpCJC})s5ay_oS-F$HAApkW7wj&;#5M8Sg>Xk=UYxs`tXJj{|XVyMk zoMfvgwfnbmkE77W!QJ~ZLqH6K12YJ~U4v|!{JQ;RFiE7XcPS8&F>S8q76%DWbTF=- zzd2sG#Rwn(T^}nahs&u9ZQJ%pnYSk+m_GLAT8Og4XkSLD`{JN_a7m9h)d@l`Khwzh z8-DMq_PY(+Gl^v>S>_#8VW2U(@87_&uKi$@lRcU;ee}J|TtuUJ=fp=2}Z-JRfc)#YJ~TTM?7p*BWnOw+bWOND>z3Q$J8VKa%Iv^Qb{FAyJ81u3EjcJv5H ztobL~aj+RZgY|mKbzG+K9+$oQSlQpc6RxIZtBPC?QQ^KTuvUIeA%mXLDfb+Ht>Siy znax=#Sq#0BFkDN?jfJW};&Rz(v+(`aZj7$~!6_>Zi~m2mEJy{rk8HD1be(KRYR|P^ z{)x~O?F754jHx|ZCi?A#zx$tcGiO&R!OF0} zjAW6zWJ0-o9OXUOFwbe`@0xJu0)s>NUZAxX;V>A5FE?o_kp`I>%%Bnt=3vC_9)h@1 zP=DEZq*Do-yj^4)ubhZ8v;{hrWRUYw(Dz)bQyEE9U-Lwl;qNZ9NP2(q{0feiGfKp; zo@Z~2OGzNB?AT180CwhCF?XwMcbeTFsB*C5TBlF06OTN)WGD0wLF{PNNXegFB9Y=KhHH`#`8;`buC5 z`jU)h>pi*n(K8Oi?<^Og-!n*w+WG;V;37CIDUHKtbI_H*W~!FpM?5W;P1FAy?pA!s z>g&iw``o3ntZC4a5n%aZnGZarOtQuXGGR3_OCi-JckoRje*@Nc^Lpv?^eI)iKx0HR zC9irk^>iuO?CA0QeojOb9Q!MAEzwBw?i8M~dqG4AJb8PNCRK6w9~?YjR`Q- z)wUMbd?t~ic5OTOM54da<-u@Y*DJshewOL}juYvCj)r`8YzS}@gP6dgZT}dYbwVBt z)lcb{NlKVT*2r4q{qma0K>8Vzju{`5HMUJz#5WiDk+PygFTl~FQFTO2s{?J-ZGqQzCQ*S1ZA!Z%PC0w9DBU(in!du-!DAdA|_` zf~P$IVU5*97m>!m?8uuG>KA-hj!5{QD)6`DtpTZ5a`HlbwfzgcNKu3viK0pE;;LcV zftF9>NuD(GT_f>_ieOvlO32YIeHC3MJvE0+r?=9!Ak!|UM>H64!IG+ug{RG(+Hg^o z^a^<_B{y&{+Lfp5sR-XE{*H~0<4d-`j)P-BitnB&OiTM!fi%%O!7D9fG7sK5ee)6$ z_Z2gwAf_S2hv&b0PG6ADLr4YX1U~?<=F(omRoa(Dw4v*OkhdWs(;fZYy)K-JWVMnUN+2FwVbojitA_AokhH0_8@=mymVTWkh)&qreWr>!^I6qv;V{_ zf~;Nx33y(svQ{l_8~EaCQ?0kBM_Z-{8g{S!s^~iC0?vmRFUG7_1RXXa!hIs;T~}T` zoIPBjA<7xs3ql+ADNDvOZ*^%DrCaF)yfgisSkZdK@dGC}76U`Wci$rzF+=~LH$2oC zYZ*z%8CU=u@^ak=(@s=1CL7;ElD4Uw#=g}Y^CxQ^T#H{qD7SAHLVeW5nxN`y3NzY7 zXTh-;j?~T8f>X9t`62HIlq9-x<^xK)NN)w5-KhoNB!jc>-{H5P`q|7TuRStIGq7#f z7mSXy9+g$^Kta4 zMF}8Ec#iL;#}5|hCl@Jkp%kTEq6D?${Xhs@5E!?`=L#&YFDXVlxPdcBd_I&BpwWDX zSY}eLThpPt*3wd}v*tNqxl57<^r&IdONrU|F+qSXz92xVH`JFE^`AvEMiRjc4}!ki z^WK+^wG?*(N@$n}CueZ7id`zgN;D8lG`m)gehaKiuD_!5h!W{HJ}mX@hoB7qH4Jk* zX@nC2S9Z0djB0v)iR-ikliA}tS({&5JAX_Lta5b37oZP1q}e4yR`Hh$(-~%m-u=;S zZt>F{`nj8fEh$-=7c3A)tZd@-HDrV&H0kR#My{3lZ>hkU8OJ9Znli4GeAHm=xIjzLOB}UN-%) zI%{H)#n=-t#zTuf-#sBq{#%RFoGzqr6kJ zOAAoaDHcHf-nxr>9}mwiUu|j{VLqA6Tl#pBSFvq%inEq-<&@9ko)M&&s!h+)MQn5Q zTWiasETh5Wj9Yp4jK(2}>+Q5@F3pH~vK@}x0a}?Kh!TzDfAIB|QE_(5x^_1%3GVLh z1Pj(df+aY?-GW=t#u|5b2oT&|gG+D=?h-7xcjJ7l_w04n`Oe;%5;@m!Yc+*!*_*FY0EfKM!>;`45Apz| z^#z)gA%gMKxR3_@AITp3Yc*KRv7AcEBzm=;uLGX)4DxLjm*s1dZqNM?*A_GLoYGq+ zPNfl-r9AN!AiHpD=}3lP-cq_hv7ai7jvOkgoMJBd2j5^{sSkaNcP0>>CRaX5!zs$H zX-sR1qa~cXe}BjDNE1VlNyMO$ugTa_{08Vz`oNnKwbXmaQ=|iTo0CC%xU(kyAD`v_ zB^Xp*L@?BUlQ?B?w^oa8TS(t{Nqd2H+h8(dvd$vbgrKoX?*Yh(-Uv5kJe?E|^f_PI zY<<<~=L^zbvH@it!!Lo`9+#q&vH6cPn*tpXTpc@#Vq9IVXSFQ8v#^d+n4baqwL++` zIu+3A9GYbGgWqf0Dl+p$#8d)8qfUg)1hMZ%B_~yWcT@&e_>FZAnQi?jo7eR`^638= zlVFIU2IG;0c=HzofjSJ6PJ#tqs)Zn!&kU_U2R`ppsMMB@`uq5ok_=z_>Z3Bf)`X6* z$c;!HmV|y4aU#-$k$e^POdY9t!q6-$fX}yM4a8fr%Ubq~S2DHfTZTXaK-euJN?uEG zMeQ*dq13W4=qWY(o1`pxS2WrdQsFyUKAdzQGlt5sCbba_-cQT@_XqSUF{7K`4B;M; z=!3b@Ao5cHt2e%O&%I&`3sS%WAktknKhwhfjidvIYS46xKcy5mh$a9Yj+yF>ia$$6 zcuxUDSt1@s=(CmHVeqm7-_2z;d&y+SP005QrB82u^W@?w54ofFzaa|i4--^9G)<3+ z6BE(gKL#qr;)Q$m#kIxBt8^eH_*6udd?h&)7FfnJv#2Fi?rVY6HJ<-aogn z+=;T~?h1K^$TI=kDq;P z@#@SoKQ*a@u&zUBo}{;oc4;IE7w9l%eU@Sw-{ouwZ!<2e9e4(!jeY!U;5Wl3$#tT6 zvc_Fq&)$2}slvSGxJY8PeFY zQQ;K3&Cic)uw$cH5<>1hwgWc#P;NcGCY)*!$^JUqVQat*bcw8KO8F%!7aSvs5>70@ zH))fC7-Kd)tY4r41$5qAovz=-4o|HKf8phU*x^bqAMB@LW0JE}4V8E#Jjig{z(!t) zcZF$27@&w}(@@KyFUy~Q&p#18Ouo)RYQ)B3GkP#*zWCVT212nW3{AVP;IyC1bdV&F z&?_P^W}~XiK)<$e{yd7l8DLWp{D6g;;z$WL zk`c~XOkIXwnUu#{*~ZT#gl@Mv>g@;I$X$L!3;KMOs2-HdMiV}E#zlO)n5N#(rSv&k zl`%^)^SIS`Wqp6+Yn$0rk6gQ(A&xNpHBC_&O@2q=UlMUh_3r&pLXEsH(W(^faiwwl zIg#M(XYtnZN1_EsDxKbCdPv{K(w9G^eh@?IIH?-{&s!`3k~kvdWf4?dRo|hDp?#*e zxVW?&z~U6a@eq~_swR0yy^N-dO1i1FENjD+eo7-vF2;REjKlYD_#B_mUnv z{fw|3-FI*xZ0KD0c_SnfnezM3_9YP?BWc-+$N<#Ko+5(^onaE~?Jr3i``TfA6@(RJ zRxYE93%u^WKB{kmx)>KN*uKJasG+?hH}N!h#cO})xokt9i^;><5~%O)WJhtL=|$@k zi3T5yj?^up#GPWsX+1!H`*^t~7Uw;`hpr*O-C3~M%YqpE0V^(|K5|&9r26pODN1OW z{BDc0ygW_b13l0xpaNgf=9~Ws$MA1WoG5yOnD#~v8DD35px>b7c7C|h{jhuDJC*}w z5!?^SUE=}{!Ogdmk0v67&onVHXU~n89)MMU5Z*dEnGDWpUn}N??HQq*fUosYw@Iu^ThWc7QIYcO)y z8aV9*`Lm1G0r4vxL?2S%;IVnl{m=^pdR+ZQ>L%iUiPf*TB3gG|W}O_8$+ipuM_7UO zaYX>9x}Pu+uPd5W;C$y*`>?sw<`QHu##XHUs1cE+<1{rf@9=$NF&$COH>n}rhYnAV zCiqjhbN=ta=dkQBM^g#BCFlWsrkVk-c_EyQT7=P1;fv=$Q{gdMt|UmE z17#>w-Rt-M-n(isKUH&oRtR|SWsGT>RduyWMU8J$x3`?Xi=V&6;kSe2tA(~OXJ3QZ z46O^q5Mbk@6#^h{=fw5wB$mG>#5dAD#AK8EC<&5C6y1fqq&M04U&dKY zA1S^+Y+}lM`}P9^4BN3$wgkvs+5$)G?!9h-NCr2M4C;EGl{P0WIKZ88c>N^^mVTQt zG)D%0Bl>&{Sh37hen;BPUpAoL@z~91-QruD5a}XBdoSN?^5jqE6WCdCAtjPgv1qG- zuxo&a*~DA8Sr%ASK>?*IytGHdEijW15o=AfFe@3mSh42SC17)*B@j6R4@_dGv;B;U zzl5yyCa#NBsti9JS)}|IQ2AxMD_OZWXYtR?`ox#p}^T-v-0@9^fW{UsEw2 zH+zukBuTATl_%8#-fZqNAWUY{GL?m%694OnpE^bpy43;^_UaD|*-}*yG8P6N%oZ?p z8XplDC=XAyd{+{Mg2zN%wE;I7?QV^Z0b};)6-#&%MNCR?l`VPRU%!AvN)9X`X-;oz zKm93d9`l91=V7ngYrJT9-0dH6#w+i*VdB$D82{q+;4{>VG^=W|;+ubz=T%xqN=H=g z4}Y4$&_l*QdEBuL9E;|Y0{k}18XMY+$5}UMTeJ6ya<@NrSu+A-$n_zzsF*{=>KB!x zNm7;7DECEJU?rQ(0;HIfC$?Y99r>5BVP}u?suRg(RA7Fav-hYH=sf6)Dh=`8fkT`s z(nd<4N#FkW44WK1$mugA)>Yzv7gbyzG>dJw{~}l+p6JQwVn0=ut4FXbW>VF*Y8u^K z9&f~1I7CFW2)RAbA*WR{pU|df2*j(dp(9?+@kATc^I!+!G~O+X^*;A@pwOT4+mMeY?BxUn59pic_>Kpm9(QqQ6bb;L?UNZB#pdE4hqO#AC`a0;CaOV{ zoij+|+GpAE2zl(1dmZIa|5qP>+NL{rm(>poBNK2h z*#tF&^#amj^@9%h!pBy|x?z6MZF)s4z45ae3@x&Wr6d#PmP(@tjaVF3vWl1-2 zp)qANUxg)#++n(DYI~&fh)oKy^;~OB;HPKMoV1Oa=*?g({xK^i|uN@ z!A1wEbaK(s3)tz@#0LL%@Q<{nX#DAb%A0hF-ZJIUy$KPgL7^)(+=Xj`uv-;BJ&P`> z(N1$H@gbRDI-0?F*yn-}VhBQ&BedkOlRJ!$J41I$#=UX*XWUxcw#4Pa_H1rsqdP*) zUN8l8FV1O8zq~7H<>|yL#3xDsZ-w4IRFy1MB}RNkDdeJ`#Q2CH%)qg!gYg^(cDb$E zkqwX6MF!7(gwDxqDkYz1EmR46s?giD5sJlkhOhqg&IGYJaoCo-+%lenaj>`c6W+&| zxFhf5DX0$%FIUHx;H2t4L)EQ_v!5dSYg`+obtm^4>9(>pvrE{l{_*v4(S#T_6sV2! zbG#}2>BqtwjwLj#e&aJchCx|`Vyr!R}O8jRCi!7p&*I*c07Of(x3A~Yi z4BT~?t2`LKx8Y)91uP#b7Ffe4NXG++uDj&fES09Vra?Y_fo=_B*=KN`fPH{&oMPtQ zR|oo4<4?A_yYrXqk6Ggn%tu2 z3i5zA1UR6IPo4!t{0Yh8yN~pU{utvo`^XL7*kMxaCq+3NsEZuN_nQLI@;tk_BVALN@S%fx`jsnK1xC}`XXOWXP`T5uCg+`vz4I443JB9yOAUKaT0@7(-?U#k}fzIs|1HQpcggwlY zKM?IGKj0mu-YlK%$$_cmMNtx=LVMy5ToG59(fZBmKd{XabMy(Z=i5KuWG|O&=D{k+ z@s|DE#-dc|J8mPdNW$?1%%kfDC@+7r<79o}dbc2Lw8nV2D-PZ#7oE$bBazi{P6N|3 z$nE96XW6to`JvpOUSC@v!J77vSu)95{*}_w4?-3ZCV!GmPA80_uH?PP5M97&6T3rq zre@SkKyySBue#i9@xJ7u{_QVqWH3}-3o2VU1ehoN@L0$z`5Y~gAR2-YHl9%7x-Mg( zafy`2icbNV&`KUjL#pxDmP8ed8TCu2B0dE}R}^3BEGf?2VmtNg;^-$MEw8 z?~Y@==S}rXbEK8?|5j0SZ%o5oJQ;D$C%QfDyYy%?g*T%*`i(NUE*!F*pVDR|9`C zA7h6g3Q%Lz{63F+8@M2Ab|o~|gdmmVLFiwj6dDc1aiDx_z|*|kyy91sC$VgViSpoo zB-^QqZT#D=Gyv<^YTSrpMbu>`4(D@iezEY;o*dXks+yL6IB6-CbqGHM#X;y|tFg_;vU?I@g_B5V!(SxIx z{PLG`R$eac7Gs}`b!u$E+G2wQ7cP4Pgj7vb7eoWCeJ)Avm{vSjB@fQAH7r4T1(IlK zv+wRup{u8oh^3XVLa7X#%eyQa;2uLxM?($k{-0*5(VvW3RKjw5ZaI7Q$lh^hb2ub- zoMnzZ6s3{tDM1ctSr1UMTap_2PCQ%1U8J-+vCWpaZEPw8%G_bCeP+eeU5Oh#S$7t-LZ}EaOynIzyQdvFM7HWI3Ui>)qSm zNV6m|Va88;>k^AnapEyU0UMb(?ls(b>5;tC!g*}=y!5B}qr-^^Z(MpxZcMrk`x|j9 zb8vNTXy@|RJs>>0c)OWepwBP5@;|S;{}ZA3Ul%wVAoPH+LPi?9c5Z&7Ld)Wh4TSP= zbDlP1Y}5B@ zb9VT&xHW&pp%f6yZgD()JWVs|hi}DLlM|md4Uh{tP?aUF;d%i9{`3wlwhuIlK$aKx z2OCx2Z(p%T{c~2Nup>xj(qDMqzSzp!VeEN#CW3VC0RM4AsG`?`GuKh@v>8RmjpiGWh+r8rN!ueiq3C6^_ zX8`$(gt>_;6oZ4G*K^g`_<70Vrtv`_)!WH_?WJC=PFK#IKFcf(z7*;^zE=nbFq7hc zwNb~3@R$ub4J#KHxZ0t(gavlp?LER#=Rkk_9#2-uUwh5jC3f1{T4|{2j-3%kUKLzw z^(WLSeCRD<-@rB_&RtuVC+G-?+|`c)n};==w%VJ;`;yp4C6qBXuUs5mwEn_nX=4BB z`5xv(1)s|-%rV>S+omn)SxLNg(cQ!3IzBmS5i0VBVTO?fn$z#Nt_D=(0T3QFc@<9z zkldkh_lKR$e7{=#o7TkG&W`)pPU;m^GQ=cs5$L0oq)$-U+2qFe=^bi)0Q42T!f;6;CA&$(8 z-Sa~$-TUz3TxI@GYdrH+?~Ommdx~lWX;8hOcL_Az%}y+Q^t7wDF!uM&6@=qEUu|jK zQMi(C#6!)ztWL0ii?y+<@hV+9y;>g6Of*dPCF{kS9-57lOVU~q>%YDd<8Qmi=R*f^ z$1U+f$D%QPq{NGvAnFxn_0R4`Bkb^prROaSShrxA&x#<^af=ss49+R7hZ0`aWD7+Q z-JC#NOuT*;=G5u)(@A#dS-Szdg}RpCWy(QxQ$3&ZN|t#K@1(YOd;xGSfG~;O&F^kg z=M6Jo8!{xU7TH$SCF(9dAfV1vo<_}7!(_?K45LtS-;;z=T>`<-f9AOGWE7VP^wBj< zyd5dYe*X`Djd~`eVGg`J=60gA@nmC%k=6F^3mR4f5`JlI5}FdLKeMsRq@ZQ9FnE{R zEJakH8O{d<2dvBw(A-;M;N#h9w2pVoqXK0fXz1iVsP{E)CI(5Aca?3M{eH^!3S4C5ctn;f;B6FW&Fc*fMDL3{|L_CRbK1kAqjJw!@ zJwtu+f`q`>Jr5|v3dxt($}5ojadE0Gs-akRAIPYzexgZ~ z_9`2ef0i`3#`O)4Ytals^1Yuw2;QQ)eT_u&=}GEqm?j0#m1g1Mescs6Sc*<_vAQD% zUTAWCT5MVj8v~KCVX%p_S)eG&%7L>rBFCs}ND=z75UM`H=x2)jOTnsi+ zcn${F$Ie+iBj8lSGq5aWsg_u7zF+RHa{M@KaZZVh!)^#iFi#>v=@ge=_ili3<$ zHLv)SwNmWRA#q>P^rJO8Stp*A3&mo6gc?c@mniazU>ASV^w+RKQVjk4V-{^4fGj;t zTH%fWB#&TUhrn;xMH0gT_c?{Xwq8mc)yY?ehv5rQA&~QGe>L?IMzm} zI70RD)%9!rNbYtailEj~R%T@aM8CW<7XIa@<%vbLiFwF)ZZJ9QVmpXz(%8xKK4`x2 z>L2&kSfj zjc?Flg+3m@nldm9@xSz@!ru416O<-(I045%+x?<*eC{|z->^Pb_X}t={N^}0it!VD zZF?KtsTj#&0|Uf|WeKzZ6+>`tct9g_uFh&yz{ey&GIjARv&WmqcUb-gT^<|chyiGi z@RiR;(T}N=f5wB~B;V zS|a==PF>Y4^t_%*ef%m>s@viBcb6Dcj!%5fzHp{h_(i;ar4bP$rPsuNUNnYc^%Dj* zE()?4q6JO$(`BLyn&W-7p_2TH<(HZlONX4_?RU%Mktk@&KB_|*BV`kv_nmMhC2r)8 z@$6-Gc-{Wlb!(V+izPqZt&{4S-jKGXt}fVaFXEMARb3bURUT7mOnp$Igapa@#HMuRdy#r?wo)QphMI_ zc^lEz1(tJ~WE*bKp$?o#Te6MA&ys(9=kLGwVu4{RN2% zRa@!o3R87u`aa~-aqDE8y>`6dAbEpR>G^x{Ok%Z>QlZIt6*JHjA2z8{sJHhwS+cNE zbr(vGfNHSRUjPLy*V$7BHPG`xQ(WlJZDqz1sw`V}twP5xAgI<^4@E5dghB?>stT1^qdQOnF;|PS zQ2vLZaOws6I{}#{8BTcV(ngUIvCvMcv}yAH9Z_RVfk*LxCcfeO4GJj79*kyr=hwPH zi$JU{{Qbm3=getxiKT9}j%Af-PL88yfi)j1&q@j<6{RCy+L|`m`sIPORPW?%I z)*!{~&%kr}8x1algosJC$UG9?aXEMXP#@pXJ!BQ##!1gDIn(kdsLpH#gNRRJ3205t zTpH$mv)9P~vUh}zW4lq2^qG0e;Nm1$#fL=ef!St0IOh|6kkipz#wY2~dk1m931rJJ zJS4qkx#b=0ljvwGev?sNKYg+%Y18iYr`9r9qk%x=Rx zUG@~^a!M@i_E6*^E>b?!j8{gtIoAHzS+Nh}d-yna6Ls8Gd3Vguj>@e*gDf4qa7B_X z+W$p`rw&;w3&e|0Pyd-|iQ+svzL23n#IlVHCU5u=!UEibHg--{Jaqiq>-NlpuEkrC zIgd-1uVdxcyej7AEQiF-ZK)yhrxw$->tDM3b7Xd-t}^wuCpKF|-|0U-(2yF*2Yx}S zG4uR5%+yd3Ms9^a6=#b|)Ls~?UX?T=BozrS^Z?pBYE5~^(1mV8j=SkqZ}&Ac9otki zKv;ZOYFHf1vJ1rpB1xTI79w>qZGdh-L%d;ARsP*kF-USlQay<)I11%~tX2WDIh|0% z-s)9v7mkYbHD?3?x`tCCK+$R;8#0Q%pO6+pg@$f7r>k)$fhI*_j{IPK%MVV=F)FN) zdsz4^Sz|WyIe@)q&P!_OL1I(m3kCnjn|H(dR-CHUK^6~AK(d`xs1f>YQU~{jvC6Ds zX-HY8QT17CjW%;|KY?sYnLN`C#|0V3Emq;gs2VwwnUNN(X=xiw5VN9YKIHB*A?ER6 zR!u;jC)K5nzAHerG@q++b5}uC1&FFKoocO_m~dW=gG-hPK-9xXZz_x01s`h#Z9H;( z7;D_LgH0S6J7S6s88CC^98m`}p+4)%e1LWaW6C5MMO$NTL{!tqlV=~5^q(8K;+$ZK z!XhRE*xtf+7-bC>lr(p)aMgbGlKl97A8#pPYgEo?OBCgL^HUQRnKnvrpM7*&0W;3G zW%~GGF6HEoB0u5WO~#vJ7@AEjt+QjZ$ew4n(RXFBLeK}L$Wre*jQJmuy#E|FTS$b> zbNZ>xgSM}m)59OVs{>=w8}~<-EW(^^P;=K+&kISYnU-8{)muvm)!<*<-eewX2{LWl zhLdnl6xtU<`F>FaC2CA7Mccy@^Ky`AA54%TCez5IH-XigntG4>OPW$ue>gWW`ki;1 zR3KEUySt9+^0T+{AWvUF>w79l;b8=9})^!_88_7AHM`b&%NePdFJd4l1XJUTm z`xdyRq!fFRrwKU4WV~gMon?G2&4}y%{ZA7&U)0@TNhPYoEX8gIVsSR5oQj`Y84IHj zHq1TF(m(mp!Sy)p`o3C@&uLiU^hz03Q8el@X;Q#`cS_Bb(DnFS@r3nP1oQIa&iG6Q zY;3jiZt9CB0pLEX+CiVLZQdRU3NsLF75XcguO{YgTz^0Wyp3Z{9RF;kF(BScR`V7M z)!SnG^tMYEl=H5KCY{OkOdFUSuPT5dggfNbXXVa6vP6TR<_3zIEhZcJz^))yjVLf$ zbrvsI!mCF-r%KiA8#WfnX520Egqx54wQ#ER44}m<1&9QmRl)&r*l1+X8`Nkevp?>D zR`q-hM}l^FhsFl5^N!s@F>EblP#cHZ4-{rW3$kCHr51YOn5$t;3wJnhyV^c@SQKx2uvIKQb1m=>K0%GcB-Wyhn$rH#y&`9{^_h(AR$mh|PfN_u<;XXL51TAf z>9Q9mm7iOg!BN;tu_&u*!}k|{N;Xix!7!Q-wDx5M)kJp`qPBrMITSU%4_Fzd)()Q_ zR$9wUX_4=|78;OQj6XRpt#4PAV&V-0?s_^$3?PSW0ewGS+N4L!)^na7f8wtezIRC>yB44*iqqkUjf%e|XqoMb5w zOmVvLyNqIv@;}1Nb4zVN+EDd%BIZzz%PlDo#i<;g;Dt@ijqwq8JrUuw3&FX1tg4PzxhxQDbf_6vXpoO7efKJa5? zl3i%9pYDC>C4A^A-<(I5q_DkgVIHKXY#w!;m!9bDWsan?V{#a#mGd8Cm6b_LdK-2O zV(hBI5v)H4Rh-0RW4z%0O_5i3fv@rRq0Ccc`(Tiei6(x^e2I&7YR5)GIwrxAI!)4u z9P|eZ(NbHhWea%%<21tqRdKJ!xQx26G03H=v#acMk+aW-UgyDJ3sQPbiz zyCM0tfw4i{%#Ti9ZW$v;E$v^TT~=2`sm}|(RAA+@@6atrbNUq@LeDR|fELocBGU;z zn5E(|a}$n*V;ZLe`UiaMBog-3H=P67K?JurL-n%hT)%p@7vwJIFKK))sj=J^h^M-a z*H6<$W#nE_on=5dDoLz)%`cdpu`Q9SBL>+sdn=Wiu;bRsM4wCY)HSt9@*)AQeGpTy z@L^y!CR-9oDOJK1wOHRwhd9-(h~WqNieI%ox2u@PS=|z49myxBk#PW=3NfL( zk}n0E-S=23<$ekkv4#@vZcd&qn{|bdDbR+3F@k`kGje4Y;ncpId(Xd69tW|^^Y@#Q_*{=Ur z-XQ~4_b0Q$2hCYvAH|KlpnQV&c+P@H#iE*pIf|W6U4jAmz={NILzW~@jgY6BIC0L~ z+X}dqGBaXO6SQFOU(Ez~f(&VO4k*C7GxHHO%EdGGzB2Wn z(-&8`LE<~6y4L~RKn^9JlUX?0c*RE3IryQ4026;zqx}tMqw3{szrn60y_fk|V73D9 z(r_HIg{oi&doI&2$jXGaDwSv>vJo4A=r_a*UZ$AW0QI0t#fzd`4cP z*l^J2mKvIb?*6WnlatbeK#kX~T^X}vew)#V{j@Dq5meoOuR*ROL<6|yA^&QnS;!|z zRp0sIeY&E6V>F-BSN&+08Rx7yNhJ9?GH5YQ1m|nZU2!D(wcnm)6PpC`oFG-_gH#sK znzi+&AvVgsvti?=umx0j>ko@YN&jXgA5^Koqkm|w|D`>CvP~%47UwHWL_L-?gHOY^;#oLR3%<#C0N6g+<(F z(98^>b9eY(9Z>TEt^*bVPLj$8C~D-ANgEeZH%&2XU$|+l&!q6@vW;M=n2JolW&`2JgEtj=P`Y9pKJ zQrEnChZrbdIrG#zd-^ust#Z@i6m@Gxw5LEvBn1SYP#_u5V8(u%5V#2E%(;aCc4%3Y zylW3)@u;J_*4A9j=|7FO$zeWNyK;P+1}hu9kvk3;rPiYv|B30b*sCr~qw0TtRP0ln za3dBv5o5PGb!^HZ{Yjcbnk!`6hS7U$E8|{2G7$WBqBOQ4 z$Ew!JrQUKH=l#iAe4GGUiu>f_t_I@Bjd23Tj<#TV*B!gxP}hZ!Q)uu~j)T_1u_##3 zTu9optETZ)OxM;jz4bx0R(#$9R9x^(EB=oqV80~ zoBf=Jr@;pou8?QeyYL#|ZFJyJQOiayw+*5Fg@<9Y@W#gLgBfl|R409wb!7_Y%gg*{ z>u`&c8|I%Z<)^tQxk>TxTX;iA-bY}-48WJ&2<=V2)OjieQn5>;(UPH8=jnr=A-Zw~ z$h%WO`|%zRQE}(fj?$!uVv<5KDLlrJnkgpHlrpM8lZSM@&8+asw!nto)EH*^AAhC* zm3Q!qRb5LN(*3yzAm*Ms|LLLJp~V0v_Vb8}&*5+f(>D3g#gcR^b1q2O!{u@=Q{us- zzlU8Ly>(HW)SAgj6l!4raJ7@OCAXb(cY#}Joyoc{5`E`Ok^71y62rF9lj@-0Vd%C5 zk2cOt6jLiXZ-?hI>UQ26Z%af>&Zm)fi+#ek7(M1zprcU9QzGr%pm=S9^?ReLdXX{| z%y*%F=AT^tT-n=UeJRPOj#16cb^Bxo?=jhlhmT+g7?otKBsH<^h5=3kQf7GoFX~fF z_1PCq2hv4_*Z1uXvElD8A6c$KZrkSXnN0~1ge|gWQJHgk$VH}(J zC68#;$-2}c13GHysU@)&Mu&6*Gn5hKll6UnSPWaC1_Dt2;FYXiKupZ%9SQd zjEj!L5e!_RthFjFwQp6bMzB@z*XS{ln;k=3M{E+HsC8qmR!ymECQkDI+4n3%GqOaP zrXlx1e)uv7aR6Io#fRum_vXbB!39JK#AiK7_x1!jJ)U>#YZDJ-npEr(#K-37Y=+x` zS|yC?^-)O9A%hzssMiV~+eGIGN@P*b734`eue=&_mJaSR=k9K4aK5#N+Jg8DU6HLd zpr&|N%}N2dnY388TrH_Vf$c|a&9Kzczx$snnmSFa08cPglCRZGnF7=-rr^6)$0>P$MYDk?m?9 zUo?C~HcBwYD;$im)U!95OunEmugPbin+8ucIakl>%tSoEJKW5}T{fQ-^Ne1lFZ#HV z4Ci>i$Qd_S(O*nsoW_))Ry&W+dFz;IFE&c&fKTJ?-}pEV~ngSN0fq027vz~ z>QVghw;sm5cMs37Dfy%?JQVBjun$e@2WUVk*#~-XE#I-NJv5+< zs5`1LI)TMD-L5fwxofg!Kd_bJ6FT>t?~D#YYuGU66}hwrz5IW$8wAli;jzmkrxrYsYAc_TuCyg zzh7^||yDbJOh zh)fE{bGm^Me8GZ;NTPD?L_?@G0sG9%fY#*NE|=H7^@^kbGib$!sa{&ewV2TUi+@Kr zscg*RkD#;s(%z<5x10a-QwC!@bwTu1O3ER#h7p2lPk`>E4jI7b22IiSssC-Ht@Bgt z=_jjo1acfa#}|1YR63EQGp5Fn#VvydCD7iz+L^7Q=UkHiIVw@V*wOA)(r6O9=`5l^ zC`#6yxq89t-0{O()xyF&{@sAWabB?w>12(3rn)mfOjfRqyV4k{GV$x~2vwKcwr?4y zdH*hZyo%FuR^eoG{so=GmRpP1{D}r1h+ET){BtMrs!Wernyp|46&bUlBarIn=BwMB ztz?>Xf|noSBL%^xZdt!L0%!gPJ7DpZFs?O9Qh=@&{k2tHLUyJ)YR z*w7W0h=DrLoZxEvvcpGkoD)R@pNM~HLY_nog$hs_(evqIxvVz|D_8>9g73c@)@YZy ze!na$9siNDoCo)mm7&lnQmtaVm1SyaVaVMM)fz%TDS%QhNS~mEgXA}Srf=%D_XWUYq6Jl!ldg9QgzwNL#tP?^!WHrooeN0cV6+O9Y1y{xhcUdO66RR+ z%h))A_1sRu*YtGPJ{|wA7rs;wY#!ww9jaqLIqJwgBg>lq zY`~f!cfem@@B}@w48;QUATHS zF?eKu|DKk zrEX&r2VBw%ruiO^*ptHdg!BhRg`#V7iA391?1_WUTPW{Uc5j97P!J^`%2faDgW-ml zu&9#*ylC9V7h)xfRrnOe8H;T+hw_6~A{BS1fQ@rn?%HEeCozhZHbd00yy85gO!*4uWT6p?KFAy-uFhV$)!r6A^cWm}wkY`Y6v8i{G9W83 zztGD>jtjW|BxQ{&7xrcGDSazoCz%bAWUwvfj=^bgP^|cRwl8>-$i$Z!8Hr< z(fpB}t@fqloJZX&7vcp6+dt-$BFMVhF<3F7jV)pDre2YR|t= zV!}cTg8Kn_{fIaq5;c#_Blt}NLWxMZ+;XKDs|u2ke~nvTq|;+ypTl@Q6eL-&&pT(T zpI#ThCLB|}7+?@J0cKPrW#bqsWh(Uny7rg9)jFc#djX?+D~St@!||QtiXQHbH#Tqj zU68l4=vj8xJDdvu zu*4B@l!?I4w1iw7D>&1IV~V){WNmr&FK>D&&bebtmi?0C9Ri|~gg z+09ZU+3-idDg7aqOX=@@ph0Prq_!tcy^|Xvi2gTnSQ58M!dFRWXRnZi3?~zfE>%;$ zEEyNklmR!#n0)+Uxtk*|pJNn9h2GneH|kC*g?|0MQ*kYL+(Pcg_^YFh2>VgQ5t&} zqc4a?Z^brryCcs$7#v4#BF{X%_EKY6tPadfAF*>jfw6gJLf4=eUGH=w)itE zKlNDkvYLNs_3KnH<=boY9vlKtg~hBOa#?;bPwC6l7-dcu9w+ZQeX-96;j}i*V|b*$ z)1&)~oJa^LlIbWNp&k#q$ryO)2 zp2T4wgP0?=aqHKAj_^MxxyBFQ=uv80Y|Ko=6o=u4(SjR}xZ=(?5T6A*45ywHp%^Yl zH6%H7unuwQG(o<1EUb=Ze>B?l>1^d+vs6Cp(e3IveJR9aKh>Zk=2iq;ejEBQ%+-xc zhXW*tW9ui{`rM^e6qND?S((}J2(!^ypfCQYmvge-MohRTaa% z$4XjE>~T%pZic9!KP6lL&*@cn)1zG^SqDJvaX~YghPazH%*);1bDhsj8D$)uD`6H`+jY5!=lL;GMm;Pd1hO4(vKz# z0qotZ-G))@Rv4ZK5T6qFS<0#3jF6AskXy!oPAj1bq+cVMqP~O=Cu9x&{D&HJ7I(;Uy_+oWdJ`)JS2%pa>+f$>GXm9RTEl0ajt~~ zv;ITV@6IF{tIG^x!YGJ(>*!~x?mD*dWhpvmeK&_%?r*>Qf=9x;;Wj{JcYM?j$A)5@ z@uo(o}m{y3H-GGze&^FB> z;Lu=-SKqUzBJqOgqLSYEx5JmLHTcY*}kLMiTU#oby69*RTp zLU4C?m&rSK?sxAu^Q}9-vdFKn*4g_!`;mR7EkdmyNRh3}JzajeWY1qlh03(S^9iH; zXP5s!&Hmp%91d8ap%2@dpC`?kh)Oqlu06Uev@(3r9+&Zrlg4{Xv56CG?7Fo(I`RGf z4KS68{=hO8Hya2gN$j$Ge_Tpq7*8Y%s31Rxb+Q8xbnsDR&Qm)uBbD)M3F5@tw8&)$ zGJ_rcD-~e?Bq#!uwDff=Giaurg{IGoP@o5KjGNodBp7h}5cF*0g-^#rN@PH1j!b`% zcZMo`AEKEjINBg_5&VPD_&tiM`9lB%+fW zJvW$HsivK!__}~pCwlNVAqf|`;`aVChK_x*XK^Yz?KvHHQ@Mu{|Ev{Mh9~XSk-ajP#m-6mY8P^@!AJ$TO z+gygRy}90;tDX^X>z}t*P5PM2`?pKMa=Jab!Ffx$uG#2f6{qI5Oc{?4V97e)uqRXs zPUB(HcX?acP*zo@?c?JgasSTGGa~IS>q*VoI;Y;b3w%YJvqpEXT0x+B=iR)6kiJ)V zr*MF5kw85Buc5tO!ai^3$J?_ zfYbjEV7#*{Z!;NLYjb|=!sz|1o@Sc}NB#1;Fb9J7635MJ;e9zj>-vJ_9%_zyu}oH+Th@W;6wPXEqk9TVt6zT8%xt6aZG%@FOKZVb)s8e3SFIu?iVzBi)+9~Y{L=5cH#cCe^$w6aaR3P9%x-U7c$ zl|ba??-vB(m${1cA_(E-yveSEbch^Ich#JDYhk;C?B}&(;RaAO>3Xl0O_5&m2@x5=NOTE=pymwGpBWsCGaZ z6#xj06*dHXtJ%-wpW^R}iouDYD9KjI1^Yjm@l>Qz3b>5bG@T9RqXd^C{T30e*w|EP zbHO`9VTnFwMi0)I?8ju-H(mSuFwPBXRnF~|bE@Lud4mA4u7PJNWl7EA^T|S|y2*h?K?a(Ob|uFutW`3x-fd?be!59wi8SYDR(LWj*9y@i z!%kiIyLh!?e*)l7!!J|pcTa4+mZsc-bbGODYz$^Md(?|51;;hx&Ub0GEQ-YQIFjTfeo~GdQ*zv$+a^Fnz@X7 z?qmra_s9Owp5@>ddnP^BIbY}Fxf8KSf!w`1JR!;9{a_x(YG?60>5{K23%(tm4lInr zk7dc-HO5~p;Rmy{n>l=9&iVp3hnGUM_BYS=zkeTSld?U!w(KtwS1~r3@ju>j(Lz7t zP41PvQ3esLW6O;RzsY(3Y>k(BAjP0a9qU1}e)&yU`xdaSVo8=5S+8-xVNP|xF+W_4 z9Gh7tu+3ZI(JXz|{7X30m~cK}F_`yLx`$$w0Ez9ZH}MfdUtdL4*e;KXk9T+=IC2=y za1bF(q09h7vaS^>U*=Asf4_zPYYzE8Un*+h@a(^k3`|n^_9faRY_03-msRZo(#WNc zFTSDQa9C|YfQuEPu4iU8Jegv{Pm7 z)_*Z`)N-`3IZmQPWR9V5?BbW6$0I5O?=I&)Djl3mH`wW!Y4;2h$>`6x7R9eW=zM(G zL$;s^jh}8&H(&R&npg%!z;c)){W$_wPP0 zQ;b42HbL(J`Yf14EHxWVvl+~5+pJ+XG~#y^yk(Z&xaK$Q#jBXM?9ex?j5k3l`y?Ou zHY#>?=~8wh70Ww|LVX<9)~|tq_SYkJDHuZH-nWYM%LOg%j$=hf)=v!5Wu!lyTr4kl zX}W|M^VTbX?0=rSutpU-l(+fC8p;)t-YdVw@u-0ddZgF_t=6BC?_RQ^T;YlpaP78= z^xzCOGDEn10v;uB8#zwNn#30nJg73Nv&F5ASmv!W2P$JFaS7+@Fm6)Bs5ww;Yk+2u zSs*=kplz6%Rl%#cp5X;$AS(&gEobqPiu@u{9= zYu8-(G{_7Tk0z{64hYQp?sLv>Th%Yt3yMUAH!QQ7QtvHB7|bpqwjJ$L?0(Ac;mCHh z#tkkBs-%8_yRI%l*yBI3XR`JTBFhtg_o%--{o2r|Y!tO^$_UvmG{pE3oXQ@a=Dt^h zp>gZqLR@b9#==zo_vQP4*T#RVgyqplq}pKZNmUCEWj$m0H-$bAJCQei#SK zD6Tg?e=9Z!Z1jV()^#dCBgETNzL@tB;wO%sfv}g-=xeM!ieQB}KZ|d-pKy^wOYg>O z((p4C(FJc9t&$uz?H;=%q|HPtHY_L{+ngqBmDqM67W1y$TXao?ZnwFVz*>`7P6T2{ zVR3uyUL$bpyhQm*k$)mG49-Yki$s~BsG*NhFOa`gY>+uo{I5IBvO1kYXVV*-4V1I% zz!?}g<%Cx2d|`RT5?-K0eZ7-Qm$6LTcp7nfHQ}HG#pl5{CS3KVtNT9ruCZ~3_R_2x ziz%%E?;#I42`+$q;mhINa*O3DkqYe3R1I++WDMNzY;opK$1i$Qw{{)2=kd-*HoYxJ z$k!{MV(@oOhdITyv_~#veB=1&Se_=3vG5x&vt1E@bM|RDsAYjb<~hZx+R&#;Rs?|q z`(Bav$KAmcpC)E2#ntWDXK{9Qn>yQm8tMK_U4dre)j^-?d={>`B@%fUKpB(xy5taEiT<_WX-{;odt z0i$wezVgKu`Gcnf;4V!$!b2UlytniBI7j19X<}UvW zNDqWTu>9U2#V`Dt$KOTodf-)Ef%&yhcp_=#qj9Cwuh$IcKa_;nCw0#yN%bul{**M- z_wN^D&jc4oLISFhYh%dB`|8*(>?Y*O%RlxUN@Qq^MP zqkm8_{{x5k55@qSK%CD`rAkC@A`v&9r4#b3T&{xbK9noZsOZd`gDxZx6r&DY&|vCH z{JbE*sunUz+3L;I$r{o5StJ*h{_*};CpF75zyrd0cPvuEOtj9@)s$|KjzJwqo9Yn;glty<4?kAQj@a*X9`by;% zwS7#ZB;3r3d54`R-o%|<6OT>x-1D?C8&w=jo?`KNPrg{$__Bk%W0ZXX#9Gm zB#@AGnIF>Yz;4>ut@EL^u;WftAJx57E#FAAM~40(!t?Sz=lOL%UM+s~69;Y0OeNSV zF=hnEVv1dBx<7i`nyXu*x(#$`P4e3mF>||aK~ENGCtM4=eCmA^(fh2XKy=!`cppQd zatkQl3&PNQ#ETyiXpiGJB?oLY1rXL!@3wu6@}k>Oh1B;$cHFn^kh+R^v6UV-1BXfR zhI@Ee%?cx<+ic5@1A1a9N!P6ledh57*n79Mb#*YP$6?^0qJ0~QRk%v%T)LNK7$n<= z-7U$L`0)!uyVD23j~rZ@8fRLs7wMuDp;w^yKirGg7ZaFE&$Fd~#PanE&LK4H%G#`< zg`pWhSHQGG<@OZcN+$IfLF1NxjdRdKx)t!%4LJ38v#Z1Do3C#VI8a!?F0Am{SZieo zeU>(D1o^&Wn&UiQX1H^>M$p1(XyQ~$p-oG1iyP<(zk<1mXt%=3?gnL4STZ{%3h@gRl^}4~vF@ z)LWFZ){f7WU|QxhtX&Ra&uA~6DX+b#QGyD9i!^=9emW&927JJI-mx1CcUG<>l#=b-W-i6OjWyPfhpH`uCu z@LxUo|Gj?j>Or(GVkYqe5xSn1cUzSoZl9Ga#*t7s2hKmYqq5y%ApsX_m>YG*ixcA@ zNGueeFCZ6VqTzn#@1sKum##pnP`MgkB@Wf_hg2-_Ch9MYhKd?2H@#$ob(l!E#?ORT zBDtKy>bmkv3LG2Wf6rFmZpAl!e;lk)>i#`uyS+svK4UVxZ_p1$|GE&?uTJ(RPQkgc z(a!z$>!-)afJN9*@RaEeyxilL;QSwx(N(XSqhBu@&Rd>(e_vmspA1=4j(3+ydGW!y!*N&LUAK_tl}Ah^+wwbiTe6E^gD2Dva3^wY zUWG?6I)=fRgV6m>cKR+Kd8uD$j|t-GgWBHa|JekNr#Y@2#p$b=9C22li8k5!t@Bvb_11oxL;3(r!ZmP(_V#GN5@T*` z=q$SnD!pscjeZ~}+RYx4jA27{= zc8(@^>6(!ZY?#Z>c~qX4z5Vih#emoi{=B=9?3?&Ipw2gG`0<)=+ijya5T7E+mu{M= zYs{0GT(5ZVO(=D8`pz)}A!vo6V8Lc@ufJZNtSQ*)VGuF|~xI??@?Na}-@Crfg6N!D#JX4TQ4!z%hG$;zxDd~O7 z@LfYfZ0e8d-)OIr&XoNwf*=&U92=YbM;4*QG?N(H&S+H$E3{BdKj}FHp*7`eUIzcl zd2{;g^6uQE&S~MG^(E4o=d$G%vnA`x*JX=9t^&o+OfjT)S#o#8F&wduK2SzGRzmm` zp815tyxqabPXV@1eL1UZ`l3GSg@4)U1rc@wq5A`2HJjq!s_X!! z@Zw#)y@^`oS_wT|Xx^KJ-Vd@T}$e&E^hjiSk!FD@DwnX1JbR?Q=TPQ|4>S zlN%jJ>51+9Tm@T>TM>DU%ny>Ri1e4;uYiFG%T5hO^zLJ#cy`KB(-J&S=J9`A=cKBx z(`s8#+grJ-k_(Ns+RZEw(2V4WA4XAW*Na0l1#M^S8cGIQrI!YpJ8fdT{cp{3==0Sb-46So71;9^Se%t61$)HaKO1RZAVKR9rQYCA2SeDc-`J~ zb0^P^ozd=6(d+#%-U)Z6F|`G}cL7>_7wC?QcVs2uTvlEXp=X3XN9imqpSIW^x6mA~ zZ8o>4T<1S=@}O}&c<{hA@9M3eZv47`(v;!TiWhyA{jAWU*6VOFZXiVv?ddG5P!l=! zCY^Vul(^rH!bdoz1wSw`f(zOj)IbVZzHwZ5*%9A_q;^91h@lB!8Ri5R`B@ZQ5@^s& z9B{MT#ll)Lj4G$lJJ>^pyjt)Z*-z zuT+6yl)W=f0!TI@ESdQw|ARcHcWn|I7;VOMHN?rLj9w#Pnt_&VXwuQXcD@0r&2PJs z*nhbHOD=Wa45F$Nv+3_dDvD68Q?{=wZ8PYq%W(8VWi?s_lg7C!0Si{WURB|qzkS*R z*4&oU1J!qWMzN5V|Hn$K25Bni5IoWf{F?Mg2r}%AGlt(l9oY2k5ydsr05{EVFQqTG zDlM9}Y&Nns7(AZ9g34ikeTQV?Ps~Z(NN&4E7J(oY5HbSA&czCxf?l}T-geDw@{f%o zIyV_kV=X4l#6Ouk)G_3yY!A`-A=ZYTc}B*%++d|^rtJIZa5`v4>m;_29@F*y<+~<& zf63`*-3vMAV-sojYWtCRWUu)&1Kl&N+x-y zXZ485dSll^{#_eD5oQ5QD?jYuMFz6pwFi!V942aITxR1d3GHX(=5z%_^V0Un>1(@R zdYEmBW3v1ED0zzf>9dCVoeTGO z)8o_iJCWM4#p=*>1IF6XG~yFv+w^uz1BRaOwX>cUv{?7`3O6_&)~o9_6H%Rhb}pK_ zq*rqW2R#Dk2f=jq_VSpU^E(&$U>oE2W&LDTTXagT8QyD^?D{*6gZ-z?F|nGg#_L%b z{GO95)R=7yt=YwQCMmY$Bq3bFTA;X(D>)5q+usO#XSLieJHJs`(nBBV?IeRu0SAeer}*Z&uF znXNM_II}Yb?LHBp@$FV@@1~O$PZ^#f!(X=R4n5sb8Q_IDz_EXVAdW<;UbqPo@@ZIH zYP^7l{*e!&D}1lKmf%G+0m;rb{^vNdPZA6kR)RD=jXM`F=eUj4?gW|adTGQ@Q!5th z-P}oRMvt+FEN0u9%5b`vx~xI&jvQwDrFJNfdRObMCzzM?8V^@acbo6^ezy1r%H?Ed z(M(GfkWL_P4x3*4c?7b~=({~Fh+z;zjbZ;;NmLnBOd%iSfwnE1s%Q;B&3`D6Wl9#P zFCq7jQag_g2%6)Mw+vb0%>O#;;XiBubT&q$HqKxp zBaXi;Q&>`*>U4P%iuyIY-H25^&u|X+XE$d-}unI@4%c zhQfaFYImV=K&vdqC!jw#*Fl0SC1Dv|k#_FBovvmjra2pk9cndeuII|#SKfWJUEN^A z{v`M9ULixA!$a(^tG6Hnth&5WfV^Dvg7@Hngm>5 zaYWV;zIW7=AaWm*Yk+6`TwbiWDyeEu!HWT*iWFrf_1iq-f>|>G^3*T!EBA^hmGrcQ zE96;)nP&8BPp1Q7LT29t1_$5tlBWWoC?#BhaEc9V<}2gBWRz}Gxh<7%A#IKEw@^)V#AAIm%u673;#K?oX=wH18zv( z0f}bW6916vO+oHYW^rQE#Ee~~b@A$wuwfFF} zTtbxCZpKGZkJpx)?Uv-`QyGR;J%&g3{Wa6gKc?pn+8C$ovz?BLYje#Lgd0PsZI(U| z(0{Y$42DJA6?KIBD#W#^0BXec_NVX^4#jxJ(`De03Y=(A=vz9!aX@B$@hBz1-kbTN zTu&#k()oH=EEiCW{5Pddp1^2?{w}b@G_cVJ6T76DUMsV8gQC{AaV6W3{xR1Vr z@XBKl45tXR!0;+;dDov#P;{fOa=I~humyv&yMt?P8}o( zUX#ab+(2(`dv7(b(kp4DE7LotnFlot2u49MwM;+d7-siTh zR}I^yZDcs<#{r!XCNk^TZ(}o0W0Dk6e2cTWAz2L+mZX&VEHI%&Y?JTQUAbw*F4IeV z3J{l$xVYelTzQI1FAooGV#?(Fn5Nl<0$0})L>2%Xju?)0MyuFxfH8Ldc%&ei-fm9Z z7^6<4Cv2N~^6T6;ymMa`-8QX;R9U>kZ|0K{@3Xris(4+i0^<~`b*Yjgy?yvEqaJG! z!1OPA5x-UQThu<3Tdt4Gn~jVB-A}-Hc);_p0v{^v2}e9hodGmDz}qIBPPMmeQc|^y zu7XAG00YRXx2CL!)a#b%1?5s4CkKfY3Nvt6G}LvpWzU7@=v&M5&cP;zoZ2a~|1&LE zS2{wR`cRJidDI57R!fXrKEtljB_E@E>w=d!#L6}2Ggu>K%ba_S(->7P&W3RWj}Jim z%nl@Fh3-~OCzENUI5GoNC&6vjeq9AKAH`?@prbZhml%jr`E`Pxi1*pm#07@&y+nGA zv9rSn<+-J9s>v(lEI*>=Y{KF~%zJP&)j>R3eNE(vPU(m&`}F1knw^2G37a?v73ZMe zXEa#vI5Y7{j)SeInpXIDcubG(&eVc*RXpz%8;*6 z5bplE%wp=*SuEu9F<&|n)n+=Sg6w$t*5JDOqmf&itL@)(Sm0W$KhrBhq*Wz?mEN!> z$kxF_W1D4IusU!k_ej{d8Qft|5qMd0*uM1te z=C*h7@oWYjl@9qagaNZa)>(_j=)`^dW;)LB%jwNMdcqZ)*xqB}>E7lJ+xXir8r;ly z*QE3*uFJ1~`J0<9sGWIG!M{uT&dt8ow@_ z?BkMU#I9qfNWvBjMD0QBSL3lfGBqDq|UCll?{BDWZ_DNw|cj({HuEI0k zt~lE*6Oiz2`j`gW{yGb&aNb|m>*wunf+VI1@|I!Eq+2*f(mk!b{O`@<|N0A+k&8&t zWAT{blztpN%^UbcbEYhltwWa=FUS(l(QCuO#$4WhSr2v?0;sR#i`Vo*R*gQxH1u4ja`>)QB}Swr@NM(4dPkwJl}} zLFiKR51)k8+SkpA@;s2|rs2Y>9p@c~`IQ?N5W%vLGJ@_R* zAGYM+Y})vh&?47K;@K#%b;rM3?W z*4c+DMku4+0vyi$%3q;O>ZRp`lexs3+PhY4s7QuwS``tQs6>FO1@d~4c6)-?BB)Oy z?r;N3%I1hyv_}(L6p#Zbrc8aeazMTe=QrN*3@F0=BQdhQy<_{Nl5F1Kh0OSSbV54^ zg4I|*Q+Yux)fRnM($hDhN}87Q(=(v#Th16$9o8N>pyQ0^-A8@BTB5Dv{7j*7IVUZ6|(kw<^v_e)ST2$nE@7K)_F+u*j?SU)M z1jxuGn*F*p)5X@h9QNT{r~1m{==$S?XsZddZzF7!tLyQg^iQXr+|Ps0cllCviPc=c zh)YQAdR27I;t$)M@v<_%$=u*5rOr%P=YU!H5A*^WaEfM+E)5LBslPtfHgWM?kWsp; zzpJ&4&$Gpn%${dx77;IX{%j^fJ28I>$^`0&3<$d+{vdQF4dd65EPs4CDOLMD@hreA zfzHqG)si8Afmy9v6Gu|R&v)_$Yg2LjW#*iqh&m?65)$E+nMIwI30$3(3&r%Pm_emL z?Xpj)338_M5#VLo609gwXxOn8n?TKEt=x3N&c^}b+r0Vw%Ud9Qn)BCHVP@n2@SF4g z!Xz#8mbZUCVk@bB-EseU6jdhqf^&trVlatFd|E=5Y4&_Myu=U75l5?RQS{=%e#)gK zbxn@8T_f3r=+lvkl`@cM(u+>HhH_he z*Nh>NL080S{6O#F3i!-DD_UBXWx-bokcuv>$;cn!rJg4J4?ZQH9tzd>-YUnDT?b#; z$udkOzfSN~{zW8`c#p5+8oj@6?jnU4Gk-wZ5(o+gDGn@V#DetZE{hfuA3@9i{WhSz_nH?t5UhAVv$D_ELBuB(YO^>*xahp=lcnd#8m#L--jZyJ(%{p~h) zb8pLc^T^|zMwrskbLOT1%`b^6Y(h{&l&!&E0*HX*&IEjrr#M6%ar-BJ>1MZ6hF9?W z^QRAoemeSOoDz(rxqk2$D+bAfw5p_r2zbcMrJ(Og%ZFljQ9dU+w|Jo)iF6moAN_No zaN*Xf77s(=)my$sb*zOy?9KJ4cYbvPi=|)kDX;4>wx~V|?eIoWnM3c`i?8S9SCQg) z&YSE5ndcT#pkceZQt1VoUL_KbZ4BXRGf;`sZ144x7~o1p_%fFcYF6CxV|rFPf->>9 zbC2A9nn}nYo0|hgMZ#^Ligg})uM((~4n zDb}C2Y||LSds=?G9h@&_2d-+L%1noRZ&?f5Xbx(1c?V9V_+%|v@bY&W#mZ#DC-)D=GieFHKkTcJozQ(?0o4E+62xDoLXXKj0y7779 z!qFcIR_(n`)DmI|P(pE4{!xpqvR0v|1eMdDf@@PhU=DR(@Zw+d*1taf*mCE12NKBM z#c)LsMZ61UHv}2mb}l!=$BJ?XqV=hn0(t>_@)_w12?ZbeNeXkPX5t65=N1Egb1x44 zx5-E(4n)x0SG^K~{-x);Kd}ykXVJA6&;Dge`XBuEiSG%FKSM*~Cv4v1cEcHRG=4@t zrVUSStGU84{z7-;*KS z&m-6Sfgr;)T1>i+=gH?6kNSA<`6s6*zNVT9ELO|J^xH_0)eC>;xg2=S%>x~c@!5-X zs)ZyTu~$Lpb&jRNBp*d=+ysh!QkcST__Reb;Q zZ_}1T1v|=v5D|&zn5hDwo_XW1$J#*TLGULgDve8)dDR<_C76t6ujKNIL$?r`fcappSuS;aS?#{h*{D&io>*ANV5oM%hU@v+%^dTL2=ImfX8`;DZ8S)u!BF0rk! zIPmZ|Bsm}2iEM}(7)m@ooUgfhOnX31|LEd0ynMG3Ru@rYOIM-GCK2|64M0APgPN*P zwnL17&r!_xLwPxDB53tJm@11FHsFhY7Qk(Kb%P)gkEPcc>wqQFKE$|mm76`L%{>2V zC=U<6nhn?@F8yN*E;Kj9r9DaOUxCvM83ae%eD47J`FxR1+Gu$fUIIuJ4yr0wzPf%| zZU}(rbFa_vN%Hs2K9E@ny%>r}!Cs?m7?ZiGktqOkb^fvMSjsqQA9(g;P@%>1{vA5Q)_gu&E+ReGD(4kOGnCLE z+SFC_p^7C??W&Xs6sX54kYss?_%TekZcvjgAMBdS4($cxTZrg)0oU>NI(08CePK3D zO{24(jxjh+%adVd6ZR1JX~g-JyHhCE&m{sv9dA`3TPaoMf%sT!5cZn*@{>g803U1% zq9JdnB;N6YvL)OWZ{chdp;cBZ3ZCqO;O)4F^JT)qU$IsEu%Q`pbx)RF;Aj&h#aozo zLOwwNQF@UnzXW_}EN+PnyWE}pu?UloHjY`9^Uak$IZq0^J2qd?%hW4N60ashFQh6z zeKjv=(54&cgL6~2+-xVs?XTk4yJiS#e@IUt+QL7Qs z$XFJudk095|J~zuzVtrL4`z=rkaIEceiv+f$%LnQD;$-Mw5iS`J&_5U+xMtFw?A-Oc(mzb$|F1FN zpEC;TP79Hk_dMN>B{APhsp56JLh$t?<{Z(dys+qz3{I|kKREUL8Cu;qIiTisLpG+4 zQPnJ{4@^|hkCAuWF;5ivc^8xU$FFV3)O+Tc+t_3J6{Dp*eHvzOCJo$rr3M__8RwY);4dZ4Mz~>EuCY3P3^T@3}{>g_o4H#|}eo3`X4P_5E zo?h|pcs+;lwe46ad31%Dzl2Z>cm2ym84B@(b%Vt-lR%PHB=Cv<$8rr&2*{K+n;vfC^ zAijQ;uz`jkcjlr`QfknD5M#dD6D9Nz&a`cPbXI9pJF(qT+m1!GLx|FYkO1ZFHR>*L zoWK&h8RnuV-Pcepgih!suwJJtd0)tjeg#>pO<24~*fvha^(yB{9x*00o&s@(x z1WR*CwfsrA?8mE_tjkC*-raP6Kx#gWnL(EQj!_|gLw-N0CF?XIClb?cdqlwIOR-)U zOwxFNDo@m~P<7cXMb}i-0UX{5;HNWRK1tTk^Qopszx{b%Gdo;Z>6{GZ?X@?zx@K`z z^0cXABoOUbjlT_P7P_5Q7Q^_RenxoB0;A3m1Ku{}w>KMc{qY)+&n#+2T8&+RsM%ZN zi2Yi-uydfByVQ&+^SyLf^zUyw=lAvv+wwex#lGFo_y8U7)!zg^>fcVcyD!Z2IRksV zt;;RWmPtrr2V=K%+8LvA1QwcU&fN(O_bSNdbayNEt?%Jc%tX->ormu0emjmEr%^_N zVgS6?6UC;%<|JpErrI_2%Lhqx>6VkAeTPWJRBNNN%R1T<(4XbRg}UssIWD|Mo_59L zLrQeFNG+1k3|;1jC=t*3Pagveh|fAJ+j_8n$S+U56n#FSejudkRBmhrl`d1l(}S;x z;Ft8Aa#-3Bu0QH3tZhQ;{ACGH6^jF7! z^fqLnUge zRn|WSkogvy5lAM%bU<1`fcS=J%S@GU^ujU5N$rjKWYU1hl>n7>r{geTLm4LVQTSiC zW6uX8mn|C_K%h@)XRW&F541QAqT8A2S$lP`0{S1_Ot6u}A2MzSB{tkQJaob^x)YB` z$b()XSRwbaouG8il7U!E2ox(q*m=b6@)uW76~Nl@1vaU^mvZoV^{aUt7dazGcH3xu z4lr^9OB1*II)&KAbpsO`|8my8KMhmC{JfUj)i|@OiKiqFJwi%MU^@N{fF(e)gANY4 z0SBIH=7*~&cG=jLLrKQHNjgNsPVq9%>>jB_jcjBHk zRsBt)I-Zt0z6U17_n@v3GlP8NedVZ_YZ}3Mqh?f0(1t+Ef2F z=4&A80BWCV3fZ^8LQ@!eMp)yb@yh66gCjV;PGQRzi{AN+P&TRR{xHp_B89RG78woa zMIRB(=5+=fq^p%KMQ-3-XE?vzwYe-}j-J!tG2C6Uz`SMCniYIP^wbV0To_v**>)asmNI{-ObG(`#eiHfE zSm57MKL4YHp-79v^9^-_VDMeT{mNHs^F^fh@UipH_pzGM@4?Ui&4Kin|7{U~>;v&# z!7vyz9vd8v_Zu3<_xw~;Le3wKNhHJQhCZw1rIx+*ejd^@qwQ_mTzc(VEJmgFc04ak zZ0K(T=uKXLzIF{0n(J6z;;=8@jLpq-sjNlpK#;v{Q75*A0rN+ z7%+)V3dFq3gGV+*$U}Bu^*(@<7-Oah^>} zb>F+@?=y=6SJk=$fpUd5zIb!L93Q!>rP`nuR<5?3xO>7?;+Y=$cVW1RLsy`0 ze=HnRZwNyq_YxDq*SFabh))f4dp~7XUw>0rKB2gD>t^r0**}T06~A$%nDhH#z*^e@ z6PW~se7`S{w_dIwgo*99KYxM0%O%1V|GQJJ7Cmc>A<+wO;PF^hf2W;%zQI3G8K#D!=E{44K4>dZfoV=dl+`n{d61$=7DWn(zpLgmab+-~R zF%+e}&fd3>+dQ`Ucp2Ye4(3Ua&|$l7H12DBmXOhMI%+mkm5nQ3!KYLJtX|)pd^&RufPKyA3oMzUO&4{{!!-oW?h%MN&9)C)unw0Vz=OKNRDf?p&`3!~ z+fosJ6*Mnf$A;)nc(>6cbAQT}Pu=338he7Zpo8cuV`GgnsuOAtmp)sXE$1?OW;A~@ z7K&0hrRFkTS?b&YCV3Ps-x3Huj}U8&=;K|dMCXgh>&QL@7bqBBotS&kYh2;HPUmK! z0Jwc`;GF()h6%ce5M>x7KC93^Xo0#vIPs9vu5&UwiOZ4pVtH*JoU?N^cq1ta(rR7lNh_2 z{(uqaK0xs}knDN5SJ7X4Bp;9SfOxEqq%*$m`B=unq|q0#><1^2+VRuUQg&`Uu_&3I z5*xe>oi)w6@}WS)X?YorUz#wg9N3DhCG$6pvV!IvJimxC@&;!EC#NUTV^cvv zf<%K$C*Jlkd4WCy8tvL*>0GN05P~W~g<)?uj}7kYWWad_>EwbO3DT%x^}06o_Yfp` z{%gbpp5Md@51Z5=`2s%A+e`aQZK$9x-ngyzcNOK*Qny%yDu0)pbMV!hza~c#V(ZBm zhBm95dm*t{5FA*0uG?5KySK#7bk~@<@sH*jlc1}OL5z#NL~$<`U?mb@I_*v*I@5P_ z?pHf}zB^K_FiS&mE_;QIsJ&8XpgCY4gImZH>rY#oZgnkHf1~luT@k@N^kHP*_qCtu zgMz7)e9}5O|=)(Q(bL0g)t3Qh(N1czC^qyPOt((P_WeF={jbI&qf3}Wi zS7bwoRwpI=O6Iad>*7G!-x;V8-evL2)n_^_ZK@20_P@Jy+laI6=y)u#p+9mV@&CO6 zAL6J}9DVpJ>w>jX_cz0l8Es@cPH@lL6g>irg8yeKqf#IX<*R|fx9;7&J=#r~l?&_< z&m0SB{y9{3*Ht=RY1-Y%UwE_F74aj?NwaP-Mr@~4yZj*dqIj;hV?d2ng=wF*p=gYG zAjzRC%kp)MORQW+6TW#$wWO$ZMo6#kH1YzooZ{cRgIp!{9H-mNbiUY-+o-wQ6vj6qrua64)wAg&m2}!eI;hRC2{aww zxA?F2YT|D#Xny_l9PrGnjWyTjT6?SUgJ;H-$ofqi68SV8JzvUSDdpyj=f1Q&!QgntsaWwdKdgXn8%<7B%QADzGH&B4L~9fTFk z+#H|^{G{eT<$ci37TYTj2yka#C6NP!_+;ez1o7F|q#9bDScVuILg@T&5NEWPZ$iWr z2O>Y2{gjNz=GdzOcpzmkSr#_GcUkvPgxPU5%|zc&O|=y9TBpb_Uc|ITJj8jD7!^&X zz;{}M(b0Jr5Lf;a!c6I&oPZ(-`NZ!-nZiQ;v~_9G^KER8rC0)F(@v^-3zI|BqIjEb z9Bu_zy!UdV$`z$BixuJ~lvfnw0A|W$>cjFqPHza3|8DC9Svy9JK&*ueoOay1U)9SV zu&PQ$+O(b!O}m&91n!Ps2I#YsNZw|13xkQQ#f0yXlqI9p=NJRBD4_SeYSx<@9aHM0 z-^obn5o^VgS_>^DRA#MVs;d_47VyeVO_Eb&+ytN(-`VQ>tyg3mi}zLg`D@Zljd==* zimyp6uMyQtZ3ail!^&=M7E`oa`k+Ao&XO+&nm37iaF{w&QBbEK?lxo2a*%$6n(azPP|DkiqhDhHCeLTtSO!@4WBi z-hjs|IiR!)lUMV#Q;(doI)J2+dw)wOnm+pz0xMvo@K{wi$X1AC1~uoqz>ojBucm4j zkdG7wNq}$$h56^lZ!%lSmIrQs!-4{aZHJ$9fI(O_OE<_Zt<|~p;Cp^+ga5_YR{+(u zE!zeQ8eD^W@Zc^9?z)lS?(S|OSg-_l2)c213GVJL!8N$^SN?tfz2uyG&-+!YioK|! zSbNRc-J?f$kLe{JMe=S&+;^UcL{G0B*&Ml`ZnKqf*54FONT?S7MGOh`B#-GA%TaOgdJIC;Bl!de zLU{zjHPRv{cwvvlQj9Z#B>KxF8gLw&H$M*CzGtBky3-pCDHYUyS{k`DSb=wNi6>{% zV;Jd6ZEN1{Q*^1j3;If@z~~FB@DewFy%|X;yw>Yw$zO8!f0MFAzY$u(5Qg6E_ozF-%JaP!s-}ut+NRUxq@iwbRgi20o&%xn)P-s6h6}w>TBW{L} zAsI3(J=MnF9!^=qzpLAMl>_1UtbGV#V*`FF!D90meNdfHP4=~1ypZxEUppJzF zy5ys=aM~qM%#bMoS-8cU^{)tA>$~c$61l@LsT03Cnct}pUt7k=f+yO~p`wW*^BrN1 zHe57#c*TWm^8#Iq5!57K+Z2a>qi2i}vKMk__kGdvqQVTGSv>T-3lGOF>WKm1{YXJe zZ2qSlT8qb9qxdt|iw5s%xVAQI!q4eO;@dw8CBu4tqkTEj-Qa+8oG@rtDR_S=Fh)i~ zp>Xa`BtbyE(odd`jJBqjok1Wd?EPYK519^1i#p;+Dw6YsVn8myq3^RMA=^L(eUsfe zeh2lbXA9G=O0IYOK{@O}16L?z6Ti;y^Pv+zqAMZ-L*@4H<5LpE_aZa3w$fQ&`Aplp zvHEv|^rKimmUo0)zxw1u4lHekS6h`fB{ph;3@aQHW7%8{w~}? zgJ3kFgIb6Ts22v-t2Dw$-ITCc!Bis|L(C79s~8#Fz=^JUm+kX7<6jl@lxXZ$w_f?M z-t6IXF8n+J*X|9TE!l@Uq*(f{SPhQQIbSCLEhfgC-ZuHXc|Jy+iol`1R!+0n1DTN3 zrEPiBI=3}J0x`{d+b+L&YRl|Kk*}tP$2>4|Jl8is#LTYNtNt_S19yo82rs%`A=Vqp zpgbh72?@UFDfMU<^8COa6!YC4CR-`D>oIC${e`jr&o|tWQ1r)fu@u)-3U)*9RJb`2 zNR08Gu4Md>O(pNXTkfR4gQW}h=v~^Y%%l}YuK9-CmVP>7;mxs?4BuRTBo`+oSUZMs z3Rc_BZLD^E6pHi<8(AaDIoucNTOgGa0v%ai2~YI-xQdVbh=4kcGyMGIxOBsuvzny_ z?*o}ZHJVMp3Zzj4wAyE1lmtsN>homZ?$*CJau9S`w16cvVJsLxm*Fw%4yc6P^80-L z=2iamm-%_*i?gPtk^#lI6WJwm_l!;UaWuWxuxm?SoLpsLjJj!X^_rwcH#R@GOb!zw z=R$sg%EsQipDP8%6eLTUT-q_-Ns=)nrBT{7EhBpaqZmN;J!rYUFSXe$ia4U(u5v}V z)9a5+=()2ANDciCr~Y=A7>nT42aQsNVDOb81n`$PtC)Hd;gTAa1T$W3vgMC!1n_j068`QZX+b z($5Ev7WDL8#oUAXjiqBF*jM zr;)Gx)mL|pu`Sx+0W|wcE0v0K1p2tEfwhi)na}|z{llSuHx!||?2DZr+^*R|hu0K_ zzGOnl^qp7vMGg`Zc4S8<65rFHRqZoia&%ne3NHurv0(MtATM$kBp`Wb%MKiSRoj&b zWW_HvmcmEw0{IaZeWm#x-VQ z@x(j9&6P_{n%5FhOCZFD9V6Zh*+8Skjekyte+fzAyoUgT6z#(jX)3(H`e^vWeMu(# zvMf*qN|!|;{cWfdZDt2ZdY7VK1zNc<6PppXDp|`ijiqrgNJ(YS0}~F!=UliqnfRqc&_0J%QE%B zFTCQtnIqnkvrE_3*xraA49u*ks?Rs86pr;5eYoKJ+y1($gN#MVj^&A%*o_rgwP%ua zyhT<%Ypp8q@P61=U8E#A-Q|=`DB2Ez`oyKh$kou7Kq?d;S2nR<-;6-(G#8CU&}BUv z$X{x18(uwqt{1u_V&0z2FH0lgz#lEA%my zze>8HJ+&->nY|bxaf->FN0c$wC%BG{n?YAQEyd%omomflyxu{n%F}p$8YKHm6G;Bx zq^JAiV2@%0#Zq2yrGOR)$V$x~&7WE*J+^&nH@{jNLfNC`+0q2-JvLu^Hbea`D*10B z@-Jj|uK}@f%^g;w1Y?=JQPm~tnf$5P@H!eSv(?Bgq@%H&@p=Auhp~6|k@%O7eJ0WI zV#DN0#B#exVE9BX{kZAv(i3b__*pNXop0P0ztqx^I`RC;y0qlkJ4MROWgbX|trw59 zT_)}=yeeJqwU?7q@vpXQ9)=j(*1Z~ka^2719UKy$2oBXQO_}qq`zMDQA_yM zucKN;JDO&KY%*-P_&+nj|K%apZs}eqzzuO`IvjF~;)zvi`?FN|(-1!>eg&Z97;VB2 zjiMLd;~5^M`ic~CLsVT=0rX=?$M^;~v5`9j;kYwxVwnvFyx}G3nb)*^elkC$fv&*b zMmAZs3{N2!6yIL-BA-bF|BJAY15yj>L6q}9tA7CO=i4Mq+}%J3cl~X|=PuQrjKB4l=vC5=RXC0_f5Z44Y1QRtdi#U;%O433EuKvBQ;p=Dy$Z4#hJV=gYI{W{4UFC z9_ndwcK`i`hllStH+c-V4m2=sTVJZ3n^L)juwc8VVKO+%lwi2`y0t}SHI5{f~COx2CTXjX9~WXFL35WYEXoHi3uo-SgTXLP?7x>FjWPL=Lv~R zsZJ3PePE&jrcZw==uOZnw6Kgux>u#jqYT$gKD);c3l`3m-Y2BFOi{);Fz(l3tbmT@ zU(t;))wt@kO;jRI9R8}}#@H5Av&Bg*IcNqGK1W*co*PzK9oq-F{J^Jc$yxtZs$BM% zw`n?C);t6T)E3!^3u`*|lDCl5ohOLsfPehw*!cYJr@>!>8~}Z$4??*yI_*#nv!3l-uHCIhKPbkp&Q7N1l_NQ@6)Ydtc@_-!#v8B~L;S7(`2X3q zud<$z-O?Zo1guMu2r6SiGi2(vnvq*MS;GAP(*nQ>p)NI7rpaQaOZ$3MPMI_xr8Q25 zGtHLb>ktDdIqpS*0jyW!Kce`qD9?Goo1N~(wCQAO25^L)9wzMoHwCpTi z_WZDupDbU#jPP(3-M7Sdui)fu75rO_L$-rqsm#Yqn&B$MmK(kJSPu+JSy>s$fQWb= z@eG0S(c04~gCdPM+r{JEYUa3_US}+|886B;!n~vutOE7`}1!KsQ-CCwmZIAi<`XbRjIH{Mw^r$ zOx!ks0|s-@AXn^MtB%n?-BQHw0pY3)cq zZO1TH=;}O8Kun5biPxk%`IK+(#MDhva>cN+!NYjvX`%Th{Vx^`K>Qp81(pJ}ej7mA zh=-oL_{FTkXh9s)P)+F_skB=3U{^AS!1#{w!TA77bF;$Up%op-I2ZyHxO;+IQM?40 zvb1Bu*ylqwC^bqwv2rV~p$F$LQWt7R9Coy&;BM9`!b3u}=C{H&wa^&$4Y?2y;{V1j z{`4}x?$V|Ge<@;srJCKZ7l@?g<*Q;KKvG|eXoFfpeqt0waj;{C@N=_Y8Cr?HDPP6J zjk_QFI$O6`^knGYa()-5!&v1w8?F8PGfhBJqvFjhwfm~i5dtt;MxH-~uK9T4{KQJK z|4S4@DaP7Cb=k!1e`MAlT63?P2nhWas z?+c$bzhCHEs~`S?rsEQ`aS6_j*G)GMVpsX8^w6M<)!OszZa$;z*#A1zPM!bsO7h|j zCRZkwgmgxpWS`=JInfpT+Un!E%b-HiP;Z${O?Yd=*q}}6lT@0PnyGpx#-q!s>+8>< zQaYx9txp*b`C%{#WVC(#4#~d z0S4~wF6TG%?_Qyd${Nkiq&>fM&b{yD!QBI%@%mnO?RhIBFQ8OlU2i+(p&4v_SIOsj zDlY3XXGyEl;WOn@vR84n@Gh9aQJR%r+`pW;p&-w6fHL;E+ptfhA>)cQvMR~po9w7m z!}u9rLRN-(6Y+k{8O%I#$)~~nNuzMx|20U%!BD*sGOij*bz&A);gtqSc9M|NaW21= zBSDVX>k{}H3ZD@{Oq~HaDMAG6!FPM5dBKJ0HjasVj9)cl4OI&Wd~tBF*c9o2YzUiz ztuEDE7SVi_3;X-tY5uHaxql3<^{f@X4D(vF(@vp!n?FC;`gZm8%;f?g{`R3or{7Pa zv&YkJD!#dTYSwwf(*lq{JV{w0I_zwFkxcygZ`+@Yf_V!)i#ucB)VXZ?DULYKu;UjO27|J$4afr3g) zK_$x_Z8R!`FoCh4Z@r#a}f+=xqC7nn{hxFF2|vyE4a z96dOHrFFB~{mX+H`h&)^dRbfBTD8Fe zs2eU_KFri4MMlNCUs}paJ@<%}TE!WckjOP*8cH`5r!07Lz^T_CILup$JwihGg7`~{ zb#Eyt5aF#g20Zd*!__y!>%MKI{4E*yt7A-rMnDQfBa7vmAeaTQp-Mb@N z^aC-*hexJ{(Ew!K<(AZAor^?rje@e$BIoymCG*cYS_3KgQmU~k@6-$ z39K%o)%;t8#h0p|p#p6`wVrSJ$Qh!0r?wb z5@hxW54c^*#FVa~beZVE{_88J$T{*hi;64lz<5SCb~-`r(hQAX$}GO6`rhqe!*81} zKkgk2BXzLkb~!#HCQ4n{0p0T$D1(;-H*;m0kMq%=-LAxK2kqLyqYU~FzbRt=2U`!+ zfslD)*6h-U8+G$I)Ol_kz_~l5=-XS~dsP^ZZGA=us7rnICGNon5=jum0N;j~)3A80 zC0YF>9_x5yY3D!WuSf}Bj&%fDO zwZw2qjU#BD)L;&v?joyeVg9FU7w*FJTeL^*W3hT-EEVHwhKUQ)&dm= z{C&bIVO?c?oIXY8!ICr=Kyb<&-MwoW6nx)nolF(jFt31)PMuyc&Ya@u6$8z`!F%5AbBx z2S;f$vn&SZagIp9WI zw}GcI)9Tp%9hClPr`oMwqlU!|M(M93Fi)d0UHo^!?r%&*J0N9#hliD6{;)JDvQ=sx zpblFs14?2p@na3+I%kbbNo_Ng8L<&B102Izx6<1FwXJi4iVafP!#>-uK0ejD+SwK7 zO;Xhgie6wuZ>~glsU)R0dX?{&r;iOHAbefNzG`~`zZFBO;dX*sIdcT%a;RAZ-N@mA z-33(f7G$4m2mNP(!KS&h^MU5r9UubDk>bP$laGeiOm2Gq)gM90_#;s^#0|+cxZ5;W zEc;J_jolrz2JKpF7@HzTQ*6V=7f zdK+T(mvra5_T^G$ykntuX!LOCa+4oxMk&TEkiq9t|05Rhx3~7MEy(l* zvcAw|8pR!En+)W7Y>8j7N9TaGNn9s@NB*L?_5|1IX;*aL!0Sj?(La&-hAs@R2muE9 zCCo1+Al+8$Dq!?{NZM#a#_3_P=qM$>1S6KmB;moUaJqOPp~@my%em)pq-<70MOP+J-;&NXC^qy`bOyErD)D z#9wl(_H#u&b>yO?dGmPX)b(g1$aL({f!Z(J^T)LVt1kRw)~qN@<;#|yu~xHY;%yBB zR$fbjz1K$Dx%?Sr;l}C0{^nnzEbz1)8cRNWv5dgKD=DB--bxY!<(V&i2SG-R|8=|n z+eo~lq?hT~)uYm2S?)PiEQS<=^ahY8{h<0TSynea-(qyxAm(hzo88{PyVSY+9<~*d znbmRav29(OWtpsRitJuCojC!JQ3rApCi;apzQ#|n37(fVK&|p8NV4_t+%ryW3{^YFl_sg9Q;|I}$=1 zm?GGT`R$4??Qc-)pARlAB#dCzM4TiD!Uo0~nf;pD>hWpW9-pc~TsmRjLDH4OVZ8Z6 z5p?mzolz!b9WA;mferas$i$(li~;IzL${tm7WOekHoK_7Go&|N zSTtjJ!g&qFksT0r7!*Q~zhCC^LKv^BZyBaA#3z&e*m`e^;Y%$lR=05)-9R4>SSu{{ z2#8;PFpvnD%txRH^(CXfqHHQ(y*18+)N@uCE^^TPrmvHWPq^4Q)1`iG)JAFgW8hlI z`jj_#m?8QF{C~XKp(&#U`>prP$%EC{rcEtJyC+-5Vol^Dp}JXHDof=HH{rfHJ@r*3 zj+jQ>%Rw3n>D`UHQ;95J$_VmJETfu5t1E#0hM{tMyghSw6yLK+;B{k^Bd?1tZ-iji0yP0U2(8Gy!g01VG zDN+ChPp0X2%&eE)tky{jiMH*R?+<+8&KTNzzmW$n1@Ai*_2UcEn7_yD1?_`Y8TAFC z{__^{gGNSze3Vs0s_q$EM2*YYCe=8JN@>s*6MOk`annR5>tLK&F*`uJdgi5y?HUJ$YZxfW3%lzk=&M~vsCoJ zX76KLm+=UAe+-;G3!1GHCj6k?D&wd$T;{UbBA6Dr<10LVCalgx9-R2L(m_Jwdvo2)68^WV3bBZCR%(!|c(npcveYEi(GxwfjHFN>SI|(7t z6QtRai5QkYoiYfc8O`>jLh`u!cyM}oNyb(Qyh|XMgQlgU#MS@NtLbcgd& zv7s-Daz`pggGlWsE$p8=>IM88h&1^r{_&{B{5y(iQuv4rU02KedQar}2g4&>9&4Qq zR7LQJ2H7M0O}KU^8OXhqJ5WjJHj;_z$O`3>Dh9NMS*N+@lE6iU1?hT>^v%$+?=|M5 zC}S9CmD$|pAH0$uG!-L+Gw8@RGRxMsYvyd(KrE|6MSGCgER-~k;C;W$Ns;Bf){^`+ zoj*dklVBk5mgYvGU#q!O(hz6k zNEe1gQE~KLXR5fbA|uI1g~%Wa6Ee--Yyao%&Ga}v>7`8g?jeSK5l<Ng5-%YR0p|NI(OPB?9Etm zmr{Y+0y7T{Q1GDzW&DMHHsJd;J`V>1GaVeEb<8LRvVCcaP2mEaWb5;~Nb4-`Q}EJX ztozUX8{IBK77hBrmNu?nA(0AVeH%+4&}c>ydUmT30;61cg@jh2RLp}m;@K1ZIn<7X z?GR$Mi%r+X6@K45$l`_R(GJSq(W#qwb9mx$lWBWaG-SQm{ z$$v03y=>GFWGZ88K~fVJyf@JzOc}U4L5&!2;pQEBo&=YpD2d!eX5~Dja@>Tf)LrHT zy09@)NRldEpF~;q#R)BjQ?uApWrd=M1Ch^_TB;g$JSC>`>2Yd^{fR zo{y95ZHYTiDOdl9>@*#8WH`>ogpQUJ&cibF=$LVY#AyZ1QyZkf!#kLr%+ht~0vHig z8Z*}x-z~x$+->9c|LDO_N8xup90GF+;zF<`hkqhiH0Lo)z812{h21*$$`e$Y1w~#^ zw}-vE%jmRsh7K)2P-dmS)82eBtu!CX? zoA`)5!nJS9yA{j_DjjPbd?8nDO#G9>p7-|5JU_Boc&|O8_XqY-f1V8!FNc=d=!6ju zYee|h;>tBzy(GGm3v_-5pudfdl*;3f<7Ko|?`0$;moCZ<)&OK00i4mZ*4mb8s9r*< z-!~itIxYxuzx;I+MYP&p?U4nBmW?P7JVX(Z8_TD*aW#o|<39BxVJL2cUOg`r97A)O zWUCx`TyOI#vd|$i90Y8X?pIQ&Y9sc=x)XJSn-%^EYx+U2#QN>VfU$3f-`JLWOMFKA zYM_Glek}HgL#Ty6l|2^xEYO`$e*+1$}h2H@h0>RwnM0N2^r^ zqX>*xWWoj}rxy1>`-Mc!mT|k%GFF2YzMjW?&V76E(X07BSlR9=!!${~#=s{YGkn>> zCpfBPJqV)fJ&o6oGRLu5T&!Raio@V?{j=reF4nt!&(cH_7-KA6HHQA4$X<``30|s- zG-R}$E_gC9Mm|JW1vpZ!LdKp_i@s5RW3P^$%X?p=20MhJlAh7y?vSS}KL z3{wr%{^?!I1bg>sb3KOv-NNzP$TNE=xtd59?T2Y@Z4sVz>nGpLz>S|@|Ki;LynT=c z^jZn9Vl4Pl-3~PIaw9< zu;IY=pfbwXu?iJWW^G7!#E+-e!y$EJEjftZ9ctnrJn)Y|0PGK^5xjj#k~zEt7%&C$ ztva_>x=e9n>+;5qr95r>N&@WoX$J|x@p?o42)mQO0COWWi?LjpGP^dSnGOaJEt$xm z;LWWFSk}Sm89YfS@rb_2zd6u9_x8Vh>y0Ti*`uTp7PyDr27ZM6HCsY`QLQz6mRsYj zmMZ%Zoichl_e6>xYl~}!r{D^l*`cS@5Qw$=NKBh;k#b-;VaIJao_i|AuWinF{6voC zjYAHxf81>@m_P4J%E z?e&q{hPbS{gAUDpxBX?U{7jaGJ;zlmn;F>-%Bld4FOO%DsE1AcH$+~dqt08-8L}zD zI!mfYiNCu!7zk@Wr+dP&AaKEuXtjnMPDPmMO{O_Yh2Aefn|ifLvpbI=8r=2Ld;zw1 z7ehi!nT7K+d6I-iW!MPXvIer#@#prf;pm1`jIRkhpPvvN!~c#@fBy}}CqK1nV~fuP zR3R1u>la8#KebzXt>H(&;``;^iB=6(e@ZJgQGbjbcm`>ky4MR>5+SHHM!nn)4SYqnq$5*s&A3S zx6?!z-@z|F5XN%-)djV~^?CEsNRZ8FB~iAjNu(cv$D zn&}^qr2QjFCY8H@r1O>3m%9By9@kICE!>nQ@WNk44u!&V1b0FsB`}h?Co+TpfOa8> zMD*Q_4D}Vo@VjZ%(2_ zu)3RS3>JAygB;)Eq=}=Xwv$Ums6w5LZnap;-T zxAf#4Txc3vajghIXn$Au81n=TIf1HiEh32gWR}D(Cvbj_jVXKGzNZ>I8coS=R%N6g zfdi6$w0#!69rBgTbQH&Z%3jBe+pd8aa=$L;sy~)Af1i4Yc15&%J-Bnf=Wx$NbN25H z_`e|%S2=t^t<3PDSoOO_;yuy+V)}8??jafZwz7lKq)4cgNfB<31udCaR&KdS;brB^ zsE^piA7)@>FH2R2Uq6<1e;~wjm@ZVGCeYZjy!~ppy5l<$*dA0jW3XJJt?n*M_gV*6 zXk7)R`4-u#wGI|>guVkHD%LPihQ+T-`|y#?^1GZ?oW8plC2)_QPP}NOAX8#!xxBD# z%*VI1J+6LVDX`6C|DAeq$}%@!z@W6qb`H1gzn}fr2Y+S?R74A;_EY2sZ^Qyd@Mk31 z47l*~9L55($`{>Wa-)@}UbL1n>DSA5uMHEc`S5}G%iNQ7%(b1S^RZN0pZ-ygruw^0 z53~E+tm8WS@_tYvsb*u$W+!9c8kI-E+wN}94MrrHWRDCOHwG^U|Xpelz-f- z{<1qd5#jrkT7V6OQu-a<_Q-V06lb>X1T=*6&qYkcrxyN7ms5jiw{m=J8&m?99 znIBliVZTW9bSX~m2=&%R!y|hu(W_8TKjjrX%E--^-&2LxZf+qx-9IY0E)Bb0ug#UI zerHl$0@kfFCZnutph%M;%rPxQ&Xs>TDsLL1OPIz{f0`4E(D!kPk#201zho>de&300 zXBoy!3+rv5HWnL-OP8Xjfxxef?hGYCIAc+hm|ee!DWi7f`3dPK_3w6ng$03?XW?oq zX7bX&q3qzySc*jm)7$e~AEW)ZpK8ge$4=p9)-vd`l_46;gu*1cr-o1jdHQpC+IW}a0Pr;aLb0aHRucK-5bO5P zS4^**!DO~B9kHbrG2aahGYedbXf`nLiMR3X?HYm3`7;txoA@6H;&&hW>+|Vr2-$;~ z@q+NF z^&*rq@t~Z++y>tP*jwGng*hEKEf`+*9K3Y1A8%Y{?Y7L2=JvGDVXyis+`0|`0W>|O zruP*`{yIZkjKmFCjK$5huh@fskQ9xX&koX~l@UGW($d&;Z1CwW;tG=fZpQwPGD3t( zpd7I9iT^?RZs*YE`FJI1$Uso1{dqDADk8Na^JvsaV|l0=z=j>XKn}al*VKCFeEcIG z2CJoa%k3UoT}LH!DHC`rBBCluGGYevJe&rpQ$TBkc2WO+j$Cxx?4 z7pb2{Gv=E)-Z--7hpJv)3-8>wkZq_=$ldZNcg;6aDF_H2WZ3$xQvUvk|K>C4SOq_Q z9wwl1-mr%C_2Uu(CjdN{OX2$OeDcgjQmJ%6>J}E?V_Kni%adDoY?cli8f{E?SW0fd zL23z@1w&GxCyoL)PA>?yHamv{5eu<$=*aAxpMN`hp_LoS zS!>x%jWdrhiTeF^4i;BUVv^u|IDmpnEZ-vz+U&)bgLmrlI@8F1`*MjP&_j42Y{4lF z=gU`w*n;1V3+0kde#oEoK}w+`CtZEK$2c8)FSV@vSR0*v-O^Z|eV)b_DyjyN>jHN` zAgTR^IR}kXOU0dc_A`QN4TKV*^nGC2!X)CT9ASSF?k4W~nK3~yo!s4NZQ&O6@yqjd;DK8Fc8 zy)|dY49;=iQf(Zjmrn!LM1G;xJ@BZ`W3yZqbv7l~llDU{+Vec_8BV9pRVeCEiO`vX zbB%zU0z@U1UHKM*Mc9IFPv}@+RUf~hN9D*|mcqUT<`^8`F2(ptldwd0fe&~^)RX-K z1ysUxi|71;OtJKbGk7V{*#q!;x4*etzsPX6$g0PGEO|43x-FpI*4f0=1m-6v(%%=Khkx41*P&61U~e?A|3q2(Zb=OqRDa@5my;!spq8VLQ3 z%2&xNM7DsL`OKCJe=v-$}Br5GL}z(OcfxvtQKe9a6Ozt zT(6RHQxh%%FOnIKx#`g$gio+A5CB zRi8ojD#6DlSJ59{FBCPP#zaN`*YrmXnxz|BadJY%GcTj)r+6l-$#y7Mnl>c`rX!=9A-(DU?5-LgY-mv)=6LHro zY6yv;sMr-wMt@IWbwllJ(ODz=s}AV+ z;egSB-`FcE1cyZt2g96OU^O- zhmX$T2PSe2_}#4D8zFlv<5@NuAz#~=ZrF&^&E9d!OiKt4ZJg0lAgAW^x3g&&-2S*w(70D>6WjM1;%_yN zKeC?}@DIF@jU#0S)9P<2oudm9LybNJB)q2V>XaPM3)PG333*1|toP*;CTlg1qE;S<`WQ)m=o)OZ?e*hwaj`<&%tVwPHm>oOhTD0x$2K9#h{Ew%wjgZV zI^&VCG43%S=cC0jA!iJ`ZtY3LQej{5e#34Q1S%;6iY<|HyT0Xg zYQ#N{T*CXNekN(XZZB@LU{* zsmEG4k%S7F66o)JQqVjB>b!?u#V9~yM{%^^<*AnA28fjH&s}=R1i6sPIYto3ISLWM zKYKq>f^xNyx;oUJs*I@6=737voQ17Sp`kbE&F^+`AHj8?#`^X$L`ynN-P4geEbs1g zfOvs2ug5=^n7$jiVf2+#SGOY87oN4csF){;jz@U3G?R8xc+9d4YRVk=AsVvj@|+KD zlrGvk%8whx;85&NNgUxB^CcR&q6$B@SKGYTIO)v3X;0e)L%do*#pc`7Es$X~j8{{c zm4f-3$hr30=+wC5_%9Xl*;-V<^_< z*&7)FLfh@oJVrzaf7aOk!nm{xkf5TyQcR+l)ZnQKQEL*_j1}w;4Cp6f?#36{B5NzT zO!0^0N5A@xHz$~qqv!l=mu^><4MWX*}M8bHR2%4zu?b70VxwbdXRlf4DG7HVUtLASJZM_Y-cV<~D&Kfzi+ztqCa^C2&4O`CQEW1ry zC$Fdf5AiG1h(5+W(!<-7wTBKhY|r;xgk5ceq`x&?LS--w?H|l!jS5kSkA?W?c6cv4 zcCtrcew4u*6Ow0lV@gXA(-Bp}>6+AOVUxRvt#TnYzy8`qZn_$>WmQ(v;QPUe=d=b0 zrdZDQQ+cHdAav7r>yE-}T51aZ$;05xvmsS?jXI$S!LSJyc2tEWlYND_|@nlrzQ)T;7!aCkEmLd=5OsG<;#L3`~*5M3wqLv*)l;#Cg!!;>YV;DFHpaXlo>Aj z!b!}o7RO1#Fyr_~$Y_5e%S>w?b~st6rVS}33(l1}MB|i~g}a$+ailaS^Q)C5z0Wt8 zU@c3IRC}88H*C|gex<`2IVhe{U&R4%4S*w^d0bq@#89+cBD1!U!4t1+-DIk&;&BGrVMl5o%S!lQ5MS|&ldm09C-N% z|9BVsyImFo5q7xS&85NN_$s1J%s-)j36f=aB#D7kDz}5NyWl*Y-T=udY5p9mQUL!6 z`I}8n)xQ@lA=s1j3z)v(vo)-pm2`fH(RBkA+P3E7ccT{-gk5zM>Ns{yr?RspAS@;E?b)zStF>s>HKpirYwn!&_f z2Ho;Xk>10%0*f3}P)xQRlZC8wt*sOVV~V{Axdh%NJTPODf!OU=0r zqvud$>ce76M6My>486PP3Tmr%QR+_! z3p!|~2M=YU&fze+pDk`03KU7=gVjKafV1h+bi<+wF=T#VilTIx05i!yrxM+o)N zE^gPqs02WwC4oagK?yugt#Kj9^Vcdr?lx=}hPv5(D`AVC=KOoqUNY8wgNq-%fa`d{f2Te0?p9idEeQp-Ui zq`rl!#S=fZeIjN_^>E~{ieQP)VxI+9ta!bw9?<)6zcBl_MtO1&!JGY5Aylm)iPPS% z)t-VIEKq;zDvkNDdfkNvk*N|z?oFwM1}oR!&An3XQad{lCsNEOfZehgKGx%iL%QKM&A*mNI3up^qR!5DY`h;W?ZPoxaE zkIK7Cc;8F&@0m5-_S_dvXBks3()#yYqs_~E?|8FE+Gw?`S6^4IV&#hy1axz&i_YSU z4DsJiB&|kX;G7`Kkl<#ODj6{Ju~ct{cL!?V%L6`SFu-01T>;{ zq|lYhZjx6< z5b+#MHEc1P#~Zl@TZUNAd7Fa4y)gM$&3(VHv-Er8BGIvffPSE#k_P!Jk)zrrP80KE z0Uz4eyUbxNMzo)~T@CE?8vZF^f`8zNBhqwB_d~Ko~v`WHEEe+f>dEpz7vj}5Gr_ye< z%{R+&faEekWm!jldci}2po)_D^-&HPq^%sF4Sye4e)*&mJ9D?j5&CjXq_i6fnswy0xsZ#GoK%yaX9oSuE+nFB zEK;7DZ%e0f*hcc4RG3Nt7zNzPdM=|A(-z42rAWmIeYL zcyNLTg1fr~cOBf_-5nBwLvZ&58Qk511=qpdgFC^$oqNAq=gqlQ=l)}+ri$9NAL-Sr zyBBVS9UCeN6RLJ&eapCeWS9zEB39{1Mrm#*kGXv0&SmJH8^xw`>Du&lARwh2c~aj> zQ?nGfXsvg+`KwcOQp|B4r9v>~;Fe1g@3QOT6D6C}^5!eALx*TXkC*%n)-#Omo;- z^t*Ukv+SZGNwZi36gEHZby@(mZq%g%m?IQo+nlrNY=A~d5^r*TwCI|u$6LMS2uLn5 zfzFkLFl-;HRu>{-&!e=xt1Z&7ZvDV6k&6OD;Dz8L8}`eE?^#fzq9K5yisNkTAISZt zd^HUTRM6`Y8&qpzl&DZ*BE|Mc|4)`7CU90#Ezb5@P1|9B>QrY+21oB>p;}-@f6K``mJQE;y5|8wQO|Y+d&NGz|giY|Rg~ z%XHGAJ@W+;R0dSuo!Bs5M5k{;L5m4U6E%W?qKvdDFkY}!eij%f_opknWi4Bif<9Xl zs(!mnMH#9yhgnfq(Pldw<+E^3_pycA-wrHt^ut8LS&u7_bVTl|hY2QWV^j_Z-M0IZ zm@SImyM31lFr5gc_@68QcYc_EY~mnxQqtRO-WR7PwvjBCp$J{f1i|Zo(fOxksG0W5 z%{|;rK=ndKUr}hG%Rw|9JJz#eutxCR_G}vl_3VKVfrZ%Uc>CNRa&E?c>jc-%OvH75+|P#zxd`xH5aQ(rA)l{w zdVTlacNf=4a}D{n*(7P3N8m^vOsD-!5!^ChT%%qSxknJ-PH& z{90szIwOk%oh9my1zYY$(17dRXv`Xe!&Vw;RK5#`p4ea#uKiqk=|MpT2C19@Ix` z7?`Lhr?(eSaE&mDMnnJ_BfWjl)aXR4jSx5stO7gLpNML-3Rk9l>xplMzKL^yg3k7wH*7ZnRPV=e4O#a2Hw$e3Eurvk<>nd+Tq{Z_$3q9mKX;W%8h z+kWw?#VTvSjoS*Fc|+Hux-7 z#VI^j?5LBsMT2Y=ndadz_quw_%5mTbo%%^d$wuyi178^;b+?XhNQ^opM{!u6n!aP{ zYTsjwwOOb0w02yzx;yE+rA=GUjlEGT_Wmh3EdLW6ER5X%?y(s^2|I3F6;%`E-obBvhVB}*IIXx_sVvaPw>Q#L4z=Q%tJPDZ41%ZoH|MYuYS z&aY%Kw}GWao;_rwz5J0}F9O(ULrn*~mB^U0tZpo@wCgD(pX z8KQKO(0krciTs%5occ!Hz++WUFcdop$(mpDe9&2J+grKRzJ4t_R8EZ(cS(8pLfw$9kPGCPftvk@Oj7D#1;?hX}!xuC`#GwyVaD}=RkqtI9q9+ z`kS2^W`={y-EgXgke<5~Z;5z62vH{XNrnSZghz(!T=rh8W!y@r&|V2@5GjIeOIA9i ztsY&Z@IyGE!MQ59Ix{8pCN^(kpF1VWo@7%VbzdiE>ljBHEqrIRO^{&0w!GmKV?O-t z3y=^S-40yyZDm%Fv!^g_IsfHN- z6Uo#C$XsmLf^Ll1BI32QCO$K994leA<4+b^)uhjAvj38G6DRy7`G=t3voL8G&^{Wb zbzEd>#mQ7t;uh}>Ng`7svW+!)Aa5_$+;42^Y{EjT=jONw-MG&0W8s79I4geJ^rYHa z^+;~Ed8CHY_;{`XpS9J=@($?bm}e!%b`;{d3kd|8bf|>Dgfl!n#Ki}l~0oOspCNC+HXx^kq>d zn&Vo);J2JOQVY7j_TVcM?AQGlB;MTmerUQ;0=UDyiz$oZHf;a+bEk02?t)f(I zFGX~bbGm>7=4vqKs1-(-&Mw-}$T2P|2AUeVP!GU8UE#ZMv&w(Y(%6xxZUXau3#u2d zFw?_Sn!FjKxAWGVRE&9u*rM=FUw6{)wKcOPO!$%by%@JBqc{GjDomZoKbr z;#E()p9+8T{B;~1VZxx^o^5_<$*1hSt26e;VVBPZ#G+pqKfgI```tYP(WI8wsHehS zPmVoFY*q?KxM7dj{h?!FGB^F?EVTUPN6F?D&60A;;A%U|2rmnX;`6t`d>e&_Nj2oK zpK6VM&nUGMOwk4z;$h&ET!VA|*wY4*V3INI=*W|_NP@8?^Q@jl>V0%*a|=DZj*nCa z#HVZ;lYssq&%0!8S)+FQ0YA3jBS@Z8D#GOGC(ALWp-J7OuU4`5%@_{hOTBekf`rpD zMS>EgLMfVG5p)9DSoiWY;$$0Tps4tIhD>3>L*RrBKxkG@;K-9nlOWNzx z??Of68Gnun7j)ZBDTV0&Emn^hU=waj=c)6MSW5pP}T)<`KyAE}O1! zvq*N%D2?4~)L#SoKEq`92Uw_8Pb_$tky^atjV@%66=25HGHxCz?l#j*{h$pJog>AbJn^I}mhyOJ91u`3z*N@33N zluG$godZT$gii7vBiE3_59lGTxVT9T0zD?ld@L%4;pC6|RXh%gez0jV$f{KqGSIZ5 zGvNpOJuFTL{5~KgoE+6)KyBJe`Ruu?9!@52c(2?H6gKqUYL&6%f*MvtD3!6KAP*`x zqxSoz=uJ{=@nWu^d@FsIfTi=^2l27wh@HQv4yDY`t_Ou`=;$FuwgY9Dh*9B)I+vyVKa(uI?V`5u#9{Kc?BfoZ z0Ozh6ZHPZQN~w|?fZuTj)O?(S5K07^#{w)(3H#dD3;$Zb|Bz_>_xF?-&{{sp6c#L! zZ!!?{TR#Lp^y)##&57-EUcE#0(v8CEHH($Nw(?%3(UhOYZ0z)Cb+MS&Wwyvs32f>$ zwm!;fvFZ<&rfIt|z6(g&1iJibJzpi*oaN+T4k{jc74elB8C4qn+fad~^x0~TA{+Wa z^qw8=Kv8iUi)pTuF^Lbwm#d3sQSrL_ez2olS*yd#wnAA)$@D7!)j2;6>0#Br3Oc{d zNC_g8pzE-$OXLvF`!e2!sU!6+)D0W7MDDzR%^$z#xQ5XiH7 z*Rk?6-IgjM9i$ncg9}C*`l7M>7BGTJ$1KlXfo8iZACY zd3LHw5m%x&h0YsxF5eu{yi5kMxM*|D#Zk?PQ(`0F{OjxyH<)lwzH-lO97Y>Mp4^h} zc>lQz0~Ccb%G9EYM6>uI;uk&6Og`NP)=tH5KwN9n(SSCOa{yw8c0)#OUtH~o0i8y5 z%_+7%L&+#zFdGj_~_Rv)z-8$2kJ4C6r@r_7Z16S!3X+F6wwvOHIAuK zMO8pO{{h6zfD)~6+S`sQiA&um@gLt>ZsD7jhDu{lxd+zx*#fW2u{4}HHAcz+M>(qQ zjp9;d2x_U7&%w=UOevepQu151yo$aeKoBVPb0B*Ko$e!w)JQ&WNpa738Rq5f>DW2s zh7Q{8vp3*e!Qe{|;Y3ebeMk~Wb+YYfe`k4Bg0s-N)1vggwm)yoM{&~Tp$Jtf?)e+{ zmHB!$(`mQ0Qv~nz1-?@x;syYb9Q)$yxt|79O*5`<2&0eN>h265e5G{bS?ffD|7L;v z!vYKCueih+VDvJ8iKAC!V^2?Vk9VScjt6LkxrQ|ad^!6A!vU6!UaG9Dutn_mB~T!O zdRIY^(pFIajG}gOba9v==uHNe$IwS<8tzlYT7VEG#?%zNSZVjXFB)|g(hHmRXNTy1 zw2*R{GxR}T6e%MUG3elK7!u?WO9gMLVVj{2c6KWA;F0S-T$#ZyZ6#lQ{RQjlG-SMA zD!@sy;_HBhdap$D?6`|FlGq%fGX_D=DP8w9P8^rYCAZHyh73Dz<13_@RB^2t%{8|y zS$~vd|H=$qji|x%pN~wb^>U0i?iB0EpUpYcX7cdA6PConwi+kf7fE|q?{>%e!xE+p zN_DR65}!K2&|;0m8(dVhRB`L`mj4FWBmZ!Fk6h=tHDd+{h)t5vHaBD*;b^}7sj%0KBPysc)va?6G;|vJrY0?w#d^N^ z{lBh+zsR8fszg#JU}yG4ZHUSVg5%Xw0%d1!^y0_L25p+-4d>q5O!${T7ng)$OHi^$ zhkH3y~h?4nd%&0CMm>qVi076Y1iin zJJARH>t!P1)0%b)_>P7DT#@h{3x=Dj0o6$Ir7*<-PEet~b&n{d-wN$RhG1x{?OR$2 zpwWx1CpD3V0S;*2ChDV}_sshe(_~y917flB5qdd3)>yKAuCLp;|2#cSB!oeEtS#;m z+pF%LaofLgIJU5zKr5HNLPLAMtFOBSxy4h#Knu(qG^dK4dN45)^rJ-3C9e&za%nnB zpaa$!v6U^q`3D&&uXt9+8QfB_HvB&6wQO5J&%yW;$lmyr(y{x~uU-|$mOY&Gy+TF$ zXXZ>P=A#B{CeH4c={3T>n1TE1jamDxMe4_hA|D2bNS5_sNT~$uv47zj{w^hV3=26MhE&vKK+Pv<~Rt`@U%rOE}MX`WlvFI#<xU0_ho|yaQ>T__BLao(KZCqhU$zR=HAaCR zI3YvGbi?R-dV$K`OwQOx-|yJsxb24mxHf;2$IQPP^}s2~o0U9rA#LG6sQ6rrkmF;X_eL^ETN?k(Pl0Mg zwS@5ZI!emQB~(k{CeKBP-)n2jc<825gztjsb^Vql&?~)nR=G$lUc6s3+6c_!Xham= zIbNlJzkm)kHUw90E@)Z@F{iqZlt#-V~^cLpnOzKdQ-1CmEM{mgj@h& z!iYm)e93?9(3VEfuDKIe%eY9FyN^6yj0#X}0hZEN9HBC%$+WKMmAXjx7LfK=_{T*J z2>fRTXBbK_V*NVN0q<_uSJyXyEXARkee^ImS+IaHLAtrITs!mW;A2G3uIj7kzXrXb?(6~T2CV=cdT6kzvl}P zXdt3@zN5lfV-@IZh#e2YX_6m-O^H>Q2W=uj-Z9pSjCB&jcc(P0alj0XAA^(pHcP$I zO+_NS3p?7;ujAeQTEud*R5v6X{Cd;%Q>1Ebs_39|%HBKv+Xnjgk6oSQxo)XSic|4B zfSs7_t&_}sCXV3^zfhnw{7x6meL-rOY-u;Vcr((c-WPCdOX*a+2S2i&r#YyV{<@K%j1|Ytfzb+8Jt7u_fZ2Wu&J^P|<1H*T|lu)%EMTQ)qW2TU{)DjA* zSJ~5QLEM_~u|Y3AnD9AzrB!DA7FOKKF4?IZus?s_OUZ3~Z~fyZRlt<(Aeuf8F6{|u zva)~1C5jRH*pw;#K=e}?!oFK6Y9o5M`6BrVST%N}4=CGAMVx-_dSI3P-y$B`ATvcW-vLm|%!&8!EM?{6K9(&aD?U$LBF3bWDm9 z-?lYGzk{RcMlM=7h_Q>V-NM@+!ZygYiZoU2eCv@#4|jye<0-?XH-_O&**8bwn&*Ct zabB9P>MZK|)8^+H*3IP($hB*ruw~jt9+7tc7a(sTESjgX^Q8-;nx@*HeZT=T>DL<3Z?h-Iq zHQAJMQ-ts&a_U*p!ihDtY*hBNtQ)FrXFd3p?Y_8b9?aj1pyMG;L z|9qDJ{yT_^DmUDv1E%Pmnizb7vHKpUU)-!LZ(}I)2M!#)Qy}MtOoMn!O6ZU1agAr` z)TgXMSSv&UYsPc5TcY3@u}@kGsRSU*h}dFAMdN%00G)7T&j=QQIgaY>gViDv6CT=k z$0zs(qXVO6&y$pL^{+Gej!jHPa|6GGvLnPTa5Frc&yxZXbPPI8v{M6iEf_p+a7TAJ zvA-G@c7$WeuoxgcjoN(L{E-lQqNfbYx7BpEyYNR88Trxg$^G96OGOx7_{C>Ol9M)1 zTytUr(%VvW!pj}n$Gc!6u%vjx2gN48G#pvXqlm%w>H&X=Jrzdj(&E%pN&k8R0kU;j ziZ8dijXdInG;a3S^S1;}fH13!&NF~mgSRuerBD#yabU6#GCu9Mkrj=E)Hk{spTo=4`ctX#%hp}51h$P-G}qYJ9f?NIt$ z5-v4F=uYk@U3RYu-*WI{;_%~f6JMhw^KtPqmzcu=5Ob~~uqg~VGwxdUsGB&tvG|d+ z^OXxd?1A868~ zdc3m#a<1+pkq*x)evq8xYf7f^?n0lIYCvFO5^O^*PAlZM-nZ)~-kLkLa4 zm%otBzn4f*4Had-#=zJSgZD1kc;xKmi1~7#OE)^Wtrcm7mv%{O3^-ItYp=+FuodsD zN|ps3>~~VQFz6zH^uPs|FC2VBz}g~9aq48GY9L!SeF#aaVnMeBhsHTx!0Y6>jk@vmp{!?3s?AI_HFQr(~)Nxnu{V` z@8d1DF_7#8P%UJoKY3c1M#}$s7AS-$9hhoOh)j zTy~3}Z*FelLiHa~rH}^_qI~7PfA}FL!A~q15FoU;xcC+|baHAc*pN9aCT8QV&R_6C z+t1Ih(vIovo3sB+-9#%iwTbdDs!ai*HG18V@HIGzbU0hM8y4(%dKU(oNSUeARlrWdp-|fB?Eq zrgqjOg==#nHf1ZwVOF+HengOD)Fi!l$+?NO+{t-v`W0CWeSdCPMC0;Oq%}I2@uiY= z`R;Co5@(FTBhNxnZMU*{)|N-vE2_`w*Qq!wEn{g3vJ1Mtr#TBy8>D5}*{6*h_d?vK zL>7{(Sa2Q&=KifY2k76(^OfcC-re~wHQ4rs^65UAWQ1CpBGx?xbYD) z)*egQdNh%yfei%(g_50tj*e}k#9zSY#@04Dr+K5FpxSnUmD`Mf*0cTLq;(Rq5T2b) z%uR^8{2{jJ%NHeGUE5fp%d2T_*FMC@%^|vKzX4SK^WR&ZXF>3eL#?YJ1H?WvH_Er5 z+w(!HoZb_?R%VYA-J`ELqr<~J@?0yQr4uNP933Yb+K+NSo&6+_&CSn;VN5|foUI7K zDXOWhMGqIVC2{p37k$_Ed>D6nN&c^@k}wQ*rcKm_j(0nGbapSa)7$4II&@oK)|Z-a zOitErtn?{9SoC8WxgRGq%Ht_9v!Hw41m%kO~ftZuuUVm5enw;~mI+UNtdTQHzqu2%?Ky{G2&_&nLpM;ohH z%a!qiW|hk}(%>%)-(`tD(U*|udT3o2RVcy#hblV?Ah4^by{y(RYi%Chv?wG=aA4WX zJNf)Z@xgIl+>E;Td_8O&vFNfZBU$AXIhjmObJhLDudBP$!H)WzFt`LDIInIkRK=+g(kJ4O-BV#_ z=jmp~V_LDF3@644bfWK6|4D6pU=~CuE+~l*=M(2%oSFIXW5#X1)(5RnAuHnk-a9cR zWofJBRxoEA)%Y-(f%~{_`fR@-HeVYykAs8b_tU9=s8FP^T3?Qc6CWtZ%FT_#+Q#O5 zny#Wt1s#lojh)t{MiLuFS30o8LIwFXU9<(vld7HbI$5xY`|6i2Xos&}t{;u7?+Hyo zLE*WxlTz(CNw&SWw{$p~$%C1q=S>sCdm+{KI7Ig|ZVrTQ8_V5#a9F%$?c&0wUa4)C z4{Cg)c8v$Q1KsMxHs{x1goK1NslZnA@bCb$-L#cJTg z=Q(KeXXP_E)7P(Wmh5Z&3}_y1XH*q8zKWu<{{=;63R|%_9@_rh%WJ65lfaG013Bj-1$=-?= zFy1}&jH0jw+ylUG?t?9?c>wClj6BqR1 zDpo{^jOhWtfI4-v8c&wtV@c}-I}OGz$ZLd#P2-t4FdZ^CFJGrP!%^?Q19kHI$i6J@ zrwVq~>()&b>ap6x^%JHe34o}lG}LEgEUm<4K6G;hGF8(u68(if#Kp124ofyMK{HrW zlF|4SO#TEN$4q<-;LrR4_?P7PnI|U!+Yty%-o(ddIS8l9 zwuG56zc>>9>2 zeG{bn0dg}DxSmn1mii1n^*Z$#ovc^x%|56Df1J2&KlR%U1RGCPg$aO^z%UCH6^z9_ zr4f3V(rE)tdStqKD4k*2ka|#GLuay|=S`Z$SGf;Wn^iqx#rJ;v7iT@c`?)%;K2FPa z+;BYpiVYB38Ov&TNuW~f=OE+PYchN+iG5}dybI3Pz^M{zI7is=ulgt~ysu_a&N!4AHZ&gd$iwot1V!}WiEB4!$ z0gVQB8NrT2+I809GQHg08-s!P)RyJ1Mc)}eZ!jOHSE#yt!~LThJoJrTSUn&K1eRl- zYmDOaTjX%rXaXKHK%0s|M93&p(xs%Q{wEk<6J!3|l4+4Mbb|5aqkweg?{eu>Uq{sJ zM}K^Q!o0}_n$OPRVMh+(L)TluyjK+|ht|0qsGZ!WfHtT= zb49B!%OV9U`4th%z6(3qzbo{yp|b{%>-wribyc}mAa>E7e}pBO3TQ34u=1s!!ryQQ(K0=R#q_FtA-mAD}`KLoHZiSEx4dp|Uo=kk1cE=*ls z>p#CHg5L;om?57a4vk>Un1wwO{M{rArWpMZB)K|mu7g4+$}=1pXcPX(-vW3gp>D-1=|guf$6r4(KXb|LpLw|CzPA}O+-vxVOe{OnqN z{KDsQ+Pru4lMMe|EJoAK%3iIzHbae_2g^8V_HkefCqJ9oEo>grV=W^P@&PC*gUzR*r!ER13`;{p zCj06wY^yhfmhU0c*6U->2oOXPPTQ@D>p&?C3)mXcCI%m4gkngx0O>u06ITNwjR` z%Je)pLfmJRC9Q(Z%=i?SL=%Eu!SfV99Mz6%zC26vk`4?0_C3<%+go<=Ymd5QfUdTy zN9lr~tp=n#SqDwIjqdw7p zPxf`NfP+hTd3yR`c=1e3_{&9K?E@8n6yqUmQxdW2W z*woUjcDCKM$xz#E1Mj@yx8q{&i)pJ3Uz5vY_Z#T0 zZ$suiKZPT4bG((7nHm_9zrL>RxYX+4z!I&@inFNK?$z17fMJrWZnxb-Nl(bOw<1}q zntB*SA*d9~C1AE?s(UejrVXTjVqNOirwwqlo4WhF*dmf-T0NKqi#H6BOkilu(VOdE zZeP59+=#Av2`Jx4%K>-ILPB^sO$ZNwM#X)tV$B@36^wD&r(VKSU*c3K0`335$^P-o zRX#LOWm3{UK&(+Vu`v4FSQ@QcPJH|(sY!UCWW0Z1?)obZxRCz-eqL@KuOTd1teNlx zS|~cheNE^j6nu6^t|_*0{^6qHP7lY7%MsXgM>{F{&V~tg9dwOTn%B6@SbLMzCjIk# zr)^tZd&terFoyOsH)}qp0ygjARhA7~-H)w3R=kRq)hy$D$=+VER`HX{rm_6dz@S&h zw;H-e(fAxSbk|`IH0kRKt(s#sXaZMXZ5$`Xaho6L6siWSe4r{a;38^JyQTOVJU&$==B_gxhxQ#4uk$`! zqJu0Zs(A)pa}0L-Wiy|vqhEonN^Evh-=tA{U^re4!i>RO=+d3D+7toK7Kto zp`1C&wRTpfxfFvi9t&$O*yllwiGMh^KwdJ{kXxL?iCH%GlF6^sNSh{ia4_ys(6J4D zE{Ow`l9&+1l$iZOx?G9oI^ahLh<|!@B2&vmtZ7q(Y`0^kLEtW5W5r}!=OF1&?d>e3 z&BZsa;8Rkc@>`d5j&^qLq&R)j`iIHCFY9$&I;FzYlUx; zc-2*^R!Uz(oq-(Q+8n=z)X^w9RHa)v&8p`fF1~A4&%O9H$FRRk0nzZQAEgwm?mj5N z@7@3#cENVb&}P)`9uo3|P`>PsrW??A5noB%42A}1Zb07Mbmn&OEvbhu4fG4tjn!v! zk%@AFM>v^it_G9y@PAe;-G$eewq!6cHgwu{E)kk|aq#W>+#;V$8|=zicNcMzLNFr!aZoVGK-D!o1@< zZLRziArB{Bq1!xVJp_k+hBc2~H1l3`%+b&_LwL9#R~RW}&|ZX_v_{3};}P({4#KYtfC+6;^B%i~4T)a@@z@G=BKkbFh|9y}jAE z;APY;(E#MVMW#{XihIWQ@81`K;gF6BGaMQU@1OEQiCt6FNrxGn4dB*~Xy!4LTx&>W z*VS^DC=Q0RJeD^|?e@m9;B@@A){juH-5N+0X1OHBsz1dF%--N`dxZrm3(JwtyKGNH zxX_`Nokrssp&=@a;=GBfrO!P9euhn|V|={S*oaR4WvNO-zq<9LW62)#Z0L|Z(@=81 zy?lq;=M&UaQm`wuvDWG1-6hes9W@?K7goFTP7R_ia#$prJx4QSQ_Sa@V{YCiIB@b6 z)m;7ItaL&l=fRe;``u~4DLxeO)+}Pvh`%jOF_#FGv%P&x7HL>RT&B^l7jiTqTU^8{ zf&KMQ1(I(9XCjNDtgR&1|vQ*;_? z%}4P=Ll%e!aO|t&A{|`6zN&%}kz}l#yxd^p=U16X$)fNDFuRLxm1*Gf^mri^d4Dji$d8E)||4V)dLv`D9#4HDG4j8r80i zoE>Ivwz0~V5t*Fox6Hh6udfAWbln@bI!SYtPBM=Txz>J8>*#G5x%mz)r!E^^4M$=- z$w}Aja>(P*cqs#?nj_mtVbZ9roNW$`)FH=5x@-J$*Zm zsVMl1v7pIUA)Q~Ev1mX?9y*6RXVd#WZ}ycbLYa3WA?WsSc9a)ks(0mjqQei)uh7eY zIN*^5z^3IZ@0G4Y@4EPX!g3nZaYwe`ihaip&coHT;&D|E+N~Kd8n57qy1886^}LVMa)NY8ql)T{_j8_qOCGMY zHn!$cQcxheGt{@Z9WGid3fk9|f17(a?X(!K%W{XYb+Uld*C(g;3d!bkKQn~)fKIhQ z*eA_Spf`mzRH(P4neg^A;BA zy`@a2Uw=V2XTp@>r0b238zS0Hh z$|}W3V0t8eLf}c18jU!|3xq^e=lEah7yd*DyGS{wsnJ%yxLz8sS#Ey~pY)1R2BZRx zV9042U13{7NyOY0>eTSR>ZKZ#;wg2_X(hUBvbi`Dd!J}9C zC_$W+z$=^CSBI!s>wACNYDC#V&7Xkl$tASBJ$cBkS6nASW>?N6T7IQKLpI z3AQC$e~wDa&+!_u)!ZC6R^CbC*vVdCsbZmnyJ&NM!EjBiRJT69{zyZQVyg7umZTFe zpI-iC7o$>`d8fqn^wpeFmLjQ)N8?t{J`7-MvCInY&@r^xdKm zcG%=-NxyUNs5H~f;aggM-=_=8*7TuCq1FYvRJ7xvKH>+O!9GFPZ}LZ& zP{o#NRH_gcjRYdw%vJ25mc$~_n-U4f3x9^HOboB2OHm~q=G#$`X}&*M@o54w_L@^* zs$jU>u_k`6ze2;SGAZktJvy>ooBf`mw~Lx><^15g`>V(bA3@?Bv4LS(VD9?_2 z0-j3wqENXnq?Vej5;j)v_sL^DNq|m=#qFw3CDHpXta1f`9jxv)t=SrJ*~9mt>g%ex zGy2+dt|CQq`W{(Co)aP`v-e#&FJ;&KwrTIu8q{O*UG_%nO=5WZC8F`ox-z5C;U|R< ziTzI7(K*%D554xXP6Ky!96GFU4V=UKHP$-PFOqD2Hhn>Uw|P>Y<{UoyxO#_UiOtaB zc53biF)-9M)F+)Qt!P;+^uJDmzE-c)U+MV0iA2C=9<@^0u~Os&T@E~bbccZg_Xg~P zlzkcZ1Wa_{w;9*pP4U8UXoA1H=7RjAaOKC6_~;y2a~WeT$2p-qC1W0ct{4S5Ldyg> zKpPl%?O^LrHO|Sxk;IY+tr8hIZD+AN<$r3CuRC>8vzxEVlh0)C?gv*E4WTsFbj?_6 z-#*>0>^&7#c7YXTMWOTq)fY1yI*eR)N8B_tV)XEr_L^exc_jt{u5>+-|8*m-&uKvQ zpn`{za1bRZLVx_y3eplu1~2t#IL{|O{AMS1(q)*e!P_vaq-!`})!b%LevPoiiM2Ef z>C2WZS$p3tbI~}gWMtvn>VmTI5|R4{2mH`qM7fv3_=@IrNN%n9Q3ksip62%)uGFO< z}eZn+2lM_C(rKx*-~l_$&rjdIt4(>I#Cx{bsFf zilsf)Ki^qJejkD~7Ig*w@14=97WBhbehtDgl7d#Dnwh?rP!ZEqA6}l3X2F13&d6LB zuh^3QqF<=TT9}|Xf9PpzH>~Csr0AeyHay^PNkAsIYI4JvaN~G%#QP116rvey6lL>o z9=veCPom|`(OjZ3tsd*Kw>GUcSUc*X%cW;=uCWKdHDEL0E>Vaga{nar^i+`@-Qg3> zah!C7*(4L`{swiMQeh{c_Ivx*FS($SzB@C2lp%WS3WkG*@Y}S-<=(~HZ@dksgU*i1 zzwWJ35`CXKq9#`J#wvwmhL|9B1gB$Na_aO9i}o(7Lsj+`ka}m!OCSv zWQKnS0aZnGP@eE&8p_($%QAP+s|9Pqeu?Jrp4;%nH4VBfbCqj`cH5LgHYO6WPO0b< z=%M2c-o&I>DI*Z)HCRnw)vBHI#Ke?WhZ4=jg7^CcsP5*b<}GwoN;^~EWy_rsDBWkZ zEEeETJ00ebB;XQZ^Lx*)TMjEdZfAL&pUTSJ8gY+)@v z0JhnsLF@@OTerzEs3-ptuBk@Ba7o`;5N^y@zG~k^8z%)~k>l0BAp@n-wP-e++-h>T zmhC-68I@zGTI5e5&$&PYV*rnWPpx@l6lyfie@VaQu4|jwn!-5k9%KY<;pA;M)l`lB z)5x{ea5F)HSDM)>LeH@q?nIE!=Eimo8868W#(MRGlE>5iwfn^&6(4L=fpx_VO~9+w z8Uxf>!Ec>JyzY*-D*EtkaLabY1^<%;fd3?>bS&3gx5+6h(bP`+3Rx+ z(Rio{?CYx9D>V@PlDT1c0V`4jH8`qM_qMoYmI#y+@a&brZxzp1y&1fuy3VxDa?;Q= zxaxh#z)NX@tcmwEi3NHd2G0S)>G%V{7R&)1;N`?cpjtZE`mMm&UX&x)OB`^-vW6Qt zM@T?8mve|Gj@A$TZR9zF$K;FX{F?tmd3|Cj{gbJecAz%hP^0F)#s4pq)v(|k6&Yy0 z7J!8zGBP%aKP_Pjqb}KRf16;aRafZR!xgDHlWrSenBv2$TAaBpFDGPntWNSU{=Y?zX?M^~bzI=NuXyu<(hmQ@`|lfziBli+L3?idts= zK}+Yh@_iKu7n-&aZ!x~RJ4@^Vj7M-L8e^LIo^7zpj@vQ-^+R+ zKGN7dwed$vgH7qE_B0cS2RR?2k!34z3*L2$>${OE%;^i4!08MV{wDC7!{>WCEw?)a zljVqy_%sKpl5!2Vzk`Lv8=I={oA;S*LLEh|u%FhS-=8ZQDcq%;r9752*C}$Bd8BEj zq`w5l2!jbecXg@hL045I@#KOqND$oE>2eM?{;B|6&_q?g#z)thLvx_FZ)15 zSern7`nT=OBto45v6+o5r%FU;+^09{O|jT_jC@v2Xk=k zeXaFbYfEnWPagdv74%477u(`Fd_f*`Nr%J3JWGbZVt8Nt{n?9xoT`f&g<6hQ)paON z{uz?t%a%kv>h1%2WoFAzk6=8J`5TOpg9z<3b*)ZL&69D-r1x2Zq?Wp%Pv!AHqd86% zLxE>vA@vaqLG3-;%RZ}KmQ4nA=H81nZJpeI3qWjL`?F)qatX;W4#Fb-p4-MR{FB~s z**ZUK10yb0Ea1ygp*)bpyH~Eolz6q6L|;zh7txwRIV&sMJfc5lA6NYM0lSZJ^ObR@ z%*B{I~f!2Q`jV_AzQwj)cn-jn$+2?xDl^4t(cB9Fm%`sFb4zgLYT z{61F{%Ri6QT-eQBJJC9Az3S$@UoqV~$gEji;CZ#>y75$dTfUj8G50%JKntiDgo819 zaTr|8An6>lQJHb`!sSNDXR`lU+QtU5u7~2YUqeF99ZvVCeXPsz<)TFV+{9T;&xNnQ z_+`-bR$8mpAn)KwJzCdH4q6YR?4CINGuEVV4jCAw_Wq8`?w7rwi|SEL<2#`7k2kdf zmSjE34SI99E^M`~7n&`OEq(zE`AJD67HyCQmXEJs5V;wiyTbjSr(G}?0BS65$Iz4Z zSX4K^(g9i~%nL8VV-=hhZm5^bGwXe9DBYc+V~ zx$LSX3~DG}C5DG-*@D=sT5T>f{h@sjxL+;hQ}#?;;=JR%i72}!E5!(p{uUL|XD$Pi z1#)#bY^=~z(0bfg`2t9SvvPpi%y?ix?zRz&YC%b`j^m7t)r=Jf)TP6 zT)#_T?L4$?BK)Rqj!nA5yxuwly?bqHB+B^`=mq6El0b&^Zo`#PMNT*B6kK?H2EWEq z@;>kv2ca+%TtcjRXtP|l;~ngE@-*B2MCcl1^wWD^smIkUW_Y=*|KLq61BV1>E>7o) zIpp3fPrfwHHZ{QUy#|;Z}=G$anyj=FiZ9OVdt2@!EGU}H6qY?bB z2s!7_lT*TXS=jqvK+iQT*q%t0r>!>_Y+J?jyhZEiB6Fu>2E8k4z8|})oh+EiyP3bz zlcdu(FCb(5hX0qCj9imBW}RkTDmFm?=Ir?2I6HuS_@* zoH*&uf@|Kw;yLIJ^Fu+f9DTbrkn`x?;c<6_%&$v^R)_A`u=^(G|8~KyTF4od1~e1L zHIp04jzzbb#=+UM&`aoY`Uhfh;roTV8*ya9_(S%@4!>(Tn(R7d$d?|Um8*QcD?73# zVQfHH28GdMzCaAm8*1dqrOH*cn;h`hlQIgbT3UH{2uIwAxUK9RWWfs^6zG0-c-oK5 zyhsjn`&AmZ<%DwZ+FSc}k%Pd6%jYW?`}uVO-#lGts~aRai%b6$B~Z1wyHMg}kU$#A z08mFem|KMPVjiHkjdVwU;2{__6-%!!e_mLVr>#w0ulO?uIQw?^>bHIw4GQijPfblN zeR1L$kd=d(Ns^EqbhATP-^eh3Z~QGr4BA*n?G~3zL#Ts@G*S&2Q3{_v;>iPwTad{DsfF^ONx1k7`sQry#xkR zzakztBr+>W@GKbJ1)%oZ_Bq8z5aIqY`4)gTD?TWCpShM?Cvy^>lB|NNK;%s_0KJvoGaCsdC* z2rWuXe6vKnTmly3weJc#pAlsl&WntWwHfmwmK2DKqW4QA*}KxnlBqB6szjr`s6=#) zstj>{%ixi0iIN&?t;uq0>37SQa5iC)aB;E{H7w_6w(^=0$`V++3=7g$Pv{ZQD~~Sg zT6rz(@iZLe%~F}yl;b6@X_qM6Y~YORQU9(?y;uL*A}P_I8oTT$oHgj{acA98OR<%@ zU~Az`0ykccz}r;Y`PIg6Y$bMv`0=aQK1sF>^7d<2?qlyhulqRsvo^p7#@b3{jepCk%)OM04*> z7Ew?UR(fI9vtiDdz!#>yd{H6~y=r+!7vrp| zTlusbs4mpJmlto>*oEYmc=;6nSU}IQoC;nmN*da6Xk&=~Z3efc@=Ew^4aM=)m*MdV zU1ZMWk=xRA{WV@WVCX$vESKYkz7yuBWCo1dw_*Z7(${M*`me7N9Lu?8PyaD&e2s5gu?@hSqexmxTT38|yX}aMc29u{ZWAv&91LSO zLV54k*jA;2oSUkfR4%6M8Hv`&OzWWx!}7J=lw(j=`TsbS@LDbCso3`4zX7+_$UaD8 z$ncND_&87III;CXE52L|UCeF_5=;lyc=+3sh&WFkB&y+*=db``&ZhCQ?&O$Q;$-Dy z@@eN(B!1yl1p2vh0g@5YjU&_(+Qk?vz>H21^$f6YScKVNlwsgaA47MZ_A$IB4pX6# z#}*Og6)Hgz#d^QeU6zb6`U)sXtR z@%myhD|%i-{9LzdZ%UP5*4R{AGj(Lw`(3!;F2knU2vtWt;hK=@D`jk#-^sM`Y5AA@pc3 z@Buoyb2`^xeRsDfI}?M!&({E0a>k%Ew=%I@@w>@(m+G!*Prv(q!HztY=Ltp|*y2~2 z>FJw`R)KxJ(53e8FKTmdat!H|%;k&#NCpw1SeYlX0lc^L|513OD*>11ZRLJ6`JA=o ziO-n2sSm2W-dkj>j;OSn#6PW=+EXv!>3ABe(r7D{#HoXIB2MKmw4Y-7W^2v~MNg-H zxnTBiiY@c-Ma}27B7?%77o~s64^3u+Xnch^(0fie@<&C{z7bBDd8|JotGOE8_#R@O zA?jxgMD)V{sf(m&+f6zx$Wc1`z_Q!il zjx{@#vOl(|b3WFs3(?@k|Pu>ab*kWK=ZGAGX3k)3#WdHRK(LoWMxusF6?ys*iWfMWr$^p50EVP+SZ1q4REhXt6KC^vTcMj7? zgjL~}KR`{z4(@-+#HSJ@{J%Y*-iI45{_&K;l6ITGQa+nzL_VwE7@Md`N~lA!f+FWo zjKSlc`-$7swpd)$sX&h)A02aW^qW$&!}Uqsda`lQE8XVD$CP)>;a1v&ax8?ou^EA5B0%$u z)F71Wuzf>A@^Ah}I!BwVKB2yd!;w4hCaatm{grYha@lHU6%{f^D>ojrfoQp{CUJng zKWUIIuo`_>FijGNuHWO*hf+RK(r=)=#)2IcVTk6(HJ8sj zHosndkMSO{+etS;y{@W8^;QK;I10mm%9Z(N(8=_#xFrGEcW4LJb@@BnGY| z&Qg#mg;jpB`l&p$dN@RHZ_?suOMg!1&d10LtNAXPC2L_qCGDz595j z#)F@2ATIylBo8N8=ZgP7LUC6HC_R|tu}(`D3AG=`)07aVQu-r@>q?0Y<}REZC3 zUxP0en7BEo`UH-ZURR!A$?EELWM{r>Xbt!-B095SenvP(Ji8;%j8`bE0g&Cbfco2o1?s~@c<`sY_^aUO*k zM}H-XZXK6fk1x^!?YVtTopJ7D^tOyduNqlUBhhUpO)JxTqq7Thq+hm;vhF#(rv!O> zhqf$!KMwvMfZIP%>8&JIs|$zs;NWenHouN}5u|$c3LwX-fj$b1kv?Y3-^!yzPC8Rs zZS@Ksq*b9DdYITt(|zcL`Xyvv5$W#CE4h2$96YaU9uB7%yWJXyl>gj``-&A0I-9q^ zQAX$t#sXDR03J&CfB3Wwf8AY-9%N{~B7MAH+Gv-v9Bk|bG!CL`1GB=j0X=#&Ivv3w_Wg25t( z$T^fFndvG78m2~28?ujENhu9!$%S(Or5>`}9N(Il=BKYu*O9i*Cts*h!d{ ztl+1@H)9?w8NQ~i&hwYGWs+?%sGUgSL*LNAI7Y4Ep`;HF`XwIJ%zVX(NG`Ca%Ie7y zu164}6gQvE)*sSnWx^w$qw85dag%DU#KDtCNP7mf6xqR`bB#)+Nza?@r6Y0^w5z$m~w z$)9JB7#+`%9NNFY_CGF33y=k5Q*e&6#peopme%Fr>I)5kZ9{#dJs}=gY$dXN?aO3N zFLq+7a-tm7JgmF^PO8Cr00|I>`#W+2vG!XuyEeCGjpN@fq0iUtkdmEUOeMVBCT{bC z=z$KSp^=vc)uKD7(E9Zw)VB!idT;eVM_>UcD~;?*+Gb5RmL%F^q`EQv+2d1y38~(^ z)5?*WedIzVi5L&DtS&}b3dK8+_MVI@U+BxB2?2_Ef~~o#PBQd;vU2%u1joc+OCW2Q z-18=8XGTGTv;TULUTX7~d6`~z7m2WbqtEh^R0KY_JG|ANtKP4Z(Uz6DOseafSq@&K zZegu&cc90Jiq907th(DHI(6ssnuaberzA|V{ZJzqQZyFCEI;&c?xCwUr2zH;OpmkA zcmup+O#Kj*1{WJKvxBnTYB)=#k$xxI5VGYKNSel3l51N9Vm%aOVe?Ztd`iWdF;b4y;gXW zImYdioF2%d3E+Wn0rm!7Ux%JV>rv11Mh^_UC92n4Hgn zKyTM>Ki0HsZ)E(bf8Ff)%w|swrPku_R)+xrfmTVQQr$3}1tbmWVmi;zxntISXiu|S zdn@3beBP3J$-$?tvr}iMzz=bsq06t89@%E3&ueH4TZ0QM%C_uN<`J5W)!Ng6&i+Fh z_Et|Jq=dX2N2_F!rr@G2fE0jnM4pt+?alYxZKLo_LAhtHuevFKVJ!P#6%3mbnbdDX zoS`q~p2l0XM<&T(^K21EFsBwgcI9(b0)e0a_YOovvGm#>;~Gk;{4XRI-B0Yx=0mw4 znIOY!6)m=d0+xcs7AIsNTrY}6=rgyaZ8&_!6j%?fch36?tFATH6P=kxBulyR{yn{W zB6DCSOg?FuPz1(-|@PNp*%h_@RsbnP?5?!c!6Tz&WcTJ0iN05Kfo%6QX~Ae&qje zb1?ubQkW^i6)rxGOY2puJX4I#CVh2nI-%p217?I*cAbhB1Z4NGT(7T^2Pf!N6W?k* z{GE$>N=-0G6?etzD7Ho#L2LjN1ifj~k5vfx;VCw^(X2^_yJTbnOOBMBklCh_{4;0$ znk#EirXo7dy@~ze*}?bomL@AH1OuY{;}&)_GtXV@bZ4ZKpjY;()G=FK9NFUq4cEp# z4>buIG~h89(w>yd2R;4$OXGBoa@zp<=0=_&svZ539y-S)t&e1eti&Z=_=3Wte#vTO6RxSS z0@*Cg*do1Kx#;LT{uW%!_T2VQiI#TVqj!&l!8Nfq8FZ%io({QXjESRHD<1hPi(BNd z@_qx3Kf0(6`*PxOdfRDN%*8e-TT733f*-&@{Lzya?gfgY$^bj;MCX(Z*`}sv1)?MI zRC#LyE!g=l$O-43Hi!xctQzde$0wc)>c5W-8~l$Hcbka^C}*3l*o9Vpf1L4#Od?X{ zweXUDTiRZAqkenMZ@flTUMJgvEf>D?VW&;#iSODHtE%!e=&7@{9V5H{B$9sqt(kSk(VaL z79FaXXUnmy-#7?-U1?jx)tFJ|(pri#_%&3bU@N6ZsBkF#(0kFkR>bRi8Fjgri(bz&g?Tn3kD0{420@y%Vr_)6fyG2malBCDGn!3KRd=La>bPo z86{Ujwl$U+uRBOD-EC}hOqFuZ-g9T6F6{az_4JlsHAQ1tX|LSZ)6&eVvhz>`7+Im6 zVY|MS7};eL z#KT6o0+k9@SW?>QCpZ zHODS|%+-$u#NuEeDlwM*jfw}I0V7H28w?sO8cf1x4ft?ntF#{QFyh7QDca{Y5i?k( z(M9ZaiE}t4C3{@B-g1ghjbtZTv^EA+08J|g%Uvi5Fudt$DyzVf`UJmu_uO(61+Veu zG6;@o&WbzQ3E%)9P5C6<0n!1nkOoMrVPG$7$|qUtotc`hX%a)Z2Y@Q&k2_L8>TFiI zW(pQ@K-GP{3w*4+S{irj>Pn2Ye)Z(jtwahr7E%9Cg6E`i$t;pYT+f|0$xt1`Wr+6Q zMy?tT*s-1RqP84w@QO2-CV^iJH8V-(Vm~TehTuGPP@;o;LV|lBOz22tNN+aF!2FC< z94S2%>tg!Gm;a`4L@3+fT(o{0#YMW9{}w}Bv8D~n7zf1)3J2oPQ988QjXAQ8)B2s< z16=aX-%qzfVMc^M0EUrMZLzp=9|hK5#L$vY0>DATQ-!o^*q!cbYqct?089Ya?%ywa z8zL%yU~rs2fKS+!013-c_!BhC_fux}G6&8Q|7I=B0CN>|fcPCPsINzlL98`~f-1fG zw{$A43bZ00_iQ%=Re0Qg^QDiB_axYUWhu!vw&tkp`(Z`rsn}8z8E(;h4jJP>0WjMm z;6!u~nIMc%q#0x*vMV`EVf^GL0fXartB7~>n{s^P_DJI8Ou^R#QAxH|AWH0WQQ!-w+| z9q9hHVSN*2jkHa(aD|b}%RVf5KE)TE6^T;H3;Od;^0*Hca3_|{w$m9pm(!jVr7YH7 zx|0cbo(v)FK}WOI1&~6tV($50&Sy+Sl;E6L@;X@*bc4pS>H+6P zOXm-oy{x}ylDL(V7iw4+(iN>Wd1>~mL1-

    K%^0Amg+#*Jb*GIG8<_3vFDVUv#~p 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 g( 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≀&A6~vJ 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

    r&?a&vw`D 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

    *HqZj`rBKLPE9AO*7P)yU3a*43iSS~pdce)JZ0 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ȑZg)$RU)F;okFLB8FH4~nRDsRz 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%0DKq&a&p? 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�D0KJ@}PQ53B2-wkz|2KC(y@`hk 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%0DVzoBQw0ylh+<#$O8?+D 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

    G)$MyOc-rkn> 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

    *D>4ci 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

    @3C;LNwS^;dB&WPzJzkfTw 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

    p&V)g0*d}y zScE=|j%La{ng#m&3FE{$MlEFcy(mhlh|qeqrlX+b)mMsJ?BEwaESl;bVZ@kJ!0o#_ zx$Uo>t&W`BRP}-{ol28MVi!Ef`(^m#BClscSzr~2-_|25DZ?#JAP9u`cpDQr@lb4j zH|`wbZ;qJ{?>g1EA3tR{J^C8qaRYU4I~7OSs>F*BUhhOp)FO`EJ>ccoS`w+)tGuT( z=_TJ-QW8@dQFE4rYQ43OhcdB`thG_f2X2pnA14 zxhByp59;8lnR+g-F%-fJ6-iuW_PiGW1Hi1CQ3J`(iOR~*;+VtOFh{4F0*$x&HBze~ zCV#?6(M3B8*=zQR#2sx>Ej=^EtHCD!^ZHFGpbz;RT)ghM6ZvUMY{IA!u{Y>=F^mdp(^R?Ct1&$9DWo1HO zgjIaNaq9}8TF;h$?Kt)tLG9iZP+*==JJf3Ic4RGuVxVWz-+w>Cy58?;6@wW8pbn8? zzSx&)oJZUpb5{0WO=7?*@nq+`b_3Uv2FQvbp2)aKE#c+2G8wxqj!TGEoXdd{mFs&C z@2K7+xI)5Ld8>1M_7dX+$L>OILm%8PHWReb_^x zn%(Ku8^5gWhQ?c@th@O}7CzI$mzIlL`++@>YeUD75{-6D0j zI}VpRl1k(N`SWv=_e=9A#i&)$7}zDh#w|FF>6i7`9e;7w(*!Ck1W#AP&I{ylA$hbR z&xm5OCDMY5(~BE3tR=xh&ct|Ra3Lt3JlSeJ{QzvufR)x?Jfz%>SGcdtbm{viDfDoD zGWeaW;SXHSgy2RJ92za!eJUoj*7q3gWoL399C7&dcnay-LG|%ntWQ79 zVSJD4?_$UDjbFEKj_v}5GMS$XG>a`h<>B7~x{4QPq4K%nl?TtWgA`it;wQymmflBs z8j@lOv$~l3%#4#6cNHR0jCyQ~^3y$JWw(`Wf7ge9!^=DtFg7okIZ=aV0eV_^598mn|>ahNz~huaNM~0;cR($EXA?J(j|8$zv3jfm-pgvvwZl9`=3@6> zd~j`Bnu{-(&SYW-`U%HNj&~TmKq1yruxI+p4Dn-Bwb`cq^qsaiL#|UPQGN2ipsV zO?aFR4GL`Sxf&-LY|nlv5N-VQUF@NKc2F@GR&;;BjStS!)Qq8arEVl(8nY7*38qoj zz+$pzp^i(jdS)ZTi4R6oPP>1rPwwa=?#&xho9KQMtoD8(A=SH?JjMHLdjB-19eEZ* zD?O41jbg=$i-E2VmYGR%-EzG=-PUS4eAAFWv@$9r_BrPQ`Avz|I$(4siMEyM|!!Hnl9x-nt9YrP2nK09*pb?jmC)sCV@x>$s6z!8x zxgBR4{uwKnUedeaW~L~r`525ycD_+xaKhT%Z^mj(bF!4h%%$H0FMYLvlFLIs)LV0B zkvXa0DJ5w+wX$@?tw*6(Mn^dC#wTiD1#{Qj(@J2-3xMXfS7a&W$$w0@kCCQ zwR3^w?(fR?0yE#N>f#3q>sz|sYf9cZrD7I=GobuWg!IlMi5KaFLVHdBYmm_Cp?rRC z!^-#DSY>2IgE(HXd%srw@1~Iy{y_L=YAw3qqH31j)>S0;>&tA7AFV}d@^iFgu_c=Y z+v|3jO*CQiLrfn;q(pJ0TY6vY$O%+8K_PmZ_ga(zefgSFx+m2_)g(tA%HU-Hs*>aK z9WTIT+ePSM$12_?xL?Qin_hj%qXRANeMRSOnTdCTY#Tl@ApYxadHn&kk%%f^dl<_x zMlg0L!9nXy9iBfo%~HeDNr+K4p{tgP-w>He`(WP6YrL-i3t|A0On^LNy$y?=PrqjI zHlkQh;e68*8cwOSS(WDQ>vNHy!XiZzW|JFKNhf=PI5Jmoz}%I(R7`RGsbRDNd7wOu z2kI69uCSyaUR8^e+>cU6dj470Qy^(vF)=@xKO=$BN#PDilca}g6Qp=j5~aG}>VhyN zN}C@m0vIuM$1}v21d3@ONV7L~WgM=V8(Qu1{uBR|pQY#O%RI`FG3vhJWreHIYB3Ym zXsOZjS@J)~G%GZPZ>tO^A63+(?xayWb9tGwm-qBtG0$>f$hYViOw2%FR>ps6E5ogc zHfbo9mm@kwSu8SlYgFBQm-x->3?f54o{C_MqVCJ~(3Ma{piqvoTxVH;MGY27WAe8U zVClFBqt8c{LtEnv2QUZy#@+I!JrHd;gVGVlO7elbf>@>LFw0$91Rf-tl{XG0Prf$R z9cb}0Y-DBat_ka)*(`>?gQ~zH=75nynVUM8T@iI8v28AEzvSc=yS;}7?JLih=-k{m zZO?F8!s8dOJ8C!92}4!f+5g~X;ed@$x9vKM_HkbDv)j!nkm&O_H6kM_&dg!%SI$za zn$~NPzhXbfxo+Xe9VTfPJ(ny%xFsYf+OM3Syg+DL7qoh^StD30&3&QGXzQ9@5kTqH zU@#r!++6XIxuoCZ#bxc`&6E}nJiPy(6Z0=djMrijGzrU0wB3x=2fps0mm+#~|6U9Z z+Hj|$^u?Ftg$Wx<)F>utsK?*sw1+pHtNGoQF@GA!v{Z1PCa8jmSqxvkaA>ME`YT?ZV!#+<+Kuxk;uHG#<~0Vd>sOgIBSN*wCu~b@9kJnw zuUhwWeDxuV41qc+e^180(10m{KSEAl5@X`ES{W}r(=YEJxCS+}OspvtQsR-W;u6uW zK!Tt(@|>;Wjqu33o|X&DKbVERrz?6EwMq5a0)M~%udm`3uW*J&*3}EGNsb+7(UwzP zLBK=`5+>Bn?8^&1O9@``Y*z2)&GmN}ObguNzW3Vs93fmpts3ER@Fl-tUn}}k=sPj^ zX1XNWKupDJVT4H*SPHsw6@WdOJ*?|lPb?A13Cj_nt!JICz8h{UdQKb*R|^SXb6gBg zj+N<919>@X1Bjzyt^taf%7{1=k08|(bUJXB- zla@C3Na86iit_EDBLjrx{_c?eVza@8?1&TW5KFh4-NQv&W^`m8EIQ;?;<=;piuXzs z(b>aunoPS;+H!-72y)i&G1#_C+iT_#5;7j-+ChItc-XL%koS}MI{VpxZ9J>>nr@(P zkI%Z}|)ScIpDrHa( z{r|}N>UcW)|9^~OHf@+by2r%yv?GS2+vK$AHr;h}n{K9?Vd5C3yP59p-?h8G_x<_( z<)6dj;kw@E70-H8Y0`pA_&o0jCv{HHYNXuEj#Z|}Js+PadY$7zpWb2^0pOjl#gu+c z?$;B$cyW`hq&kfcOqOxmE#tK5yZ!bjEgXa@fH)nBu6=>fz2Dh z5e|>Aq~RTR)rL)BGA3P|fX;NsUI~m5bFwR=Q~6>ZO;0UJ^J_=_7Y&WgUP zN9@)6=(jY|$qe?PrH!q%wuY1j3p!9bEu_aj#gx}Xc#&uqGdQuELu0sxZS@k1m*l_X z<_NnE?{E?xmv2+r_%5y!m7z2xdA-B|*5H}*7etXoGOEj-dU~!rH2Ef^9(0||gKlXE zpcHociGF*P?$g{)Yr@w_RTg3wyD-+Dag&i4rj%=0qDLRzH<50NwUe2-4~d1g)FbQI zHRfUneStQS-hSz-tM4*c`%lo*RRW^h#-(3If_EZMWP6&(a3Fc(m5$TjH+kq+W9k>1 zX^sT$>ai~Y7eI^Ss1m83E$6sfP>*l~<`U!6kR}GK()ZJ4j)k-iw-SwgPv%(E#ELUgVNJ^rd+o!iNHvbwm|N@hKInkOuoAhS2U^O2 zS|JN^c9VtNv-Ez`{p+#?Em|LR@GFddk7-ayvFL@AI55;lx}gTgdSfp|xUC8#Wp{FqT;%0M|Geo0eS7QKRNktLcOx zVhJ^-_W;qMP^ynrXDBknHU;S*|>SAGs6oR)CyYvDA3hth4~x zD~2?=PNpa!ZPkuGbBxZwaJ!b9oURnWShNG2fwW`n3dvxHT|87f*87?G_`Eq_*Q%Ss zK8CoI#quL z29ExOIl8u02E2OuXYy{BPXuU%`eYU1>u$=0K5`s8!kbu%8)t`mbMv)W`9j1#ho9%%+6DdbK;aXi>TKN7twHg#X(R~& z?NG~Qlv0l+OZ3N0pLt#?eTao@_b`qUJ)LA^XGD^tQD>ikGSdiM!s0DL({;jLg1}Jm zDVY*`-RAF>-D|5$KTAt7J1;P6Gul z#v-(}r!4k5BM_*K=d*$%iQR`oH&A2{KIYaU`An3k)EKj_Ld`bz>$8_lH&K^*Rd&u3 z;<7gexuYq~s*m%5OKh6sy!*q!B|~wz8$CwDx(A8%F~OnT$5U3U_58HF)X515^kWKs zD)DY!b)Hx7J7iv%xLL{FuW+|HL`h9yX1iL|Vg~o5C+`Jb49N2+M)mqnEh-C!p-)Td z3GH1vXKRjnAuoBL!OB~->pW4+51ZAfPruaPzcjnu3!)ApD?K!;TK6hY8!yI`fp1h7 zGhYhEf^yw8v{dwVC~=@1w0LZHQ7}~StrKYc=j2X*MX`)iHlAJ>#KQXwtx87;L+PgC zc?d~-YqF}H-PPtY|8)qH=nuA2Umw+BJTN+KxARm;FG$pyLA)fl@oTG>A<{)#1B%VO z@)!D&gIqCLK{iRq{9VdN>BhLzM7|>VSNAr*n4~N0LS#3asxa1XKKc;hWjYyL37UPR z$H=z?H@2zRg%mf`>{MZBY+wgTxWbLjq2j8yZAXP94#l#6F^HC zUb7n~h*00ke@ZsoI8ADKRa_FkJ}ZI+kcIf9+I@n@R2w@#e#Eg27}{BPkEtUY!D(&3 zUw!U2Svq<8Q%T*wJC_QpcuwK`mJhSE=v$xrq2!eB^$|J=jYu^{7>0m?QmCh2kp7jx zrFo|nK=J=ZMLF*4w2Zb8fgw)Gjg;pZAu_Rll|==Dl3y50o7nJ@s}jwJvn4XWH*aJv z=O{u-Wra+98L8LT(+kMOA8;S;4Dd?nvES%$dXZY@y)D!FPgA@X`y65`n>nVeGJ_nT z;+?OwL6YCk<~S4!%EYGz2MvFj?pjxoF8ybswS14z;?(nf*;1QMnCEO_cPd9=RJkBM zCMfElOk7I^%`8T5+Mo!<1g@GGr}-WTy;)Y$5>LO6Gy7c zczDB320cmCNgZ`Mr~&)zq9;-GeWe)xMtA;Zrg&)Xc$1wS^*4uj=?>hdskuu-;j%8$ zGMoX9u{vkNQMihEdMQo}Afs@@*tPq{lcSR~{qJrh%>@l&8!FFYH6%&OLec=mgRk>A z9avs2K-6E>I;v_H-5mgXt=H4ObUeorb|rmVUBwYl58&n;0*R|;|BBXi z{4Kl>4S*o&e2FlK_*u|Y!RCut1$+5xcwTX9mev&s2Z?@c#}d7Xmw* zxCmRLD)jTkP9;qpvsW9ctKl78a)xhwMSWHoum3xDT=xvULi*)6sV7!;t#aK-p^YST z87bM&ogTqYZL$4~ZFGif_a{$`$D}Ip-&ZinCf-+#vr!XC7q3P3DPKGGqYd8JpEkiU z2yTmAppdy~g6I}F#ihvyjLA~bxW&zd{)81eoZe^Y{Q5wXb$T16?~d5!K$|l8v{G4Y z(yU4KdPUHL&6h1oUApPXV|1w_BC>B)8pf zW-m3bxp7R0GCf}njdMJ2Iw*?e^Gwnpx)pm_PN`aEVmKGzzP6w{$Kv!F0P& zM3sDN2xf$|9lf~z@G?a(!04S;-_)_ec}wOwcxI0k*-?wDRIMH7>!UTci$cv8K$DQl z4a1DlZ?;$Wp5T&3SKgNi>856`&tl?SRb1l3UhJi-G0#vU?jK9wtDc4njQosaGQdQcYL-q8vj%scspfe zY!SCQmWAy95cuL;sv97^c#pE*~!$aYbi2$?SEJ){eSI0sk7dt6 zo(g(M1uWn<=K}_z>J9i6OEsji@;|;Uz1O4w7tre??3hMz>90R*1KOv+P&Pg40W(P|^(YZQBpvNHia`H|B{>hNV>XRqJ1Asj&d%m=d_w%_mNf zbnkogf)a&h(V@m= zqiaTH0#DnXi_p%V|AZ`6#$(%Rvsy9kr#b?-htCT{Is(WqOV@ooIpe*%GaRh7iv+4s z4!L{FnC=n%8Q$MQjPXThRw&IrVue&Z<)Jsq3vX|N#)6Ee6}dh=v9H#Qo9htuY1|S>kuj}h#WBF0753knwy~|!>hx?agG^b z5N1o_#Q$Gef$fAQ(r+HLvp+vLzb3C&NZcBnr$69?&Gxbr6`P`&7t9-H+)({%$XTl^G?|)-{X|;4SOj@$*bxtQ;W)Q3zL0I zth(3?GXL9>_6QJ@Xr>^fBK8_^{UA6VfsmBaS;)&cRBPa#Bu7*=`W{mfR+E>+`CV(Q(BLu?^Kh;sZJ{Nt*4 zzTCC)G-Y~|Ic6n>=>3Sdq&uM>egy>dk!9xEYe?x1Y!)QCyqlTWu_kuz2$#r!MGkuFJ9-F&m;D*-mE1hPpXxa;;OP^K0cBJNHvQBSGh{205}vCuEzD zp@j$8TXcg|f#u2HVVQrEewKcSOdlMH_&-i=kVL(c9p%gcm2t@=+e!yA$>=>E`9XRF zQTL&xJl9=~>Yfk7uU8juRdTg~z4Uq8vB??C{+?2@D7fEfFx(GgWD24_|LT?ad^A;p zn~d~GwE<58sdG(!0)$v@&Rx$TxDPhE9W(h-E}Z#(LvD6IRLlA$y)!n0bsH*U&GFn3`M;Us5n^a)vsJZ{(N+7X!5MoQx#^iLcbbem&=IjK1}#{n__ zdlQ{wfe!_RL?Vi9B-j;-b}Kxi2`O)jNA<9j;er*jc!Q?0c5h6jUxTX(v#SM5jf2Pp zKk)<}rqdJ^7xj^@;JHrt6nKHAWP5JDZXyM^>`qEQPfrevY^tPcH8y8&(5g!$Ut3jA ze%WS5`GloM|Mu+gyh@!CKF)x?lhkWh-b_fgsWG{R<#ok)cVkljTnHgjzT zjahXB6eeBtGyd2HeCqv5kKa?-TIJ)s7_rgp_Di$lw!WcsX!*eCITOY3sh?SG`E#%) z38!Y1z^&{y+x)!0x|$vXlUPUY=aQ%p#ImBY)NqTia5I^GhpyxMDhJ&~$#03^B7Py2 zql8;*>Ww(FV*cJxFE6&V&N*%mf12`(KuTM%uX)~#dmjYlz8b!IZZaqaC{9*`bB>T{JObk`UQmJ1^HQq92=d&&pRhc`>C~rQ=_q&jG zyGUq}UB>*BV2^8zACz15>5G`VqZH&lHS@$_#}(z9m4Pir)_FkFB2QM-OTi68aC8+k z)`qd!KWNf+n&J96y+258HX_X_eT52J&i$^WKnWUD__@(CSy_dggZ|?uM}x2uG(aAg zY+lDN9J_*LQUAs~;YZB2-#kNu6SsIY&vedqiP!dUf>E7LMkyEFpa1qW7fK)TKx2x% zSsN4SN_M1MjIzDNjWK-g6Tm)jZ~0AG#dRl;N4*VgP3XThoxlhF_c?n4H{d}p6QDuXkm-uL znKN`F!vVJ^F*NerT$R-e$H;3oeErHwT~mo-;pGJnaPi$knJn+3a@7F8H1#^MJMpY( zdz7P^Zs4j6i{xzEty%U*DTu_>R+30ua9yZg zKZV`{@#AIS!p9VbM(-6bKJ@==m=fgE6e^fvKjg=UY zQ(zgfz|z`kLcp0#vb*^{If1F#AF#T$*KE$A!%1#vRuZ?H1P$c9FXdMNr2|)^A&`J7 zLeFLyidF!u7`jJepJ)k%mMcNJRemf)FV9v=7fh5GMcYH)@&Z7lp2r}L#p`_&%S zeR2DcD8(%p&IiJ=KPc&n-m}BG}tL>L~-hghML;1;YTIj|CNI7#Ds7sFdDlT z=c@RU8^*7DY)1QxmS%e%w!~?X=wP__A(hpXvE~d%hG26I;lPF zK(X9FRL|fShLX&rWO%C%G*lD2`UcxGSF{%AZ38p8rc85ni~GT)yu|2`QZzsgtGoS( zVOY)EZ>>Nn-IQW>zXmD8Vr-b11-bB8sMFbLiV|?2Og-+nxdc5IKfv$`-YD<@B85_*7i+*TW2D|9OiZd{9v;@lpK zPtF5Z&u5&jSeyc^fDJzxKVP3LHQ7S${A6WA5UW7C4I!IT@IfTp|!x<&Dqz0!stvqY3k z?H?Tu`)z1AT3#)(a`6Kc&}XCwI4VIyvf_iFB1B~zk%>DNCht7)Se2-o_Af3QvvzxK z@7rK`WDkumMK7YCfkD|OFV2g}b5N_RYz@bHZW~^AQP_i&G&cnn$uVS}m7#FUe%v>I zR#KB9G*n@E#b1?TCtaSvVe*)yY4Nwtqa#xGb0!;I*~uvqqw7(%gsBce*QJbTdS9_D z>*n3yl6cU5eE#W4I8(z#qqxv^*HA|;!fI@S&DalGH(1^mM-{Ur{5kU@xml1?pP zO8~pI1Znh_ya=sHvUR|WLhr`ziisa!J5$r%j5g=8VRFK1y_#Rj)*vqdRV>eTb&EY8vut= z1f5vR zq=?qP?Qm-;lJ}RGi9ZzrwvJdKf$ z{du-31Pr>3(uDvUD$*oX+&`9YII`%j|D&2UYhxl&#ab?<2FG{9xbU&pkl=URpdF+M zZDO)R$Yig6fAllIp7=W~xGuQ}Tbh3HUk5CRj0_513ljv4hK3+InL1XXYeZZ}gsXTtU|>syrWcHdGAPZ=-(9cJgTUbpP7^_r&+7>7rv3rKS|ad}h-L zoMV{0_DRy{!*%#0fF*I~mAVD*Cwq>lhvZdb|5l$#Un9@N{VOGa#2 zr3(rQx8_u-`NiwL*3J@P1l<3%2Jx}Ozb|9=8VWNeb0W_f_v5&p$Jz__wKusysqkvE zZBX}&9D9x5c6WQ)9T`6K-$L@U9VjIGdTn)%lt*PK-3ah_Dt_^JpuF;TfX8)rH<=$6 zr}(T8_ZMK5niL!HwIA-iTgd+)p(3DqfAu`~fCtCQrad4HM_y!h@ph}O!Do_NS8}lR zQh&?F8`)VGxU{6tW}?x{%dR4>%q9_6-PDb@=_RWOVEW8CE~3TU-5x=lD1L0#F;-C% zrU)Hs$K3UH6p#iaT6pz$uTV)@pA9#|?H{%W#Q|pH`Mu2puZ>?hb{?QIW?R$E&)J`3 zd-5P_YHbFm0+{%W{U`Rf31QFOzWCHv@#U9SWy&tqUhJcE6M8qR%~b#Qq`+~UN09Z= z7w1bOkYKy9ZMN}-3o*z9P$qmPZ8Fs(>`6HJ?DZvyZ#IY@Jed>TRnsVY?K>i-!k7BT z-Z{tRqu`7i$8-JY#7n_6ECcp8GmR*56C*ti>6i(dghfkJ<7x=G=fa0zv!w8iMu~vw zj5YM4P}1Wx+PC686j>IuYm%N0+n4jLx^zf-Eu?>pz-#njys_}G9t{1p;jC6@dMfyNQiY0;{A=N#cCp7jTT zte-MY{%$hTMU4gN<=`U5;kPe*94$r|`*VEGH>8#x-<>h(1;$`J$RQ1t=0tr53_jU_ zf(~>$z4n{nfl$RbT3CJnBO8aBkDU&ilhNEbzU>M86C?*u6-HWGst9gt^B zL{maz`yj)=*7wLwqh0`+Q9kF?$?xUVjkgyYI9{1{Uk6rfW(QZuNUfa`%R1b@v?;~-^Pg51 z!&c4l6tT1rM~TmL1Wl8UjL$G7qm}$}?)Q!QoLgfeqgg^G>$_`-;uBJxCb`fb@)*NT zv=p`Qf6v7e@olDw6sSorS49;NRt=NgkyH!6{IMQ&xw}ee_#dcHAMxpL{m>KPnTrpI zZ9Z@^VW%K=qy}4i9AZHs&83t8K(IEZHVL>cLz4o81n?DO$N_yVsTI(Va?4b3l<4z# z->_HSt>aJ$jG?MomrKXu@`*auLa$~*`^mfm2?ly(e77fOvq?x80HpbD22e>)lKoaG zXKidGVp^Mv)KudD0{t)RJG;wL;BP7R-Uy~nTppB?6l)!R3a5$g(Tv+wZHhU_mce^C z0V@Cp*I;kAQS9kUll0W0m>R1S=`zdUj7bNZsu+)&5#9rSx;w=`W8qBWE#Tn-2QZx@NYp z`Dk($#(miv)VjAJk5! zx%&%8qM7nhdT#1!SB#e&#wg7y<3uUH>AFB4nHS3w0qudju!T5groe30Mu0P*qYQvZ zzn_lu#=k$#lbQ)m%GPbJK?5`w zZ61_P761110#7m=aW%1$YmLTA3Fy#wQ;10o^brPzzGFr7X$Pg2@$yQhd&LF})MJ1S zag=IA*Hut_u&#cwJ6g*+aT83>1U|IPywAuleh(yBDkWA()S;9ry=0Z#yc<>^hce2H zzB#Y{1t=|%mXm0_*^%rlEQpDWRqDnUoYXXG*K#m8jk&CT>GlcjT0U>xM}I5cWUO(! zaycJ1gmfAYnB|`z>=C;JMNPkDqDi|j4Xdd&^G<%gOT;T1t24tYT^rLQv2q}M?Wksv znWA?`+a#`iUtBZvut!@zXx}mGOm#$E#js&#rL}Uq#TPlM`+xJ^Z@?A zcF@5r&7VClD--4HLI(kNrRp#!vMD;(pN3oqGSmXf9D0=W%P&swp8j$wx={elO&Lkd zO;KH+gkH*7xKpWclveDTMPw;rtIZi%&(tWs9g)G)i%EMGb|wIvfXOq+kSK}c2WF&} zZ6~h#(Qz7v-9p9%_caB3XG+IHd{-s^dV3W&K4)ic1YEOmB` zsa~yV6GNx>F*Iw2B5$)b&#(5*qp}JiS<(vw6(kAynBIQ-98tAQtkOWBDoQ|iOu{}= z2upxbEz4p=O?$xUs%z#;!{;K@V3}L|H)k%ME<+*9qu;KJ@ zM$b@w!5$C1guO!&KT<-Qh9az?8jkL!<`ot?1)gz=qJogc2O0I?x_ZhWN$GLFQ@^mD{Olrqow$F~#N@B6?6LMAz}Q z{q<(wE>|ey$(u19o$t0nz!ABG_=lrH3@5C@*jg=} zjxPOAH)@rZY6=i)$p<;*LDFAcm91kOW%0f*zE3bUR@efr&1&=wk(YO(je!QN8+!k$ zY-%`JaWGsJmWyTLp<$5rM<_$Px1BI-r+zk?Z?+=--4%5(bHbf@!bR{uhxKOx%RM5a;22SG%O6bPqtg>ca8l!KS z_c~o^`^J=1`q$J*3WYlKFFOoIWcI`i*7q;o(k%8K-%3QNa;0bf2=G25cw1e4YZbgl zNyHlD47M{Lo&NMO{ro98$Pji$nBqaSdmyrZ?=8NYS{+T-8(7o`=nqROZbxk}Zb<)k zAp^>H52`{Z7}qsl1-d%fHWx@=@T<6n7my&!g=n2i5TUmg;eHz`Opsx@tt9!b1W{Hn zHqe=@^k!|z`O(FS`=ha#h%XE>+T&1zz4KR zQ&xK^`IO(Zg|gyGVYJjC0)U*#O0|PTsPq?4wHp8;vgY*K5PG>iM|)_hQ%vyvqv%Tn_}u{i-XzfZb|+A11Z@j`)ptK?+|H)a5`!XNEUNK(F#b8+%rtQk!Tvv^`I1!D;ia-k*%@=zit-QF zq%d=Y6L&g%pUO{>oFC4KKF$93+K&fhV8MUDINHmTSoWqNZ%4fd%ymeNvoK|+8>n-Z zb~6tRjgxJ z_)1*2h_mKm&Ac)E#thnxuIdgQf_?l)`s; zrvLu>Tu72LP`|tuCmUcYcgw*e%p*0zxHJG5>!eRk@PP0_zi}-PZvh&a=zE5Z!D}w6 zDV@xbRF$&joBKnYI%cA*zgTOo!eVYou^Q_S_0QA5cMX!o&#a=A>FtZjL1qQGB7m+f z`(uF-M>)Ebshjb^(aJ{2z^7$LYIXY45H+zuispjit?O@@=4>t!4CaXr+pEF-OT&K< z>fzNV9Gtb)6yZr!QFig1N^J}M=-~aA@ZtxnBB=SrcBI+CvkT+gta%|dJGjE}MdfkI zL5H#V_vY#|l>N(Co&o_X@^;z5WuQ!_0rlLg=k-eq#KKj%)$HlaO!OtVQfe);p{qJj zN5!YCJk|{HcJr2dhU&U{^`%4>iwWOJg!nc~m4k#Ev7QZL z>-#_+1gV@Kki=rOK2tA#`xiP5thQIu2x;E8lcAO#u>3H}Mq6l@XoGEFrl<&!;2TSi zs=on;zuy5DC4BGsDA(GBze1|z!w_ZJ#aRxA^`xCuVcSh7X-J}>f zl)M2*4eT=KJ_R|2-*Hqa9WZ}QU_L9=h6hp|f;l*0NV{Ujvt)+)on_tNtR2$pj?vI`ARTGj2QvB0ao_LA!cto ziJOrL0#(J2_r2+$d#WsrTw>-TrYc4mBBh5F$@jO@*MoQagn#r;D<8P;$}|Z)K;Tge zEN+4Tr*UIR_Sp+ZajcI~<{^uKP%c&+Ll?jTUaX-Hiw&V`CC8zRqVFRA_{SpD1Djgzkeqw!xIh{V3NTwc8if5)1WVT`CfYT zR<&i4p~5+&=fB56J4%qZbBfR!=eO_F=z?kRvM;OHj#4Gy2eR zhH}9}8>}%U6aR|O((S9Hkp0o6!qD+QTCYC=K_Eq<(tqM1%Y2RlVaew+tmJ(`e!c{? zz=Vzhx%ab?hmjzL-rBZv8e)3L;%-`|LI0;EKbvV=IWW*KZEjj}QE^6&*4I*`n+A65 zJmN9~M)el`FEE4@j%%+*2dKX~l8uMd%w7Q5$&IV#>*-Fs*!-mXR~ zp&vgEUxyA}V#A7cpjESsW+i|?vvAe)bbys&)Bo@{1{Uo(k6L)sb*SL*O?*}_Kb<{f zB8Ce8t2oVuI<{xq;3P%7va!Xt(DNf{0|vsf<~!^SWw-l^pN!cyg>C3E=zIiShfT} zJLyvW$z;pi(*$D^!p%J_UBFNmFcM^xRV^4^g~9jw*U#tMt`)fx-I!2ZUYg>Uhfv=h zPJxecxXp^lrlFs!zr>x==+RjRbk(x_siN$tCx3@Ul~E2utkwmq=1t>=!Eu7z-NuL+ zzDoGAg-^5U#3~P%)EoAZnlYrZcz)4PYNYo=UwHFke}V%1UQW5ley7Ma1)_N&+$>!J zkhYTnnCa&faw27Sr8r;>76+I}$hYSF&|pw}2FNp;iCR%Qk1stb=iU(eYCdRZL>H&i zT4+%6mp*F}=^`Zp+HC?$QE6C)naHF&!-6v97_PFuGU)Tm!CbXx)wq`Q<3o3@UxM30)G4c&$Mm>$ z6R%k#;cpLZ?N=K4XMRmS`c88TQF{q0`O~Q7@1Ic)5uPv{`LKU}h0)_!uV9bLPg`U68Vj|#_9v3?MOckHdM}WQ^s}dmRUDwf6n{t;z zZdT)S!hS`y?by#I2?7+@KLu|+FDRL7>em92J5C=vp%1eq1(;2RyaD zKr&G8CF3mvw4A2FYXfKR|BF+qdx{XJpA-oj=b>3+Gb=Z%O5Hb|Q`hw!)D9F|;mn7enOYD_#D!|I%guLYzI2hX05?X*+GFem4TZ2_@rUP|`K;A{sc7^W$vYl{L|;nVeL$t2P%u^gCEJ&_dvN=_>H}s6kQ31Ov38^yCXr1I|v-D%^wVUePfI7hUOcQ3u;RrGT^iR=Ew;928 zbsd!1>wt()@_@b|`#8Bk**33xn}lDid(bKOuvsWY{D}B*l~Mh;OKF)%kQmsarBaIV zm0q%ZZ!zQRQc@58(G?|Do?Ch${fb^(J+%7HiX)?`i5d)PdBHv21^AK}Y#Is8ZVw6! ztYC3Pg}1j|eTn{%NFGIOgXGRv)|Q_OJ}R_3C*vE?KRlf*7k-HHMvyKodH+ZOq%9Fp z(-#A1Atm5D|3Siom?8X~;C^cj<}mW@)-chy1Z#ggkWmZ5n3Uh_hUX?O=p@sQLrs`K z|8@Vc?TP7obP)SPP3y&hOw`7N6FB1kpIIk`$urRL6OFIL7x~)DI!QNW@}6UH>Ne&R zcTvF)#qRx7Zg!w|{=s^aq+Rc2jcg}*s{+zImniWPP6Bv@c{V{ji&a!dtzM}z{68Ok zWh070MmVB7bt98-UbGZB19rYPnR!?+Cc&7ikDci+%qW^q_7q*dv_xz>Sq>WOL%_M8 zjN(O{?3DLB{fYUr7DATsko6SazOq#`R#Rj2W8aXfIJp6#ou9ZTljp)$Vg`518Lwo8 z-jLZWLW+D1Q>iLXu8+I9ZBmrP7hAr1dERS+)tJ*`Lhp{f(pi)DioltxigtRq?rRaJ z97Mex7Oo?h1Fs%$kFQSmE>cmqOi4A;y6lS-ySKT(9UIqu>jJRR^8q)7+AN&0_rs!P z#E+F}1F{;-DQUTz$irBFZS$4qn9G}3awLf?pE8WrR&l%pKY(~}R&M<#+pbkI^}YYc zCNL=b8$TLsk()~c3d@NvLb%K`Re`P9>K{)$S8o$k0i(9+k8=OGXm{dAfiNE|HCYF*RwPVmV9d4!ep~ zIm=Z~<##nzzCS?E9h{d5Pz;hPi3D6m$9mb12l6=O^WH!{VZ6m0QALU6tKyL1#yoVxG&zcX62cqdw8)bV)oO%yA1LDeL{Z3{livD z!w(A_;PmKCPZrYE=F53qvwu&)zZW$V(9el+wLIT`2eeG{arObe%(xOW4&3mhcib11 zOr@?`FL6Ulc{eL+`{<5AJi`&|#EDd6-)~@KGNC%(T&{KG4-Ds&>tb5ZXCeOpX9eX}TSL#yL2bx!p~RF=4oaVULA( zT${rc-iR^z0fuo}x!!1kyB`;RgD3D&gDg5uxjsK%@$DBxnAjLoqw%Wo4D!BouA5h) zC1oyZ{xv9oD-kJ|5mhR2D#3I53uLd#yEet{2Uf^v*{!uAXyr51LmGz55C# zXshpQtSa!GOo<{0 zy@WqAj4%8puNBCqJ=c7R^;1$~?*B{F^uY zv*i3_1thn%dX=*hKt>>C2jo%_JnLX=Qams9iDP7QEaJ5e=eK={8^PObz%YP?_EhnA z#$Uti*^jZp`(3@)d*$v5uBQ>$c+36(DCOY6j~qF!T+{kUDzWg0$#B>}LO+(j%bFBo z=Y6Aln`OUP0G+=fhtkNt8xhB+G)^?j%98$+kWGanMBi$+q*bhVmRmRg81rKy%iO=) zIsCXMa22}xk{`)l!~v=*f5Yeg4u~9{E$MrEM80yBoZm5&$%dCP3VD9Jws7UJCnYCA z0(frK?S3fE+K>(_=#+(iFS27g8M^sRS>z2Epe01buX)#F|| za+0?3d5^r4>44>7s|j~2)ZgD98>JO|sDmYpi7R#=hT?0GgHP`pCv}MFhTspk-DAFk(kTpE~2sbE9kfL5PQfuWr;<9M{D-hsLQUJ}rCSd;MESO6Z$HORD+e`YbCuhJSH=0FDH2p%3~Zsw5ZDAgf&P$Lp$;?eW08GN7krFJ<9Y6(0gax^IBEf|f7XWqDWS>vr= z50^}&Am&~nKxl3$AH8Z;xI?vvye+}2b4h?i&l zUXH$9PudpYxu>FYEVmlxF*0+O84i>SwBD9O22ctdIiGExea{^KG4}#lA8vHqddO;m zeWN+K3gz?3*LIfC(-u6qQ^Ke?Yj66MkDWiY@xj+IP}QCB(-umC+WUT|F5K5hvhcu^ zqWIZ+$@TuM*_JsVhX+|_^14ywQT~e(Px%B>O}Gyuug%;aAME(^^S^&Mgvg~iQH&;wQ5joZSnER-M@F6-!7_e1E)o6Pv0f{f_9 z$J>CnGBVU#I};aY{>HcWUXEHDEjMtZ*w5~1B&NC4C$*F!c+jzIi~~qzW{V28@3!8_ z6mo$m4eMoxTU}${77Be{c1cUj$dkckUv%plHtG(mkajW1F6H@!BG&o@J2@T+dD1yx zlX+!Xv|Fo9un&EwNd=@I7km^$Z0)%tn3i~)PXHXysYo3lrBU-*$)jQgX>dln@octsN_aX$##(CWplFtEf_Z&7SS&jzpMuQN#J05$H zV%PFoM;Vz@7d}R$(W#&{=b30kQQ?b+QMyGx=nB@OMH;nAAqEzS5^Ax%s%%PRK}oIq z<4XlR^lw&}Qg7kjb%Iu~o|K#TGr5v|lNBlXT7+f$Is&>e%r$_;y*?0#F>Ab^dgYd* z5=fQ~N;Prr^HKW+$Asm&pJJEnrBiO{QK7>%xE=T63S2)iZctET{YeI&SS~D|y0D8r zU12*3wmTl^JePM?N#)qJzH(-0jcA7IHOdpKzzDC}-mKS?8BgPf@m`sZlY$Sjx%vH6 z+m?hii5Qt+f*Q3^admh53CeCo9u}+M5?Mx#xo?+sDceN)YXHmPe(d^Rb62_+RpRVrQH6u+bP~jz{Xv z>*`_ZGg#YWHYw8bXj`IgVz%Tqmo@dm8*F^tnf}!VoAcMwP&Y7K_Qpl#$dh6Dwy0Vf zWIW6RLQ;jc_{y6YH z0;2G`zg)`Jmt0;39NF+!MBQZ?U_NM{z8bh4rzRQRcw|&{sWeUFOAYwHa+ieg$oMR& zYv&P`T(dT9fv4Z$ggN)k@C+GC(HIVor9jpt5Z+*-*ETh(wgs>!MXwxxrh%7n@?uw8 zrFjosU0N!y(5qV_AiU|84H;sMrlyppZgQzK(s4^xUT`YmtV!_nfRj)*YCp$wX_ywo|HY4KnDg7TSi=rB`C{x-_+OP< zAJZXZ`YV{qEwqCpzYPATE9}W4q2!GsMe6yxpZtV2c#x)T2<|6*Dkwl8H5Wx&6RR<{ zhUUQAT3$C8!aWGjtq+qHs;Q|ob+8>vIya+k8pFK`T|yt*`_VXC2Nbg3uj>LG33F%E z7YXSdZseUivO*7%>tH`2egX4dIvBl3bDSCJws$Q6RJK8i^z{GH^;KbQZ`-~hxRe5= zxE6OS?$F}yE(MB*0KuUIcPQ?~-6;~>3x%S^rC4!yr#I`Kb=KW`pL?Eo$;ZR|e{+oS zvoZNc_dZ9NQc!>WWI#>am+i7~G=PEf$;G1zhk0w0wG`Y-?)ZbLtXJoln(*}TX%k<< z(tP0C!cl^th)na6`erivPN6-5%yy}sn_*F6SqTq7uSxk^R!TWCS+L~S35?FiL=~f- z@0ba%OrDQOnWwWwTrHy;l6}+<*VUnX ze4}|P6^7gH!?!$BR>#JT38**c=sU%V8j?vs*wJfnP{;!*`5GBmE=Cy@YwsX6MH$4D zmXLeX0{8{4MhD+&p%EM%qHDAY2PQ-x;rP-)3+gRePOp582C>)nf7Ki!9;wkxqvEM4s+Re7(Jb$&8f9V*Vk?@XjudP+T zlLl;43*gW>e5FSBLk_2wvX&7+85j-0b0c`Ih~HK3O1pLYiuR&6YUcab^I}uEQA&S~ zJFwvj7J&C|ev@{y9kY-GY{{RcgZgJ3oA~}#v;M62!g9LOgZAhx%=ednO@9n2M;}EF zQ}vbA22{ATrdTGcFH}Bf4pTM+DpXOv$?W8xxJLVCC@4R_Nw`BJ)6C-r`moD4??L$G z%}PT}8E$n6I>6g+>g+6R1GRGTE4cIBn$h&HJ6VC%Z}M0YGkI}h>`Z_l(wy6{G~f+Dg7#8fLA5iE*bA$<1>FI zOU4X$J0cON{dlx5{g}G+^7>LveD=MkL#0?8sP=iA{vFqSr&sQs>DV&G+y6YrFF+)1 z^h{8wh4J;g-d^c>&l7ge0>BBj2;2yJ_`wZZtwXNIR8x}TTViRO@#1v@zgz!&LaZ~^ZoZ#QAS34#1*nq`V6u%!RNgd4X;^i{5)6pj&OUHj&b=>gE5`%xNZ@%U)pjWLLg95EWe)Q$>h^4y<#-iO@2LOiq9yb zz*!8kiX-sA3Ez`d_8x=j!CI~ne#9i!!GApv$X<5aZWvc&>77pyXBiVcjGm?x zqYh|P^wmnhNY_WV>fO>US%)~csBwN&B;8JAMWOY83p(OFF~57(yY1hRq*VJugr@Pl zgOqGzJwdNS9Xu~_nVyd*3q7_lLQLm!JW_;G@j{h_FIdst-I^PaqlU}uV#&}BGQT*wZqw3qC$B@@ne??d4AVQFHPAjf{1!6mW}vY!h5 z*RBdbwbQO*fbofU1`rSMuHk-02blxS{5OEaZe=52CA!q!7(s%pNs;W60|vC7B&&7Ulgbl@R?fvM+_8sxuhHXiF7J_eZrJEumx=(qP;Q!W%gTDlI1u zHMGKdPKzFz7Z}i~_q<#T3VG^6jr9TrwjG8|pMKF5@!%D0d<6+Ky32WVsOof0G2byx zQxPpK;c0oyPxU2OqIIGPVDD4XE`W`%u28P-UX6YK{DKl-=T~ElFkday)#_DGMEgpO zy;)v&=Jp3#h%WlLMhzfW7g)C^orM@%0rf!tlj0AwInPCM3p_%ADRQQ+*>x|~TrgBF zMtHs3Ohb01{w&QI7MuUr(zl16UF>&VLTV4Srzh#&v-U4fy>e6{0m-qY?mhG>eCIT+s(XOiTB{HEvs{;J(y@+7*KN{$!W zt6feFhI&a@>a_$9Gymwp^6>6GkC&w4T0rceX?>R zEF5L7b~pJU34gwlTF$J8mB0G9{XTWAg?A$~$hwxWXGhR=t#CiSozjE>&ib$j&OOQj zkB)?n#Bxl{_4W>yXv}7e%eHh^_^9=T^6+%%a^=lZa?3Ey?BKgRi|+2Mi{NfLtL4F* z;n1k@RP~xprkSp%7#Kh3b38`}z1z!W7Tc09^wlp81~m1VK;2br{!lv1TjNBqY!hJS-Zoaqi6SxFc4wrIs!mse9=E2yn%l*HuGo zt&l0U4)3bcUh$fVCp<0xyO{jbQO#;}%?yRjdhyvZMKQ(-vE9ormhU|l5iYO*f=D)S z9E}a-#RjMrUh?%h&hP+kaoF<{iLy`9P78#ydx(9WhHDZ3FQhX|Wx@f{dR5sh?I&L= zyri18$%|rMn&Gc>>uKbcG->sX8ViVBIr!K((tj~^<CE^&Yf-&lo%m zjAnBcE+TtRD2cCAyZfQ{Zm*uAx&$IoW&8_KS4SZJ+e<*+L_I!tg*xop5@1#_=Yv*7t6J;V!y z9#`golD{>A(jn%>LP@Tfbx`FBf~#F4FF2hpucH@wT!y59z6rlVEmR6UBp$*-8td}{ zPQVg4I65v3rYW-+O#pod;*aFN0wzN=k7O`?0$bXZ`L%@_Lc4W^%2{9-a$(0c+st7_ zAs13=Fv1Duy!9e~#{@AO_hZez-<`HBGs@3ZIgZ+={C;u`NgXrns3z$JDs3gpruha8 z+wZzNnpAy75o4R;!AC2TX=bS%We$CR7kN{81QS$`_U$u&yoba4Hh{1eI*gx z`_Knqw>WKBAs+xwo}ZgLL?w?{ExY##`@fnh2Z(A1eCjT6V5tFB01)>Ihp!LUozF11 z@f;jJUEA&*93_LGan7$8hBGW;p%*&~Ql5=h$*FV?QzQMzb2GP342lQ#HFDp{JrrkZ zKnZ7@pvM?E7_fStwvhp$O1XWL6{hYvL)Gz`}e{W0M!-h0|Wb|ZEa&g))yaJ{ColzIpGjg;|VydibkZ zP$fv%DojA?I~r1z!SBWWOC@FeS>Drs$w6p#5{LmxV7UfIlpuC9RO=!s?fovVE(O0U z+T1_iF)Xa=MGQL?=t!}OiA^r%ZZ0H{9SPsmoNi2p?roH0Sf10R?}sV?k_Jd^p^BT_ zZ)R*0*+TXr6~a`S!b_xCdh|_nMOP5gU*tC029d_mRgAFI)NBGKtG%kU%Ly(^g}s1K zS&rNpc0i)zmPv%X`w%nC^@6V0oW)~dqLDow0nJPBYtXT_A`XU%AG*O#x7AB}Ptq~jDcO4Gsn7?qRxw&(_ccbtpQ z42z0m9m+rdACdI0AmNrD!?P8~P|7#NnFZTD%R-4x3!ltPww1TzUTWhxSey@?^# z4?&>@1c9UfDv9&<_}zvnr@yIC4RmlnAm5fAr#zAu9DG$>U(=^<^jKxuv(e1)Jf)tx zyi|&iWO<0pbV`Cf(GR8FY|C}6)^HZl2hmRqH~{_2u;;mr;DYg$Z zV}%SBSN&B{-pjH;$i!{^_Y62q12%Vi=rC~OygZtcvYjLQ5$MNS&h22$u}FZ-sx4HA z2pz2=6ykwZokt|l>0KAwySYKj+y$MyKWe*fZi?)xGw((qQ0a>Ji9Ky5hG6$UM#o>} z0P4QLpo*jxP|QJC3AMGUiX!A=dFo{@n`?m3 z=24Zwe7o|0wG{UnAZtQy1!K@X)}lx5mbciNx``$l2IwvgyDU3Fl#if#1zR6Z)*2ll zoW0=!FFRq*99<^*>^CU;_#_j?rbynMdd#@|`q@_qdS8RD5~JI!*c# z?TB3gz}$llOM-bUJR9EOIlM=Z)%cXuTY+ScUhNVaMd6fGmTJ|5+i2LdCge#(^-!3$1M4wmQ}`SY8&L^u&O4Ey8Sp3P-IorV0;x$3<2wCppA|rU+#g5W zET|y@bwMemea10tIrKmK`9DB;-siR2j#hv4d>(rdBgQs4!k&Z(Gn^Y}Ez$XLl3*^& zU|Z*GDq*>$$i|H^Fda>Lr(S8?0ULzQblhAn{kXA0mV%ZCRxB;nUWg@?IysS!6I{jc zB3{Eo%E%F(Zsmp9-d* z?x>0H9!K61s>#mz>D!CCLwf>ZvC&bNm)ac41T-}8sfsY|at5oqPq!_vMu z(()4?0)rxUuOHHT!FymdB6Tp*plWM0O8Zj=7L|ZPuFHy{<38|9n`stn`T}ELtb$JI z%ntA|az_iud{liivY?7JX`fc&+Kt>;vQWdxn5`}y6nAEjCQ7fv=QmG{Z8WkQNu11i z>dMo-kS9woubZvv@@-)MIo&3__sU5YCq5#Ix2Ey?zOErcXXtl0ElWqXwj-&#HMHDj z_xlnxOb(Z7@h(4}Ui45u zk0LxLkcF7Ntyejc_G**H?ht{fv2C*CjL5x!CQZThrMualBf5?A6@0!77Y|YVo)^K$ z2}-tv&wN_ldVs&nU7A`wZ(l_3K2cD+R*$>$T#wLa)OZRx)?K$W}()7ls_xYjt9X9(x<$P z+~-a;-L2@ow#|sHXsU8ag~VZsKV8R5A3%$?*1OIP9aqJkEX=f@_TS2j?3%?pc3-aY zeQ5rV?-0Or0~^Jt zV5Am`XyMSvNq-JvcSMRpYoGtuiv&ZW?q&chT~%n>p*yLAUDVS}5Y%Pm&JsyvVJnxBAuL#=UWi?{!kF z01K8Kp8u)wmr4PHp)^Va&2_O+BJLuIv~D(59A@(wjlZ*-JocMHCQi_Zu9jSqIUtAw zrA9=)r6nPmYnz^IB*ZCb6J>-0kjilmpEl#|$0h@zgEazSYLi#^>*|Q?^;jT0J<+{t zJpF4(VpAAP8d;6&7RXcd)1MT(AH3?++9pxrez_`fq399!Y2i{m>{RHN&ibVL6*a?*Sn$X$ z!9EJ?0BPC|@#t|aNl`gfWPz5~Cgrqq;RNVuz1ZEnWZ8auh!-=s{wGDVr9#rN9A zSP{+`?`ITL*dgWZ`jI_0Hd_7%+y38V$199rvAI_=R+Yi0c7TDwx65Xd%;ws_qUfB< zf)NFabVFD2=!=Q0f>-ZHBEk{8T7ipqAMqpo?I%aW##LFI?VMTKRyeCSWhU*FGNfk< zz+RW~Wt_KYKZ#zn&2sto_Qbj=htq|uM(5qk^ZzxZvEUO0cTq%JT$ErxzMoub&*6MS z{Z1kniF9FD^yrd@wzX7malKZ7$oX?0H4{TN>yt^%!~)MBYyP3gvIoVdpqFw>nKg=* zGR2U5y7sRPT4WIsJ|XmN-U-t&YBu;;Di5BdronPPsT_%L5G_zpT(M-cyvvo~JzQ3Q zA1-b6d!$D3FgRlB{yb_wLxEv7FHV$t6d)nndEWXiH7T4DyP|WSIbvw&^KwOXN`~;C z(o_3d)Q92G#NP#R$wNO_ZT);w`T?FZ0T&1MrKw`gvg5)5KgCiNd$Y#;S)?h)?x>*6 z5V;pIpSoeerl{*t&FJh8nHjWapZBKj*2w@r7~~J=X=eGjCNE@&b6YskPyn|u#25ygu~Q0 z;@$sKUai1s$zpO}Xwc506*egtJ2Nm!y0Vm|{X%D@Po+kA@UKZbK-2_5=2q{t`vZEb z4xA^(cs%0^g1&%>omo2=1iu>yJGj`@((h=Hjbc?;x8%C=(dRxn77CF{XIy7 z*+-j%@wy3+7FNnLU({l`ODx%ee|*uv5VD(w=7G`4Ee??)Sl zuhP4}6q>QdVj`m9(h0(k;_{%60tW4>ckU_AV}-~y={e%lxe*bJ`2MsXWxppWezp9W z6&oK!C0T7!DJ$rX(p5FG|xY`F1RJ5=u1 z|9PJd<3kM|ocy_)dS+cDPhqA_n5904*x*Jls8!KGJ(<8GMo_)?w7-TM^k9)dLyK}u z0SVi3-^-xDCY)(fh!d(j=S$?rofIHklB)4}1TGG|D#V^nT63Q1r4T&4H%kA**{YH! z5w=rvSmll!iw+-n12am?^DCT!RKI0^!Q(G<1_ z>l>?*^zx7ugIgt7(hb*aZ?CcYq`4&bCiTjTPso}}P2RY|5s3?3Wisndlo(MKIJ$T- z{I99#`$ZJ^U1$$g`o>s&L1d933tRLE$UhHV`i|Y!V-bi_-j8NCiXGu3@pI`|=%7>{ z-@BRlz(x92AT`=&C^do>c`#ygK-gpUjSpOxxGEx?VVdc%eU&@Hex{=nZa->=tfLt# zs={aLOq|=trUAaF!f5+w;u&8^<`I~b?VbSPNaL6+l5Ws`>Q=cPJ%PMGy6`NlY1VzL zV#7<%rg9!atdEtwLYV1(#8BKX&qAb+aHC3032L+9ElhnU(_#61J@( z?HSjR4X)6fX=1ApuKv=lpe@f;TRxbT3UffVqM4fN?=bIpM@WFaV&f)m6x5#olqqg!p*BY{x^=K8{BXVT_n+5Wz1)|LaOEE%fc7eNLGM7-6$pi{c8z6K% za=h*Jge7Ss942ER79-yOzG5I>qhDc->nu`B8FNT->Jr1KE*d3Cptez-_Y)CgSO zi|k1SLg$(rYnm0VclF#@tw{L;i(l9qW4s}t_?!zOhPW49AZIJ=O%MCwWm%CqoNX#+ zK+U3VkpV<|--d%jq#B*g>krdErk`gkb*O;uV4By$!p18jaa~n%#ip5zJ{@h;xDnO2zEhPamNX7J^z35h6)A*5wu;<(L>RB_{~)aU%t zEvaR$>4DP%lbc1E4nt)rVEa3UYy&eXwPdy9+*8S0^ff%}3M5E&1TNUXLy>!VdXKf@ z=p?t}Md&rk_s6jP*BZyR=Y9HO2H2hSve@n1hT}7J%>>M+zIR!Z+$Udz*betlat)&0 zhAr{ukPy};?l_hIw*hi($Wl=%GD4?s>1o%-L02=*8!bWPy6pgOXs*`AO<^ z@DJ8M-`x_t)(15H+6nnMD7;=OB%jSKEdDGfBl0H!GWy2|Zd5@9Rfwm;UveM_to#y* z@xAT2WD41OG#K$E36vB8bUe~$Xh?%wW{cr9mHc*Mv7D2WSN+x%)o*xANZA*xb`;w5 zY7X?dh$d`!K2AKDcaWS;o(DVi`eyZ2U`}wzUUcT$C$+t-n~31SLB+@4OjBn)4|v*o zjDotxG=jR%Yffg|9t6W5PU%e)hb}9yTKCKQnCD*1VF9#_rNQsDOSF-4jRC4~Bf=Dl z?5|}w4X@0T)1TofA1Z#;5X?ZQc;(ovK$c~}GbU_qtJif%6K58GF;+KfO(F)kRQ#O>duTi%pb3?aAdzc z)sPlZ9;H>6ep|-wL-!JS5-YUCQ2c1hKB?)$c(m5%#HyuT2cfe-Ed9$=8OI|&47P<` zx#5Ff=Q|S{EVT?u4`X(stJxj|-OU8?S^DNu2?@bDazH zb$i&zrU$xLk%U#7VHD{|sV@LgsC1`W8ZEh`@=-3>a{!btJD@eSOik zwvAhMbin`SObT^&eURQhQ}$lkY=ys6YW$_JR#!G=KVn1%5RuYZdRZ~28Z-c}Sk z)yjg{eH9)%D;wCv>w>{>Yf8W1cW00ewdCunh>HBOv-4%T%;}aC^tbfWpz56bHCK2x zrkbVN>OWbkf4qPI8WCVAKv+;}_hpp*!enSr3o5~)Oo9Ci*%5k(={M;zu;j|ANn0m9 zlQ_n}u(C$*yhPpVaY9*Ti2OrEo*~e34 zAd2fd_krKfG=fybkPKHl^Q4*;`(oo63T=$S2Zp0hF5lkaq@oXzK)#Ih`}txE?~-|0 zAVlW+@Lo&V%*Jh+KW@QR@of>@1V89d2(;mW$^CVNzU;hq)tmWgzp50FUD2(JjMjB+ zf=&*^(9+|*OvNIl0~1jYmK-gt0N(6D7jADYHh#6sXA3UOc3jP*4xry?H6=R1pZg?6 zO{?EX?fTrHsoFQUhe3j}xP)({l<_I8seR`Ynh1OWUwk(bUp3MaV3M=DJFjkKkHEvT zDMfMkj6q@L>1MsmeCl$U2M_9FH;8&tmT3#9E|-KgPQ`1lIVhxR23F9Rcxx}NdKsR) z49YC8$wSCJd#~}lNhuE`Q|WuN2F1WxG_2EJ&g28~y@!f%$&bHYf%I8?K;0(Hn1(+f ztgrerSJ{!KM~jO&Ci~C{GlW-0tuy6 z5ml31;A~GhuEoQ`f|f%ay;xf*K`#$Nj;o|3+$l}?O$A+21ky2u2%GS z;o{r>3r*)SU!ws|H{F73DHHJ^7*_d#67cFO}bs$$d_eo8SNT7kB5Al=hbM>fd451r@kW zlW|8eB3!Q@!nHh;9QOp{`m-3_WVY(Us6BqhTGYt86c;QqD9umcrf{;E8`FOzi?{I$ zo73_ARm4v99eGlU!H@#cSbCSJcLz*?WVlzUA|Q~3U4eL4&;iyyYG-;dl9XqQ4E@Qm znGjS6hsfz?KSh)Ul-u5rqL<`eN{k=ODSbWzPm10b14RcF*RF-(M%j?svYP*eq%~U+RVuV+xKMf};3%$F3 z&0~gz&1L_I?tJRCVSmVnZBO50>mHZcA)=VcU}}GjuZ6O0<6ND+PjGA!M0UL?lJ5B_ z6wdXcFCERqy20J9u(*MV^+m6N^nRF9rTYiLwKjckrFds-(dxd5r?As1!OCOB6BOZD zIK`Wd_fz-V2U8I#SLvy~vLeZ^6WkYx@#3?vZpM+E3kwf5 z$p7f_sqFlu8XMS1021FVvZ6!W!|hju%7Vv=Zp0Zg{ZIYSU4@EnZ<-aiV#Eo>m%+q{ zs)A>RQ`g(1(NRuu5e!PgY6-Cd8dKvUhS^3IgR!Jwer46vUo#c7%>1fo5>`T$_lAbF+~n+KNahvHTqQ&+I^wfVIjbe7wii(xa$4?9@3yxNvKD{&>*8Uj zF~fKG(iG`QOM);5S@i5XzoA61vywn{oO?F2?w>xb%yng@irV~32mY&~AAUq8nQOuS zVg6tan7zVe^8y&T2FvU3sxH4Nws@R`K5kB&C3w zG6``hW+gKm9jhqbR%5Ed{5d+Q3?v0-QqrM-z#yMMAHg9d2Yj$io-8RuGn}5O zahE4az(dl%U>NwGrm3;@ReYwRVvp(Og$!mZ!NSW4nyXw*hPXJD5(wtHBSS-}@oa$^ zGqt?bS2zZqDjW;FnY6_~W<)agv*D1PNco=G{rLU5?JrTwG`0 zJU!j6zTRJayzKNAyw^p3sJ3zc{r5=o?|&YWfDUey`?I~VpgcWn3tHB0tL98{)J;j& zYr3@iy(hN>aV`_#p1KhwxI$<_z_4muDQ?8i^oNnZI+1q^01KCKoWapOs@VXpi%~bJN$$Vra1u9Ot`S zNHu0xoM;jwKH7h^R=%*apZuF9Hlcc4EEx_^k>}@`)d2*5c}-MG)MdsTA2pHhJ50`c zt{N^j;|iYxe2VTuc4$BL%ek>u!S-a3)p*7PRm=VV7@qavHt*_orBr*lhSXrdw>cE3+^R<|u&E4DCLqNWuv72f&eiLikvUjfu6gCU|XL(;`=WyVbm4UO)zhlK2>N!C(RQg z++;E0qehoi397I+u}@6eU_^G>1Ul+&mJ3A$DuA5i9x|DOcPx7;mqy;FNcSpF26AuK zCfGVqFG?;s4WjiFu(ngO);|t9WhPfD<=D&&=0ZOTH8?pl3a0uH<&T{;U*EjsrW{Pu z-*J7#$0S09aKI?@%I0x3BBBzmRyK@MWjlP88C2jkGTUtmoT-vH#a8SG{by3(@0+`t z24wBDQfEQ6K(6$(qPDl0cuGR9&gL}BI=L0IoS5LCAyl%cJbmZi;$bR`;&P6vCcJ}gH1l<1UrtSDX+6K!= zmw3}mEGTD3e?sK^7XRos&tsY;lNegIM=>20%BHl(7uIxd{gg`II&Ee`_YpW*{Vu?@ ztu;@FV=u)5#FW&_bS71sjN?H2;ccU$k6QRLRi@bC=U1OhD+lk-j(A;m8(Vty0s~>; z>WRX zn3;4uK1))FRIn+;bcHSqn0*frX3oVJRFaj-Z_3t%;dfJIvo9=)I^X932qddiGg#%J zn)U!C83Yjr&%<#jQ;A}4gY73D^%j-86)1RK?1Z-G6>1laW41<6?sy;hGzjf%4P**Oz(Fv9?WkoYs$>;;0()=bs! z;|F}XtC^Yag;$wY&bINFZXW2_s;^2Y>3_lL=i%?#5<+iyl~-vnWdCH|V2qpMES=5F z$s>^&7=vwM*qL=aW>N@qbWa=MrcZex2>e+}|NLq3Td07d0xdim;L!TmhSA#8XPykI z;VO`kA5r8`7*>~Mu~amhK}cIzoytG1yQk=W=>6vc{|%;VWf`GyDV2}L&qiMzJe!U8 zb*_e=2|t!vkOm2#>8pcd?32L)CEIx!Uc(;s_*id-z8+WcY0(Y#Ojb+hX$wV8&W!%^ zFHhZGo8i8vG?+Y@&-gNzu10z#BT=Z7g~Mzm+!Rg(3;9qI%z+*{_4=_k=QnzG-^&hm zRc@JnD%^>(3HxuH4Aq9t`>p(@)RR@Bv+NmtanP=`b~VZv(!Tt9gMF&QQMQfhno)Oj70TjjK_L?0~vb7KF>Xh4~2Szb@{ z{v_{xB?gH!fBdrI5cp|X#wdvL&z{XN3{`jvcAB1YhD*@bQVki2REQrI}?5*3H0>CbA$FN*9u~-yS1b*H{Y|SVS7N6rIm`? z#^Q)n8#;@dXE;_E&FF`O_wtq4U>^s`zFE~zHiiv;5qm4MvDReQycvgOlR~)bDOU<8)zWquC*v#rQBd*O0Riat5nThhJ9q|Ge7f4K-P8GhBRT2K< z2K`?cLZD_A;q8^;Vd-Rf8E{m90U{owr1;Zq2EOhUtoQyv9ahS>MuwK9(?-bAo3Y>D zi=i+W_SLP5j>5C{IB2XnwjW_mtF__z=S9#BZl0a2M*StLKI@mrstqKG5!VdPBZ<8M zqZSYeg&z`*U7Mxxqhndy3B?{jP55@q2VgyjCD8i8SQw$sWz@N&|A=35@t3zI8TjHT zO!$OKV#*xQ@;}UWK9N8qcC=i}zN@GnW?=bawi;IULi>uJMj(|YlF{rgsQLGInT1E^ z5};@>1P`GDXL|i;VsKh?Yu-x)X22To z*$(b;Am@-)Aq&<)rOZNOoGy|_>@9oD{!TzhrlQ+5%dGfku@D_7Wb5l|oh?Ry9-cT> zh^vCX;j@Pl==lZ@9dTkG0F$Rmy1D2)a-A?lllOxc+ZBkW@gGoFYdF|6*x5@|bp7Q( z{eBUFV*p_)dMXZ}48jCgc0`n`Eu#TOm<)PCW!z^yNN9;XL28&Q`bUWl0tvN#6mbzC zh84LXHA1`I13tr}kSz6d@W$HJB4UZ2R1YMOt|24sRZ+&N0J%C?XP_~AaIoj0^DynQ z$M2G~F|Pt6TkGShPSqb&zlWIk45$$9&Ltc_j0EUz*-TY757c1u1V^Bw{CrQ}0J>Jc zJFNZx(%0^RKx(Sw6>Gh4MG9sBI4MU^x(>SdS`@>ITcw)_m0X2q4N1YqjfYHP&t1VL z0aWn#q0Ps=h}hXElJ@tz;SGk2224dbdDh>vl2nK6p7&S&3DuWh(E>f_r98mFpn{4i zPe-WXoQHFiYa3Bws}s$Aw&wW#U`BxF*teHLmftm%_oob=>?h&TXFZeF-Hpi6` z&s&ULhT>chyxm87ZlgulmmzFa^hv{>*ejao$@OjMn`F`-X}>p&e6_r)sKR^48g!QI zIwPeB#@H(+ ziBE|IY)dS;kMT}_$gZ`kZPs0Cd8M<$hUl9AvtlfuIq%idr0bvOCY>jFeq~_Olg%mx zido&7HNPBOqG}BB*&axhd*@RB`*DpVf?QNaNGyYzg)S?c|%XNO7Ml3ph_MzQ*(3L-5msNnv$WtAbxMNFt(0uSR71axmIk7D3 z<3E%r+kF@FZ7v}b&Z#Fo_hA&DEdk$ytKp(s{0~fyl<7oO1WUubHM>1&{}h4lk&2f& z>@DK$Isv=NseZD51rT9e7DZ3l&2)RGG_)UY(N;Wgz>s$`#XBI;xQ9gSOOgBaZX z!c6-gnz(yRhf1qNm0uHEssihA(5m*yP-0WDLHnu=HG!+0zRu5hQ;2_YA&fc?Cr>^j za=i7j5prBA8yNEa6`ae%S@^S|1gmSE$xG_`855MJLvOD)Er}XW-lH|P*%iPqZ0}dU zHvVGKJ$8a^M+mFxAdQvS=Jo1}usD!t^`6`}&NGcjB-BJ=CCiD?WB~KJMyu;LYb^X2 zPW1j+cO{W4YOQY%dyyt>?SzB77JYAES>2KZHRe+aInB!BaoOam%zs%#k~9GHKW zOWDg z7uTeWxqeTwTZ=Ox@0*aU^yRVuFy2>pL1n8Wv+M$SAP(&)Z_8gDR~m?D$?svTNHGYU z!@cI)3~;%SoP1^RZ7kP*zZM&TC=R(zT7@TJNWtcq+<-cE!pttlV4$(J2JEdPxWa-p zD)C?)Fw$#9!1^=9ZR3uZWOGkuhXfQx<#?S&6rzJ3L!hiIfy)uSgHy470+FW6Qjkkw zuZdpL;y6kP`t+G5ryC*Vf)#GgiF~Ob!H~oLNb#2gJ02dwR8%l;5F2YBF%wZq)dh)D zAP+}l*3HkSW6jMqg33(y51 zQ9K5zz(nszy;}9X0Yums9;Fp_o+4S=>z|2}GfUz^wu#^}C8IudjK7zb!m*!3HdiM6 z-D^$qLhQOpn?J`+b_u0{QphZOS@OE$oMcW&%RI#2ttvc7O^p$ReqC4Vvl(q3$B;s* zPP3dF+8^_UlFmI;?+CuP9Wy}16o}nHe+6K-DEi8 zKu4uOvbjP$C1 zd_o$~2Y3;P{wl5Vsh7>eL;%vEFM#c&yQ5x@RI+|NFmG+G+fO|%#|m8d$3*7d1SC;; zmmkzkORY|zJ8|dQJ({nYh_+83`Ect=)H$t;q*57O){x?Z&uB?{eRa~H*puWL5iK)? z6oF>4bn0OHD_lhh_N~ghOk1VXo^x$3mtGEyc4{&Ra5x4VtIC|AN9Zmh{k)rdfl4l# zR%%vpi$V)Up-f^dP*qX)d<$Ps;miI5@o4RNp|cDfK@-?$Y$JMt$oahqf~4suM>RnE zs$t+auIYz_$iZQIKHfqLX47#?tmdAcU_5E{c8;|JQm`rV(D16`V*zkF1icO(YyRmv zWXcYe%KVTr%^Iz>g+@ZEDiTGE@6O36C<=9b&< z^!PUJ`#VNsj_1uhR>WecU(uQnKHKa?zdIV1xlPQPfk*7+1(i6`6m#zeU_4X7b-3={ zq%KIUx-=lo##+Oa9}Xz^nKYEk8bvD#;AZ?cpQQD8f8Z9^(CHa+3Yy5|S}5N!81I`2 z?H6i^f`Fy^0E@wm`Q3@(O|wDR0N9Cbpj|ZEZ=%2$o-fNEH@$}>26j%@Vb#6qEkQEA zBkshju6xZ$PvNH#d0bG{OEZAVF!af~$o@<4SXo(6K_j50gf2IvXPE&rI6Hj2wmX9> zRR+JVIG+cnXLUP<9a?&}xMIEcgFeJTpLR5@H#+CH{DPrlIBLwnti3V_to{j&R2&z3Y0Obknf5k7JltsC;J`+U_(ZrB z48J~*lEN{IWKU1{w3Z(>!u#GtHja+c<8ro|c3NfCaV;X=i$_f7KbTN`24*DU^yDIg z337;VTH9BGZ=Lnzm8h*bDZg%Vg%)Jse(Q(B8}m(oBASSd#5|lAsI|#iV*65Fj=%}I z#Umw(Z$jX<0EnGAl{S(7tmD_pGjQ_^`F*G)xwRl438pjKUMJuXPh%9}_V;Ni&LghbyyZE-xkV7K``V%BgV#o>s8= z5HQyUXHKEn<`_=T{MF?mK@fH;4O;GRdEi}7TEShVG1`|q5_5@X)`c|Yze8B;;!OO} zr|J9Fvm#!M{TV^YR!ze(e-qp+=r2^vt={{Pzd^pwEp>)==kg3ucqv;SR!xop(ER0i zHATIa%63u8fr?=E9A~yk`8xMO-l1GN+XkLFh^L2z{*X&a?dp0@-_uc4FkGQ_+U~Re zdpW&tjVy>D$c9=j)rh`sm(SvVDJp8nrwdt>lWhln23bqmJ3q&-g2nYq6*kdPTgz%| zlS2{K=g4F$@QbngHJM5#=^WhE4!GWPtS`J@i@YaC9AYqbQ5@p$mxHmoI9 z7c75!3?qRHtnx00RUrm8OZ5vhl+T?q>x(p?p;UNQ?03isXqF7+X7dQ0xqC6%k%#?K z(4;1$3v9Es0}|>u7tmP$G`xC6vxQ>6F*uc0SzCRpx{522CS{Vkq^-T&)(L`BWwlI_1_X#dk5bMG7p)N4o8gNl zFs|x_F#`;xs(ejm8S$Bhf8+WuDK7xcs9{sxg+ry8JP9<`9 z+P{TnII$LLEyf+IZMz84b39N_%rAv_7+?ZcKks^A-1INEA5dh)aNI?}fF-Qd`t z9r5z;zb>;hIVTs@0Z!O5Warz*pICJAqiwnvzyJ7=N$tVo zumSgBmM>26>`0+RWQ&jLB~7!$v9tXU7mMyfk{%WvqW{CzTSmnhW?9=+c;Uf=6DZt* zyOZGVPH=a(!h<^@1eXM-Ah=6{ySs+q?*3IzchB_9`~52TQ)}@o?)y1s?|rU=Yi~MC zjMTS~965moujXz}UC}}!5)s%A-=O{NpEI6E^{DKQI4xsmOTXrBVpq@fe#4>nWWh2E z?el8J@ber^o_U63DPRRs`{xRIU*Z7kaq_}=8k?pLi@4}CMG8-A zHOo8IL75{iIj5h-%iWV~UDH5s_irToLGS2srFEULWJkikF_Log8Pg?GXUmAxNR#gB zfA;jZOQIQ)W)fZ-f96ZsaE$l4yf)^^nAvEMFm9v06nQyYk;_^)U3tWZ|N$BU&JGv5D0vVa9SAgju$_`!H#oMtN6 zvV@aFcmlPdsDi~4z_ie@TzwOcnyYHXC6OHICiy+j2iYGz=`cqsZHzd#Cp{MJ?9%3v zwo##zM;oZ+Xf+l7bxGJks7piJPHgSY1<^oq8m}eG%Q*X_wS27lJ#L_-#YdtOx8rXP z9I$-zXWlSbK~&CVCSja6xZk1l+i#qnD+Hzg<9))4B6ygO zG+zE$k<-O=Nqy3=0WirVj|!P_MhxfNoNCz$C)i7ZWGFGW zOo#8gxRJa6-m%*k8IndOS*X-ZdT*%`fc%%W0@3f()K{ z6DtjS#uSuF#){mK8T9aVJSD`Z!S#K-C9IOTF0g*aEwH6X-`qrh*)Qa)|2zX;3ohMQ z!%mo`us#p`_hOHqDEgT{+xc$?=Z;om2o8=jOnW!KXLeoqv2<9)cwmME2ob;q3t^JO z1I5=m%aK<#`IRF)8|}iEv(R?`0J8S%9MuT55JLn7!RL@t91zNv_^&e^pbgW1$Qdxv z;@5V~i->jHHp*_z(w!daS%8>~VBiq&0J402Z{=$Q+nQBmw-|FP+5Ngo>0;KuFF;LS zaY|N^o9suCIF=w125(@7uW$rG!I>T2z}G?4uZ^9;@}@Ss8{H2g=Vq(TyiPdAFe7ANsH^Pj)*95v z)LO~kt4*|HZty4JzwU&8O=28*pt7^~5b$O@7npIo3&RN^sP<k=_xod}IJ4g>4ixlX-w2&&%v+%Cm;@VCOUuN1 z3%tpdbj}4Kv^&0`#}H4yD;<}*ONxKT;H+!GL5EsZrjQCn2_1x_vGE)_&|<^VPsxZ_ zyj}R3bq)p(>^}r@IDEu!F=**CbnePRRgMYxN^wex{g_h3+=&Ot2+MMd zd|X$d(~qke)vPQ*%gL)8|L;Wtn=;wP+vqp|%fWf6%fk;IiP!{))bH*f<(XKdqXIYP3+GrfWs9|*%6qhs zA6dP~omJ^QgXbKZ24id`xviJC34|@9YLb19f7ev$ej|fXxp)1o$GR63Xg*P;bY_F- z=L+54VYd>DRX-V=N`LwGpvj78O_%izC^r9N`Q6ztADXyfNRv>6DfmN`As*F>JpE|eAf%3Ruz1MI4CaD5osz4@}yyCoIK>^M5y`?F1Hd6R}k7pku0Xdb>aw3bOY ze(g}1iX8Glg<8DAQ6=)MH8tQkx-c9WEw=Ny--bpc09POMKdP^1IUK4wT$|JuJ%Wb7 z2KLZ0dL)NW7qTQKSb_D8`3_;QBBs&hQiE?&B1pZ_nbyTS?(r^O&w-N={uYf^f8m{D zuivrnDC~cnZw(om0(vKMqlrv5$lJEgieYD9eYm^cAk1e&xmkA?^}(T#_u6mKH-Owv zuZ&i2DRD+-B<^8+)qn~vfjd=Y`#tBTcmSW*%OAq+_K`M3XGJVYZyxtf@@a^|GFC#% z(%nbI9)P$g%#|g5U4F;^c%FZ8A9|gf$_r&xLl)#7Z1@vJ%m3mfebMKk?*UJ@u35m! za;^*i{`~mxih|ea_W!ac{!7a8PeI-I$u7!y=|&=I_0uFNH{o7zmDguol;j`)xhX|D zpV__wiEk)FC|h!IHGG1W!fx>>J$&zo1D2|6O4S+~`l9y-dU%NkHCKSJmb+7A2k6&V zz$B-SD~WWcD>|iy8Ys=I*^4wVn&=L!NlDhLD=|jzhoSS^PQ%s-4~6=3(^$iF_9f)B zwFq`NUc|qsNfZr+t8yGi+y5hmo=v@~BHG$1ZU%Bk8U>IJg=mKq!Xyvwh{>iou(UcZ zm*rHLLy)g=JGNT;-p(72{Sb5y{$eHO%YDYUVkY+UFop9 zW{iSto58q<|3#oXoc7sra!3-hE2kj~43p{#PIZ_C`9Bbo%mk!u7{YW9iL#}stf2Z% z_J>7*faUX`&HU9DJ8af^1ZV0=PZ5Cd;@@oNGHS49@Q0pqpjZ!8)1G$r~HuFHYP`8e@v`vJI}lV*n*$3yq=Z+fi-eCZ3El< z$ogJYZorhqIj=K3%*MDuY^X!y5!9lb1%oi*h%IDHn$2{7ISmTg70R*hYH(LNal>k2 zz%8o(zteF?=!iqR9{DUPAsTG^la$L_{Ukel5CYgx`V!9n(WLf9s*f5%st@KC_4qoII`||#daSqk-juI7G6rj z25;U5+Sj(2A|-h*MITy#s=`gZ$#CWDt@>#&4Y?Kq6J#^r^cUMligh0G?VU|RtF$Tf zUhFxO8A?%mrVuT|5%rgDzQ=>qLsbw)63AvMy>u7*&Oz z9qQ6s@rjG&>ATekN~bW=u+3>8A4B59XmbV3+OzI;7#hNfL{PzgnNL%7lVIw2#iV%R zYM3^Sm}ebZ2MiJ3X#L6u_yym<{marn&(@`p94p~#u2(>ni2Xd3dPhpVFptCp57On| z-PK9D;sR@(Fc-X#yl`Y1fPsgNfB15tI8y#7RV3X$$kIOSoQPn5>T8-$^eBZ#ncF|Y z0O_0OFic6nN$Kqulx@1Br^eS; z*vL#uK~z(kZ1qEYS)t!C97*;0PAK-Um9R5h$m9DwSP|Xs`P(s@lOkqW-+HJ;x3u6? zdE`x#B9HUNB$tY=8iOYKOj!--?f>%A&d6JH!?^&ZZ-~AuX$dKi)eY!1UY&NrrkT%A zb1lc&5nm(`n>avrTXd#;Y?QnnYNO*{U}3K$7~!HApEApD8wqi9Y9g==27fHFnv?*= zAV_01${?>$-TO*700Bh^ODNCb5jYD^JECzspS~g7>|N}2ufP~^(#>uQ&ijV-YCsV} z$`0!~&Rw^bzoVK1W5HVcur8~6)fG^O2G?O05sj_~;eYwD)&FggAfZl1!>pMNhb({-fgA;&u4It{3khGnvP+2#XV zD(moHqz+WsrX~|GNJhp}#G2+%azCNjX)lrGbDERe4ufHb|hyOZT7h=kDBeaGG-R{IjQ6 zV1d~vzb2S2KLV5_L4^|?Z&{Ber;B--oY@Cm&t~}n8m+TrVb%L^^am1l4X}C5%(eld z_y!mHtGq&#x94-HtrrTnMte~d#UQwzxxZy>#WG!O-)C|&sPFh>0;i2O-j+}zFT+yOE54_{p@>VAhei-#1lHEm~iZU&_i;aY7fmmBZ$R2d! zd2Ku>{C93w1RijguO)flwSr{yZWdk{fO_&iYS=u#`GIGXEWm&V8MD9S=LCPyQxF6}BC2M%rj(`jrT!iF9&+A~$} zwWF`TOHP)=e5bA1R-@9W#^5-9ha!mng`qV0e%G!z5Vo|h<$}0A>EU*d0ppI}cP@(P z$$?k%VOjvSDV|3*BzFnvXdbkekZ=wR>;IX|USbLP@XW+~7jXPke6rq37Ef6rg@T5= zKEclIf}^o>xcMRFXwBq|Z8m4UH*itA3`TfJ48=?*_6HX&A{CY>Q`)yfY7coF5_5w5 z)Ovm>q+D-*U^r4Bu^aCcWtj{TQkApn#8|)$ZHI`K6R@e}H9bl~J^-U}wrGju_FAs8 z8}X~YyUdDKmWPpXsbX}oq@`_jUEZ#tX#IShvOfsDHKcNZtH_~+tpp)PA+dd)W5E&f zFY;y@Dqe2Ksv}WVSO2|=yNdwP5{a-}An2-_9ZoOh|GKMmHlT{y6A}BCNt#WVZE)VG z8p=3sA@YS}TwFL3aEX(7yyxZDIN8yNzzme{!h!z#BhVTyjbD+-yDa(7n{ELp_r(m~ z*C3}Vg-#|#ZDd?6n~I2I7W7c#U=g*Ja@FBK&e+iwAxrYpCXmS2XQ)dW#gc|!8`uP- z1D6f~pQYgL-BoPO$Dh7>{J>P;aj6Z#Mb65QAtj*K7pdy9vPe`ya)FCZk!;=V{R7-c z{Tsir;OU*3A`+&>&mfKqqAMZIC^^UoJL~zb`W1tS09Pmshkw6UHoLjevV1VCagtsQ zV1|55ErjU+&MH}oQ*+}=IQ#h}g(-{jaN)GGBO-Tu*VuJk^y8zzp$Pj?39e4K{vp_n zKaRCh;2b|>kh$Ya2Ww#j#$)CkcSuEx3u&SC-wY^vxvyDqN zBA1k!jl5A&=i2^`;XTKea*glNhy{0YbAetzzDV1r1g_bJgI5x(FLF~8CS+`szlILT z_yLlOYrpcviHxmhZ!SEJA8OT@dTB5*r)mO;HO(Fo{gIRZR#&GC&eJkMNTzwkEC~HE z{L(ee&Z|1(&G_E4CJAv6(axfTTP(5~4PPwrBwL)gjDBOMks-Y0XhrX8BCq3S$JydD zFEHcy%q#Sp;%(jmhdq>3d9$9w4IP1W=nS-98y!b+LV=LMjc0Oz)HWx?j6lXktp-#j zlp=0J+I4BB@XDwrwr5z+3k%i77TbAT0H$69U`BZ{stld-&-L(lbQO}F+4PV5$2NRj zf9m@NEblxgfr^qFi7VbXKaHP$yKpTg-x(wEI!%VkrT|yNOWHXPns5O%*U8b!yCnhK zm)}Wf?6WauJioTxvjnTr@A;>J7gt>#k zQ6za}80pe%LeMG}H`Ic(1uToswVKBpFFLSPxx(7ybMb~g7EgUVnPsKTqQ zA#<+pRCjwmE~4q@wD3z7BJ`d;sJj{GIZ`+I@=I%RDO5~+zpsKhO7xJlH1id|>o@^e zlwNw>7&vTM|0M!`@1|={U*M5!vjY@RYwQKzr3Xa$cJ?DLA#Jlcn7!%&u;)oj3#2zh z{mgybN?3XTXODzgpF@^iZoEoz0PMiuBI6UV&M}t4+~g znS#xHk@xa&tJV2cI4@?1SUT0SPZ0+WV){2u%~OeLMU`K{=8u#AyqrvO6(Hbk(m)Y` z``+=Pkhtq9GqsX*PqU~tk;n*mHILztM>qUWt52rQdhhx7doG+R*+Zb{6m-$HCe!Bp zf|2qm3hvUq!S!Tz{@x54SO+Cy6@H5}nshYPc zOG#3@4@0s8%CA`rr-rGloVoj8bw?SkpNgk8Z)*4Q4fwYU18q$lq?71hFdDXF^iIF z=hQy+4)QT@*pGX7B##oCvNpwVCO?>S#It?HaYFJOM)&F#=N|?#^Vds%zHzV^7hN znlW9SB+gwCC>h&;$z)OsP#*R{H`!oQnKZIbrpNEq=8^!PfmGgm9C^Y<-lLwp)AwEt zw72?ELZzzB@|rQ#Ah!xYF`h`}$v&oygZAxy)^)HJ@{np8(WWu4G(p>Vf zJv;_9>=Xr;2VU;#{P!&Y(Ej_ko@e&41udD_c9899wTHeH&?=~M{?U#!^0bn0Zkm$rQK9zUCG6IonuhM(V`lZig`T3Bc$7tlU zX0!>0?it~EgVO4l-A~AQnSQUvzoIUSi*a@VkmVAy1YBjU?^2{LMSLqj)PTnP=P--w zHbjK6n7pQuJ}-w% zkBN2M$^IOu7@kdj#?{AcEWRIsfSJNuh%lbZPlcR3!EDhxaBb?LXRr+OQr>F#^mZ+$ zHWo?u$+;uz%w5^%FLbo_kE(`9FOA_#gfA$h#%smr+;+(D+CSg^wM_zOm1%&&a+`@0 zal6Q1u^%TOd+RqoWz_laa_PUHiw<0;2Ao5sgYC3EQq$0(Pi1QDmydQNs^j_9R7DWiV)Y+2Frt1w7k0=;P;RzP9|uEPj(?(l4YVqYrb8Ka z?7oBVX9_XPLj7@*fx?4`X7fn#Hs4YcuF}qk5ouv*%BU0(o0+iBwXNVWIKPBgy;Kb~ zBtL2O$zvttyLvhlE8cBzEAqmfw7_4vkOl)w0-q;Cy~f+?#n=^}23$luz0C4^nV2TX zEIU>}SgWNF!+0f$y5_kC<%=01(Kuz>kePXP)vTRSebyGYOAt8G3O#$)QLz{?jgq;% zyEqP>FjP9HUI$?$;39x>Mt4W6U`zSuGRqx5dXMET|Lis%j;dByavj#}ni>P!JTbCh5i2PK$~L|L7GI&K9;d3` zFoZ^#$QUw|xw3i`+U?81QAZ=#Edm$oC|1J^RQ_hJE-up5{eipJmXH#2{e0On=oI(y z{?JY`h?+~0y`{JT>DfMBgT<(b-TlsV8oayK3U=-iyV@o_$G{@YlnZbUgc{Rj`33(G z@y-odb+O6ip)aTA(p7~?A%1U% z!cCv)x4XMMnw^m@g?BDP*@#2!I&`VusQ&;R|LEA;4Gu+?hktNBj~SQm$`i*y_2xFe z(t$bLL6NaURI^O!y(154?&7cDqho+SF^^AK&hBO;`S)G(h3=HuPYM7b_br-w96?;1 zB2a{mwrljwBdc{|ciDP7^-bLWIv-tF3Xt+V5*4J+CJ6FJ&>0u+T2W>fAAlXP`OI4v zy@Dn{sDf;7XpJqg7&_9CtLi5@Gu3)b*XvB;h;C*qq!N{-$WWgK-G8(v|2S`t>TpDd ze-Py4-M%TgVyl3;TC8O8=foOi$3uJFC1`Mq&-kQt0d_KmrP_oLbUp#KzpFWM9D$m) za=KWpDDsakIMFHKIw#k6*4+U`^>lkUA7&X7TTIeq_UUZki6GTnD zOg1ZzI99IwN$FEb5{E+r5Y&JB@W)YVDKG6X6Q`H+g26Bm`L!6Y!j?E=ut-`>k)Chw z)Z_KfaH4WN{^Rz*+Jo>rF+^)GgGREM`1JEJW>dbuLqKj!xS^0EQ_4hmh@O8Y{)@ znL@JZQ#r(^x0G=@Lc=u(tdO0I01Ks*SOFHTPS0!r0eUDdyp>ehZ*DTPJ7K!W(zkP= z=dr>49|~L*vZYLGn1j~f3z;fw&*9-cOdVFlP-fUW#P-tXrcF>-t(A*e((?}fVhw>^ zWb)z@j=HapAcciA0j6nE@LFK@B|qCH=MKnQoR(s$^bH1#a)v_5tM?T=y*w^&tUSbV zyY!41mZm5xSk-}Ml|PVFSO|_UJmaI-{doVfg_vazpeIDirhV54sV2pxLRhY;IVSyf zFYI6vFEhGm33_@0m6+mNX@G`e2!S}quP^Z zmjpcP;_T#|saC$%_j#K2*7+fU!R#M!9?TY99qXh7LPB0j&zVz<5OoqPChR(l7?gz4 z!6Tp_uIs>nN7>EGaX8CS%@Ur?keGTYpUC?<%$>=7t-l@5fT^-kd}k_NxH_R5(X{u- z6$9&}{zBpsJ*8ydLSjjierq+F3PZZ6PUBfgo^S514KlWz2F`^rZbJ8pl75P0d1II4k z#Fb|pBur;xQY_AAz2IDrj4Nf4`$M+LcGDkm#KzrXeZ1|3ShjuJG2HHJ3@7aeMi`?1 z*Kif~cw?8X8-v!wM%%G<49~#J|E;wH#o$OkFGo%N42FfedgL51D{7drjvZSGHEj2@ za_Ie5p7T^}Ai|Ev<=|u<5gp_oIwzk)Kh<@+hz;}nyOl8sQikAy>&m7S#s&$}op(RQ zw{TR?5HxBJF2P!jRMW|i!WB%BYdK{pT&xO3&LK?fE$yU~bgoFb*odLB_<6sOq7HZG zqQDjQ5vw#fxG)~dy(BKG{Kh$F%lMTu*~Zo`E1kK7sbPKPC9N3Ibz%993>$2etnCvL zz-sA;KUf=DYE;?AwQLM^#_nU19_B~N56Zfeb86;3vCDRD4V?cx_6S#L@tfea&DF}L(bauS8jo+v_q2O>6ZfuO+9&CZt8+>@{B*f znV&f5qSjAg4l!DAg|hksgz$MJQd@zZQ+Gad{m;&!CERH-s*mL4uoaRU+|*1zoeLRK z%}x=_ZSadh9{bz(OI4{!-M%D*BCbFhrozcPxr`JuB!7%BH5*|MlN#oP(KyW+;_`1` zp;_Y&pJJK(8JotUlI*%F1bp)Y{W_djV@QI=F7N&)!=60S;f-t91eBK5_TiQYs2HbW zhX_QaKE#faRhx;vL(mo%q18bk(l<|mA6o-}?MgydNKAWla0p&)Fnhz=MIKTT=*_$= zH;HuH+mEZUR<{m3T$)3wV6G#Tl)@=9xNV-Qrs(v-1%l79oM(iif? zL&2{#AM1s?dzX<5J@?TozMn7#= zH#sI_T5%yNP>TmkltJ%ee)>Bx4YTwS#X;idDj3h&=xY@MU4~xHe)nbzz4M!8UX{@b z(VM$}Hx4i*&se@ox*YYm1fw#!zCdq_{e2yL@rt@B>f)W_*H{5gg1%(W-hlyiGZR*? z!67SD502v9B6bBm={@t|CqFlQ^DJkVkfSW^D2|{vwx34VA@6k*eB(OVfw_bAdIt$H z^6#K|MIGAd|}_4zdyjI>^V=zi5DFN`+&Z131l61UQLUV?H z*OH6D6p>@m>2AB2*qM$UfgLKFf8HkCPTZcS=`PQb_6|hh#O04u@#p&HO#Ks$mtti|P7KAUb_`?xNV80u=8&t(TFwL$ zVQo&B^yfDK3DHh|d96+rn9^XxUF+(?)ICLx+iU(?J$#A+z*uP~OC56MJ)Fy&CO^zp6B61|Pd@$**s*2(I}CbtnT6N>R3N1wEH%Z}E)&;+e<|{12DX%;fG|fpqki1Z zN$%k{q0I4;)321TAT!$(i3*r{QVC%4BYX^4Z(N^ti;OT){t$7K{dY(XvGf~I<}jjz zh{q$7%YJ=sjm>3@`(!0QAR%G1qZdoiAd`vl>M2I(K?hOA$DZO!7_O?WYs!~6XzU(! zrq<~q>kNdRJOM)PYIvy8gJhqBAXPPbeTTD`nRBMEj;p{H5qcZ1waNyq94jFTL+Ahw zI~Fk#1m6LjR6wCEJRCLWQCga$q~+AZ&93G@JA`aTAZCvX_UQOAbqx7PiZH#If(kcL z@n_wf1vC}QLpprh`0YFrd5XzeJq+)VP$^QWEeM%B7Oc?w*L(BH2xkKUl}?e*2L~cc zn#sxUG8H0A97y{;9uy%A#!6&h+%kc)n3VKkPoEhAexa4oRv^Id8j`!D9e$m(7I`Wn z$}S;xHz*1ucMGC&VdegT5XNs#h+bhx7Y4A5L!exKr!T^+&dJoD5b#W9>z;p}_ER8> zw6^k+=IjN$ua+}Ozlw>XiS08RBTdh+h{~kUs%W{tjVKT`01`|$u`hFyemh{me|rg3 z!#Kp~hhNOqxtRFBx8r|ZlEKFGK#AnGx&FB$n-n4qDJs&TQ|i`M4{;mk3JOZiATmL# z;xs9P=^ybJZ&>;M@bPy~;z4rTItq7Ec_u@v<<#!ndZeRT03H*u^j*c*dRsa35JM9@ zu*Sm}e=E2usFmiOm15jcSBO?m!KCntuU~cPW~~FJiS}ojxpvipf~Y+sps(;(SR2Ff zzAET!R@#2$vmS;)EGCE-Hm@v6LMM&cCVcvuXC2V2P1t*Jec}5P{}LgKdSlCg z*Zw=H*+$?J;3rOrg$1^rx{b+>H%i=(3XbiwYt@Ze!Y*5~oBdLoaN&B*)7=i6*y8In z0xgk9j!bo($xsE+DuciDn<9crVt;{Jj=!F3Yul34+ z`MCLmR?Iq;oo-Vh6aQRa;)2{)Oz+@u7JCuF&g^05iwr7rO8B@iHHgr#j7MWh&BmD7 z@6`~5#I=M(UEamM7?%8(ORyz51>e1}cnap@N#ur!Y1*`V=VRwBhpPQy)-}57aobvN zZ`BC6562UEt&k!O4AY|qHAVCo4f4#vAK6KN(;3U!Fye%0(wPWo>t*7JJbSqyAj&WN z3Y|5P?WN(>V?hM4QW ztZc!-oo$mltbn&vH0~f+zG+5a{OcbwOE{|5?*En84J79z>XR-t%4byeg+;U1`e|{O z@o2Ea@M26q*>m1_LewPp?hj{_;IjgEzE<}OiC3TQ)OOSlJoY%gEB5*doX^GhP0Plw zNEweG2K~+g$*w%$7>jr2zkMn1-}TvmH)9*^TRjO<$z)=}BdrX1PJ3R73otkEtlW8 z&$Bjb8g`%md8>3)CySBv#TQiuM1)T;68ePw;PcqByhOG@t-^$LzZle6f8^fczl(zA z|8*)!Nu!_r2uMQvU~O#*>fnHj!<8r|K*CQ)C-wM{b;ZZ0u{m8|{bgWa`qLGs_q=u* zY8!2DTMvj@$=)U8Gp=k0>&HhLT-scFxLxgiq;u zXM(oZtQGUcz6)V;?v)AGlt;yE1gVFDI`gkt=i;Jo{ryu}@wTLj9sYlM0v$NfAh>HC zF1c+w@u3h!qDv%t*@@(Nmw+FUhu6A|@RCIh157@Lw)n&jB}LLR%70;A1G`0EGUL85 zm^9H2#F)f?t(OShe`u8VsIk?|`6#iKO$6^OJ3eR%ZQ>a+^(ul}sF*)svX^uyCDhap zv6ygCg&6mm->;+5d{+jPd8Eq76v!W!)ct@xJ1tMPisXu&*<|E5;eLw*E#`0&bFRT@DM+aCajne%r-l9xx*jnH^z0mo$*e8+A zp*IJ%23hh|G529Ke8osHO!rIAP)GyX+=%O@{bN&Df<(UPw2il;bz>*)%TYLSIS_gtS`; zuAmaK=$R9Mls9dZ?7qWYdzi%u{`*HA&=i-93b9W!4k#`DJ$=%wJjK?m!jc9eG$>MG zbSPc14s!?e9m4rhcWX%ajB;~N>FL7{a2wdpRpRR@2`?_{i3E&e%rh9s`4utoON)zS z>Vih60AIZq@zp*K(=aD*Mv^kZL^LKbA`Z_s39q`M7Lyna^&_JiY=u9s{)Q`e0sSAC zXg8<-+E&naF-T9-cF$Vs7&Wi=jR@laLhbLZ+=?Cx6MC7K6;X2n)#9L&bR#pX6Bh@B zWUDpuk1bdD#I$y*KmJ1jtr${=+YG^TQZC+4RwS(CbM>`MH>a^j=wpU z-%FrECZ#t#ZTmQvKvEp=jnZ?5!culN6LmWkJLZPps1AI@RQ=4z1BnAa(;F&J7?C~pwTB~NlRE)7Y6}SZ@GhtuG71PT4+C7R(*X(1?T})T^LYj zC{8myavehzoB6l8-W$peK6VM(Dc1cj4{k3OWX(V(hWjLUR%fmqS_K_5(xfg_N|;UC zYPPeRZORnj(JAn2E`EoL#`s=EGaVC(6zWd4<0Y_t_>7S6KMg@sjVSj&5#H(_oneN&r>3ur0oG^atOtPpVLKEDL<~Q=^qGn|Co7GXO+b%}pyt4RjPVPRgvf|qnA9#zgYri^X^QAlN(q4&t z=>##ZU{G74H!O|9_b{?>DwwtE^zUNlUp3D^;~Ma|lqIsClL^LauaHuk`aJ@rV>EXC zXs}|G)J+x0!otH05}W>1-zW2Np-|c(5~TO_WF17>32TJBcrIV4el_ZM$;zJC6*Fk{ zBhd$=grJ0!t#}6NMj@6{2@oh>?q|4dxyN>G9=%&Mo~NG~I{YZX%+)saN3PZ8?**~p z%E0>vd}RWFUR-xbzuvyc`>W-`n6o?oPeXforv!DbSsTW@YH_4Idv{BadmwAs&emXj zCE_I#f-FBz_oGf}rI|5lzYHl((e0%tc}l`g-@GC&i|GPpUfMm*oWrkoqn^XIk7oBy zA4y(ZVghc>aM^ng5){XBZk<5Ttfro_rbq|_P(Z>HVV(Ha9Pr0a&!H6T)XpHy)=p_b z5s;UFMk*u~eg3m+KyKN3B9F>8?T8P;$!e6(8{*E@z|$44*NO?A1tQ`gR6bi`1WuZq zU9~UbV1Bdxb=3>T!=?<@_DUdM`rfzNT7;Nrci`ZK(mhdTA%Dd*ngqj*Nz^Fm7=V&5 zd=Q*Emz@<}Zq(r@`ZvGd==g*G^jEsTpug6kNa%Qkc}pvPCpcL4wFu@Q6r6`)zcZ0d zI|o*_`CY^W(n^TQ^%NKttM*8MS0en?-M@YIWj_{VZs7A(gGHCw9}AQ+Wxb@4$d}5*uFM0ybPJvh2uq6|DS4D;59uTP~Xo z7=p|EIK4FGXuJ)0qv$N#8)8m~G|X80ZDudMy-bUxyv}FGsbVJ)cW6N?n#97lpykny z|6Mvy?dZR&hr4##E?E+`p++~g7)uR`)NZqVFSydI)UDm3AF$1T96?#oLBtHby88S8 zS6i!4=*lWgA(&|yjH(ui3?F{rmGk&y(;dLiUfvZ*elh`i7Xl4%5tT=Dm57{RVxe7G zAV?o6Jf1a~9h;;E(c@Ygp`W=QD3+p9yG{KhjR~sNo`?J781B(uoOm$tb+Yzu(*Kzx z?vz@QpKJN!^%-IM=cj4?0D=CPTCM*)y#F!}p`BoWbISG(mCLb~My4c#9g(;Fqr_xj zOS0+B>CBK+?f8q1UmnQ&t1H*?2sOn4`;M}OJes)kdG zHpMr}O!yG*z6x>Z^uN);uVkF3*7PY!jyN2KngW_kAn&iFnzx#V3(a+~K_L3wwy^lKg;qx^sd`jZ_OiVp> z1(l?PR0BgUxQ=xTuFE89U_QI$@f65gt)LuI2R1+OgqnW&P9Mk;r=onhNxX$G8#VSs z;8x*ni+}x*&?$3QSunlbiFoswnrzDn5)0D_3VQ0+ys;)^91)T#Mmn6q+xux>K_R60 zy|x^%B|=e%s546sjK(u7LnLPtW*+|mIpN<{k zwtxxD3{GwNl1PAoLg&@H{l~dh+xkC;79`Qee$tBRlk7IWHu(rBGT2GgQC(C(-DQCw zIK&|28GhTk%#SvIEOJYY8Zv9_c1_Np|q}sHp?sjAIeA+thx`%C|dE2>{-KySb+*2A|h;zD>8Vs zd$5ERhD2Ue#!W?dVE!p!{FXj-sN;a-O@8i(W(?u}{Kk7TU~=PfypK^cAn4SAf%aEb z-mxh6RN#L{5&xxVz4*bAI$!j5P3-bo4R+7d?u)$z&KO>n|4GzW$1`6Q?o{(t#Q1n$ z=nMK)c7OqG$9ObDN6KnbivmJ(QhLt3yamr5))Opm_5SVob#@{gsPt9m7X;wMq-eRo z!_Tlvn8~u!cJZnHj?+qA+&v}eiRSv^98zK8mL1E_q~ys~qINix@zbo{ot!RSM=vLL zGmMhI`A?p@ABfbOejl!m1r^sHYQxU-z1UFyK= zVUI$~bBHg~9yFn6(^F)n602@0v}X7~PR=S%!33fDLE2?kd&OVZ?yI-!9X^NpZwKN( z!kIS-2$=wf3)>dPPTA^dIa6JjUwJZ$)9zR;e*cht$+)u@*~(C|q*@#JxQp+b{c(8@ zPeZ{)68-#l_M)v3cwun2(yv_V`+C}UvwgIa@f2~+0`tQxjwlK|dIsu{-{E!vTK1(w z4n5pKg39&yX`0auGsEKAGzSa97-d`)uD}Z9xv3N6h(Kh2PaE_L$gaVx=_z^6t< zC|jp198$&0Q1EGWq+PgTT7(9%w2k=AqT*!%e8X>~g?EkF?2^7h=P)$-r3Nf|gKRmF z{gCl@2$hBGL{2H`BthuAR{x(vCk^>xEQr<;^)sOF4Q=Hr)F>npWB&O|$74KR`$aOs zrd5yUDn)<+P%M+CT(wN-DN(YXh0C}v$G3&NoG2kd5oklQloU&1ulgJQ%!N-7&B>~CYx8;}2%2CV3jFG`I=dw& zkK6N2`1OV+Zx@@p?4b6CX1ikB9S5SWnKHlT(5^o-yvVB>%!Aw8HWC(H+53n| z6txXoP{RTIL}wU~JyY?Z=kOh4zx6kAmleI(v0PV?gAp5{Pf6tr#V+O}?IXQIC4wwI zLI3mlt}(s1WW-R_NPNvGil}-`@)1KA3V#cPpOG@Vn6Tl9?&f8EBCZsk{b<$RA)oV@BuJk{J zxO6cqg}gW48#TuX^RJxa(%H&}E&*lYvmsHYdY|Z9esn4{Q%TQtXfYR#eV)c&GicA| zqftTr1M_2XVyEgXoepD9tLg{;`BL6!RDck;u^xTiJ9u4{!l-0wt)VY^Rn;kh-M;); z-ertuG9EeFpHu{(?p~q9+V7^Gz!W=3Fc#4r+Lp!iqXl~dLV2_K>AW;9h=qPkjAHZs zY((uX{L!OQ50u8{As+_wv@>sUD8QD=?CWOyMB=+#WfK>!lVC> zt#6F3d)wDuQDeJNW20$ov$35twi??u8{4*>#*+2`(k&igT6X2u$0&i{OV zkLJA|KvN^%Kr~m~9;R`2XcIN(QZq>1RU{Le8cg@B{@?K7@87S@14-{Ja_Rz`(N=s| z88G5EG$z`$xgwoX*fz$k9A^ljPVjJvNhV12Z$R~(aX*cXIUI#-uV?zZ=7kTN4_1yq zpspTOwu;q-b~0UDg}Colop4iEf{oeyuo?StcLhv%g?oYQ@3ggXmZ|v9DTnd!wUSDo zyUjn4UPm1r`SNj50YrCx4eglC@+RGxoLwtMGNszJ*DNXWPqn_~YzVX^4*A+!X`s~A zS8kqXi)>_5iW@mE$KJ-A=e3oco_`MK^RJ5}Q4+odO|{}qQz$(YraOSExur!s_kuQQ zvD0e#rrBwxblmaYh{1^53@Lo0lKWScEtW)Xrz|FRFNJ)~2jdW5<^&9h#4pz148tqX zohY$41_r@^VBjLrHBQEouMn8x!1=TY5_rM!3yeGeeIb63wMAOKXw-r|+NFB6$gzy)H*otc8; z9{OA{TTB})GRQ=CSa;;=e(7G(I!G_S)V@$zkM23hNSp*ChmkD0ag>p6Akp?r@Xxj2 z)k2iiSFcv`J)gJ=y*&&{_k4 z*aE|*AL|Fx7k)Cg?j}@&Ds0OGcwe*t#WnQE!_s`bMOrTr{!$rKmKh=tza)9xb<}O? zz_T{)-H+AI7I4V%DAw>@6(QW2HjtawOe~ihFgxiilDv zWgrkV|4MLyiI#j!#qk_!gnj1rj-HgwV!W;xiB6(dDT)FwT-n5|tn!HFD{5fz!OPZ$Kt5uO`S`((= z`X<4Kiaeyru%akYSC#omHF3Cf@OtwGJHesK?7t3 zR{ANHiF2bA_;p{O)HcEKBo%g>5v)vqPv73$G#JJ#5bNem5N_2x^)eRI znZzcqgQ)8no;KS)zi#8fn^~;gDdqq4BTe|NNXKW{oy>n7{3U=VRae$9A+jC5pi`)> zZkS`Os{EQ)5t1^CFSx=p0_Bo&CV3~h&KJ*K(}d&U-wl@8ZQ(7{Ff8&_HqqufF$8tjNBy8o~BZjf;MK^+mpCDIm;iH+(<32!ixxJ;<^4>5wEDn zej6@H9}5F0d}k0M({XDT!got^mXt()Bw-q6+-Bl5T6YIa+|jQGe3@w}*XRdfU~#_1 z3J`-H{GDN&*yQ$rp(2ojM3HA&@49Dq)ua6x(cBOyT1m`)9RO;j(%ufMP$iBQ;L4_9 zrwp0XjN%IUjZLZ%ZP(9=Qk6H-W_j! zU{&-M*J#DsHL56;{sG^m?P{BL|&jn~-{8 z@OKDm9U_vaq1WlhRH3iVbj@2lFK9!?muAHE!WR;*l93-xn0({ltt(X@?*v|C{%T8| zxY>H%vaM7?k}uW7Y^t9dtmBN*aJUGrGo3XFEmAz7eVyJ$-UPDJ4j5_sstePzv#84Z z=}tw@df0GZc)Aromq6_~T5uh>12!DJ_hDR!!B+k{CI8CU_z1Pvb3zT;`rW(NviA+UlmzKW3D~-k0mMH7(^`3uEn6Mg+ z?U*4pSVDbbym`{TUV{I{0WE<;{o%QCB^*G~`;+%I9_xGP^RnB<(}t^g_CN0bKMuQ7 zKj_IKb#Dnwt$~0;fob{hh?~#cB|)7+j`rsDjLK7DcsMj_)Mf@f{m|2(gZ49!hA4@< z(-492f^2^7w=Q7>Lkbkks0`GY)d+qxKjv-%fElh%BzY(XYT$6%KjCf#_4^b@SJ~kR z>$MVlqf^;ZPYJ81^z|50H(`FZy|m@B{?t-_4M%C)n!gAN=(+l(uC0{byzKaS*y2Jj87rRjr>LUi}g*drCY4U@R!x}D zV_tpzNjoA%-T^IjLR%2Q>_P!zmv!qlt4`9Qf=m)^5CQ0oK~eZ(i-KjDbY13|n8?z@ zwu*KvnRls$(_)<e$?HL9MV+aQ-l<#TlHS2&_|+;ttr#cn4>dyM)@SLWgyP5w@HrC`O5D0MBM{{wtUq@X8&or zO274S2baY8WN1w8OY2U%UMu(k!UTbDHO$O%keevi{oG%a&HrGoO-Pcixk-Qhre_yY zWxrZQWXOdax98qNW#TZsx6ffKCe|;{OGM&5W>%j!fo(WiEv0L4n7jzE9MF`i;}n|5Fc;c zlX|9XF9u!VxRP@P4-=r)VX$jjZD+hN$GGcHfgOPorNK*?B#gLU9AgahsG3b15;*H# zs#;m>VmA2X&jy6}zcMRlWD0XBO7FZ?%CtrVt#<@BUd)MY9W5kDdzy$6recCc!F=k2yzG%JQH9WmZJ$`&so z3grpuJRsYLkDYes#`5n^g)kj+*^18V#E9ZcFBdQ)SyAJ3(XRveayW+TIs|fl#fUWV zz#+n05|!k=4HjJ<9-CErEXMQeR}|MxAxh6Pbcj>4h4MN1({hTW4EM9lepW8c9x{A5 z-8%KN(yxG*$FxUS`uXW2t=F{ea*74JJsP!&DypvekGd%uapHo;A|$fmv+eKFi7nRi z6bvhx@;SdHKYvZVz5!ga*N?j4mQ~;&U{Sl%o@=+~ANFJBAy|HI17%U-%FJJ;=6Ms6 zw{92I@nRmWppZmeJ_J=b)p2ma5CQ@od|e#v{y>_qw)5n zSbEpAvH@!~)8pTwk!m27*R!&F{Xfm}VL1vSrcfAWj!$7u-~2iNXh#WT(#Mqu!_KmO z*D&qN4jM}AEf@lNw)!!vjK@;uwlVRu$@F@%rv^Uw-30|npIUf#?rp9v=JDPRz>3pY zRbF+K^V5}hE2nsRasnoJ%4J!7X0O=^BzuID#D=9BO;XL2D`Q2vc6{ERCApt*x6DEJ z)>k#f+g>GX$w;XmwHgiMd}sV^*SK9NqNN^N;pbI)HtR?(+L1BHXNPYDS^bnAA_x8> zDEdf%YGP_ezt_uHgX@0GO{=NRWt9rY!6VO@G-qO(S+OJ77r`h3g505A5DbuFlRyxC zuz)o3%~6Bc%v6#8hze>9`nQyl2te7~MJRMqm6#j=Q7CCtB2@I8Z}D{}_0Y>#G?=bA z{%u^<>0C9Khpnu{N*3z-BW*iq+D*&C1Xz0^d1p9Q17Slo)}qN(cM?XW#i01>WD0r| z?}lp5c>?q92wv?uL-Y=A5+$~J81x!X4N^34JztP5aIyy?y^dA5<|r*8Xu+{8_D)?ZdPe)L@Ar@)#J(>Xh^DT zWW_xPAg=&S-PY{X!n7lN2Wl8yCyuYDLVF2hrz_~MnNMXOpNF+aDW_1CKS-NOJ}K3y zWh;eq|FmeiOw`979BA+$2l-ZZ&UrD%GbJyOsRX-k9%7e5RGLJaaJ(m3-_`^$)8K6C z^eyDZ_t5+da)O>k;{qft@-8?pMk?$lVvW2DZ3{C=BitBggVo!Aumh&tljW#q1=KiR zEXCW;q_4t)Wlv0d8!XM-EV_1x5qag$;_J9jEa0)2RN<5SWnFMO-#c-1d97WV5q@*@ z^q?*8OjrW+fu0_L$%$XdMH@FsgpFkyR^Z7mza9aPu;6)EfE&{CWCtA9It^8j^qMkP zpafWw&geXA5@0g}v?jIe+|AHQo)}&pel^?K<#}o`-LEUZA?@l|tFjM51)#Y_gL z&JZ$Bq0qq`fWnp^JGX957d&VDy1e-pW6Fo|FT))`rKR1)_>Yj`HSQAoFbTHY={$bP zwiP6eNxpfOlcb{<{j;m^CU5hI9K9)`bCZbD&$2%M^8pS`X@Ja|R$!SXu|_1jyt5TY zTx=db#(Y+{U>`wcTyz65)At9-9kV?Z9kIhc@r|Xx6&%x#e^ZkG5;1sbK?IOBc-lN; zwa%$0!}2d-FKc?XG5?06W7<<&#dkuF1{XSf8x*;_FJAPO0ebHs3YsF^XR74KN=Fjk za}U+)TENv+AjU6`ZmW9(`z zd?*)xZ=fg*2Cj>$@?IaS8E}5)$@vB=LTML zc|Ce38eg>+>>+Yh7>`~-yyt7Sfwo({KY^!zAIN4NNbK*~OVc0;l;IQ=dhNVToy$dA z_2D*Z8 zl9@JBYjmjvkHXDoC{CmhUDQ4g?yluku~DU+Bg5s=d4l>f16u-FHr(-*RJQciS!n<1K>!P0;SVT?2H|xK~du-_-ds7JVCbF=evQOI^j(*C$Ct7sUUVmO20% zJzvrk{N5={M>Fl-7V|lam_!J^ptPkh7>M3q5MRjPOAV`vey2M`8f-X*rD!WywJ2Fu zMs|IfhN8R7?^zQc)36DQru|_u5Y>RKZ`?Rc7 zG)cR)h?JJZG%|g?d?l{)dOU){ebV=V;Bz5k-O-Nm58B*EhX*7PzN_JJiVMzpPD0H! zH|^SpU`SofZ*Im?-NoWhh}ji_Sue!fxcdQeyGUdX4Xq+QOlVZeZfr_QJN{>vHA zBm6HC^58q)$jfQH;OlDmgaJXa5}Vq-%`)Vr_R*>RMvcKvsn=?DLrPnH{kG@~!YLDY z>_?lq|7uK&`msbRu#CfmdBuWHZScq`e<&x&ZZB^^*1^KOJ-m~FA7ed}dWEMv8Wsa# z^?%-XXRK)PI`J~3YKA` z?c5p&&CJ5^CFeGSpi}-p{UfpW0vO!MR|2L6{J*|^y0Yh--B)ib*De4!8@@POidQ8n zFU%*h1ZX!SH4JoT_w-kzD5!lULxP`85grG9$)}wZ^zo^eZmDO;$;%u@B zI3>VhQn0B&V#P(9eMIrbmDfr~Hw3zx1_Ur#Orx3l>M?F@kC41XYLFVNItRQ#^;E-g zfJ}2QXqA5&zLw#Mo#i}NPBp{+!Z|Kbux{51>N-cQLLnsPUHRkO7{z7wE6l^2O73x| zza&ExLk4743G8GBIl0Db>%$+jl|+wF$8F14fvqi_n;%x|1Ewuyw^gngGB@O zd_Q-wR#m_J-CXoIeaBouj}Wk@G~I;C$DB2HD@ix&Io&@Y1ESb@Xc7?J+C_3IA+7{q zzV!ynKlOX4=dFnfAh0XC^*myx^qyjJKW2gkeO;}to@kC$xP3hWJ`2sFvJoxIT!E5E z>v;rmI{_N2@$N>0V&!ovNO98PIT$LD3c30kk^( zErAN$dYAU3ld?-h{VOL9mu1ilR3p&ja4_-p*71ihr!G#ry28%E2sR1lW|KZl2%dL5 zB;O%hURPNp?(Ew!8wmb=Xn0A1oxC(pqOuA35MT_=2C%~K3i2=OmT6zyFLHi<=W004 zBPB;Qtt7AGc-_S+rngRvxJWP)AJBjm9jTpZlvsY$U9<%?q$}er*7qeX3DS@kg%o!# zk+gh>S^HRl#5Zcu+~$1}Wm$ zmicP-?G0EI0(=fv=uhrf=%+(>!7;T`Q8LSWk8^_bEiV-cton+<%PI`E&Ck43HT81z zY0%uayp1j7p09638CLMM7;_rFHf{sIZ9nNGMLCzL`x|kCg$N-#hz+dp~#qq=d3m+3JLTY4N{l0iO0`)+-yT{ee%ER>y@7f{ zkw>fZBU9-KYH+9kZ`<3Ge;(KHuBIk2cm=-#fLr=Nu-!bHlOSJ^gIM0cI-(=C?}`B=x&^OSF8Y>YrQTtsa)UH zhT8T-p#8)bK~7B1o*iOs&LN(i@e45mRd}LAW)p`cpn;H;wzG})ZrpA5v1PC52*wSS zA&TwVL>vrGTG9sId)_B=e8xW7vS^?K>R_7XyP&P45~)R{w}~wRi~a^v(|?E9XTejB z)eX+fNl|bQ`n=VNC15#8KKrRqXVArG*X9^5BqcCn?-@4_+CYA41EP^>#{QtyL?Rlw zk%;J0)QQ@^=|-Nvz)iMD>LkKK6W43&i8{Yec6MucRc-) z^n(6rg!^C8#3>F?xzjWl-Js;T2RhT<7%5!1(I!s=k$OT3y|6TU%(&v$9Yoi}D@%&eUHt(p?jygS;K}p`DSdg>SZvk?NT%N;eJU@Z_1=PNLhpP} z5z4%TG+nI~-KK9-z5ckz8cx~>Z~o1Kt)WV$Q`lFU%?NidzD(^m5RT5uHx7jI{=b-% zV(D7tt#f1I_ay{;`YANl8l&nLT_NuKa;;-(Pp4mL{+(WA~`1H@gSftFH0B zxj-{`?z{qi=YYP&zB7Z_U#H13Z$L#T!2i_+pkb^S@0;h&WgW$#S8!ii^I#-N zGFsT4;jy)mBJNz*+#-=}*}2FDAq!nQ+&Ia+HMPd@+~W2SL)BH?wgyu5%Ol(}G|e^* z7#s)BVgk1uj@`dz%$}>q&MME6LH$I~;lerE9{@A5zv>Va@AVwAeqfV}xcv@wd$4O> zneV~Ix$o2K6l2$K7T!{ zIrztn?k47q8ll})6cw&Hk^P`^`?b@%v#UROWb)I$*e!1#jJAKO75Olo%O#6=xtp6eHAInj)VrH=qyP8~3osnXIJrA0_ z5G5W7j*2iuj_%ro9tf~WQWps!m91e+In!!DI$sqjRu3lT;L zEzN#zy|z~$=QNnLlVh+MF6MGmm)?W{7XwBw75_jlo&=5A4@+Gj{9rf2rMSkn84JEi zakhDSdgEA1>M(!PKFLBr6F8bs%t|^^au7xWy-7Xrgf~vdc;4o$1*KL~%fAv+U!xwF zj^%fZ_d)ZJ`!#VP(-1p?VTc25oHSe#mAYGH<$etuxADh{Q>r!X#ZPEmp|Gw(pcmm) z&Z_OU-D$2yz0)vE(fz)7m-{-aFT=TpX+cr)F}_&-`d(uirq;B}8zlDAOYS!^43@#4 zA>4b4Sa_{~(NucmASo3$(ukPu+<_t=Mik}2*d=SpL*NTM&QA&3V4KoyV?dbXou%bz z!d+rbAX7@puhC7ffFG6m4cJgfCWVpcw88a;WZN5kOiKmcxBSH)&gFDa-&hQcrfkY9 zxtMpRW#|Bz>ki~n%!C0=dHh)lr|#4ZlXp?E8d;rm@)#AVh)e}o(`LyzGP-iVLf+M} z>i@6|q*9oAf;9lq-wb-dZ9yqWPlp~T543MJUcU#&zxl{AW@0*xyKINbL_gY3EO@TQ zr_uV97nOmLcCmoh(Vf;8scnJzBw%5&$s4*}8Q7YLWo z1zr*o@~^wD!w1w9b2&FQ!qTTa*lV z51voV#mO(&Wz}wg;_-l|#!|Ma`@viw!E8Oh=^lxB9)+>EDVK{L$_#sHy}?@!@qg$a zsH2=fSDl`Q7B174XiA+OI3Dt;L4BHLY1bjs9}kT)l-ZT+E^tj&Nu50w31;??tDi*! zRutc_=lk8?ah1LOeWh0n=(-* z@-oQ#$xERa>C%*{Xuv!i+le8jC0<+RkDcjNXh>Iz!Rr-7f&l$Ws~w6r^Is%2jn9TK zsOHbX{vgkHo^2RAiY{!VtwP>LruyR3Y}{yL(2B9phPjhP&VeQN{SKgkY3UidL}cf^ z=2nD#HxX@3R5!2Ew^V06Jy(f|QDs(4tV{uv_|4`liGJl0*QrTRB;#`_pzK?hs7N{p zHqL29b_gBix;A}WrDQDOx7>QXvUrihdLTCfzc+>wZa$9e6&kZX)01COr$+sAx1v1Z z&N^XO4$%>)ZVjV+An7b23??cq!LZCr4j1VTy%i{5FD!^7(Ukhzq;i+5TSiol>_gtK zom&OYc|5eA)X`S@LDx8*vBJzFZ^L18O5-woQwCgy0RSqm*OFCS7*($E%W^<6wWK=U zNFLM~xVb3m&6UL$S}%luUC#u}Pi4sPLiX-hsLBwd|0brv0_~+7sdZ|-;5P-iJ%%hL zZB$m3hYoq)j2Ib!uGlWc+*ej7HB})kQhA!g{FC2Nr|=7kiVmgk^!~~sm_0j~8zt9N zb?B0;YJ1vY-A=6$#Vv1HQ|-keb+2ik;M)KWt}nx@;3MQ4L31!3QR#z2D2kt%zioL! z0-Z%aSs-~+0Yr+suX}X1q@yy9_mde$7J8n zDYso9@D%~cdPesd7Kpfyozh&X1e`3>6gg<=m!8Ds-z!t}mm}(qS~hf>i>j2)`;_(X z4b04@oX+FOS@#A;R6;lotI*SLF#`Zq83j&@W2r`o+Ys_0Ru8x1jwW7$+iwI(l1)*0 z<{xF7Ok0;Ci)wFr7PQW{pZtlc}ss9f9{{Y1`*w+2k*r5bD!xpTZ za505Gt>hxr^P$o%3$(ZS$vHMCZ9_tc5yZm{t7%cU7x))Lgzxz@eO~!zdd`O+iBDgt z_A%%=6caXNoyQ(iLWpB7xdm9#2cgW4jXgD|qc=-SkZ=Mt&35v!Zx!P+95dwBxN`j4WIaEO46OE`A=31SdZqE1kh7T5gB4-c3bWwXOoC# z25c5b<%X%tnv$L^Ld8!jFGF1O4U^P#RK##gf+UOwC)&}7<&DML98IcCHA(**Bwsk6 zdh;)Q9FarhzgC_j+GtaUGdGLGbu=znmK8+NL|Gcs0UCcM6O>yjTLc4+{6FE4tNyE73^p{ zuQOO*A_jUc_1wnZ>|As zx?6a4x*=tFvohWC%dQ`m`kDE1^)2dKhCD$Y(F4|t4N5gu?c%QrGkrk2doe>X2KP(d zWAFWlBfNT*Y7at2na4CN)}Pif)8g_e`>O2`7Zgy`YDkYnvbns{ikL$+@*WgTlJ*QY zIiTlO>~n*aY0!|KHc+HSd#hHOU{6uP1F-_ElEMr!LarPA*PO3_QZ!(8Ji0gM{aI7~ z*GWvzSdpd=NL~QqE{HsBthWs>tpd|?nX0Lki9#?D7IpKQHzn{O4P(IB*m{TVMOxJU zV{boRK|l8V?u{Vcd5a8>u6&QB#@V2Z(<2uiDZ_LdnjV1JovsWLTW&(C-+1iKisK?u z{gY<_R%lSwSFMZc%hzBTr53Xm9Qqqy2=>guW^*=p{fCR8l5RCmh+U=c{)J+v$;)d7fVzu!F5dgp#VN=P4@mxGTAQR|C2r-tm2{(1S* z^_{)&A0=2Ehk!`y>cealrz+jcy*SBeh&|AWUJR3`qq;>{xl@q@sAZwV9>!Z{`tqOb zB`*IMMj(V2;%RW`0EbgObH5nk*&qT<=JyLKI*T!yPLBH^ftcWdi2f$&8;Af_#Gxfw zikf#5U>JWt?7i-hXEp`u?aA4fkPMZ&^MYdgh`gPdmIKfM&=gL6`=Hpf=Sg(!asU?s z#`2F(w!MF$b&>1wZd}^Dy%+LjjsZTUQd1iY4Att2w#(DTuMv1E!l&K=AWidb6XSz{ zo}G&eNZER;UXFlgfdQ##i+H1px9L)t=ILoF27_rLNdbh;{N+s@(e4T8BGz>)PyWbn;088xn0<20 zzSv)Ni|WgC^8ttdOaqMxHXO*W^g;qS2^K7rWEx+wJB=$?+>FV!S+`UMta#6T+*U08 zhm-EZ98}7oyoH0a!P@(=C-V78YRRt4Fho5tQKaIl@jx~%ZMbH+C5J5f+>DNjk&2O< zEZJb`o(VL66EBQ5$5Abiq_Yi*OUR`CHU)T?pzf&%&)0bw@Cw`_$3_l^D(Bai6TFCyItn!8O@4x)m-C144_mX{`{xgsSTPb zDN$nW-m*&C6Jc_OR!$U;7+Xb$Fe42Y8iGmXby(6&l~x$qL7*UJCQ3HdfY~A*{1!O7 zAe&kx{-L8OqO(l?$UT1sVBJp7X+_ndP3^(OtDHckMd@Z_l-I8s=K8syA?N37q&NFG z`9@<@*fqE2YIDru4>CB06r+`<53A%WMtJn=ZCpn$=RqbDnh@YP-=;~CHZ!eNn}Dx1 zz91s0D+4V9MPwr-`DdTL`xYa_yO3io3b>JXHkQwjO@a=_PnvuK>;Pqwsdsdz{UtLT zTF)DYA+J+8!uZwDhgfgQ7rEs#C-M9AMsdKiH{|>#*)1N>Z(73$(F|?CDIh?aB|{+I zvhNBZ*-7u6UYJhAo$0|pe|uEnk!kad|41t6yRvS5@B6V|Ltr=_`CTe&h}VMEbaDbE zur?2N<@;jl#!I2YTnDbpZFS9FuwXr6piDYhJq{31OEppnjo(v#kF>A4E~URpV*>gX zw7QQk%uD|(gZSzNjif9!Ky~{2*a#S6c5BX@-&YpL#`8VtV!`7&1`ssmr1%*@YNAwb zn*F5r(%Q4kI{rwiShM;|@&qyiU5GMS&Z2%aUO9ZBx?*>Twu2!b1M4mT5hWw*5Ag!h zZ%6G9lWz19aV5c7zU?`SZaQuk?LMJ76h8z*B@(pr7x=zF=RIVIGtzFblW%XVO{^)Y zpzXG`ntpRSUwujCWV>+7xZ(P?5_{sogN{wvaplVp>i6?YPCC8zStn|U$6NoB(LvH4 zmW>t@mDnW5@fP@ZocbVq^S;ZMov#PK1#iEBw9|(@ojx^g>3-sz!?cG5vJ4kAX(?}ux@FirKPh`U4m(wmgM_bfI>C-dvU zwh4K9H~M5W?FHKz?JlD_he4)CGha%pPC_Y2dmzaGbc+v*xB5knePx;6uz zG)`=%$Sn=M=r}sA1*LY6k7?@zfMciLBiNPQ#sDU+H}fbI`5ei(8!sL#0hjOBDDv2f zLJ0iro{HL6XGh(;ZM5?Zu_ImsF?Z!yv}N2KwJlO>7I=4n=6=y^@#2PlT8@*<2a{8g7CDcLBHUVk=|`_I zIbPZATUPeZq8Yt8naBIY%gYXj;d^~4i_2MD)EYf_WEwfzC zc3;PJ;SHE}E4$r^ihk|;_R~EAD)&Kc$v89AyZ-EjfM`E3Rj&Qj?eXD^Uf?R!#l9P% z{7$2B@cnHFeMw0P!d`Lq>Pg^8j`Ht2GK~QoZntPzfKoWb3cMQ*Zor#i56ZF{xR7`)~q@oU!e4ES`9cK>b%Tdo1^o`kx57oaHBnJhF^f!3; zRe@IDWcaChUe06I+=rKa=b?iJWy#!3 zwkg+V94YgSCKMu~HfANkBO4IVX&~1cl1=(CV-NJ>K+pi%%>b$Z^A`w*Z zqyaLvqng%Y>I%(B#;`HR>$rR?S)D1r`zsd5vTW7{q#Sr313C8%i zLS*m)AlRJe(4oFOOv&15bN^gJW5ms8<@f-TkUQ)alo3=|N4Aaq?qyFEDh5coUJa{> zs23DPhN=NJL<{*cs!Gd5#d-a3A$Ywr|HNH!db6~RtH!wFfsBstvdhmlGHkFx!xG+f z3d2M&jx0wDi>09Bsx-bg*o)Zn{f8iLs6)0avf|3Hff-0Ncc`FXE$eH+ZmS2nra#Jeg zmgDARSm)%&oexS=_&*x^bP5t{kK=?O7#u;XwKC-~C4% zThwV>51~YOlD!`WjK6TLLC!sm1)rS<_5REZ&{XLie98z*(=5XIsR8HVNzHd~l`Vfu zv%Ka_f>LWYxSXB0z+t7*Bk*yvUn<@! zh^g#Ts;=`v)9m!&3g9=0C;G?BF}%PW$BK~_6xT&xX8h#R54x6FVYX0B0OZA2?o1_q zO8bd43|hSPSeO%L4l;W?TLnX7-y|jvhQ+G%&3-hG@U# zN(CRA2!e%JNFpu@yMJDv#~jHR6&&K>q&mcUk&eu%6l?RE=h3`3baRfII-M|wUoBgb zJr{a5gO`1J)LiS`{4vhmO;A~G;<2c-Z{a>xV@ z5hiHbx}+1TZvcF&!zR`(pO8(p&*@dBur@C_XHJSCAgB=r^25(0A*$F1S0_CIoruI@ zbhIx9@?3CPV@9^!g0g3#6YxS7ZjRm^I~lDd7Zob4wwUyIsXyrT1kprEmLXi!aF3^} z4?-IPPfXvA>qEk0z+W<8g^4L;9U5-Dm7V&|^Ng6m%3g8IW(&m>H`o%8CcgyFW^l@e zQZ?VBr6EaIpyMaJ1W&>tm3fcPSlI?A(n6QMw`cNjbU=}E&q5^u^UNT$La_!pBpIoCL5by%C2z!z2cgAYyF|-!0S@1YRyyw-_eGgBp zh1OA{LXcRZ{fiUx4D3)V3LmT>J`eG;1mAZPX<{f7I56vYmGiUI-q9f zEbZ3$-yjWy^wQ}|)n)}QuBxVRW_wDsokW)Vr&c`&%raLW+$&%K2uRgNJjLl_*>{+P zt=+6)Vd+S_-QeFI8_K}Cta2!oB;Gjke%_`13xMbZ|9@R%m#joxzfoukuY=tv`V13f zCeAK{brYZ2LI7JI?XXVsPkQ-~B#YX&JexUc5ciYuzI2rYUq1a;lC2 zH2m@}A0whLlq>bo)U#BiXLB-3!P1C7Z?Q4%oQS&|gEJOpHxpAG=;7J8Wg&X}7F$$nb$}oglWTfZnEB<^Hw=kyn@c09V$thJ zxGGwsI84Y_4|SX$Ekx7hC0Bq01EnT99wJY14m^y%J)9)ygEd!g!U`EdnO2KNU>eje zcXyz+D_*$pG#cA!ft$kfgB!X0+2MrHDh>hV2?7p_LV)jmjc=m2q8j84GITIuO-XHW zc*6Q*RT!664R_>VP(a<$Vs9&Fhe^JyH4-%nz*#0joL{MVyO?ju`lWU!bNJWpXA~y zF$T09r7U^uk}G=MY&WmN_EPK;6Nj0ttCn;_gZ-`5KLfjjgeCQf-Q{NvIdHwFCwS0V zH}VQIgt6PB9$6#>a@r7GHh?1;p~3CZAI#_*2%q%E4s*RFNmuIrc4J%fIKO!SX>XAR zWM$e^#G_RIzB4zQ2ru;q9KX@R*s|JP;d6GhUsMIlm>&Cw)D0RmxadQK5NeL$_f7gL znv1fUWDmk&(#GDkQEWG{<8dSX?HInMLsgw{xAtGkI5z7&U^|XAy9lb-Nsi^S^*eK+ z-1s$}J$}OOm;0@~B`{DcAiOzD$F4?go@ax-vPLG&L?E?H|L{QWQ;P7nCI6bB*gBw^ z(rFo@WoP(vMst6RW)kSZhDfQ+4zFBpcB;V*3rNM)&lM-6V(d^PpOHuNaOpMba%&nuKgY!ZT zf7S|(b!_JN{oev}-X^u9PR$6&>%T)Ah^J*5-YJ%6yy16`)rBVrkPOL^7ES!~ zUqXu#Cp>;HVQ*uN9AGWP zw40hfMq{71Z*Q8MU3hyD53TiFvhzllRplGI32cP?ZlKcV5oM{pEMm0m0)iXXCMUA|_->;)Vn!$P=bFtDO4ziJOJo@4~5ar|* z|A!I(HH@+OK--voX62~SO~8|Psf#8QexK*)ySvV1iiAOq`a~X$zcKG2VR=;_&%tYML<71@hpW_v|$X=|X5m&2)XHGbHB$iM>L zdmhpow$?cF4pwE&PwJ|J?8BoX^yA`H!k^?Ni>y;^AJ|W|*V#BhCkRA(!f35W?I^!G zBRzPaQwuP|lIJmu`q-`Whu)r6J~O<&v$;EXU^sia-#k~?-BOE_jNEAPTv#0h>Ah(P z8^|68XeWt$ak%VcCAY}4zk#1u|2<{C+4-i}ee6Y?_wXSDj!U{LBw-Z+oS6wP@-a6z za>JnarYL z1eT>*d;h{!LB)4PgP`Yu#0Ua<6~^QyQs8+ ze~{QHWKz$^v(C&yv~{x6&(c6A(Kh%T9@HN)cx+PwHPAK;1v?wUxtDjU}>I&s2H z;zA=dE$eRkN0;|kK7On6YQe*m9y{INZNKlGlqIIA&1`rO1XQ*Y5uGKcTJcZKHtKFP zst6U24@>x`e~ZzSNiWi5&}pcTNoLx44Kc}k@Fz_HpCIwxTX}pgS!)8BcRbr;U$jhK z)99T@2e-C^jch(cV48jjN{?8&Ym86xE>GtmHkie-RZ2KJa#Zoa!~5nC9PO+e^e-8r&RZdy3|c&rPxaB1Vaj4E}Vl>M;Os=gf^tH2B{%>sL2 zKIlg*;y(@2SFnS#R8V{oovqX3AAHM>{HfBV<<eu;>0x|{G* zu_AW5;^=|v=s~e?oJ1=c!pS2KCyy84idD}W*hd(he%?WvpV@z`>RWqLa)Hj3Do1CG z^C1+D$X#zik|=w8x+B4*&0n;Oq%oet=S;WTZ7DZr71D9zP9tF%YrbJ|j)AJ$S+(wx zE(G!WM10n-Qe{60`1$JiHFW(KjHG57)Q5X)Y|LesAknD4o>>yQdDqvof=ioFrA{IL z0@KR&ka}g*a6-b{Cg;V6(?ILg23=M~6_@5FgX^Q3%jl@EH9ZeXt8|DeITh`I9#iY= zHPKqx=b`U?u@np+{RbMtO-b78$4HVrijGCMWQD5HHVF`c9Pggss^H5)MAIlJj4GZF zw4gG0{@V}h$i~yr)jL9}V^&?-Bt(W^sbNzUv|W|@=3fcEIx-}z3=-DcT?qiav(%0C z(PA9QeJkQoydmFPjK+Ri)=t)K1{?^DsyAP*%s-%8Cf)YU)L3_5^okWN$2&kNNhWoX zQ$qXr1$9MfhLk4KiF^rB_LCu?ULe&OI2EI@`u(%~_&KFZp!FpAvS>ZhIbO$=4~2v-ry{67wi4I5f94pnM= znS*MWSstX)KL@RM)8eOOclAVqobyMShi*{X`+|_%PDfJHaJ&JNe9Zr&>nj7IYS(s^ zMkIz*+F=N3q`O|uor8Z!ZBLjlR#rD*UQ<888I~8tWvvbLD~_uDvDg05sl{l8q2!;6hAhGGiZKnz zRnU}pDsCQA{5dGdLJLtHUDB9aLWyBe-n-4q4MM$ewb zMfPKs8VP&*RTCxp(#R*Q8Cynj^2i+7I}Jth;vm@{sLWYiZ!>G$eS^&B3=Nho=ER5y zA)Y2~8t?m-%-j$@v=$0DqVKazHGrZG`KO|cU3fx*?0+TQJpbnL&n8**59KhbWTU>_ zHit|D;ZfA;rC`0ZQVmB;8BbI!9e3|Y8&{@IqttJ{VGL_QKyNZO5)aap?4b6* zjlz2uDO6r9xaW0_TY_{dy!t*L{F{h4&tc7C;_)9BnS{9J7FR(X?z((kdLJIE#;O$o z=tV|4)0Zr!vn`T~WD$gTA&6>D{e1(VLqHIgH@v59Oiq=@AacjQr{j`YUr^BYKn}EQ zmR_W?NNwupF|cYx_7)82T>TX1#aMp9cA7OWf=xK9IgU_;SiN&I)OyOP<2TsS;elyWLSO#s4lC%2U{yh!3 zP^{KhEy(tEM|j(n7Uy{IGSPyooya|1D>nSca9z$E-ztr& z6cfLPijY5!ru5jdp)l8Sw0{imf?qbaDj?-DEUV2IGAKz7NicEf^K0sYtvY{3DR}k z(aN^5ZIqa!D3~3;a629E+c*QD2&%jD@f`SlLib-I*!LcPSEKf^)2 z+mrI)#%av`PI2C>zpTl2ZaeNoEZCi6RBaM$U53CyH5q>FLtifp~)Fi`8?l}2jvP277#(?BJ%^7_webf>w zA)0SmP=MDXG#ETJ_iJjtj)2W$DS1(5&YyYx0ZESKz`!NErNVySuXhOAdg5ttXM}%J zNntED23gdD2kH*hFJ^tYlz^k7Tv8?22X%LWh&pe|#ulC4KcMsHnAfa^6;5SAOp1$| zm{yY>_k+u2?7`f88MpaNxv#gT>(M=<5F3H}FXsN%0|yWnE8%QJ1CYmCnxwlP2<81-1v81z;~C+q%Vp= z#xL&oZ~gdHXtT}!AI|*G(*GaG!zR(Ld)LP7DXq3)<0MF<|9xJzp)34G`)T5Z88UO` zjxdOVQ&$wq!jY1+#)!HE+^5JX!W$oCGXEKvgM`5mhLj1ZH~*IG;l@ukuW(@~*oXm4 zJ?IL8N0+S{4JWo$-b(5^r1~ICoh&j^RtO0qu=_-PrwMwGQlVD-spn{lZjpL4fs6RX zxYpwv%WzN%9r2SppfHeFNsZ*= zYP%?Q#ZOJFM`0(AqS4IG= z`OAJYj{`yYL@K*)N+Q;I5Qz>j{a#rwerI5NbLh8EK^yRn9u4u?361@F5s?l(%SWh6 z&m=vhj?q~Eq~T|eGjp7#yki7D8A{xtPvb$X$8Mbsl0yVxcnxcQw0(^Rcv(Tm9r}JG z)hqm>EqnG##Bjw8dLpkSa1i#QN2=Q8m&8{s8Id>aO+~7|*uM8abqeZv+jkVxbtI&? z%{kWx`^`ML-|HDTMQW<#1tB!js?l3OD&Hd&+;W7qoxFs3%?0Z^itme}L)ZRvF)D0g zD@~Kmi<1eNw4?=0`X$GSU-2*wT1NRgR_J;0BM-7dQ@yKbiskCw+O8-W9y=%?ZTNHs z2oxg_dFoOojA$J@-(w zA53WqK*(*s19b-5JhXFF#m@`H|6C&N=~B8IO+5e# zj@1VZD3MM0iJ#R{JKMG!G) zgO-dPh}d)SAs%JM=DJ`UJc9qn!4Fu61TWJ#t8`)QIhBcLGE(U`fS`jkI z1_6sf2xf30An%5ldMRN$4?w(T0>Ta$fF8RGfOnmxNPh+yhs~) zES*hk1T0Ey-&uX)R;6~mO}Uzt0joNQ6L@%Xv9zj$wp>sOpUzuJ#0IHF5ME!)Y;^>F zWciSw{ElfDCv1u~<-!>Eo264`>^{-j9*?ctrxl9mzN7m*bd#18AEj81K0p?TrkT}_ zKt91V05_HsX0g{XPf~obz%Hz^j_+H(#j@i<1{Z`KY?0T-Xz9ddZ!`cyhAcrbs1Z&6 z9^}>2M9(}fq2%i_SS4ve<@1PkLx)cLM+a1(t?(?cB6T9UD3N`Sp-n)^LLIEL3~w-s z&TuX)Jv3#T){C}d?#PQ%=!z)UA{l*jAY|p&)Y_`#CTdxTA8~BM0rH$_S(hK^ZQ^iAL?ko#L=#8f{1ab8KoIqpx%mz?*RhU2)TeT_5eMCD3!fe4( zwOV}%piOF<0E4>ho44i^0a-8^601~T->+&Yi8*`PB*a1YS33ASmTj8^9_imW;kIbuM9-8ubsw3#X^XqA2 z#ul6V>u=(7Lj6b|=-Z!pW!?L8;6{ItA11O1sj0zwJkkJ%9XCo#p{wvsKeE_@NkWwB zlnNNzGf^8Xpb{>68A897o5tBb!Wiz75Trf_EBasL{Ga@Z^B9+I-F&NAh`q0Rn! z;1}_lecx6U5xwViN{~x90CS|9L>JW?kLjPU@bQVg--l=?n=gvtp$Db>s%-{q!^80($;c9Pn$9qzo|FHKrMMeqxfMEcGG zoxMJu?d*}!`OTwgR*>Whw*ejPLjjG%^}<;fJZXcj2p+XFHI9h+?rYL&6i)U^IMO7* z9^@0S;uWf?^+_*&t{t~U!BPv`Bu<9mHK$0mA9(q?l^dJdgWy)y2a`njr%jnE%3;0M30vH4D&ton&(5wLx`hd1?$Iz6v`!_tWzIfd52jsTOC@E*;>lZStH^2<(xIR#j(|M+;SWEV*V`UXV2u z6^WId2z2KrWV2r*aL}rXMI0f(H)_;H(z6702Smk`ldY9vb##fgtMNx2?yEX?YDaip zdRG@TIy`bH4&BOYO2?!*;m$cO2LOX++DAI&RCGvYRIe;pN!;&V<2P&y*jx^KKB+k+ zC9hd#1eF%&wF{p_e6`x{0t`&BnS%i{3{3xhfR^fSNwoH08hj9sC;V|(;9!h#6dmNW zfNK1;Ag)|b)CTl%vsu0NGop`Zn0N7ai4>jZ-HYkRzl~yV9dJe1x`T@*X1LL$J^pfU z!rhCONEYfy?9ZVSXU#`HKfDH9Y<(*>^Xa4W$cibSJ9PLGJrPjz(}c$_mcO)B-ZZ}V z!qfrz8a5Fp9Kp()0ofMS5^~Lb;jJpd;?(OtO;sSw6W@aHRxvzWKdmo=08)4xiyABG!0vG zD@qi^Ygk($r2AX@_D}n0eTZ;n~;--N-%k?<8pC$*H${Qp;M%;KH7$0N@>^a_6j^Opd-B9g)+gTHpj)E_1P}HB4ijt!j6^+TLL136! z@&XKqogNrxS3+Tjm4>AoH2!U%{JG-rtY;7s#%44L2!vtQSedU*$|fCqQTV?hsK zF^#g02a|MxS-&r(%-00LV)g7&)f{=+u+U_?Wl!Wcjnth91!1()zy+C@#baa z`u5-qYZGjB|2%68@?hH?R9XO>DyKbmf|A3#>C8XTe+EoAsrOLs6na9})suLQY8Mi_ zLg0xv&EjQtu{n*KVCb&3NKk_fvr>~@Mt@31!!#^84~ur>`mWmF@T4#PMISa?Px6^S z!jZh6fyvZrKrhG4QzT zBo-(Ab2$ENv1Tk^v|k(@rmT-9M43y6uNUtZ{hiBND|CyH^`JPZL7G^1wCF%)+|^Ij zjn35t{nO#4K%1=x6bODUgd<6V&i#W5Oo1k9A;$zY)NIbnCj`lhTssU5(TF&CW=)-u8Wix{f50)P+cn+hDH6!MYwnkgj-6N@1X+d7hZvj za_sSod}mwu&Lg1h_yW`KrP3*~;&!z4-vk8Z+AOHhiQHh;Fh&L61|Kg%z8iFyZLuPu zS??2rHY+J2mqCHhk<7e)I9{~WCU zLp42+yp!DEKPp@0q@a7*TVZFWakzge_|Xt0R48~HnoFw-eU$ct-vqvOG;O=>RDsSZ+kevTC6xyxGbV(c)Y5S#8l4vdI4l%pRsQoz)qFTNy zr)XyFF{;l5>&-IOL$!LtQ3f!B&2+sm5mmSn=-O1anWBnYv9{pxwj3-qKP*g2s@hZR&{Ps<&DKt|m>tfmt3&aoT( zSVN4j-oYGi{y9}GU@;t6KQtEp6&)?%W+_CCH1 zBCDV3WYvM^MQy5aNgfVLa;xRidEmZYTV+-m;DPGz`LOmBDBEHSyU$XFQ?G)3r-qIm zdDGriu+oaGwY)=aJ_$!`=n3Ax`_yRj&*QXG`aKO`t-E;z3}AE8}({P9x%QHwm^yu@~N(S+#cCS_BonT?93syeqW zC?1gY$-`Imd)Ksf2Yb(mX2&lo;cz>_3>fw@Tzxa-nleTLd?zH00z?Kai^MMm*dx!x zTA>^c9&+LLC|A)NT33pM(oGTQqQ>#j7@t~)ycZ%6vBwW)>J1fA@P!W5t45_Qi=El- ze<|AP{1V$RRkEx`FeGn{p+qTqSaiiv1Uo9E=F9@NAr3z^XRYlZB6)fR=YA_JmKfoi zpnjCrQ{)f&0|t%qR>(Qd9GvB}?qJjCpEZ`<>&KAanK~j#BqbiPs8s%9n56F^J%6w|pdn{M@i5@`OQzd>qaz za3Iu%d=6{7=dqDP#^r&cwf#||R*h@pxEvOs#W^tWK|Dq2dEs{NQKB8Nqb-ZKz(o$& zSW$xX!7Ab@!)1m1*}aier{*_xW>hl@1MolP9@gN`U3X_~=%Z8@)YQaJe9_U3f8uBz z9DnD4@Z7jpf{!zx_Z-V&oB^UG-SD|9<`YisA)AYONj4V7|qz)5vswjVKTKsM2B*9p*Z1nC1ucwmPLN$Y{^&7tG zH*vt)oqvsrPLkD`iX60Oj6tpvlJ0HZNaLxR_4Spq=bFz{ayar!?2;5$X%o-LsV?q@Xq!i0KO6it^XHpMDgy6E+p zIi=_&d3T`dn)?BO`?J%z(D<9ZxMQ9#_Uk{3AR*pHr@O%!rH{t%SPpXdmEo}%oP5hC zF}!>;r_-MCE~x1Ug-zUUw|~_4oBlleu~s1ZjSfN$TWY~V4G2&_y@h{*C+ilrz8j6# zh6pVvg|zy*pAfQ%Z4MrHKD3IFUQa&ad=$E;+sTT;R|FzJ$iE9A=ZvFWQW2~%?Mna1 zBHkNuUJC;wcNvIr@XpDFA?35;Hc?NLVLO6yn1sP;Y%Yh?#@x7j9rb6AnwN$+%D;g- z{t8S3XJS*dS|t6!#K%3{I{&v@j|;Nf0?(haau}VjXRyE?rbYI8TS%}F)%tf9s%TJI z!+qC?`{REsyj3f)_PNb>*NO?49V5wUw8+AuEK?KsBO#h98r`4(0!=n>Bne#Ou9C=E zaJ|JboI})FkT7Ci@xjVCekon`5f2)qKcNn=h_tl_N9@Va!O zRMu4R&xzCV9OyS^y2S@Y$$qIoU!mDTgO%Ey3zeJhm8d42=iyzIra768wrkLSCe5Z- z5)8}Js@!zcZ@qN`Qfd=>EX4KMsR=LfR75fmEzb8@Xe| zPs3ZrG0H!j&-3QO37jf}BHhGFXqgabUV~!jrsDr4KX2g2Z+VD5v3cy#$9fL6X{<_; zI=`sm=K&yqPL%9}vAF`4Fv#~PKZ|vblnrg~>hhN}cT;=@o)A`**M7g+)|{Gp@i?O2)*I?> zN=t!uJsBiPO9DTrJ{d(E=U;Lh0B38sG)DQ=NRJp1cFsKx)-y2gW57G&7iZVJL0`*v z#7e&V!xT27Iy7HKzMxO^E5_f^uJ<7D5edI5w%)x+GlVGu%0OrEC-1hut8(GSlA*`!%{ZWsHx_>{fUdx{5P|U~*F3E0j}czJ+7Xz> z2=gW^N5A33(DjC<+pUP96dkY7Wwy5_Mxidu>xtt~>wo*i2W3x+<1LJ)y{t_!D@Vt` z`EUYFXL{Mhv40XOHY)Xp570;R(m`dbpra>ZQ-7?K0U@+@wYvBNXl|L(l2&uqcCsmV z?00ZBEYvEkVoN|N^DJECb-1Pg(ko6#6NvEf9^73!Cf0{K>- zONf_;6&wZ6>S9aKEeJJ^H{;M_qC%MSouYrZ7JG*7B$PGqxYJKXq37FFa@{A$mxw7k ztkof$=*p{K0*c#A1}}0GDnbf9bAq>*Vb>$~9b8TadcMhX8ktOg+aYRKTCs=Vs94!} zEVWfA1q});{!$3(f6D^rW_e*X+Hs?z(63i3vVHh~OAVe;;hZvT5j*5KUxT4`r^Xp( zx|U&QMgt;0kqL$VH7;RFmY~dYWMnMq68BOB(2@K2#uuQyj|D_E%lIX z3uhBa#xBey7U+sX&ra1vJJ|>jaSm6R#w%z!(Rim?AV-Wvite(Kp5maP%_!|J8jFfQ zoda<(R`!aod~ufbb)Qh%ESJ`1YVkg&HnqRO42`Tb>737mUSwuIWg}P*z-7KQ?_PEw zpADN5Iy(R)%Z%a6w?Sp{ zS<+We)(7=_Dvor|cVkc~_Gha|a2)fb&;=(+W9_a<3-6=<6!{-U*gyGDZyjOa08gRs z>}97uHO!o|EOPY3bp)d={+JTV#}iu45 zdfX47_RGD?iWSPD#x&x8KYBqW1_9<|zVH>N7^E$dnvxE6qwr3W7B|>A2X8?Hv|Za35@1Dc3gOOIKW;*SK%o>Or}c#m5!Tw!5gQzPd3>IQ`E-8Z)C!=jIX zHxY^5-z+e#2HvwWy<;E&fwTs(EV<;zW55iN>H^DDB zA6SeDz2f}l!XLOm2LYr-?kNR5&v?xDaVAmnNd8G=>HANFkSLjLLUZuq}&M7Mn) zaqJNu+x!fGuq11>F=MAlOzxvN>EE)eI5c#(p8ay^+yrw!Mr@HLt+n!a_oyJl8*kuo zd}bV2QUmU1`6zuGTSC9sV%x=~y_zgEOwaN-%HI}iQ|1T<8G~{zvigqMv8sqC&W6x} z)Asm5tj)WTEqMW1pRxv|=7K5E>+eLr8IJEjL<{rF|07X)x5e^FwL$~h9X2_ZbaUdV z3uRu|tZx}cS5BmTM<~mrmnyAI0II*0z=z>2=|*ww z5g{)bj3>{JdZY{e&m9;?2Ka6}MC|Z!zDjQhq6v;<(>W}Rs~_ZORqp-@HHj8Sn-2n_ za#;tBdSZ|rIc$IIlS+f-qd7%S@1Y++(+f<$HIKx5Qpnl|j+i)7#oxC$?$kjU#*)MJtN)&;Ib417%oB^ZElx>wC(L_ zojnIfEv;ffDqtGHYU!JM)}IdZSGHl|A}3t)WC%I^2~RBRBX8H?bhQ(-yOWE8sfQCZo2aYMI+q%o6T3ptKu2!5 z8rN)`q}=#_NC+v4Fw-qce%_eO4XLjzR+b$Td5YQ5=9UBSR2+K`@(-h(mw>pp{&Wv~ zBonb$iV=1HeWrF23MzFWIu5o&JYu#Xa#~xZQ(XN5V?Dn6K&cWQs!Y)jaT(=55Xb-O z+NbsJ#ssRE%88%_Ri*ZFzLSsIxI?|}SJRN}<$SsNy@0hbo_8^Bo$x35R2gH0k3^wOZ#ub^7q3OIOs_6hcp9)70(%(I(35mMM zex{HVF=+kaH;<}NJX|Kcuj*ztjziO&3hx~X8#V9LIK`W4#u!TTZ`}to_)^Xk(QT)v zzP^e7R4F1cVDNGu9^-?MpLvbbT2{ou;EC(DlJ3?8Y=ugr&}Y{xyh6M1NEmMTZ}F$M zm1ryp-Gzte=Ey7)XV}?~d$Fq0qXXNJfqXb{q)=1J{KUmNLM$OM=-B6#xrh%Mr{G2rU=51c`)IQP$@|F)g2=-=fa&lzQX}Pjt^I? zWUz~zbc@_3y<<^U02T@KoJ z4oOKg$;jKN=gTcXOtZt+(1PRN+KQ%h?^-iai}og&%K70i)(ueug<*tdv&@}cfe{@~ z78jU5%nr6&1nbwtqL0imzCUmjQ1k|~q+=~XVOXO(l9=mibmWrwYllA=qr}P>gqw~i z=4QnFYwT=%*TlLr*cgin$KuEOh^EnEx*;D1fT@o`Kap@Y?Ea&S{rNiM2oIX^y=`B( z{YZ|~8V2+w2~+R~vLr!OcTtvM`-F$e=Ew|LM?t!vPgQfGpHY+9f^EA@q`U=jMViv^ z!nYJv-sd&4%zSKQnOEJ)agjtC?tso|?G%_v)rk$3Lzs~mX0c*`mH@OZNgj(pwFIND zpUed4ctI^3W**O5zXCS_tyW9O7|bKKdxToH14CZ()tIU(sWL5%E-!=#o7WZw4t=qX zmm7vTHm^^*LZrHWvDX+9#}0%MHR=*0PZ!gXCDHHh-UXXC!p(=n*4S`AbmuZ>mh+NY zu#8>Y4mAFb=&DJk{#=t*$6kPp7(_5{EgyF2}c+Jh|t42eFKNI%-O zH-lWsUaul=Zg$zA1JMT({!j41F{*b$gaIo=GUIEdCI?vqNRGhcTmeWoN^V_akcflj z;UY5uh1^%iq})`oS*Z!rr!nSWNG~v8_UQ=Eza|xjP5UbAn}w0Lh<}mi(?Q;7!526NmgQMM4+Pg{b_R=Y>Z`l7hnH@S zaUADjGL3&BlLNoXS2K3g@JHe?C+S?EE8__gKgkVwFTUr&sfiN7)?CFu-XFMLX`%cU z7*_CA>I5en2(T37Up5mLJyyI(_#{Xz^!QZBWh)<+zhmtSTlL--nzYeh%?=lbQrxv! zy1lIUvo+H}H1q`9k53?=tsMe{bh|Ib2$Y{kPF{2WDP;dISMnGF`%NZYj2cOm!ZbB3gm1zXu?kVQ|xaMf27m6c)F}?@_kZ-gF9z zLM7F`H!+&b#Cg$L{$nn4ma!b2lOpd!8pq3!>$x=|Gi>ig1~$^ATy(ZQM6t=?2&l94 zEXQIh|l>H9ZtW1s1KSWJ5Ipyi= zm&u*~2M+*j1QRq}5M@(^?eOI0!oK|ANb%z7+vRDAT2OJ$q%&SK#64U~gysoORqVyQ zg*+QTi=%#;XTG`ZzCKTY!~oj1Jjs!}GlbCNSho?dL!?o zg!}d~GcjKb#-e5w#V&Ir_OxJfcd zOhs+xkbkD($C{%J`Pf6N?%h80vppmD@#lF8H=bK!;_yK?ajLV2y1h@R2xgU z5hoVJLSLvTvHEYNaMtVFA`&|9-{nsY9va^WC!q<^mZx;f*ZiPeS7zaaO3scfrG6ay zFTefwO<@n?;GvD8(Eu_NeBbNM0lz|6hv(0UH)bV~(~!4qQI>5QLelU_#_>=`)gPea zXiIYby$!nczE2O-X`@2ibaiT4_T}frX-$u$ zrpA^CaD~RU6G^vAE!8ZGSfK~hA16JR(b;D{pfwtgyPm#4#ATxlz|jm?d`p$(w`Xu2 z%*S1pPxLucB-r`=@=q_l>)y<|{&yin9&35L532Tof7~3hP;Fr^aE4~j45_d(re$b) zg={UHO@;{V+Pt>4n3m2%==D~AjXQC;7h}%PhrSkI7ACMYnAp;(%^$VDd{^0n#98n{ zNl;3P+VY5#{VVwOClJtaAN9~y^xF`K`-`yt=O|iDN3^!^?QUC@2EHWxKdFL=R_)_Nw7qRGJer{dtN0aLSK(Clf4Cf6;lS{+!xi zriJ6iWX3yXtFd#Nt{wm0XA*E8C6?+a%hmSTfr&ui0D(oP!2p3~?J+Yq3SjtynAd(- zBqouQ!o>0usgk}xO%kq7BixXPpxz!2xOHojn~J%@l3b3uocVO)rVa@E4C2BN^{JxQ zmAO_U;J8m+VeMM{^+5u^Jb+(@7Z%Vter=ECe2Ge1ECLh_a~ZA1 zXeymdCJ8|W$Qfl#+&U`q_&I_pSYM_mBdd!vz9zAj?tKM9dhv)zGCx|Ik0XU7d+mM+ zwiRbZ)>eu572+qXea`70wD^UtG7yFF8=*OA^A5?b~lje@6->#;8g9W^8RjmZW(v>L)k8 zpK$*C!W80lwF-1@Tnd5gl@x!ITn9i#5y))y?Bz&kkiGy~Zn=uj(_g9l-zbC*-I}xD zB7%&^17sW=Y6zNVz1|cH?Rq;(MnXLWZ^9K5s+M4=|D0w1Ui0{y27eTK*k%DPwPlGC zCgVUQ*5P3n?1V-2;Fy_a!Dq(3CA;@u33CSI>|3ENOgpD6?dToc<-(bg`cGl@SL_L& z)?Xfk{a%UYP*<;ZWY#CP)lqw9og}$Js|RQ*KfGO0l<2cWZehJ`X?-dMJA0P7W}^W) zvMB#3dfSgEke7mPbiB@Ot}(qS1dWO%cf~qzOR|65H+`WmJZV3b*cyy?HGxl!uK>h+L605GF0}npKhn3*AEmDU35&fbSev!6k}m?1l*5n_Jo07fDeifq8)A=SR+|D`CQx^_oB^I46W1L(3z3|42t zla?qNvUUK~2w-HCkbRAJj69o`Rrezz{dnc!ecmhRvamcC3)1bCs4yT#q4y&&_i`4& z4d@{Q9v`JyQga&G)c99m1n>GGt9(yQ5P{Y$JDdHNA&lVINu0o3U@F-y<875kd*3i} zRZ2ynkCI33|J8XoB|>aS(vWSg_lEg|eVD2v?k|lKtSp6&nkG(LJXidw^0Y%UxNvnH z5~6OkJO--?(_$gX`qhO(2pE45um}o_!_=_3xT6i)+YYoykAD{qQv%$Wl6^WDjTN>J zY<*Jr+B%Yz(b736C_=sUN*_Abqy?*`Qk9=KLUJ7`y;u0#H=yk6s|<>84&!Lm#!Sy% zESSWR6vben?5}U#tCiqNo@kNN_*Ed`(6JqoFi<&8R5^KP8{Tpc@~UBG{w0L3-Vj%u zEJ%EIDHlpYmGS%lI)l&-tIl$a7QHtW8MowQgR=$|Ecd(A}TVx<}U z;997k@}3f6#?g2)rQL50VVd(nL$6jB3{wrd1BI5bD7M z`eHRKkp3g9B3e_X#dPH9Rw*z?ymq0R-Wp102Ql+fl?Z~0(4Oq;kX6`AQ$O4cJe#f3 z?*}fwShTRmbv_f1r5krmR??89I>esTe;UR?cDVk+kKRVrXd?^Oaci}CZ|~gAAYHPT z^^!HeYN&-2Pn(8GxvK z=nzFx5EYX0?~z|XzEUV^-SS(>WeepiLGjru`G_O2!xOrZFpT_MJ?I{l%j|pY;}*dz zu$yl~@hCj${h>VCR(wZp#Ln*vdwpooel$-V#~u~;`SM~05Osfdi{-Zf8^sSHlrg(3 z5nrWnAuiisnB}W$?)}na+$UrfaTOZJL4Z&2XPFm$Ngn4zDFq%27sG~&U31+=2DmMf zf4ME>)ZX<0ha&EczDY32TNgyEv^LQq0z|yQr%eVXs6%bs$*+{9C0b2;r;s?u7l&Tt zFA0KtXyhN(!E*q4k)JFAfbc=LteG2!P?RS(?JHirxm|Cne{cUku2!~jgo^W@ONSr~ z5DVVgnoV6l*V5K0@kWz`9XIQ19qnYGj4#yAJMY(jHJvV9?IZ)tJ#&`rE^Q_%dlqu6 z>R|1rSRj%bre2)#x8D zXRFA0mA`}+2$<5dqT511)fsO2O({w-@A!<)Khc|inD|Wu3|o9B-C}4GRAA80R!lf5zZm-P2gAs7waPl3Z40y?xEz9-?U5Pl|@tY3>T@bHL{{wIPq+AAV7Ut%`9#OP-trf z1~R$iOrBYz`B$;yxX zwm*FF{~48envS3c-+bg{)J28^2R|vw%kxL>zTM+@iH}n z-T>X_EJ{%B{ZH3fJ|C5*dhaG%=QV-9Xn*^eV7nl)*u&c}Ex82+!BtVFm38p+{LEL~ zDi_IY`E)8U>0?$JZk)vK#cKSw+y*ykSM>a8$r|0;4zjs2T@C2Y3AY080ors7_O!?y zFFmtXisc1jGhCJ=&j0R{|FcKo&AzAXiJM5D;pE z?2alqNt((~8dxN<$VXim-logfFYU>Y=>d74If8?rl#~a{C#4B!iW74@}^m~Bg;m6cJ*2ffK7I6jF|Yp29c0` zEyJV2)f}V<&-kDa(YYX|6(PE*uzMaLz=_<@##)N`!{c~*1NAT$PVmcdh_-JhhS6pt zsqFH07$=IU9`F8RRYTVCU6IdM$>oB6GZB`?3YSGb(L4P9<6CM=W*7rvFeG5t5m%F zB3rJT8}FYVpU{qedfrd+6CM_Rg?hyLqIaT)z3)SuRyHUsHZm6m`b( zg@n>f6=vPg2affXtQQn!#tT>qzL)>}cvaS3wnsi+Ge7f|-douN)J2B^ zJWbo75Li>`GVHFF-1Sutz89=UrfuFRuJ4iat)cLQB$S(0ZW*KEn{M$_sLY`B;fE+; z@|(S!kE!$Zg1G7nly^fl@yK-bt2yvUaxHlavDm_cE9K64AndoWBwC`2f4qy|KR!5m zr(w5g%FdqcMkQy270*W&t+8k|CL|JhW1P@*8(gqt+Z6ZJl%u3$n1~3`HkK>Xx(U{RJg*}k(NH899-Q^aYk}aSqSX1-#1p?q^Tpaz2Knj1(^wt zcrc)UL`Y)&z|_y-pbehpS@8=dCrxH0qaKPmNyG7v5cu~;>JZ~aORr87R_LC}|1+BR zqVFxj;Ced^k_Heq^ig>JfIq6E8d{z9mWH)Nb6fpmvXb3eW;n{^)ub+8l4{mx<0$=) zNd`NO8Ez3C!&oFF@LOaFmh+3{zyoXk>l6F^ZN5o_Qh$@9z{K2+duaxJ@Z1_XbdCZgV6%@&+AEwJDPO0joHN|xg|IUn~Fe29BgZHE2fe!ft4;X!?l?~UEHxq$Z zi|4IpOvSUn z5vZrJs{b}#*+W#5E!m0S4BxAJOlM1Kx(vzIBW0s4Hd~--Nwk)a_ETL7iejK`UCuzH zaZ7h!9sT29I@I<)BC;pu_bKp@>8F-=xk|AxjYT`KM$C3;^8Fx8GQXHHQHb04bBXPA z;`JBlH&mrXO?etM@jsx*&2$QHnt!BR?@5ta=uGtm4_GIGyqX-#Z%zMeTmAl~UckbC9%6zo`wK2tgbL)h_k6$z@*tGQ?tOJdiOR*PnM(HPAQbY^NIDoZ)U4Cgmw2 z>c-+pBIT+cWGl#wB8)UYMkQ4~-@hMpw?g%FwKWsgC+&SglCkEWX57Yv-!yd6_(Xe< zet{C?-5Qng?B?J}L-s%~J|B04FyKkFXeMo^=n6{jsw`jWOXHRN_pZ3pXrICBoPa+V zGDOPP6tthbk!7Po>3j5evmD*y7x{&|UbC3sIp59ARt34PWrj?F25eKL>1#iApKBwm zu5yTdb1$&nEL)CYK$=sOsbsMj@xvigv$O1NOx7?|-}45ck|z-*QTl(MZxnpqFKOG~ zCP6>It{=<&v95Kk5KKvm80X=%u=4qpEM%nKzI|`Oks6ec9EFQnx-uCu%DE3p-Q=4? zH#3SID=e${S-Do6_SsLRS89KD0OMKH3!3f+ea8%o*~i+Zb?bQpk_?0Q&s+xF6MZ6? ztC6bBo*Hpx+K*a0-p2UdNjpihbtM?1DJ{r-4=kuBfD%$YU;VMz;OINyTbZ+TmHi`R zMjmolxN5$o-n7&;r~$9*IyeX>A>UI+cqDOlI1h!`WID96LH++#D1qENvW<@kzgxnlCos=@L;cNMe;Hzr5lG z@z0g|ucPQ$+3SSxK?B<(>ff&poJ#j)Uc!=+U7TGRt;cBlAueMLQzTMfd1}Ov_WMaT zKq!ZwXU}S2$EH?AOG2U29i)qDitD;&Fgg(@hAu9@Ev!o0>+T8KPfWZCnVT``c(*n~ zAj$F3>DN&*)hS~m18!t|n#^$-gGH&$hyO#@SBF)(ZC^_%As`^#jdZ7!q%29RE<9oUHdJdl7`TpBJKF{8~^IdDqF~=NpE$gGb95cOg^-s(E zmyUbh=sT*jdeh1p73Zlr>8Me3wX&_WhS&>r4bM9lq8j%bR9{;o?mYE6lVXaiaO#Vh zywHrkX*k#KodK_(yLGhx%0%X|6c0woF~e~iaV5Tz^2yeo3%MPT=4c$O)#JK&@o1Od zk_?Tmc8&yW8y@OKtFd$M54hSSVaJ+8cjL0)T>FT!Tb?ia_bVOjOtr^+vi?dhgV^&% zjJgKz)<{aci4F<(;~RgA8r`??7pH@~Q6kvfymOpY^zT}GLLLY5_wU_cLrJSv+#m7Z znEg)N|9Jtr#OOoCq4v?r9en=7Y8xW9C4`pRAE=;4pkFeWw^uoR&Q_Z-!21w1Zy_e4 z$i&$=WoqFp-kW`Z8=Y=Y<2!lh{sxWF#RFRV{ufHZCrc>23`OP6pvF&D2tCnuu`1%x zvy*+%_G1P6Wzei#N9oTH54JEfj84)kI13%~p_B%tnty1}Ey>vnS>|r_566GWS}JxD zyXYQy>v&(O9OIVgt4GcO>II(Yf)kqX$faU;j?+Y;{wRoX$H4-RECW|MzVs_18RQ}f zkKnA7z}%$~S!qyGIFX&sOo3mZ6Cu8pHbkBAQY{E}%%OtSBYtE3{4tC}K~=+~gRhcr za-JgaFscbnevTxjZ4(Iqiw>|?A|%+4U8h!lp-TE@KCm5HM>$cJY07=7Q>mbU#RNPZ zUVvEPlJm?BpP-bqhfJIZm7Qw;6O%A{L7zvu(TG?BJ!UPA6vqQk6QyIV}#mWaV(tUV%e` zEOOcy%Gng^GoO_f&Q0axk#g~sdl~!7>j<^#r0(e-3U_6IqPv^+B=?94 zi1w%>e9Nj{qNq+x-7nv)i7TttP=}NjCdC|fKVOtLG`iebA-2oCHoT;IYa0o2x^>`s zf7t^B?Ot0*1ObnA$f#g-DPjbI=kWm?K28&@o> z&0fI>!$%89O5OB+okt$%no$8O;(y15*%P+HV}x<(9f^}D#d4|UNQHWk9TR)JS;Lfd z0Ttb|)D3s6csM9|oQC-q`iAfP8MTkfp7now&QDOU!oJ~ReT9u8e8)%<$pjtP|EXn$ z@Ear-!!41oi2T{mlFf%lVgLORM;H2eJ_-cew^rouze32Xp7I6CTUBL?ccz}QGg7CS zY5wo)wS>)G3*feOOgpZyNdeb}71 z{EgWZM!*F!;QNu|d7f;jYNk*2}}~o{<`ICER~gagv-Y$L{MPb z@rBbASX6f1BwD?bpTiMd2{<7o?TMLiYWT`Z5@PzTbPPBG)B~{U(epY10P2z3yep%? zOxKcjU+AMz&7#7#f2#W|4Ep@rU-0nU%}Z1bKD$5HnW6kP5(U;xFX6hy#Pu-jDTey# z8EndgZp5LzxpTc3789Hdvt66sp^l%j^4r$jT28I>)!-6RlCTWo#9>Zf%9r?P)Il%T z%$&8l{~dk!pq{GSCn7dJS^`2|ZVE!JX6|8}x#~j`XhNd-bFflr=!7)f>;tny`7=X7 zblCFj{XCYM^{woASRO;6%jdih<&G~7@2?m4k)#6qY4wzz8EJkCE$*aDDVQ~D0b9i~ z9ur(mDvnI61Gy5jw`SGg*_Q=NiT@zi*q3l$ogxjcc2|L;K*zR^Red1}$i;Gee3+4P zZ=1cMjZ(_{f-cOlT}u|sl0aV-v~C10dJe;19qhu@jkuTp3Q+;Q4SBPBMKt=g{KQNB zWzW9zym0XYkD89+a2=XkUAT0i3+dv$;^3SE;l(h-DMsmf`(wZHO1#z;m^g&ozcjfx zbLmWe1ObzT(0D`zYBM42=i@(?j~NM$<6i?=AJaOslf=P;OTFjHP+z=3joIVz5RQTKQq($EQ^-W}Lhv`>KPuF2oL($y)K)O&<>Bjl7wnb?@bOs z;^AZ907g&hk~;(2!%>w&IQ6d3Xj4iHn zsf(Z9>Cm9DWP%Vy2}<4WdJdC<12RkT=b4hV?(#tk?0ehGGau1m}t&_bU2*AG0zxgpHcU)jzEK$pr*!)LaxhV4gk1P5u)0fIrQQ?A=K>*z{l z&%G&1{eo4dzk`bI;NQKn zBZ)`kT?yYlDd<0s%9G`zDisJ^Cy)XVTzJ-pssZ ztIbB#;xtF(`Ih@}_p86+WgB1Xxfw|ivZv1+AX)I zqMc=1`!Z|TS|bolQYh=J%lh%gp9^frc@oq!iuE-!zGM6&C7O-J=Xp=^+>`Ilg|}2? zYjf{n0g2&vNSc~n!UuR_Gt!C=w{Y6raxAq`$TX7l!>R;fmAxG`eNAQvrPLskci`lW zW2IWBrkY)l_itr?O4A;euCAR!(9z*vUk$8Z=0Lcb_?t{w;7&;V_a6l34C55+L>*m2 zrJ*zMWylS-HYEuT1$i7dqA|HQs)rrdj^33?DcCLF7}C3B%e9!3_SJAA0rCC5n4|2S zp%eDv-r;qkodBD6o#wP=`EVy=8g2P)u~pEs89{LLvUm`}9Eff^V+7@7F&{a`+W8B} zQH!Bp2#v*FhWiyl=X}yLu+18fGh7*l$O_c%8c0Su#N(Mv@mNj8}SPD6$5!<+b zXNaV)(7ooqR{@q!{U`2Cppcs07oSW#_8fuh9c`%0^&5DotI;)1W>a>?y2 zn+>cqXIU=v45$$@gj%EO2;S=&dW?ibXB9;E$a?gRMqa#KOo6)FAnW5gwa7H9#gDi# zuBO)aPYxAdF?Yef216a!PAL3DLQW48B>j~~PIH$+2=}b>4NP7QNGR3SDHeJadhEYc_gozf_>X zlAhYBUrxf=`f8V7Keo-7O4uG-fmnVZ)#J$*g=z4|XJ^ zBG*2qOvp{OMK1Ig(R)dNZVa7^_fDPwOV2weEi_o-=m7qbaGyg@`PS0w&RwEy8drtz z>b~ay{&y5`-azBME>Iiw$@?J3IUy@eoG+r0f&Iai7ma#05)}Yip3zxWN^%5c9otlU zE!529Xn%m(rR6mnXR19XMIl0b9I*c_aTrlgiIM~xVOc;ZAg$+dR$qUObfqm-0k5!)4xOxi$LFwX zPEg#!+FwQ^SLOBA%57zVs~UCLsTIHpH*?QZRg-F6L0Q3h&q>|hyrfOPWfAD4EGSg@ z<~IJh%aKpKFQl`YDcC=he;;(3mNyW_(n$qD-fYx6-Vdnrd|Jg32=G5x+ zfXg0dDb6d}ZYX(|C!>b??O(6A4AK4D6OQ`<{NL|t5lSqy>cB`FdcWhPy<+t*d)X7Z zR>RY4Y>uI)^YQ;SkpLDU`-lePf*L0 z6;OG^vJ@MHO0zdQ98NI;fXVDE=^o9%8RV2OS2F0JR`mNU043KKf2#yu?%3H2vu1c_ zZX+f49ULFmH47~aP%UO(WA44DPI?VS%1liBGN7KU_G$CG*k{Gh_M*~|s7DFwZ_M08 zg{oF=|7V4uaOgzM&K$?w_c2bfJi``HV~6ScGc>R&^oJQRyXKkjN(=khLqe=#<#1n3 z1;|>K30a!26BCdlXD7xuIb|Z`sqbP<65`QEmF2)KWM>Q~ZZU&_-6t0wu}Y-bsQ0Dp zrfqownGLdNymo}6g3u53pdS|>-B_u~fh@|K67@T~su5V%2_BRh1B+g^0-^Ql%jI{v z#Mlt&6ityl6+Rh}Vt*A5$@#feiRnq2=h5N@x7X?3@WBF9P@9k95N4u24FbFJ|V=S^>^byg3oom4p=%XEzsPE5%AA=!CSF08z(!LS@kN z>y?q!azJAds}jArH6iv%uOH^W^;>9$P=QkR42G8Y>tiD1BP*ow&P4;dE8(SIQs$F) z61|=4o(P$ye5R*y7PcH0AHO*g>?Jl3l@<+(14Rs*z&i~b!P-U?)Pd>1(R&v3FhU)} zmK;1=A2B?Y#D%>QkHVropw0>iIw-{Waza)!ElYkj8 zNR%C^07fy=Ot45YySmJwdVfBWF%!YcdW7$1_-w|k{Whbi5)&e+tJ#`4ou8{AUkW>V zylQi)HJV~N${B{>zU=|S{-m&Ze@{FaBsad$3AqWAZCSp$#yJUa@E>a2l{>ipYpXwj zJIfZ*ad~k!|H9sNnsmb1odPxN+pCvOR0+IW*|4Qukj(;>hXf%bz<~?Uj?EupiRw$+ zM!I%k4XUoJe=q6(NdQd(6uPy_6>gi3PT7Ak*9V2SsS(};QdY#~JB!OQ^eI~jbD}O2~Qnlp@ zSLMI5IOag^b&Hp66eOMSOK*{^bC9My0&pWP3m+(~@V7p?eiS;RBpdg)ItH?OHWDTs zZ}HkL=QsE1&xV({U{pLO(bv;GbzLzpkin6w{~<#u%|8RVYcHt@5L-z}Ki%4d!Q#52 zn*zkM71KaMl67Oi1fTv$I;T+r&w0#){%8T=ap4E^L1^&Ywnt1NWP&|+&qJ73;L42y zkhid7G14Lg7!f~8^R2lu1p`HOs*?*buh}h)&bS{gc1FBSgO`i#EZhHy;uAo0_7sbI zx2nSW=X%xE!8(u(3g!I8omOB{bVO<_Sc#Ccr#j+=%`_i+a;V5EQ1Z-JfM+B)ELg50 zKC?a4lnD_fL}cv?W5S6LDb}niBk8zk!i{b!Naa>QZ#Zjk*8eN&3|i!R)9UCunY8VW zi8!mt5FXVl1wyiAaMfmian*jxsgVu`h0Ag1ZTc-5aJ6~7%<)#$3I^IM;n($QfRK1y zBSZr^K3bqP(B?C9LzgO#^7n%IcIT5wY14{4FlOIb!jbG zhFK6JY7-|rp#Ap8-#GYN0?>trhv?bC*9E?YeH>NS4^Uc-nY*9k=S`Y3C)6WqJ)VCT zPz@*_i1z2}*EbKQ*ct3#P5ILEUo=524~n4mpOx)4lo#?~Pu6wU9E={A#ZlV0pF zg5UY!-scwNUfIo+$twF4s>HY7q%Em{_17QiJn=&#XGl-C@vlfwdYo>FD}JMNFT%yR^t_bb(p;CO|{z;{J4Ic-d&)OhDsaY2C1N-eRnvmqYaln|PAvl(iNt3f2R zw8K66gy;H-9wWU!F_lY&fy%S;cEx^bLgr>MRIiJVMBLkH!IH13UB11nGJJDhiO-_==xaVxs?8{704Hw}X_^-*v5No~ijpPqSH?LUsm z|B6POlLz(lDmwhx?<(?PF?#JYru2UXWRvdfE~@mkphx8NptN zS%$V_22rO}w;6aB;C*uYbS4f+80?xy1Kd9?w*Ux1?Yz~)5hoTl&Rnb1c@#cWoqK>r6<_r;!o?gwjP*=j<4Nqu*J((*!L;bX9fJ{y4v&5`anhZ>E>xYw~ZUg?ZX`I6P8&Nje{uzSASk~!StCr*b5_Y<4T$mSGfiY2Zy% zmG6u1m8vus$cBoh2y_Z9qZaJI+T~JDG&NK>svb9rbQcjf?GpV}YU6KJ@84m3pVbK9 z5$tVouC|E3-~3cwn3xq7GcsBOB)hiLAcHs&j5tohX+&AOCTQQiK#!27VRvAJxuQRJZDyHKgJ6<q?cSlPejh-)Ov&Q$tO?=&l*OxXq=&yQ$W9PO(10c&4^KU-;hBB|FWNDasy8yn zBj5@se8mTu*5BMmyZ|CfB^l4dg9l#I#>jLz`o_S0?#BY(#d4E+PGUpSL?rk3Q`M8E3hv*?9I745GXt~A_sf*20)P5?M$G2{AR}6 z82dgI3EECw{Ma5f^tv99^2J^26+jNV&xr&6%BqiIauf6fU*#Uo*W+)!79eB_*hBc= zWhsfub~Z(nil61Akr(eQ@tSZeYrG$HHGN5@4|ZH$Ex1_O96PXuP1h@bVh}1TG(9Ov z;0SuU!-$XWFSb~H9Mo8sgUcycx?6AG8XdFm&B?J>$nfz!g?a{>$=>~H%*Lon*O^o@ zNZw9#S_XedP>!~xE%NIp=`F-M$F~Tf7h)&_PVQwqnYmF~e4VlTg@ns1kN)t7k2s#t zQ`hZHloK{c9@>l(V3ixgUlc!kel!YH7rGekiPznY5;`hjQKInCU{F)XyT642Iv^~-wZMfBR6IV#*| zIV)t;qG?&LJkbI=^)AUz;o(}SQno;-KLA4kpj{d)-%vQ#dS6_Gnm&jq)9E4QMqnxGQ?sr+TSPV&M8RL9xQ}O!S8Fuch`oBmnXr z5W?*&9By0~{DIRzr4E19+Lg4`5!#+OlCK_?Ey`DtDQeJYqtuTELK=+B0<#q4Ci5#$ zbFuI--}zFQJJl*%Shv6mqF%nGQW2QxmOjIn{&#uh@YSYb|bIu1kZ?MY{olCM34i!TMhVIlpK)l6`u`o(9LRBZFC z4*o9T4f?a-e>}szR*GH_{o*zfIq9I^7ROwbV>7qwU9@wokfM1@9?-+?D6;{MNg~cQ z<){u^|(ne;G>4 zM3wk8cz~C9TwubNm;o>BhhIUAo$U9^q&pnSsnO-=6jP?q>sDs-`)n9W;);0t6hJYZ zOkeqd1q5Rvo>ziZ62fx=cVe=q~oyI=9usSta0oXQG?VHtyIYQkG09a zKw8KH@nA0C?&q4p5xE5{NI7J#{KK=&9SRl64;l&g|?vBF8gbdORWg7<3fx; zn*685Xq(&cElheEkE^tY$oT*8><2YpMaMIrRf)2_ZDkl`c30!k^3KL$;~}RQ<(#Ii zyI4GA)ze*2H<$;ziZU2 z-Q|E6VEGf0{sXiy>P=(?Qr2{j`zt_DAWZPS-g>HFEOWQ4{$N-0SGyvHb%fJ($CIdE zR*gQA)!^TbKvu*x{iQo3pn)n)%rzA0fj+)<(4DCTuN!{{&VzqtoKBL{^l{p8xdaFk z3W>b9tZAvdhj~)P6Rey3=Y$*r2`9Rw?jNcULuu$x8ecs#O9p$30aLU}sO}4HF91eF z-MK8XcUO#Kukd_}^GyF|#NlnRhO5j!kiZp(GT$RS{rwS;w;?FEBCBYBhQ1bd zz9v=1JD%UVbi_dY9rl8Tf%@CDNCLpB^Z8RXI9qGM=Zuy~3fqB1szKmzmEvdqZikuR zE3w1t-3Pj=-C)j_nVd|kr%;Iywv}9-m<6OGgpfVwin;qkfZ8aO7Iw}WK4|bDm5?U+ zX!(}wN@cSBCLH!&E076b+v-I_@hiR=cFuPzL~xgf-%hfezU6C^cuWz1_s0ALRz+|w z@EUd6)4+r4Ie>e@fCQ?x`oZ(dnwC+I=&w$~NqH(z!ttz$CL;#>$@DM}qbal{x9+{3)hEu{LsJaG3YwlK3$phPGUjrmkO2>ml3VTG?(@jPzjsf1T zcw$divjy;IeWc88obCw^^)CRzXRFVJ0Pcd3PBGz5DLEcCxFCxH(e8lVNisn;bEABO zmaQkxz@K)Db}t0i$jwUdhr3aZ6=8DEcPdeUewu$JU*JP~dgO-U!ubtVS#Ce15C?xR zwgT&z_*EOVgR+Q*(PPo^KU_o#x*>_=orKtO6tSg*XaXT7UCqG-YGsOqx^muxZS!79 zoLOT?5y#4dk5k{`HBgBJ%6%=y`&Te+B0_&)Awt& zj;bJspOuJJ-8)YJq*5OLln6Y_vq~L%U=Q~qRyR7_wC#h-j+|ABcuO9}26dWMeCOKGu2$?Do2<#dlEO+Qa2kO$bMBcI5~0bW2< z7*~t|{cCoVXph%Wz%x-&MarE3PBG9t-M`{}bqhnI0;tj^r5Macia; zJXg>B;qC0BSTQ$15^c$)#v2~p3D9nYyJ}Ir6oq*M1?;D(z`+pD{$Y;^OCO@>KT7A{ z0-^;VZNi{$``OdIBL1T<4I@u7gxyjiv8DLQBp;T~2VlfxEP~K>_|6A_KT!q=w6#f- zaCiYpY6N${YuvgLYs6N>1#_NZI zgRp~l&wcJk%j^J0uMgm?>#pj3{n}=L)7M96{HMuJ%N@V|kIk^vYPEN3Mw(aiu*dcL z^Y6T95Ei%Yl5P}ILD*a8glic8OAEh4G${g2d|NzCPfMRb7$6ZgOECe$x-sv4|N7IW zxbKY~EZ_ybjeo6bxTk&B$Ndxgw8y(q^`zqIi>NL!H`OZ@TD@(y8sZO=e)_Q9myb^$Z9j`V+dma9o3>_Eaht4?5pZ*E2k|}!9Mb#EAdpG)QUSwucW!2)NVu24niiv_mZoXezps2Ef z$c*cjZV@?qU9dmGi{BqzDIe74qPw<#EKJf@FVM``yvCMBD%f_KR9~|jWB3n#_8GHi z?y5cn)XhYYX2@HI<W!*S`Vp{{))8mW5Q35;RDFu6tMSQ-}*dd+I8Vla&dzE!qY$rD= zZYUSr@yY|2H0T8(z-1Ok1;=!k-*%gXbB-l|EWWw^)GG|IMf+3LE2F34p?`h5d}L7z5@xTB!6C!Nz05UpwzCaJDEQ&VU#N zG^TIuTiFP{^GCYmDCgBggm1jzhJDR#1~W}p&%N1+Yea05S$mkto+nPtGXwy{U0+$L z(vapz089qR?grtr%jMYO=wp8QKvVdkoo`Qj!Ybpt(TjAn{DC^S$?QYa@=2$}vLBMP zZQ#=fxt)+hJ3Tbio4n`CIH6mYAon=Ey3AKGkN;0(&>{Od)XT?@1LFzpA|ZsYz?bXx zNqj1$|3@|3Y+$eLa*zkR?j3onVnsRzlx5eATcj`Vty@71yCAN_9W6G{;a!ypYwq;O z@A%246v0b{j;~`TtOGPmnIt2_^WfMRr6d5i2cE0<`jhL@M2Xg1pxL6rKSe@1V_!9E zKbeS?;HU$oU7i0DyPg9}KB)q8bWlF>2^f_OV<&rN$S2LBzZGDt8CslA=L<=AP1lTe zv$N}uy${qLb#Wd*XNL-^{?0m!cbJUyXO3~E?i9J*dX42FfB8BulS-yZor|=eCYM@& za%;&COQ3ukR-X^3GT*S6MiO}bNB;RAwp%}$g>R_+fw^OV8AT88*zJlZNog$=sjHp;J2|ruoPf7hT*Ks_ZlPlib&23aEBIa zJmvBdr0J?$B+n~~aOdt8E5P7ojsaT`H9kT-uM-FiFUcB!I(!qs8Pi?U3xGM?Rk(xP9Sa%lXN?E6POuL^m ze+JZtdZLG3+MoOBAxdXuo^JAjq{(5>x1=cy8Z}ayA3_|)9nrpedUKlZP6JGw%*hd! zy=^F&+|+@eSnw~N?Bzw0;w1|v17?mmzu#vN0qryvph+;AdwhaB^MZ6YS6BzfuXOpL z#ipk8Lly~?#(n~LnBENBvEbNfl09(e91`d-qHX}tzdk8kbw{EnN(!QOSNA=Sywicb*bJx0X{GI0> z1@*=liZlPt82_%H1nt1(&AM!Pg%ne6!{!@_fjdZ8a+^W2y;-(`g{VzZV_DITf61MOO14raqlhVIiuu-YuPBC z^^1f+{^EF7lz*(CTPod%?Yc8lCX{+!418^naFph`p?rwAZ3zs(I9gk6IOF{ME$0;c z<@a(q_rr9~mK@pK-e9w{=1*HPArr^^`DXr8pWl-_u!j2shZ|P7r+%LOdJ&36!Wead zkqUnOpeS8`S(UFdh7|caajoVfcv!|NvD7F*lWD?VgrT|;f7eI4l8CD56cRH^(Sqt> zVD0qa6vTVq#1;n*TBTN($y?0Uphf@kWpo_T1%HEe z{u_q=yE$=!p}iWy)lxRUnx%}%a{(0#E_UY1shPd*?BVB&<$YxC!$G+9`Xit*oVs8c zaq0)C5W==!Tj`Amf;;=&G9Nhg{jG@n=t%r27ZUR`#0kbVLa=y!t)Xq^f<_%k5KoZ+QUOk8iA>VZ7 z4sc-%sgD~&*Cd^h*wgPdO>e|otz(e)yIVRJh+*;Yuz=jZfL4jW6!C<8{$o*1a>1TV z=hycHKxAIVJFDc@5$`nv9=pC%O<}nbTZ_q#vh=0`r%oN zS)beQe)-}xlF4M5g+bWOXi$XBib7dR|7`wjO*V33xi(0q|9hq~67QC4SJZKepCD7` z1u>O0of~~wgf=X1Ci1C~<)>P7zR_w`sBOTOPpE+d z+6q=Jb8x^k$LTHVBL3?Z3_uM{F}3;p3{aL}T}gp+jAUB3)dquGMvcv*&|-2XFVyp9 zA#elXL%E#!h3=VXfM3rX)jk(mqP_MyS5fdy~h@Ba)?fQgPA0 z5E6qQwpJ3ua=)l5^O^^DEU%X3DDc9|O?Q^>kM97&{2&VEKQY!tnTobIAyk!|Rwx%9 z+bfZThoTC9f>7iyB9sNoVB2Rl=TBrSnes!a1#{0Z;4-e^(!Qzv*TtfPa#!4re-RfA z=?7GG`x8AtQo6XYJf&JSE#HkDE*IHWUK;)l-pmSc<|s&C7R)+@qqE|z!h-HKeViQD z4FHdi>Xk0x{AIE=&`?^N?fH_z6%5#9sCID4Wlw53Z*LxGZft3V-pH%&$qQ#TcKE9U zJ^Zz8a>zX#$nh*e{~OajYr$zNN}yOzc9)jmJaFD>$>2r<`_lqzxe4`o<7s8U$xOEI ziNn*uKI_or{8G{-oKHFa)Mvf!pghmM2^ZWR$a5HT&)1^8yIamO5wVPTreAI_d7301P<61ySd7hIJ7Zq?el@Bq5)d?faE!pX?J5 zO14aoOc3(65RZU)p9e22-~w`jVWg4Ot>4T)1PnyfN5&m-$-QytA%L+a^<)$!Jvf-P zIV6yqv%vlO!)HO^|3Oxh5E{IrNT!;yrIdh&FoN8DCp=J)Kixb^aB^5P*gcjtncRt3 zfBzo^K0h4pHFg6F7BH333MJU%dD^R#n!*&k=8?m-p#!9%@5vQ0Vj_%{n1WU0#Fp9` z{s1j|QvWu0;~ikNTUrf3JeO?Et!R80i;pwVU^)Ksyc87}F=OY_>3>7PGwJ&pTfMiA z^@=1xDX$|-y7NCt#YG`BK>w2jY~t10vNBLMx_>k%%d`J5 z(yCO;&kDi<^uwTG32NQpf~a-3Pw}Isg{frvt1V%KC<{?Zf)alM_QSewI)9<7d+M@y zC~>VLg#VsFhw++R0xxLoCWz+t4!PWisURJpP&*ZDz}2T18Eay5~;TP5;F12dj{ zLdjTg<5+l0J5uLTJ8@Ks^n6`BX+a*I@0bcp(3tn<aDgnR{ZKWUs#< z^CZ%qiO8GbskY5yO<=xb|n zBYwp;GcaKA2k~l3!N}Gg1!JL@`s9A++X)x*CBA7u?7T6;AxhTqO{P!u4cIVepAbJL z#(4cA1?ivZ1JD*6zAVfS9W$xqKr)hb^ewbnwnl5xOiu3y@$y@6(h=b zts@#8kP?ed;3~Kl-Y$&>I zBE=sjRcf!B6SiUa#!5BgQ)G{)eRG?Crnx5uOrP>g;$wU!EEzJMj?F>W-EH=d))->s;_#Vg z4*mLc?1CVRXJN#qNNc7B`{Z?x*U?&{Br(3<7fdaa*>x81YqVm{e88f61|M{pMD8Bz z-ztgQpRlI~x0Spd z%?-8QH9a5)p9~Zidf?RKEv2}|Qw9^)^AWA}@+wvqPt<|9_AW%}YckLU!YJ_5oz42J zJ|CSj13eGZmRzL_1ey4D?*<62OJ2XGYwI3 z(U*T7X8~?Jas&M``q>;dkMTug^BRoO!rnLXkqH`anU%S~bYu2o<%1mY9Y4YQ<=xdv zcz5=*MmM(YhNG@JrG*k$&;9zK(}3of_&|tA@ayrUY4*VQ@a-0#QceKck&1;M?7dY!hITZfCpaQ@; z*MGbXTo(fFNN{I$o-bXe2vkfIlxG@j*D5RdD4-DXf_aXXT4(YO&-&Lg?Z!+ib=&l; zjQkw$nyp5@n+l)3Z?Hx9JnCbgwfHBiltj#<_+o+?j)<8x^psw$Hn96Xfu-e6ByCU^s5&*^aa2!J!6 zmE3HCf58{vF$SaY3{*SL^U?-}KN$e&1h50F^ifN6n;t`)447CJC=2wx5}Og7TIFY& zcM9EQ)SjOLD)jGU-=vMEdTgGiR)rD$i#5m{==e9yV2Wyp5o_052dJf_ZE(k8%w=oO zgpA&Cwv<6k7nS079KbaSn}G2x&DQFfIAN^r8%QK2EZ<$5;V}-NyP85n08N8uL5eMG zNiNDycpkzNFv6T8CX#mxxpek6q1kF*p|)&pN9tHg<-uS21ux01EVsN`n73!#{)Lg? zFh~>dslfp@^1fOd9OoJ6z%LFY07swV!pU-<==`noga;`S_&61iBV6u!7T9~DoP0Wej2i|Fe`BM|(%;yaJN$cNz~oiunI z0ub>a1kAQ{o(J7o8zkEg7-fN$-%1Nt#}8@md{p8J1mXp?5TMEExL2qDpgdv-0KHUG z(9G6X{{ob<4=#F<>tj7kH80|S&ElGeuWe34k83YQDwfC{J2|AucaXWQ%&lZ z$QL6yue!4`7yGw+)Acx@WUW_57`RxY`8C6e1tr@6Md+cKH98>M4on1aEXjgZZZ{yg zM8Oqf)F?LH=c}n1WvBqL2>|Ar^)J)xGGlGe?54PnK2&pG^vL9URIA~+?67*ji#ur4 zJQ&r{Q=a1jyUKO}7tK#zqt1H*CmZ=~Psm33y~R>ng+-XCSZQ-XgzU9b?Ev0!z~S~V zbtp>ByE>@_oKZkt77_T5VH2-rnw0&>BBu(3!K7N`a~Yk0AC>BdQ$BVkv&&Gc>YeLl zF&-z*vb`jL+em0?gwZCX6SAf2+Ft$l`09UaEx;X-O4;N;mU`-pQk@0@*oMH&N9a7f zCRImZLU-Am$}x_Y3Xw^thH&^53J4*H)xi9L-vC|92>$+%Qzj0P4`DihSJw5QmXFEmPu0LC=h0`04>~>6{_=Hh$!tJcd)UYv8FD{sEkZ)DNN$5A9d+r3KH8e`L zAq*~|$x5q1Egz{E9oy{8H!DexYQUrif`bo z7H^x9tu+O-swrzmV;fZ#S9|&&6e+oSW5xsX{!0PvD?b~bN0SsPht~J|I$zt|U;NW0 zdnGM|jcLzuvFe(e}$njz1vZdA-=FA>hg$pvH)&F|7!I8TA2 zKlWU8>Kg5X!~Q<#=Mkf7@OlE1xA5fiLdiMo6|c|8#YYYXoqkH9I^cv6#(PKaI?|0! z!23Yr;IA?7iXSS0vJlt>TMK#?Bv+Bv(B%URn(4MJ9X=>2)Y3vD%;xk}Xd)wd0}{+-L1S6}(ts z2BcL*?>z15SJOUqxWz+7?cK{{^6?c(HGLu`K4Jd4*Jh)g3n$J&YPKhUg#fq;8_CjP z2sm)$fRo-!4LN&D05~cQjgBa_C%ZyA82RTZ8&d>4)e zczpz|0?P9KDZ||;%klQ_ZJ@ANiwKw&sUW%FTz8%#o|7y!!1rWo66p$*R3jBz?K|5g z#S2b3s-Hw~fuj?2ePQ`H`f>}>@9RJ|ptUa+eO27ZSRiTs1BqXoU{u{TK|I65A<F6TQZm1aFQ-JcCEBF2Q z*OmSP=f@?&J;OoczRdl8<4Q6O5AVf*>Q{=p4(7Pl{L z7_*UcokciV1kqoSr}dFh1hAiOSM}8(*BdQGR&X^qd_k(KRJL$z^}KFS_Aw zrI6`(MSwo#-rYp?bnlhfu=bi5VBN;r;2D|&Zo7NVq^audStro|*p6)9U%#OCXuJfj zT8q{X(2fmm{`U$3>~(*?cQQXuE+7ck@N&qA8Qe31R%)qT3)4+brqEC}S~qppY?-%; z%*CWXk{IJ?%}T_l$0p~VJ>)BI*H_@rifG*aqmsiDC}P0k)4*-5;qP(u;wq=p5oB6( zu5iMkA;E{kL*ZimR~BqoZ)a+&{_^>GHB&&AEs;k^h#%SVPzYL&C+AfTLxM`V0X( zcQ7w&bAk>?sor1YyzRSy0HQ}+h1|fLdG^et&%+UL0Lh#@RHN=7Os3iJVnNT86<$g$ ze(-y4o@a%AX}!f-y!|8-?X6JbhP$`DNlwQ-py%#Yx}!=!)qRqt~7MqRI9wgp2zfbLM3m!V!*V#FxPH8+4!5}jgZ5IB_Wa*T`ua+DI5}xc{bKv8~4whl8t|4>T?hMG>J!Jh8Ayv z$AKc(g$?$6^p7(xFV7js?tUWVoC{h<+;h0h7SSwc?`y&@#iJ2SKU&EQq4K9jGJAWnOcjH-ztIWeke|X4zH3YqN&J6&y<=dV+ZHw4 zSdG!Jv27=fZQDkp9lMQfH@4H*W@Fp7oqW6Z-gEBhec$){xqt2FdDdKWjxpw#YqgW< zrGIa@imOs@wt^@%!W6-FGKKeTQMXnN4%Ma{*8g5+^N&a2K!Rq#V6w;)Qsq~pPEjH< zSx8q;@ldL!vo({A{61nHlzuDTZk@7Bf)yk@s0gi|t0+i9#=PT$5CykG{i7&`)wR6Y z=JaR=6&H&jf_oJ+?a_FTwb)KmCb7D(FRZkSIy@uq%gk{a~mdN za9R(xyx+JuDgMXv1HbEsI?2ptlcR;FYeu%TN{%zc5ZHqx`+5WX2XNRu_8vx7VO2hz zT)NU2N&&^DIZ|2`ovpG9@yjU;o0)B+*uWqQTCbbpOU0U66;PoU1w=&b2Pg{<^FP<= zuSLVX0hg|FpUB(-yZ>-_R<~7*Z6O?fJX~nCJLBP)uP^Y^Sm3)tdw~qqe3Nk(o{3^@ zqX?+bD~XG0Z73t(t5u!rk{6OhFvjM=TLLGkAel~do^AOF)qR&vf_;?$60IwNE%e8` zXF+Xb+{m2D5EaA~xPiNs|HMrv0g3#JMQL8R1GG+3_eLrzs2}A3bA(7n&FeQ)&iA40 znx{oBj-37?^}41R;-3{#(}6$U`$Y;LFCM%)r#BCx&c;p16$$-0sXbGSp1bd1cgi~UMuy3)@-VuWL-xt;PE);D{|s}mz%PZU+t%SzwEMqt=_vt zCwS@mP|q8yFZ6^!=jv8M6MK^QP>m{wKdYotwH79)R(*}icKAUgtWJr%Q&-1~?P0W4 zQn(N@on}B;u@PR)wozf8TzGVYw=Rj;8;wv#XKVOG_x7v=`Z#+-If&DijoM#fg6a2F zhJcJ%y@b6^N-0EZSglTCZ$=ytNw0SrTXIWxXnrZNDOfmTZJV??&=;cTEB=N&srSTp z3a@jNI&7LL-B?Yw6C`PDS@p1yr3rHX;|2y9)1!&h$`X7UO9S zUq%`$BsIWjn~&81-}IeDhlxz&pxV~6O(81Er~~c?7MUAI`##-5!83Xs7M0O>@cYzu z-B;{CGLhe_L?_XRkc7+LVC(YmL^vjO7=D@HYO4rWx^9Tr)uiYw>0f67s4s@94sp^* zR>pusE1T)21-j`o#}04Flr?{qOKSUnqhkoeA!tu3|GZ3eJ zNvv&oml@=Nf#Dl!MS_}(xVZD-n5Z*awRsxTR#h8231Nq5p#Q2ZF9I& zlB3ZNFft`pN{SYvkrGEd;}t$;lu^zHpf?vwF9(w~tjGHA7uoniiu54}FVZd0s8yKU ztvT}Z)v7Sdi_`Fv+Hr>+X2dvrLio_8o?CKwh%_!XnOsJ-NNhF5XWY%GzDqkS7gK*+ zFQtMqKc(Z;eJhjYXPK*4cG2vvL8yi&-2|$Ds@J9f!^Fa)@k!)+uhpG zrba)%nRGWfp<2d07gQ*@EZl@_E;X`Tixs~%Y27XTne+4;VC-W@)i0PXs}PHbaYj#mx;KILG;SVE^|k0n3@+ zt4t?i_m}v3Yi3Zepbx8Hnx#Bf7cn?9UDO1a2qh-ADNcmi?POxZ{Pe42arCl@9KCn} zec+Opg|d$~F_ySrqP#0}hsfDalWAO{G|T-XL^;sHIS6G%e_)nI6&`f^6=|!reY(^P zUJz7B233cpeVRtL-axA7W&AtMAh3aoWYz)?_caA5ochIhUKKGEQy)b4RLIU=DsX9w zpQkmeBD9dHY>PB)WUxPv;He%8b{NGdt-W_J4W*+H63YcAp!-zDT>roh6>(~C5?~na z8ykPqApiMQ{1aWld1-muP-(^EqMgQWa*S<>Qb#7urI6q)2YzysY`-VDE>2P+uPW_6 z51+Dbi)|1tNYd+xMa;7$`>EHTpRAJ(^@3=KfT34!pgv}(>!Br+g~%jy+nNmTd+w0; zHV%CEo(Eo!QLF4GAx;wwt7Q@+{sp3S*UNy$W}?b_kx1MRDeR5r<6yX0RPRjMj8WaZ zP{2^lfMs6kYN2C&MWii2m3O~7Tl1Z717rc@{{$NUdKxHr5Y)2IEQMDa9MN;wQDtrw zvWff(v_^7r(GbDOyszy%**~d_^z_jG{2sROlSNGboFVdQ>L97}6s3*E}4Hw$k)f{<)=yI|HQX^!IVG zN$ZxE0M%({H`xk)HJi7PZs+r)u|C4J(yas%d+!y>{;TUfN&lX|v6!}c@XEhD5J z?s?6e)e^xKvLQX)GmFJ-lhkODbkACK(*ED9mKvdTl-ED4P{c-v!^S4a&6ilwtQwZG z*YzM{R8$8EOL`duHUA=ufL2mCy?Y#Wc)fx-n(Lsy8(-`Bvs8F$fufZ;NJ~{y;fzp- z<}t*uq2gh>3}ka!K^v}FH8_i#g{diu5p(zm+HWEV)2AiyOY zCKVP1yS<$c8$)8FH*~DiY>$Pifk6W=i7{XLViYuEk5KA?&r!H|H}mHo|9iDMvj~vv zaOwr@^PHo>5k-{%V!T8#<{f#A+ z?L8QiQfqc@St1g%Y-B$&h7?h?_Jd?GS8y*z@LFioe^?1Rb+p~C**>FUDi z!|6Q)w!nv;gq3!zPMc6d(12TEHrO_TuXM$bFJ46bXIB#)h359*zr7KdKA`OlG) z90gMwkUPqEW;B#IQD^>PZ;x{D^L@`#yX8yaz1uW8b5!$QT)G23eVO&$I{dPg$BXiHJ;cbM4mld?mcDUnW(gN|S+Ej{ zhbGoq?r;yRdB1XAoGo)cbLm5a=Uy_r7nx@~+q`#DPTH-nUTA*Pe%XS?lTJ(Lvb+2p3xyHLnteVlIDaiQ{%RQBHpUhIkR=Z_8_z@=?WNBw?yjzg{ zLtQNdwJ`!dI)0@~EQ%+f)LMkx2gxk+tWoW&B9;sN_Kcy^`7-Mj7E_OA0uH{-|MxD$ zGzLFl&~46onWHv(>BqC)k8;t8^RB)m_Lo`H;SMzetI;FWvDpcJ$WG}z;{i2cwg)efH z2i;0XaMO%vMUwL2R~mY`Y(?6-MQ>x7kdD@T=Oqj3Sb>2$bbfME$NaBl%NFD5w1}GR z9#gZefuQwM!evcfDK zQ?w)#>$4OlsAqAO^G&TPmo2>n3fTe~HA<`#q;i-ANg%sbBln-NVOrXdDl{GE-gp9@ zciK3`-~^cuL&+_7iu6o}t2nEZ!5%G?3}CSD{d+)b`&X-Sm6!^JheOG&Zrr)f>a77g ztK{4kUk(3X)li2-pQ=p<+yrs?8Qi_uV`kL}=-YKz(sLknbRfym5+NdFX*&o&zUmAI zAZ0+7+L=y0hA4KlDe1N~%TvgXa`R}u*{`W0cYFqXQhzpVD-&cnnRAQSDsz&WvJ1kn zYO|B$JsiV*;g*hU;gu4>&_PIA}?%`zo=0fRRt(6K8ZL<|aM z5qxugA=9|Kx6JO0N6w+l#br9$;V}3)F>iw_HTv$A!c{HH!!Iyk^!2q>d|NE;65G*s zC^lRIx#q!7l5_Wr5Gf?kyITJZP}x$*pBr|vk|s5SR|GvOgE}rV)1SX#=Tp4A1`?!S z$phFkrSu(4?VdYUla9{(noe@Qu1huMaQ~ydjd%UeJb9u5%1fbe$Ld*4m&(N^82A}A ztoEC^OlV1fUBX!D@;-a6M2Avb0bBc;FL^e7CP3xa$S)H><&Rj9XT!JTZeF)13{2jc zA)Dfn7`91LAyd&2P9GeqH@~-3_n0vECSp2ytF5GVF2&f1#=*z5f3oC1*gK{<_zM!g zap*TcXI03dH+dd`O-dt6M}&y@!tq5SH6IpPKCebeVqHpq@k}H_6&!68KTH}}2320A z(mr)q;s@MNWg#O_6_Uxd1=7o=>?yy6tZszm9GvKg^%(ay%C(Wy4nC8#ip_R zNP9m*40vvFI#zD!f2#)%C_uMdfN;0SHFHv#M=^pdZ??lpdCJq^k<97Ua6-V;+D^iC z=4UdkeYT;QkyuhDN@&?q?=3_qe6EV6`ga%(>J6UvN_U+ZI-NzTIxX&*gdY`B+GTl4 zR7N87uBMG_5TnmBA-E0-OxggU4u^f99riOm3GjeTML#Rr-r=urPK9{{sZL|GDNoI5 zYnJiW!KrR|_6G4|vTvDisU24V_ZLvQE)B3{hd<=hROnWIJ_biBqaFXa2R0_|x=*KO z&!*4w5v*U4Q^GuwWu;faF-$v!dXbgsP6Iu(dOj$=n7VYb6v z?&H#eShgc+1!;4c;!HX#tKyg|0ph$w6c*dZJXDM4|Hq#0%$x!*b;dd&2hO&Z$NE3Y zri2(ClOw7YU(^D*J}mV?DBy~hvt}cbDWWoB6d~qAFRn_Ny~I`(1B~xNEka}|Z~JG! zd#asm&IEE~CFh|(2|9x-?<#N~mVnM;sTGKO85H7z#RQbLOED4XKajapzkcsqoBL1L zf9XKZf{PlMrFAOV@u~tI)g5+L8hz(ZFB~pWbGGXaP{gwb)%HS&igo!)8DqO*HU9j} z;C4UXhk}Vs@EejzG=732ikzr_mGj-soJ*zCcoI*@lYtf^mT%knbpTL;mxG?_&l>tf zJ`A@`AANEd!}PMCj%Dw8GJoc}-p#I~B9@6=IX_asj+6IuvGA-M?wl?u*C&Axb;C}x zZj!VZspc%~G~gUve90B6-}#iPz=Xt9Nun^EgHg6*asv%P03d9L)Z1vl^tfeAbHqN( z0$aYh@b!QA9%e8&hnNxS=9mcWRB-j_4SwDrSNP#FLqGr9d(HPP zoEy|+&4$#@25#=apx+?l(e6jQ&HJVOg3)RSkIt@Nqq2#(9-dO2b${2Vb2 z6|Nx>0q~w}Wfl(ua{s)m6do{wcup60{zCbQj{D87`2Ntf&{Qf2jmA0=Iy?!eL?yr` zXj$=W(cBjuzp!&Mx-q^<;(mtoGjAk`u-mZuJ~6ppRjOptkEmpF>>(4&&aDXw`jY>% zj~XrNZlB1_BUkM{D6-nXZazvDF=nFZL$Qz$O0MEzvwIhF&qghF7QCEOYW@e0Ie>*- zv4f;ES!$-gHL_2KUR6EV9|c^}_f`%su7@;%uC&Z&td&d#rz)AFFO__t9yf_uCKN^m zPrP&E;fDpZ7tX+j_c}}Cxkr^3F9D1lLhWW9Bv#}jM{g$z1?*vAZ%vzMB(o^7 zpQs_8&I;WuUo6bZj3>G9Os^E_dgweF0BRve$*Fvlf+EG4 zJldo~xwtj2uck6}`if|AD3)w>BR3;TwIJ*J0svGYchr)zX{Gx0weW}_c=H)*y;ZWb zb<5~jlb59;M*vw&hJ#Dw%k4n~mzmL1a%HKQ5)8zflFOsb%W z4rQgwrpCkrR~+C#lEWcJ99<(Q%`8W6ZUS^mBy5GDp;_QKI}O{+PJhptRXQI%rJWFn z|I*M{qf+j$g~zEF@<78CmhpU_&9rypdWm=w*Wjb@z2eF|m__k>4uY6=G&tn5RCJGF zG~`geX^_QlG>LfwzR=la?iz~r4G$z3^k&*s!aGXA&l>#l3$(b{uxKz+)PqJ~Ygj)D zEZSk`FvPSuk1d3-A3PFFLAdkA+A^eA5=UdT`%GN|kti(AVU5LdJ24X49{u^MCXx0I z-)XzH%@Qz53u1Dd`r1y)Co$pBM^b&}N^s8l*|Aj~Qh0fftXyKZrs3Z$JJo+dsd@NF z1ol|=6C!ifUm;#hi^$P=jx|!Ld>TJA9Y3GO3e|fy$_+yjnRWU=r@hg;)t0H-5Z=pk zoz26ER#Azbxw){3B7JG;BwEEKFT+7Du+8+%?(}}X{dVAT$?6a35qAZgf-28E!RWDb zd|x4xS1;;Oy_t;cH_dhSUIB&n7Vj{htG*`-MnetaCi%cBhg$l1WqzOoA8+53STuq zgHDB9FTyogTtlY`VLp#NTN7h+$u^k<^Y~0U+cyA8zj5NxQA+Q6rO^Gj_R%XaRI}j` zIMIKNL|D)de(pEBYDfQ)`^#^gG z3A3T#1Eu|+HX8D|Ol2}L>9S+|y7yRM(FQUS2t>q-B=PYpWHfQp%w!@M=6~@T_x4zv#U904AJ?0n# z^U9a~CFj{c8RvhLIej91|Jg35`upqZnof*R^(}FBCVk*3_ypW6EblH zCSW$aaUN!$tmMG&vf|{UnLy%YZ{Z5B@ZOqYINg=9+wQQS!OrO-kaS+#($5Ogtu{nH zsT6p=>`QV2iG7F=+7wCfC&{EbA~MR4w%V(jWw}*de}^a(HApDdVxBHbY7$MOs8VXcSc}15QIAJEoD`Ym%DISj1Yzep!_EhJq+7$TSHga204(eny~dL)A`*8X1- z;l*<|Yo+EDVGWulcZ>OZOFU1bHVM*vlxuhJk!cafGz-HX)W-0^lIFSaw8ns-O}3R- zOH!?NIPV&D_uG1cl&fJ?_yDMnRh^h%?k}B8T$?}A#lk(f`$Ycu9u=E`{jZe}7+qFX)t5EgG#bLaXGo3+}i8x-OxQ8Q#SX`ZC==f=m~Jd>3LPJYGL(5K#& zfxiKQPtE=}WBeynya|Az^7_H6s(n|<%sM7NN_ogoSj~huk`27uZ>Acd(Vw*_Sbw?I zl%vGiDv2Wle6B|&;j&j3&C#dbAQr=#n1CmXV9zdCMQGshtUB z%$Clg_{to_b%3Zal(ks_N*4Pw*&79TP#?J9!V;JnL+Kp+oYiFH^6wyKz=Rggha?uP zk-}q~gv$xbMmu%eoazxN@4Hu%gh}O0*A4eIN&|CI7&&MZHLoPD;%hI~AByYO#{n_lHhFI5 z8K+YCSg5`Xhyay>L{y(7VqlwXx0ty>d@+>G;@kFVO^1qAIK}GmxQ}JBE*vftqvF*u z8>~DhLN0XTvMIER72{s$IGl>Y$<0U{p*Fk%*AtEM=Ji3t2kE+{i-o^rD{Rte5`fy&?r**I9b?R8k{=c#!7uk=jHL^ zpOCZj3`PH%Ag!%=$&2fAVPo{D0d8E&VMQn;16wkD8Y*#AW{m{#YKkFpm@yR_xNYV- z4Pcr3yNrpGo{3HT_HFx2`06UX$66vPx{XEq*biBP;uk%E9)3=%E*dE|zq*lKs^jLvT?7o|+D468&bYBF=I5w#;R8LP@s z?mTieU~#2U4)H=PgXR9pJb@3d=ptoQSSF_ zEkvfF@n(r*{o7X~mvTGMK|&)wy*3HP60WQubXjg)$cM-dWQOZYWFl3_mH-c)Ax`;NXJJ13kr!nF(Z zkq_36C^>1rPqv{iP55-5*VH}!xMtw8U1H;art!N3>nj1u_LJBg`2`MVHMuN*0;In(4gw44UX^=RMm3m|4}ZW<%dv0@ z^wM_kS6M83?J`k=${I|oj4T{HUosdT6LR?1#F`#vmA5eZKQ?a+Vu1!Zu2CO?)^2Z`VmYYC z!=f{9tQ-ObhXZ?{EKu`=53qA8o;VgbYtKs2~C{ zN$EWqu0e|(+arBSagrJ{GVu5iSig;dx`$$2HeS?ik$j5b*4L$lo$0j=l^~V=L{qu2 zctaKt(g?fGrb4{#1^r-Et=Y*0mf-%k~>`DGgG3TdOk!k zt8|71nq8+f*QQ+gEba2j*;=mNJ=wL%YeP|c+X+u28%pqqNTIgpnz1>tp{E(;8ru|F~9N zt$r$Bp?{yB7uO#*v$>270}zVpA2DXC>`&NiAx7e0?Hnvha{3djft~3;5nF{1bJ4yC z)@4b477;_)b>yxI6mSEIbI+REvl|xyv5Ej%`CXEF0?9PF=ti3+$#t}N_$!mWjp#5r#~!dPk#$)z(f58LcAalv zRv79;X}OymJu2@eCM@+~<+fa-_`OoX1L`js@Aty^z03IuisR#|aHkST28btY+uMBZ z`B0A|V<6ovK8QF?Mni_<>GZXUt3*_=u^EU=Z5GUgHe#Pkjk}vd6r0vawd7HEU6cLi z+Y4Ua-y`oDbVxfPNBQW%npYvg-@m$O=}Gofw43_yRybQh?dcwF1;YyqN;Z;7mi2oU znmPtqyO&Cgd6Vevo29MW#zuT)5eHKF*l#R9WeZ)B_Pk%~*6*7C?*ZhC{J;f@5&j5p zIx+K*_U+S%D#gjzpq=`FObG$Wz3HjaoTGAv)glTMSxZ2nFknjMU4PpSy1P$Ioub%J z4kj>jv+basF)!87KG)_B9s^uPfJ8-k<7vtyz|QY@a-e0obxDEmF5DHM!F%1s!?}N% z-Mt@_T{M7cy!=-zf5ZS4$Of5082B6t(?l?U=>n^G=sI>94Trirxy`n@4-%~YbrN`G zT_l5TbeN;lj4==C`6RJi__r3*}S{Xh8aZzp7Kf>{ny-d5RNbd#6qq9CA z_I4!9u)TLW*nRkg?=Q#IH1+xep~7ok{w;hW9%9cNkYVEdccQn z{&G7k3H{*VENXjx5XU_DNv2O3a9D`sD=Vb^%cU2p8<|5bU{1HOdg*_>HFu;Su##XY zUqINU=fpVarwh7m`47$S48o7;%UM4IG*?6RI+f0c5{^bsr{zg$7CHK> z-@~buOosD^YPLcw(_BtBLvDIPq0=~0mL`;^iXHXz)EZd6d9C+5*7LKU;qPB$@~D&g zU{-7X;4~|RO&l@UvzzU<-x3g9tTM`}ll|f0T01r?*Gw$dPmn^yMGQWgrwX;6xj(-4 zFLe1oHdf%uJ-7p_($lTyNukFVUy*sS$R!G#b!%n9;_>Nnf2d}t8QWuda$jcr;kex> zwGoAmVP&;?5ub{9iFFy}Pi5CXFv)HMGJRY~ z(=MLEztgHu(0GnzB50KQhxTq7{5CJ`?(pvvWd$M+qG>Pu^)2-okS>Cl$@)UIH}VeR zkq>QG=+mTDuda3jmZTj{b1q{!Npt2maT(*CE)1MnGduWuqZzUJhn^1u=dnphm_AI# zF$Uv(Oh8&uGIA8mcgT>^Ea8deA_KLp;8m=zkqP*=8E(*^W!s@^3UQrbCmo@7ufR1i zeOL=cH91+>9|kverM1VFBT=Lx`|MZ|?=x2*%gvZV*itL^2I4*C%cy=e$N=!l$+fhS zN#eROmI;g37xT4#&eDiQ5|G$egw1KX&2aQSefBt)bAIp8{-yWk8ljtuIxdBVzf!dD zBFxAJF{3@GbL&Kl@dUQ}^V1Qa>wSmc_}JS%Mnj~I?QQuLRe$^s@UTD&%Jn&LFXk-6 zde2aY2?<_RSGX}q6ynI$Z9fMCZ@nPGage)%Dv>gYWTbUH-aL-ar@sjsry+4gulOtl zt*n05ol({$x#!3>Bf-Z5Wei3JSuo~{-y!`T4qfru1RbT3$D-=ydAgB(`(&mC%6q-o z`{g{>%-AA}IO9*)gvlb;Q}XSdzVom1H!!e@7AOjO3w~}XLb4Aw^?dDM*Cg0{3>rO0 z8}EKIZwCLYvi}XUj|9I3nJ?tq`pf8F&7wl#($Q^UzA4RH_zWdH0{zfMEYMUNiLBRR z7E5^ELsG=XT|krM(T*$S(@b$r(3eI)1V6O`aRfrg=V~#e73DJj1<*0wU8^PI0Wn#F z6C12{_WeZZMYc)_;`#${Q2~TLW?2qjor_< zqO0HpXJmulcx?DWe8V`;gK%^!)dbdaI+SxZdy3bs=v<7tD#VE5z5xuvw)zv0K$$F~ z@9oW+pb&m!EB>t0(P2YuBNB-f<6udQjvx-lHIDZrBZ590ldz}BrLsB32L+m{cF)Pb zV)P5Jot(rYllKBGh&Uu56^%SWP7)bT-Z`xoZJ>aTRsUddK2tR|SYA%uZBX)0w$o(a zrIcac;E`D%N&pZUv5b`35M$b&g+h~SC`E7gZwhv8CtqjnroYCLBIZ;B+mefZea{N! z`d6FoGJ}W-#p^-SGjVm;b&`{|z_N@dR3I1J$@+D>dYYlT5&oyGXS;2{;1KV!ae23+1N{ ztG)bb@NRDQL*eT{<*4fJp((Ox`{q-!xkWCd7r2Ok_!6oTQD zgXVHb%TbW=NoH|$jtWEu%7N_#05OH;R8F;o3eGanI37fRG1m*L2dFrC{&!WjvqRDU z$RkqnrY@Z;UWa`zO!q5+?rQ>2E*pB`9-i@X0Jg+~`ECd#z4O40{Nh1prB{3!=*?qu zy?+n}>BLc$5`?~-@r!j1)rcar5vlYOI=5Z)n4*{3dNoL#UphTnl%7suN{LdFMLFQ6 z>q8AHc)jey+H7rdP=gT}_;I8}@Ms(3xw!k!oF7D=(Z!S%$1t7!0!POYD}*|qT6=#6 zrO6bEv4qlgKVa(Z&l=nzuYf`M?RM(mY=f@7Hc*Tcahk#U_;LClgp5@rEs@x z{+841s!+4k<3WXBA1O>v965J+bL*4YsXhwE8UYdZz!&$aKnYI1rxp& zl&4k5A>~2_K9oL3SC(q6x^YCp`fgKwvTG`;2&=<1D^{6dZ#($>k`C9q@`>x{t9z+{ zWrI^u%R~%+P!C^vAV;9FkunlS#$)5?SN5ZB{wSj*#H#2H#FePK|6_~u+uINBgM-2yb~ z3xy`tOHKtdSS)NNhSt%wN=A*jH95AOHF?;uzi$WB6pG|nOav7uWwyFl6?4R}^asxL zdIn9@`Yji*W1BprW4c||fDWbjJ#p;q0=?C2F0=0h7VrOSY53335hM{XwITHWbnrbx zHS%451{8B?-#R@H%}B-09+rX!@M1s?^t^^5*POf|e7uY+xjj`3Q{RLP{z#E(5OWH3 z9-g>xf&>%!5hx>srC%)LrZ`xjfEQ=iAQ8=oa#+LjazRFx_)RtbY>+=FbLz>c6In3e zyB0g7QpU9REJOSCH4s&x1Oxdo^|yoo^z*xF^Ffb!QN`y(XN;ktRiz!TzH#E;RY38B zz``B23SAPdQUV(o>IpuT%X5_Z)S7ja#@kl#u^cSY{83KhPQBm)MF$D0(D+SA{e!}E zWlTgdW2tBqV@<45=Rd;@3gM8}$&qCb09u=ShkZmeH_@JS=gVlwfoVN%9olwI<2s&t zr2UF?crKH_gIq}^>t$Fapqmj(M-A>1m&vndp>!LI#uRyX0N@iFEYG3mc;7Wr_y9%V zu4py0$PiB<_P3DpN1@Io;JGI~{aXlak!^T((_+@-BC}R{CDQ>*oj~LWY<_jfw$Q5? zaUTlyGG>LSJU^c-9RFcJ@I(a}E9Rh6*|e-2lOI^FOBM>qw$HqcZCzAYTF`4~19PlL z_*E!q{PuN(WWS06%SDt21r?=EAS`N}n@3WypToNBnRP?M(GZLbhq>u78fZi#p9Ws3 z_Zix^g@g!80zH}7Mws_0IgQz5H?9r|#>Mb+Oo8L!p}F_AV`9%?yo{st*NxWi*Ck(A zX6@-#^Z@0j_$(uZK*<_7DB<)r+N3j<9Yghl_w4ROck;9bgXR3uc!WEGD&3^*B{_}h zehBx}YGOI+FWUAOHu@_BtE7OlQq5AyCjxq6S@0r!T+WkNzIdzKvspYs?FhX)KuVPU)V8CuM%avS`zpH+%FRyq(BED6WBoiZ z7jawKquFEC(*u8!|J{Ve%t^Bfwz!F+^>&pkqSM$hwsehp603_!9}m(jd)KFO(uh`l zBi3gPDoV?;F}x4r_Y@n- zgp@Fj^MPHS*hTg{p*+ld2~4ehRziqerTq^Q;_~{aYH0m~^|z}$oCF(|77lhC)`+QChdnNL42dlI8vQ8SvPP@}gOM>bgM`DHbA zlYZ%`_)F5jdcEoOig&T?+yP31jg!u8TbnU?o(@nM`l}L+oXW7ZvbOI60b)W z8=$@UEYAL411yvTkU5b3;}|s7s)UC@E^0;c5fGXf2*fCx6A;MYB6PWO5!0afeURZ@ zIYvi`O%X`>{ev^-t)$$?OLv@v!OmQ%FiSU zw1S3#8h_AM8#Op4Xx=%Ihx`Bnn}?aPcl)IXQY~bUslog0(QRK;EHsd)!C1!cxu=l! z=t#UP+J_(=TVcm6oyBNipqsS!H`aIx@K`W>)q^|6lRLpF9R9$eC+iDp3q5ycgyUM$}Zo?{WQ@T3*eC6&ZfuC z!-%ACD)8jtmn+pgw?Jh1p1v+ys3wwptXrG}%d(GqJ0iUZqHt7VW_bhObm6sPqw#b< zYPXVdo67>z?`q|O=ldjF>O>qWi}>a_$)XNA;W@DmRM^V+fNq6g#U6rSTfdP~9Q$Nj zo!SiWq+AiZ)ZNzr(Oi7r2Tyt144ybFOqfJ(FWx@J>t@`HGhst`CBdPS=-mIV6hp*5RkOmw?Qne%? zk;VH|alO?@NT@mfw(hcieO}w$yZLQBX{g?9)K31k`xl}7{%lWF#H>}I<4tx^k_VUP z)eM%FQ-vB>!&*h2`sM{mTEM!9SAa4Ks+N`l(qb)b)r`(UR}kn_A@x zp$YZ!4DBuY%WLR;zd4WH;gxEzF_FlsEV7D<7}N}LF6$DNm1Z8sxTZXkb@}CB?={M7 z3INM6QC&IjU^f_tNj@Cje_E@G=0%88d&To;PE=u~NNHT-po{Hv3zNy2z`1>mD9L#0(tJ^3r1v6Uj6*s$LZo z)>O_`#`>t~9{rgaAIOI>vcbqd@vWBEPTs_A`=ph_6Fb>+9;u}~Vd7&b9WF@>3@g2J zfZtyuNZ{bp0X>g1x3RLU+Th{hA64zGs))b%uwOja-y(wWzntY~x#FZJYQyWGd>4^o z12vHjjb|O7J!)FNA9(7(9N){dHMWo?SK>}wxeqj9vX13 zzzfcCxTjC!u37ay?d#{zWdVKHT>{K9H3gzWzg=q@$4zhzL^@d-RCCQN_Mz8hLY2}2 zhN6Xe0vwC%0>L@mWzZHj3Squ*K)km)af4?~ zUIAONTuB@+0~S|fm6G2he4KQ7ugtK3ekbl2(b%#&vrv7FbBA8Y!NA9T7D-H{35hpT?>P}6!K<6WQVwSZ8BgAeg_F6nitUB zlw56z7oqDZ3O3spS^0`0yyFD3x$iM(puqIfhzY$Z=;Y@M2Lf!s`3;U{6Os3q1q?u) zM(EVc16OiG3Yvj0I^y$-bYS0Ie~-s1FVMfm)Rt7?S|bV(+1e0D4sO{?n5ooM4_|rr zD2dbI*?xh+Pok_BWLsXi!Yuqr`p|W#9K)8*$zs>5Ve6+VfO8&y!RINV)1Q09{3#7P@gCQ|W?Am>}J6Z=0E{VaYM z^FgeDQu9{BCkUKprO6E(fA=Ba09EBpWvhBH;(DT)*dRPaLed-JKPvznuTL_YNA}pe>3R zK!k~N@zDu)lc^eWe3?LW--R;zK0o-vEoqO-$GNxn@iHhxND6pRqpMi`XL^XbKeydK zvZsC)Dnrn$pLZbS!P_Ge#M`eXEt6@S2*nqPFxS;pq~gXI-rKDtQOUb(g;-d%Sv-8s zx(BhYk>2ar+QI%Dnhd!CPjXoih@X{m)BgAnP$tw`q;7dakuPq6JoZbbk2~2^oX?Zl zu_5M{Y{D$%z=3$;z{OR*{XJ<7PoI3@PCo!u^NI_dvn3R7CO?*}mXog(HbwzLDHvMr zX(BSm1~hngwttLyxKyr(Jv!_i<3sb^u6xKhyoy*q(4%m?pFlT)_VfCBjNbyan-tH# zUKqOY;7A;~lye==F3I=w0z}aFY+&U9%dsaRfR5H_4=aR1$o5#Te10!-k$)6u+E<`5 zEbkpZ?C(||z5wTlCw}6^iyV|O|1!kOqshOnO>inqLx?xs^hNA`mT%M2u}RDDr{L}L z6WLv+H*qJUEI76wTl*XZIniCagI5c#i&p&wu65^qBCjs7?2FeJt%hR6!SE!ek%>&m zf@4F*YZck&aH}NSww}n41RvcR9lU@Q+EsU&M={}^Lw02zn^h*nNO83CAFt-^G;Udv zKz$@{{J0@bpWgaU&8-~*WUTHXh;?@3;tNcme5}kHTAt#^#o0;Xh`tQ2zuOfS5K{NK&TZ~ZI(NUq*eXsbGv9UZ~W{?_4WgU#w{5R zs2nJW^a^A<+4kY5w|s#X;Z62o;0)il|7s&cY73Nr6|=Q0J#ytd&3Pim;U@Raqu!M% z&G-}P-G1gyl6OZn_!lbzrqWIyREDl2AJl3e zA7T)o`b7>d<(PtlP&}jv-bDpLwJj?b{ozzo?B%2bo51v#_Nd&wKvkW=NX?@sQkI8J zn79kiPR%JRi~X>hgu?P==bYR|w9KmL_Z+Ho7rCN!>YP@zQFVoTuGDrA^?dzr$M;Yw zMsZZ3>n$_124$lJHWnFhY)gGRVi`Gx8*K|x^vmxF@6I2nS==Iy#bP>Gk12V_t8@3M z7mH!>JIDrCWPBcIVe8!X@P@_2JJIK4rPEti1EnV5u!pM;c%2Yf&AtT^!<5(-4~UMRcA*M0t`SB= zF94tunID(Wld?Z!JMp9?DEGpC}izxn^z(Psm*nO{D!M zA6|!CTptfMOU;NQ^^y22U}tIQ=O^m~pp-RqOFb~+H9aqJSi@%E#RVu6@@JIWJNByZ z>Qm#-pdT;|vIL`8e-67}AN^*`goPviP4Lxt=-VvQUM+_Wj|p$N`!}hA&MJdV9d!56 zGNEmb>EX!t4r}z~nw0d2&Hs68kiVh8#+TpbHn2?^_$)8$;wy1H*u1FBRt*s((h<$N zgZ+~09F93y@(&HlWfpNjCkcA@uZ~=8PzB5rUmPtX1#)eb?K}RjJ!x(_xjQ*`gW!M(f$47U}>j&vk== zUT8SyY42zv)ban1t+$G*tJ{`Fg9UeYcXxMpcb5RcVWGj@EkGc+ySux)yF(zjyWPd! z|2b#xuidBlwpv?r%+W{ns_Hcq)sXu(Pn`&bih5lKpl*3VS{F$?d0qbq-0KKcTIA79GRvLAXg zxa+e!`xTmj=Z0C(-8zxaWe|fKq_VDE@t+Y5UvWTMb5%~MeE5s)N#Mc0gZ9LHA)8mb zi%=xiGD{8ScqJ_`-%E>L6>>l5^GNkm?ktr*w5Ex9Z8yIW-w2V>Vxv^a9w`)QZ7Ch2 z>EaLLfbswRb#W*FKr$JrThlFyUnzmCc1Hy#M zKILsvj6+(jFoDC0N~Bf~Q|RpcM=#9~Ea3GnHZx$uXyVP9;Uc4nzP(LvonBz&ss=Tj zTA*b=DZZ7F7o$PSB0=+T2UCDkFSv|7jd%aA;kOhm7tWM5)z8x62L7zqrQP*(fkP5) zcWcma;X1TA@{eBMA4CXf=Lg#+!=q~J4ksmz*LcgrK$do-!Kh$7od(6R%6aCOm}kKW zH*A^;b=c0B!O_MIUtWC^i z$6X{zxC}x_f(BVXCIfmWy&u#s{p%}_9QO$Xv$#h@8^fp5cvRhy_{7zOtzCI^fink2o?k@k9HtO4 z3&Po76ixDf=-X^2z10q#5`akR5t$H1=3~i=VsmBjVm56**awey3gDl&RH(#!&HODW zGgq^0!8l)*?LMep()M8f@}v!v!)p(+T%4ZYT519Ds-*lDZ(R6$0~$|%GhxETZcuPj zK3(s>1XRcg-)lq|fc}bBqC4@t^Fz_ z?ww34{xn#-MUV<8WeEOeX@GLPB#ntx-ysQ3LTjzfoTZG*7fRTbev4=!6fZ}ss5R%s z;w0d;Rw%c1tX$LBOKK)|C&EH7m{WmkcUfra&J;jsR!ULGHusc_iv4B+7~?K9xbR4?p@*B z`FVc3cVlr)sk_imiB12agxBTctfQm$pFUAwL=Sk`oAd*b=h>$h()K1bXwm?kY8n3_ zjZTcTVRV5oI$?^4A{!RNG^j5ZY`((wT3kAeg65}An2A<(n&0G|yaPmb7>NKS@RB1g z!^l#)`OkPK6$xIp(FQQoB~qVX42%XEUy90SW+5E$_G0x(G?qh-m{XW2- z2;>~y8Of2|`Fp&eA1t)9|Go??hTYebfKdVdo_q7ah%XR_bf8nfDfCTTkEwi9tCzzE zg$T8y-M#@n9}IkE;nrzvtmCTPZsnr>2-KKz%6A6ci!nX5g0df824R=Xp0!Mz#R~lf zJX$f1I@Yb#4%oC+25otqt0;#~&woaKFcf+*YDWlsj~{Jd;0E%_{8f0e_?EgXgCPub zc1mHZIx7W3%m?%CVddhJo>o*C8EtImw{xLozyOPo;j5-^BdwY^WcUhd9AEjSCmYYI z{$nY>LV`>dP&vaz!i&AlSM;jFXd1TLv_(*Jc5Y@zKSudlM8FTd0gW(Ha!{%@WJBG~ z8)mcOyjC>jc@7E^%t*2{Y_LZ1!04{Qu^Z1o7gCE!SSmeW9+7yjW-N!1WG|la8l*gv zRM@P}-4rK&fR58oGx_jD9kNJo2hWnvDVUOtS>nBTfnFYr4fVk8mNKvgS|;;3ij{|s z(8ap@FKku*Zp7))geWw9$`*kBuf)U!%GUO>1f@TFArx$7)-QEB3h@_gY?E0D#x;>y z4@3Wr6~4lNYgpgci&#`J3>EE12n zzouOD%T7i~x%hnRS^OkgU1Pt97op|M`f}Dg@&FXMKSu<^+j|o z74r@cJ!n{6`Sx;$I|MnDKGxS1t9}ll7V4$u!;-&xt3(!G!M!3F?LN zCjK4yV?%#qRjC(|65kvvuo+^K)flO3_AWGQXL`81%FFPjXOmK>NiQOn+b(zR?!l0- zz_chyaj_S_*dSGQ0|ow&kOMA?pWeWf@doJq@BP@^N&~W>U2^)7p5poAkH$1H4bnU{ z+cjq$6deK{Bs-L1!5SfFO4;SmUBQPD-P zw1#<%cE5cO3GKXhm+iZfA@5nAcMG_yzKvp@=#))608=?cQ||8`N7DWbo+bPtJhV@U zGzxLJXlB<5G>`sqqZ{qCiP~p|jHjhNc5N~#oH;>m2Q8+bzFR8bPc=~LX<8Qi=nTvc z(3w-fL8h3}ZhXV&K zN3HFgS|!0{pt@XoL65RjdyEb7NL{KPT&_mFE2}q{!>;77<|vum2HO#`A^fK__SX&Q z0XPHt|K4$dlW8?-_O8TM4LZP%TrEn&uhI@fi8|HDzX42KeNc%Wh&dpTPhkWPe#xO{ zoC%eqkGUliCi&DyEN}BS$D;1&d*62p2+l!Mz(+5KeoreIiN*oNE z+lk-h95fHkW%At35LH9s1d?DYk3aHYEU@r-_eRy|myd9leLn#e{iogXxPDn@qk!2` zztZk3;^4yH#X)`pX6O&_oFQl6Rg1ifm+o;o+jUgwDA9*i0gl6p64MAxK3jM4@mSSj_K?yVud{*IqSRaA)3zf=(ZpG7%L04xs0AlOKj6ZGl_KAsN>>|?3n>G zrBni^s5voWTZYAlWH=I)qHs>T11Rm*sZD#Y0I~H8B3cMbfj}R2j>GzioNDJ_0m%qc zbM0!QJ@n-R>5wS?gaP;cq8vVCjRzGU$l>25Z5-&4Ucn&|#*b>G!#TsjOoA?ZHz&pp zU5dc~z7XK}|0j?0iAsEe#B~UKucbnPT4B(bTlsi14f>vxAa<;$ESes7GnUCe6AFsK zQyhA(XkiP{G*QOopfjml`@p_`Lx9Z!ygh~?W)#4ac6lH20pWcXA$NSx-vxLLB>^!FC&%9!x);ISWS{^xx6sQ`#i=1HSl zu`G+}LF)D@W)e#NxwmshSocLx!be=5kvfbzwb3D{Y&F=7kXC+99}VokCFDbJEh3+z2v8TbjE6Lo zj-tcv_|QlLXLgG@Xu>&zizI~gttSt2Rv7(X)HH_{b89PLMR#Z&U6KX2gU-Jr$1=0h z>|bDBH=4I6S(?{1hp8Xn;wcr^NXp)oDL+#?2SzIuvb@|CgU6qhQxi>3B_7sR1m%Y= zRt%7@o4mW;o*p@UHOTUIQU$O3xti_g{~b`IA7~yXZ_hD0z=(huL+Ekp`@2>{FIpcM z6v>uKBBJilA^5QIPw%c5x__n}m+P)?x%cfO(}M_@{p_XEh&T=CM`DF#f;1)tF?3&r ze2{a7sR{g{p|c*mIXuMfh)|dZmCCoXpd&0amE*3R<`qhfZ~CFTGMz)4PGE1PdpJ^C z4@1mlZFH%HM{;XXi41l(KB_dZ7c@(S6F zT1QuL7&bxmoFE`o|F4jU{b!C#HxY3+56K1XtNvJYG|2j+{bs`B3ky>}V#5c5ytPS1 z$jMja<|6KC2mFAqu#}kz%*=YKLCpf)i32&3Lx11o4aeV2|C_6f>K2v9(K^Gpjv_!M72|&76O!CV`Qa+_qm>2+Juvu8+s4Q5 zRPt1bk%=J1kf4g&qUEu~oCa8g?CJW{LfD~iXgTNf8PdbNGW0Jqr=|ut31le?qLr#- zD_nVE230uQ7Ubo%1{lqRWZ42;kSkAh7P$V5P}_i1U^buEwL?-XezQZC3#m>=Ss$b_ z4UVvqTw&lh)>JvHg@LI?pUxVGUw#m6G3Hq?(-j#(yO@t zk>uG8W9-)%fuT)oNt4icfw(N%E$d9D>xj#w3^2lDJW<@7O3R@x zH9-M8nOJXZpUVfVTVqBi1iK|$qgr4c$T?b;n_D5BY_Ta0r{m>R2{#E9Mh5la`2$!M z%e1=Q-6YpGAQwnwKXfYCFS6sl$p1|7l&x9p<6as`!>@oZcJ|Uoz|>frv%Gg;=`ZCg zLSwpVU;CHG{jVY@y?QbBuA4kRiv43-+(X7JdPRphI@0=3cIEI3x_-H}v7az0?Ba{J z9mhc5{@3sbw2IGm@0XxKg>@M8lksZ%4kX}`rySPKqe*&+7}vG=E|V)Iz31g-eZ~48 zc+OwulS{c9hx2=Tp383lj&3!C#mmRBQ-#$wkJw#Igu!lJR!Nl5p3Y1E1rh?^EgraI z5mh+{t(@h}@lYx=5>6itZ}ci)$bp{ijP83EAApK%QS|{z)1c-jwVi>({lx!Dd8CtF zkVX^ffbL*hfMmJ`Ik74|c|izJrHBZ%U9A}rIRj2?my8_)hmpxSc+I{b)$0R~9}a(_ zW+x@^eY=xIP%cabtTogxp)fEi*t7~Y&x;=N$DMLTZ9v0|PWkmVx3fila|N))l?5z##iQKy3-@C>@c$A6#}(%WRCx%O8!w>2 zcOO`MDW^J0v`9r%hq&so{Y)!>n$4=1kYr&QX3PTB2zWEZw?28zJduaD^YeRN2Jd>D z3Aq^ub}LLqJl~}bHAd^JP}448rsD|E=1OiV5(J}qL^m*CI%p};3&F=h>C8xvcX5Bd zhWg*R7TuaCN)O!QZB*{3X__@X$-RBU`9%01vn~u6?COJEbHS5)$F>CK8Q(ap3Ok^= zdXN;p{ylM^8;5}z;Fqi1(Tfq$ShQ0sk05lNTX8{}*H+7i#qf@v-WNV#{@ud@9HM-B z+?4t4U>A@MjP-ijdu&(@;uAZpN)zU$ z7A=z3u@N&N5ocOmW!)Xtz`oux6DqMmi+BG*vJ#ihyIyA2NI-OH;d5O7D0(P(EAR1b zF^F9R#w0Sianx9|2skAD)$&J9m!}KorRe70&+p;?OhliOaW*lK4G%m}JKq5F__$Yr zj)soQh}2bMa#$pNI-Zo+fekJSB}zTs#gsJqsa=sE=c+OLN3Cs~*pm0*DhC+t2B93O z$>8CVk1@mL|K>I%HmIuX-ZOdUtKTLX^ZYG@4Z|%ra)T6g2ghNn-UY{aK-$jJvgk>)Hhyo8>J6O&S~jUA)KbLZwEN6*MsR3#^3m$sQ;)J{Gms zH^)+ttS6wFR`1aD2391Y$ZG2ozE>W(jWFqTPXncVz{|&U<36hQUL0@zAS8k zmOm(au}E~|t+4EOYW8%M2vs(zX(D3qU511avvvK1rcPfT+fpGGXw=6CPiG2Nzy-fs zhUfi?=i7-PEoZrB0|VR&=S*sb1YsshE_wI;4ipz?j34Rt|2%Frz~$Iz)DZ$??)AJE z(BxDWP!077DbiES&x=nC%h=tx#rR+Je~~Utq%d7iCssdT0(xPWY+*dTiO1ZR`faY* zcCC?~;tb~K(}V24EnC0AhuL<0ti=jE8In1P^vm`c+BgO6IA3yp4Z#d1W+*-7wT!X; zX-%Vt=@~V)l~PX8T+E~(jZUUnT@(VVh>d3(PX0?QpC7VBjCr?aS@wo=jdeAxN#}Va zUv-vT<{WOyyNgJz+!nzRJ7R3nn#f9E2UC<@p2V~s+=R#6{pN98%Gx#OCC(uGD1}_d#lll3CZG6Mfw_(9c=-G5kL z$Jz^@u*phd*I!OXIu>>xa>@7C+Cw5HhL3EdzfjxMRJ?pKIGnO5RQ_Ty6h>S_pUtx! zxlBF@rBzxjUUcZ8E6&Y1pL3*z-o;Wa#aC0?{jPAr$=Mn@Z1eAGzq0kQHuk|L*HI!H z>0uaxG2q8lBxp+8XN)T3twjAq;mghi1;f4Ckyf?Z&I80o#71|&tH)PRBxz>uxY*Wo790jv;uO3D4ttv z{mu-9jofeq6nmPEy7LPp*tkm;J8=d`DTI5B3w z7Bu8581C&Xmxp4em(}QBD zZ;=1y?j|vl9@nlJCujy+cwCpl8;A54(`J^iXfAXxPI4HNcu_NtU6$o*N6&3WNtocQ z?EV>D<>y%=*I7XAi?n-L-{|_N_bONgVU21=-LY61r2w3Xa;evq$On|93Pns8Fe=VY zo%DKV>7&PV_*lB@^e*~0>JS=fS;Me|2$lIK+mgN=ZN3k4YQGZih0h6sd;r8 zQ`1%<@n?*ni4QiEae$Y7m@?PllWgmdGvHGge+gQ7K~%%~{#6_1w-t%1EsBLfiYflj zLqTSN@u!hOrsuFkCWomYBu32g4>F>GD_BRGexlq)IBt3cF5(5TVtiX&ktB|e?+63s5-C>r#>4{pw>e3HFiU?YJ*J>$ zbJ@i>rjkB#SEBK`aqft5a&D>iUw!`cT5R_BDHO$88>E#w zeCoSv6Zf5y&8GP+UsTx&wPI0c$Qc#YZd8796D!C4{~a7iiLN(z8_d_bXzYr3EOupN zGySq;iTuP2^WnVSk3U_E*K11dv4Z$6^V#gl51d=dT)Py5s=Z&{0#%`R0j-8bFZKfT zhK?VBMI@L3OkrzqI{6O|H!Rz@;QyHR*Q%jy=TPX8<&ugB1&@*;JfL% zANQ|QUFqQyb5wM3mo~Dya3j`!tj_cZ*yg!Aiq%_eu#ZmCzwpHr>BIyeGrvVG5xUu= zLjPKc&2oH^I$LRaO#n{9$Mz9keAeeLP)zoV7>z4>n8_H%0OgfZ3U;KS;pkQsJUO!z zABA5VRSq)WGQF;f(m*HYu#}j(4&R~aKk()3C$xJ?V99ChfZ z4{J3kLzaB?ZQz%ib*p@82CZT^x}?iLo+reOufHFG%%!n2F5=jS=SY~*Rqk4iPJ1Wl z6nqxl|J@D$+8fK>$PPWn=bq;R^YKlQVy37T5Wco7#7ECE(<}5)Cq5`Ae92U&Q-|dU ziuxVGS3T@I{b`}vOJrSTw07){vetbVsM#}xn~M23X??VtnI^mSoc8nxU}QpL$T>V} zGv#6Wjp$h}T^bLX{q{dXl$fdn@U8-TKpy7387CUJ;?N@)1@?8p(CIg~a{IPg>e%QW zReuk#Mhg<3U8HTR+Tq)Y;P5c7pdDJNw)2LwwANf!#R%DpXSbA!E*S?6yw@K+OG*VT z+n%N40CW#@zE!#(Jx}-#x84xoV-j>Zc`v`@rX%IFKw3!jAED_rA0Xo-$@n4UKp;0< z6s$lJ9H;`pdh=nc#$v!K$6c2sO%2f z4i%}F!+dRjC`?t@t3?v&VUEWUsiV+Ci(Z&(s0xmxs0kSCPT7ar>x@N{jII$G-L{l% zB8nzcp2%ba?+p%o>naShjeH4x>nvy_ZTGa-#$sf4>KYc<*<{uH4Q1n-vE?|Fk2Az! zmeud)ci-_cmXtD!14MurqnaFLM{TSQdQiIF|2hMwRiU~oh_Jq8$`LX!Tv?>`&QF=8 z5>MnA>R14_bh{YiHU@**htNXVK+% zw(a5I<^+W1#8G!Y6f+gyU$(SXQ;z${PCTuDOG1HgZ`q?Hn^ezLL&gSGV4`Syoy5jw{WP z5oc|4-iVLn(Ix2hefiZ#bQlMhwy3|H>7$b6g|h~qIxrW#Zw3cvY*nPTGc^6ANa4D1 zkbdV(@K=i8EvzrTy|OH%H@#xM_IOvvU}IJ2HoV)yK`H|3EFbV1_{ho%dMo&rgx&ph zElij#Yc)6xSNGHFJ7S4=d1qDEu&@fu@UU+4)fH@seOnc0x}gZzljS^Bx$L$x>!$}G zO0D*Wa_|;WLH-?LndCvr(pV++LN)L*znVZIl5t}iuW4ZsvM{9?`XHW5Y9lEWGe$$w zl>2}ynieG9KfeRoe0A0;Bb!5EoDU^kJS^E*FqW%&v_#Trf`EFUg zW#M+3csiXIuD@2!o#gQwYnUuNQW7r_?Y@If6JTFdaaGFMIO35@kCz8E=FyZK!aq66 z^ss>cV@Lni2&Svt(6`}%1Q3M-P_r6Vdc{RpU&o|c-J=G2Z3=>;di|;kkXcf^n>F z0g4viVyz_;KF*iodSj;>)TYhN`h|NUKEt}8LI-2s)(asUan|qkdPZ4q=MpcOL9AT% z;KRUW?hEIHPf!-s)4CT+ItzXt@qY*-L_k27NyExlVhLsy@~p~>R|=k{ zX-AisXXQ+lvW1lSIQq5h#n?=lVuo)Wj$vy&8J3JCcx-AZJ+-pFzxM&BH?9Mve_8)WRtUW#QKc=JH0V$OX zmatiGH-G({^m7j+u>NhWcCm) zoFG#f%wpl7AHhRQDtFc46OV31Jn_8f-uX^_7^!MK8nw7M056W@Uw>FpC%J3<%F_~# zC~^6dk7`!zTVTUZx~FVBw63F2!QOTKRxA^yct4YkhTu3=@?TJr7-b;5AnMa_;$ zNixg$Bd>mTOi{(!M2Gh^3;~;uRTv?be({gbGofTEm)$||%E5lbFnUkv=i&I58=Po| z`iBynaCgKD{*rlnuE#mw_ivU|_6bCtePU&G+w{`dz#Irw?Dr4zts32sht5$$)B>pzQVo-bMF0XU3 z^4)Vi2ZLYDIOh4q@V9mFYEf54Rqqu>1;n@Te5tv4V&%m!ae(@LkQN}7CVp+c8Vt4X zkPy4A3~|NK9v7U-ju_4;qZ_Z!D0#)3@nV|)-OyAOnWQb@nS0e*rzv}j7iG*Ls zPP9yp%y1N(qPMl^U$woRlspxism6~#+>6cPq{Jjc?bMD=n`(2NCTDG-1Eg+g<+V)! zg#oc*

    fxvjsZjzhyFZmMD@2Nr+8&-=GCg`3d-ZE5r>H1v$rNX+t90a-ls3F>C2o zBJ)|m3ongz>w_i0+wx2k#EihmB|6_8{}|7Xd|za0-LFD7-*p&?MD4Rj)XrT}sP34K zM=9C0)T%345Nqa}4E#ipibR5=Q!Z>%281NMkShEY^trI z-zp4@Javmpv5=J|At(HYKVDvJt6lYREb>mvg)Q9B2Gcyw{spFm%YBwaaA;REha5LO zX?q!(IL_B?cm`k7pTDQ!ly&y*^0wF~f3A|l-{L`@&s_?xpCCNSWGco2RG}75H=I;MurvFqpMWw_i#pp85zqg zXTel$Z5mt1k?*HN7KMUDc$*YDxg;!kjG+^^FZXJsu=&wM>>Pntu!jrj*H~C7wFm?* zm!!}n4mM)bt{;b*vZom2J=SG(ti za4eiLo?co(#`=eFC4_5)nYAs5mJR#)E*{_!;7a_38nI-HF8Lt8U5Yd#cmLh53=-5) zib^jAS$apzUyEIUbXJcF$Jv|UszX@9Zl^yADk;XAgc6`06IYG`Ye)@F1P<_Nr828TQ#tIH97Cz5 zm7LBepCtWdT5C^VN54_DGZWVzAn=CveLMbo7Kkg_@OavM z8|KH|yP9m(&{WD%GiL@}a{ua8c(p~w&qunX`W|vUksq;e9ugvBa_;erR>UeZw zSk++OPR8!Fm)-gteC#ksl)*U1N=2n#9)Kx%qAR&w*M>9D0ptRY%9r zX)LhM_E#hTT^B9BSfKHyR%!PZ(J*s=(-imjL;>i>q-TErHF)H_Vp!JegZ}hw0FT`|Kg8=w^zs*E#0@qR{iax@bc^yYu71Z}fOy!P zbImd31>opn_`d+$_FSMJtcIZf;g7R1c8ogx`sxu5nU|bQ2-g@*ln>0crSKeYHl0PQ!@)dwZ(RllbH1vZ3CcGWP2;9m zH2K;2xEq8>j}j~uY!-}HKT!;BePU1nOCNzJY{~mPtcE&kqx@j*3vIi1=hlESlvMQ{ z8d>>Gq{c+>7oQF`MMk1|tl;~gF@>uvE{3UZBp3*O3flN5G6v$SX|)Ao{c*8G<_LEC ze1vcgr`LGdrBsKzX?sLCNN;aHJs}b~p(Jh!3b=F}`+d)qQgd<8h2TAVJgfa#PhSQ^ zWt0Mq!=@0-N?NAbGGUP)>tB$^i2W{T_0jbg8Thtp0Ee-z;H}8bAL|P_6*Y6|b3h92 zh{uj4hX#Q!OdYv+(blf%<%g-b<_(NpnIp;oPY@#oiqqtzP`cYW6EJzoxVTO8N(9S_E?W{q_eaI z`nWt%myS%Ah`TdElFcK;xXNAGP6Wf%wX22-Z=3EsS{6anadptivA#o4Orl=-FGSp! zDhi9r8AiON0>U&4qz?N25!B2<~T9C%DjDcr2(`PIUUoX z$o($m1|MBJ<7OuR)2gObwCoAS_nxw|Fr#}>{{!EBAfu2411@FQ3myV4hO?Q>uZ{gx zAr`SLt4g^v_MFp7%XddItyci$XABP;_jspkp5vqSpXSlGh=cnmWM*?K=8toh3HhE! zY^%65_AWaWR+a7UhBsUyYlB(|L!w@YX?wm!y3y~mQrl;igR%EHaI>chfGSnwQyHh&LZ^QXb-JbeUc`JM}0j6cQz6Uyv5_=$63+x!o2 z0ZPRRw_ugyb%)>burrpoS_xOG4PMuS9G2Z6S19iKM8c`ya}jse+E#;Nc=*W6GgM83 zZPKxcztAoJvipn$pdz ze-YBm;7D0S5=SSQ7ZubpZmxJLxO{nJ`NQ&Q<4#VT%sAN;XKDgYwWf2GTojt;P ziQq02h!md{+AN5w4>o6WEjbs%a1Rzo&hpe1Bpr7$c*jJJA_}YZCKNFF_yxA*f?fn5 zeDuP+PIcfbEqFq&l@-)K3acr&|U+4ExO{%L%6}O-<&TFZ`K4`v!Ln2F3Pm# zYz}MWJ);obhPWFVx)&Kh1}i-!-(~&}8E!*)@j=a7pVbQ?kMs>>OcTBCt3T~rT7M0B z81S$3sG%5dXBu*!Wwj&xE+14LjEvM%Wy7mi-Aa%1@t7%A1=g94DM7^_m15n@@RL?& zo-4SH&~Pn{w<12`psWDJ5dXcS2ShX|J-j9&{k;B;`XwnWC3B~Adr=7&KnL*EH&Y1m z%uGYaC_#2y0I(ZBsj549PSgSvTfdfAKqcu8T-7xm2>!dBI)wtwV2R8LPi(R57&k-e z@2cvTkfYvw)erA4k(QA>WvR{HY}We90%^sd|E%@xvDa{@#GrZs=S$2>SB~*doI(p( z2j5Lo)4l`oXjk8W1d-t%j}MT#IMa!&EWM_h<%r4cT+F8)1{&@!hy{bV(?-5P4Ix_B zD5lT*M>(E`YN$k7^<4(93|KlwJJYLY=14v#j~_e9CYvdtW~E?G_VAnhD&6jj#CAHA5KK96yKx8^$1?Cb0Pj?!)t}N zzJ|Ug#+jpGL(JAK@o`dkIcov=@s{Wd^@0wg`6S3?0NK4Q zER0tyOGs|=JzL3Ao0$?GhvtAxq7x`cn za93Nhhz1NUl)k!-_`Q_6-C3s@EDhAa++#`Ba{xEWgmTO`64d&?Ld;U>TzQsIKg$w#wJPo(IE1y}z*eT5-nENnAQZlA*-qC;Y zb9g7dp%sxhPd=AfDgyL$MT;hA(e4~U^1@%t*8O0&PMqMu4DXr$i{^ODC!LA2+b9j-&H~p@yA)9z{^_vMniNS z{P)NG_sb@>2RK2dl~nk)nkyIJ1u-A*E^pQ@yY;-ir`FdK!g1o}9VFGd4L;vGWP|Ro z-J)Ou&4Q|}TpNtj3)!u&jVkoXi4HEhF^9S`amr&oRDuklk|;A$?d+-&6ep@(oO*cg z79ZJP{rcnhs8$zO*+P0o6b0BP9-A|HFnkGs9r&X&i4g1e4xFW(edbPM!>;X47Qm19 zasE8eL6%s9*2(@HvYl=SxVdyT!|49}SG7uO_$T}M&;>@dv_N)fK{6KjOvHxB$qhgdTIb(1<^PJ?pU~_)6o@F@ zx&Zfru_?P3k%F7~(Z&Jcy(X%pQQi5lydsr_Xuno&^##rSTdMlU-J!K5S?#Q~-28XF=YAbjhJVCC8x`giW`` z6`v2&(`cZQ2E>KHQ<F^*((tV1ex|wS9-ZbhI1hGJOfF8 z|4iX8p!me@ZBW!fN@3y6Uy&=joV|16|0;UX8;UGWI?S9x?<~DAuveI` zw^t{&D_e(uSzQ8hzA2XIZdmUpmK!8XH-*&_cInMTBoaeA=~QCt49JCl6e8-r#s_vW zPwN>W+M_Dz6_vy7ujtH}}*vw9&v}!-7_`o;m6rShm#Ol~|AK7H~;N%Z` zK({f>kf90RQ&fO|Y^JDRE~2%=J$St1n~kEMLqG#aB`vvZ+J3#B#Q^=f0upw@soxC@ zLO0m_a>xyIyf?%Rj!l(+HIAe@UY?er(xr&dlvm(mYOyNn2u8yRYukds*xuWZ^Ymv{ z?*A>)LKkA$b>3rJOB!s}@^5kye--Mo9sgEeAk+_5dN*JU=5H^gag?nv)wy;4HgHvI z&I`CO?5gb?lUENY_hy(xP}ixNRg*Wtgx6qvEhZwe3AQjdjL&8FcdqaxAG=tCCkQ^iYkh0;+P1yU4w@ugi%OwFH^1E70 zcM%due@_1VG?qNe6cA&UGlLQsWyw1Ac370xI*T2oCYW&{r=jF{)GY+%L;9KuVbv;{ zEMJ;uY(y@OWVnQJ^{(^p_9_cv*+iFmv&DAin@Q^RO858py9A4su#HZ|wb4i`u|rgt zy9>{KiJ1*k@^xFDWiqk~xYEJhEUuFX(7iXri;0sx;bNce zk*VlEWhy(5)%O=+)xUxVMWW;JY%GOY=+Ta}rHdgbj$n3Hv3j){8&S$T-BtV4Dh;c8 zOGp)&H-2J>G(xB!WrA!!5!}evV++&c?b5_~+Ijy}vgyri6}`Lm`wGS(Ug5&bdcQoV zLz||d9YdOVd3}ps$JTu0Xi|-i>$4GK zU}A~u1j`3oVpC{dB`%(iz@Im!H^6TU+lN8=0gM~3fi)mbO-)94waTnK^o^-M`R%qn zwF~9-1KIsx?aBC=TYC{aAaYzIeugWR^fFSJILhu@a=8o7%ddu#S73qaF+fuE0 zZ_hI@Z!^@xmkxS}Ce_xBTQUqg`J`idm`M(JgNCv-%9Uv}#ii6GGzV9CQ{Qhxds!lBJwb*Q`(&rqWvpv4z+fz};SO}6xQJIOAZ%o9K>8ttMaqS{J(qam5 zE^10g9<7$JOD<1QJb{C2edyCY?=G83WSnbgM);zyh!-jNNosjLBNhKrN(?c^k&{*( z%TTu?+5ev`05oe)FBEkR8kg_m$R#_|7jSU0-)QkuzbKkQP_TK*q{t*NQ`6>Gz-9i%lJY*~D8*{F2tZkJih|tb-mWcO zY_d|AL;$F>V)+=Ue9|-^SJqwL^WV5e>`-qe)yVQWzeuaXnHb8ZxG_`LsH z&Hjx%+XO)wv^L(Rb_6>D)59GPRGxcdIUv$ikaOxwJ-sH=^5svn*Q*)lUw&iiO44 z6C0>in)%1kM}oHTdT^IMM!K*GWPY(n_FEx%$|xlZ@I7AykixJq2pqTE98TRHiGR7m zj7e|C5s`v~9wEvJkMEc6XsBULEXHz;s2n1X)sT_WAWWsJk40XFDmbVk4bOti{%Fh4hSm11`@l9wNR4EX4jyfA z$*E(_L9?v!=F$T{AoET8|3sf`H)0`GgkAAw-9@AP*=erFRe5oYI=E2Ki`wg!)M}N9 zH_A61g*2VW_+LAFzNFpn)b=uZ?$@PWdz}eRd2(FhrtIyg(xkWtrP?wlTUG76;?Shl zHdPRucJQi~(>e*Y6z3S)Zx@=c+gpuC4O+UU%iWH*vBws#ue=c}A+n@@vOBb2oXKUU z=R>8i?b1W|)7>0H{;igG-xGDW4+;>}&`i!Z36Soe%GN1e49S`3sb=o8POS4>n6>JFBuxOXHbo77f1U z5!|i3{I?6+g_)Nj ztwCLjfK2e^P^FeVg9%s9fkMm)`@pF!uf)fk$4wSDXd5c1-i?ExSi+7|a*;Ls4BC=$ zUcab%g#F+ZNYlO~gSJJ!dZ0-VuUM^{i}g@2kN7LWO+t=wIUa5EJ9Vd7Y$P<)SsR3l zM})6Llo(s}|KnmDs2=-}$9ikKG_>=L1zS={xgrxt73EX}BmWjch4`V*(1Y z@#vfG-Og#?(NU^)yp|=|Yczd2xq-P)A*q_P@<`A%6Q<#|4>dQ)*}`9(eBU>|SuILe zYf0%{9lkoNavd_7_N8^vBS4On@BnP0xb^lLQ~8KkwnyjIB3H@`i=h=u!o1#5_r|Y^ zOL9pQOOQdAVq_2Ge*R@9J$2MDcUP|@xFffv2zi|h;U^!ph5O!TI{wY_Fw0-@o>r+D z)V}g4WY$$T3m`ZMP0mtTb;h0o%QGMLlh%V;^tU1QBU3>efL51c16#@(4#ve zL#x{>eA`iXpoHC1q&%~zCkRUn_JGDJsgOHeW3#iO|NY&YyQ%6ImdD}(*tj^vyoXIu zgmPx?<;XkSbKC#A-UKS3rit43Yh9kl^kTT!Kr2y9a^=cL?sm-QC^Y z-3oULZg*y_bo>4k?m;ZObIDxazb~YKf$1norrA~`#a{QKCPCz7Y5sS%blrJHlp|{w3-7Ug zw!P#m1f$LH=5U#umWOVirxJ-1Cljd&=wYJIpLvOuJ-29&Ud(Kn8s~G|DvHH`+lXofgBhZvWuhLi%FXW|M#D z=y4q|t^SLc^7ks&ANkiDcyXxcmJmz@D=LaQ=-rL@efR=u<&2Nu;_l_{rGr%#^#tx3 zo2%|aU9<>auGULpCdlbi?}jt&OU&7!7P+|!F)+hA;)Lz8Mc;q;25)!}w#@?P>EzAb z?w+SpnOV}U3#Xo2dDx{57~P_9lbhZQSF#<_fm~_PC>UVVb+fdL{&h~a5#T;J*?YZ& zg{#GjbLLgTu>iuDxwu<{w22kE4qTt zN5#{v|pH zBjeM&a{xkre)8Q#ZA$1!VcOljnZ3Hl;o%R5?_B#9Fe(Ew91=b7*i#xbcMFa1f<0Sx zzSFd*IaoMV)Z!kek8d}32$4jpR-Dm6ZCPh&_!E>JmBL;VVDjeBaGfyHIEC)>i@=5vq3S@u^13?y5w)J)eC z#$2?!f4yt;-O($+vsoMtr+u7|q_b@Xg!hzGC}C{;ZEZF0WqDcn7~LwmIH7+{H_YoR zuvor|awS_Mh+MO)m(AKdSNJ{u%u0&tV%o3JJk)*#dN~?cWpqRAu3pSNPrq`ll zBC9KR9jb|>*_`=nW;5^G;^@2n1Oy^a@d8unF6Q zdoKrROf;T2C%YY8Ae`PEwNhmU8D3vy8}|Oh)qTlhNN-TeN^|Rac5)ZMSuHEFtiXr= zS$8t9zP5MW&jsE3)+ev%relw=lm0Zc^jeECK3}fOHEWQzBK3QJ!Ff7&dSts@qV_aK z*GWGUU2#Cwwo(X&A9_qwn-}S>9_5V0m(jUpL_}*{}@bJENLpQ^nbESH@6pDST zVj-JVG^^3@T{mCjgSVcKD%sUj(x4dL^J?;_H(5z=x^sd!SIa3UIDvZNWO)1e< zShHcvZ)X#*T@htS%aN5o%cCJt73^6|X602RWZB#{kumg`tzR}k5CG^8&)xF|98}vZ z2D1ilTygjMk4WA@0}G`sDAiB)onFlh?|C+-+Q7QCG#s;vVr29s$;O7wq`4gME@T}riY*8B33^irV;)4-fD$E%VV5PLB?T*x+BzjdHnO^ru*Q z$->Ny5e%mnAks;*#*7S21%~Y0XqL~HVM_!kZvcaQrNhWen#XEt29{7zaK+@(Fd+_wXQa|#gkCMQAqWl-@W#|4MqVAW5VXM zs&0EoM&n;$Plk4@DSvYZZi~IUlA4W~z1*Y>a~y%ANQB*0G{q%6_A>@_I})FGy{?;z1wl%JCL96i;fA~6 zW8EhVi6!Houzs~smF2HRlJYYWOm=eQ06FLS>SK>-v~kJ#xCFgCP?n@@^mF+X`oYU< zC;b^kST)OKvFDSz)6(}W2JGnf{gH3R11Zm?1bl;w?!!p3Gw z<>PMwL{BazijY0clI0a+0g;(_Iv?%kGPHq852jIs*$^$B!=_G*=DEe|rzUNp+u8A8 z14;~d7HJ#YFCG|U`R#%7OwivLQg)P9^iarAoZmylgO$lo4;w%g#`{sB)WWr{*kZxN zIh=h?t8|q|PKY&U!efwx|ry`%z6m5GA zNa}-w_B{>K2qFL|2zKQI2xe-fT542!dVEl&S`j|d>$~rZj*SHufvMZkfcgyG*~u8D z`obRS{FqBk{I}IX6SNC@IVqYK`-akQbQK$@VKSe_9uU4nw_cZCKWr5#%F+u@{Q4%x zp$DArQz6&Sv3XHhckMe%%rh3&lK5CwKX1g)R5g^ktJfFtZg@Y*_`j&CDM&buv_AeW zX9yO8MtTvk^+CGYND8h47tC^v;b9vY&eOEF@qd+?cnHvTLVM|Zv#du})o+HauD)C9 zWB<-`Z%j#xute#Y?B~N>m}H9Y(l*8kDt+tA)(+hMKRy;I22@X6IQB_jLPv4Om2r4* zWkxjb8?Rq{OkkqdPy=(YQg+3hY9R*i!`&Hth5D#h@mPZm2JJ?j!?s!|LRa2>xHP;Z ze4rkW4w=cZRdIMXXds z-<^S&(PlcUdO$Clx*uOJ-{)ur0p;6nM7y}FGsfz50U#qq?rx}!M_*P@ehA05@xNUQ zG5=l*!FwqEjIi20cS;(k*&YjSVvZD8nTgHYEMksCF@_XX&*dX1fu8QaAs#$k!d#h^ zm44`yhxO;H;*EAYNt6U{4OS!%wgUzToAk28+%V)Eche}XC?%0;vto@rxpQQ~vW)f% zg$%g)`9AVKpFFkmuqE#+3$O5d)CWB8pa;-ehh|Bu(<{Y>p93S)_W8{1nRQX`VG*ov zaL9=8hv~wfTrA|GRODgH*f3eq;p~R!+928`U;I}gMiJU6_I15pudy^V34IswH=v=z zy`~<;ly#d}!QAqoC(lheF{qs&MqyFWW9BZ0fgHfsK6tEC(3&yt^?CX<8~omYH=4iv zIcuPdP?Wat;nO^lqDj!Pc1aVDm-N$uI}CJ>gPjc(KZ$w|yS)USi)>M2^6jjX)}5|L z0kgIGaRNoF=p{yDdP#$mVXZCKvFRegUq;U1o5a@uEgtAW04N5iMI(`cm`C&8CgWx} zOrG{^kbWyv^_nMgrP*_LvwdEECmgOcVj{doQi9!DW)fWf(_ULU%kgdQ%6YtB>Bu1G z?#-@G0nXluwpgOf`OGD>I~NNBO=|zwdtF>fQ&!{`4eFb15%BT%Zvxc_c5U@Y?G&oGsw&3TDH8OP_s}U~V0|3iqhI9gNN^LfJ$V=A zpiAg%vGO)^mEEBrwxO{@-qRoa-CPtG+pbO{?f(zE;j;j29^) zk+iwmDFe83E_-a7{g(08pUstxBdK`2CYxW{U$XgiZJ%d>@ln5C)SK__Zy+KqHu+0{ zlKVoagM8-AyFHf?`2auuqFn6vX0iIUV!WPOoDcmXUAwntU^)2yRnD24YbUXjKC~Mu z^i>3UTllLpdetI@8g^X)#|!Q)M(J4k;A)Go!?)+CIp_K$)j$ljWOqaOC7qY>Mf;z* z{$I{tN10g1+u~-NvlBOV2v;`dBcabM?Yv6JFfhJu7TQ?DGt+`$god){cTZp^nsi)MNzVvwskIL>1lG- zwdWQt5Na9{jwgaHXxE$%&(o6<#2AEOqpHn$YTeLU8EpNlT5$5$E_%Y+daBHKW+!SZ zay?PV_sH;S)M3@?;_fephflL3VmGcU`lNp|b=vEOR5pGPDbTj(g!dD5Q;mDgjI$%( zDXGBW%dFQ^$Zs4w%W4uh4y-@;oQsOd++-uA^blLeIYG|$ikKLIZ8cT|-9%pD1 z&qN&Fp-dfixtF3Awb?j|%d>}mEa4uu-ee^paz^{7#TCmuS~M;7AW5Wct}M$=4;p4~ z-EJfH)b zIs>Y)wDRYwg_WGou^-}g-=+%KMk}4k4@|mu8ki3q;O{O4Zv{r8MZP(jpg)1(Uapfo zUtA|>MSoVK_c3Vk>xB2GdvoGsP!~LD$I?3)p9T1+!!f38bEmf@%MuK^n|zJsjK8iB zP@I4OT|FO+u*zJUvOtVkAsmpt74eXAPjod*P8-MdR6!qW@K7^*Efs^RTA0 zlJ`wP1bOEUr^rn_9J^e~<%CxwqL!5~fYVZqE#Bdlc-~!|dL8`pN^K>CA_$VKY1j*k zi+2_>;vZB$Ue*Yl#FD-2fWa-P^jMi{SM&Fvnpsp0e`qCa_2O@mX4kA7Z+(p2F^IY; z2cCZIU}TWNDv)NDO1lXJ^@+t?MlnOpC+Gr$Y)|HRo3RmI0q3ENZYmzeY{}rh*(nao zd%5+JNVCJwlWXBl)*&nQa3Svbi|ErZQ=@*SyY|L*CYCmTKK^&_gM`ptb~|k62N{mP^^?S1D(bz6 zJo625G3&H1V)*Vp)l6vTF?)P71k_^`u-fxVM!yCoU#$p{dZAYQz<@E3g^QO)(A)lB z244YK05Kv=t!~3muG%w?g#neN1)-uljkVQvKtgS4{Eme`+zjMeh@=rs+p4D73Y%-3 z=YMoy*S>W9)^J=aW#I1z^{5+fq*xpz^B{3s=}JYBI~CZkv5DtG#SzTPpJ7G((ojmS zV5G9=g7B`1viT(N^->^6kH5s!pGhvO%ofJia%UZUh!q^D@t&OZBipQFfCF_;uTOEV zb!ZPuu3A9=FnZO*Z7y~3QLl~G2W`RZkTm}(kK5%B$UbgIU8}y?3?LnXYwItq%WR<( zrGE)tzq%SdW7kN9PyAWixLo8=Eo3LxFh*XJtMv*b)3g%!Dfs=0qeg<3f@z>`` zmgOiYyN(zjvGag9ejEWW3Ov?I1yB-*joxGg8I-~YGwTsil)V+UN1dUg_>gU_fMF1q z*tTLe7dOQRX;OSEVXQJI_}qDGdJaXIChq1&j)oh63Ys?@Ov2?4+xX$qGZDE6T37^9 zX*t4F4wYP}WTx8>^fMme7RZ?dKWj_19{m6_ArU^VU5GI#W)lc>VWvl$Mjf%qmA%_x z(4wM`{Gk3-8wYM&5*}&$MVZ!R{HF^+7x_BL??+8ihxQ)w>Haa1HwFSn41S(HrCUX@ zMc`Z`PYxAe8yCVCvvjkW*Gn^&D?vi_Cl$?m0>;ZNqYXOr!XX;B6Dk zPeM{A(6LQ@`O9YsYv0X2pi6l4%&ySbN?%@Vg7ou1kOKJR%H2--NH?^mlD?eW$M97T|M|Atki?DE6m z`VH|57&dK!uLd$?8baRz;Gx7-tKg0dHW$n1)qd^p1E3XeM%kd$lu5l1laqrfRNiHM zr0}3)q&)6n5B73#Atxz!MQa)lzT$r!ybxc)4o0S?H(P+RH<`_wOZ~N-7^L8Rb`PIK zm?fH88v-Ra<$(EqiMZd#fkEI=JuC9_=q$5ZAdu4WPr1=HwabbscS)=2BFdPWG2nl> zW1~bz!evX8bOQW+gVXn7bq1?jCCIIjk`5-@$|DzKIKk z!D+*!$7Zk{x0T27bw(4n0MYAJW&qErGfZCJ;(B%EX&>B2U`Mk1N$`^wk&mu-$B;>} zNDFs$#+|u(!qpd-$d4|(h;Ljn>bh1)lbx*4H+=_Q;xcSdaYxh9?P+@bj{?T(0R?Gu z5JxCNBi;3)8;cK>1q~EwYPOMn(YlfLK+Xx>OapDhfJg#5c$hzQEH9t%$SWs8=P6z6 zT8lnS>M(&;8B%~KuClf|Yb%uwbv+r>VoDjF;; zCT)uG?KTtMARq0`6*Z(h-LhNSxO=r8xN^^`_{0CSNUDS^(rcAN0-B6Jho`0{cfY9b zCY|Hkv3dm_aYgJi>()zMiJ2@M{j_YBZ!feU{X{zkVrpQk;C@y!v_pdkBJkCkfo?;C68y(Dh{-3@|3L+}3zmRLI*WT92FB`2-C(f$3%%`+7qp~H5 zGxYjhGi&3evRG`yc=C;SdLETf8~gzZPZBdw*;zx9aKGV4t{TB@$^VORcZE%a*@PZa zG4ag;A#@j188~)>W*a5-Mxy8KxpUrYR373+dYz)EBNjsro5y& z<)5*@qp=vZf;N0+Up%|yWLP&`iYWv}EjVLvt5#*o<|M29Zh@Yp zN+pC~hsU7$Y+VX}Tk8KaoeVvW%VDl|S28vo{MWMDnt6#STct zff2N4;OI_mOASGwIOb>vaz#C?JJfdPD1>qJM(}`KW4Yvk%PC{+;|@F*Zi#Ci_t&sF zKHd5%U>L13PRbGs8mAEU_lsW1_Bf`3t-<+P5_9!dn7_v-RSUL<6JFKABe44PLV(mb z;vOCbR7wGT5+l0z#C3vBzEQHrve-HX0ne^K9Fd_2{Z>GeZOC$KpZ zyo3uH_;b+-zmP6$F@E@@){WdxJNJCd)o_Z-r($+=VzN^?5(ZNDlQSI zsHwas=~ua*X)gu>FYj@ihE}Lq7m3zUfIG+&ThUkwrm3P#PC88R$)QmzN1RId+_v@} zeaAyy{r{zi{pUTa13&RbB`bjBR|-0|f!YUg(7A2Xq|`IxP5}E-lZ7C>8l0pi1^pG$!IZrxh=q=~mv z`M;q-enjYV=i@XfMSNORbP2N&)s54n+k#-llNdjT9n;>g`w+ zE9lDh)OPR>i)%+rD^$!2f1afgq-tt1i@5XJY3(RmeyfRq2&N(N=q%2d_`)}GCE)T% z9)buNR;rgCD95>ZxP>dURc1wNQXXk)j*X~#xA1{-a&vou$+zSC%*_nsZZ3_;P2 z{rhrZ0@K?pyRU(2*i4LSBYS@8{624{?xXV4X`S29>5QoX~2BAO5;AKrr3)Ddf6|*$OrAhqCn%^XyV<>b_92 zo~@{j$`$-;-iMH7&gj52FNY^<74pbOtk1^{^bp+v4@99a`523h^GYjPMdH!fUc6K# z=#`^Oeij6k^ry&d!FT)LVL3mIgm0n3i z_AHs1!c|uvzBq4L)93feQyFVWy>6kh8ccb3vJ%+u=TgIwT_LQDexyrr01}HgZSCWZ zak8y9GPQBHX+3c@O*FS!FoZTPd-lZ0ss2o@_(tgPcPnIcv97R42lX&|6A0xMx$^U( zXSiM31jtZGRtWmv{Af^{O zT1SR*uD@+&jY#XHM*U_HJ_jNJtYzb#U@b!Uo4Xis!Xqp_8%an zc7|WvRs69i>4#=OuF$EIXWi9->!q@MDh*M=#QG8Gke}_ z#V$=QnGtd{(Kky}WwDZR29hRH;bs#c;8R%ne%fl0Eo!xA2xoz!LDkhu7g$`0NPk*- z7m7HFd9P00NkIJi)@DAC&FN3Z_kLQ3uf?&|hE|Fe8W)bZQg=5%0fOzJP1of3lbMR^ zO*3Js)^p8zIQ*=ehqh*ZMocEtn5M&==C!sH83d+MYpG(tLZi&4^qLrK%?CuP-Q?rI z=8r?o%3ZDb<;bO7i1XrpHKL?8GZ#cI-RPJ=3M26XFd=$i3!YLbJ~7z=FheG^E2+Eu z({VbhnsY0uSO(E~+{*a?_0fz|1~K{u2G`I=t(~;k*U+OGAH7kes5H(Aj^SYQb>~v^Bks zPWf*h$af*g2R*l#qJFLR*?!LJ1RIl()|crGxCKJcZ;)?5Tt>LNJZh@W#Q_UY_MuiC z;O&}DD@@?xP-ZgYBWf1T_fge4uu@YXCo!?*v30V5<)j)vQx`HP%2hVC(UnXk^z$mA zZ2jxoPPsFVL_8c}F8R}7wwk{uOr5EeQZCmuK;BSsTccq{$g|=iBbLHP*m>vQ32vc` zatRRElBNFc;y6lQ}*m8~YytuLM(_)G1?8@MUGe1QQ)9zY(tFI1im+Nj^d=o0>45r8MUcH-9D0>RI zhHT#qELczOOQZn~|$zZpq{x$nTG% zDPwviiH3=EkM}WssP_2+A&)PL#lyd5mQ8rAr1s_09kmfZzU z?baC=lPU&T81Ri5o&5vU5-m1WeUZ}BfAZtB2}9awl!V&1u3MViI`riI!G!>}S<%el z)A9>8mLi4VNkLQQdbbjq!A0t{@u%7!*)Dgxd~$aZi1c#$Yn*IklX(k`0#Wu_ZX9-= zn{%K;j0Fbw29m>U;0n{<^Fu1;+!wb5VN1ovSC9Ll-&bI0_+(-oLKX4IpiK$J1*DF0 zB@xQj=m5Xv2rZnyHEF5hQNxG7&hdjStNZ$nCypL`{|7b$eCU=)2eFy}|MBY)gNuZQ zqgQU?@NJKg01fDyoPhZ9T z3bi=HYoJ~!0FVun_5Fp}%ksl9G$I7Z**8$RHCFc;v_P#%%!<1JgFq$BOgB+FHjX}{ zOD_a9mhH$5sS%y$M$PS+Zo6OpWxK1Bz5SwUl$InKL?Nv4>ZXI|;Tpn+3Juz{I-Hkc%VY|VJ4#Y6{5=&xApPFh(^ScFs0VYZ%dyp@rx-ZBah-#A8HXQ* z!-XSBT|CRXKfkt;hWKRg78GyYcHHrfP`k7)m{H^@wC< zU0&&K$pS5OFoj?QEOig62-D_vfYH_V^wj9=&qgGZPkvxdK4J0qo*EQtqk1Et2J9_1 zpCE+Il)q!@ohf_{N+haFYQ+kHQo}1mHh7?A*z9-Y%3QtQCHs44fzViY^0LsLa!TZp zd9Rg};Pq1ytl1#b{tJJ1oO$r=X9Bf`GP;LK61<|LRCl7!p{M2(;kx6VCzc7#xhr-c zBIbsAZ4|z=I%9X;Bet>5kbKn{&#Ix7j~t^mA55n38g(g!NAPBwS0w3%l(hB0`MU3z zDrg4dQlN)OBQ*1_Rhz_SX0hwdh`}c4rAg?riD)xy8o|Q#bRDZ95k`aZY`=D_ za)Y+-2qZO7`DfbGBziZcp++(#AyJ)^BO-cy*e#cl(X(L6Z@8gOdFBlFz?z=)N$R}) zA3)k?E$od2!`y={T}Gg5LIDEb;oVEq6m+}Y#Bighruu9Vy+aoPKsHiU-sEyk*;!1d{a1^Y|`=j#fJei zY-Wbw+-UCZh)c}oLyw1}|NAB)fDS~Z1Sr%G01_JSW$x;0b%M^qV3IcAapYw0L`ZRh3!7b~;q`7Oq9uyo^?x8quu5O`ofI z+M?P?SW_b^+3YubHw7w~vyj+7HGb)U>5A0oHWp{EyqW{;s{AeAQ_Y+LAJR#<)1}dt zw}?0)ii~L@E7Y9*&7#999?D0?k~S;lE(~4_WTJWT^qp%|>AVl0Uj4J3FBKVeA0GJ% zaN)$`3TEi!GbyVv`k}-04QQuSVm!b>uwSyIL>3C>3>^Ehg1AH-pG)Wj(BEAxoe>$X zg(&oi)zRtpO@6NS`6502-@AiR_vm1odkW4UBDL$7zJ>?0Z<6f6O}>RJTPxa^Kb+rp zazektK*5T`Lu~s(<$^1YE`M=hT9H7wcajTZCR&tF$Kc1?Q`+;nRBca4pJT|Iz|z}g zD;NQ%30T~YI<@RhOYHU?32=$$JlvHTjd+;sZ6~~U0;q#tJAiSwOxDqA_A{A|EY57E zW02ZOGK{@RpxkwCi%&R_Yo8cXDhi|x9R&M)2% zQ|bA`r7Vu640CKrM((#p&lckpZ_FZL_};?x1U5`<;i%9@3xo@BDhi%{vLNpEYPg&j zh%N2nkmG2j7OxViOt=qeZ2{~i9ABwSynK(9AHlBq2&Rk5oX0K!VUsNM!lIhUM7=SL zrScx2cZ5|?sy8s&k( zxTC-6yOXIQMh{y{^^q*=n!S6Bli?-xpLw~W7+t?Kg^z_pWytT1r`=BVtY!jxAT%|P z$IZBr?EXM8?Z;gK7Fep(DZq?1osmRsbo5FfqKkSKvijPWEN$ZY$=OhD} zTEgH@+z#;FDdE2AB5Fhehm=dRb*jl54igZJ5xfxSlCa>6rUUS1+&eWxI`JHYZMk4H zwv%uH{#j%?No=DA^kSOv0D%O`^Fi@9SA=&0D_JbRJ7EK#KN>z?NFUPatYLxEk_}dd z0cs)albcE{gXb8(dpS~7i8D5Hb)pVe;-jwG;Zlo0d{9EHSr`WPCgo(I<@4C4dt@ddbvQg$5mHJF`OS)$hAHtf|N#6$(NL2wWE)F_n@VX zzK{h#R`nIFd$I}y9zzZ*)f~G}Zqb83qURrO_OX^Fm2LYG;!qeW`yKPPTp!YPQ_kkw zRE+Ez;rVo%3u(05SQE)=mIMQH(M0-kF zP<_YbUP$cVz2Fo_9s^W7b(o@Y`FZ$}qeQ4CTY>O&MNbjJ4UywvdBQZqSd}O%&%uHW zv#>zPYmlJC5l#xvT4S~B>d3PtzboX3uq(+WA~r@WJ@|mUE79hLSN`Y2nH8H02gFk^ zf%Vc>3<(H0f0{(jvd-$E%z9kp^(A}l%I`nYMA^*Ez)6l-yW5(2*|NJs1E#wT0ZR0Q zIf0e$Q;5xHeGKMN?ku1sv8FRhm25@Bi4jq;;re|~eA)e=lnXAj2o&bm_1(WEC@;!S z@)PiZrV;bd^$o@=L!&j&YIVSS+id)o= zcn^Dq8Bzrc7T%=+7urCVF{-o9#sQ19miF^`OC$I>a@ojzjadOX>{ntsewh}?pIL?lwR zUGLp2)Ip)-{9T=wXZqOz_wfypnqBQq@~-EYn^Q-PUs}W`Ics9`T}UDTs951~F^Ii= zX4H~tFa3$#uS_MuqU{$<_tknR_BXyFE2>f2()^!kqyHAbui&8&%zn}v)3QSGKA<$R zMDeqG^HYrAQGL+L(=YYYCYOm0`$U8KjS-XPvji*H{dfBh&v4kbY`Kk|2ON{mq3hDk zr}hXWnOWEH=|jYex}=ZTf^6JJgfPO@$&Y_y@UMM#71BR!<-so<%#6Wb00aEa75%rAN1?ed z_D8obc|F31>Qo8(A1mw41KD^A>Mr*Qh(&_-}YW3?-eHhzm=Jvu%fAa~tlb1Wy!b>$Kji2Xnl;`L z?KzTW`&Pdkc-04j$wrmcT{!I|lSrZ8RZoTVlx@0=2Gv|NZ3Uyc5lwg?H?@HS$4xz| zsOJ~5M-sSs6KtpU`_{gS+up^wwC^h@-PE)GdVE zJ4U2mE`!K*74v&#QiPRszurx)42qLox;SpWmVDP^_zkrE&Dd(tD84-{j7owRH%?73 zd+QlNx@lVjFKL*LeuunBGw2z(AKBm-5EJpv_jTO*=bN#PsK?5t_#pc39sEpgrZEP# z1hNPLNh)5{ky?xly_-WS2i=#hm@VO2$iht%*}qD8&+jGrk~QMK=ja-Kq8NWC&GtG| zfB83p(%qzP;q*KtCvVq2!t+<0+~_9vhJSi~93Dl$-jjpZgUt!*&|p313n%wAp>@-O z%%TP_pmR@I+RaWC`Yec^b}pmBS_Sn`7(NgfgyY3!5wfiIgi(K$7(@`iIM%FJaLoQ4 zkT@cNM){_U+oY#i0?~wGl~X+k(XM}Ir83>%v}ZKU3C{23z>CN%tDA&B`NXqnow$jO zasDCPiJ)uwBesl&h}{$W17jX?#II=uS=Sf1x8SPL=~kaUM$s6cWapbdPR~3)KOWRv znRdN)B-PuBUE|U)jRx&g9nld~fe({JdFa_*H!qc%HuZsjeU+|fAHBgiW!12<6Ex3K z;%6j8`I1t)csVXUN|hpV+!Tu-5Aog0F9ODl?Ll(O;w9n*=zevqPm#j!9)dT29 zRR8{?{!g#<0x_rqJEMlSVT`l%B5?S?q5J51H>#gIX&c$~*E7?2rMNr6OCWLL*UwkY zTaPD$M#g%>Zn){VYfq=j>I-c?+l;P@_~v`OjqVQ zzG=9LvGZ?_y8pNojL`9iG^iCeujn`JALq^enRWDNQ3aNfDHGM#q9wi32m%W6jSJ@L zzSJ^^mI6YAVJ)Y*5vj!J;b8G)uZeh)P@m(402MAID7^UYaIe^DMA~q2rENbGQ3n6# z`tS6>MU<7qe}B|}``@$zR|9iqem!`8TcKQ98B6A}j4&Zq492{x#G}B(1wY9Jo3dmQ z@c|#KPJ~lU2TwIqkWwgVSq*#?re_)IWqxtV9a41QzSFT{;imr)B9(P`ZTLQb1N?GG z4r!yu!}Jvmg)`m^Ix@Dfh#M45rBITFnZ8*jTqzPh#xT89e?;joMf}6$q20ht>RQe`P*I9x3tQVqndGJKLW9e9;(}FrU_bN7z!glFw@~d zFK#C3QagFalTg@Fh)L1t1>OZaG-WD2oa8p@pe{K`wrnMh?)L_TkRPYwEZmQ8-eu2B z(Hvd&6n%D09fLoALJ2>*oEcHsm;V1<0CZ;ShBVP9aN zD??Pq0SZ5B7Ql#P^$BRQk_s5#g;SR>n{(7IwBq@gDOsy3R0an7&TMC)q9vX z&ksfOGU-ITrH{{z461Wyo(vZCr?lPj9DDE)>PCs!<#)q_G8k&qN9kV~N|n+!?bYPc zVBjE57|eb6#Pn1$Xgg(@KxvUW;I92g3s`BpI@K+49i1Lw91vrJZ*4(3XCB5~8mTr` zhPr63pualM6t+v@InEa_PJQ}% zJE2Krf%o?^kj1(0|lY{ z#jyG=4zF=5A+Wm)A8YLw&)!BWhQPHu^ITwwme~?vje3hxoq2a+wsLQ;v48!{U4UyS zpM4rZ+D0Uc=)#!{7e=vKVCExrvObb^d|pSPG&K(pCU&ne2<0P^%Z4v9)@xRLht3sm z+wqW6%ZOlnzqAz{BnW$xt*425^B`QuZWA2>X}K6{Iecm){@b8Abfs)n^o2;le>lbR700%vz4S2I77Ns z8PWG@KePASagPBJLK6pGqP^gDA`(;cyxo8f4t~C=H4&FpM|INb_Vj;5*8fNdK*=f) z1Y&t|KFnr82vKlhhYUT{A9lS~yWpIA#F;#LnMZ@oYNEk~&6C1(pM4<6E~GH;MEdmI z7xj(0IBrZ}`oi#G0-BXqawT;NsI6i+!kaB#=WkILn_bRy)oiBL_Npg2?gzQ%x%Rlm z9o7?MdC9-{RVN~b|xG@p$c$&+1_me-P<4~UzX^Z)W_yfWp z%>7eViX1tgdS=NzH67#g>y@M!8he51yd^9foQ^En9$IXidOa6u8EmUnWkPRggX=+{ad5Ck4YkNWl&~w; zUQ#+Cl;LrL%)X0Ny}Yi#K)aK6;=OChNCcb&0Iyu4I3I2FmYcRj%zYqD{C z;}R0Z>AQ)nO8JeyNIv=0!;d_pzfm&Ef@)iPrL^U)LC1#r_1r4#P0l@e2$tTJL2a}u zd4nKFKl^ogKO;*25Q0^wQ7+CR5)={iRG7`T00}0ILTF{Df_Y9hJ%5@NwS+beYiXO) z7!A-!a2usL(Z{2QMyJi^b?b@Nm9jjM6%KyHS5682c@b}Slut=`H}X0BsPoMUjO2z7*|IkADEM?KK4X3KUejTR{)3SBAG_Qz1vYOpKUf zjoM=)EMLd}jC`}xeCL(;X@f)&EW93skFfh$TAA<`fKVOST)y0zm5$0pVA;jZk0mI- z@P}aLLN&8~+6~HB(V>Dkv`0~HidYymgD}Y@Ax-0~P?=Z`SukxZ1F#b4nMpB1Vb1ko zqde{-8D@gBW~ZS%i1YBLpV@X&u3aQMs@vMttf|@S_y;`l`*hK`e){=Xrs3{ZviUgA z#Iw-#-T2h@<=^4}2gEpH@mdiZ6jCrcdU}$L;AgRO@hTz6gk*}#8LiSuL|0e)f7ue? zEC5@emnVO0Lt*d><4&Luhsv-gSHcfDS8F!JF&Ku{f%FhO!{c%r-cy>_R2Rk0&cy3H zNbew%me2j(uNbCmpn@CA;@ea?K*Zxkv|G9U)*U5)F;Mv$2Fa}*3sK@m*!x{p(>q11 z@oIhY4l2~auOsEmn}|b*Lh&Y0ljEo2ZbxWbz&rd8#6?0v#Q8+^v_TcWixax>BeG0Zd4_Oo z&=r|I%zieeznu7uclU;D11qf|dk*uZs4?H}}(YOU;L ztXS>emuWWCe#W(fR;3XgbB@*vZuyz&d}5;9ZFBPl9iRliR#Ii7h0e3UVH>50bre>` z$P1zE^=*TqGc`koEwP`;zHU6dyRTINDNJK4zZ~#UQ}9svJ;@(+p>vgBkcKjB8&E*j zydEwm$g>!72(s#a1xf@ukP;CG75djSC*X98(mS}Ie;=bDtwQ~pI;@*wYJTfulvO&> zsCzNYYBTbY=*9VIYC^Af+qaAaOPsFCk3#5_N7ca3&|SunpO!vb$$xcvN3`BuXVSBV zkJu;TCR}a9P+KyFa7|f#Thc$Rpfam-;JxygECO24Q+P9EUM~q<_gT@CQ$Av_p+Hzc zk2)V|X0n0DVZD~4Mr-6t=u22MeN%R+h~J|o<-!lI(VFuytG9s2KbjlIGW7S`y|ag< zWqTz%Frtits0{c<7=v#$hJt7@b)SrO^R+_urIMW=2h3XP@4}v*UzbdaHh-W_R>)l; zB%7SPw?Ch8h~3kSA>yT+-8ORQI(+qq%)PdlO8IiFzTOW|JM(L8XGt4X>kFkt3!$lP zFP|vm41_ynkIKgn>AZCH_nWOvn&hV?H2uP{2#PH;MSgZ11(YxCyV-8+)@9%&lZ=3w{DYa zlDmm?kgCoEks&n>ot|8nd6;%#5#yIPp9*xf*7MiD&U}e)`_sys64-v8Hp`J<%;&2R zVd1kcybB-0#_Sz5-16gfn3d!H>e>GvfpP=h(F9f_zx4h$_ec}DJnXC|c;jc#)!n>$ zl46ICI!YBAV}#EGJi;eE#Rr_PbF1Ht%7P>v=E5yhcx7@KG)#UM5=jcC7I<$duS0N4L zP$v;+JakWS!5Ab%lEX~4kwq+E0tTslqdx1h0BM(Z$3N!>fu=vty>X|K@IPh zBdnZBd^_{ADNAm6!Xab!fOFaYiC~P9j)!p=|M-h2=$oVp6Z*D)Jw!2w8Qa3P6U(=| zr2%I!*oH6BPA3>BfWxhX9TNaaLXT}!i`Za%J~=!6z;a8mIS3MB8eGImP|O~)v1oo8 z6N6v|L@~-*mM)r}V64N#IJJYtC;n>c7qIDySz!-C!KX^4CiRW#09^A{RCJ5fpth=q z*hB@el(j%8{x31lw{DuJ?so95sIYBeq&|-f@Xr1DlY!&`v*2jEQ`tM8T8MYpV`K(% z$glRQoP_8Z$~g?N(Qh@<23DG%K$$r7X6P>M9et}C94jjN(|W?#(^1}EP>TX4b}ylS zmCzeXl8h1T7CMK9B5zMsiIC$lL>WnuXVr2O-o6H?3F+~2-%=VfI(4>vWO!fYt5eS} z-S<5p0ME-d6!=O`xm&4^<&@U{a;Z(-&2DQx2L2oth)s=9+6zVvicgzLMp3X0&2P8+MOX1zMc|9Q%x(N42mHvKa3zs~rOHpJ?OUQ5S!2WM0zYb#v7f-`pU z;dS^0(&M~>5Ly-|kD^xjzxhYSxPa;?MOzumN8%(*HSW%C{l#D8TqjapO9Yt*|A1^n z;|P@={WcK$1BVLoL>Fe!)*g0Td*U&x6q7KZbqb5A77cwcl@JK#1GGA7*Kn|1sfZ^m zh1$e)AN_kYg^)Oc-A#h!C^FG&9!0A4qjibO>0qs|g-z=V9`v28yhJOcox>%MHp+I@ zRXR+el|stq5@R7PCw^$%?n8pauis9+|4hqVxI1MG?_ny5_UyF%@TwE7$34L_DLAr3 zJs##3amVlIycK_aGfE;H6i2aAJ>g*;7HlCFPr6^3VVc5)`1hZjTk8obl}e_$xL zoZtH_h>gDO^%ZEsX@9A4(A~epnoIOQ5)PA%$>!*|7|{*6Fh?y zwdv=*L;x^kBw1K<{3CxZuNw`QVO~&eFZIbJ_`7^a@E_&Y?_R^n9Rk($>vhRI_lN?? z-i_vA2|xO6#lme*E_Ey0K|7nI-S1Wq#d{cdiO`kXwXymM(~Qfj+3Fl>5zK_PvS-RW zdQ>#ZCIU$9rmO-|ifwy*TuD|cRs9W`MIT}D8cM8@CcV4qNL8~Fl{<7kO5Z<=QX9}k z#Zn<_td002occAwosjID4ZDrI8I)pi6;SYCiOez+&8jjXP0FJM*(gfkVSS!o9IU)c zvQ^mGf=6zO|D)lU?9)Zu=LD3Q!W*Hfj>O(1jI@g2li~kySSQtMb&`|yI1pU<(TWsz zkWNexJT?Z_B7Lkm!LzV*Z4|WY5a7uc?Pw5HK>HK9qn%)O0RpRT{0b@g#M^Oqe~xX_ zwzpWsQcjbiq>EbG$Sr8;&}T2xB=64agaF$pZ#XE-Eq4pf4n}WMyNSMx_%!Jl3Hp^O z8ve$&Oi=n5(TjR|B?8oVkqWlGcwHhcbhKa+YY8f9><~dYqZp<$uiwiE>taG9ewpxU zWP1Oz1Rh>+a)070|_Xe_Z zfXoRU%fKr+{Ycealg$8Wz~QbGN=Gu=#BLoI$y&2RTazHa?8hu4iOH#l%8p*qM-T4R zrS$C1jKPjI@gdT<{`M0r6!pnb0YO~ z=BNpq!X3hb2}XoaWRnPyZ#T`hR#XG=~ZmhP>4Bqv!I|Y80(adN!^we+(OOws$thgJ076 zNd2GeOCkcZxAcRh6eN4x@_M=BdmU|LVe$+S6p_$^)I6}pJhd5O6W3jKKA2M71MNmN2kui1pT7g=p*-{MWuh5PacOdYo=~2=Y)D&p863m_n~_pEu#5MJGSdZ@7SrN zb#9hO?NA5a+9|N4+h}QIc)m&*96uzzHhG|Zd-?I_?G;qQGP@FQo!RTL-(*!*-vkhT zVYN~-vg=9c=$K2cs}mlzi5U|sY|gZkuJO1z>)`!qRy}==PJV1kBD>|&blSIXi$e8Y z%68_I-p4+4w~TGY?mfmVTX_P&tPWc5=$$wU(CU#6da=@E-LXQO266J~Q6%bAu-lXX zKZPVPFEKN2ElEmzOtgiFi^dMZPm0y2cf3Up{4)Pp>y1-UT2H2gDrOg!O zsS+6_Uqr^4iDm+NEC;Kbk?jsA1KrU1*N)T~QSX+KBxvQ#pPx7|Oy-PHTmJ-qWuy&K z8pAef&!bmdSn}!Mbr7~J{MCxSL1v~;sPgK*Ee});MY$ZW8=Xtjom<=Lh%q2tiX;Wo zC>@~f^UsVEFUdorJPW!julnAV%*)6fr*k-@$}@c7&otak`4?uG;`62soc?j<1n2|4 z;(FKx9h?fQztSiROmz2MA2czGm#)pjA11CzzM3}AnnOOtoOQUWrd+fwA27$G+UuG+ z?;gw^xYSePk#!&Fd@r{6rK0&FuGF}lhcxHKSNIBDHFqV`z$&)?EyqxtD21)mFg@`0K2sOW){P2f38UR%q8$qd;oyHoOX}7-; z&u%OZ!+$A#{z~=E22jFg{qZ{Xh;IgQ8zyyDegL9j*Q_R;EmST5SX~(d2V9eh*7UC7 zcxhKWmm$09#F=ixY1WNuDOPwBhW21g_8{3>`5)oai@X6x2~>oeLJ}5z@M8M*=#>Va z?ftOMJlp1BmvsOw;b4|us^p*Qon6|10!^-uAry=UXU@8cAIo2?KZL@+r4J%3Su2&N zv2E!y;m>W`%blP_cbGq8ZUk-#5hzPQVQ^f2kvWQEj zh}ucu(xJ<<_lcegCUt#vBIw>$h_T@M?eHPBO`yELY~!#(k_nwFmtaL0wehRqtx+yO zMk?e97z|-{>&N)}bNohzzv7}%mBsP&`US>F=0jLHeDb~-?d@`I($pkQn2s8WH}((T z`)K1=+i7XBw7!ddgZwJf0C}^g32;m06%u5Va6fK3--t$5NmeBm8&84`^&HUKOCWF8 z9a;h_hPji2Q&wyD!6qsH_GTr~?CXTvwhtDIWy0QYo%VSu0M8hK@wAtrg>TGYS50tx zA?;CGitTlh!B(I4T~N67T)vn@EUa9VRZ7I0MjI=}j-8}o%?{ZK3qP~b@FXvc0;f~4 zk?zJVbS!2K0%^q~it`$%k2A@+7a>6Eb=cxz_&zdzi3?WcTdMN9vg9F*?Xt&q33Ye+ zUaolUoX(*Siv}E~_*wP5OVRSx<8#kHZ}bH<03VwkUEm!Bh*Q8sNs5fASasPzue_jQ z^d}O3YO3I2H|tuefu7f{YpbKv3i0h%ue|Zl4VX)vgPFZz$oK=rYpnXCQ{b1rx|?qD ze(^#zvjDUnVZ!eol4Z~55-LTWE7;?$Mv8Z$@bYuhEC$SD{!UmcKsOM zM5)Y$OgW*=PthB2UOkkaJvo#Jwn);wi;HodkqJm7esf85kly~E{QLhhO7TtnRV%kl zviIa+CVT~lP>6as>e#T|;PjYhB^AIfKX%a8`d}X%eg`{f-;Zz0)@1diBJKspsptMV z?rBf?UR8p*Otqsd-0KmZ3IT#%3UD8N zET$?4zidW1+xdn}gw+bHr|+TGivIdpp_1fF<*ym^UMRJH5GFoDFq4GL?3{5&_tnav zaG~VSR(%8-)KwIn9q7)=3>1#SF(eNxQzT)TY5FOel2NEW6zD1 zu_hR0Pdz})d4@a-e(dNR0FEf&uL$#lgB8Aq07BRzI_NLhgb${a!Z*$cYOsJhpR4Ej z%$zT{wqLj}PvkbvPK^kHtu@#Nj|zKM(>f3tWCfJ{;Q69;kK}@Nf9`SHWQd3<8rD_I ztttkHE25yMO`eA?D^@?j_Ov{BZ)J?&s$I5?8(ol`9$NX^RMo`8slihcBl;D0r+$b+ zhm`@n9WcdOFQzYViZ90nVaR22I>cG2mRhbc%pvz9@fWk`9$bCg!+)J{|8MU6Qv{IJ z@i?6)ph?=bYqBi&tmqdNiE^|~(0{pU5)~b*`v@{|j*E`|@|hTD=Cm@r)4MKWC!#4Q z_M*mGK$m(un0U4%bHRK&_Fh8K2{PD_V5)$ort`Y!IveZi-(xk1idU>w#qG3;Ut*(s z(fNcI>o1|5h}KE8si*>8+}#{$bxiZq1vD9X(vOS+Lr95pEIpV}laadHP}`b<9uGfyuM)sKe5-gh*UEgktU^yjhzPFN#`je+b}k<*KqjJpM3h4fY(R}RYGg(HvsS>* z=bM)ibV>h8JP}mNY^&;ViF1f`nqrV^mwi0de~SZR5iz(CBH@$b_}qsN6e1K163m*+yg`}LJtap;pL+wP6a8qa?0I_<%i^jRE%yX63<7z`7>7_s;K1e zhw`6qPGeg_cQRwl{VdAy;H?^?7>G8U(@LA!MIX)nM-4?o#=| zjt|D3@QVQXt?g-qrIm=L3yp^I4>&yRbie6D+8mr#z)ByycJiOB7p@mK07wiapN9>~ zs>FNA(Fsu7Srq8<^AN_K2E=Kl%v$F(XMPTRN;9zZ&4uA73s+1t z3xoF|OI(8m$EM5{();Zt`$gOAr9eEwksYpVjDd2;TQfh7iGFs6&u1;majleX$ zmEZrKq+gL>(qRCBVm0jY&y4+;rovIOD(%`PhbDm1usD9`oC{UYr?shK+phSo?gn?aD#NeBZ}wNj)VBTcnDGzkuJYk&U?F=4gwG7?6oGj z$M(0rSNTVA9sU33t*xhqzO}36XO?S$f-6vi08*&&NXW`=<%91*LyA@S8B^?~cWov24}j@jc3ZJS1)vsv4D92v!)nJ70tie}^n+%~>+V zqcL;&&J#{<1JKkfEl%k3%@HMHVxJ>40qslk ze9t6Q%L#KI1~Y5>ag?b@4MnujOm5nMi`AKmgU|@-5(koy5b19M=UL|+77mFuenWQt zev44GX)|C2O&ftij}Vb-)2(UXVrMsj7-vs9Te9V(s_<;3&J6RCi-oI{jb+dlP2NUb z8sw^)%MRE^JGJ4~esK4X{&TU@DOszrwD6K8bm|>8;L-f_^PQc5VQV7I1=VRmA$0Gl zY$4%0n$IR5nFVNAWh0-6un6G+8QQ|(*@(FX=n|^3jBR{{2yGymS{LU2(LE6l=V*5P z>q!j1TOQe0X0{5NhH(LEkyQyz=%|=zcWXZhFrrVz(64_>M{{$t7|4V&i_B6Qy{~1v zc9T)VzA&6OeR*rbV3{(GlE9^+yWOQDm5LKEvcGvQVJDE&tI8A#Qb-x(?-l43{7j8s zH{n6sjp02x;4~tqksW|lp`7%)I3Zv6n6^t;FvV5(Y5I^DS!LL!$v`a!n(e^-+d!K_ z{>#KSc(R&TdE5wPzfbe%<9WgohsXEt_LDM>M^RWQg}(Q;Ooi#K->`XP0^pD~JcV(= zXZpt&S@Rp%DEx3LxGYwR4x7JU|AW4*^jRv9mIVsN6j&Ua3Us zO=R=^n@|EVOF+7~=l~gtX?>J_oF0_TgD$6@e}sSW3Rh09E$RBKd<<^zO87rY8*@(h z)XL`L%9R6|Zd%MdlI=363F60%#{#C9@1kPezR>RWL#-ikdsT~hrxM4_H#?U^kg=Q^bI>MlZ zgGD2y*C`(j8*1^ulX)TgyGqrx?0#lo*1$RkO{=3_`(PWhZbwA{WdPR=5vl6CSf;jM zV0hFpW(*?Av8S8|EL}93pH2NS{hpd4X)=MpbkiY2Tx5P7%Mholkb%7CmG4F-G}T zt3)u#`QfIWhJ(8Jd#1@16Yh-jQo*6(q!v3)mxN(bI(QzQ6IYVmdubI8}! zSL>oOr=THW^SQElj#U`db;SQDF84_9BeWa7sjg2CZtTpN@eSo_Mf-Ku19P1T$H zA-zSw*&(qB&g^?oE)?P~M-eR&@=k28RCdL0%H-)2=M+m7>r(Zwnk|zn-7QPSnSa5EEMLcszt9 zNhiz#L~)OcPJ+v)EsX6#%{cLs>+{32#B4qbc~vgBKOAU=e$~D;?Vf;J{Z=<5F1r1IWu$5SJvZa!$wQ3{4eOjS|(u7O}@} zrKBcwXZcPilG8k8q%c~l#v6C24U;;Fo0e`SzBYi>t7cCHJuJ9g}=! zEOpMC!oTSGjMlXiymun)q%v6-?rR#6+7o1$XX5}pOw3m{Id+?!4~8{EIVIzvk-rw!F+CZD~6rfL0{ML;E?5gN9$PA{UK`SA>+XV!a?NsbC@^XLKs zfKAtd;74N_4{RU_m`>zlI<6kV4a(aPS1|Y|!q-q~07b@{hMvLbQQKx1#Z5v^LcoGI zFw6eCKHKA|{x)RReA}m@<7?Mog;>bdA7iCd(+|XY)of%C_d4w9quaF*KA%zRak!jg zRpQO+K?G!QrwvxgJ-FESaCFVTJ_<-u(6dYz^ z@Y)z+XkC!uAY*pme4;+X=6i6bzVMN>d{?u9i!VEY!sv;uLjl{WL<7n=L$B%MoE=(b zG)i>Fop`^bW+E}6fIKNAu4&`ZcDaBdgyhD)NrA+3>6Ks~!bhvNhHG8gYqE83Re_Xa zL>Ay4t&ya^IW9)x@Dm=cjaf!7)o_%|kx^p)J%OD>JKWc8YTnVByBk(ZH5_zi$NBxm zPIt?Ghomgg$y9nzr?R$BdtUg1a<*5aa-|yMEwdZd^JGOf%b@Ps8@0`x1#hTB4)?Q) zl+~2w%k^N}SpTz5Da1oi*bTSz&jKv_ms2M-h^ocBV9{q}s0?RTh-mgLt!w<@QuHO2 z-%VQEtXcc($;ZPU{`o;QVTJ&xC!juncb=6JqYr-s$`T>n+g|!Rk6f>jO%jdkX=Nv; zdAxsl{-^fJ90eB2Xj`PW->OV^SL0CkXy%a+BN(El^JIBB-z3le4V^p z)VOruK4_cC9kxyB5plvoICD8JxF_@J|CwQY$QCUncFwOkh9AH@bku?A4}~Kw%yPCj zqQUv`8uwwPuG^M2 z$2oreB?U&;ap%U%>ynAKq|@ZB{^T&Q%>BXh;d9RHhxm=Zy?`4f~MZ|R#ZVJ&`x}-cjnkXF&D~Ry{cyd(@-^9 zPx+!7=Op;0{m6hB*yqcFY)Rkv1k-STEqYO5syRqDe%~e}DgBg<8)ZwmWRqo4Y{9rG zW!BSQIj}$E{f8_rTcwp#Y&%S#FMQy2fN@zuGBTZS`#BPElinKM@e6DeKXCv$`6&0} z=xm9gi)AdkkbU2r(oS6vV0L0qmT36-!_Ey4SVD^D^XJyr78J+VO@xIy8+uzS#&J2> zWu4wjb>{cPy;FXF2o?vDnK85V6dwJ3h4s9Lt~Q;584m756bVSx2`-y?7GCY)9Wmg^ z(h~_kHCg8Y2Q?0scFHkyFOgOlOXgTp27L`b0XG`U(KDPUYqoaq6{ujhh*Ri)FYRkg z2>dv2RNqU;hx7MH-37USO+NwM=0TBjT*Ki!B9&?BhD_XOiOVtOAcnhO2^BnVo8ct5 z&u@a{wz9qMwnqErYVVeVGXi717{Of5;~|w$s$qj3D%@rUvy8iBl9oEx$xCgLkz}{q z3u+HW9rDr%&yTG#GMN!V?0a8z(B*#K){Dpa<9grk+p@dHkiDsjFJyhOcr2^p7Pq+y zyY#?1J~5c3ZNXL(;WIEKgtEFnne7Z;o4&*i`@{P%pm=7(x{P0N<=w+=+!Hg8-a92E z8jQ4iEVq_q5PAfD`qH_(AC&Q_Nc2(~A+a^R5K* zEqmF&PR{>+syfSmyg4a0<0(ZA%_s*zi3Yk2xn?9MwA41|XLSEv85J^pm zO_yg`p@iq1t8}B~+6>ehaG{tI@}59Z0&*0_z^@aXfL)Xyk!iB#n^#WyfpQ(`_ z^+4-El=nfCX$ZsEIZMp_rW1ReJxc&TTMa+nZ-%1Bs1f@O6Fsr^?hnF{+WkQ z{N7Bd8TX{@2w9+e7TgcM>OqRPhcVS>YyS5qhw>wx4{4a_gV)sSg)zi+j3|3Qs2NM4 zo2K!>A{;Hl-XIYQOU&L@F`S%WZ&`{uFya@d8$q>ID*F5Zt#@D*9tdVX1p1$n!3bn0 z>HV%2ufX7EiR2J{C9Sys7XkA>(&M;spb7`a9J|04if#H8?_FMb>}0d0aOWw!4Fbvg zAh>P=EAOE9+$>5iS7cvlPr`Z?`^L_8Tv z&}|aPm<|=N>qW?A>b&dDNY@vb#u`BrHVtWWvA ztrX4!KQGEImb+DoMWp)QJQ3O%2n0=pJPkZIQm*e;?DGKl&J2!xD|xk1XQDawWHjUT zFZ(BLk9qHwBtvD0iqD<$2o)a5Z;;`3vd^J(@R-MC5Rn0acde;MXt4jdn{^lvE=hz3 z3fp0z@+s0zSTO0CZe%0aDfwr*9uPqSR-oz@4+=X|^FnHqNw*T(ZjUZ~Q}hzG>g`3_ zloD`pwhgDLp^sLM8Rkwr6U|iW2}peN;9b|!VDT#A+NTEc(Y)XXiI3CkqJt&O3H|Ip zFMUgnx2I!z{4ipU?$r^z>$np&=Ha7xTHw^`FwVm3=`XiQ1Kc>v+e^J}I=BQcL+>hO zqstl%@*+c{Wv!xiKhe$=9`HP_Z_yE~>;7W_Gz5IvBNH>NutN-h#t>i09GDdWa`pah zbC)1fYK3uJifsL#(VvP!j}9)g-r?azwZeJt=Ml`QavKNCao%UlB{Q0~H0Gm8sRTFH z@x#wRwdfY!xAssI9XNE z;WHY3pMOo!skvE-LmA+m;~`pA!lZLHFOBh5SL7|JeC9sc6SR1io_ecS!*$GAgx6R? z_CW>TU&#I6tYIZ3;CCj6`Kz;pax%3KPaR*s(A;DgePXjLwfZH$)ZKQv9!BY|mpTqv zMlwy7ZSCg@``KOAoyYnCvyh*|f|0sm{nvsWDc`SY=bi&S$r)+l)h1$$hI{tC@UiA5 zDtKdOUJE0tcYJd@iuKC>KOoH!?q85b-+FD^%EapU3mE2nu2Ry5zyh<% z?`{TaHDG}<*+?5rhsr5-=umYyYkA$DS#G7yR9EHVXen#?EpE)opq7S(bt#%ci;D=$ z0-VhUOlpxI5p&^LNM9Uv;`dQVg z?I*BXE7!bxVIMA?fCj_*UQ=tVN@HA*$=_yywInRvg{pZ>`;sQ#M1TqJWSI` zVE_^+^P)_%Arg~(1H^V4c7?kwuM+wE=i0&6@Z^&KeXm(#$rnRVkjwF|yIC#JWyFTR zlBiZBYz%p+&hZ=S8-{hQ?3S_5e>gY)qxgm5HoI>ri$l2_zFQ_zv$6|yLDv`>Z}sZW zw!r;V1_m-N2jPf3uq;v6&xre}^41;ku(#MXKS}v>9fIZIi33oT#uA&h;usaWbt1I! zBidbp&=EOkPzqfIYnpz24Kz50VJ~ja9TSzyqsEUD_=QQey=mp}c{b;U%P6zYxJFyI z&DU+?99$-!u{0B|_`{DTyCJ9BO*{dYhTqYDPJ#5(pc_Bw;yA}^CbyoHYW?oB`lGv$ zA>Hp~#kgk&=oQ|%gjWNInTTkl)Y!h;J)0|gyOH`RqOmESb-+i1dvrtCfpj93EE8;uJw18Kk2NsWhZ-*}uasQyX1NdoiN6b= zPU9=S8^oj)(vXDlJfanZJIS%X4fgwtz(U3jzLJYGG?26kW$La%+f&voX@2a7P14UT z6rG_t@B3Cge_sR%x>FRF#omZo3K%pgs!|ssU|#;vPRFQd#vcLpIJ;t_R?q$z%ZMpGFZ!H% zvlqPq)uF1MzlVM3Ac&=qWI(W9A6GhJlIw&D4s^re@xLMQgh_tGgi;MxnURIDX$Wy*Q&v^aEPduWtpwmklBoTpK)*a+eQN&h+!wQ)C4Nwr1%C2aCfT*)8U6 zkAv*0W-vjMqYSDOH1RdV+I#s_+I4KC(9ATVCr?3R3^|9Jj1VDd+yyPi)!TnYUU-*5 zGWjoEcjv}tb16uZN2tIr^IpkBnyGx@j62eQVx7NYI_eoo)#RLX2gR1oI zMpDH4M&-M;GXpm9tC@ZA7c;fZt5#!UCSyC_pY-wg#$GiMr({qfPp$; zTC(?C%5){Zq-z?y71|ERxDrC0NYVFq<7AN*Q!o#qe;={}(2sA4OY9o-Nj!{exs(=R z*RKS;Iz)6XHm&T@s8K(3N27!54L$Dz@0B~$o;||{OK{tTG`vu%_jn1!?L7}7o~>Ho zrvz_4e$#tTScw<-LDu8ICFw?Sx4{nz|EiBM+L=l^pU%H!fkd!VO}^MyA4G7gyjcA2 zSFiqGuO9xS#hFW#lF4|r>dFG>XXXp(aBTMi)Xr0tc%&FDMO>pyu}cDlIq=7%ATJ@x zqttJ!+U42=N>-*-+xnrw$JzYz0*(Ynn~tx5Al9fwRr3z$X0}oG+OW2w7u;I5$cO3d z2SEQ$b-^4Iq(I_SY0MtPtOkk_E#;P$VGtoBFR{E;*wLv>0rS1rYF^=bDDnP!ojOzb zXWw=;Weh^mw^1cIIf<4=5zkLJ;0-OXG3+e~=cOA8l8=&kSqNWp9Pwya(u=gt`Qa{XZ*8DyrJ&~IvDWcO_nJgfNlh%PvVy;+ z#E5b`+Pdff5imIUrEwWdv5J_Zl-bXnrEP}{SY_(JX(ENDqEx(4@P=`c4Gn&4fyHh) zWcV`9V4oirgbHQdAs1dc(mYnH%{+wmQiiIzxXgNVNivgv=yX=iH`DiV@=BuROvXak zZ7mP-4Eq}O(ZfrJ2@l$ItN=U7ZX0^R$Z`S+bu6;~odw|Nm#VBGaN;(*QKp0G*9(fC z`xQPB2Ef3q5<4O+Zyy!5SsM3fAS1NDCT6cU3^2jTPu6&m)hY=3fX4D$eul;y2(4uv zEo*h%34`58Frr2&RbwqxQZ)66L4H`o*IT+bfdL}vcUHn}^?YHznV%>_9!&`(O8sVn zy1MT&#C&^0KOe{sUW;HO<)>>a^TtH-Gx>|jo#+nP=4TH@<~(js%ddo+QqzOHTK+Ro z*%QH|h4GIriVVSz9)e^Y3n8u20!)KNK@Qq2E@|+u#~app#0G;N?UA)24B$s%(q$}G zzhpEK;2^C>JNU>;IKa>GCxlOn9LKZQUJmX-_1O4o1BnGE;I6h|4iv=F5|lYpC9h;< zNGphsW;g6XFV%1>#RmFJBl51_qy%xNcX9)GfQG*<9HR#|=}trpA`LE)7_LV)fF z7)v{E8h@WpS?^0=2rL$pm1r@WjIjvrB9AWWD?F-MAZM424LFTWH&AQGcuGceO7s6% z`oJyNA6rkxE>>b#BfHPhm%Eb6{e{c@MV#bR@K2<46fjIE1Il&J9^&`3>&U2J#%iW3 z=@g{5*9;Z2Ns}}W(57-=dB9IilcmM!p)Qd=M`epX1ERamJMgjB+HyL3;Q*EUM2_Ld zoI3`02^{|?YFrug+i$ka$Lg^SFXl~XKTOC({_i<4fzKyO(F?X{l9(`IxJRh8UxM%a zxDbY76G`HJGL=wT$`|VEgO+3KZLAuRcUc0+ zr}%FXv@4-e{Y^wRt69WS8%~Xy8u3Fmzy#r40Msm759m(Q%02lcdV=o;bB`harxsaW zc(){$@qic!TE`LSgoPi?Aiwvqn^!8F*;JhrB|I)iR>zKd>9M=^%hnSA#(v4RLDt~` zU$j&(Hm%y6v4HpRli`@yGKW^(j$?i7I-#lGa`zBY!REg$twj?M-x<(u=60HY|c*^)~q}`pfEp&^&7PcyWk1M(&Ob1Ox zf19grd+{QQ#)rkg1VBI}`Wx~9yZz>W=%p91(0&-GWe+|qdeO)WKooGJKH**PmY_ft zFyr#?6A|Tjr9XW#>3#`E536giPo(}+ZvFJ?{+?R9q`Ec@yNtiz>$6z7H@Wp z;5Ool@m7!q=_0m5vRXDwRR0E-dt_%~tX5cicj_cbqkb<4#+d9HwMoUm=2qBKk>{&c*=!@%s>o1tQLT&xKX=3pPk0FdIp~~ zY9#VyKkDp=x#akhKk?fxcqb)%1T;~|Cu}Qtj1XC&CZKmcWiNU^%O@o!+~FN6t?JUQ zph^oV+wH>&H^S@)Kn=U?&4@e~+D{g3e7EO!$Wlw)_`@ zEv9e=J6kCAy-N(V8opm$dR|yv|1g&^_#L5oadm*U4ubE;bkf3pi?iI;WmhF!e&{iy zBJl~^qADnl>Y+SCg8;hTrxL1Sgb}v4=r>Ul^4b-Ujm28i^&#m9H!<04*~(WcFE}yX)-o{Wxzl(V$kydQ(DB>wV~T zR(tELkXT=F?3LWAet!d^ntJz~yOopsX~8XK%H92MGX#IAk*R+U_vc}984u5abqw6W zSTD>p;(^p(R}g$^5L=PdQwcTI;h%U8UC!_6yK%`*rdmuprEy=*d$-S;;M1Xd#;23i zcG*|y>e`wdudk$|E}3katWL$VDedn`{M<-22(P!glu2^1S&VHZ?|y&qS1&-c8_Mg? zi28^p{oFHnma11l?`DzhL3haZ@AKu(3BWX4yXZRa`a`_9NTGVHn|xU4z?`XI-}G}# z6pv5S*qZH5z>FHyNgr@TfO8H(LV@M_4{5{zQ!Ohc>VBw{$pl{d}}zKi=i(KTFU4s&wmVVNWWX zEzVcUGY~+?u;N~uX+omM1R(h+%x!azD<@6F@Wj0NtE=!W(oNhL6fdjtV?byICF@>p zU&tpS7h{3O%`~wrJ}P;_w}zhd8pGFL6`E=Wg~ep-=dxaZekax8>G>OVu;2*b6C#bU zXiWuM`>|aF`u1GTmovz(tm#N0OW1b^(1lC?F%r&Qi1Xa-4(xf0TG%K;jvBEK&2iY6*7&VYp?mzJos=7wwSc;wD4P(JIjvR89t=#KnTmd>5~<= zdz+2+nkzfZ2sn~b&DulXduJqrZyptR-=yEMv)~1dwPH4_XtW*)VxKeaQ6l4^77#wP z#i+OTYz%xLzo~+COv|n}-A1)rp%pwPJh2l?26kl&>0OrXk#s)yH;RbFGbHx2*k#t9 zPhuy{(G-mNwzG@&&Tdvh=m?_}CE{8AShp!KsTpSG(+P+mgOlh3W6(()32H&Agd7kH zhrO8WqLZ|4UU;1jjm(hZ=0eUPp_N=$4>aMg$8*MgMR15uBJ}FtNxMDh#2W6GZCh_f=kEOmnf zCbTDz`xw+Cy#k+3#R;xc-$urZV`>>~F2L*qZLyxf9_D&pp+VYo^L!dxESB%{Y@mI=)`Fgm>E@<2QU1(l9YBI7VbM%FcBnQ{F4 z#rsB>RquPqxCMKtHFpG0S^ruRugsyq=#t<>#=}%SaAc`PXK&q!SqWsIl-dmq zSudv*k9_Wv4NWOaaJ65t5!-l6d7#p&jb*!5s;n!w9SWsSp(%U-s4JW2h?2a5sma%a zZs0RmaNuL?jNnA=X+6m=4`62F%daNtQi_`+=B5q!rfVScb1>l(or{Tp>NTWpkP#(6 z$n&}29-^7|jd%Bt5OroA_1cM!7G3+1vB}q8iJ5GOav!f*{hu9yRn}WLPG%| zj?CCgVM2BM!d|I6o9)i)2_8^}c?9^!^(1k*%sR00{mWBExB$fj2&xlR4YufS1L{$i zhqhY~!4rR;GL}%uK_$mq(X~#{J( zd0gZ4QpAZ2b21MIPXZ*(QL#`kaPV(^O0E7@%l5d%73YRyA@uBp zpA<26T6)>+pc2H@>DZO)>YK@z$cmfmv?%H&yzBfj62fr(?Kf`yZ7dQU<*VMsOpZgo z)exRErQNtn1kP34ub=GgvBEF%j_%K;r+tuVxIV%a6zU__LgH5#HjOSqwQX~~cU}LT zMP7>!&zfVL8!Pc^%_%ub@eCJYXTONQl{HBB)|I<^EE^NA3VuQ3!WCS^hwijfG7t^t z{Zkt}aaRI-QF84oq->>OnM>1+KMg9<^QC~8x( zD8QF5Ccu&E%)wV)Rp|BdWcGs6M}{)w*|`8MbL~dgrrCBhJ<>lpklHrwO6E7<)&Ay01ahGo;2AzYYY-b8jgu;Xe^tu7to(_@8l42RYNXM)5%F+yy#jzN>Fs71%VQilCM+@K0ElusXH`2Dtvn@_DsN}^jYA) zZD{{s5TmTO0@3!v!Q?$za%w`I6ZwW%)JTqFG8P<1=}?HIa!N$98Zns;+A{(h;;v+% zdQroxI#%_Ak(2vfM~d-g5Os;aCHfQvF|9Pk_kRLCY{NtwC`zv^mULAj#I;|BUA~LT z{Yv1#h%RcpTR}`1dd!+TgxGz!vG3-zs!%OoY}G;M$>wc-UQvwL-I8)&cLT|)3qPGx zh>Isu9pYIkBf0=8RJffzMyGFEEFuSGcL&^whM}o z2M|LT5Fta;*Ey}bbFWVj=>Xppq-ezEVXVYutMk)lB>y<^r8?x^8ZtXNe0$r5T~a?5 z-YZvtbz4&m`O%vTDg3AYox6wjA8!vlAr2Kg39iLPb7t~w=Zv4kj7z?wE44zd0e*>RejU=QuL>*KX|Ypbf})`J1@BaHiw&xt7Yc+oWjhRKhlxQ z)`eajAaiKKEWTCQ`Uu7)qf9uoj0LCy#G!7S4=+CdP2PR;g2}YzH@HsUOFrUea4cD{ zCJ%Sj9`<2g@;)KL6&BX)dl{(p)+~nUS23R7LD(4O^RtQXMc|Uy9nTk0+pm0uu=X@E z!jL4s+ESUkacJ2Wx8Vm(rZ>`*sTHe#RAD zb{y2rVCZcI@5c1n-tiulxicw#8U6f5#lQ zQSKNYTivy*^PzIrile&R(wo4Qv2{3k3G**N?Fs^+f{?ivPWFzwjiy7X(dDE^*Cu>f zhrUVa&~@wGBO8GFImV~#-+VoS*N{7bRR!)NYyFEjuBC1s<`k#gaSf?Fr;TgamPH!I9IxRmeX+>qja5GM&teS9in-2EC(;awiAA zV5uy&FiAtHngy-fJVsuG2bqM7IONQ1MrJLYqah|Aa6&?auV4-ZR5Q8{q!)o(I-hV& z*RjaUW*z!Ho<-4B9PyM%(9Ka4V^OtmiN284sEmV|N_RQV@y(SE<8^)3xX^#)EicI& zM5h^>vQRQuC>=-VP|5i~2yAjiyCsn6(b$4XM&>#QT8x#NJ$Hy@vK&qKT*S2XP{WB_ z74vpuZIQvEfnEQ3$IJ^ST7X-2$sn|~w2K<<(|RD8lp99LTHj|rTymmcU(cx&=Ae$P zLw{$EoZl5%|3G6ixMeR=sx67Q>OJSy#v(Jl99?3N)Q)YobO_WRZMcb?BWmrLWZQ=u z`U7r8w-ne3rs6CAi$eGC7`a3rlRw&ow1QKA{aXZAmuR<6gw%SHLEqHiGz{!2*d_Ac zYyJ)OUC!kFwWc&V@%vdy7wknJ(8*iJ1Tr{0_+sUmI+c@auT6nck3#*ie&k_dB`oK8 z)jGo5@EL&)Rd%OS0Ew}!%`AkXhFa=NRroK6pqTBb#~UFhQrMo;2~#N$O*bqY@4?*V z3V@K4)~S#FCgy6rBY&_?fdAbuf)y%nsmL1L`*59C%~Q{c@MY}U6IhEqgBTR-N3DR~ zV$fA0ONZ-ncp+y?Pg9(SfN&*J)zs?I9B!KT)UoUUbJ2&YpWPFMT=fzfywbQ)$rF9ux5e>UN6e{(hejgTDty!ZG zbio>T%X<7yqCYu|KzADBVx2&<*~!oo57qjDpG5NL0QD-H=BfQ@9c48ZGeiDW0b;Ed zT&n22g;Tw8^qYW&)G#aDqLBABWG(1O{j={YB4mC=xVhlPF%6^^O7{uGW zF2N^|L*B)VL5Nhmu1F2D{>vd1(1EJYst{)dSD0-wdvFw(r4Z7M-M(WFv9$!Sp!u&S zQl_|iRjex=Y`Q<$_V-cZR;oi+rAd}6@-c9AJnVTV`c$gKONt_hlSzjqi%gvHYXLGN|OkaV&l!LPms zTHi4k9r1eUik!{WMsjg%5}0dn+xkedQa|%J8j!<1+3f6n?tM ze7r~{lEG!E+p#pCEg;;e6Ov*GH>~&G|FS{S1ZJHt+_=;cDI$etB%KoDz+Hs|(#j;t zocDgdW07pzvWZ6C_{1&{yXK8rblf|)_f6mE+xDuNVD0(KQnek=KxOF}hF#O3_4FS7 zpu6B%pgPduO`JawQe?#b&xv2PiJVjOnOTgD!ypN3tI zl-aLGp+A{4wz+FL%9Maur-O$6qtqTkwHZ&qHBnU1=p`ZzzkrDezcIJ}rbalU>M?ol z-9ld=Z?mbkMY5DlU)d~ggpO$LQlJ_>NAm?gUOVeCG$?$pj?UWhPADR?(|MNoNxjXt zw>s``+~*!~z01+mrE+#`$YZS@-tJX~#l914mXm}iPb-Iyk9{LZyD&18;WZEnYV^f` zMP)DT2Q`K}Y->ceE(-gtyu6&c-FHI_j7Cdh{xdKIpPD)#{sGM;yJR+~J&Zo}leH=* z5~gW9$%)X1(KkLKcp;K2CwT6lM!lRw+osRu#CI=F9uXEvy=H?!GqzF#I!&Y5BBMw2 zSKMc&90K%f@saP(Ne?<_@JV=>WTyfxOHwF>X{goBAg(vpPchWY)?P-~#lv{J^h!f) za^4OcO6?Ju6Fkok*-y3N7d{z9%HU#B0_P}7S)cvHW3@L& zmEW+637!UxTbwTQ1I()8qv)Ep8|!A8o1eE^2;aqeRRS}vRDr9>e8wlsFUCKC*iK|b z-^4p0xg?7qS{MhH*xo zLn7@E-i+swChmH7?8i22rx>S4UtkQuPO<=fz=)5$)cc+**%&q$vB(BOYJ)Gq8_SzX8Uz=XUmW-=XUdD!UTR>RN7dFLL| zE{_yF94!?d!C%c%4o5k2!#_Oz-Q2Ccm9!%N0xlG!gczu+hO{gTbCi~QooE&3+$VTv z3}jC^!Eht8(XCI@K5#P0IFx_H8i#7aYhMrWY2tN$jA+3xNqodJIt`YkrPeF7f226i zd$WlC8|n4LO89eeUO9yWiblyaqlw5cPB9O-Zv`G-*mmCB>FQzWjT-~99QGs4tV5_vb)p1=FGDE2Fiv;qzn7i^)0rgO%kx&&VE>n(6HCQ z|L&%C3(ve*pGMDU{4T6-S$)>T^JfaH5^6Kk4xzmwGVs7iub6*?&ySS&Q1CMbB-;aN zj%(@V=$`kKY}OA)$iSj#!Nx+l&IPN?7&95C*44FYQ6;z?khPjy8qD;)Q z`%UU!>qXI%ndTVwKpd=M?ZZbfR`B638-=TB#pIW#^`h zg`v}C*Q5(b*Y`Byo1vwl^Uc>l8%4m>RSf^1-X&B-%7u2XzZDhY&Fe;RUpHRI7g~3w zPaDJ|XH8fYMv{#@ZN^!ecgXLg|5uJo54Y%>C=3el8h#cBHP~;4UMxkLn_uE-2(%y1 z#xRZ2rm#Uun}=irs)zJ9`kM#5-Xme}bc79uuF*_j8dn=2&eQ0Pi-X9zT+=gG-1Mjv*_>Nn&ME*b3A4f>mm~$!tpv5Ey=PE ztpzlwv54=brS0#Pp5_Fq(xsr!@=hK<&EE4!HZhA&iF6LWK9Hh`MocYgvAOXs?dF5z zn91I&|1HvPRp0yVFbLkcQH{8Ym=r*1ytZDS<}8RODCDIJuipMB+f;}WA}n_YKH9$} z-Tu|wJw)74*2eTLzJUp}_XBDXKgo2$!==BEpFw8n(@?w#%l;pTQSbX>!_^Z8HNwgo zkMwpPdXHF!1;P?s4AL%Lg$s&H;|a--qr?P?$v%0lE4l%Gn9o`r{L@uKRq=NrGsPGr zkl@U?2&CiI&#^U*QjC$dE$jpd^I7KY+Hd_+Yium>$>95ly5uwZ<1p_AG0(dG*W{h@ z5Fm>gN;QwZd2WZ`(t5zHAdd!EgW5QqsKw#K&7p>yU{aUzzmE`P*KxsrUi1G9*cZAY zRxLgOC{d#uH(_v+(G&kUQ=sHhiR06~>N0PjPl*+c6raj2+(VORg5#NmXk@~=Nm}OD zZwmnP#nTOTN>ws?vKXp7bjC*h#T{sriqCZN$1If*?IumHm^YGr_M831H~8@1g;nLC zW2@%{cT*^mesG}&(hV%bx7_jy4bFCah&{2dt~LN#olsMurO4DOqCCdr)g;}OH{dku zJFe4i@CokIH<|3p(otkBd{tUArf7KUXEfoSG8(Eqmo^-9yTQ0J!L%h-@zM|UJ!6{Z zlp7PWu}VRsX`)lGrb?I;D{;t6p;3N}Y1v|l_fPT^Fj+w7*zJb|i0b~CfCN&6zN1ct zM6K3dZ1asl=Kf&(&R|uAc?i6BAs3hBEwrEsPN~tz1YSd0YYJ3yOy7;f3_gw7a({<< z9OMYkWMy77h@E}%wrTdv_;MjgiGLa0F8vd^P`qivb*%+4=9SN0bL|p~*}4|c^5afe z>aZ9UWoPk!hq5noy%kN>jwEhTg*{BDiC8B$5NEBR_eGdElgX(>Mdl*os-9%Fz@IRQ zzQEy8@g#zaA7HvqU+(rn7c+TC@6Ct_HcOv;2VOt-oa1cYi}Al(!-J0eC6C1dvl3#m zfN40Ta>=k+Fk`)sS6Am#s6NF;e!j<#y&WZ9PxJ_K8y?dL++FIT7>^O+cU%Lf48dh$ ztm$5N+Pc+y`4NNNxu(ILJnZkyxhT7?b52WYd)NQ>|R5YlFiAxRk8h5 zvn3G@X!;0^5g;0vDZpv$5I`OqcN+Sx!hY=obgqs4i;02z{iBBz!H|yeg>a7JGN{|Z zPyA+AXNBS&AFMTii0@oI1fu8s_-K%6cjU76JH~IcIuZ&69em8Y@%kj&A1uL|5k)T%Y=ymP2u;@IDZ{10tp{QX?!9O3e=f^cZgh23+VSP9keB{IV zy=_mbh#pl_$4T|)oFGXW{wy}xhiUc4(W?GR$52cL8(4i)Z<1-^siO0w|5UUP-`cSp zR}b-PT}>5x*pzRiUG>T|2Bev48JiFB9CDGM({Z5D0s+y{)1JZxr+;!mY!H}&WoiW# zFB=iKdD_8=DKTubIZR*5(mw;B!STmN1v!;`j>hX@&zil|$hNHhDY!uL_ zxFAep-JPfaYCoAMcYq|Xe?yg@hs2emF6eo}Qq;ozOz!;-~u1c6%GNv~AJq zpOyiNx%jkS!ZHTuqf750KAalLpaal z&#lO&8#`1;Eq?G8Dw0x=<5D5(LF2KM+~?LKT=DNMR=rk#>$^ zWrS_<@~-pw1ho3^zsJCd90!pPaP#lr_LjD`ep$SzCl4VQS{n5I9 za^=up2tU^S)`Zq?ax|^6laD{4JBqW=wKcYZn83`JuYRlBp$n-qaiN_Hi|rG*1NS!H7+>Oo`NI}~)G*a;)9PFa5eF69;waU7#Z)irD!?*8d9Nsw zpPL^b|0{$HYZiw}S5*m;32(f-H;z@T1Xv}=%GAD`9fClv82J8$?`b!$d)-*4f(z;X z&e127@gur~)Q1b}?Qx68K=Ve2KqBKL7w_@mD&M~K&3^<22k5_a8xlj`L3hgo2#P&P z_Ef}Old1K^Hp8eQ%b-lr{G`1f)>|~g;?9|yi>Q$)@C@;;9OP2rGQX7!>l(1#z% zUw0twh+CKOYr71Pa}P3rz61S-g*STApg6COiKX`(^T%A$e9Bs4w0s#r@Kn@N4GOjm zAQ7GXa{AmNge$U0V6UdIZ=A59UyuvA>t_A#;>8}ZI572n_=w9j1!IXE6EXf8Pf={d zCaTvVX)86nv&{U*1cY78>V<(BF?Q(&Vp>+zeX_5NPBjZcSHiLeFKyg`+!xE zvOIm2$UcY{sn{$K#Tv|$E&zVDJZIYeTV8#Bo@A!ao*Qj$v6~x@#@S0fy$v4h{Awj1 zLlJ^#OQ*RWg;~^_gGLMfNtNX2*0OJ~C4|g!QTmLIH!{AjFKqne0XDc@2cGMAoi#a7 zP`el%Fksuw@6`RmuS|d>WT6T0s^4Y{A0jG3$Ltbat@$n$EjJ7kwjH72$`m4l)iGn^ zZYLNvE&&fdf8gC=1mBTB$N5Wddy!9TuUJg*!MokGvJVmo8@5r+1!oV8*LXIq>;H0m zF+<_KPNcFS*ktb>GD*?dyG=&<@-E@*w*b<*xX_sIMX4Y#n%M7KHXll#NUt)M9BA~4 z`E-2;PHKhVcHB}rqvH3?1%Zc4lrqqeTMq-~?w`f=Ts>0EQFr1|LIHKY&-_t7R-eU~^sfS@j+sHDzZ zR0_C|jN&hRg6li|%_ z+gu*<#~!6PD9Jc%mXtLY=hY<2^^!Pi$ne{ZEbNDl)tQ4%C8hF#1!7Op(gQTUr^4``)gdV_3oAHO-9eM}l`#2opu)NtO4#3MS=^o1ID|91a^IU4-IH|;hxxy4V z(eFabot_gGnB}TO6q<2?c#}(E8`;b}f6tF%|42}3l`m_630dSBKev7VsXtI~fZ8tE z7aVxtqWL7PAj)PpTZZ72P?mtHIThXY{JrjP%{kLH!QrGb~&X-Ubt9(#>MPg^vlV3H0QiL>h>lKi$T<(I_F22wjC!_v$JU4 zZ~3ah76xhNG0ownXyH4*Z+8r@qL18ni(GKlV&=%F@{Ex3Fe(9=V(pS`i7qIqzJ0zJ zb20J^N2p@U^+%(&6E8oB?`gabZmn==CPIOy8}GeFKV3f_qu+ty9dhg!_=)zQRIAXA zDHj1h5aWiW`Q>&L9W|KNmiJX@CDT26ED$zJU&%MJ)!6WQ9J4%5KwhB)q<%dvK~%p! zI!xtt&s1qrN*uy1U=%g$5ZlH9F%|C!QV7233tb)5AC1iu@lV4P&97>ErPMTI{X!odraTy+^-`a-j~tnmEv3?K z#0sHm+bT84HKVe~ZMz}oX9`sYFkCs6rXy-W!Bp@*U8DF1ZFGsN-ip}_pZ^r!SPO?L z^}pFM{1d%B=tIU$xvY=wpeNZOmn7Y^+o#p3X$+2Xos2%Wz(QG`0|vJs zCJ?RgwMKAu|Nv)om)5ezs|94=j$+)b%L6=hwmd3kXyl!v|_rd$DcZs#j zP(C%A112=Pv-j8kTs-aQqCZ9#3qCjxfG<2^G^*^zI&`_xcx*aJD)VezK-NdTniatb zqD$4?0o@g&R@@1~ipOq>2F5l|kxUcdQkLjcklIz;;V{a%=4vLNy<^T=xyKn^F=jJe zg!wJ-Lz`C3=5Ol*3KSM)am>J#=uV2W$CQw+$=j;M;%6Vv~BPl&Lcld zKu_TLUj6%a`_KA$lD_*=yZShJtONw0h1KY{uI%OykrJM#3hSK=k>c7%x$y559^+^L zFgGs6FhF3xssf3oA0?&@pA&xYRtozpdbWY(E8f!n8p_146Oh9c~y>g*ABI z{=v>-a^*D!r0cziXS51vn(^qMLw_gQST9TJJD8<2`J!U$97Gu!Eq9DBnZ)d0xz;_P zDXC0OUktBFhmi~%*B_;cDIb(PlHm=GlJT%e8cW=^+Q>?=yO{r!r3KmkV47UCbJbFS z+&TfpZIU-8)m}Y>x0!~S=n$?631b8(e*o$ncG(9+Fc;Wtp##pL@tHhgYi-%dR({FVzow`aUnWwotm*&+osEmhUGR zxkawF1zoSJZ;cT2AUId$SE?##*;$Ym#0X1m?gT>cxoM?X$@Hy1T3S7S{roteQnSX$ zrk1r>m$IAmC(Tizx0^_0N+!L2#r#Qli?*56L?u5tj(ud!6_<_aR&Ic ziD6^;7dJ*eILyHu&VpB8{Q+%!iAo%Cl+K-6NV(n*o>6)`7!r%z@=g zqSZSOB3(!Ajne|a61}AsQT`6H$A)!;l#bpxjpM1vt^Ogw09(D`@RqM0swA4e%#=FU?uoNr)hoD7?8-`ci+jeZGqTsfl5g`swuaH; z+ruOtgU3k`P1d|hEnb94s3kqHgQg9?N1)+O=Ig!uG6P-#a<_?LWDTGq+%FC+-kfE; zo}Eehd&J+*w;f8RV@Si{gA_F|BWbVs^8oCyp?^7!^b0Z|s?o)619KDF-BR@0E;spD zBIm4iE9K}$@Ev3{pH>yT=TLvMEn34Q|GlG-SS2Ex91IC_wPyZI&E47BTS)_zTvIm4Htr6kDrc*v!KwRHxk#pR6>A-cwmi;nS z1jmZ~Z@R`dS}+EsB3!co4Tdj_9ARCxcTiz_$Df6+C_2Ok2&>P1mauSD+qOYp!KbBk-2091JPOT4Li2TEvu->vz_AXK*3U6KIe zNGQ8WA7K`;-XNz=(_j8`)@m+UTq$rc*G(=$ie=-L-hTb<3#h&>1LSNs_B)i4u~aE_ z(t~Z-EU9`FnkUr>Z7cw55+vsX9YqUPfB92~jHcgiisdiG>0)9JB+pfjE{6vh7$8kh z5($BwxaZ}c z{_scXXL`#1!DSmAsJ(lGMa#l4XcQC}()qge)na|E);wpHKPi3(MGr``E*Tc2(}@uO z5`F^aW;rcFVUCN5t0<6V;!#Z6L#&Fyg-q9H%-YrSXx|kzoWxVqXqA3E{VrU)8gDvp zppBe>hBBVc_Cl=O>ym;^-GP&&+hv}B0l*u<#iDYEaRf6CSh$P(BjG?t%9GS-#Mfix zev%`%ko4bgv5$i?G0EmHLQ_e#{R)w}6-DgmR^V#?y^>F}b;8DYXymp_f-2Vl7bzNYUQd4}DwG-mcl1({ zt@kY??*->ApY~C4O>u*G{E}=@bk8?ZEm7ov2cy!?T-^=r*>_GN6+qCH-xA7vpwG&69Ly>P6aSk2EKuB+{%?f0LfuF#GSqM)i^dN+bb+o-SX&X`=P=noL6o$__Tev1UU0Isz;(?!Iz(CU5Z01WnTvg(M?%5f{z zWbK^6ujY`X+P;mbowiTX)@FrUR0T z85G=VYT*YS3j7V_+>jP?zM)hCF_sPJtKjce^+w4C*KPdgq$^k2vjG)uZf}^mR+TWqmw*nUS9> z{hVsOcKTxEh$5YAtv_r&?wVoxl8Z-S83v+DXnzxJ@ne3iUUnVsri^?VL-~7=MZQ}B zA>e)?!i>vmu*}ac+fgW}#%tF!)1lK@8dtS``M6QjeHb9TC=<_BI+Tel&h;Tmb74(i zN{t_-?Ah$EKR!UD)oiN0d!*Cx83(h`1j@hm1=Jqe*5aFYrrD)m?ZMsyD8y6v?V*xL zAW&$#p`RZLI}Y!#78-PLWGN&t`h|tFBoB<_Gx3~UqBRaX>E#j~p+m}N9g}q{`n~;c z;icVe1Lgt|;US5LaaC46&1|-06Swl-VdU4m`83wcu5ichO+cH%E#1kxaBEqqfEEBF z5{rs7djapnvjt%?&A?N--Mil~Pp5Ndd*iGq) z#1`(I^SAn*SS{m+tx|gj$rBRu-YkB)S)8WxjZB-3bmu}62ZQp#!hs^#c8)y4gU!2Z zoG?lwuP8Mtx%z|%2y#Bry^aO0IU+vQfCu13KapcWrls^4mbAqcJKmtv~>xdNqU))Z7i5aMdXfPh- z^Ov-Uf?_X)C2d7NYC4ZeCzcs423u#s3GvwB9q)w}WC{i5ZsM-eD)?liyS-;!XqYIX zP-ggP0+i3X|5wF+r^P-3D!ub6jEFMIuv=KquW2G15#oqLxdoAvSF18NS5I-Lbr)?C zyQ*bwd~E#?cE&=R77*Z6i13(te(3iPJ245roh?@gHB|>HzF2SHFT;?$rv?>IrM5vk zWr~l-J|ct^x6*gaafMsN2&FPq0hnb8?uc%$ z5B1z`Po4ex5aLUoP3Mnu+1it16PJZwKH&SYpA5(40(m!~*;J8vMhs0e|G~_TljX+O zcc$yG95=Da@4=dB-5rx5@481-UN@#_06q&U#}WaM4^nYYUgYCCCroy zUsGGTxYH=HLM&+ws5HUFcy*s!#Dll)+oD(Y5zy@p#+`2GaHR>uvbrlL3ADzjJ-3b` z%_2<9#mS7n1%bqZ|7KY(X=A=;E|xH-XFIDmTl(Q8*_sWaJrS;d3US&)%t%6;wwS7M zgoue8>|dCr%a|6x`_iFnOZKnA!`4vn($b_jr@4GyL2nFPlV3o2e@N70O_G@8k52BN zy1$3hT6DU{*|n@P(Qn#m22~meOPT}%7c3@jn+BOsXP9GGAsfQc=0)w8`O&OnQ;ovU zI5eo@4JEy`IsSuXAfPD>!V%td0o&$?Rm@$JTy$bnpdu$-ab9?3cUIwaYHM(M!z&l* zFg$*C%QIPo@Fuj)a$}l9;|(xR#yht@#7^Yc!Qa1!43rgJ@4g+@$NUM9hwr+%Mnspx zKBQnXKqZMIXq zLhTE_QwJ1>%c4JFilp3&HOa3rsVdQ)fvdL6^)6`~vxzh`wE2}_v(e!OL47GGk>QBV zc78;F^sswEna`2$RU(TmkjazT)08`f3o2N`mq{Xa<67phh7)O}wAo;hqqKN*>x$L> zMrmW4WCh|Kv8$Oh1F)aa8Zls%2FRC~m=XUWf;_q3EgI#U@JzLNeTg@lY6{n&%}qCA zD_hTU)GO(k^!6V^ge8r9+|a2U)e-ZK%TkCXDtGYY16Lbs4ixIxPA9{+f*R8=aMJK1 zz2=yeo0IO%TZ(dhT%R|+{@rVOTZB75bfcJw)eM-dDXb%fBFL=apr%QQU>>ur7rWmx zj*EXAUZ>QkFTOcP<LV8f-9;8v&8g2i68%+EeY`&|Tt zL#Yu*vTv(<9RY^~QAWrlcaL_Q8dt(P4HX*#JO`OFTv~#QI#Y2@c|w{d;tPeZ!UMKX zwWDW_b_Ihv4LBlu#|dDa2vtWZ@3RvoyX62Cuum~TJa>b-&28Z;8>GUh=y5&Y$O2N0 z*t$JFF}6~2Nh+EV7ibI`7yevb>>cyoGQISBMS%}rD`&BHIct-WTjX9{g%=|~3OYpy zlUr1O?`$x$+@gAntw&W*h@O=Um-qP!CH=vEWqt0adA-FTeoD+`p#0Zh0%jdI4rRxx ztLML+6pG=ps;cTv@e4&?`9*&qriDRaTUxm5!pw)Sq8IqOL(FWKFUH{1zmm*a*OeT3 z#8n=py^FU2v0^Kiy>_8y zPy7xUulmG31+^4)FV^eS+HvA8E9-rGsJ~WIbZKli*$KM{?{Ab%@D8ts6!?36twVdk z(CmL7z&DcqW)s*xM}&V#I}oZ~aq7$>nWGSI3Kc64lF4~FPXI?GE$T3;1H|(O)8^=W zMhhtcoH$vZEeF2OG#hO`XG4Prqu81LSd~Igk^X=*G0C9trNeIa=P>8-yA~qJojqvj zNq)_>BgXtLVCe7$HW+vj?ss`^R@O;%kZ0@t{TjhvX4*AOawl>o2g6t`cTGG{6d%az zYG-q93ZQ~zsT4+&-JSe71yK_$G`6aoR1TZp`k$&+atO-=|H}5mZi9?-aTtuu>?04k zZ>cUCl+iJH_{u2CDa%I7s*bMZG}xdhUapkb!Vp)*(}e@$TD{wno0jDm5=jdhry7y0 z`{EeEOK_Wlwy@ib#TQ;dAIw&;11T2U8!ThFFCA+O`u?Yl=?&u!F3!(v2Tew9>K!hQ zdQh)-LJFZMO(4{jz-7%q54+(7->&O=VcTOUC~$Y>;(eha>$LVpiI-B!A&;N!#iV^IFPZKwGoM=p+OPjr-vPttdoL6I62PS1d*VK>0mwoV z@~4|WI0Mw{U?dAsPkjZE!Nt_41nW___K82r7jqo8SeGEvB?9S)-ucn@{z|7bF?cO9 z!cD>W_Kuk#?Qjfalsr&jKu5KY@A1ob#;)hbXCAY>7dr^mRV{VSka2y zh5GW(nk{Q9@6B#zcPHH;vftI&n{a2&Aa;?2Z{dZvnL2Hy9XjT*m1-=q+`hc}CVm7m zD@XLj8;CGO>h90|pS)W^7(6&U%$@ZyuA;FAj1d`ipDI9Bj zgXy)|E2zI-zyG_+%qOJWhOOAR+rKk-ynz?}FcAKAbhaP^b$*7z&@Cn0u5S19l%H*7 zn-~&fGmND)zj%`RfXH=3g56CHY@|G~QEWV>awLzc^Zk{%RN$=f+1t+C_M?PiyBO8b zv8!8;TB5gzwfQ~p7^cU==V<3_FF}K5rJ1o&xm>``XEDFR#eY!xe%xijP43k`+OIOt z6@wdxl)3;;H5Z-%kp@k~xff0b1|dVYRO!jl$)&nWDN z`^`DaDmQ$uYq$5q<=^+g;!&hTje5ZdqCu2xEwxEraPRbB5DKZf+>a9#YZ$-N&d!T`vpkUX4m6* zRuP;efS4RUThf?ScNiGvUjIc_t#Sc<9|aHlX3NkU?kU*k;q;C=a?}n;i5knTWc2c0 zk{Mv5H7oW;0E?@{-f!qRMaSi{MX3h}?=rMGy_a@R(7;fdxoCaKq1Q@XF|)D97M(r&q#<%Cy!Pzm?GHbX*%aROD`c4W*gD#IitlYr`gZw^?}haPoVSiEBOMxa z-a%sA)_Iofn(Cy~p!=pi0CILOtPyn$YKJhr85Eyrnv>FF>jp(;6Vh=7VBH)VsZR;H zaJkx6UKt%qh4}h9@7KP`v)I@q#w)`Sr4Y=swVb*<+?@V{RzSj=vzoV@}a8aDSRIu5QqMh+{3sEokvrg%%cei`558zJUdMK?dS-$6hJw+hiztkq#v ze`Rf1k)@^eCja!xHdX9b0}g@8=GjYGg(*Q!|H8T~aGn5~pv1AvCbupo53q@3livuC z!W;65cdxfSK(YWXqz%{x%sKz!)#xnS0K(&> zo@MfCp6~o&;u?|t94;Q%P%-Yd|8ToTN9+!#&D?Q{E?__wfL+W zlpu;89BD*uF>epS06l&Xx|Mhi-c;(9YLUMa9ghN_e<70)fkxg|vXyR^Q-#(OuL!`% z`Md4lHs#B}^nzTE(zo?ix{l1)QUogep#M`Egf%-nW$=#7J6*sE*&n`-IA3v+6z%Sc zl#xBrsW0O4@Irhi+yje^!Qk%u%(DWOWSEe+RyI^dA$qqIDl(@kCs~mMRn)Kgq{=g@ zd{;sK4f~H|C4ADv;2kDcaOmiBY6(iD6^J7FlyZRR^__#owDE7x2dKf|VS$3?KK1ac zf5}e1COl%n`XDOuX3ih$q?IImROc+^&86Z=(x^#U6S}J)=#q;C-T+OdtH}yKPBEy*a);P_yH{>4kbo z2mp3k|HO#0k3(V|sQ+F)9RVf5vj5(0GN~Tyar+7~>1L0?XiWlibEB1Ud5p^$2)0+i zA*N?{&G*X%h25DJm@+4<+R~60Fo@>c4T-j8!}J#TP8Lk9{nn* zAvVo3w1sh^${D+~UD;OeT7G(=`Dp^!tg< zkOHJKzy!65=z!gFZ}e+6tp7dfoG>nF!+_5VLd_|=0@joIJ8{jp=L^$lq?bXcJavIJ zePBOUSQfi4phU=+fo5tA(N`h29zf3?>FQ`&?H)cX4c2mY0lN1hOF!IK`qBK<0@CU$ z=9GGDdAXB$B^4c6AH2)udIWacK0StB`OzjKGY0p5DYAqmdvt21F(>(4eb1hX-5Z)S z9?6OECOpT`V%_>ALr^dqOn6B|jHcC_qox({cs8l|9N?sumi#L57aPORZXa$&6R<_% zpuOK;A!OI5B;TIE{`dP=;9dv1*W#CFAm=%*#=+kVU4#42PdHCZh}V;prZf#itaE2} zb)0H%t%*kwhx3bbL!K>EmvQd=DD&$o8R17}RBYWEYTm%pnI}Oe_iIbIuwr?FsQ#t-ALn&D8%nR-7DVu* z9jwZ~A$fd2Pr4hqF7TvEk%j#sBq; zai5xEHsCkBC47nR802;#t47F~gRWER|q(2zLSnL;X8F^GHZ)7oLM+}2M|Ek2>~ za)8sigez%?m-J7Ccj9rOfrq}RcAW}^>7_H6#!&TF%*T#%Ty<|HOOrR`zZ<(?u#}07 z2QW?^bVX^KoxYA-RxGfJcGtvA%4d+ z;F8H^O5TXkz~eF1LH#`Fx1y3;qYh8($tNTioBqtN7}?adnfknb*=+~Uy1>HOG|TBX*lqsBBI2(9LgT~2(f9l zs>BW29bx<)XL)X5=goopKi?RNi+numSWDmg#}+*M&7q7Y6}#(w!6=7r+ZzkmuDnZp z-8;e^vtJ=gKIeWXidA3d!rn95^#jnTFtouTr3k;c5vu+IFu@;F$pLdPd8_ihJPAUk z;h4KJKi^T*)K(}TM$+Z`V^R|Hjq>#;jQBBtpoI{MW0rBLI`uX!y>xGG^zs_7xQ@dK`p=>Jh#lbp9gMpbdj)S5@+F62pV0xf^hc#Q#ocDe zjP`zp;?mw9k2UQGV(@fY=8ZSwKBbgEipB0l!DR!~;k9~7s`Y=IVfM5V7Z%I0}73mj_IiZQVMBW`(%HPPA*}=%I;90`2L=%=O1q zimi{Ge^)xV@z6C0W)J2CcV;rvt;rUf_qT91lVx5}4!WODJS^G>*(g+myxDNhi?YlO z{ZNpK&B@F1GvcRl-^|55BoNF`#)XkFcUP(K^V~C`5ttP4LPX-^oo$DGQ2P%*(b@EM zuYuzcf_us~eceJA1XdHC_p05Q$T--j7@U-0q*Bu7pGhU7yUw zQQ8QQcLw7i3zg0}A-M#zOnYl$HVQc*m{8|G*@SL>tTl`;$mAs+RNIBIJiNSgG>9jF zVjWyTUqU8uJ}NwX2Z|dJG+Ep$Hf6*BvvjhL&$pN2AJPF^nd2-bqQ6j`DjJcLRA&iI??#iAB3O9T{96_I%C zAQ9=oXURoYEfipEbzA~xuJW!K&3zbjP3P+v4>A0x5+QB=Ltaez3z;jFE~l^Y%9Tf8M4TQgds^9;W~2F6}zBeZ>mB^3~+2a zTzHdHYEDQP_8a!o9Xp1ZgDamnQdMZm2;)k7@BS3z?(<2*VuQ}lxH5Buh82#0V*&5 za%4XPS+F_!;Fkwtze-908d<&4`cX3pH=t0tZl|B54Ys8+ICINfMp(|*2Rhjd5Ajov z`Q5+S%jzDxKOof{%Adq|050q-JNwQvM8j0Rll|U_U@Oe?d^)sRt=&~!4b&?dHffj) zaQDlLy)-w$rFW&h6Fs=<`oTC*5$xUr80#}Of{%7f_A7G_qMzWJHEFccUocqegnYuc z=9E2{^NqxYH3ac%ujeh z^{_%K^PWviaQxKqT~uO84PGWm=^4>pk{4!U2yOqATkJe2yw@&=)kJOOMwV}GVMW65 zdg1p(x`FJ3RHlJOC*iknQsz3#y2;D1Z@jEVE^<*0oK3>OO?C4M|srxEGs6tPrsTaQ3&2gOpw<5 z6?*WVAQ*U$XRg_%s^n>Bc)=H->=bSM%g$|W43fwW>AnvOU0u22f+EQJLCdNjxHrH+_t8lZ6)59I2?qFYlAE?_#=7_26bshRkNi_AKq zW>?{;v-^mm+InZ)*n`~ybhOM;4@CekaQ56u=+F7P>uY7z(Z|%kY2o^ZZDPDn~epnFDGTg?K|Yy}QZNusBBG6|r6rfgMB zBCmq_KclxGHl*^efqi5`mQ5l}{7iBXXVocnsKdGmgI=#THTj0btzx@85I02&WnzN^ zFS^UD&I3L?q@&eM3CleE*||9J@Z2tm;;MFmfA8+yZ;568oxcIGY=UzKGvAcTEb}bx%^qyE)w2bxH>qxq)tioQ z{K5@pe6k=*nkSs!`BNF8$7mymYJcNsQsmD%c{X-fZ+njuR#g?;KR&Gn8T|GYTd_$R{TlCJTaZzne9cyYVeYSrEa}*2JuKo)ogBSz zHsQ%=o%c$Am!2DjyHbQRe32%&UFTm2bnu?IxfJ$u%Z#DU5M=n_>IIWGp!QSF>zlg{ zc=WcBP`#?*bG|sWh^Ry0>rV58oD~QMZMjMS0_zWymCqjg6Jyo;ZD38{ZTFGCVt`fs z!H}4j>x2}r{p^ty<{l~;9&{Z$+2*Nq_u@a8UvmubPsLnC!zct2^-~o1f#$<2^B!fw zc?OZQ$RrvRuvG92LXUP6Dq^oEnRyYEcp!0W+b(*$v2pxyzntR^V~WLeQcdy6=R3k& zPvlth!w`957DF+KNAgN&V&y*au_zFhujhC27z0o0KX7@&7bx%U`LCO!FcDw0S7ewa zZ$$$7%_O_Gnu2A6V)8U_84AdNyq#v;#l!J9+y!d^vIK=u-9^%*Mk^3mq~^c05i}mI zO|s@HuP&X0BWXl(y^}Vlxoigg^ZEC90Im~7$c~?|WC+w~AFd&ili~q8zOW3q=OX<- zz`3GneOplh9>t-)gBq$W@5QvjGFthzuD5i5QumY$CYM9V3jCwZJ!0^hP4Pq!<~JaK ziHxMqkASYN!m591{l|dt51uB3Om@Jm;)LV7`qnkB9?&w6>q`{i1My~#i7gRa23F78 zbMAfowoRy&OcVY#DUou`=0ZR28I+LoYYsxAc`I*u5kPx3tJXBVF#1!#e9@J$(CuGT z{DgJStI1#IYU?T$ToawADkg1R0W?`3%bC+%Q{6ei5gXYTMDtlR-j2(ZT?OCj`TJgTV@I|kqE2miW)?GjPXWrLU z&bc`;0n^Xbsz4g#2=x85Fwg5f9!GVcBEI0+F8z-#zuELgLk=3Ke};)Dpd_fqx3+f; zVbhSYq<6@*w69mWR)>@fYefNva9#BgmiP~%{UpjOuBl28O+ST9vafavMdFKX_-MoE zeD0xR@3&FSS;G=OiFT*CPBLN(%7Qj2VVS^e4nNaM$JbUOW6!jY_f6!<#7km5#;N%t zL}EyX8>D5nlQWU7mzBS4Tc-0U_HBL{nBNCWQJG%vb>Kp!K>@4fdbXsJ9TO8t0$lP- zVtO?B!##L>*81)o<9?LEO=F`HJn56Q+((yn1Yu}J!0L{&&? z4!C{NY$$Z6=-u=AwBa6!_S}?XGMR{W~uCo`-mV9QVE>T=!waqLnk2r(3HM;MU0{KK1%$097F=lSg5z1;bt|EBW#1Z2V4z)73tg+ZgdG)yxf#YDI0sAhKchOF! zR^`U~B12)+=IM{BzNo(ZC;%K5=1~OoQxIy}NrsB>;Ia`VMy&w0b4!k&;i`QZXv&V!H`zgcKtCr%VM{HTZ=kkyP?;&J%rH z=c;R0vJ6t4L&r~c76sgzRC(Omz16?UU%mJ5m?|3SO7_VZEP2;gD9`2)h4a{SO=zg5 zlVQx9Bw)k3ebb%uvgU1V)ewamO&m=r^9-7TRCJGfTd+uNn}W#{~Z#{TRFYu;*jmYVMoucViuLKJ%N>UHKi1i|Ikf5H^*j75>X z4d-!xW+vpR9h>yaFTi>H7kB*c3!b^H3=$6&3f<;sD81}kJ)?z#a|XlB#dzjDZ7OOD z$BUaUU!3=+ix3HvxU^GnuN*04sbo<3d|+YyrJWl?D8?6#dm?t^Ib;NsOoi07S3d7V z>_+ywtYeRD6|>rG#ngP$RJ4e_C^U@9e?i5}Uu8As zNNA|72T=n8gK2N%kCb{Ah$4rpawI4J`1T`368B&)dp#v=c}m*mXZ!3ks*(pkcmKw( z3b8eL6AjFP;`qd!xat#XZ8dUABUwegX;M$BRq*#Imn(4jLkhG~IDRnN5!rAE0A z0)ob@^Q`_Wy3mYMsA~pX0sO%^g&F61kQ-9~Q~|b;uNaVQw+XbbO6=6J)PtEnO2(z! zS`_vFxo_ObdT|L9wvU$-99K`36bB_VesoV=0+52HO#gH(l7Fv<$!KI6Q-FMpsvPy z?7kHj2m5m1AId(Or$;wXEE4_M@XRt(zWArk!GGC=i=IK@^R^ z>$qHkI2w^mMcR|d4%z}t9=6rLBOY<_Ew-h?$lL=m{9689_5#|W#T-$DAq%A3tTTTY zciW{6NlZe4$y~ny(Ee8Zs-&CY^S}53B?1d1ziJ{M)H9n2 z`i*$V|Gq_K^@#6d2o7FEWN4ayvu4TUPpi4j{Q2~Usx`Yn1>~h6#?z%P4EsPBH5yr; zP3^w6DH3@+!XB7>k6(ZUHitTXQL1U7XeTdUI%=}akSouPg9R%m*lkhRWXao=(0+H~!Nz3tf(XZ{!ioc1b?hg`Gow0a-eTt< z{CgRqP&;zid#86J_8rMu&?k7D6oaR_7?0^g8my@MC_>UU1Muqlt#|debjB7Y4MSTL zftwncjV1(ah3{!{a|MaC%ZgF`XtYC0A6)($;m399#e5&Pm3Z8b-@T{FU4+DMD|(H;p#4^V{mq8l2HQqMrjQ*OAnwRD z04L=p`J{$NL%*cE3B2x(*GC(}B)q?Dd=g=l{?IbI_ELhdOVTo^*Bwpu(8MD!I)`TK z{Zps9_cYTi;}d-V>f}D=HBKGb0wUFY`(iEB|r}<{viA8g;UY>Fi zQZ6Gu|00SJ zubVfR13%x6Dm5CKoJCsou$TE34QdgsrngG2iF~W8zfsUv+(y7e9}?e4ZXVw^o&){@ zP=Ny#0bi#mX>221F}t9H@1SN}Ou=IZgJGiuBhAJ6iy{`9aF+}={Ymqx7m5!a-?J}A zIB?!9xJYuMRA$XbyeTe46DG-ri$u(6q&uuYm;VL;zWB;>Y}qOD*qz(E?Y`ybyRa!% z^4-jfh|XfHP3$OHe^dKIdUHtHZGwY)^IMSR_rwQ)Im_raXN9($MMx}04mwb0BPof2 zH)2nWPE~%p03K3*j>w65If=RVk_ofQseYdY-2-TIF6|pE(3}&-BlMwqkT>(B&LOhb ze_Z-9-Zrg)oq8s_{@JZk6N(?gUKF511-^g^^D6+1yRh=uZwOpH=NE%F|S5Hvc0;d!Xn6Y5ZMy`4F0d! z$^QVAM{0mmHN|G^VBx%H;LDnEvv26sbIaPl-(nHptu$paru9OPnl1#hn7Q<-Dk7BT zl*}{frKu<0&{sbI$-9f%4WoV_(j(feW95m*HCuBT8JJ#gHcNaownz{T zNS@c>iaDlnBu+mA{&jcN+B%I0s$CRgnzqHtPaytyw;%A)q_uc0QTKexI=k1aes8g5 zvR5dB_K0rx$3o0&h5&|aW^6B^H=&5o1~towQ<;?lJBPGoc%|nnUmsFwA7vY#a^t;qKf9AaPO>zy zMy^57Rq@N03&k}*mwetCQ9zu?AY=V%lVnJw4f9J`KOT(mxaic?|DDEio(H76J;kJZ zm8R0?f|!lhq+lMwFY50g>j;L^jgLI!52JpuCeLzWPpe2a*KDYQnNf1&Wn^aG zWN*0!w7pgitr!B`GAI*3?yFF)yF)X>WWAm8$$jkVkHs&YZ=@$Z)&FYZ%$&%>&lE?# z>CcZNs>NTWvo!w*8=54sRqeRcKy`>V)WLP&rLz4!%B$L5Xc6WoehEM=E3Dy|Z*6({ z!zkWjqYfZdbqYQzcTETw(+FegDv(G5xrN=H{`H_OMZ_-9TN zi|aaFKu$uLJ*uPeR@?5YYyDt#{eMl}pd1J#Pe$Lt0OCBIBXyx^t&uFCLibwosMsC9 zl{4sz@x)tYPqV#T+hOX||3Dn5K2j6^6GEY9S0`6=;LdL9q$o~rB@~fko9DVtY`iZ1 z=Poe5z4Yt0=K9%4ZyIEeN>Rkx26g+EaLxK8wET3FobOtKaGA>~Zk?fT7+2 zu9n^D?rsO2RHKNcj-b*PF0a3`O}eVaOJ*S3h}iqr-zTfxsMu<=V%%dui9RP&BOK8Qy#ly#_laVP3vadML5ZJ4H{Lc##QMT@y+M@=SDw*Vgt}*h4TBrq5 zvdBnNDV)~$<-;CGXGLBm-?cCMo+B8td=_nBl^g^tLNdKv;D#sVt{oD@2^I`gBtABQ zeB{^t(SjoH$)FCX!#U$J9Sz$2cO9`q%?R=tFY3bTZkLij6{yxTOr(|(XXIGWV!r!3 zF5{KBk}L6~*lt{J$#4|I9Zr0Vyy|1+%w{^huCNyf5wQ`Mn26F2Y)rxF`ts|Z z;>U!0!fUSoeQR7;1a>xYF}GHW-(yQM4`<0k$zCQWzxx_e(7R)Lx8V&dQv?PhMcFEm zk=b)1YG_&oq&9Zax!)Yyn&G|kAWVZKA^riQa+#;-5qh99jWlxhL;V$GP}~tMGG=!X zB4_UeJtleeus!z*CNBRMP4QG#d;qLw(V?#@G=Cs%L>lV4^a)VrEcClC}N{_X&=uqCuZ$*z!mo^*8rlGrCAuAH_RYtW9BeBq-6`R z-yC2Wn12=GST-hq=kJ&e(d{iI)2^7z?736Xo0wmwd;M74)=P?~@wgZC3VLsx_ijs6 zTV}sF%M%tKqS~;7`sfsmde(4vR~yd+zsE7KM&~FxB&Xa#>&;G<^By0un%O3MkICq0 zqthHYFhGhslGFeAslJj0&s|$}+2}ZV7LDUyR29F3>fun@d43urW8Dv74jY$cDQr0V z1V~K1jaT~I;F}<~(t{gUE1XdL;#eDC3L|`6TicA8_rFe~@S1wj)24r!t>MpgOQlf~ z(bza#l(U4yx#0T70`jIy*!S=zGD{Nxv zFEn+Qwsv>Ua2Oa1m~qVZ5KnpU;BJ*#sQd{qLBP*Q?|2+^A4U<*cUZft^8RT@LQJFE z9(7hVk5d4dqZk+accpWkag_2e`fm}3#N+k|4XkAjUS-zgknF(3VHRVM6x{DPuO^k zrjprRPK7(zkJY3mqSq_=XNa9;K~Mx&fnS#ML1%&ln9v`?L+>+16uUzH!Gpgw{aD^5?vI+JeRmje^1i1jo_)OC!gW=ycX2<5Wc{rp_}Cu5y~jFa`iE zq))SZhUVip*f8p00m!$}(d%x)^fDo~6Xj43>q>>cGH>Yw(fP*N`Z!(tiqO+@yQc5T zN%XB^$>p&BPgBV);B^WE5pXl_{$R>>q(W)9jd+(aN_yn4_>OiS6t_Jvfx=Y8*n}DG zc^&JAhmDJvY8_yPcX^4P9h-S_?`Y)hj631+z;7fxGz-LcE%(Zo_q+cij&$M%BOOXX zka}~(=xjzzoYo#gk4rnSwGPyyG3gDW!@p(j=bK^IHf(lvP`<;ttmyDbqyOemH+Q-G zENM`)N)RY(lrJ(YxSY|g6zxRiLj zpl*Hk4bjQ~HLLg?_G^g=?ZyVIXVqulkHfv zs=7iQax|0bIE)#F@HDrE`hOcH=ShC9LvZ&P8lzPqLyW(Gk5x02}cw)UKb#xjf zKXo}RHy)w9h%inTAohAX_LBcp{QL@YM-)FfPr~sNe8v}6{>~}zJRT*T^Ll@0Ne~vc zR=g7gv3T_&SRjapaRXrgw6beEg!l4CGvutswT(2(>{i06@j{;}tHuzeomYT2Bph^))kJePFQlsymc?^=dvu^N8~uy|G`GKM6+P#;;mI9wrXdOY^Cj-t>b zcXF*d25Abo_TmKBFrBkGh1je4%(B-jrMi2l}r?6u^aX{#kq48TB7gWc< z1dbZF(&F#k*X3?mtDqnd!Jlbjxg8}+L06s9f5g7v#(OM3MF@cObRR@>F(`?(h**_IS6c2gxNnubt+L2;Z2J>y^%TWO%nE&K~uh3J5cl6a(X8JwUYnAy1s<|m4uZ@PbjSxnUbF<$* zB)#yCDnK=Bc26F2G5?_S`F;eK#eA-UlB$U$(rwDf0nHkwapYd*yMm6mC z-u3pgWhbvA$?&Yb7Z@rbV2DCe=lK_k2iAr)Ni7X8(Ah`l4>=6bouuF zgWWK_f9Gry*Tyu@J}#Xf-VWB&S(&{stUoTq2q$lpq4#VF>FRY< zED6hiH}n`Z^rW5*K=RfesA6U_V$AV{dlbR?-S01dvk9tprc~VQ$~0=#?7Jo|zH}Jd zIJv{tW*>g2W9l=que6Ai+8pKdwyHQ|lbuOuyGY*Z0cSqHxTZSza3 zbZ6!bUrgs>B8dmt9BCc=T{<~Ni;k7{*fXA*5z0t0;}+7!5uYT`%q94qELI0oE47nf zXZ+jAY7!f*R}LoTM#y4mfW@|3uNm*kJ4}?@yMJ8_;;Fa5st&`%BZvpz{DzELz&Z%? z`Wtc%BCJx5n-C+j^{|#szprzjAbc-mPb%|(tsh6^*TuITfmEL z`f6K(;~suHO)*;O3%4}k#?5?@>vnMC$k1l%Olble@&VKfw?V=7iONENvnRr)iF0T0 zLnvd&_8CZpmDTGjPPD+;l{sc-(;CSZ+uMOGaLKG*^{SKeGJ@!BxE~d+j)79IWbGoD zX`5n-z=z}0jUBK5j5kt6{YzK<#NYMuy9b${$!g`1P|N8@1RB;4hILwNp$;k0`dJqX4Anv8)ICTII}z6K_c}1r*#~BH@L`)| znUx_*QdY3;qoXIA8E3kvB6Z`&ssmd@>vM^53wr$RE)YMqF@kyF#xzx=2H#WnCh+H0 z@plvptVkUD?xq6o2A$m7hETkM1DISfKo*3J?}PX}E87o#mNgtp(3!SbpFA-u752cs zP+*(9%p8&);}?2PW(0z7++9jGU$IbPpU#k}gop9d=bEtjQxKn$`m2lh~Fp z1JHwF@4}cA5m|8rvNTrdY2>FU9e*Kf+w^~2n@>oVGipupG;2;}_ON@?MDRcoiIA>3 z%EQ+PiTxC0H+)t%EBSTpm8hA=EKAAju;XT0u|MUuUJ`B-T^pghv5(dJuJF!{7IU9Z ztJOf`b&9aVu>UudnuB?2$2+F|m$#}2cFf7IH*GzEhyy*h|KBcvOveR8{~GL{<7YWV z=hPN2%3Qz*&bLPaOQe$+Qw({pJ+!k>?jW%RqIjvS%qmp{v)R4oKeda@b8V384FM8h z=))23zf^OehF9m{>!Lms;XJ(|fUVGU5)=arNhb=8;M7$8}Ag;}E~_ru&j=w`|Eu=mj-%ZL@SUSrkvx zsqx&kXo>iKbtcC8I%GFSk`cXqo{${2U1iJ2tPzkMaAW(*w+=jqXUtV z`wSC0id>w!bo6JWw16GaOdq?=Ew5OrS-E8Jc;9Q&RVzilI} zx@Xy6TTqZ(8)Xp%x|OfIre^V^es1f0+>R%`8kPRkUDeD<^87*}JnP;+Jiq0$(YLc0 zdyoSAgTxL{%rB+FrT+dVA>jT{WPgisWRF=D_5=zdJu+=!9EqKL{LG_{@3Gr|W~8mM zEA*iFA6x>$Ecoam*ZESn14Q&Zwibc(l3L_k=Iaaf^}6*hU@xQ9wSURwFfUZUKfK|X7<92dTWzVT3*ORbybif3Z=c4WIuM{*6JMaz=cY) z2xUgdSZmt||iD5=z>KvCpZWYMx%OMioky8{j@7(y&*;DACq&W55KrE_t@B`AYuaRBjv zOvg%IuUUdLHMXC)^@_#=2Lo;vW~0_W!ZA~p9iDro(m5yJnLx7%^CH4k^b`exS(M7% zJRYWVsU^Xq6zqFRVfw+n!Kl{1+KlpYCGM#USNw!_BV(N1{c=9rRrLXVBN9cS!2}8w zF|hGg46I!3oGmn$xP}wT^X2;I=e`Hqe?o1%;s+UmdB5Ljj4)m6f)bG9`L`F_#)S05 z$^OC`y+$i!Xsm#X%F1!HVUtil)V}Lul>!)briV#dPSioAl$t+9O`c|M^LUgEA_h~t z>uTJ=QcvmQ7uMJ9F&--Zw0-yDKOAC2_n0_PieKREW)x~92QUYWS2=w#v*P!XVW+%~ z(TXfvUv-K=`GGU`0icRCQ|~)I@^!Ut*NJ}|7A&U(X~5f19liB}n#k7^a5!7cSnwb? z`X3o1)~#fQpzci-EH5dtSFL@+nS{>6ni%@Mq7yAd#Fe(DWcEQv*tA?L@+k%7e7}DV z)d`+0Qfhpv+!2Wwq0w-v7!ztYdtcMtgA?KQg;$x`VBRhggFbhiSugk3M#O?7%V6B) zfJC0@V<4I6sd5FzO~j|ux?N{?M9kcc)b9%6@FjBTwPShxsU12-WPa6<0@xdvpF zMQ+j8C{8P!*^bL<^}b0t@N_X92gSD)^~q4hftGa6@syVy zv7&E0K1@(?dG;_Aa?C!2FSFI0@=LvvoXKr*q874-dj24ynUCfK8T=d#qqy4?)XYMIjl+n$M4YA~J0xFpPidhcxJ z#T!9O^c$~p4T9wU+kgD`Uu`D(*Yag3_E_#=g{q%X_Zlo18aklcbS3VwMSns9oY_^i!S3veDoCa1=I&5D%|8ex=2Q0l5KBLlt6529XmN82@L$=tfBf+OPn$?7_OOaEYj|sZZt7Y&UgzMGEc=m?S}wWVN2V3u;Z-Vt2J(r9 z$MLh|QO=K+xg&bBS19zL$Jxx2tgXlscD<6*4}ag2h29wD&91>s!8(|?=$f&$#rkqO z{6^<7Wb9A0Iuo9J+hGb1{56v-Q5X_?cW?1!y0khmk6sH+O*FBEBv20VRC-eMx+J@G z@+64xD{J)vLN;W9H?=sLh=xs6p$HdpR{EzY7)LQyV8EJ(-a%BR+Xy*naq()wguK?J zN^XQlORo6O{sYU%Lk&N-kQg?%ZQpE18G2Oj5i@2lMDKK!!UGYx%i@Itdth!2Iv09S z*dFfnFICAb8t1y9{u<0q)ukBC`^#b$=ZzkDL5cV_SZQoL0cIs|Z+1inuTiDH1##C~ zjz;qTGwm;xlmy9)?rN98_`Znq+|L8D!euE$+`@z4T!ufgBi`h$(-y}`5W?X z)?K&u><#7p+q4Sw)BvVUZpk|{fs9p*c$77cyZr%l7ILLkUs<=}xO`o5&hCw67hfJY zz1Q#;9ZxUJPk2gc%kQruhCzsM$5z6~uijz8q5JKpl{Jh~+jnv|17c*1?cV*Ld0Sf? zm`>aFtV&w!9O;JajX1huZ87lXxU1GBBsUXCgiM_~3hT~%Qu{e22QJ-zI#U+xBRbL- z^;fRT-j$Pbd)m24J7F=&wSD+I(sh^Ko_<3cD++7W6-OR_Nk^C`4UC`4=Tle#U0dae zDlvU+2Nld0ve-uNJZU~@nOi!et^>>w0TUNx8_j3;Ptc=`+MnJsCc@JFcU0{9Qu1zXIDf2t8j0T7F<95YC44gllSl)mZ zF6R_|<5@mvh-DQpLyZ*K%=aEUYQLNIZN}m;1d7}(5ghnt7*pnJ|5yMPc zlJlZUwE^my~Hl%iMz440~XDMa4SB*ji^yk@`4dDii_+vqau znPNRd(a(htlDgN>g9>WN8(3bnZap6u*qh#=&$pP@WZLFiCr6#AvJ`pWoq7^Pxu@8; z+oD{;2;Ut~cl}X1J6Bq{iRv8yG03_6H?hk9O*1@ydAJzK)Nk~H@z8kXxw$7SBW(9| zUXjn$jxdFjN?$-oKkD$9?k0lLJSBgx?naQJ1kzAA3awlQjr)@)x_Ck6@|tns>Nq5X z4moe0rbM>nAxy9nF83yf?~1P#DfqEF0kLc_!_mcfXd1_W*!VK$Gug3j#EVaE1qSzs zaN$Y^!(CNcC#LiPqL6$xf|7n<)d4fX$fSA2NVpO37udHZ;1POeXFEYrIgxG@{8RoU zjxVoY$m)6~vBBypd-zX*Vss_Cz-6smw&F9dO{Cn1u21&oycSMY{|)4$LqcDbXH}E3*GvC2l<@{ zI!1^?LudlS#`Ho#Z^qnhE)XLVW7aq1&ADw%iyyj@JL9yB3qkv}>S_jB9=dX4RbLube`_7BiA1^Tia%R(%_Ssux-K?9lba*(@(qEWa+a4CJC%)h)r6jGN0 zWc;2OH1?4wcKXcE?X_0U%#kP-0WG1!IGzE_akL0UhI$@^gpA^oLKv#$)kn8V^W)zx3x@n=z>>LK!CpMLA-gWBF+yxR{_|@W4q|m0Yik?? zqk;5aiP9`pYEdAneJ$5KYbC;t-J2iU{~LNmM0M0b>$d3kZ?1ADOaTPMu#j_ zd7_K9Lw+LXswq$X)(AC6Zm$~yTatTN0x#XP^~a?8y+Kk_cH7yZQ)CtRsL7>BjssvU z*s8~}I}3pM_su#fx&Um}d4LsRedzi<%&}H*d+;#$Ji}H$upcJ)fIff=>fvh%X#a{^ zklrB~TuOsjZ|mK5*MJ4<%=Yz3!mJu#6)4r__8qp0;!hW)^4Cu79VmQsHD$^p;Hoig zC)KZbJM-70oUz3yJg}H&r5JXyGPutZ_qP;@(5ZHO;Te&od);^ zt~q{P4Zx_bhmJyQV`KE=pb|<|Nv=rnclg;7W*Q}Dva(|zc@2uuD)Ck?lZQ}^lB#lt z9Jr-2)D2%=qaMFN@NKctPRWjpINu=F;7!He*gX$~D9xB7e>(iD_V71pcFj9I4E z;doymOwFX~ZAWJJIClZcPy0DEHqDQXXgZT0RHlr8qK8wmCu8Ldetx^jaNNqTtBrd= zyfWZTN#PG=W9Ul?BU2+UwdnMiwp;x@Mn&1PdPPY^iC@s1grjw^B*bdHr1egt3XY%5 z9&_=r1aAJqpbCLUA+_wIn67>M|~NTNDk)zmGboKKq5(^^5M_WKVU zQNkWt{Yd13L-$Ih#f2Diwj_L(uFb$WtUdR7&s&r-4D$mo=&t++CB7)Ekvulow2M+5 ziIA~~gu>dSB|G;cgk72FTb2adVBFVW8v1wCyiB#NJ)TNfR_=S zlHAoPkK#Cp;LQR3N_cNb&PS)h@>}i17y`44MV#s2yd@W}?*vJ#GDrdVzGJxT0}(;2XUZsr(WOI+JFl zsgKG4E0n}z=KEl87NHOtDM7=nHmI{BU34CJ!jmSHXX8HqJ%0YAUfw)Hn=AVjCH8@m zu^@eu_Bhgs--<+fB1uF9?7&SkCz5x8iLS-g6TN!%vMC9=^@X=6x z?(*C`e)Mgk10GD;) z;10pvp|}=`ySo%8IK|zIyHl*VyF-EETHGmap*R!^P>S1^?z`?i`+RGDK$5lc&deh- zgQL+&%ZED3G1ejCq!;~<>e&@xg2$~Ie@+x9EE=K`@SARDD=8r=e$pv?jf;m*&;nv1UFkRr1&|td^Fk?s;p3pg2OjYh~O!o=*$)Rc^ee z|Kf}M#YRz;4ENBDU@2QX22lr|30cjgLvWIfKrNV*zM*Xve;o3$=NA+>L5|;lU_=%C z`EQXt+y0x_?F?M+#2^1RtoN3<+*IN4$l*O2;_6zU_Te7yrR7e8mR18@a!2x|&N@Hm z+-Nui>GU&^=J8)BS@CZ-J%d-Xvjz-|3i)@}8dL%T0!N~=Pw}U{h^2UA;c~y`2DMqp z!(SL6Rzugjrpvl>{YkRro5`ObHT1r9Mo|$Et|L9pgZ`}SzP)w>T62|cJBDOifH$Ua zz3VKwPxza=w-x~AS1ppek>$z=9@Ts>Kd!{r9445XGdZ^d8qkSsK6H~+FYkgcAnz$k zkB-+m?n*Ik7yY|JsW4}43uRjN%JIMLkX4fEVO9M?t{R0-whNjcv_xN6p^L*3=-MZ| z^b1E6?lem28vGSdoloUZ@>G(RMBos;85f1rSkp76#aXtD2(OCnFU)$EI^BryCXdyDL9d7z}81uOGe}K!n!HUtrux_%VX!#Sol}XFt9} zvR7uIk@1%m@6Vlj9`|2;3jP8~>U&3goJC>3vu@DV;444*i*dOfz0nw3jF46Lm&wV= z;z#yln(f_U#lGt1Tj8@$UxErVG*3d$c$-_}q25KmixUqeO!zplmxo?R9FjYjQ((|N z@sH@CaJIEyc`Vsj=Ub4;rBV;!o1Z_ze@C_=g0NXjmA~ezC*%)mp_|-GzG%h#FiR`^ zA7%{5@ts4{$g7nAT)1o-{-uG%)+qzRO?FioED8x;o2J7yOYk`g)*ZJSKwM%X{7Zgq z=cE|ZTezPu0)Q4UfXGDix&xO^>Uy(HigOUIVU+;X`krL_>oK6(kV@UYhm6}LK}X7jbETP^`ZpI07IC;K(coe?00`YOIpA+3GrNU>pH$qYBhgVaV>{63hH z>r2|hjniBl559e!f@W|{C>U1|m1mDD6>@Qqa+km#wt8CFggD%7EDi=-7E;X42oC&d~ z4@CjH0*6;be0QN*^5vPe@eg_6AjOmaPsDQ*WGKT zReeeOVY9OgJQ}9!ubh_zn>1==f;$B;^IAqI8#M@_jsFm0Nn4kMGcXH@A(YN*h%g=i zQPn`^$96@oR4$4dP|TSvX~P$#x$eMx1E4F;qJESH7ZHBF=!DO?RM-o9`_^~iBNRTL zvcm8D3O3gQ>vdL9rENJG$CibIc7K`Cc;0zjfRe4~ddvk7rB*jCn&5>hKp*@nb6hXp zxf35MOR@?baTudnlbX*>-U#)#J@c5__6BlmuZ?YcI^Cqegvh$BLr#!u<2YJbn}e+Czs$<9(S+jLiIsXfo2YMK~ziU zvF}l!0!wMvOB7>wPysMQux22y=7Ew+D)?t#)K_p{Jf%8}FB(h;;wkra$vKB5VCdcy zE7%nl^VCpU@l$-T?on0W`r9R=$S-1o;lR)Um`H*j8jc{t1dHh9f*1Exq1#{iAL^;% zUP*{Pv}DP#R+nmy8roL+{wC0D zY;21r^2733CTb%vpT7OYzx=Pbf5X2FUwSh^dut=mfx#S>R+UDZLcIY03T9>?lO0;g7{?BVdmN_3Slkhut(!A@`m-i=77V+C%B}lj-EP=ix6}JA>0OIaJ$7Rge5~v5 z+l&TrrD{OofbQ%e>80=TFRU0QeW5q0VcGLcclpQp{$uRBRi!|R=I3vQFm@4SZocAFU|&JqrnSM%kxFv zC;Sa7j_MQRzBTpa{+Db6!$nS{;Pq2PP0D+v>{swQkJygM&pjdjf|HQS4*P+Y2dSig1pn)bHtQ}voq;hQmxKZh4UA9A zy#2uqY&Igu!rO89_RM;NzXweIx5CNk4}R4lkJKPNKw1htDqPm+17kHZY`Y9ADjr!$ zdxM21N4e6HYS^5~zlS?r13OgCCAP>|4m~D;QIIjt#5ht13^5I-F|d7%s+lWjD_$=n z!#j?Qi%;saYc50hD^{F3tl7klJ12*WCXr#3?M;pOJYVSB11c4J@@wVw{%mx%7F9q} zvC_9j;@ExoIK6T3Q^P?LIl8u1|LiE}cxAm?HYJGff3gPjOLV}}$se#*5l}3Qc&5A9 zUY6P<->j1+LkdrE(mHXNGsfZhv@p#mjj?uk#&Veia#D9;I!cAxX7a8iO`g{Dk`oar zNY5#Rd?K)`e15^ztGZBb=GtB@BxxuZ?cAkLiln_TKXqQeyYp64G5CZClax zHfXNkM{V|LcdL_>0Fad=;uH;Lz8gYoV&+FF<@!cA_DKl0?{;Vf3^KumR}XjE)-crp z0TcSu`dO*bT5w|i-o$-qR}v+*obgV&OIKt60B)-Dg{P;v_x$ML+dA@iQI6&M6ss(v z9KI5iXjI)R5hj4v7x1}ya;amVj=nWP`27qH#WG8IUh`rG)CiCdLSRL8%NqCL!#8P9JOP|4X zV!B&;$&k1i%u)B;mc-Zh#RW6hQ!8t6bgD^8oX5&a`va)1cnsS_3DX)!XtVfZo$tAR z(yT3UqfIleuT!oU~i#crqf%>FW{!$>eBtNS=E^K!1&n-9e6ZAY0 zHgQiM^afYs_AvacF#hN+)Bt>h-Px|GubF!gM_{hWuSsTl1SUUhfZ{Fel83msdcs=n zRvr9enSxaLqD+ye0x%&qdSW!$$Y$!%`Z#it6Lcm0$ocIxuj_;}mB>BVGk=LlcOvu1 zESv_BNhYM1e;pOGFQW~1ka|DzU^gkvpMnac1Uq}9JimTpm^=6M%0=-8YTZxj_W!Tg z?qk_Tsd+QPeM=+I3IRkTn<~~0A_?-i`T+c^>wx;6CscB^%n2@w1;I*4#tSOgr7~ai zG{>Na>)O&1xKd7#R?77Ev1XBMkxi$dPlc@rHn@9JE~@L78?mgyrX04@(BO2E1=k&# z+u6qg#YW^zxCRxEB;8b5Ib>u^!pu3<1Z<`n1mAo66`lUEyzIovI)T|^j^cU};=WPQ zo$}g(CrX*cu}`6y2SDtwd*aslv!Xr{7J4DDJC;SDSDB|g0US%(>dh0p_v*^<95%6f_~N2W-prgR%hT9CGFN^ypC(>=DNi00VkCV!vzdXt`jNNrl`_B65^I?T)Uz4Ph z5jU7&g5in2!5LrY`@RG@tfguPP0u1{h=G+|y{7QZn0d;3cI1JNKuLG6`{#nS!>_1C zX^bAZdenbHvPuIrcG&X-h5`b0Tf3|tbBShe+>N!_VeH~Irnq#_mHkJHlX>|<$^hAd_)iz?=}18 zPoLjxJ;0qJ64o)irry6|^_(6z_`n%|LqF3syb&-Yo~un=oqZhqOY_kIq}SHI?AAB5 z^EXV)nuwazpJG%={?=qntMD!)`9r!~E`fdf55Ah@=F$meI2Spio503XL7qj;Mow>u zAx@B3#)EblHfEdSrj_IhH0L?&_b9wU4*mfvnk8%n@kcmsQN0GF4D;w9aKo#eFMe?R zI2mazFXf#^^f(5M`W~V(Wg%$jSZ{}qPFL~|oe_q&_brC$GQW11KGy|}tl12E3Nc*! z#}Tk%^0$rkSK2`JF^*V?fGvg}F9^r!r8C*{b%&g4l5^!UIV!(_MLmkQq0{M%cNN;S zAbp*l*P4Z%k0+YaQ^Pz}E=CCg<4qi>fBAYZ?jA3mQ1AaMzK5gw4A?2%e|_4gy^=U2P4@?q$a< z<+q4KfT5_d$K5RZ%@!8f?68f6(K@fN{V^E8(cU+&St{y$264#HgGJ8#=R?ta`+9l+ zof*w?NvtYR|GR|roTFhYaWMQGk3sUMBpoR{Z1O0$`alZPn4|so2+^>Ma-Y=pYF1#d zWqp{_<0e+OhPx1}N~skjJce6}E5ygAWo{4)VL>pr-%}?M>H)yyP)QlZI&YfyQKU)u zIGe_bhuh@vx=b|@)`%e3K!rbxkO#}a=Vnp2Z8t?KhA*wKLnr7&<-MQuTb9p={6X_quO)d^ zze%pz5;DE5H}~vwF~c@nN670n#jHF2018!iBq|oYmv6+F4zT7?NgTz?qd1qz-P4Ia z=HO>e3P?e=#58?034K7HGD-}zwi>m&-P-)Lb=N2L7M-pKGs6+!-O4QlJ}(Y} zEb$kw!?>5Pf7Q)Hx2YMV4O6C1uoS^**HKya2aR{Pnkh0dH9!S?Yx9x!jmJH=i7umJ ztCLGiA4o%~>jR)k{JtJ_8xy@FC?6fJm}kpsreR)hIdi^)Oqfu(CFf8tMgCRidt%3@ z(YWXy;~18ybHV@~`Qk8Dnw&@h_=3iOP?i4mw`j&VJ~e@FCH5@tfJ?BmaSQ&&*&SU1 zDxW5+MgCu05SObmc|!|;l?ax`BG>Z(O~8_G(E&f%uz{~COu)`fE&q>nY#m$DD-L}* zmMPZObKdKgpBDmAV(oCpWQ{{#um(z~HT+y@M+m)y=y{`B_$|i9SJ>8JaJ6esWPjq* zNq-4+b8ch@AIGMR$fByq-xiBvHkedA{_sh1nvGST_0;Mgt4O+1@*;b^DxFxx;N1+g z&B|**(&b*GyNw~kRMwj#jgA>46h97-p@m4Qts>TdErsrrbxZoT10@c*r)yQ^{v+Q@m$JqRhM=BI*ZvEQ zr?@+0MilLUWNox;hP7=(u>Z%AcMKI3{poYXHCsM0FFEsKx_td(XZtG$6hZT&!f9e} zao@HXp$|RYrzoL3U9}$!-hX91%j*TT{x=NkgZw9)ATt(Z<ab+vG=zkpdE&|QY~PYcSFjZ=hEFui468tzCB3HfrCrhTbKM_5qs$vtjOK~l9=XO6%x zn#w2P5EKvqTO;wsu{-&;-wZ<9viRaU?sB(|Ksv>RMK~GXflpJp+$FiA-%K&(x@`c2 z|IFq&U_%v%n>7<=c6>A{dA#-c}0z;*Tft+qz&Lgwdb{X*XsN&OHW)p0_tdBUA(mYWc7J0X1ij8|m>}}uoxtj2Ly`d3`YKI4ny`)9J09nj(qf;SJy+sD zg>u&SGN!{aId|(-a!4zl@|91L_EVozk=9>6vP?NOxbIH&+eLUFyveVi2AMOG|jzI&0>YsV)dpjW6Y7%3`k}nwf@TT<-3-teLndm zHS*8jatS0wL{!EvJt|N4bap(v%Je_$0$e>!h8zDe;=ion<)@}bCvw{qoN%RK-3}V+TUXy5_GjHWyB&4^+5!X!$|cDs zb~R*R>%>G3+@yB6IEQ?#OnmSbl0n2q2>0#NY1H9?<;E*Z6&9TbF}PqHTr0 zr!D*>;6<$747bOvQ{ddLRCSs|i)dAqaxuAaYOKQ=`qr{wOvEMCL#D&_LFW`{Up*TW zXyAR+qMz^y+`B+WVv$GUWtUrrk&JTgC{p||EQpW=Qw%RIR=MskAE?JBHr7t00a^i0DFHvYB3H!<3PnPn)LD@eKTo1=@RM9-NmSOB2DJ2 zo=rKqc5Sy*GH+YmyY+}uw&T4_Ki~BS@+l-uM0Ve*_blKhzS#JmZGi?IF=^H!N%k{- zXCl-MyOs};V368p=HYn>U-F-Gmngf%F>sh4ON9<$^J`D!&avtMM0EDl?ZVdK-Dx>& zvAMjL?>oRdsN)Z2`}(d_82~NR28Px<|If-kyM>PK_x^mUkzezf&)uR1N0xzT=s{v3?ulo`()? zSU3jey?KNP2&V+fn2(PTe{vc+c0KHTbnFv5pHvipP73k`wau~lH}=bKr1HMb`d1Ys z_hlUszln^ZDE-XlRK5e=0i@SrRc<0x#CIdVu4Ila&n%;i#r(q*08+`{1HR}20s&rS z)84tzg9Fw9+GWO4Nz<fkO994eSZAAJ zB!j)zyAkH#2Y9%WF7gtOo-sy zxIbJv6+HP(V!qQ%klQ)HtriR){jD0`271F?i%SOyl(+5XA#Ng4HpG@B^kXrH``l%q zC{HTR8I!kzddK7vs}jI3rE;tzWU1D}H3)TpWs-eRLXXdW^PqK!tnSp~I+P}mXomxb z0&q)L|D4k(jmYmL&{p($86mW?(4cZNl~S7jtrTFdL9n;S;DL|6s6%EXQ*}KElLo7A z5GjOBqEh+p8t=HpRW2SWxif=^=ju#J!O#+7-oPNj_WEPU>qqy8Z=R z^WV(vSFc<&K<9cJ1C8*?250|t0*tA3*tDhM_^C&RGq8?21Eb`!COT8IZGt5eEVYB{ zjC4!N|0?r5mp{{Qii_?3jy7P{{1_ptyiSNOyB&KY27WNAr}af%|k!Lf(vEiuGNKOidK7gGaEgMJzoJ$E2Lkpv&q^sF2R=l7Z`)EbkNO zz?6b4fhnGM-wad0^DA+V=Mf&45X$-5IlP+B;bY3unC+GemZ7ZQy2h)!4FhK@+CHs4 z5xL6dcG%aweV-yTH5T-%D{;NOO{-!rR`OF4F8nOJuy#TDdZ%}_b@h({A;vd_SUXj~ z#HZQ?7n1ngg}k@}5|M?|J47#A`Ym1x{v|QC8d#uChl`)`FOGqEEyaV~Hc5!Db>Fhd zz_O~W&f}jVVU%m3F1Q8-4|j^$rIiwycxLyH&SOCAmY*ON?BV(>1G|}YTbjN@_8PCK zXWns5!*#?K?iGJ|P5w$r<>5^nSR{VHeuZV88TFueJPh3SA8S39u(vJfKgA*fo&>oj zdROQUE3Lm_S)0(2tI@Dkes$p@ZLlFcQ2SAorlYKZFzb{y@uH#e%k_mqVp)4bK9l-@ z`oKybK7$0Z9_2IBCXU1M7(It1kyV)VJ(NkDb!q-FI!Ywaz})vsJ|rpgwcV#Z=ZO+! zfKa=mfet-t8-w~bIV_!Y4JDF81%P^E*wC_##i@O9XCV0A_gnvi2#+8dCecdPzuz%0B z?a8a<>>c(c#*41!zQ$IYic^f588aov$uOXPdp7s|`eY_-SV|qnz$3o%Z0F4V$vbP$ zSHrq}-sL|qCl%??t33SVUIy_AD)8e^ue~)RCgFxpu300pnbJIt)5r%I{ds|q3h`oM z5tC)CWo+NxGc$R9rI%umLRhj>xGybms3Swoue`zUsG7&@o_E>)N6XVyObu8ev4Ti} zFqIAzt&slzW4FYWYQ$M!)&vdy!(*Brp}PErrJ~2I38>6PgkN{dr1XXI6uuVasou+lVp+5oqSB!;8BW<&uknvQA+J`0|_qxf3tKRr; zovFuU3CDGIib2%HB6ika``6HF_N#IB4;7QeK&oC--UkAnhc=q;wEatSsn;tT;kh&y z83S4!r?T*WUM*HUwfo7jeo&9_u^rPK1*baHGeK+2q}EH=ms7fmJ~jd-`D-+BT$vBs zjD_#)%zM+>E-CJojQ8;Ad4#8SJr0G_?f1*1oRzuVP8&1^MGm~7B~<)Me&fLDn*{v! zxl?;?U&($G=jjg+VFlwm5(dK)5|nYXyp0YhJ=4V4`QG?9Lq!D8-7GDPXR91hPe$Is&+R<+K{FSSEoFqat};9Clz}zOz(0!mygRt zG~8A;pb5nv&`S|_QL$iqmM{IHURL#OmR0=`$s{aTJ6pe|G#~R_p<^YsXyF5D5i6a} zB`mHAO59~eLqD_`IW^D@8LNCuJ{LR$a45>qQ zm4Y_o6k_qp7vpg?83BPRIYhlCRerH8RNp@e4U&{^X0hd(=G5WR^=`-Ne`__+bE`DN zJn9qb50OC^q8}lDZG(8d8#wDXQGw=r)eRepPilafA)g&(G}p9-hIGbG8;iQrUbS{m z$spL;%`hRE32}rF?x1{Pi#V$G7>&M?J(Vaj0RBE`OG;4D(&)GRT#=gi35hj zr``O1ji+Q3mNQWaz*m93`GmgWnsaZe#z-Xx6|4t0`p>=I(Cgh{p9@4MV-j!OI10Lc z%?X*Q{Q2*`<9|-{Y!(@a{0*7iIIV5M3HY<{T=T3WRsFtQD}q6rdi#{6nxtPc>-L zRSvtcU#}>)p1pC{k5u$MjW^3haX78nz^NiB#3h|w&&WcxGAXlFfiY2#Xk`gGq?o@D zmUZ_lDq!}=JEUJOTNlHv;Ww0*#v4v5>}2drl*MHa0)C~|z5?;rhKg$w^6B~G0~RN| z_brQL@u{@?Vl?VUGm+hmjsBV!@eVzzp4qrcwAbzS&TDdvp}vQVbA{^5YYDldj_Vtg zc`6iSWs@hF+jL*9UFso!3SQ&im?HdfnnaqyYFt^iJlp3CHCX7t&~n;}9>D?|rtDpS z^MpNm`;QdsbFW`GVfy=&r2%A|E+hsbWs8nq)x+;6Xd%CMjC)M;&b3`z`w^l$dJ+%! zW?rNgk?mdLjF}g~#`OX{En%FB#ldw<>x>(@&7`PZml3cX-6QMSu3ZzVNO2~so(ajpX-n46<-dX4d7tZzAZ4%;p7NDi(@ z(rFEmN4kHq;BgSrWhA7{4m1%-q_SdkdL=H<{W&sdN7q;9y%jG zTF5E46Sd#9GsWQg4-ti?_1B=^R;p{;v)dDAGA~OW%>7xRTu6vR{ARTR0d+1$b;;~M z;xcu0dvqNlMGn>!U2}fU`JxW0#d*f>e0Ixt1<@_5#MOZQ+{-5$-CX0;Z@0(Ve7TAV za~=(+dJ>WhEB6TLs9T{ZH}C=Q10=)0ui>|H?23d;dJ_|wm%0t{L* zw>=03L;tp0%bPtxDxDpeu)b-ZmQVK&Ynj$$04&LDLDOUhkc>%Yc=rCykNL`6g>C*H z^Flg%nf{iD;k?1A6vDD>v1p_gr#>A8N3bhwbGl0LV->cl0IQOp05?ntvG%$NE<+YD z{s0ib)YbHE1yTdp#=%sKGhy~0nYm*jhV<_QTFdq;%q{s)%{u@xwm05$AfFYlf# zEZWh2v+pS`12|DRikF50Ba|4Y>m^2+j4zx2jEsbiXtpJrEh``0v<;z||L7Sc?256= z?Pi9NHcHbQKB1T&E5Viu(D-)UF%!hx*Jws-imf?tg>~yDr5b-bl$p-&^6cm2gOBs?MFzwJgV$aO>!psQxjLtSaW z;PS%4i=!G;)F9v#berf9=V8y5ve4mt! zfAG<*+go#dLBpXz9t&AmgvX3?yg-$X45oAa>A4wiik3A1Ewo)_u${9c-}zAZHEHmE zY(|%ppRy0xfsUx8E-783!C}Zg(MagYXmjQC+UrUJN{5*Ya!(pZ-du!cx5ECEa&#cO zXvsC>Rh<933t*oDS(@s)D?4Ry%Bd;{?X%{HWU!BO_yT!xc>jhqNKbm7?@&-4ZcBy- z*?$Xk&ugX6N2MtRL`$%>xBub&;=g_OB=#@;7+4{|&e#FL?)Wg|Y$04%ZS4;sv`Mhs zcUQuLs@UReK{aE;ww?WT=zMkn0LR1-w|nm6v6>JJ|&s{@$bvG%KmdL$FN z+uS3tCz{xy6wr1TbN~8C=g6aed;L16%+Rb~9=Y|9?TiG=7Dr=aI+TF>_RxjM*5ry# zjqJcJ?}KVlr|3g)FZ$FLSB{BO-Z92GdGYv?guK=z61a*wI04&EQhIKN^II2L$&f>t zrQL#*wt1Il>Mk;0nXVPgF5@v!grBkWWnjNu3@ToUBPh-vh_a2&N8OsR7ukBtL^XIY zyj8S4-7mA!S~ypw*_X@=3^hQVUE8HWcicy^w{gfKuChIKmhn&GSNjSj(u(-(tD>c8 z$V+SWQMsG~CepFWD^STs=wp!X5+zaFB1NKjdO^;$O@8wC9|6?$p(qv;DLl+moPjeE zo6_MbPfY`yzqXW#e^Z5~KJPb_e}p;I$(`MZ`aUPja;6Y&IfDHJGeX#oWBHQkJkB$~ zJ`-pU%@dG{Bfc(hOf8R z$z zJf@0uWW#3Fp!&q6E~e#yJ}YRW`#%vvX$YgH_tJ=eo#>p5->;9)nSNUTBMvn8XwXsl zE>rQ#;ekTpT`PZl*4@GC3j3>15+>t=<|o~DF;) z3J`y8v1c~bC}e)&vse7Sb;3k%r^82N1AQR02$;BWChTtQ+apzT;p)gbzu_sm=x!a>ow>{NylIuZLM z?Jgu6O6)LMG=V@2>916?7~2TQ>1CB9h zo+mlxz7(e47q9M4d58?271~*zeL?*xKL|anHr=VFxXDcKye%2O@L4Rm7m0%Wll5Sh z8*i)YnEGOVg{ex5(C!SyI|3%vx)u&hQTCCgu_~eg0a)k?4B-B@AY5ZEbRjUgE+_cN z1!#q(lW%wgUFY~`e`)gyH5YFXsMvhzhz}SwdmT%r3JWm5 z9bm@AlcD?G{GADzq%lBB+KCO%tR!lT)sy|B#z25fy}^T1%#Ijxde*hx9Zfhn&>drZ z7@BCsN?~*3sPcAgW{qQbv37nk4}aV{izdpKjx>If%kHX*X`(-jJKy*rP0I3%o$Cs? zUt=4j8{WAr1N!6hMadeS3zqq)^rF*cBIjDKKITlZ`DBxr<1bf+a4rjyS}YgeN_D8O zj5$(Q)0v=L1C`Pp>apx`^W?chvxHNM{X z&B>#MeTCor2}!|k3}w!%w}Km}=AN$8h4zcoG!kg?EHwH8xu#yo z<60;)vbIw_DT@A19@RI~QE{@w6Zl4FqD1Dg^J$Ji?rS>NLF*pXf43U&u8|)Z|8n$K za~|FQZDr+?pgC=8kY5rJ(5sT|aB7S<;-7VG6_S>81RqjneFG;zMYKAz;eiX;+#;=k zLBWo2?4q}qxM$t}_OC+)OnroPaBWRi55t?6KZ4h11ogW)@R2$%#QW;-bu>gYKsBPO zh}y5`X_P0}er_Rv ztJYfw{2a;+Vp}o6e*ct zmxAg{TXFf^VZrb=?D5KF0CPVxfGr@s&Bggp)Yh{aUP?y>U?X}QykbzVE26Wbe`>0Md z%Io_IcG~I>(jR)2;E3WXA-4Y&JJFr46|Al-chnA}G=?&c;GP zF%OVafy5}g?xxwJqi72ZejFzYqLb69hxn5IVd2RYeJLN-a0iM733d-;aOwe6_?!%6qTRs$fPwId9@qRkE0^eJ`Ubg~Qj;i&-2D6}%B@Tx#&SgQIA(?a(H z?!awc6n4oWtwW+i>Y49`yw=pe@BYL31e+NNqH)#t7f{vH07!f_YZLfpq?#$Gd0~L6 zX$mES7#04nUwI=}8j^!a8FauS#Bpf(94@2a%>{WK6Vb2sUwo1b_B`2RmG8Zp$gh@5 zX3o!+k)4^+kWoNZ3&qn;(a1GPsV+E{2|d2Y$ah835$(9{9J#m3ly^TokKfH(Ya--6C6L0{aK;I z*4|?!k8TX*PjyGxOALgUo-NOp9S@i!4$RJt$3FV0B-=0LoEf+V6;+7Wx?CI+ZX{i{ z5Uoi+TjiShoRvVKnlmD`{=iW$o*8)`dih$~l3 zY}|po&M9p|{$)vf}uqp`nn_Sqk83VBJb!8v=kqI@&E>Ms3o{HwKtdWJIM z+isEzK_@E2kTcy!*Zj7~=b7nJqu1RR+(*=BSbTs(9!HxpNfFr?)}wpzaGI1a4ETPb zIvEnF>h9s}@!>L_zhog_g^T+hJ=sw`NfI53)T#icKoy(l8mM^)K1r9wPC(l9;6v3V z9~yi@Qi&Z499J`;lUE5I{gP4t>&yzGOm@KSEGsP!`OO^#w- z1ZH>ck=i5F0U1p7>HB~Pw>;U2+|fT%J%}rdpEaG}d|XWsib<#!FCQdT2ba>VFiwHc z6UMaSJUa7lTTqvAA(M9SXR;NI=o+3(o0(k?>=nM%f1u3%b`Sk4I}%=Ya|^y<{BNup zl+gK7q!byeY3~ZLjZu;E`-zgJ%)I&=K1NUsOk%knZN?$K6BZD|hOAagdgH(Zlgqof zJdm8x9~*v$@DPdj*^k&I zvJnJa8fuKag!dCF(KuApO85Gc~PmPqH*JrW`~ryO{j6jaK6Qtq%r;aPT(l z%UI!-z>mk$v}97!li4t~_!*`B?k(}CPu|D>nkNfp)ArCq>SdYRaOA(VU5IPF7?NlZ zzxKa;f=?Nw@4lZ+)41a!Q342g{l(j*kz%-?eQzzQFDTIn;5D2VcA15?hW)L)uOD097cN^GPYR~X)|M4zoUCdX6r^=)3&r$u%UB)G%GA>zjP@D(=7B34p z|MhO8oATzfx_HUcLp8^~{o;*ED0DUV>qC77r~vXMsIu*8b_l<|87B25aQbK+4>TXxbq&&4{*ZWyjR<9SB=vc%1j^eEFYsht?}eprqsH~&V_8IZ;D8ZaR0Ea5MCM;2|6Je#FfW^uHX0AEqck=@RdNN zw#`54U3+^IZhMRRU&d~6_nLo1wNpW5kXTm>ELoxYt7nQ|Ka>qSF&1&|0T)b6Ng!#8 z+sf93Sk`T{>VUP=lz@x~$t^j%q|uTLvN)b(D}Tm^*;OFnNdTA4813iVrnXpCcAD+@ zCc~}xAUBhcO?4OmI*3<@=`}p_t|RftkX8MSR**QU`*#^E?W)8d!v#3Mup`)pa*fbT-=oEYRN+%pFz22A~`wXj8#7 zth*^VL0%*LnfVT#j-dY=Rq_z4 z5QB&Thl1;XAHbD?o?m*HN-`iqXJg~xr{(dThTrwnO7&No?sLDoZmv#E=9JwAA>67r zF;#|Bk1kp4A6=a|{?+m63=5&gMxJ2TOQ#c6vaY7c*N#8~gw?&DWFzFr^As8ZCKCZZ z-^sQ*C~f#%w~U(o!_QS*lppR7S-WPxeDygR6Y}jOR5i5tBI8au>Akrmd}zEO*BEHQ zezIG>)iSPKxzh$E%iRr+Yei-PGdx=YfPVS44{2`pOFf@W)HdWe{AyMqjlAo$lx|Wf zB9zuLG#M*O{Na@qll`V5)>0*YFKT`puNB$q2(SaRw=+}YQ+;R0js>+rNMj}h3y$v1 zw`*=3=6&5Vu;E@m9OHpu{UPP={p3LySz>ESlC8F&kL#=XLH6V{?{7D|yz-qT>F+p} zp!H!}h}qQIRRt?o1^Y%ybJ(%rI@lCfaR+av7dsv%SN5n2z%ltGMSY1rx2glFBU6%Pck-hC= zqxp$F6sqMB_MQ-6;4lS-L!ZR{T)osF>)N|+C83?iv{u4!`J29aKp>XYO~I zZG2-F?=SMz8|U4#BocqXga#XWHT|?M+P6<-<=z|*x@Z5-bq=j*gUry`Be7c5SB+j+ z9T@ROab^4;2O36V@aF>?Qcvol%~DT#7R&#jU$XG z%W!uD%^iXD~(g z!ZEXD)CYe9>H+t|ddC6ca&X4!%mf*XRXE9M>aK8J5?Ul4AO_z4P?=mi>+Lk-7|<=e z`MC`Vd^SPCELix>d1yiGUFJ0#Ch{Wjm2_AxLR*b(7)=jd-AqCk&#$uCdY&dO>7AE) zdEig-z47X4cfEV>C0G^!Q!t{~K5e#S`=O%&Xj5JbKLnR>tY_xLp)tiBF9fCP7&0A&DDJr=-kznW^fw?BwX`^sMlgUs_`fVF+mk`vH>%RyA?z zeaxfaDLh@c;4sh);c&0uI$4~kHkD;wNVlw`79s7!)~qHOgDU52e*1{|lC8(~uOI87 z3v|hDtje`2P&wqj5#Pom*bKQPr9>x2Nh1~gt|ogP(Y-+UrK2~!(lsP{OG(<-wC_hR zLYsT`sC{|5!7~e;)=V%M7g&$P9GKdeEeORi&ouk|d{1-28>ix$)9FvjJDnuDweL2o z)GGAoSe-J4SUCJjR>xMY<18sw#1^F)pi)f>Z5Hi9g6=i{|Hsu^FvS&h-MWo88Z@}O zOK^7y?i$=38h3XOgy3$$A-FriA-HQ3+#&ewyx;fUI_K2<1G{Qht+nQuV?0wzyztRA z@1pSa(_|%G^x(^aD?_gzashk_?lb6(_Lnf~Cxf;i-aj9ljSR+d25MRo>*v}xxoXaxF=)|$GzNX|E`r$!pIp4^PBdLr@UNz;nvf=1 z;rEOgfrBc+&o;iq9W6XW2omt?HSFVmngV57G^a<*GRGIB!yMU~!gfq(;_`F-(GoZ$ z5`$$tIUX)P8J^m;0`No%5swuDQDiiUY*F8T`^Wu(R;Tiz#?$(L;*$Aon!Q+BS!=Y% zThpw1P=zYap@U*pe{Jd=&#_!nHNuW&J@4G6^O_ekztX`+uh8t?mNYK5?UA0I&B5vI z^tS&!5U1>|@oUl8U)bc|4?p%ztFbnV=Tdf=hIkT0)hhwTzqv@iA&J_#Eo46}DR9y2 z5sJDD<_N7rEx9%RX%$vmO5pE_eg5-J0fuccK;xKV-z~^Dv&X{-t{HJXFJPJmCL}7P zADR0QmK$xk^pKFfe=7^j4<`aNZD*DHusjeGuecm6et{ zvE`cnWuiGd<@XJsF1a&Th16R9ix5u0E5Ye_{TEnK7rG(CW5p{=A&GR&?-DeW z)Be6QtA#Dfo@s0VutZM-*kqjyJrCjRSD0yYVS0FWYWCWX4${@Sh>1p{I?Fnc_lt6n z`2f)~Yajoai1UxM^9{`@fl%lV$cvhGBu;w`Qs-0+FMIkN`}0Oj{a=FluDAKa#?fyW z(UPXK>sC?GlM}o>{@SpE!#LiL{6Hi5$!qSi--RN)i4oKZELw{%o}axC>$!Csp~ydm zq@wK%YIDaB>!@32zplsfRr59}DgNZP-DXhxf)OrfJL6wtxdBCSN}GTJ8c>R^Z(~tZ z`py|2odGxhPsvfP07wc`Ao3+*Sgf1n0VzFtAkySoZCz;tLNJj(Sl*xdn+?_Lj-W#4 zDcl8`n~{wO>?1rTmoKsG25H+KmvbT*lRumaOg{Ol$xfIb3^>wEUHz$Lv{uoE52@C!aE_tCdvm=SF) zXFtx`e1X_pJC~G$(M({Q2-i#Lz3e|-MQ@;{CP84R4cwtEYr;LLI9`rsI5ln`e zpzd7{!(q=QB||U&vP$Cu#jNg!zVV*a*7$n(QeZT#lSRCcW%b}PZ^^E~l9Op_>>NJ$ zSCJN?T`iX>qq$Z#IeD>Ri%0RZ#xhPwr#Q73DlfyTq}#L6!lZ-RDW6q=hd@e5_sPMo zK{VqrM2}X-ev-v{BgZ6ikv8MUcphCACI@dKVQ{JXj+}GUd7bs&IqouVFuR~a{kHP7 zAk6q^n%|?R1=lN&5fd_$GTe(Fp2{JaN&I!SV{!mWT(O3r_3U9 zFzsG(j&CZ?TXOf(z%dF@Civf=s1Plda#ZIio|!pq@A3K;l0aWbbK*}J1?3)=rNUIl0Z2w z_@ftvl|*GJ^!?=i+i`}-CrR@mMW;g=ZpCsGDGgLy7doeKqJG#^ZrRD6KPBQkJFAYa z<#cW`(L`KIy~1b}NgRK@3HFR`K65GkCFuR=Vm|;kv3&|VgA|Rk{k8TX^_i54A=40X zKq5YWZ2C%&6We;8=b?UX`2_@TFJ-N0QoX{&mhpi07(}xjL|HURU0fzCB6{2%DUI(X z+lhIH#2b1sta^~Q`mcAvEf3<;JOP*04+dbc16kg9Yqvi`MJMnh%mM%SuaQuDbrDsrh4HbigSqq zY#F6G(Zk6cz+#dX0elX(u+`aq61w_EB~Lf1&PjA0IG~i!1YTRCxVRFa6`C2}WbN^_ za$RJ-#Q1A8tH2Os#wLjn1(oJXOHw`BMeRyO5ds<#kThuK#x*n0Xw#1S>o4vB#>$#5olC z0}^C`{(j;zpYZdy{0Qy6J$J#4xH2lkexon)lq1q31^kv-Ev5DG`PJkFk4I-epoc7r{c5Z0){|Twc?XvjTWhTr@CqrRp%tfJ`s}~sG%K~H|predeiJ!pYM62wJfwL@AK`h$bUMf-c8`#C8sLw`&!s# zy?=<7NppX5y1*;2TmqH&N!W~Fm-L3w3Tg^BawFCJT^c2Fr#FAEkebuhdHbxIb0efy z*mF(~QAwRBn!0j7KrZH^(zk3@GD}ZFjPqXHKAX0(UKH@Ju<&9|6y0Tn>t_gB!$ao1 zs0{xnY&bVfCqUY49%V1QKe^oH@T>9=KtJ=xBk#$`woPp81$hQ!=)$srcd5mINtvE zU;jt8&8=%^{P8ERXh=IqnuaBulgP$?7YWYhBo*SJR-Si*wf4EXZK8mm*Tn)lBO!=u zY)aO5(pgX_MSeP;WFH|4iug-T?onREj!1V1F)fs;K*3bZYcT5>+4T+;K+jR^hQg8=WzzV%c4x+vp#$K6 zYRm=ExqLliL=GbD^b%;!O^X27Vt5ijen?e_o`5R5EBbF9CEx>5u$PVP)I% z|KP4lji3nNt1?=5;lPtt%7$hvs1qBUkzvG>ubNGywUYtYKEaOO`t=d zv$bf9a*v}J5;fN?e7UeqsR_u0pCAU$eKc${7RI2jj9c_BJ6C7+Qxy}HxNUB+7&ifq znl`;V&e2J+`_M!@I!;k3q1y;1PI>aX4j0a2SpMq}qsO8kRQbQhRbn;33^~6`>6{I{ z_y+q+^qSmM%B15#$56~voZGX(`cRkv&tY7Hj+P{!;5mfDpd(?knzJHJV03SpTs?rU zDYw$Q5Cxa{6NcI+}X)X8s-~&+v;N-H(4cQ#*@#Dp(_6^*8-F z-^TCt@#k2w*jS{={ozvgLX6+qjOWb{P{}MZ5X5g6c(j7LP9~J;q_*@6RP$JN1$4SY z&Yj5pQXC9OXyM_^Wp!!KXWqxE%r2f)5>Ak07f%ua?0$b?7p}QYGvQ^f5Nd{=7$+dI zhtjwFF&a;YRIguHK*j7oZ>?UInjkRUeHEk&UdF)zyhDkYl7^!LcckQestZSX2r*({ zKfx|kS+M4GE#lNvuw(wIf1vJg;OD9D8GrgQNBmrC9?LwkfgP!7z@Yr398);QlTi=* zEQCVi6Bl0x%Q@;F)lPosV))n{+lW_lKx&wG?l?g}&2Cs9{U%4Vrzu)?&IgxBxO&L5VkLL1Y zdCmxlIupct<9vBm{yuKEyFC-=kVorgv*rrf#0wa}YD_I< z+%Td#jU4a5Z+`VgJ9ON~Z^tMIpeh?Jzh zS^d`q;UNa67tLF^_b)C8NiI0TE$?@+q-&sou&~c~bup3#Td~VcGFWgPAaWOwtdb)? zD1zpyn)5YU>%jTL_P3tWRbtj9I)V&I6FgoT9>yNTm$tlw_eY}!Xnk1lRPu>>Nl*i` z>tFKbY!R2Z5Dm{>Qp`A5Q4N#?O#s#)@!eNOyYSt}h%p>YT%N$QZX`c9Pz0fiUbd{f z1w0WHo>)M?s_8Wjp7%m}NpH2IL7<}FO zHQO^f8tsKidH5U-S`*|HCd6UV1{IQI3&?ZX2&#fh&R3%P4u~%4FmSc;(&4NUjw_zU zX!bzi=U!E8tyx>TdkFkbxU3y#`_1x=`uYRp-DH~`T)O$)1hkV8gOgWL`Y}HAP)V0^ zi9|}*w&&N&7fl_f{dXHr%jk(*`*;QhsJ;Yvtpe}{#MuLaE%Y82B&t2Mtf8(!F(%gj z7%Lv=lpkGZEi9HT{-+KCq)4n_o9+_ZU%tnb0?bIHN^Of`;j-g_hzD2r`D7iJ46}f4 z1i!!xe_;qlM8HjdN4VdSoDD+(V|=moG9Vn+zSJIbP9z~o^H#e{inVmn#axDZU}E)X z1y6%`OY#ob-t}DnbrJ_p{CIiG!zGk@QMW|;`pKpQvYM|jubRci`6iDg3E4H7E1e9P zW4Nsh;=-_e*m2{^hz1OnG>PuVa6}Vsy_`u$2l8haCtFYUt+MWEgc;Ml%D095a>t82 zcums+u!lbHK!#`XZu5{Iu{WautnM*27i`ka<$Dn**fe` zhyh?(i=^NMKYm$&MN^65lVINgZtM;+Pn9g z{~t!T9FJrC9svMKAT07byG1E)YXoZ`hBf1&%NSC81f zlGWv@n3=PrGw!{Pp8S=83b4*1h;4NXag}oJh(Obf8fDxttn1d^eoF5GCwRYZL$?GW zxN;v78EUr;-QNH;jJk}wcEH)OD;?x4(Bp8(gVmTEs_&FV3I<5O(n#hk8Y9|0RzE;M z|Aa*Kdhl>&folu*k$n9Kt)xmmRV`tagb+wZJKpBg1Y+d|hUb0VU?~sF$~GGA=J+zK zQLhb7KXHf`3&py3{0@IhI$d=5(x88P&*dBalGQQ@1m*|l<}z=q+etgAf^c<&npXpI@Nci@moL8VLrA!r{tn%>l8X;8Op(tudn!&p})ghiM0W?%zO6=@@Z9tLJ9Pvlk-w*MwadzR_R=$cGOzeU?!Q2lJ)G>RNdSWHD>$4Cs1Qu0 z8#OECsu58fgZ>d(z>5=+)#1+b(&pT5z3cTK!RCMJ62!1gtQDwq_cHy2bgBU*FnVN+ zfF5+5TDlA2h)5D3@yrB8&52D*L^V#)x`k)E$R0Fh0lc4~QiS|^ zksMIq)aX;FA$S`~vU>8{e~MT+z?dPDFg4#G2!}KZD2mOnZ%@P(t-hh1Op}GZCiMyD zdP0HgjC>Cxcn;5Z9edN^H-w*45Zb?*X$CXsGpbO29&MQLbzl>7=td(wiik>_4xnBK zpd_LvtK97#ISkz;*;RMe5TL|^pf$IG)C`277&2g>*s&gvKzWeK8HsWepzyD-xjeY5 zP0b)Z78r6v>e9Lg=e#>dK#7j*NtdnJh^w^<(p3+T(V&Nn_W^ppU#Pm@HI*R=2|yJ= z8(!FV39aPa4nR8j1Bs8iCm-pzEJ7YKb~JcS1L<6x!;pCcC}Ycw|F9B7Z_0z(PX4?_ z4n};U>_;b>%qUV0pcr}u^-?S;N^$}7Iin!sdh;!#N}%g~8M=C67te}pMbfR8a2R4x z+9SpIEbQh*3@ne9W2q$c9BiqJ?@?SIctYr~UNBlEWYYhGws5B93kv8;+2yUkBzC#r z^K2ygB|yMN6e6hB4C`9y(^{{VL>J3Qu<-LO6BxIuYy+qGw;@kuQaz}3^ zD(=8LJ4EL{q_0Qp#0X)~c}ZD93Xi^Z{(A6t>3vjbRsP`D-Oo{3?UAV4n;MFR8|@<$ zDib0rk|~;B&r-miF>VZm;<#k1VS?7uaj^O*dCGf!-OIgNne(bAVp8&1XH~`Qxi@!@O6NBys32rooP%Eq z530XK^CFEwm3lMfb(yDO>7?cgVRKnR1cGQFoFMjUuUoV6G}mR=-jKj$l&ciADxphf zPO)=W4K-;)8UE*m?@m>PtF_tM@@#s>3L$10qC!Ly;L|c)QHsFj9GR|M>872OiYstR z+0P*5^WA=dB#`&oVAMW^@PM_Z$SW6+skt2Xb?c?o-~#*SBOA{vKIi-G{A{8T1TJ_# zj3a<1w-JJAZ>W{J;{1K!zEREEBQqiB=lsT$32$>87|^haMzL^{`~cfv8-jVN)6)Ai zY_Kf#xb00xM zgVu3qtul|Bh3UxE7uwXSj9Z7hzNZp@7E1S+L|Ep|p*;ADIweXd^Q2tg=y?*J4|WlMyXnu6 zc&w!Ey;d^8>l&&G@MF~Fs?%ZzL?$3sMW@p`6wY-jULc^)NN6pJl&W_94mln~)hhsz zR0QX|k_9!xQV@*x=k@Su9_b%oddGlHS$6aTY|ZDS5|4DhkO2=rx4ZXH9V0>G{xrm(oWj`K(f zDB@wSa`O7UXc^BxLINug&=FbL&hd9P&WZb|FH$cM`jlOKN##cr9&#v0L0)D6(e7CL zQijXJ4lZN{ zcW-LX9!KH!V+TU0(f>|CtTDQNCI@=p%0S~*9?!Tq`S_8qBkfq*g^4m&^=dZUegE_r2dv| zVh%IqALZe!z<}%RoEN*hvEzC{0gcVR7l>wblrWEfdB&)|5uJFeB|$D(yujhP^9;$z zuKwDTh@gPRz>#9~XwD+gPr_f7Q{mK;yntJ^YrLmKV$>@GO22NL)1Gy`EDSP=zT1q9 z$WpFkYu!0b8MYRc2B1$VvF3AsO(htuO!U_Ua4k!}cV&L9Z|X6WR@8g-8O6Xy$_gn@s*t zQ~V5hANqjeUZQ))@>$6Xfgy!B&ba#?;y@^hti+JBxuUdfr4H>dM)_9y&#A+eTn4e7g%a5pdGTdA6jXH zzGiS-nkb=q6y!DV}g5JB)9NWANMl&qJkqWbTQ%jEI-B0{_j9m!D{RqKv7xRAe66h=_ z7TS9hb|shq;dTo2&btv^7Wufbm1z>>ybvjA{gYIFGxqiomXT!UaNg>-I5;@k@B$9T z5DUD_a)?VM%%t2@LBu>e;#~7i6RT_3#pRs>6;Kzo8|qMiVGn5bb|Cu55L%s}{Pu2$ z6*Al(PxMRDz3vpOTSM2QQx<69UYg zVyDzpo-JTocu{-0M~+=&u<@*FZkQU$6gUm1vSp$2ebS};MiqfIpl!7Jxz&Y)*vsuF zUl+777x%H0o&&j+$vO(IJQQ-i0ycXX3njg^VsLRt7Bq_O0xEb^E$!PWB`!=+tOS7nx)UTta3e zLbV{eKTGrxL}l=!rOAl#v&uoMk}*B5oBWeIwt{qHM7s=y@L*E{tfcQcS&zgJw}eFk z{yzZ@aG%GI`x{o5(TYkEE2xt0e&8o7o|}DKTP1WAn5mk(Y+0>M4)f@7MWmtlKK*OS zsAhoj3nNN5%?qPVXZ?F0ag-499@?Sn@ZygL!jXbD=_vDFl5elae6@F;wUzk3+guw= z3?Iu_)=fT3p-I_?@c6!^bPj7%W;hBUa$GlM6J1JJ2ft60MnyRzG0Z|AqdLhqY5s4XP z<^{r%!q&>v^6Qk-Y}8F=qO9q1F(3BJV`UjKRh&A1ahOZC1E0P^2j$x2%L5H%cZhC0 zo2i|^34Idm^)NNz2I2=EBt$P3@bS0r=KvENzZ&B&@#ig$98QQ3x+vtlviHxb4x@yP z%7YLqPAQhZ+|H7jn4E3+Vu}U9DL_0d0{?b$JgP71k)rN>r~_PhwcV6EbO$1AaVUs7 zCG+{OZZ&?9*>ECG^8nUklXJ<5-(GLFyA_!jCCRfFA90Y)KiLB9IKW!?$!Yro%8uil z$*_W9Z4|0m%bL5ei!=cr)o~U9Ea1P*t9x}H|Bq{Q`%nwwC<%0gd!2^R6pNr+zix{z z9L~^Dnz^XRs|nhLbNdVm&FCC691tpnc%th4(LypWTKQ#yevN@DMUXZKhq0qZwjBo# zF_l5iLTe-(fOWo@QmSD7iQ(a3#)(Gxyl>ZjgPgtO?64mF^YKD?v956fwhOIZQf z84O6LUDmr&k8ThFb3Ki4CnD9c9{5RP#a(rZ`r-~V&PEKaCgwh91%kNot1U5LFHv1T zg?F|)$e1%0cin8AUzk2e(0Me@bzSKXk&e|{PdM#1eHimZF!;L7aUhz^Al`yOKi?Xf z^cqf}C~b*j1MLd?0H(vxY5b_s4nay=JZC~yE3l})=RQbww{4I@&}mOXeJo0~SgyRk zU^w&Be^E1uJ@_ zuOszMiZj9+kEdW4a^5!uEB|bz{kLU?^ecAQc<2y3s<+Y3Sr=NA^DCM*Qet<+c7hNI z1?i&XAU=?nw{iP6awZdm9F2C0I1sM6%MmbnjY08L#cqo5ON>gKd}fa?hU$fVgkMO+ zw2u^Y4?J!AdlOBmZIh^d;>fx+vXR@_>-=s@E#rJozL^8On~T%akHo;ej^&oO9<|H$ z)BTaGvmz7H_gLwz74!*l56_QP;X7U7tu_946k%cM!!QP(-CG^P+H6wZ^mNMweE42o zzP+J<^Odhlt$1ySfiEozEh=D`G`KryFR(%13e+i%SsFx!XvZQst*+PJoyrsJCDP*C z>v28j=YfzG`B`Dxey7e4KJN8aVokOsFTpwXh)&Db+O1>_fkz_;uB4N-+b(#`#A<{N zod0D3h;4q`qum3T^nNZ$5e=z9 zPlzX^Wcj`D`6f6>nYG;UMvIc?g8<*6n*5@l4uz}bcYM~L)*&Uwi1%>hulQ}4WmDyD zWj!<6trBU7R(+G`%rmUg`3cMJqgS(952*btt*lFaI=0cWz(w5$Xn!#H)3M&708|gs zDditz6D4udD1Sh!Q#Fwn=$nSF^2N}nC8Y5&c7uQAYP~|h7Ehh5Pl~o-$kv96|(-c(Iu*zYdXV zzrPBP9W{$pSBWK#-GMvV&+8?=>BEpV0LWmj7zQQh-2P*#s{kNm95~_PlSjb&zWuO` z?I9?}(*Q1iIPaJscCqq=u_JF0Z>UJw?NHjw!7J!fi-2stSts@K_>F)TCAN+qB#bbw z&8p*+tO_WiyR$I{mBV=vxf%Q{6emo(I>Tm{;6#nwUQqwMf1h;Lj)LYQId>x@sx(UY zY(V5hB`;gXd$$9ek^iAY^a~o-JjwGd$req8sFPd>%DVd|l2hG!SGaG<6~_W;Ib4FV zc=1PJ#77CsQWo^c=xvIIWppNT&B4w&(dhFHu^JsNcw>pMipq7gxkM1V&Y`fYdUxZsLjb}4BR0qk#^e_}EzxMsR z8G{~YLCsr33w$dF^K}21NBmokNv+4#&zljid!s^H{i)VdDhW-m3ikOr>P+TgWFq*5& zU~z_??9?nDp2syIiZ2NyiG0Ecl&L@{*&(&V48^wfeTYm9`rqmeNCfbqgherrRcF#Y zKq*I#LP>LohRzY83vT{4#!y11%Mky*Yqc+9Y%som9z=mRaJO7#=B-cBU|s!N0@S8z z&nAf3q=gOr3$70wX@u*o6zpl>mRo9!_k|qcE6HJ z>{;)ks^yB6Uw7qczYd&(A^4sk-d8b_eXd&Vi|9=Fkl!Jmv0vP9`79A54_x*G2Wp}l zgF8M@lep~t?6y3Z0(In}n@BXY!ieigk$<1=wG&T}Xv-t2e>h5(J_m!66J57YRa&d` zYUowL=i=Qy2UbF9c|PIWt3a+zBVEwTmIjMY@Xe$%Sf-`M1Gne*#;DWw1B%O>zVR8^ z=vOyu!s@k2v;s^tc<4VEO{tZ?RsxlI8oDbaAs>ja#P$GP!#Zz6{^Pna7pnNb!K5Pa z@#sSX*41-`Jd!0;qJ&BRGCm8vb}C;?xJuL}{JxQ3b{fmAFtM+uhi&=u?yz-y>awqH zYy_pLc^~KuckdJU7x>>gRfO&AKi-s_7Fm)p=E1No>=%9=b(Y7rX_nZBb~gS@VC*mq zdOQz9Sa6#UvlHJ^!LeJ=3QFRf`)j2q_}P}X{Ka^O=W5p7(xR=zXDv`HZlkm7ot8BC zl>kaM37{6#3+R^@rgz!u(lK6wQhex3AO6h8JdydBx0Q9Kf( zkUmlf2TLH%cvYREMhMu!p?G#Ry7H*$>lS}`5YVBh`yv62zNLqBdl*!Q#(s1c`;9P& zR}Sm$P#zU-2EDRpL5)MK+U+}Fq}yr)FWCLXe`RsseygnsmBKl1^U;`>+`TnbbD`HX z(8|e5kA$&8n1CBUFtE7_I(EYJX{)75mGZ|Jfvz8#s8;F8iO=O<*^1$P)*4Rn)68E7 zi$9G6M;6f+;;S+a#$xSY$3}F`s^Pd7d z<`x>6V!0vrS%XRHy2vjiO-D~G@4wz>WP1O%wh!X~1HS0IPuu%BRt9XrC|u#H%@9g&XN%0rQivTYIwQfsL0aH@RjVFW7rY2kXC7Tu{APrg5!1z zVE`lW*wpDiJk^p;v0F5iD^*v$MSrdwItZ9*eSUa4q7-!)zobR-+;=oCsQQ47)AuyI zk$a@1^*SpPQzl5m_sn`DFVZlLErQdLq8x~5-WRD5@T|rh*{vjn%6~U zS>7(>n*=|7LOjl*%HrT*iMXAudHd0l9N2fFqVGuCKoKGb)zU#v;5wvBzfblj=Oy*z zt<3N2z$ldCp`yl9h8Dj3Q*KrdWavay`_} z^kMKuey1cG$Q9achdn!TU7mH1B3$Ulx}h=s*hfp9ai__h8wIUd>IxQ)AsHWhAPt7$f(|n9&U`82eLKx%;(2Hi*YDU+j{0dc zgWo_k{LQPL#*Vzy7y*SG!6M8NdZ>;EDhZAA<-`2NijD{_oRdIs9(oK^RGqmac@~LA z4;g{e%p**`J!R~SC565ldU+4KQ!Gvax&gg2xqlT-y;)N)9e^>F-c&NI5HM`&Su#(r z;vM1!n{0OL|4V?Lm)LZls*wpt6{Z)9de(s=wz#6ed3T`VyvV4!!U6tI(~3a7_nKPQ z0Dx7)3u^p$jmcW!FxC=SY>;Y0P9|Ci#VcJuiH(Ad`$nwEbZWZm)5MC-O`|uEBm7E?ETpY6D(GMX#U%8*DjZKNLX!Ba!4$I)~1r?ka#^_L3Sq3WyM(9&m zE_w2V!l@8UenrMqEfrgH-r#3R|M_h1t;Ysl1RaE8Vi*4qdU3N@x!>{dXPLhUH|CT- zOLa2vgn!KJ6jDk+dFm2z7Jj*Srh%qYb)Br+R3VW|hQlm4r2=I!*M#)<%X{eqm**}=?0 z{*&=}U{o`meW&ZDD`n;HxMOabe%Dj1fUVgay6|Ni<-_*GVl`z-=XK(Y^Cvm~jlEE? z?p~X-cT?2)g01k+CQIO?b0B9o(44W%(#X=G&Tu79cWZxooz$69R5M*n*VX_2g=6JW zET%L%t=unnr17IQ?^S0hh1-Q6>oOmM$o)+Y>E8P(<@W#9rMir9>?PWIaBrnEw5c)B z6%CgD7|2wy_dIW^Y8+5}5Ycwfn~CX!nPPZ?e3r z2)u}plq24Lk<{1OJ~PAARr5>v#}c(5)=PfgaV=(Yk3>`kLqKhMAMIW5@D!Ui$L?qY?-UKW3BzG$-9>W`wBr8qKEhh~fUf-b`rs+ZJkZQAJvR$EdO zh5iADuBk6$%-;Eh>YE-LVQ*$04;Bz8iozF6GjWi2`xDe~p`8>c1-XlYUvYvLDNbNe zw9*|viC)HTS*|4kY#GZlnBF|2&#F&x%Rh^|eNf*sp14R+Y{D4lev>(PiIk)gouX;* z-0O~eq6$+L{cUhYD-+W@(j9nO`!x>sZZ2bdolnhG?AHeit=xx!rRRFQ0usc!7$KZu zKKKSQt@sYJczVgA%aAl23B41r_Od?!2MykMY|)W>D1+43;T=R8Oe!68mtEEw;Rgd( z?Nnm0sXR$~oq224Zyt{C#DFcBm>DA&)uaT%m5KYxDXLD^(0_;Z+{(bUt>n{MbU-fR zmzTGDu`i{wsFqb=o~Q@^(Fq+3L7w?;r>1dI8e{{z`zklHgUP4!NBusC%qTVKu3sH52F*nKw67z^`!ub_saimtVPY@0S}B3 zuK3GCbKH^x(kM6LixRK7dQ{R=qTypMXkF!9z{=_{b_bsI;z|uQ{MD$Fh1F}Zi0f9? zQsT|2h-;O`Y0PAX1~Yjc#ikDoDe12r9c&c}lyLEn{tdp$yflN5I7D0I;sd~QBpFC8 zXq%@!%(9fEVb^kf!l6zYMi&)BBC)4q^R-b-Y1fdL?65FNnq}NsB#b5yRvT8O%nUt; ztJ}t`+6!jDK5rw(qD|l=L5y#4_@~viB01g;0=y8uM`C(EgWc`eRhNA}55%L zci26%QeYWJH=e@?k8g8+F9owMqGVvdG@h*;yS~FSsPBlB5Onu^X@_;+?ulby)o~R- zxQIL`d#uhz9}!D_U4;I4{5US@k-!#-Zs4_wG+q`F9>nvy;ow3YEy6eGWb1zUiuwbp%_{he-78C=w%`9oHUY9Z?A$~7gqf%Kp`=|d z4|XSU?_6YnMSaQ~Ya>k#R)2=wUyiWsGHc;-D%;FyaL*Z1jd6vyyv)@)jG zCJ_PGdcxxDh}`LxKtrqQXLpJQaan0+fGIaF_MX{f;DSY5)>5otv}x7 zcG^zM#|clG)n6&TbJWTyCm!aQ8>w%U1`%F*A!BQlLDQ-fV_ zg>2uUzNQ8)tf!CmL0Yr_UcYrb7?3?_UD3G^P^Ty{1%NNMAK92(GiW*Lguiw0tss-k zo<^;Yo9BkK>GzI~=%R-GZ_Zurbivl@6JMpD6=q*P6{N3}&1mFMrj4acOgdh&nr#%1 zEUjR3OOeM{wi8J!X!>+~qECxB8(t@9%%dOQwC`CuXnHa8gZ03L>TRyVCybAKdhF6g zW1J(PZxORMLGsP&-8<9I5zq|6leF(eVM+r0`3`R`KCQ8)k^gMAB^?w!B1OUFf=0$| zIbFpj4l_jm^?{3G_5*Ki7fuH{IHM*~Wz_(w3cKi(6bG7--qfn%Pq+>d3w6-^j)_`r zlv-$K8@>p@kgG2w^X?&to?;%QFIsXoo%M{x=bQQGp24W{4gI);9Ixw{=fXVK4tEe;r`%qXsSIiODDb zUmY9nc{MKb#VoL5-=4jUP&0o1&P@>KM{S(naVKPh${y-QQE@w>r9OwP5Qp|tN|7R$ zFyJ)L`mqxyj=-J6DM+>zA?Kd*N_x3SDhz!W4Pe1V=T~jcq-e^!d0$varLOyJP`aKP z!4w8Jy1ZPT_ozUdEWEcq(lWLoo-d5lTh(KGPzO`uTrVQ)U(TGYO>6pI0T1_?@!(Ov zY8Iv5_t_FYjz4Np#dr&90eRkjbe1Kctiv@bt!WUxYnX@PH20-UV@a|N?>KWGTVN^t zF1kAKbQ%jPs$v}8i}=y%??T`M}xjD-z(${oT4m$=Uagq#HE@WhXw5|l9)kT zvI(qkDd>g4$P5K3=eCM0-c4f(y|es#<^QWbOsLU{Rx#04N&gf*ga(9x#jV#y(ffmB z$8PLv@`x#IAy~PZk!XzeL%C>81b3kKhy9pf+(EojSUFgt@Mp674v0iI83A3Pt@H?z zc^H;rL~)9A<5J(nniob@{jp~lOMxHr4pn*A=2XK|b*O?$ZZZ)2bbKZc-(Jz+VyV-~ zSvf3>t2M)G9JF+ya?X8w>_y1|H|~A6Rm2U=bq(tV`tnr#aAPnQ#N@)&ExA>mp z-tOViCJAL*UDT)IqHJPqlLM4OAy-xY|Cl<*=*Ze`Ygb&cZCf4Nwr$(C+3DD}*>T57 zM;&!+bnJBOub%fk&-u>Szv^F&8oTzs*PPd!>svrk+#+*gr%)%`yupnQGrsDnzkG** zSR#TClUQYhobAQhjPm>EV3iy~0gM$+aW8r)?X}7E7V7edp1^%OId<2D>I$US+i{TQ zBrN?;Xq9z4XQXrDil|Pfx^^&;_IH#P1|j|GM8Rc*{4~Y){%5Ih)89tRt1o7=o!%Z_ zX-(AJl+EDV&`uaPB6D@9cLa>z?hr_RhIoXXs2xGSKn|dn^}JGj=jm8xu^$tt&H(mu zSCj0C5aN*fLvT!kkSvKnhUJ;;4n;Czq;B5nfZI`zC9x2Fq7nhXc_I;90C>>(Hqc)A zDvn676K;rohqv-D@MgVrsiG!b7-6XL`~)QtJ4pZhxGo79VVUUHeX6H;Candz;b1FP z^_flngMOs(R7I5i^@hgrZNTd>ub*K%I+=bx#vv)6 znDftZC~Agbv~)N<98Znh&QF%RFth-t-2s}GP&pEQ79)u7#)$kg-B0J+_XpdX|Iu{{ zo1{QSIsPl|T|u9Uc(7^09s!3&^2qU>?j$ju0t9nBtFUPd-Xle6Wsy3DBL`mw>hfsZ zMutr|#6pX5CS5AWLsWaMXOH-?sczD6YUH1Ms#>rk5>ERnG+g0v+7aY=tzgs2dyN

    K(A?h_Os&;e>nGlZd1E zj^40U1QU+kZvn($cq{U%ru4i!{$S#<0`pH8UGmCb@}3uom+-)Bo}a!{seEUTfV1}p zB&`U=%hMJ@>a{%>=ygiHPI3H2^;E@Zz-XGZ=!5QG6W>Ed`J z@~)+@LNcp1T*HUvz&PvwwDYpanWi+i`FL*KlK{ZtSZOM;41h{7h7tsO0}v|rGA3cN zrYxdFHQnt3qNh=55LYvTgif^x<&#ia*C$8s*%QHY9CLz^AtygCL9eITN^(FFaT#HD z9s+!$P<`?jhOizKI82i9_4eT!CWTc%seoxYz@T1fM?8&+#^L!Hm~huNil+AyWmAfn9e z{n1c3gah*CNQy0FzEEOTO9luT(Df~hJqg88Io_<;HMVF)7)>0V$<1Rmp-Vp|B>7*1J#RFzcU6S;~r+}~8yB2GkN zmUvW~)jSYgVXU(sN)S2D_Ehsq!i_1O6mf;choL0}Qm&)xr8d)PsH0U8KNfT^^2GRDM+B0J0sFdR+ohx-&cp382`%b+my0%{s&4;k2#!!lUv@ z4h<{1{`Y=3(#~c}=L<81pg^NG+TEr@?7+q?jAwZsjR49Qkx4;jR#nh2p&~Km5*@ut zgC6#09^aHD|18QE$ak7Lv^G8{pe`2N`QU`zyEG+8&HZ8JWhJ}VRMpuj?71h zlm%f^3(`tS^ZmwSPT^HBlxgA4Kz(~^A^0@L)qj_0_#@bsD-2tE6uF0PD+KmC(81Jv z1k)&87uhoH(!-c=K7Xp+?dH$b;irX>MDTmsnekDH^s9TRtqXzbu~%_^m#b*j{q}&y z$+!`<7V+OKSmeXZu&og%j~0_aXb0|g?n{M*Mj?Uki>@nSkRQ`&HTH=f;~i*T_gX#r zdbATIYx$)nQR9O#Dy33A_uz<*?N?iCm$bm;jW+M#B>7hv7J3iyO#A?&<{PZ(XR9uC z12aTBX!r!#G~b>^c7lerYU)t|$Y#bc#AuR4Bvxa&K(T^Y{ZY`N;ol1}1|(2&QrLd* z2!bQV18h0jH)K@J(kQ^&iUNmHxg+q$&m)}N-7H>smXL^JGG$$(p^RJ76*iZH^v`$+ zF&!aUh3W0Cg;LD`fSEFpXET@)^WYU(a99!0dbjcdQKWb*~(~oZB<*SPmc73{7JKs{K9ui^sFWUJ=|a<8Mu*p2it5IbxOf!k8;## z-3SgYjta_x^l0~uwFeBiWgjQ(RdyQBu8hDHv4+L9)cj1KB^*v7)NlHJ*&nsRy?#yo zLJBD=^D8upu+RF*S)&jkL8uRRZ3uWpTRp^KcJLI~U_P7J|d4=a6H=2it% zMC@DuAe+P>7=}nzq5$D6Z55~L)e1+3D86@Y=-;v#E& zACI(4KtqPKOQunY%&+)87`bXL8%x_D$=@dDouDTO%FaK7(d-% zS?|YAY*&g2)-|pmR^h(X!3YI;x4mt9VS}Yo+H4d{W3G#}`GU{b<+PMZq7*)ayhT-G za;TT~dyfUun~zAk-N#e&b*?sG;If8zc#{z9Lo7HYVkGo(s5s*1Y~D8S)Y5KWDocuL zgw62&>E!456pv5LUdAkVaCe!g(yaNJL%+xxeTE?Hs^EG7?OFw~`}#a{-A5h_hw4a2 zb6Q;4y#Gh_B5j(|dKQ5U%sl6i?0cjvSXmsN)Oi|vbK_e4C4uP>)c!KJL84X)*X7@p zksjlWZ?{5s|En9V5Tnip#D)kU{Uy0}b{DEfKI{k=|oJl25(>R!gS7E?9$zytTAJTPphRp#^*Mb5HEz0#!Yq5iXzmGgV( z%SSzs_4Uuf6Nm#r1evJ5xP~JR77sPeVIWuRnH9Ky-m*ACP-1S<|O6$Hoymnwar;xLHlaENyNBJVj`5rmb5;0oU2>o`JG zd##*l8H&`{>hO->JCEfy5OU>JzxV(R{&mbtbj4L-=clnQJ*5mrw)?-QrJ_LFR+QTG z!ABM)h_Q0U0CaWN$j&w3+aoSO6>#9}j^17D@$%kQ6dwH}T)kSP*@w#>+K?qW%t9<0 zOJV=c*`chs8r@ewx6EbZzWfN95}4Uaks(=qld)}J0F-9<=YLO){ZfU!{|wtNlD~wu zq>P!#j7ya%ODbWCF|=#gah+fZB?!@-wn2bdwEz6#@RgrpJSt$%H?r$Sp2+qz26niK z+0&&Vzg>SgjQ?@+n_rhD*`Q?UcXkU+Lo+RyVJ*B?0N#`+NqaTR!W~v2(Wy3pe`KlH zdIucpa3cXQanSa2@$-~i`4PyDS(JD$DRO%XHE9qr#$M?u>TSOFusjJ}&9Y`vDxqGG z32APSVHfaa;Om~P{i8C(8TkHKS6_F~em)rhXBvaw59NUn@ZMs?*!&qIwD0i%v=>#* zkS0K}g_Id1&PAT4kF5a6(eNX5b@YT3BxYvrS^UN>e%CO%`#rO+&HBr*#Zj@0_GWds z2cWf;LPo>^E4=6fuB+@1l{q#0{kVJCe1&KPgEQp=V;*A(qrdet?mJ$og6BiPB`!Nz zbQvm=_-SNeKd8LuTq_rVU>e#iEwO9qwa-Wxp9+x4^?n@!ozY3W$@&9>88KwBXm-W) zVeHMn33uY*_p?`B%^_q{MI7c>KB$$z9sEV%dTFP!I^G=TdAGL0_$~9u<(wtkWXH@ePBL9RVUU z0Zt+zn}gjC_fj|{wcLTN&PTfDy=(Eka9AIYo~Bi* z<{2SmaXHY#z(i=~Pi$*sAGS=yOYSb1E8iGIuAMaC`~n3r8O98|dv1)e)+HLLvg*sR zuwp_i{3Vc&IMI~bU(M#I@=56Re-I9WXw?2wf>GQtmuLp%$3nsBU}p2~PN&-T09 zo`RQXKQsK!WEC-SWz!3Dy#{Vu>q(#Yy4qa5X$!G<5!3j#9bRM4Q6Cv~WT;z;^z z9wkYiXyXrObescaK zYG*e~&+n~F#rD9|QL*aswvYwh(@XQm-Km->N=h9cidaA6R+>k#Hbe3~P9}e2m=meU z9Eb@CC$E;i29#$^sZ^|@DSd5!H@D3}n>YyiGs;2AKjF*s?V;`?x`clxwTGw%H8OU9 z9f2CH21Yz+#N4M#NUA5d#WYy`B(G4UL>Sof-;i4Jsiu)?iBIFQbcs9e3a8@?xQD<& zgQEvJv0g>5Qe7y^(2`KCN+^T)>;9QB1hNPUzUPabemiqP=dVWi1ul>~#yd~wXO&De zzmba&Wr%u}FKAnYidIEj^@;1Nw3x{EI1q_oaGt`9F3v1Ulw9$nR8mx3VG*J%14)Nn zK7b?Daliprv|j~n4orQm-65%^DpF;Y?^`$5IASNi;t+U*>JKJ0W`;q=IAl+~DHaCldu-A?6eXDTD0q%bb)D$S91qozt_Jwz<5;IOV zzxE1^EKP$9vDJLV?fd8)zD(1HA6#+gTY&l>+V89AM5oqPF?Q%h;Eh&e?fcA}$8{SK zcDWo8@Fb6z(4qYGDB^MJL74wFzu!?nah*+Mkw+(=L@8ks3`8<2_^d8CfP=hTiMMnL zY@B<41%<+h39NVukt%k|qE|hRc{qf+W@9K6yV>9M{bvqX!#dgugCtEK`LA%|_Nke! z=6{pSvC%|9_u+4iyTpD|+M(}W5e)j${O`Nuv$H^euF5ZfHi3&an}ml4@{zHx(>y79&c#*r5Y&&5+lbNRJnOW9U%mVogNRdSY5 zcN>S;;9M^_kJvl0vRarGxY^iH385;<;CC_ILC1?(Ia7t0Y#C#`dlaURpm~vf_%0+7 z??N~(DOqc1I=RkZKZw)t;H5;(8o74uA;?AX;ButwKnpUgZY+@f9w9(W1Z}eNru7#U zxCKlU66IDiYpu&}Ky8MnC@{PF`7@>`H6#)03VR)Z_WTDi<+UT?h0nGIP{z)?N{nM_ z%DlY@wjv#dbs&g0v^aq&rBB=-P^sESt!+5*o(D}2ff!tPF2e7m1oIdW9fn{;7@!A3 zzCK@@_aL7?sX-3WDkVrwhbI3i<{Xi@U96B&xOw)7!S;ED7zf}$=8-ZUv)Iy;AagEX zy&vo{HApdQOY#K)SnATFn<_PUpU>~BzVl)m&kgQPug4+TmW{--{e>n_Di9h}cu;2& z)hlftuR&?2Dm{e{1h>Mm95pI;!etRx0+QiUe+BYkeA2cd!V@ATwuJ0JQ`QEzCIs|J zGk5-zcKzRToSK=Vp3bdlwMq>6pOdGUqQYBmbawJ{!=Wq5rH9Nzu(@&%YS6GjnanWI zSb4i zTnEUiGGh3xc9I39NeaxK+AaTR;$MbjCKZ8|&s?M*@6D*Gay&7b_pzH z6mxH3bl$#_*-NCXs*CgP)npf;{QiE3M>FGwca&Z!=T`ZYbm;F327dzzT#fA-nlZgTF=J-`1S` zx?LCV)$)I_CGYN2|6QO02rz|7i_kOh;;DKfeSQtp@3X#MP*qmuqDu8m%5 zb$ZEEGU(7(f;FOGl`lPWM+S00itk~gWeb^Ldx00-PLNxgWDJNZD5rkWI|wYfFW%LQ zJ{#1^2rxzv5T%Dk4>~chX*;1~0`65G(*pGdqHca0y|3;tNAz=HF-bI-gX##FVJV?= zUviZQKNhc+b&)^Mgbr~Ou(>24SpGOpVn`Y1po*b-nb4%2#okVx z9aK+ONClmP?CQtRRe2w}nU~j^UM97x?>(FN+z=&Ka!ngxE_e&tJ`z)x8a7)d=niy-ECr~D=Y4x@~OaI4Q!@zL|bHbmL zY)~vxYB&B!B$qkW6{@rbe7 zU;oS{b{PuVWz{FCt4Twa2JgdzCwhAGX|>h=d~gaj10dpI1GFlcIZ-14IC;Fan?aBF zKX2;ZEB=`gSJWU^yhvZ!>XZbdRiS){{qBvRXSj?piVd|*;iI|+<*XPu??&ErmQpQTC`p`)sD zhb7cdJF=$*L?-YOPC9Z0x;(2eYnn(sbWvS<^8kreAFs*)A#bfTrhz*s<1g2 z8C@$_2WL37I5CRrleRfBbShF0#k5A614r3tEiNYK@r{`e0pvnN*Jz|yBHn(LN;x-- z=eRO4&rT|}t3pUU1-hQwBF{?!!Oim@Y`x3qSEW|B_KSl`4Z8IUQaN)5-?S@#-BUFm^c2Z13dJYL(|D zD?uG&r3<_I^esjbMePx1ys{5F)zrU{klFZgRKgfw%ao;VuK0<-8O5*jkfU9UpY=2L z(^`yZ+2cd;h>Bw4ohHwDr+#;pe~ey)g7H8yzM<-)8h<5?PU0=DtCIcw2a@a5U7T-y zhBM8Hs~tw22v@iKsz3WA(7*H|Ptv{Q@IfjM1ZYlw+VwHF2mVEAM`-MiXu6rSRv>4K|++XtcGzHBvkpr;iHD9UBjrYE$ z*!W*9`JR(54TzTOMlQ5iUflPrN83&(htQ}^8 zb|#lgsavTp02!+-ew)vHMYUps@HCN&2qfUK>8!HRHKhwM(jtH07qx;>v-Lr;+zK|T z_rZpRWFdW$20|%suvUMo6VbQ}*JSh4?Q1haVt2p|;L-T>k*xWL4;Tl}$p>r)!8#w#qD# zi&|(7NgD7WM||}HyjZwxI3f0N_eeW|;Py-|aJW@nTnK5Wk%GMzffe z8>twMtaYbBqbLTJmH>^Dz{9+prU-wz+-^@vkyMfw2H;#L9nw><{S}h_2u=b`EKTnK z50Zz&Z%zi}loyAb*2+}@SgO{d+nm`O$X-JYG24HLCIqs!K-8v$BcFTTxziT{qGaGDaZFP{4es)&GJ`Jr0}iM z49GS=i^sNP=ikl)KtF$_5+u&P_M1!0Qb1ibFt&d`W1pvXs6vu~Wl{qVj(x3Bb23-g zaT%)Jj?%w`1$hOYJSsmgiNX0Bu4dIG~^etkQ3xs3NFA{7+y{bF9sp8>9IIHOcp-O zVnGT;t1H?%_yrRNPWLuVui)0-$^;yrBNOE#NRYpi|7u_$7#&_v*zmyV|A1=Tvt%g! zMb1Y>OhA-el2aCfKGJr{dZDz5)oi?^6y87LNpel6h?Sz3r+gwmD^tM_V7M$h&<<3r z1XAh=T;k3u2aF>9`g1=P>=Nv-mj?}AM7%OMN;V>MNT7Q?cU@r>+&NTX9*v}Z5P6*Q z;j{u}k>HS!VV%VkzwQeC*h*@5Pqg*LpF9|Yk^NGmV8CqmQ?jP>($KAP^-)#mV#215 zv|wDw>Qe&HPKUJQpyT=Vg{@VT%wjc1ffV`oZqXG`d%;%L$)y3;%Js%j#6j_JtZ2~B zQpEBE8&Rn4U<0FW0c-1MsfKhkhfUi5iaw!ppkGVd(GbXt z)$BQGI*ZK3i9Xq2R_^y#0WJIWh~(zRu5>bdbL8Us_^_|JD!^|UL+oYH49KKVTYY;- z@~Ah~Y3;N#1w-z{yg>x3YM4~_gXp^|nh zK9e_)vp?WahE+hGwjs`SvFh(t>uZis8>+*oh71hJ;$&r%Ps+?Kv9A-CZ?pHx_;zLk zu61`^qUs`nLB)W1M*dk57Gp4SZ-3#K`FnJW`r2U!w)Bi&OqX#nz~b(GT-ADpD??nm z#=loMAJaSGeV+Dj=ftl5TvNQw;!vAm`>cqcZ}q@}?Y4v7#z0XZqi3J%O@D3b(DT zrZ!dOPuAsZ0qeSI>kjOcymzPEExh@686KC%>*!yl4UV|(kZaW-0m!6rqAXDQFeq1~ zaf!nr4&sisHq~A$!-d{(jgU4WWLT;cuR!z?j8y`5FsuM&``2GLeM+p#Xcq9m8-NnM zcrmze2zzp&BwwNIM51SNBb>*$>h&4bEIVCY8s@=8cPrZQmb^mbA}1vrDO@uZVl*ff zgiC^46@C&Jt;)U{mi9e1bTo>qfs^uL0rjGk9mkP1#2q@O$XX&TX;%5cm|5uMfr1uC z-C9)(5~_;v_b=f2vuE)e^M4Q%R4|TsW#!0@Z>smyUY4D`RuZ@a@gh`IuW}p&&BD*5 z<{EfiYM<#>OLB;>;V^t_Ea=tCZ~jU!J7?{xUrdEUaN?%CCuZB~wV$aU<7I-zTYHG_ zG4X5>G@us10-x3{$}$xp5DIgtR?t?Riu(tz#lwYlTotml{kbALd~;E3I<4_Hh5T>t zqvq~{w$&h&%gs?x>{=N$_R$$AJ?fFK!N$~=Z&Y={KB}|4UbZF z7pimLOo(%)No7xm7}0huxuh2FP`aG>E<&ol(&^}wyR}>%MmX=+bzY2T%rTWU!Wm;jrC{>E-nFA zkr=9!W$Nk=pB~d++=2iN;m#3xe^C~hj078({*tCLyEJIi&>KNVSiaYcjn!6>5B};b zCVhgRNKZmb2Fh7iWi!r1R+A-*rG`z|hpB!?*=T>j z2aiF5Htmf#1G=7z#Tdygr%~wr%IGE9|9<3s_3||cv#X^*&I`GG%JuO8sZE4#>ja&hjDmVb^@h7d)L03ANt`zLL4k$9Ri?>A8)_JkH zqYkBtXjp;ACo_lz+-J$mC?d7+1@)1CR2o569w_VPF}J$-Qm-!#O&RIiaPW&&$O+MM z*dsyB$ZefDE8JEOQT!DdInncsJbvywbXaC{zp*x)9#m33gb+_Ph#Mk zPSBM-hoJ0gWjm3FTrsLiMr8xE=9&%;=6fJy?HF;tv5Jz!E+zst7kvlhn^J!G8tYlu z29?4)C9qmQ%KrnvbUx!}Fx?Rp|8HbfiSVBqpepinqiw0e1XL0kamH`3>b0PnBg5nR zr`iluDK#j(_-^ufym%|YyvsE&o3g>u2-@l&0VA>yWG}LWQMAsrL|OWfna6&f-@zb5 zz6GPfBkHUDLggu}8$)3KL4)PJnd7XVGuoTAK-8?SX+xp&M=% zyt1rv^os>(qOXs#SF!I#AQk$z3qXMug9ZtbUMGzW5fu?_gNx+L_p~mU zV6of8awIZ1EcePfrt~hbiPao&w5W65^V6q*cH=ktXVB0`pp3fHMa>)*4}+STn-Gcd zHN^D-U5|@Tt$ljgFjy6NhwXG(ey+rE%8azBNcnqrIVzoha5e&ZZH}G|B(?n;r%jL* z@8__Pr#m{)FPF`-V>bENI`l>12;pzB{nMl2QOkJI@VH2eLh3DG+CB`A(9$7iTJ~Q? z5CI-QZT3}NI;(5*#XRzpPyJRe{9A4VccZQy+rf!Aq?jq0AR#S~3yTIZ$moK%*5PW>5PE$)%J zt{N2hRnKY|BN01q$3x=>`v?k$*4QLOr7pX;|f9$S* zE)pEFer5d*X@V<*9MYN%;1JSi?~2BRS>5>->^Ovd+`zfVgp;H`vD2gSWd*{}#fdbQ z4GfgqDMfTs!A6#i_auLkQm;SBXc@uM(kTN0rE*bxTIgzQ17`=}L=_GNn39xwXpx}3 z&zbAz<}+Io#1G%CFNhxPRUS(7JFww8r_Ac?eStKi3TWfjCl!>3{X@o>#aM2J^sZ%i zEKEfRa;Gw+{`hb z$m13zQ6A`x_vIKWnafj8f&Uy$CL)C%TLNAS_ufgplM53@9iu+-hSR@%{pzym{;hO* zu(i!ov(p!v@0=A#!T9=pVY5JJIDpxO0(w-gY(t*dvKm8&=Nm$AwsH(J%A@y}G0YC^ z66G8^jR#OtWX)MHj2a=mF(}AiuN*ONk50zOt&YI)X%#0)v)#HNw_-QU0gZIPAeO*% zC*orBkr^}d2>=>ei0|Z2g6>fi-8Op0BM*oI#iDeJt6uIU235LkGt&a;!zp86#Kv9m_)FsLmD*l4M|B3{R4f5GmydD4Ys)*^(7g%S0rm;$J?CQ0*Mb%y z3@5y;4nTbXonDZhEpinu#b_iq6UODn-~iYF8Ga#W#T79UEmN(T@6<<}{7n(71%>+& zqPF(ml=-f1$f)o6sDJkOfU2@$3bm~o@Sfty}qg?Q?tjL)tjE*V=z9)2C{LoB`)RNsZud?gd71;?r zxo8|SjXtdTpsB9I{r0@(F!nC=uMWsw46M!iF>vrJd0ktw)qX6_phJC_)Fb`}{rFg! z_BGkBeiF{pB#!1$i4)|5zOFrS!k2aqRv3(<$^aaYPxQE%YT{t=t#@vdv#)Pa49iI>1ara=H#ahbKbIEgy#5Sq_3Zm7Uks$4Whg4gfga)!cm;lii6C@( z`!QcgmMJVTIXKAt^+<7WjyV8QzZI2WSizST6PpgFcl9;|ZG_;1x$-vZNY5LH^XC)| zs6{TT%<}D}BS~&R!wkb^ZxrY!7bz`Kg|~t-892~Ef5~km<@xTL*wxM=I)?AT5AD)- zbhj7we{hmP8TWYbkhG>p*G~Q6lEneNaiJtrO}&ZyGiKW4;l5Sy=Tos_RUyH>TI}SD zXhds&0P}(8D7!>Qgs0fo$72a~@{RlGCh9E`#${XPfaI;gB;D>!3UQIXq%9Oh!M9an zKWs2x9t3XZpzKdYP(7xbI}qWT)yRlzPskH+@r_@#s;%t5k6$d(u}zS_>bhdvGPZ zAq^_;2UJ%ptOSjW>1qg=$ln(P#L$s1_Va_4_^r53ySsK3k!*T+!DH@8oS!caV)J* zpLa=ZrtE_P7-jTmfXEU0QDq%4M(>~=X#*%p;2Eh0z3`Xwo~&enn_czx;{Y%p*}x{; zeph@uCkB0)dX=_NAhb&GUQ*bJ)Ivx0aRa^uve-bV001sadj>jL->>m=M5-_!)i@NN zYzm-&Pz?Sy$7m;iL1MNi$t7loVM=7HgbBWb^+V6T?KZfl(##<(JCV9>fo-SThdY99 z*h@V(+Dk8KAq!gK0;8Lz{JA1#KO~kqw&q+y-cI+{uL3V4G%rXj3nBP(3Zy7?#=xFZ zfKdYOf5225@?$T;U=%7poO<}CCM9XZC#LWbEh&1cvucJbz3bKgBeK8R(@1$>#H5)D z^?Fs();DLU1dBzReyg@aH{~Mb+4+cZ6CDEg(6HAh@oJiZ5O=EIVCr5LE7fcq5Jn1y z10)+(NLHK7O+ynY>mBgF{D+(Y*>AS6B$Pwoi5J$hqF>BDw@M{1jvg&LortDcHAeKS zF1$I-%#*I{USL3<|EF7vWjX#r^s-_c16bx$Q+ z9$JJ0zSlf*D+fu|k9e#q)#J|)w2Vog*Q8mcWSCIL;k~{tTWC)!*ke_viwDFAl%@Us zaqwp{)oP*AWKqU56d%+#;+&FAQCFg?-Ro5tc=hwGbLDZ&hO`DNE;=lN*oW|$F-(7d z9tGT*1yphwd67}Mk0mRRGf)SG2aXe96uXN2`}+RX(##O?qvc;#2K2Js_dp;TxkunA zo1YXqu{rf;F6jBCKjHlPycg2SNq}eqfri0t8n7`)68QbAonzR1#XHATt#79k+fL72 ziYa-X@Xs^uA9ahW#uwU#VgLeqde7^Y%fa=kJY5=?O&@P3t!sGCw?5FK`d_Uv`MDGL}2J->Boc@$+v4MXYt@4NX2S; zw5ia}BH=PvAoG+b(f>Vj9bE!W|0)oa*Xz_v5(`zdyHVZ6yRZYe#c;_ zaRs$rI3a088KBz5_R!oFizBotABjm|c=xB%#oz%m>Jq!5$Y>Tm5lU3uiU>ANqFKDo z^JE6!;P-2nCSCQn^{U-c@kbz5Z=Dx%sO??`GKRajm<&lH#tCROsZWkBMFOs{fF7-L9SGMji=n=5l} zn|j!nb%pypk-)vEzxQZK52!jKvfMHxSJg{WPG@iRcNv1PI4k+rKy1HZ-Rf~_>0 z{UDagA*X1rhzM2_L-t6<4=D|Dgi9)!HsZ&t%W5dWiT zgc!&F)9CO==YG3NMGEi*S0N~;5)%c=8=wL!AwE`9sW#^hg#&>jOj;p~#qd~9SUbAZ zA*Mm{WmQAx$6_sWlSxr9#0J?{Hlq{O+Cb9uKsB81aSa+)6)rz0*ymH~ISdxt(0Pc67dbY+NEV(+5 zu>+R}9e`d!7l#V^^ZJx+c4+RSr2(WFt6^D>-*ZM;d2sL=i>=;L>g)m|99%B^n88Yr zh_SE?Bndvp21GE=q^p1^-3<$_C8e=LQj9 zR#Sk#>Kn8qD4Y*w(dWCQ%(Fkb0#%8*H0VY*e~RlGMC~c$WMW-bGyBHebxZ;45n^0= zwz+!>4o>6Lo!a1>Y^z&bdN__N14fBo1;G)j_Y#^Px?Rcdxa@qQ%2iIjZMdR`P`KICce^Q~1pXB{L*CX>8YXXf5@@!nY z$aZC(*~Xsxows!2=RmFqAr{wY|1vVqHq@W$MwC*v3>YWeL>FAk()@|CjhdIFkJMvc zp5L%8LzN-55gcg)j%u)^Lx+g6FVI&f-*f*MQz6!WKR9c zDNxb1gM#=qD`;zmIOMTmrjY|$g;(V4d(Y|R&7;L6W3B#^`VUkZ9b%cV^^P}*#mjx6 zvNge&p_1*Eht20bBCO5MR@f-#9;=Bu#N5OpeRZJ|YB5{>gPAHx^B!MOr^k?KLJFCB zgGgV}o&s_PR4pa7pNl-aE66V=G(~Pgqgi(?-7N@a&+Dl0;$JpR13aN+WAL?Uk+|*_ z_g=>qrH}*{E!OQp6&~fZ-?XdwNe!RiL?O!?^Dd$&;K8m(V0>gI==A2%M0hFCubA_)0FrnCV5pRSXVnE|ci>ZZFy8^b7x;ZEp zlryKX2#vCd#t4#dYh8F#d?<=x7B%&|XQ$cv?t;CzrhF1XGc{fjM4kRa5CX-1U8`%C zAmcIyZf10RzST)L1muJT4^rtc4KVd`pH0?~K!Zsdj>SBH#G8AC`?dQbNw<2K(7`hhjPy|B zq6#4J^awq#S>`T(ZeoLav-&EWTL6l3fn|-TCJ*)=g6Lo!^1zJ?J9}FUOhcsTtQGb7 zePqePTesEw%!mvOO%+Lq>fK zzW;NN+&NJySW?X`i3g1TpUBeK+00j+^K3Zbh{8w%49zXGK&_gt(LiLKw6}(8^P29v zFrtT}uJ9yDtRbKeJe`BHO)%9fh#z%hr&N3~tF9frCBO<3P>T8eE)xc+iekJ1Xx4~~ zu6-lCzY|f_vg#l;g3zoh{RlI_nxNk=q^C;7y}{z}h{RR?j0*mz`sYOwPzHh1x&oe2QVo{WB*;2|I-(w%YWFW2@ty5p38!zg^f>KV(S2%I= z79&?X&|^6P-STR#qA^&!_3xMUz_h)cng{68lH{*4QYn|@zQOKJODl1wrE^6&f4)#ET>YxI-XRNkyUbX@x!YUw8HK$ zMiOD-HAjstD>0!MpCkgP1$w6msYG}5K>ATKk!>0`tjPcYRWcS6`i|-7r{IWm15hY6 zh8upVvjRdjk>^yp=)M&`_!i4>5h}g+XF`HIhF^`1I#RVlOa2kuUgyT$D z$qQm#YYdwpRT6%5h9y#*Z!1m+~S?_V~JXMph5Sn@0`7h$Vr3?yk6MT^^i~?7x}hGOn9dP+Q<+338_Pa_61+l;7P@1 z6BRnQ4gUsuo%M-F7wVRN;F+trV!49rE6;rRb)hO%EuL%_P)m41>t(asnNHL0b65WS z!`=!??L>*v2XMUb0Fx8fclu#)H~!DiH$Vgu=n)^-&ijl?;sI(ZV9luW_40-aAjmH7 zuXXn8TRwxGw#673kg^x#e`MTCCh?tRxj#Otz;6;Lc!?S3F=!OE+_Om=f;w)R24SJ- z%k^a3TiELeX%Fayq3kUHtC`iHKB*~SXd*hvR2vYJR&<=R(7>&SNuCxC3q+DEP=W&* zXsn8VL6a01I|P$D}#AEDj1pY=ro1V15a{bajm5RW|z4yV+j{lbjc&QmUJA6%3dsMT5N%#*}`* z^ac3?G41!ApNr6-eSyWcR;wC)uG6j%7dFEs-jU7ycnUD{+<;({Z}3YFm1RqOXJ8U_ zxvQ9#gb;2#S`^>KQRAADZ9<3gSXk{-N&JhlStMdxmjmZVr8xteIU9N3LI2kQ%#h$_ zIx)z7%k!rB{P7k6RC?xz^RWa{$MZOYx-6ez1z5*YpiN~%?xQI-M0HdCm(~K_a#zY` zBqRS$e6@cGp~s)q^!xPl435$SPlZ0}sRR&cXU!&>NB)CB05xes3BTRMeb;Ahm< zy-@a(N~3cUNlSV|>MII6D7!N3nb43EfcQ&7C#KMfh3}U?5Ih;hRo6z!YX7H#Ka1Mp z{R{bppf=}%t%R$v?MRN*gU5EC_A#iMaXfo--{3$Mp;Lc|<)1{3>({Qz@b`GD?zvt} zM{v8o8kTOORMp;;`#sukWnG4#p1@dT!cE%Y)Rw*g_GRdFk{^YdP^1xW**`LiRHtDa zVNqfO9JZ`8!ajHY%}REImgi-y4%P{FkPZ=Kk_-|Cn!%v%XLmRe8(77bE{Iot+rwLu z&wN0l%_IGoorM5L!@-2BRw(o2{rG5YKCbgX0uQ_T@?{X{Lm1WO;q>WRrbqspgf7D@ zFo*1~D*EGAYmK<^nn^LLF_(YuCTbSW%b&mm2i_H0pH=Y~&B9^m55w=KDZADw9J9Y) z@2rPZ2F7uqA^FU9z73E!k^$LvEdF`8;E*b|ekBpjAUhHum_#8eY?G`E&qV`6Yt(0` zR`PBvp}m<2Y?X$nC5(7HjN2iwt(Qlr|FRP+9d7uuaVRoTBgPTl!0yVhbt3P^oSH{n z9G560ZplPzSm(34PTj!eM$|rd4PlSKLxO%6XMhC73nc>s~=b7%&JXw=tIn3RlX*!B#E*8T`i z&$=RiBE&fuQ?wWgndfi1cm|D2aTZy_-%beAFOz*VY(H2;hLBcWUkZ`A-nzU^d`8NT zd&B}r^m$d_EGqYm2_pMfkuvxiWycyFTlKsT@oF%& z#2+LDMcNSt{e|#mo3sCqtG5h`s|(gP8+UhiCj^&Zjk~)AcZcBajYDt=5Q4h|cXxMp zCqQs#I&;2v&dgl(gP(mhz4uyG^*nV~`EJbqw>VHm1_$@*J{Nb$jW{{b7^lsF*0$C^ z6oA7hM??6%k}8wvZ_1%XBLEHiHvo>IS=la(dC2m~xV90kt1+OIJO*GkM6!nFT>q7E z`Z>uZ0lorU&mKr3jVlP#jx&G$LKZ!s8LANTi`;ke<_C(epZh!|26omOA)2-;j2;Mp zOz-|{R<|XUF_^;tx*o+w(J@H_X^Cg)0~JHs+C;79;u8VJ_D+(aW$SDOAyuy^`6qo% z^Gm&g6JMYg?WW2_zXNA`NRc&+#YOw)Kfa`^gC-rC%wrq&ERHILe@Frk&t(!MH2vCC zJ{ni-jT5%AsHe*2yx&d`neWE^{3F zH{s$TB=|n{?=2O<4x&|UFYXDMMV*klhYS}{49HIk5sJ zKj{8x)%sm*e6X&n+cHKyOJ(rF-z1sHU!ffZ-$-sCM^Nzr^L`IZty?@Qbzl4Tk@+;` zOT;Rj7;NJTrb_F}fM4LPlOyz9eEA-iifHxkj~oxL6E;@Bf@r*xhR)Pbk#F8_S}SAl z3B}13MT;wTeICY>bDgU6@Tb}yTkn3MdihEhAw;q@1BNybcZejD90{mvz53>%}& z&jb5L51hR@I@wZH*hoWTjxerN<=#3;@f_Vzj?oZwBBj+)=TeFBYS}J)MP4<95&*lj z)UJkPK&`a0Q1shAuU*Bhwij6vEP9BUrUlcZM(ou1$&6YhMSK2Aaqcg>K^7;zJ+=nm z34w%s#*p9=JN9-dJfmoTo2lq;;$A%rE-(2;^Jl zXx_{bbojYZuIlztfT#7_C5eGd%p@$vdo)*##4qoR_I_rwM)k3~`{O>MrHR;CF4%hr zhkH6oY$E5v9B%YsYi&xzF*^sxM3DXwK1ganh10-+${`wfHh8W+sNJ(Mnmkg?)||-ZeqIjPfSvnz~xy z1{WuVVCtwXdh?VPCJ0iEJ@^<-Ig2;1GN|c%N$O20AH$}NJ}5D_B26?*&>+^TBHaS81nvEG*WgF;m%_oKdiIgu%msuAxi>CbiaUPMnmGwM?u zbv0)e(`KUCDVLpFgg3Fm$pFxfEq(b;YW-;zN|86h*Dx$e;3s>nOM=qOst9<$?SSeZ zUF+8>>KomV)w#1v|B%D*6*L)Kl9-{%%m1u+csbA7nJYY|1Y6pF8a!~YKI%WnAg(kQ zsohYP>21n0T=McSR-&W>7j+c|xEDD8oU_e|9~SW>f7a(QoWxwN_P~Zk?s2#>cV6UJ z)!QWqxxX#V43m~f=+W`3sv?vwbPNMR^i|vzl=N_)agcrhqx?v*xt|37Wr*83l5fbk z;+4TAle0>4_OYTa{TRp?Q7RAAZE1>zv~EUsJfW7c?ffT!D3E7fMe5Z&);~D5N0otN z)4C7BRs7!d<~j{;L>Cy64zEgE(7iiBv&Hz|R4R5z3__upUn=^uIU-)`I_{QvEkT4N zOj1Q##pCQplRPXsCs9l4a!v*J?`_9hG~6{kMgmn_^Z~Hm190afYj9-D+qgRIt*hZG z!-DAYBAkIc_|IJXfc0pCilAoXom)>7IJ8%Z3cjq_DdU~8o-lFrNG}VYW2_CgUC32S@JWH zr30o8a_qLQi)<)vndbl)`d98lsA-~LmMs`JXy$kd{n?tFyK2g4n0=Kh{^X>W_*gbT z=UTdSo6t)(#sMHmd1#MN!VSmBzaA)aANov;Zm}d|z^6ZI8hGjp+x^G?NW5){Mc*M0 zbMe>BW~yJ65ECLsAXXdyHLj-Y2Hz$&@CJAEP+b;VTjVEhn}b6k#%GB2mmHkE@W_JO zksmseijp$(z=(vkm4oS1MYE-&pNk@NKja6(p5WcZ9oA_Px_DKbfrnh| zOdAZNhtJT!s!GsyG+?5%?p(oPZt#!l_jR*V8hXlE{8*d>#hc-y=hZgw!i~M< z>R~R5au>(PT@Tw0J+T*OscS0bv$TDu4MUq;LIbN7 zw`tA^F}MhV4_}Opb9u0Hc?A~VI-#8+h5g#8>gb_r%n7f3bE0YqnX8jPyw?FY>?Mg* zk&DvX?>=_hz#8SnVjeh`GwBNUWj1^vS7)@ENUr|*mE$Q=pt8-rs_T@rBHsCnQ3BHU zyDwbdm0$qanv`-cj!*YR0NS!UyNWx#*_I^=$ZK4 zu(>_DUL!+=;eXiHq1a$j8p8;eCGW^$;I2tM*U>Kbvi8&eUa!c-VyDpATEiR8OE(|; z-bFNA^b3FE9LFAT>!)_H&}!YgkgN0k2@Dn2_wddo{nT!CLmDwbgpd32`wbuB6z5tP zR=m`0HXc>$qqy6fC;Sr8)t)91(_0X)Yi;9vQROY!D}PL!zeXZ|zjl3QS!6gCZC!IwcwT;TO%alY`xh6zrsy!sz1Lp110UHJXOTa9P2n|7 z+WmtgN);SZ{{}d}Gag7{odnYRWy9V$EkV3keu_`r%Zb#NPTm6&YD;Q|ee^WpL!-qy zSlDF#vme7pA=^;3_7YaJY*>hk&2u(c;Wv6otDUW>I#NCM2q}==0eQQDsR#kTiodNI z&aD@8?VsM**9!*us3P5A9j_g*lyG9CoYCDayit#ab9dvREeOVSqCRkDryjG-g*@)~ zodX}Md|n73J*gk|TdMKO@HDF4)oaJHH7_QgeOjS4b%$Gu1}E>pZudr^g}9i+CFVw1QYVENP@L_;o#1v&^4{kFNr`+W4Dy8Q^x zNex~yyqZw*bo2=S8iSE%6__lZsAL?NiMS0tD*VqiyV>TRf`JqMmB3PbLASh{kmn(m zGEp7tPDX?LL^zNuF!Iu@B~hT@$M-WZAlR!YYG@9J`kL7yG$s_Bl)&L8M+;lWMuJ0v7^31=~F(e z4pYOtvt`oOz@4%^NGK1y1SaL4p%3h7v~GfslG5e-r+i#HOfhqM-R1@>i!w8&dDOWn zF}M@s@=w8r)b(Ov zbM+gNQs;jg*3MolG8$(PZ`3|!M`9BQZN7Pfewfai)|MaEOO4^8_|#7h8J*x-$l}On z<@@6*e=7_mbNcENM5TI`rNLlSDDGZ5gKEw|o261jp3}%v*9XJ+GT6%N{=B}`rN2!p z)Hz8zNAU{+vofc7rozZ})E1%|Y`kX4*Gg=Aj^4y|y!R+-@sU=6-aa-;ci&_%dyf}_ zgwucyY#*7SRMQ2U{Nroa zd=PR+;J*D1`G|TFAB1%86kb#V-Vo%}OXjkUnOL*@;N>?TtL!PF6ZRswEhMHwB93eJ zQ8wcTySolZtbUY7H`a?_>RRtee-Lr2dP}PefG$y5l(q+12=!ZCkCiGNwc66&a&yUD zvn+1>GnsxZmda$*l3Nf(h8nno=PF##997UMpV!&fgf zMa{A)NUA$-CYK?Gu+j(Qp+X_xb5$p*exVIKka3l};92ufM9_#) zRHeY`YdFCVFsQUi`9aO;r)$ooovf1#)Ea*0K=)8ic;(pxgN^OyQ(7n7;bL@a*CQ?b zQiOHn7)1G~sSqx1v5*8^Pt-@jW;#!Sel6H!4;aJ0zWPO;%zf|h609-V9Bu0)-Uv~3 ze3I$0SSpP}GKm+W#^C`Z>|4;x_{{tD7~}di43}sgC_2w(n%rx&nUkXU9(dtTUboa_w~;$sh^4n24F^&#``?zr)53y8 zzgjdWKRU%nOpgot2gAx7&*c7XQuGc^@=*xp(_!O<#EpJLO2;l+Mn0ty2syngB)erz z@f7;}=6)4u6tma)h3wt!KY0nY3f{B#w8yRUt;s$V1JH~}T@6r%RrJ+zkkzb~LrIk3 z0R~+fGXE}>psk7cN@9uVlK@Tr%fHy9rU4uC$<>3QOqAJZH+$q;rg2H7YM>i|j$G(~ zP^u`0xEk1duGv;8JDh=DP&#IbKpU)0rH>hVL1p?hcP>mVhA21>NWZq|O%+9*Mp305 zg-F0xfeGY{M8qZ61Y?-eXcx-6-KLizfwf3i5XMc^wn-TB*4iFI+`Y^ax>B4xbr}2b zMbi|~P*-laY(H#0t3VY*&{0sbqO|Gc8mvI!ssjP8x{T*a%#k$P-&I4w4^b0~1&f(2 zVJq=wQBH&u69{QO21~Ee1@>q$e7^cp|9k0Id$Y=e9W2_UZ)?)^_@e6KFxQ&%g%`b6K68RV z^N;y{BzZRU7iO1*$X2QBM<*%UDw8Axj4`kh<%0z=j0{#i)ZXz=X-DjXx#Fl`8Y?S? z5EHAWJj;?cSw#y zB@4HJ<&!CI+6})l+J(cYKblD2p}spR1h5$HN2f|^qj72lf8rKCcrZ3#vkR196vwiQ zRulP94Egij!Yc36O>Gb7$+HX5~Ced(#_3M!$_q`YkX&-sl`U>w1XNRe( zR!r50BDU4J5Scw{`N>UcbG-+i9-NGc2fmP-?RT1OjS`iifw?>)EAe_27hb=Sd%2_?=vzfQL=jsi*hOK5rrP3<_yKcc0Xp zB=?K&Q*f;h)%r)0h6IHfQ?}IeOj|%3jf@SRbUbKj`c|HMzH^f1sgMKMb`|Xh z+&^TL;@4C&NWtsed`dYVio!f%Q}nRV+pq$^UJTINr>+`=TqrPGC@#!eK4uF7}>wQ z?vE#?kMeTAm(Y96Ldu|vu1|Dk_J8R|m@h0vK7@l#xXs4DMMr=B%I=j%^i4JSF7}r< zJ%lpq&vw_t(0?@fpj@KkabUhL)Y+LR94 zhgHQBW2AK$R)7}hT@fJVU$pl>=W8uZ&@U~mW=6{yGBm2}&Bie6s@a!)?(}HRW?9h| z318E!7pnq6;KCr))KuCOJEp$9ls#_E7elVgp+kax@QD84eyW$qp|HWm?4cik`#F5D zbZ0Xe*Tylx?FFbpzm039QNfUe@gec7nyS4#d9cIE%kIh_?H1QhA}fk>vsTt0B5B7UOI2?SITKMrbFs= zNr(vL8_27r(VCC=@ek9Xh4s!jRXm=ZfLJ}+p)>Xt4?7h#(OU7=__BgQiA172ANl~V zLI`VP$ZT|WpxtqRZ|K0_4D;VUt!}Nn15E%Vf8wk;6jZGL> zcDdouu_@6?B%QMfPtK`N3#&D4(9nsxOAX*pr}D2bO73g!Uit!q6m5q zV^W!k!1uf5H)U%sjp4vIork&LZ2N`HAsPvv&1|RNOV(|a-hC41750U>{|(8hU`4-^ zK1zCg=HoiCV)8d@V38R}e>dR=&Tn!amC2(LD19whPiXms5=w{(TA{mC1N;f$nWX2_K$vu8xQOp>T> znro=`>cu-tj!Z=p)<8@tNEucvoNO6^gb~)@e*cQd#osq!oYL`nyfw7;oPNjZ+C|n0 z`Cn8PLGC`2hxZL2yD)}geD^wJs)dse4JFMVR6|2_H3$`cJ1iGzlw4Wcjr*V`*=Zb{ zqA>{z#i?%O;%> zeKwPJw@MSWjCkq1LgM6y{_ifDIy>c$pQg%sRK}vaX79iP)bQ!=uuI6k&?Xn7BkZ2D z!~^`kGkOxOj!f$*uHmgIxpvq;J)%3dUPe75Y-5v7|30`iy_4EPUtz*O4;{b5+CDEN zb)0wPFr2$PBH8GwzP+_PBK{Yiy=7f+zA%|GFaR=8Nr8@rM(ad2JcSpDr%d+C>872l zLA&z=d~|~UMFGx5h1LrpJwV0Dm5r!^H*q6af)d0gYSYLat4227aHtcdZ$O@nl8J6^ zrmbF6sH+dvTg$h16dolXxa#B>5-?Hl`p)`L16d+ZA(Q`l@zbI*X->H|a0AjF8iL(w zUo?T3Ueu(3J4`G9=K!}$gE)Sx8?~-@N1JlE^^Qps5R8i6ju z;#+W?0mr@`QGX-Hu%@`SDVAVF>8q-LQgUI;acHoV$ZayX{PNE-np8yB39tcXW>?sb zwLr!d`RSZadKboHIBCf`BR+*RTfvW_r$}a#e3~^+Nz_amLovOs)LAS5KOfL)%)gYw zuQ)#rM4=QwvEecC(PUf)0;QI6Lp7BpROf|(g-LZ(4>V&4&HrU(OiX5ZEMGTft(Y95pytA47_>MPCZ`qsK&}jWakH~qtngwm8+nV3Wz0N6`M2G#qaP` zrD$;sI51q2?b|*w`$n5Gt31n#7a$9A%g4WSI7SBJ>yhOXoO~a3jTmao8@o{wg9pKi#~!| z0uhDNWa^Wo`H1EkQ=0Aj5nmpj9u3y_sNTxOBWuPNzRg17hwUWF31oy?M<0w)A8<=Y z#y5p#?bC?ki4TqBmxy)*|6Z<_1+|WK_zYs_*l10yHU3Q9-=RG(TmnDq2|}k$sSKjt z9(}Y5+RBg6Tp!R3wg)#->^e&4axd*4zOCKcqnP$OLCa%TU|oOq6HtZ!{O%d}@;Hbb zDQiOH>o<#86(kI22=RYM(4xUVvfIYeR<0jM1%QZl*usugQ=Spy$-dZx-h^58HKksw zh1EVC^s<>(#2ko&fyN((2Sfz0l5^uq;ekmu7?@7L0vH=D{m&4~PU>bqNfdWbXKE>EnTa(B(Hv0m)a_%&wKk;)~ zMrcd`Yh({naa3DuB+pZhj`Jrt@u9*taTPTTa{ z?uQm8JvP3Ab1~Lsk@d1Q59hLh5OC>$dMw6;##XJA(08WK*CsiNKyP@7rN2P2USDNK z8o}!`?YLK&5he}O!&kDH(FO}5ur%S`)&Q|BN6@e`6JboS}s#Xs;qW+ z6O)n^T5~ZcaRaKt{Zogc&)zG@$n0W(B+kcn*?K0E=vO5hqDr$aO6}z8Lk*fy&Oukb zVbYbl&m(C>=*p_MmhBa4M^MFoEPxK@>~{`dnExVE7KS_yNZCt+X=go?)ewpCSN5D? zRtTU?%^;C_x$atqg?u>gvpi6y&ExuEa12I+09uIcaMIehoqEtsLkMdiW=SazO zrFZe1t*3WoY%yKi>c_&Ds|Z4&cpzcJCjRnJZx%;FmKW{rMxU=kD=>ss?BSTxcI7Sb z$R6Dj_ckm^=6~k9G|0G+jDn8`gj%Mnqu>AXI~ZN{(8tRdhbH9v@jk<#bgQ1JR#oUc zTmEW_?#8&~KwA7i7J(rp?LeoQKn zB2FRwEfx4|XF*X8slF!;BNEJ8|J5ZErk}z;Y=VXBMCgk=O9sV7pY2ix6eE!V;W{8b zFjhQLvdEqN2s+0Z)U5}T$_fX_oL^FbxE_Rv@;3M@6Dbk%lXUavGG5?&Oa_kRH%MQ; z3&&DQcXaE;m7J&CFV@4P&A%~W2At2Uk4xJN8~zGQZ6%uQKNLdl@O{k|Ut`2ToOO|2 zLdD(CB(gVj;Mx;17DGdym11M^8~mn1ML8X)V*_n8J)8NkCChrX-j5^syQd+B5QA(< zrXf_{bp2l3S0Tft@$es>D5=k8+KbV^uor>x8bHok&`HU`iV8*7p%AdlruVnL#uJ zPRaw=#4Tr(pDQRq4V|`AhhCO{R#d7rRG~#X9H@fF5wiTg#4Wq#j(NOfuPtOYo|jt( z`;|*;b$)O;UPOOP`dh+In+WOXD*r_fVdbM@|W#Lz_5UiLWT$*9`1z z9I<2laBo;51L4V8hx4X-^$~NNLP1$Z)+&OKG4qiOL#I>%ISalP67nn&e;(Nz<$JTPWbw~ zLE_ug6CIQU71)dBae_TEX)cl1v{QnlQ@;Cq>T--=Wa%onubMuJ(Ff`L>O+c#-W#{7 zg+~J!FFaMdZXKD2^SR*BOty5`x7OHEK5&g`3IpCf%lDNlV7#&p@-UPJ z7=wZ%&d&V}fYV_Kq&NFL8&( zO+6h@d*IMcT&LW0k9iVg7->9YUt)2ixK{GFUZ?rjbfNX&)ScOarWeusdD7q~c$&xO z%TWmsGY{s(b`n)#|HVG7!1@NaV+gGzzB6Iouc<_X^{&BBt{kKz^|UN1*Yv~?XqkNg zC)jS-W{ae_I^w)c6qYLV1b#2cF_*?xv1$cY<=Uj26Hu}uZ1^n>_=o@rHP$X5h~+P9 z%{2C?{4prargfqm5XtZ~4J`{lo1DANmuoVym)v~sYGT;pPmpnhy$zEecJ zn4PLN=g|r+QEP6VJjzY*AUV*Kd*YX~N1-+|nXAAB#`rH#-YGwbld6nx+ihTo#^G1D zPv8cMT>1Jr9Zz%Q$FT!sXaqJA{4`RK+j*soBuLD&Muz2sS9)6A^wG`CkLj|jS_mgk zhcIst6P4n{V0i&l7G_(vL6eK}Ek5q6oex=Pz`3~#`oYOp>P!^T?kwH%>FoiXf(8`v zSSI05&X;dO8^lh%ZEoM-#=`Ei;9T@0v$b@(>McS8C);m!Pnhgche zbo>zj{m%4X(b)+(Q4a|ZYP8x2cOt;J=?}Pd;vk)8(qJp zSmr!5iiJKr3Y`MZ8~+$ta?&xck%Vm8v29y@0m819xx!`<`FqC`^$Z!r zf_t``S}(aHK^_zN#)lU#Gk0e(oZ3|{bZVZjpnB8$)twNE&;D)0IU`}!I0QP?PHu(# zr>WF5p$FQnvN1Kjv+d-=6z(({_Prsc;lh^Z34z(MelMNZ7TJ$!v zt726Dw+vSPrK~EAV#$q!dLdlMvD@LES5-AJCxuOt|Ls%mQX9d?xSN>7c+NMqq8C(lzxg+1&R-~qlsZ4nd1FfMYE+Uxb>6f!eEH4ozOe@fXN}g@=Z5|@GO$l| z=k~qahm3oA=Q1V!zz=a#hx(OXf20s%hor)h?`ct<9}Q~)UQFB5va!y zc$^9tH%}9(HTpVUORN^1s`OW4p%ig0gCP?YT$j-)ep{>`Z*VaTU!R9kz9~Z!JkAUEm4-#b6ibaJS8D$ z=k6|@Td2NtD&CD8283kGXTY77C)3rz;2|C&<-CFO28nBW%}}|L7x6sASQmfp?vcPf zDm&C=9BUl%vJUR2W|vA$ajpq305YW+Uc2UTBS?QuvnsE-2Gd+YKzTt@0&*lVn4T;1 zu77sY+a!cfxdK-?o-jB31L2|Y3urudEAap}Qoojef8D^Ky6F1h^N&thHzqFfjO7Ad zaaoLYN?fcpxtPV8xnBnPRXA)C&5ygjNCeM;awe6|GwPEAWD(VY)xbXWJO|Rjx4?&P z%S!ZaE zezY5}SYS!qkq{Xx?8y})|MtLlU_8L&-o6*O$@QxG75L)PLX5&oF?&cySOH>+nk^fz z<$q~Iq?&;od;#~^c$m5c8x#}Wnx829`&!6`-i1ut(i7r+65Z$%eewJ_yR$`wI*otu z>FgR!K1aY}plmI2mduE_7>wq8ZbIkEK~KT3=2eY7r+P1eUmfB}ua`eOcfnE;xtEw9 zZpD4T*S|SyySGztJJ6>{nQo@L$8Z@5g=?`~hg#Sbk}%^%OBA0<-q zvGnC3_WA6?!JfRhPDu=2qiJfDWIg-NCeI|3ZY%Y`0uc)OQuwT}(_uww;JG8eL4sa% zK8DCR$VtRx+4&hs#kZcOE^->2wp9Wi@H~07*-kvEk9I=gCA)R6!L3OKzrtt&^zBWw zd&C^?tCYX1XQ8&S1SUS;;KSOe^xsOOOspW|0+cSjXvcS3I?l&L8b4FyKdfx`GxSE`_GQP$3VqT zT9?4(sA=OkOm6c2-SimkAVDhAfr8lkcJT+qnneIFjHi^Cz~}Qbg7yGe_Ob;JQ0-ac z?k~)YN%iGRHVx-f6fGMeKDA5g&N$_Cf7SGULiE(54t*7y*g1@v zh&20d1-{hf1ls>;z5Q#z1wCtk2Nuq>=spZOAr;CX>2WEFe}1W6ZQjtwkMyNrAzmQe z4?_|@|14@Gl}0a0Sc^j^G}}i)IYj)9%!ZD)h&{lU-zy|99^T;6w^}60f+#(VEE%PY zj5Wcrt543ux@?u+R|XIAe?&Z2glYBw*srwLT8lNbDA!8Rvr?>2EFGrCvXJA3%Dl^C z`EA|Ue4x6JvQ#Sg*;UW%Ar!AkxAMnYA-15aT7U~e7JsK2dl#?9Lm@RIA_EhX;3f&#K z#$Y7&d4deUfgl#5pnxpHsZ^yTzT;%z&XpdYZg`!h6$PH?o$%MgC=fl*mRq!E!#j@2 zFu!O$pdzj+-Fg)qQZF7iXqK;h%AbG#lxMN|eZrx6*F4W2(ifUV!1f&{@}DhE)jfqii%O*jJ(YghV+=_e_s1L1wU^8$FfI5Ns#;;H1C{e!{gqOj z*ELA^u*ys?fc;24)s7?4lnx=4FyHH5ZD@n|-62Jqb36sFeQV22=G<;VhSH%j?q8UwnfK1A+`ig1vQE zoQ$GO9b`B$PzpNyLUG<^`|c zjjaylW7MwBte5k9X1((I4+y1+L?X7c*Klpi$?x5N=8Jt+{93LiM2+A0lS?#Cq;-P2 zqXL~q_#0R%%9A-8pKlZ}mmNI(?(Q0IQw2DulO5Zx}Yt7-TomLIF1P_dmTxGHocFP)$grzHx;3+ksT2@A>EkL-(7D2?^9;Nn9H~ z`iA$Paj4D-bPA5l9|c_ z*SGk1^-IYUWpA?gBi30ztaG{$b9L;XM7;iLp^Flo;%w!t42KR!DC_og5sNS65%Oi!%AG?0?tJ|H0i+CBza22FLy;zz zCC1r4r@Jw@hM;J)4i+Dxg&AUoudrjWf`p>1`5cU{CH2+bdEkz2J`V?oG1`$uqnuX{ zA5ntWCoZc08Bc*ymHmJc!HVm}@af{Wr8m*ccDLN#`Wzi|)ACIZoh0`c&|g=?-f(O! znB;voZOCo7&?rQ{joQEeG)7k@(rWyIhiZ9`G=HJt=O~;mQ2*F!o~I$9ej4FI|SwWg^k(N+PP4x!w-Jt{=z=&UuxvnjCc4YCCTd&{Tpe7 zJq)spJ0TiS(wMJrUYEBXiImh((6^XRk*=#BOSM%7{1S#~4)re~C0xY1&SCcS2^LyM zOUeOgSI9w+i&a~#TrS0hCr;;rrKovmq6CN+HVY6Qwjj$y7lI(bMEm$#aJhZIj^<2i4+u3f}5q*Jkd?=LVSi4!DGybob$AUMs_-k7% zxHeXq(&o`yL(b(V0eb$c6^8RYci`D&Q!WfQK$9+N`;3=pCnk0{NLyH++({c4DysH$ z%>RAEdE6AzRjVu`d<;?%y4n8mf6_G}kjEaLM|D#J##!vGwRu$0FFsA0A%>R0v7OMD zCOK70E!v?M2~2tW(Usl7^<=9mG2Yl~2Yc(Y=;wK_ABPd`16c;b0|dK+&;&UxyM-K@ z)_*9RGuG9lVeI^7Wt*Oj!xWL9M=OA;w^LZ-#qgpnz_45(xGB zi>?JLc22+JhmVo84fPo7-nhhb`#I-yE&gwfilPGnuh_$`n@;tU1HlBe)Fkr_`Xr8v z1VJ7?m!cDgz6h^(=4XJk)nWnqZYl+Q5K^K$ZlT)=e_C}4xot5KLov7h_q~#q{v^iI+!1NR*{8$t%2#fz^>GivA@gDc0nLMFsK;;W%*L-6D)jP@9szcj zG=E7UL$%+=sI`}LJpRxSqK5H8VR!C?qQ*nu;P2OPxE;`hUj!0ey2q)=PukycYTpSZ zQDXnp=&H4B4BVr!$Jn(HSFj~`YW=-WFB?y2u4$Xq0_*jTl>kj%fy-=k1jH%NpG`hm zH!caPdeTX2jpl7x&qh@k1WM?Ut{wOOuAu`nwu0A#4&l+p=-4HEBoDJx4$^ggJk0~E z)nns{IHFHvxTy8&o$=LEzmF_#FZW1-^^gsvGoq7hKfSoXx;d0UREeSm=PWk!Cry}h zDh%aT@o|Xud32K*ApzXd(t zYe*~c(J~CA2uS(;@Lk`dyRdfg_r)(O;>q0RYzD~Bi&K?Of~W`_tdPCvd3TznI}5`=Q`rLN4SOt&`{Vl+?Mox^m5Jdett^qMEd@~9@yh?1MDu;&}QqT^k4cS|PO5**Ub|HT6$zIME2a!{7D} z1nyHJpa8x@h$AhOOk}Fnm8N% zVR0e%p;cu9WrbbI_Em79!hdgW+!o+hrM}hYqZEPN$)FjH*CqAT$yNpYW=UMOT7esI z(YrV%f5QBE=vHpmVCL*DU z0CSq|$@y#~bkef|P?eng2U9lw*8mNDhFhq=n0i#B7h!|_h@D6i7;uC{fJlwrLIPig z;j#%g_f-Tu>r}V+jQ+d~(ne9YRE|9b3Ia^q9dlN;+-**IKG!a+HA24Fi@o-orxc{J zB|>_%-FZIb8sv#2R&g@lbCGQg`JPvGs+bM{K+HS6-=8~5Wp`-oLplg|DkFRC4`9c0 zQrp$@EZs8`9=o|A`~mLTLnm*(7ux<0VV)=HC@g!e#P+WEB2?#dP&y(%x!L89hYk7r zo}>eXd8OMQ72#>|*IWYD;{gGv%UY0`-v{tYYTyXP4{)Tzvj$@wPd${2BLR)0!%JIe z`ZAxh*pp)ZK^7M@WID%poDc4ajBQSujVudokqv^#RUf{NPqhH&f__&=mNeyT=>Kr2 zK@a03UwPZn`M8~Lgv>cPeK_^~TTtRLKT%TxFzC12+*k}cx@yyJq!$ZmU<;iTHv>7B z7JE4nc|ude6v&Xyi4Cua=vcT6squ0_vRPHc;!z;=6Xls!R6Kf>)9?a{yS>!iBpUiZp~KxmTD|}oQ=ei&VX}^ov$)zn40Z-L zGR|;AkxD(5RF}%<&#es#-kiIEgjGTh19Mt>n=$Y*k59KPX*|x~D*KG68Xvcz=+ytb zruA61P|7RsMxSmRQV4QKu&|N7BVmWMV&0`NBFUbVN9l=Iw!~>vU}Hjuxd`~?zC1Le z4?cxB2vq*tW+R9wCIAAW$*`BW)4Yil6~csB1v6wY`rQrwzUhhKi;^tcRn@UQbH+Y` zeF&2B*LRXTduw%jROvu${w07Fa7T3^4?XPLC6rBYSb3t8H83c~5Q+Wt<%%4>8>WKq zr58qNs|>Ye(&ER*75-*jzt`*P71`vp`#6fCnyg%_YR$+OuiZR8Anm)gqPw%DCuVoL z9x`R595Qow^qr*77S~EQ?P_xT1MyPSouMqyA~xG!!Z*dt8dTgiW%5$e*INbwYs?rf zU}fr$E@0}&aJr0dCvc#q-?3VIKYUInAwCt$*2qJG;?YoM*p2Wir6ifn{CzZh6bm8g zkAq(y622pmQGQVYn1l3{%~w0sNg>ZnEHNdmvKW2_d_+Ge_wWx2Qg{LG*hK9&ZQpP# znG0JmYJ^C%_5FDcJa;0U)b<}am!xi$li=hSU_|}r`g@3V786l-rv{+s+*TKJw{Sc} z90}$Ou!;<`YBL)$PFZEKu&2+h{Nr0cCEf%IU_q?Pr{WM(ONsDmQ^=+Fz)&J6Y3k{> zXOIVhIB)E;5E{$gIW~K7@(0%-!Sm|U$gUHr;(2#==bX>3-pgsV0~_1zV{&6ZNu3e* zbT+h+bJD80Et1!2>Hd^|uXybI{Cax!Liq#XwGB32$=bmg%W=G-DHIcya#53aNM|hC zFSkwTIZ>WV4RSkXS?v;`7gX`w&`-`mn9QfHNFHO5RjS9L8gKb+pa9p^!s}#t-$qns zIRo~vZud3CCdP?mt$fdv|HQ-Dp=0p7JvN2R9`>+{||HJVp!yso+>%! z1(-VYCk%s0D&hc-AiC^pX%5ISo9?;vwygv%Fd&ItIIF}q1A~+NDjV_t{rTp zQTRpkLA~QISUA?5iy3H}j17m@fq!Ms1|WYsk!E=ZnT9q~PyV6qnN+>3-qCSyY1^yF zuHDXf^`X$b`@V|b@3;gVXO}%5nd@qcF(E1GyjzzPXt#zjwK@s~9D{U5I59-+ ze9iw7lU-)A%w#p_Q!H;Sj3C~DkRX!4Vs5d&$*k@X*R z=zr#4G23D4fIi8#spuXb>A?NgJf9AwDb2@oa3}0w@p7ZYh_^a%V-Y=5AsXksic3;~ zD>#a?CUF9{$yTY=x2ZJyY8iz>Z^;Z^Bu1g?_YW6;U31oJH;|*De4OX3dH@(%;pYas z_n19!K4qV`g4B{+gD}^uU!#zEhcWUPXJ?GS#nFh*Gf60NcJ4S4yh3JzlYBdS)#<0% zx*bP*=;PvAgtFCRa!ngP0Cn5KyaR5w4te>w-lyR#5kPE)U$9dZntK_`zW;ewj?`~^ z(ArM-Geg}LTrEb-2z0UEM6E@MZBtbgr|rSNX5Z5w^PuM2^?eywUvVh(62A%xd?lnI zNY~wzTAjFIsOIFtG#V8Piq#q`uvENb3uDcNj7d~>R=~3t1 zsolY{!o0oSiEql=g7(&-hJOr6re|_FrDEf-ELI*f=_7)g1t!iFVmF{!1sv*r%TG)T*zXieHz?9Q4Gd+%VV zYwDc>Y8|&~N&J~JJUsFdKX5p_y?=(=GDeVR(57BTT5s~DBK2uBfNu?e6F%Ojk$o`>S_c^yZ zc$0p6t=+vdhCm^pdvj+0&nTbqFNp*cf{{w|CHL*7wQ3D)W%T}7O=4B7O?r0Z2oZ@3 z53B@0kS?@_D+LuB)TMqqu!q2-jWkH+GW!c&-~bM4o9WZLVP=0Os3EN0thC2T?cUv_ zI;3<1Hws7g!@jcy6Bw^&venrn@&T;4=YqRm!Wp5?RjZEKyZ;Dz*;={hzmU48e8w^& zON5b2ooxWq$aXKv5sK>f2Vx}!4R|M~na~Vdo)%p~#ndU5tPJrLT z5?NbnI8LzH^~8%%6GU|H#6gzTqfi(8=E42e{n!5oOr@b7 z8II^-ders%1Y)Q^>0QiyMoE&V&UooZ{IaMYLMYqfv>h5ni};0Yj_BOg`zaVFcXt#s z8v?Z%_2I7)1n5bM293%jj|oJu(0EKK@0nfzf6cK=@391=W<9Am9%qD^#q;2oS?=wX zasUF56<8WqsZdx)L@|trQZ4?K23Er$(qAP;+43;iT+kx%Yo(*>g` zd7@tEa1>vr2gwyl;9B$49%<9mW5l8RzSwv&Tz&{odo3mhNuPo7~Mo;&&mt zjPw-o*EnQUR*0u6D`NBe;kQCt%krnrRKpGx-v0M@P&Cuf>=Q_1Y$oybSUhj8Ga_`E$5|bB5IF?%BC>H{M;!C z4$Jy%j9CRm*QQ}m!>}ewW?x#!p@+IwVjg(}LxJPCrtpCz&I}h3jBCE!$Mx

    u=Y-N{8fro1C^60Vo-Sp?~6>(bNhF(}GJsf@rDJvPTPngZ;>@h(lBwPnWK z7=wGsBfN5}!33Bk08uUkLr)2}i=0O#$5Y790_`>)qqAKo_h!8ekUr-#wwu4Jtoz2Q z1eb;ddTlu&v0!!z@W$C?{*NI3KPIf67Xs9REj0e(=gU?F>qaZcFUooX!yMUoWKILq zGGF5i1}qOra(k8n^H%j)!Q>%NZO~Yj7O7)JkWB7pw9k#sQSje> zAJ~_>aK=Fm&n=eeIu>#D;-H=8v4wW9LCu7WA}Ee=>*jqOI<3fC$E&P7f*DrCpDm*~ z@T|lIerK#y|4nfPCpJN9HjWERul3Ktcm7<#>KlCiclmTSc?!=l22Jk~8{HU0R@KGo z2W3VBDCLk2azE`KWQh3H2V9o#TcHq5K&~D1pqL?_J`U55%dl^$v|+h*S(WE)sn;0G zNS80A5RI|U$k(&K76>gDCx9QppLl}+Pu5hmvDCdA;J^!A$3QZ$I+f}!Y~95}?Kvn( zYqX~;KjN>RcRnSIdYHdEe^?ED=`>kTJ~PhWnGU!K0!mA4gD?E7Yj#&|9hg{2G|Hc& zTst?{y^}@wXh{~I#>bKzhMmkK4F~p9pX?sw=&E#-_2d_@Z9>Pa5781(R8s0O18MU7 zS16%DjQ`FsTP(S#$deg=ovMV6EXQ#rWbYTAQ&Cw*$y}6lnqz@hi0NE#@Hsp(uqZJL zMn%M}(L3%DbE~$51)x~HFdUH5{5QF6QG`dI(&10}v_QW*@IvSmjX~(MOdw7mH83QA z{4{Fi;i>#Vn@Wm3o;G_g5`Ad39-_J(ih;X}f$2}fwI}E$9KTOBQK=a$@ZC0e@h)6} z)RbdGSHUNV)=T85P7t#CP#$xH;Qsz<`#e;AR|`2?=)B5oO&go*b&<~cyymoxZ}^J$ zjb;6Ll1ks3#EI_G+Dqu8%s2QcInEeye2-C;R?9i_0sB7?bS8^7V8@^^G2TMqB2;uH;_&oZ4M#jWibZng|`IoJw8LS zC7Ve{f4gWWUtiP2iql|FbzrSOZgGwywU-N@l1#6`*4u@Hjt;fV^zT%@WD!^#NN*-K z$`=mzjy#1C4Z?2(lXCi0S+`PRwl!rES7x!*`?taq3@>q=n7dRhWH#w?WK&=T`t|ci z&7<{;H0r%cEFQjYKc+;0MZ_JN)X$BopBR^Xd@WNxsxyCyT@=hgz9IKi(bmp3{_4|} zc6QQwU+1Le-t7aa42!XMknhTY zA@5jJvL+-PWw?JpB!34rL?&K@i@Db${;9+IIB$UVIanfHMhTw9t5?GTSMD10&#s+7 z%`FKzgH=t6q3mC{r|xN@rgce6WAWGB*>*Od8?~xWPWMM-#DH-nBy;H}2^b}oYLmTs;t# zy{o232`in`H&fO;rR8O?9wL-q+X>Ow*h2(YY9qPJ-+?*}s&E+7t@*KyG19GbHCD33 zr1eZIaQBZ05>`jLJ$H0ZkeSCi@$50!8l+|a!6cQR8I3efVuVTd$HoV^kcxz|nes=@dFUItj_&hY*xngWy z^y<*e&0?ornqZ~oLOMKj*4I2_PhUQq3y{1Ad-D!h!PiXoM0DDAQRxe?Yk#A(!*i zo=dW)Yr%fiyB$X*d>bOKSw8<8neeTEEx@XM2NNd=j+rKJw|W>NRSuWVx_lS0=VVK3 z;hAJ`itQVZy$D9^ryG{TcIkn~dAmA{(bM-IxU#Gf>(`1m>;62Y{)5-ent>I&=S#RW zPmGL-jl-RN#LyTY(i0uQcK#_hYb|<^zvsz~Q%+6sh_22Tl~kg%tyz6`ZZgx(x&6Ok zC1upell?kFqfRj3cP`9%J%twpq=;m+i6julV~mRQm9|2(xIvhdj!a6neApz1@%SU> z@{dIC%!sBBJt~`D1f)-_5_FD55@|!{7}H*B)W4!*Z34p-FDnL#&el#IIa~Cgmw{mk z(E(QYT7juSD2rv7FkCJ-Y)CLGP@q}Uq6;J|VroqE#jp+t7wFm3R${L8W%b^t5(>MX z+%d{wkYsr>ifVT(LZLKT3AHNe%WRch(hS$Jeb5~8q zvv*HaB2RA4CJ|>BB;SY@Qp%1?!Tkt9srr1g%Jgwxj6b8Z>vPR^3!fYUD47dEsN8f!FHtQsq6oZQCt#O9sN7p zq_mg)I;+K{G{tQnPPj{N8m7(XYIM1(Sj!$njQbR#Lc~aEGy(W=epK$29(y_Zx1 z>X{UP*v_wg_FS>8aemsr5qP_aa`ykx4OIYf?%-pGzMvT1hZE287;&LJ?HSnyUAp2X z)zqO(JkId$Xt`@vFSEx!PvDj`h|zvhm6v~C;wA%;4@X%#8+#L%vG_B8J0MC^O&6+U z{uaguxo)1=Lc`o+53pXee+ccS*lL;ALlH9jB(?3oH#0Je8pjsLCr~}eM%tkgNh?#8 z!C{}5@IKB6}YTng{SP`2&(PHKxRAPPw(6H>PqLdVk$cQJkMsY%+xwM(O9pJdw%B z{gw^gT1h-87GPI&^)nCxn|_6Hrmj$Vmcv3pZ5q=wi~42jy@1EfW3xUX)95NDeIWG~ zZ?YNY)bkGx3P>@8@i#a?*kGdOB3~b8xIX&@Gvb%Ak$?@U%6PBgf9&P)>{I$Kth2)+ z?4!u%T0a}q7{U5-oEw#vuC{;)z|Da50wVvEYBE(Uth5UIOKyKK`o~SVm##j0?C#O_ zJ~G~$s}HH{&QitG?hXwb3oURz7$wi_WZoovV<^ea=+~3CLx(3Q39YiI00z!>v?_LK zS+h&X;c{u)|9;0307OtZTfnztFpERW&*+p^qmZ#FpDwzm2O$qK<3X$2XI(_1occp} zngol`kGq>h4XQ*nc>(z_cx;dre87fGdiioKe7Ib{O74(rgONtrtb4{}7M+5UV{;jG zZm^}%NDjxjDy^r*^B($NTVo!}TYi6AY!7Go6D=o@#)w{wkNe4mP;0bScr6%aK7n3T zWhp+WEe^GE>9K=vVKJxtzmUpl6(IIvli4%u_7~jGK|G*3!e!0R-Z?e7urw=7Tn3a6 zEMf$z@~7?FmeK+rqr<-<%|($DnMr5I0*`T-#vg6^b-50DeZ60O9a_V=;tQyRY7yZW zfHIZE(xEZRMmFmnha7%?D?lqlcrxUb@>fEi2wPwnq?d03T*W4REaa&Y$svf|E`P84 zQ>!0bl7#N~mUXS(18@jt-qCVM>&92~;B=EL^WYzg9&}dYbSnS2hjOcWl;u6KBYsZ# z8va7o8Jv^{l?ajb#nn2@xUctJ#Uw&FhpNc2`=ooAY)X{%Xk`2=pT0OqIObAEM4hcK zdpnEC-ksQqQ9{ny6>)?QV$CwcdbT$o*7fjcByT6v3>_?RpGgh0hu%8cps|Z@&4wM( zoCzGq`6}vaB(!$6z2_AKb81em&OcEQ4o6%^EsxOeEK%6!A=?l#yv?C51e(5FvxBds z6=5zrG$NIR4L)O-G(UU`@zZ-37XEtDPVv3#(U!9e%I>pC@bH9Ov-iflyF&I}SI<5( zk8r+CQnCX6NEDrBP2dt@sCtjW1~nXApR$$~Cf^$dD^0?DNWdqQ_|r&zXA~y28+LX8B%RN4QCp$FOyqR`8q7va4!wAu@RXj?Mmn5c-%{H>zw@_h zKxV7i033%`{j|?js@+;eC7~0HKf;JB&4j*vXE>!yi0AXB8msKVyrq|Ju)L+c*$OiM zevd4vDLsH}3a1~K98b9!|HUB>CQ{L+_&a^Lm~=Td!R+a!Q`8-7g{*?-;71=rzfzlD z;fEhi{b5UVoe2l*@n>-{oPb{dp-%61y`gWgB|g$tXcvY?IFb;K*GagfEng*=2TO}7 z3VOF!%_@sSZdWxfcK@aA9w-*Ie1rm}wJwZ*Ih>b;G4Uf!+mrw;VLo>G2yccfF@8#d zVDW`GY<>m8zgFhEB|!rB43?6GMgbn2#F)fOP3d>R|DgO~?^) zra+XmDBEH?Cblu7$xk7QW&#quL&hSTMrk-o!>-AgDLU`P?l~Ao|Se(C3IDQPpII3A)8l-u#VL)`|5RuLAGuqe9v6 zuq@1g;K2#GC5sjsN5uv`U5n*siYrWTMx~Q(ELfL?o*;8L+OvhW zU*3P+j5c)`@F4bg4eKd5S;3=z`DV#H5_ulM zR_btDnrBj6qvkKv^r5!$b#v!rPv<{4Y?uAW8it*6$yZrwi~RfH0zw4seX(9c>M2K* z`epHyeeNmo*vdfcK9L*#l$H6gXTN*knozLp)-Y2?8T(Y6$>@o<^RS*sWz$OGIcN}U z;@}e860%@>aC^MC60O2vQUEvT`H0zHl+>{CW`kBQdaFXA7jnKWr3k_E@-FktbQ!6Z zPX2zO$EoLSR43yqLU;UX??2G&$#_Gccf1kujybeSmFd72G`ss46V>pFwdXCLX}Is8 z$dga45H+6gYo1}?9)_DurF*;FM043f5v^I(z>onFHgo9 z4xsJf>TaXrA=ysO9}3I;j7eIEd))(!Kg=sc@L_l^R^%kH0Q@!lk?*O9qW{XFMhy< zTT~*l6xEgAjI#3h?C}Vqb4fgRmT$SMZ^1e;^m(eraQD4Mj znf66f{-MkfXDe+Se~9`+P@HdaUIeX_06g9gt9Y9~b@YEgPxUe=(#Ky|z8yE9Z2|@C z=@G>-2~5dNdJZuC(M-z(zcvvA5%J<#WFtiZ?0F_S?e3@!j+o(@i`uroS0_6OfmFG$ zTto*yS~8(5#=5qNHh~EZssw;xA%H^zwiNxXkM=Tb*2iI9$iukwUts|1@Es%=Qz@Q>V zROG-9F$moywas+;4GM0@{H}#A(WKXI1>Kpl-D%i^~ zOo2j`bm-l6Bh3~dL|hU=ruhcSLG7Lu$|8!=%AP#s>~}eujmSFOg1b{3#yz z@IgEeX@h~|SM99-jVDKhJhS9#t)DU<(kULkaU+v=l)gaaIGD`o=;D1-6bj3rSp10^ zCOTgp3Hu7PsKvQ3qd7K(6ag3sNU+>&{~m**9Z}Vv0JzK+I}rgj`gJu-)$1SR;tj|G~HeH@6BD6j!wQ)8S203{RC(Xu%?BR zEut987mWe}fBsyhX__Hv@7+#|X5pTCYD=x=yQY)YI!JA@$@9Di7n$%&)LlLDi9jILuSX z&OvmrFi4ILL2mFn4&lYp$U#F=i5VO{l(tA}OnJAI3f5Va()1_(0JIq)6-P0oW?Kih z>!GJjg6@SbcXGY2Gqbk)MX0jbqLmubO^h^r^-Hq&Z>5WcT{(R7nke4nWjfBB2ze`w zdz+_ll8bw5+-v~|+?rE;y&>p;@?pjNbb-R;KoZ^|iWbMK>uC zJzF&q)EE_H8Gj!Ufb zCU;TH)X~M|6<{^-PoM9w?a_#PaE-)q;;~51{Eck!sb$DzBj1Bl%g8O|dz4=$6uh5urDxu>=D|g1i$-*<(Ss zYZ>Zp=S1k{1Tg$zQd|m@9^3T$AyxE}-A{(RY%Zif4r(rTBF7CoDok*PHoIxPNdF(l zBtz|=W5Q&J;m7*V9S*oCA6l8O0fb;9*G6DOF*P(^3P@(WD$(G&z?s34)qh@?mAB=% zhBJZIS0BtIA-mt0-aA%%AhZZjOYK-8q~EL+3oO47v&t!lv;B0@?YInjEz%3Ia_TO0 zemni#s*AeB=-RVdpzNt5Ip_X!Pbg4BA^APLhUp)nW*kddeOkOBzx%rgcM3c1h==d) zJ1!m>S!P(tk}eU+o$*2(4|ciU#xeHcaE6T|eixCAjn0-{lQ*fF#1B03v;mLt@7icl z;r+^&Unc^!Q8CE2dbfWdJ-EeyApi@irhErWo@m%4&)=OvF(M}8f&(K5;gj)PR9!UbTMGwDJhjS2AFI2FmWRz==575)qDvq_;%U3dF4q^VfBekv^FxoB~Je}Aa z#U@$A6hM4eIf3OvIkPfgTdwq=_&eRZlo;|IX&o;UL4M-9M(t+ge&`6QAWp&IVH}HG zT5BpjW^USlD%aS$U;#_xzXeZtkR&^w_KK9Ez;Fcy4-xVOYL^VCR9#2AFz4xbDQK5x zR7L@hx)15e{)@hxRph)Nq;gPtxyl;Nm;9V568p;q^u`-vOMXhuF>pBugU*<)wq5 zf4Flo!PYu)k&aH@qG+2>M~1w!?BD_UC{Ix4d)utrQgfhzyW1u>)z-LJLOjc&^p#xt zWKk5mZ!074J9_F{smqXrcu*gbtscoXZ(CSa#a+wr6>^OeHpcvtGlDgfX`bOaQU%C4 z{SS?#*u>yIFoE-eUG*jbkwW=!W+ii$iS5k|A*Li?E_!Px}HN9aOD!--Tr* z+ZEJ*cNR<#dPR*M_)T&a|EY>?e~mTparcxbx*NZugD?>Ck4>&auU$PGc((E(FsUXN z;QSn1sGJg8qq`>_E)NzMScNn%*u%KjC|Kagf#a=~-$y8u{!CLVeG!Cj3nfCnwhWIR z^dV<%2c-63e59ko?-Y6-CpwkraG7LoHiGT_`)jp@#z86BwqS9V@@I=w^6QS=O%;G> zO7BlI4mo-T5nWHdfo2!68LZ{-_p>>|6?sw|sDQT@E@LrxGrQF!j!yx$k`o&8L$vAqyW zB8E@HT_z;AbIW0VaWGCm_zs=h#grZ%t)96}n z1tar(6?&+pI3M$_W5Z!!EbGX8gc#h3!bY2*(9g{~!OPFz>UGCq#}?RN#jOmZ3c*u) z*#~Za3~>oy*#FiBR-&d3iXmf$8D%YG%DxUpx7-W%hL&~A<9+1e;&Ui926t>^qahE+ zyB{*^)@T&LguPPtfYo)EoI0F8hEPpdZe{xnFI+W7Xmbe>@b%m~cSd$RMj4ekqW~&PxbopY;L%C)$c?Y)tKmRt~kbeTBdJF0+ z5wy$E6hWt=4(4mZsBCBqe5RPj4_=}b^gJW5;>}+_8i9KX=)x&HqUQ}P9CM;%V!!s=xQS|)Tx1|-*;P8M{nFG=v=aV5f&@5R1_@YS8ovOe{~mZs4I|iv z%m1l}u}t^An%6|E$$8N;UeZ5IsA9z8zbhBpv@%1%hbBdrvtT8+3R+ccCZO8FpN%f) z5FN9Cs5rY7nhY~6HJ9~0O(jxwWx@YL@O!wN97gS8C|HFUj&!o*l(6(5j9F|qzLE_0 z;f$RN|Il(iM>-?72=V)I(e97ey`Sf&PxTW_G*X9}HD$9n&{cA@z(}H1m?0U(0cJui z`{~Ws3B4sq8ZzYJm#!L)V^SiY?x=Y}Wx;X|M;)7Vc?zc>;rTHy4v6Y0`|5||0K@)j zyE0rLh|DD5txA`7e7GDLFFd$sfbdZAe^P962s+u+;->3O3KR4P;d&mwCf}hbkO^}c z@aBh?8ZjM4QsnoYkt_1fe@obe5y7DqHyWU8d^-9ppnS0f{qkRPWO~HFpW<8WQp66|kbbP{#EK+NfpQ|W#;@<2um$O%wnPiHN zCN@9sje9(`4QPtpan-w_>WxiXnb7mtu0!p?U0Tg+U~BqoLC$~on+#<L{ zTGI-hKO-;COS2dFe!l;mn#G!7>$CBh*nY!;x`kaMG` zj)`kUjMxEXwf~*h?NZBGLZoEbQuXV?*rnv(W#kdgk0w99{}EoRuUE0$dBC5CmZ?u2ySp9aPSBJLldj3>b{=TD8q_F*?6P)6%cg%}oqeDyi&5Nz?6e#*u9grNY!rZt*Cdnn>1XJpPGX z_sOfG7*r=2O77~K_+HKR2}kieH6{f&^UHFCVqV`s(yP`pv>alj`Q+ib3trhKAOb-o z$G(@7Kk`SX@?CH3LMQ!IZ+j}5nL)!`Y#4srAlZ7dZx{==L(Uc}(YSc80gblKqwuC; zzb=()a(XWnl5#XJH+`ctQQO`xQvp4*#p=Bj%)j!R(Ga4g;!+IxK5QG;U_Keh$=RTM z_oq5kl|!GnW7E(Nzk*%gA!A8cLEGKoC3@OZQNfN~6ldq8A2!4D!Dwl)O3)}JXh=#6 zffAuUaCrTb>6a}19wVneh9ZUY*`%UTLO!KR_Sm{o;e!(dKhVGkGy$c(u6+wM1J2}g zIo7?l*ce;wK3nF_un8U{65lgLqiknX8$~bcbP{qsN|u=OGh|(k>}{47DdYaDM$i3c zlCC`6jvLfAsn*0QfI7dia6l1XBELsNmh!N1VKnUV($IrwRilG#pV*9Y)_v#NkmpE6 zea3#&BP3NoH*5D-{XteXFUuYLyI}EduLgjUfZg>;5Y1%^PW9Qm4@^~E_djjeaCmEd#ckIA_9wrU3r~vw%c_dC0s!{J?D8xKbkjVqqbPWTIxKzj< zIWKthMN^G}qXf4O+-Q_(dkna5=dIwRo$LL15iXVctX{`L4)DWwg>qTD4{zmM*9Vdi zSKr%#hIJ)e4&q43%yPMb2;sJZjgmS8>9Dw>DiZDW&R3f?cJ&cN!e~Sxmw#U=7eUS* z^!ojR4lvM9bf$oSjWk0PXwY$A35*)iFJa_gL>_wO8wjypmvA*pS|s589iF!b5p=H| z44|D>aky8AY_R^JV-pltz-UK7ZY_U3g&IOf5tM)|}z#2H{7~}Co+)PsOZI#da7yibF+R5jg zwd`ujj|Lzm*RDS{>l>>Va(=J>J@YE-VX=8TJ2{4i@#6)YzDg;Dk@?j~n# zi-5>UvY^kL5Dzg+p=~50NfZ%6=aWSiA=?v%oty}OZjO10{)R;C_tioh%|hUcx#p_WKLADOxvH7zCD`J!|Cy}h&s(wMD6W+yHB2S~rwe>7Zffkq(jLQ!< zd}N8#BU+BD=T4vK(_=*#bK-2-ygyzFUbZ%JOa6{aauJu$??RH_Tg!V@qa0YgVQtoY zLi;Uzz(X{DdD_yJXpfl}C*gNEVO$J4)sC+5PIyH;Rw0_@UGN~HXD_D>wOE&+bU65$ z2GGbPMn6=NB-m5O#o_V|=pPpm`#jZ~nOd;oMl*1^H{_jRtsMSJL6bfJ{4;n;5;$~? zS^P#^`4oE?{7NAr0oLiUOdBdyZCpeWY@H?D^~Rx|7NeO!O*N@mSm<@(WDy4khQHg* zm^%LqJ5&9Y4v72>3R-avJ$`ykw(g)^Bu^uoF8)6?Wm~BgP_6JaaRDN>rk$I>{Q2+$ z`~x~J{sb4lupQ$4!oS;F6`-uE_vcR+DP-;eD(MWh1QP4-cvl0m@kglPJa#33!cVC; zv|Bw~ekyes=QVSrm?mrbcU#2erT7Vwq)PI?``pI=IT6A0HISJnz0if|?K< z`a~A-;Ves3gV5ye_+S{4&}Zh+`TLgMybrHJaCNYxUgAHY#Vg>_PY`$g+nf4%a1OLo zJfMJ2R;`M8<=pqZTMhpobHo;g3rd@QCj8>7prAjt{&LWQhV>Iz9d+II39vgg$`;i! zE@G|2jS+LhyO)s^SUlmAF{-V}U#G}WV> zTgwc%9Q!cVh8O?sxJ~9@PvmVM7_gJ@&U{f5=ZNvIb4LHdd*chRg3IM=qrv#oXyH>7 zbS^j`<$~EO|K~(*$c5-9ZB>pflE^Do@R_l6-#Fr9P%PBf4;0P8*MF_KGb4TSaZ*Bh z0+qaMwweCgdD)}-og;xq1+#&Zok+WLknD_!tQd)E;RCO=tT901Aag_4VgxF_ztz`z}meS z&YFmEIM|q1f0sfeh$BrJB2$+X3UmS?m1qz!18LmwPC&g=U zaR^-{P&jM_%Rkxu-Hmr9b-lbfy7DKM6qk{9IihR@!R_A)9rZKP%q5|R1zl%ZUfVnL zen}D4NbR5W+SJsM#NQh$y2m{9#awchG#C&^Qe!+{h_3;K{Zkr@X*A9I)4BdS$fhYe zvUzVj4k`&|(xRxnpA!Qt?^X_Vk7btN1_tLgH_g`SRg zQ_BgP7VI^Q!~0o=7k>_{X*S#R;UC?>NN>H4`9$eXrisy!U?$MD6ZP;9VPdXX+O-f5 zIQg`sQd>=Vxky!BE^^S3+{|2wjs0(j&zASU4HXvz{ckhcxpZ2&Rn&-|O{xTZVODWD zTc-pcB4=Y0g0K7#NU>@O!UKBM!sxuF; zq|DI_fi;Z?v4KS=Ohb*hSZA444%z%PNyqqh*rj$_7x1NoE2)>_d1x|^Lb|L?+A+?a2R+G zmhJVr5;>uS&3{W){HwdMwEcPMklDgFmv_ZOVYH<n(_0yYm2SK+) zTm!qoJ$Blc$Z5?YY+63HpKBDyOa)xq-ye?I(o?h$4#J7yO}`H-V{mu-xHd1lj`8T% zls#_3YX%36;YX2E&k}lL{>A<3s9e_-Hjc=DE_YKQ9y3m`(Z#%up-wWi6zRpl7OjDz z#zX~-g948oH<^u#4Bg5uTldIe)(ARyg1A3kj7=#OJ_w)ZxLsf!>`(sw(`bz5qzfc* ziBYyeKDIp}`j*CxfxKMPkf;Aw7)^6AKy5~@a*0nU!r+CT* z8oy9vQg9lA?kPJMlgQj4lqJK~?dd;Ji&pWiD3%$muioQW9IgEc`;*x^V%W1Y=Ue)w zGG$)LcOhGwYLH3??4?97IxXwf8Qe0{VOMv5rGpmN$#Ha@Symx3g_0^FKzq;1_!5M4 zt@%%80#vuNFq#yN8C4;lK#P(%tsGobTSn4?V?I(-Ryj9cD~CpXMlvE=Z=U#V6tbVR z#Pm77M8X>Nk-))GtF@Za3Ldl^^#zdD)Bk5(%m0+gZl#upla>lJlHLBFg4rt;!1sW* zwX!MxjLf47h8yWY@X4f4eU6Y)UC-bEG7ue82m7IEtQPq)SG=E$|3=wozLmCtYhkbT z*u04Gf;Ev^`MkO?O$jHUQN0A%F1=_jHFe-LzwcZWy9s%&I(H42&3d92n#N@cWXAKa zmb{vPh8t}FW$l8IrkbtDbSYNF(6n?lncYtJS7;w_Z;~*{Z}()49Nq&z zcBXIJr!wrVpDd%Q1`Xdik;jK%2*4M*8eNcr?K7E zRDKwHlPmnziJO`I_^sPmDCx4zu&<9wCyL)xPSU~h%j>-J82%eQcZ|4xxS=$@)a45V z8yV&ct%qu1g6_vfO_n@w|BqlfMW_D})ie>Tc3?kn=Xk^eOrbf0fAj(=Kvdz%`=9%% z?8CWap!~+?kbYVT!V?e&(z!}A{_&MBfk_ER`+i7eC2k)_N|y(4#A*u$iJa)Ev zu(Q9lL_KaR$xG4T1ip`j1nq;LA=_yCsA^wTcm#@KzD=nZ{C3OZk;{N?y*La6u4O{4 zhM^o9cbic+%gKFk`qLTsTNiajFHY!9q4kPfO#Xl)VY)Z-(@!ox#k%lKIQE!EKe+Ua zho9jJ|HlG@a`El3@lr-zj1zyk=O`!K<{GLM2ZpC&6s&P-ksN`Yx+B?07ziIK-g&qU)fxx`KAW}TSjv&sVtirw z{zD2K7tunju}9u3DC90BqU5o+T5I{0@`_ZjFCo&z@9dH;rN(`rg8KYHU8^-p^t@VR z;BAP6WQXX*@_ZfD|5(GS>lQr1V(0;q4m|#jwt0nYl}l5-4Uz8a=(H3QJt+hq%srkcYcV zepPsLfdo_^WuEvNw&C}~nABO#lTbWOMDbz>S_H~t7c}1qmF8F5f_H7kum0usfMkMn zHxmZG1fHyB;d@NFF=qF5))d@&O;9{;&0DppKGsd0SGYQi<||%&$ugs^cBzPW>p{&X z?lLH49^p^G01@y1hPsyvQO zIKff3^~3h66#V`vR$K|<1lD7nd^a%@R)6f@Y9s$2Q*RX&SG#nLHg3V2KnU8nJA`13 zLvWV_cX#*T(zpZ-?oMzG?(XgoT!P!_ckl1r=N~o3x>%QM)Owz(S+nL0{wv*#zwBmi z^+u90@@Uc`*;GVc7-ESYS46_N$l}C$#|jq+Ba6`O@^kCeGqw_Q0io?fRLZN4OpohH z@5|f2b1TkfRQJ$1YB%X;nE$S4{K`UQbT1hErs8n@e9__p_1Ss+0{Li^u9mA!ZX&Wh zIz!Flqg?_edmctCSStlKt=@cUnzu+AQ&A!L;VYTN;eh3ou>Jt3 z`N#ISw6kp3YIRsvD5V&XSt#a5dQMUQ;BQXF(kXud*vKYzJDqsbFWQN{Vnekxf>3f! zYa!pZE8$0D3pxF5|YP!#neFxX_;5xj7J3 zRZ6!@QL|mraTd+KO&gdgBM3$i@Udw^$+Pi%wm&OU1>PD4?4DA&?~QbCbcc8Efv3N2 z3JAlM>t7vf;}t)n7gOix+#ashL}wr(n(kQM?Kkh}t05E?liQQ$QH10f6iIx{!3@m$xS!^*CFTK_o8HU-jT;}Ny(8-uxcehTb729{SHFWSr9lirTQ@t4s* zJ%*CRgXyKE$jK@Hu8Se`qJDOrs?k3;`Y>>&+5frkgPHS*P5-(V96TCo@n2mLIhtVA zctxE1c{{T!fmdQ6SSt3Na1R8SQAvT!Xz_0r;E8l5z1y-|seU#7PdY7|X z_uONczCfE*z2D#r3yApGYrEMi#Zc%|V2BElx`H9q_t&n!c}ty z)tD+HTN}Ei1uoMTo+t#GG53*#6`!op$_nd>2NU+GNxk$Uf0d5-$+^LlV#3zoKUeGh ze82D9{80+V{gj)c;Y^|C^57r4$^VAp2Dbl6PZt~PXlOq#V;*@Z*p}{F>)iahc}WEN zXRhhQ@ve*`;MLKSJK^>XncLLGcS7=~$V{%**$d)BdEZZ3W9loA$1c;}V%Pkhq?Filbyi1t~vlHr!^QS_c zz+k$peT^DhYpIcYHj6j|7VYov7NMF+U(0UxI{45ob?O_nYF}V{GbSQh!eJ?5GaL(q zO*Z%J)lN{Oo0JYay8}$ZdH2A-6g5DggqtKaONqUr&nz<71A#mfagA}7$XrDQ`Y$X_ z*s;2@GCJz5jww>?YsvaV@JgMH_adRLy>>WC%Agn{<|}pQ^Zcpu>#f+vc5vZ?xL{C z-lWv43H+)gir7kK%ekE^-zIY`K0(nls!f6<6pbe?SIyJQgh&^2aP5<$`2`ZX@1Z)G z($T&oo)1sZ9B(DdgjCc8=4$!Q0TN4~g~5&fkit9e=am%1?;6On+-DB^W^au`@mZ@q z>RLKo-Owq;%mJcmgpEv)XT~(arCOe<5SycU*`Xau8GNuu0ms+RnkG zLzG;&;-=i&R!7I0F^jC1P5eC0Q1Xa7e)idU%>B6V_vV#5{RAb)NbA2}P}r9L@u&Z9 z1cXHVL*G+1emQ56I_rA69cRKW{KBMJgd~${AT-f z)<#2}n8GX7x6uRK&YT`>S6wcX{U`1vqZ6qt-_3$E8+b9pMl}1!@4cd_UI9b^ZGl<3 zryC)sRRq$%E;DCC)hh6@IJSH8zGB3SEzz_D5~!QM*GK;OW&z0`0z^(G3j9AmU4E-e z|9nyiUxxu_&lsCYIq|OL4~&Qw+AR=8QpzPC1}BiH>#h+oU8qu&nSs+Mu=F zdtG2kt|!v+v5^wW4@`^5Gf!PBH@MheUnb0u{pyW*1ZEJr1ldhXuuYU^_M6e0t+uR! zT^VByv^JhEuoqX56^#uQ;Iupo7#CV^F{iT_Mx=^I>+MU#v-fd;OXF$A^WN%)!Em#b zR~k0;o#J~Y>u9yQc-V2Bc0+lPGlxO)bG_Ez1~q8mcOyu(E-Y?peC!CrZ!!JMpSX8#x^w(NWKU`*VIIu6&)iTA?K%&!;9VKILwy4j3w)}0b8LBx zH=plbcSkq#)?%XbHGY3=5uVyzn9T>B{#O0}_SKV#Ai$DMN8&m@ot{+E5#g}&rsjrp z&1LLHA77$0d5b}7RKX|s53`i%3G5UebN&e+IWA1MOjH9=hrmFaiD42rwJ*1g`i58; z=Jp|zJ-)Etx7W9w<^FtrGJ4pE7s|S&ODU$3b@21M-lcB* zB1Ug-d^={a#y`HKxKNm*i{FN9jXL^=ql8D~L~IbYJR+lQK`F=fnK*oZI=~-M4w*I} zJ|RytJdgx_pUvkzTY7%m{SoRP2WBGo{?|ct?l4S$q%Yw~ z3j<}yVXN#R+3zaLq%_#U8(BNn4xbijqri*U>Q3e77q0EC;h0DE?Q;jI;zV;%2=Y6Jt75*^W{n9gqo#Mvo=t0$suM)uI6NE&B!Q}TgR26&nr;@i ze8FiN^-U*qKqIPs>;Nh*l}&0iBX_RqEvyI+~dM(xY876wRrn~SrmZG z7FrD02Nbc-m>Y$vG1i@m>^UrxMunNN?*?PGdY=A*9(eAsFa8teuGmmC&eUz_8RqFf zhuet|HrXHQEd`D57+8=@glvR-abUV)w@4-}w2^Z;f<=z~W-?0WM)Sha+|Z-eC8 zb3TG2%{i_%R7&wxOs*vwzg=A)g>HTX*to(_BQ70qHVve@fqo^zi|7_ceNO#b;S@I) ze=_Kgw$7CBhzC!h+9Q>G$Emm)NE?x++kK(0Lc@f;32Oj!WTjNw)``<&La4RI7Q0>@ zM9W2gUi?}emY=cf{+t;;Fa35SR0rWqBHKhfE=6zIca9(TquNlNq85xZMDcRoAaj8< z@LX9h2n*Lnm$)K*qjWq!pKop3Q=3m6J`O1+3!vY8`+O(RXQKD^&T!P~peX#LX0F8$ zhDjY+UxW+JkbBrZW0MPNitxyM4ehc=$h(LY)Yld?CObQ0x;h|$3HUCtmU|^(u>vHp z(`zJxdd6q)ghLh`4Ebp}-S)|XXKNNcFx%XIa<8V+eMen|zaX8YJ`8F*QwYEQRlh9R zOd!SbBo&ST?J}u`hBcn~1){7FJgTlyzUkqY0nF3O`n3#QH}i-+so7AelSq`h`(Vlc z!Tn3VRxnp0aSrjXH?z)YKwlQ1q#o?8TehG6V3{1CxL9D8O=o|}JAB0%#F%hI<;313 zB8C~07f2TrK}!rli%E%%dQFryuvM#GaEHCBpQy z`aGvr2pZFM8SlJayHv*OR*vshbXsqmA6UJr+WKF?cF_p}{DEs-9uXoXn^xg#{$kAm zlB#!%w{SBfbVY7Pcd0Iaz%%v9;HT~#WPUrYPamE@TTn;2i_>`$s)byLIDLL%xy?IK zt3l}4E)!1vYLF>+7WA3Qo%~Zg)B#)!kktKsE~)ZoVyKcgJbv~iuul!>Wic!|bXkAB z@MBrGJWg2lSFD8fE&x&M zEZ_{ut>L*_Z*BhrOfMeDQz}l$GT*9`maFESeU67E*#8Ir%Q|CE!4EfDF_HOR0h?!1 z9PutO=~|mS9QEVecj0{C;ojH_O+SKSK%VZ9Bq7Jpxp{{EX-+Z@(cJuCHdLeiQIx0W z#9?k^`kD}=|1+Ov1 z8i!1bB~po=Ve`e(k0tc58S2MTd(6WI;u_sJ)U=UDn`P*4ypbCY0FVpx0;taAnBN~s zdrU;iudLJRY22JrqP+vc5zWeFp7bs%nWSPWiSp!PPBE;-jX7as{=59!8Rk5%m10i$ zutnRvsQX>Mn@-^`fBBe2oJ`8*aAG=mrkFfhCofno2!PriLRrVLW=i{GYUQ|+bExgA ze_Xz(IZ?iDNq3KlF(RFB-J~Am;D`!Cp8on3X{$K$(AkUT7FvV|paj|On3gH}>*V}indr^;&PoMx!mZUjL;NvoR`>wdIJ5b~hE3d_ zl12dbN1Z0H#G>#bEu1;yn|+-RquPR3T32sJCu$uf?g~*CcD(lNd$PM+Q%U8vfgFB9 ze?XEzd9JiR4AP&5qM45L!5EeEQG1HIFX?di#Q9aTM!RU%SGkC}%!E_bfLB=Tu3Hf$8aa_9Lni>^6!&{-#Xztj0qd zFUECkP=$P(#M7wFdMyX(ICr{j*uX*O%z}W^sAD9< zW+n8m5rk#pfpy*zO@sxrjIEmn!&n!QLDW&ogTg{{Z$;wDJflueYE`>(TLn4E!3aS( zPsCl$h?^9_l>SO!DPRPESjo5x^{EJBo+2@ar)&{5;CSwOdKAaD2%c4Igf4a}J03(u z2`q%EQ5s{$x)YYa53;u(UH+&c%sJ<8O^H&OfkGEEh%DVH+Tj$a}(ZvX}Q6`>uACfveYORD0 zYbz^dEVJqK*%t^c!P%m0PV;%`Vr{6dde2-d=zYCq%-P*-LWSrRK4PtorLSPmhu1*UqM{NzK!2puq?&(gJQiL^kMxt>(}05MLr%A z-QM~f5h@=G&c|sT?_*V=3Bs~@D&%3H5!*ZFb5;8{6U4cRnT6l}wI^NsCH!S>%J#u4 zT@D-X4!@FZci)<;OLM2(evWKROR7@;8`ifGC$}b!*R>gV4EHf@vpz+N(%h~u?eSLd z@}uox_OUZL+r0=K33Mlcgrw(v0+T91iYU53tXu;4|u?WE@d93p^P(zNOdQt%hu#HY4{4^@CCQU?*G>z-TQX zNm6)Oogr7$9pr%^^@p+chy|g$SputYJ0z^QR9+5@RB7_Hq`NX*X`A`Q*&i80IZbUF zLm2nUrt))5jSSWAkVQ`6wSveEdgqOZPr@L%Zio#Qy`_I<=U)Oh{Hp$YlFTY1A>zer zz469M^UBMR)V=y!o)+$d&J{_pZh47E&L+a9sM%wfQ=V}u?ws{RJKOg0Mvr7Rl^CFw zI08spX4u@Puag7rt9vHXQZqv9KfgFJK?h@FyM%SnU)A>a4^zLxY9p%{&JrzV%a%Yf z7@N1ii$C(8`H7FSz5riPm&Shw1wIFT*~OWw7FB}VgbZ1*&SpJEQ@mfGsvL#CX zTaqO(koGh*#{YlO^%f0Soco@FIz|V3KuRd6_)XyAihx3Q66@U?SEVI=w;7;2@)*#Y1Q!qn(UCsP`GGd_%ddct4j3BA#b>d>d^)Z>hbsFRR&(b* z3pf*%Gy{vX{!@(6NHeaZu1A})Ik58HdDoi#f_X*SLWDxZs8;M#<$2APGWv$C+{!Z% zcCxq~uxW5NdjIJ63+s8`^Ky&-`p0iEpKdfTTAl;POyMw7u|PIs7&Kf9%3pb|)TK7X zcxlej4U+jA&hAes3Aae~`Bn8l%$yJXdK7<>FTI0r;3^Ue(w;6%A@Cp`1=KP}EA|?s z5LA(a5L9UL1yv;r>Z@-PY^y8@% zyEuTdkq@X#9~!?577wg#thIX#X}hhj_>?aZaH;L1Rr<6s)345+kY!#81UdfL_{0e^ z1vCivz~%2I{RBpO>ssG@4MM#N!o6(EdRe6IneWO=Z~1JS(6;%S{qLogK~w%H{V$SQ zJplq6{?Z8-2&eCrZGmx9ogbVxtmBivO{FZ3wfSz$by+`{Mhk?|S7Z%wmzJdNGmNh( z{7gnJ(gh!zjdp8Hmp1NASu_u8GWEX1PwmIik&>G;M=kXMOj9*DxqQf zDSZTWUmU9nTwYXZD>Ago|dc-@;yddgdjba43mONTN%U{}h{Xa-i zr6Uh9qGR;!d5BX5dFKz||z_ZIk8%Pb6iWt}tD6({cZQhIx5HpkO)rA<^-c4odK*7+}1WD#PGXZoA zIQcMVIE8S|mD()HkhC;odsRM)g4{#@BW_D@BPTu94J4bMtC?0ZXWV$tPh zw<>M3TcvU#{sl-I{hkak@ZP%;`5vV~NG|Hv(hyZoi{?6$H$kUcgwdJ@ z=u)j#Qb??3$zzxNHebwoIw=0rr^aZ+4b(;S#4G%;kd z%yB*HbJuuWz^qIi?;PfJ5K(Vx@S*aBE0{D5Cb=YgMyD5W>kudKxkWckMb{ypcLLGx z@(GV^=)4gc(RrEEjT#YvdRDTWErz6qs`7#qDpv=PKU5Zqnm*NkExtnvg?2tcodg zG6gjs^-IQ1evd2@viM7-m;1trH4wy`lU<7{2-!9gg;E0;7p>%jI@s$HNZc}k`oWms zEZCS$k}MYf?6+`iiFwm3(G~PQwC%n>dJtCOUie(1;cT4J_} zV5)}LTW?6&%ve4)4$U!Xkn8WK;@j2%yAHFW$q zyu`ZJh;PStwCDmH&&U4A_f~VC zJ%VjAEkaj1?nk!~4fh>!cd^Iri~YH7yS%?r!7-VLJ(A1s*Xb#xwbUpII~jYlg8auA zgGkw=V<;ySHO%5T*9)msg>&*Vmx5PAs30b{{ZahT%j$fsB~&VgkNF#!MhFanK);Kt z-@I{tf^`-*s+(n(1})uwQyIT*L(n!L=v@ z^xoUJbj()2-@9!G4i&b&jH#rr<}3^}&-RF@Hff(r9BU0WSF1llr-F5$i=Rwb5oeku zx{nrq=_4nkWZy{2a%nAJ7MKXF#Vk4oI!YIU6jvfM9#tdo0?uTztadF_{k0#n!BObc+V1rg)F{qctOIeDvHunZ7Q+!%Ie8P)o%bxNyp?7m{w+HqsF;;2nrF z#G=3Ng#n!<3gv$dFr7;TX=vq_c1j!&oSvFggC) z1hmTOb?vB6UHhzEcU`WCSvcgmDo8wH5w{4Iw4vpwaVXmuwo)$&$Zo+_4J~ssU!v@< z_BLvn6t=xzF0hLu0k9afOokl3es2i#QIhfsy6EpG<@0Ok{08ltN9d#85zzDCA_h&l z60a0DSGg*Dz4N?zh!gl*Xp#gPDOFN5rk468D*o$H<|o40t1p_EA_I>sY(StQm+zER z*bArY)h-EE!;85fwtri*T0OC2F;usUA}&~aA#39G$DeV}l9W~ouY7F2^JQoMEj3Qo z9cOm+dd$Ie+HmfhNBOlm^Qz{tO%GYzPZXE_eZk6LhdCS3%4L3LQ(m03U$W~cCrfUsCVido|0DX zeJ=1P>=FZQyP0G2`b5B``N4#++09xpCd!>wrrSIIp664$ock%iAAFz9G0A0jVW)+#L&kK|96y!lCFQ=uB0F6ImX`Af zhP6lD2Ae2>Ua>^cYP07;WWjV1(JM4)G0yT7i1&ZI_s zp)ae@xsgqkZki zyD3@TtZy94=Ku$bDf%a}AB)@V6UQENr88c4g}J)nPaZHmWX#|#M8`FgigVcGgh}29 zq&Bv545>!7z!ZO)(&%4apk13e@xAI9O5T_&c|IMn+TCdVBc?Ao$9y*>_i=Tp>edm8 z26AOQ^oGuYsc9I*u+4i#|N2wYmoN1M3s=R_v$@-y#FDLXRQNU5&Bp}64IrN6OnBE6 zT^xR+SZ6y>N0Rs4Wh;=YHv6)F|2Li$kmZIvtQ%pt#hbwK^l@_{em%vg_AW zprq189Cbjzg{|sq7jr*9t2(q&;-!z^H`*>Ov1#V}U9SEC6Qzn5Q9&jlFFIgP-~hum z2GzuQ1Kf&9*6_VmX#_AJs@8xJ^Yr?leBPb)lH@d#Z`-_f^y!)S4%Z6CB`8vr0tQLU zz`N*-bY5iDG`flFwvgL7~tu>N2ASuVX&8tW}=sk-SoI22>X@`Q1uklEV6p+qnr#N@$u z@_D)%&2@xJK$SUk39a#mA@c(I0b_@$oI#Y*nCnqysw=62no)05r&%l4Ohm<{zh}{Z zfZ6}1g%AxC(SCHw-Sb=c_bk$-01t2u;h_L~`Efu%M0HR9J=6`? z)!Ol2;C>cK7r?M$;ZXKYkr%nuEQ$~X1JgXk!ibM!+Se6c1P7WW-m?HdvYULUy&X}8 z(+EQ`o_$tJ0prq3$Z+G)qsv^X}-;MO2%&R6#X2B5q#P zn{ioD&s-g|0gGhXYs9BhS@F#dMdf>2;)kk5&hYARm{o)KP~qGg2DOnt=0w+q1a5j| zfpwq|>pyV>1Z;G=wqw6|k>FXr_XI3pX~4t=z8UekUf}82FdfmcI=R7przi9B!BG8n zAed5x7$sFlv|1p^FGn5QsyKy6(ARyzz@^Hl6!=!+&amaEM(=r zC^Hpzi~!}$4-J@1Hk7Di+dYq&Pg@(Bl<{I{FO>Bko>{aCt6L;?)e;pviKdr=!xq=3 zk)Bjl6+<%T#J%DOn+XqfUnCpwnwDDUPh!`;eUW5foKY38`Cuh^d)dHJc5onVq=%VR z#W|;>xR*NnI=cU8&=?7+4 z#aM&mMS;4i&>yO1GP)a*=$DKbD^3Q0_C4zw%P%#p&vh^%Dp4;w<#AS`xUj3TymjAN z^~1it{xT?7_rykxur15_3h*1Ei>9njQxDK~5&pMQ%^*~V~E(o1v5PVk= zqQ4c=8Q<>4tY`6?^B=s!FG(`&q3PHDwDJ|y%A`FI&JMNRDU1fe`cuUf0E&UVo3YyX z$L>w5gMtsXFf~L-BJjHRq6fL0d`{=u70A)=AyR8~5E1OfrM= zISnUE;zA1gN>a(~#4Eg%PB!(!N37X!xLpPtENKA?#V(i2dx*z&rb1bHKAO1(B%%{1 z+sSA=mc`9?*PtE0m4A;DUU8_8a{A2N)xgnzlBD{lH~1=E)sO5K(vofM(P4uHbNI7AxEsZ#6Lu6kpfXqq=vL}FYB z*Ainn070HI1zcLj3VTun?YI9fQENOyp<#L#p~e)GiC zn1Y4#DSiR7oc^e637URDZ#`oEP8$I8FwOV$nX^%g5($|iP~13pmWV}-1rVgXye%fwCtswAk=`qJvr^5i4a_`gP7Ngc>`Rho(R&dTbE*_snh^<=Har6>%B&t`&6HGd>oknBgD z+iHAg45pk?pjRcG{>tHrjBSoG(Dc41Gl={BLexFg!!GhdHiOZ@_KIzyQ zMteAuU%li}A$kmYymt`6LUx(!B`ucQX8%48V$p{+_l`bT%M+s3nq}@<`WdS2=L*FSEh-SiavOw%@o%1-N`u z>DWb3Er;RiM-Z03)(D|5toutiW>A^`_`FvGr0_qPCBfr*qQv%$ez9^}5Pi~wZY(m9 z`8;e;ca>s{0sYG?S z*`{;JnHYdmyw#W!#z8`yBbUc@JQuT4^W;d!#R1r_f(MsGqmJ+3$$ zbp>;ChwF72aG21mXW7XvLDt>%rddQzdhvO}!9*WTOmq_tl1V!mVLx?6wKA_~U6XFK z38Mpom0QkC&O{y<%7`o*Id?=b_O+*pdbl(%90TIYduFAoFVoo@U(48gEVVSqN-@%b z1=P8YDAS2$5Bk}w?%dicu(=|f_)P9xdd7RM+A-a-`THrE!EaXoQY4e#LtUI~EHqYs zR{bXzz_^hBco_dZ)wsX?hBOWuElUmYzhJ-2z(`4Mc*l`k&mjn&jM6rWQD#*40*;Bw zX^UN{juxq=EG^+K{NYK+d@8|WgK4pn(pX9lA_1sY?w|2fO7CM}*ME6&6c8%WB{f^d zx$Hm^TiXqbUP%01=bs&4bj#^#U}2r3ZOl;KVlw%%h346cQw&)o%3*>F*AgsT*|4y~ zXwJiJ(BWeqL86Xwik+Xf?@*$hx=;)C$J8m7*}5=67!h52~|2mRPpDnwI~*u(34g*a`w zA<{lmKH)Vz*V`TY_v{D?plr36(cACW>jQoh z|ATGx-LL^00T~T8GWA^EVD;k)i5oeP=;Vp_cA&s7y)w>incQ6(&sT7w%l*hZ%)(PfcXhEb(CVU>T=Kic z>H5>uPy58#z+3LBTy72-SbQ46AJznfmdUA3BWiDdHosGyiJV|PWxGy_%ahSOQ!EkE zSnO{4?liO78|GK!aZ1fhwMIF8n? z5})mS<<^!fKd-?~PH}7tq?Q=Wq*OWf#HT3B1+B!wd-6@bzrdVu-bXRM$iYDyOu%~A ztHzo>+H4tt9hXu6-3J*m+{D_CiJp998Jq{>cKAVQIbHRu5jsZryCe0J8BGo-<W>Y>Cy=GQK&o1*_RbgH2c3$FUzlgx?2k6Mgd;9 z(MzJQvCT7dkEL^j3O6Z~n1!_7(m&?f!b`{W66K;1FGV6~q7~Im{Mj#;$xfSI5&?N$ z{#8S)owwM9fg?`-WBF;FyB$vP*Ocb%p$T_JH?7t%nZ)=`u*es(I=#LRCsLM zgY{efs$uj4EDiRswz?Aoi^xU6a^6<72@TiN{t|J7#e(M?$jTxRUG|?v?NZf)Q{Ep* zP;bR)_f75^2(AKZA~7A+($xwC0%13YZ;G;GJQvgh7_cf1mq*nkFKOv&NkAh|p~wCf z1@T|vHuZ*1^;A6>Do$`5h3lzXkB8r4TJq9$kox6ObEMqd7SZy}YN#s0Nb(ZaYJ|UE$)174*wbg?K1% zOjfJ!?8|(DXWM9B8)gI25QAwW@UNjVIL);i z;;BEkK@cuDwZo8S_xK2NtZ~dH+WuQppBQu=sufdG9sxCg;>JhQA2>YFy*#bURD?$oQ3`!GCw-U^$-d|e;(mj&Ld}T|8X+m0A-jeqg?=EHY zY0*9q1nVK!0+Y#7k}doc41W5Miwj32yG)$2mz*T2`J^s|8|v;i(cz7+fu7@^vz~@ zuGA?m#o@$jSi$!`?e*V_5xPMD{G<7`Rm!1;%%&{8N&wl4-isX>hf_N+K^C97w5+CZ)l$bmKVpjr zhyzaGpjKPo?XO@*=P#dW^OK$DyU2sRbz{{n(7)3@)Yui~;CXvroqmuI(R+}t;aZ$l z{Xs4=2N?-LJy_h7&>^Z@=`u~;S zxHgZwv`_|T^jrbQEW)CheC+L1NIeey`?_zxe7hpg3DJl(a(GK%!4W!wDrh0LD4Y*Z z-j!9T2aQZ~ZD6=gWVTJK+BiJx`)m)h>2io>ft3|Lt`p_ ztkoaTH`K!?soP_fnS>L_WTFXY5ht~-{(53xU9{SMrur|7`k&{$);~<@pLon~BmV+< zH^c#ibkWM$I)5c{;!yV^^Fw{$UCFC5G7Ebf24D6g18O%$+0u8~)RL6lhFx)gN;#;U zOSvKGtk0=_g6T@rHb~sHx!q~5C+?-k5S6F8jQm5oJ3S{IA;(^-`#k;+Q|`{FmNC5s z%=dae#H@3aAFJ7u-y0N+>pFg|H|!=}J1YI24h{hYbwS89PVBO&B4R+ZFE&a9LwxC1 zr?ml2h+C~8A3TWBJ=fFC*|~oMS-lfIEL>pOXwC;Be1=ms;7! zPUj-r5$ppYWC4s-apCVj^G&oUUvq8Le1mcRo*h++xK{HoM692JVnHi<46hG@SCqQ= zt)yIsRUI~_8wT`jNIv`3AG&qq7z&0TDkjHMb#+stRc6I#rTaa9Cxypg-gU@wGr}V7 z%76`1Sx>S9ERN}*nM%|>yq9!<5toDlK({~`>jUjZn^VCKi#$60T(V!=J!29e{(~Dq zkhI3)XRl~g()Yy{rge$ri(j21EDmtQoc;L$7UxhCr3f)iV~FAjLt0D4NtWT2j9)(q z9>Q}5RXsvq1+ahEO&bnds7C^*{ESvqQEMj0a=Nlma*4cs^vZq&bjZ!uuCp1DUum3C z{3UGc|KV-00T$hIenWslMwH9UB!Zyb*R%xBA=#&TY0TF!0lSDLeO?b@_M5rQ3#oD2 z2v{&YwvLaW9`U(Y-j1otmH7KIVTsET>GT@;Lf?lRPUX()Q&sjI!PWy@x+=t)=)2eS2MWGAhGIb%~h(20kpC{)mt~i7; z_ax3Q#%g<@U1EX6bjs2&@h$sd;t$C`w_>}p<07mSgi+a*N@h0(g%vOQKlq2hpACG* zVenGFt>Ij$2^Du}kUyQ%oqXH*AGmbUj{L(gKkQS}QJdGzXP(^!oo^>y`gcdoR^M3Y zDstgN1g=&(wP*~#7MF}n5%9<#Q(MWZka7fDWZk)vj%-y66bjotAobne48`2q$3*EE z1_@fn>vft#41{()$`7zyen+`3NKMa9tdQynNc!u70yZ}DVt-R_v?vi+WuOp`rW81- zR)HHg3t&e~?A;!>Um2GiQ-Rg_=<+ zR$!(?Pjvcd$<_GmNBK&fyF9T`zqiKYwcY`hC^5+ySP^P(>pyV8>PKX|k+bp9FEa6S z10wmZLlc8SC7ERY-OKiC+vM|DD9i**@5WyDC#2^$qa96sqL!bVl4%t%khg$r=&v+9 zd)k3@{=Bv7!o~Id9=!C-zE*WtYxAxZ2ko(DhQtCf@9MP|_`~bTRz>9U>$C7&JluVV z>ip2nj19v!%kepRF3JlW07%TLDi(`{7*Eq5>fPZMVZ6$+9GM@l?3OT|lf6>*!-BSc zhvW$7BWn0JeLhT-a_UT<|3$ei@X>2Tu%409@%=?LFK%~FGncThP4(WNNrF$ z2L)z6JUXH`K$)0oDd^?4|<7MD6yWp?)Om2JXq-9z;^TL$`> zT#C1p5A8lq4i6$|)@LI&dRm6-)NzA$-w72(@?GYT6h5o{To~+3{-+(hjsRyNy8>BL zI_j3nyGi)0OCnR$cEd5L(&y%t{0{eZQxmEAy2$EM^9jTPksyF4OMMs#w>JmBQ`=I% z-#Ypw4UREG-B{Ixj=13Gyq)AhW)9h7lg2kYmWHb6rB1t5|P&QQ!PzXxe)O zpR6KIzb$@j;M6?PJM(W{w)Z>fJj>oi_V<&;ed+*Xfi6NUD%C5bu;mQ2G5eDl@@Mcb zsw#b<&u1Z;b!L<)0U4t%McA<7d=ZmH0-2T&^IbwMDD5S+vThHLGeMa9@tGynv(Sx4 z1lDpxawFXwm5;V5yHr$o<^P!$pGyK9(V8&Pan8ekMWo@+_n(N5PYS{Zd(Vp#3Pt1- zhPFH<^Otm65r6dX{d=cZI^^>@me5=)b*8`DhPfB(aC0L3=w0Nc1$o43i+axCa@$3) z)UX%+qo)(9kDiQA$omDYvLZIcPa`ihj1)u4G(1r znG~Q1_F|yA%4{(GDy%xi<2rk!68-pi@qE0X0zU}Deaw41Z(gL)rer5>5Wy$K$ zJ}R-%lY4JmA_OAMWH4}GKvk`&7DI{nVsI?y^CZvV=F!yUIdBuat5 zLMT-kLP*U^6!`Rmza!mHx5J|Kh^izc6v`MWeTfRWY(X4Y?p%EG^YFQvvc&#qan}2Q zG2JSV?tE&Ics|Y1btR1q+0Bbp?ny|jv-H7yXJ=(>dgQ(tP*(JQg%C+P{!u9wICr{w z`-=6VcSa7|bhw!}HFmKP~Q_x9Da?pNnUpdg~MsB@n@gM{m?b1HX|@OG#& zeUL2hM=icJ+cec$xbu**tS;4sfR;`^wg9Xc>z5Q0`P5?p@>PHbzc)Z(^BIyLBwBv_pF!iHlb!6X9}B&j#yaXtk`)3#et6>b$6!&i`$ZkmAe(SYcM^l ztv2+#Yh_E|j9^s`RNyd~_$I97g3-dmmCA3MsSt0s{~hiezii6%?w)L_+mhKr^UwtTeORQgbFHFB;0&I(#_#U6X81A^_kla*=qpKpN(Dj;B% z9Hx$%I&11W&Fv?cQ{YApu5{580&?6;GLdx>Zh(tEaB}L)i4w-|eEq$yr^7Love56` z@W6OyY9Ye0jJ-J=JukK;W0EvwmIKPs3`=J|hbMX50!H26E?@?yMUvs>m~OiLBMRV1 zVByhH*U_~yl4PYDJ%1Kr+o@nt=y%~Gn|)mzlxDotY;(Sd(IZuT zyNj426lp?~TpUpW^i*w#3xlv!Rv#RPoWT2Q_yH^x9Nl^MF6?s!cW8azx_o2dmOV1x zPW1Ep2cV5x1a6bv;Pv-^MWO@Qf+pLjO81`w*YQLQwq>G*_5r%oGqZlJiVsuJT&9-p zVec7dt|hH3_H;#ooHB=;xU7>t0h9@^TkI4UrM7NF|Co!sDZb6}D970~zJ{_Q_2G5h z+TlV|UM88y*h)v>loB9+fuJwzZTil4NyHk z#$d{Ag&uaLxn~!+#c#q~iCW6qOC)L5VrlIwU7_tP9;Vu)LpWm6L3~63ekBJ+9{Ce| zv0g+1C(%_rRmGNyWGymiX@K4W@mJggit(Ko&)Wf%YG7g6v(gB!Ktgb3(vvsX*~OQ9 zCF4=1p{Hy)oC8H=fK*0#h%o8UY}uoZ^^~NY0@!#P;&iqaVT(LNX?S;^M-ScctG^xf zmLHe5;JA9==_n$Ug=Bs3gZw^BF%v zge?Iav2N*2q#xT&XBVy(9mlt$;y+?H|0RNSQGzT`X859MtcqPj-OXict#P&*&Hp2OBv ztc;JeSqQ-#E`;73rnSxFje7+Rlmqhw`ZY*Ir%)vu{0^Bq)F?Q(@6y|o`-55z$^;rG zg^2jD4CA-%zUmL2W|6;gKvOW5rLIA13T2Ut{0|OH6PU zt;NzEdNCw$Pv%SX8zgNSCdX2mV7 z=67G62&&$bcyRj;^3}%7OD05?B?wnG6&SC{EnDN*zj+RzIEO@X$YJ*V zeR4RQIdpj|88>+n868N%eNqN+d!pTbdfI3h_^JxF=F$vce3U8(Nk#5&OFYE1S3Bz3 z9+6Q%j)%zS*m4jBTGfD?hw60EVUfQJtr?c`Yf=xudYq>NzpHd3_=}oPuGp=!W2B=& z>!nVe_u{f6=@+l8;o7wxVNZ0*+Prp@j$ zAq1Uz+we`NU%XMac6&d9j9Z8EE*J(S$}+E_P(22JRri|Q8YdgjabeZLV!A((lApI$ zuYP6J(mvOTZY1=pZ6(#$!{X+*-(d{7aPe5lPy9csmIoLH0kF)QMPq9pl^LbQI!G$d z)y|%LH@m3v3X>cvvN7jPPqY@%>rfRYf*_rTQD<@?XqWpwjTojXl;?CozU6#^3ro|x zvQl^;b&K7nK7XU&@L8%pwk^^-YgLWoDCY&r7>E;u_#+fyGNlix6B=LpR!&hbYONU@ z)>l>GiV$q9rP&5WYv7y1V#cqoq**%ZEX=EJ1ckIjDKKIfwihDZ@!j=*X+zmU#<+FG zNHE+7FS~e*6-yZ&KD+B^Y5x2W9zTMC=Du(~rP+h!Ow(;qGMgAS43#^a>c=0R<~~uw zNMzYuUSsP(2r(=>)$nDiFY5;7U52PCB*$H9=h0?dQ+X-*<}Hb;A7S8#_IF+dj=n7) ztOkNd0d;hyejJD^Qw%96);0o+hz51{yJ*CYtc6%uAE+KE?%s!+y0iRA#3qyHb?2A~ zHW3_kgD(x%*K3#B|JkZN@*~S#ILV^_2BiLuIXJ+$$}_P{dsz%YX|z<$V0w8+T=Ju~ zO0<90PKfEo{GSXHKatzpi+(=W&$}H~tQ8Ge_F`s#ymYedfqH%lMOsH579g7-I6oPcsSpK8ouS2^6+XZKa8rGwdOE1 z7V1h%A}}^rqD~_M*;xdRaYT-HEuW&@v5k}QHb2CG8KrHK?iSdT+`5C-N(BVUwo z?MZb|eiYi9<(DRO{(A2GkCu^@o5?|>D!3^W{%K6c?-qnp3{ow0o78gi`iQ;o2y(V_ zPdWET8qE2{G5{E-`Hq8qg(F{y<3qR8Gk3fBeI~&xD&`MFTg6uQc&j}iGg*{zU_LJL zUy!%y!7z zzcG|ds$1xGEGNxe%rq5U2B%P~P^Rx;tKuJxQkvEg&4Kzt1?hEbPp1Dxs zT1_*rYJdHugT z&)FLm!~8Z}1iw4}vRalnNJqN+w@G~ZqNTP6DhxP?E0 z_%&8S6-}0ai2TR0GJ8v)kTWfSwkAv6@d2Ymg6Nr9nzt$yUcA0|AUtE`%kU!^vDqC+ z*BnV>AXd8>_uf_NVs~vqq9bhf7Al6&lwn#jjX{GASnI`SVOawH=2IYE+^A{j<^ctq zG&N3tF`I9}0ef!Mu`|e3gy1k~d=DkWOCV^;F&HkZzs7GizjKB@lM1;JrTz843g{+H zNafMd+v{L36{rYFiv9itLXCpy@HI*sRFRZctZnMRM~e}DPw_d_+f{5=Is7}~xl$)W zx+{DBvn|H=H)tB4TxFdmx#dy^bve3B_gD$9r%7>^(&zWv1A(gFt7Fs)&2g{CYKhTGUjLa! zZBER;mj=^n1~@{`$f1$yYGe2;-uyH?h`g z$$6UF_dLnrCr~E@)MSJ1rwz}tcF8c@75}f%-{Qi87MA4E z_c<#jUvE46*<7?r8Ewog;)o_hB8oRNtAB2yc3(h+-cRHL-lIS_uYf^^^uJa<{2qY;~2 zvDFiWFkmyPudg959((znTGYGWQuT>^5dsZ`W&FI8EILwVU)L@q$6;qWtj{rp*c%$f z%?d19jGgtNk}NYOgtyAKI5A6QG%QqR-~4TNtV-qbgm;^B?wd|mBX2ztzHEO_l%ZCi zr`>*W2&#i8jwYpV-mBq9YT`zlVonTm9t3I*`_xNybTr(&^|?_e%;8&_NRWvQ@-cD~ zwhx0R%;6mYaLav$TE0(Y`cl&T`&!6wbs9PD>2_s9AdjlmXPy_pY&#wUC%QX1U=C|b zh{1&2dnJHRKJ#-A7V}t)Xoqicr`I;--GH5a>a&Blj+UVXBw#`8d!(2o4wKtpLF7MU zPRHXTUL9)q-YxzFZSio7OdfCI>LLoKG``r<+J-`Gj}`fW+gc?$gQBff0y!;ZJ?<56 ziHQttKOy1z`~)BecH6UimXbIXv)geo*`HIcWR6uQo=13&Izsc2o%2$i)gI zGT%TfAgV(jJM+5_a4z&~VU=PrUtM&4UULT?QqmKp2ir{pXyPpq!af#w_4G+22Fbe& zIaGw0e1b+c3=qQT5IcGD|Ga>2e-r;+>j4k>|A$YidOEzP2oO8?4<@7J&<8Yb7C-$%LtpRS3PHjj2I# zgA1q~7Rf<%r{p3#9%q&yh?6i$xTQiF|+G ze?vT3h3~HQB{feJBCzGClrr*(cW8|wnd^9e&^mk%*jj)yfuy*G+@hvw2CJi8#qZYd zABZ*z^@=8)J~1h)SfQVt^UL3>t(M-S>-9&PPXln|!(Oy@T^;x&c)gQs zVSI@9h}MW7g8usJvt$q$7%rc)1LQhjUssvn^@~e5q{pK*&PO@4q-!9e?OtJ{R+Y}R z%a}yuC+|zPH^k@UC6XbXi+G@52|ECAQgcn_=1b|lCaDl24|RoNJnWM_c<%Y5+XS=o znbZDVelPb`1q$hz9z&?BSOM=?4-#D8EO&8Df0PIg_yEV(xYwr^D{sO|rA@0U?JNRR zYm?9Wl1O+?UD-2;TF^efo_lZFq}OZ^hK5Glxn=uX?6O7(doe-Ii0Eh8R+<@;RWVyk zqX?7s-I;`JMPIl+N(7xIPz}XOOo_5sUPV8-=~ZeCF>U`PaM975%^8#=lHnTJH|$*u zZU|G2*JQB_%)oRGKBoar@OHpE*h0APpDj>m|7gdCZn*&5sQC zYtXEum=L!Xr$iJoKclvJrryBWdL+TNmXW>s5uV^HjF*?PNZs+SeB;)9 zw0{u>{!+O--2PK|dxvDd4N5Jcz^%EiXt8&qZHr^^_?Y=3UDv6nVgn6m>$IcV%6hz$ zQh%eHQA^-c*DjoF#wEw!@P&qt2(Cp9uLgvjO$11}#e^O{){n=v|NOMG@TWz^Qd`sF zWxb(y$Mg01@85yGIzmHo*_>Z&R-lOp`;_KDXJvnAH{6-<) z@S1R$*|%C(XIGXhD*3w4fTIex^My|C8oWiEN#mBJ z5B-Ihy!AxDvWj_nNsj&SkSM#la`b^~v=5!+Pi$~l>Z0%1%NkP!_usp37IKC<0Hzl# z94n?OL$GQ2|JcR+R&sqVIvjf((7)Ph&fbK2YMqRgyO|eou9fx)kP8X<2>uJq{QWXN zv;4)5ERrvG{+AfI2!I**(gnj0uT5I3DiXYfMOA+F_Ow#Rr&aI?H~grIcmbsc?y#d` zHM{fMz>P4~q^2J6O+nE96n~;&CAD%V{X*>*`wvw{pTgzFUNhM)8L0@31Z#W!4S4e_ z)L;kP5}?sGEraN3U1UuG0#~gF)KC$*6o48Gppc-x4f(309J?W8ehUkkJ9l zWSUOT*an#K99AI-$uEaYxYLbMq2FLB<}r?zZOqbu{!9+RQ90Rw;lBHn z?J%yML_`qj6xMqGTzSh%zJS!}v527ev830fi+Y}WsA|w#&O$YCSW1eC>|M#~e z3D&FPY~Cz)>g5v#3DB<#oTdIgFM0UY4@Ixjq85Mbj3$fFuV8M^&!$4Zv9GV(DOwoW zp(y=5x%Q&#{^G5#Z7G&JpaIETdU8`(qeuRQD)UiL9c-X%kG;?1)k4JKB>J5ZM(nK#o#vnEjLdm$Q8x)PERn+n_lkd3JB> zWu6!hwO+iR<&8_2|{ua(u;;q zB&61gLzu?bGGtclSx^@MV~J$lZ*Rl)npZe2!-R~-4ePtoQE8z1QYpi@p*R+9gbPXr z4hvO)U?q3eITiFTE1WOP5?>7;x=|I-*qnyd?i{0$%hw3)nLV8VQ;bB(XbTl!;xt}(vB zTfb2T~SC!t1avii9={&E3&uT`!Ja7atHLIq8Pvqp9%0@o-#i=9LS`v5koa#t-s5<`bB) z37NhGe#SLZN!-^okWtKgQx5?qdBZl;=6GK4g|6zrsZUpu_$+aFud{>4shr@ zAS)uo%J>>Q%ZvWS6@&4E)P2N1Q#;!72x0ozr*eVGT29NAc0LPWCTvRyTwE@J8IpuF z8yp`KBr~pED)GAKl2J`9yFZ&nr_&wiWk|eIQnc3y=B#Y7pLyZ|4P?RG)a_q5ZDO;e zbAf2Vw5~zWjDAttkN#ido0U|4jS#@mM5lbtA6%p~^}Hw6#9&u?>9!ha4jA?nM8{tG75O`JMp(v!JZUmFL{;mjxq z9-Gto=G^;WFcaA*2{6ifaiSsqfuHvvZTtjRP_S?dwE$1S;YhOCV>x{i)f!Tt#pZ}X zBMR4COabARTHHs{N==R97rbkkOA{Qi#pQUcik^1kBlo{I_%{n+vGL72{O(+6kYJvp zb(tZO25PA{MGr<_ZmOUXXR~JWFk)QBE^nulQ0I;1E&9IQ-TcPjE0fyS91uLww^w*Nk#acbF+Z%DU(m;?wnX7e8nkc+kD$>iHIv`5E@R)* zJe<%;Ih{&L;h2A;&Q1;Uk46a60iL7vgtRVVbkq+p;^X+3%=zSzf6U^#YB&H_w$fQ1_-O=bA#TzEc0(2N;D5_9FBdba6DqVAxDVTaX14Tw9_1HHO1 zA_Bl}&okmLJXO$q)t9DTYxcw@c7MG*&wbVds(i`F;j2%_LJ{Yvdf%o4_(!r*MvWNO zN!^q}qgR%eH@zwj&-p$&R|O8AUX<-*Tlw$p+KYw}C^q&uyor0?Uv%n8>0ex$$s(wv zv$D(tfCu+6gs*K*?8!|a z_o0_wkNoYg$Dr=w{@;5aA0ZGwb^vxW`Ak~8P16+RxeShGW1iIoSsfj+rp~Y-=}`jI zZT|ENZ|&X51tnjzOF3uk6N{X~8Xd09+Rv3_&PT;crZ)VY@?UIaTzAW?YF3Vb>gG-z?YyC>#r-t;V z?ci$1jV6uzG2R1-kCw$9?So49fs& z&Id4_^ukari_=wq*ekAlG9h`dN`1DrR_-~w?O^br`W;;;x`s4lyvp@bYupN?Rr-*U zLq5N8i9wU?M_Ff8U7nr^g7Ie{+FkQ#v|(By85-#3MDn*pz@wPn>x*dGQL?G?vguvk zAnE}v)4LE?cXKDeU|zy~Z}DEtOMWVjzuoQpK0tg;^6dZOgWxLm{T?J8q0NR2&J?d3n7ooJ3?$Xk#ylK2p`QYAp`NV-SN?-ycO! zyS6m-<~Ed`qIUUhJ!lpDnWfqtPm7=sS&}=wCdWd9T@{`!YINOc(^DND3;6~r(PoC? zArQ(BVY(`;AA^VSrUfgPN>NwCQAn8JjjVJw)ki6I^7&pp{yuqce|-uIW%x>JrHg0m zzGc<{Z9@Q%?&qb-$5IkJd&}7=rT{q1W?7=fk1A+S?(*0RwJD^lvkS!}_Ink3o+tC$ z0M&^Snn7-?h|EiGTJXM>nf+MNh;`)&#%waLl6+@1Y-J~?jG`|aTpE%^0I$K?XO##>b9eH#5)l;t z!019$P07x9)b!fGG+;KTx6g7@eO^5T$t(qef{fb)Q=*a8wCeA&^m+j$R1}?eAWRUB zq|<^gX^cQ@Kv};ZucTz1(44(v zWattYTeM}Bf0NOq7_-Ky5ghtS9A46aR6{<%|1Kh{A(K2w6Ef0{PrsRKyKl5fjo!gB zoQ26R2EYp$k10BM?K{o6H^qouT53juz?Ltrqp3fK@~9X_DhizKhGpoAW){C2*&Ycu zKyNTw340Fl@72)s$5n91$H@C(p|SX1!}IJJRWQmcGz*TqNvS96I^oIT%W35eU;rDu zM{J$8PUiYcPp$P0#zexZs}jhmJhwjsS%A0$5$^{18tgtpKr;?odHF(CDV;duUoxx=1(VGbwMt>S+}dY>E=GlW`Q zwq%C>haMKpQH!g`7U6njFpDzrexM&m_Q+33OO|JLG3lAkeRC$qXFFgK*nw9#)g`DHFF1J@Q{x(Jhu@v0j`-<@CXU;O%h$LV zcPxML1jHs0ebksE_~BQQDi4eEG{$8&ywi-h?A^9fW^ofmqY<4fLq%VkrSB-?#F9#F z2~n2(N+0_%I3K>mw9Qz?!X25pDzs}1bghg=fzUcd?b?LxY$jZmbGX`l7jHT@)G5|UOg(lN$th= zw~O}&WlRyZ$NtbeM=u_-*)4W92?a(lDMAjLh*lCN$gu1QHn=Jq0I{f#aheM@(&%Y@ zU4@RuLU26ZFz*(ATpk+{!WB9QZTPlIA;@gOaADbdF{FR49GDTPzth$b4`$T9@KFDn z=YrY7%Ub<6Yi*j8vWVm)t_GvH9_*>%sS5qY+=#f*uQ&(VN{l4L5Q*~2F{z{8nVG^y z_Ku+5H!zGxa7)_WiTB5&F{0Li#n40fulaNYw|ryv2ZH=af7MV3 z0#?#6)gtp6Gbyx8Wo^TSd4rKlBI?a==jE7qFd-1>WN5XU)wjA8Bwt8rMB}sPQ*gHF zv%DDXdU;^dtoaEQ6w+RMyXT~GfPFJd@ta!h)kWcs)>2E;Mh&j01EWzum5FK)Rb52d z|%(|no!TjBAWS5{h8 z(-u_ExcKxpy2OA5?){VhqVl~!ymLi^#OD^tFYfP922ZW}^$MsyG(3DoWdPnEg zCVk5n@q$PRScMRgH6+lsh1LWXjFuo75?I`Qm~!`w7)CijO|q&t5nL1rnEgnf`CAD@W*Z(|mZL!oM+sNM#ND3^E;s7b1zUWBYk7Zol#$eFJwu2lkcl-6p`RR!S zmGun4Eh^oGPCrMO5T1L@&65lVNE`qKT{YmzS{6V8@f7=LaA4^tK)8a8p z@2nG%7%u=o;YJLroi1Y^Bz_@(W7pe`cTK~P53fd_?GgIU^RwF(Rh$-SQa$8dEg#97 z9m$p*cdUH*5l)0F8^{7(irjBusQb*!5}#C+=uV_~O3S3l6g&i5;M{46{@R#~Vx20! z*0=an0EKc+6#1JGmF~@>ioaq;XkATZ_DIxqH*ha@o_e^xj852o=%=l>7E(NFq0!GH z7fxyaSgkm^^X(RyIaqw+8r-i>P-`I-;SD7)-Mj28Mkcr?{!WVS4tdQy{C6pxl;K(@ zY2AtF&0YB~Yn(yKO#*%EVa+Hz~n^Dffe3C!WOV$`O@PD;w`3fBcrSaofR}(4wilT zeN>tbDjJNM5=PwpJR*~c%NQ&r1)J=-0*8ydoie~ZuK73oDrvi~LNtWU!8l^0t8lyp z*9T<|VV=%X6Xk{>9-W_a9>@HcH*!!Rc@NsfqsUrYtCXg%uR)#|XY2^WaU|KFTZFih zcD<>uZBd}HV?jO1o9-(`&veUN5j*+d-E+!jK7dj0ts!O;6!6z%bVDBU7amkkPHRPJ zNWh;%2VPuydtrxEj*j{!tLyUrjL`J_ma*msZwD9xkcyJsoYZ@D*ztt!}=VYXq3OjJ?7iU;rGG;GagFNkZXeHeb~Xa+prnSQyhxb!7YL z4`x9=(N8zQfU7Z9;+DJfKX0o-7=1NW*YV^Ol$7Ftwb-NviPqrY_ihF4u8Z;23EEDi zElcb64z=2~%N@0?>w;=0+eJl9nz!4`*=G`7aBoL!F0?uBx$XJKh)mGu=mB zGf!PJ7HDcbArkW{n!=Q7I1JV}bz+@j8)(VyNBbN89WqUwQKr+qs#KLtE~WRF@-ykn z?Y1~33|(rdmT!}WC_RiLkc zO74s4CJ6tF9B~}#^A#>JE4!o!Zd3%DyGcRtj*N7~&kN<|cNJ*dN>d-2I`d-p(Qsai zWx^$<(9(EsGx%8w4rL{T24@`Hb4t*oa8$nS$#Fbn@OsZaPCBDJS^dmh2$EuJDV2oZSJnn zL5f{eIki?IW)3^0Ku&7TON>;yr)H7Ftf3q$VQ_3{&W6XD0{^ge#zohs)`Um9r#2>w; zkZA0ZAU!iQRRDG{eQ0(*g&RzR1yT8G?B|+pIs{38m9vcyb?zLhy*a?|x6!36hi|k8 zYs*Mfg(A8HH_6@Tsr|3Sg%|OkP72oXSU*L+twG{q(sD7tqAc|G-mG>l3g z5>_s$U8(v4s1oUBfX7h+$zi;T$61k> z>8bm$v}%HM_YUo3flc2ANW6?Tda#L6q2I)-uCc~8(uHY8jHGlQ))lvoaVG#rSVR2m z;MG($dL_(F0hZD)h2$Ke-BFyfLl{QDVHDshEg7`iE=Fy(*w}6K0~;+`&jH&itJKV};p7H(IH=SEUVMq~m5MR8gt3%kX`Ur(N!_$H4SVvnS-yR+XwMH>N?! zaPfE)^Jz||_9Dqo`|)GiB`s{adPS3|SNKN5IGL0xFpA1B!HdRUd=#f`0~+s|5<`d5cCE?rqFlY9%<8%Tr=n;(ui303B4VNg*oo z>y1^kvs1CfaIEAH@Q#1z#z=I<@8KGiiIMMzNU_0=7Az3piXOgWs;-t97rDv^DXg3D z{k$Qrha16l23Ct68h`&M5*8CF6G>bO6{HN4B#BjB4*o~idSUEw%HhT7;^%)pmxc?u z;Nd6|tYU`cD-vM^uyA$BU>MwtAY<}jrD@CgcXht|eFkbKnN#1yEDRbR*@EDH2F`*q zqa5Q?bckdXd#)DCf<^LmXsS%%2@7sn!;6JV0dcSFe)SrLb+-A=tKs14oy~)Heqrs` zXQaKV*OcxON$Ec4*8Gqhv>3DNGxbUn-b_V|=*j|(^vJq{A<^` z8uIr}J8$q1ZW{E{J-XMTsATMR{72F)qX-onl|Y6W&LhY}8a>RZUvU?7@Y;hU;Jj{@d*jXj5qS z2kNDs#|4$TsOYK5Qj4GrbI2rNA~ePS`02aWXy~u^u(&HB!Uu|k>QA(FVy`~Y{*RNu zx@?q!NilHo=~BSmHmkvw&7D=}r49{I;mt*PU3!yl9&@S`V&lFcW7hm)zj24e(emBp|6gzgsljX_YKB;t~Tg!O=+ zI%{I`sClw?G+MWo&lVR6;~WA!;7X$wK4EbcABUDV{XdCL*1ZWQL5Bk<-!mw`)oO6> z*d^XJcGIvKwB|24TwP{|-Px;iLgC-6QwMj{b2IlCWA_-s>h3?QN~L{h;Z#^GEE`(t<4S#KPPP9CPCtxVdLi7&0cY79qwl19LJ`7_xiTcp(nW>O@DQE{KIu0 zCPV6_#T0rZN~U1?BHC*>1#W3&3+w*ViFqa7#Le0)F9cYe8ryVIHltYM3zwXZxc(NrwHF$`ii*y4X5)B%e#CiG ze(_(-{Lk;d%ezZr>|5QxRz+eN7)g}YI~+DO3W{ABw_q9qAq$)U7~p3fiw4F93FA_q zJmID}b5hgTQ0t8ZFLYW&&GZHiS+kotY8?W#RLKjxWJb^<5yN{lKyi|bKPet1hv*0x zf}=g**>j+drymYi9vto46kngz!E&NpZIu%4MDXK#oh6F#`=WP44vTjU%2g>U^e4qG zuK~^5ZHD%xEndn=A;ZXkeHr~~Vp3N)iqF+G){K6|>*2IKeT*`{lWj)8iw4KqUHX0B~JcZZ`Ym0sYHD8;~na0 zp)_Iou<)h?9Oe2<8e1PE?^ zyhqOdg&B%*R1Id$WIKlY(iIs>ze=SLjY!N@j5#O1SX5}LbkG(mZml--?L;Y%uH^Nr z3!67&$Rg9LNt1(tTKU7|iziQ+FR#Z^!k z`VK4`QKRn-EzQ}d>|z5qd5}*nLE2J^w4;Fr1*l$wH)H3mdDk-IPMbfA0ott9tH>*N zt}W`ARCTMp>d(WzA$yL!#Z<}Bm1Sxjnt0(_ zqkU$E;Cd|!QGUu*yi7X(FzDxO4&LWCC;6n%g(cB3IBKN`G5Wb(R68@!8ze3xzCa|L z{4V!hvX(;&pTV6(43Ynp4EiJx7XH?!g6vRXb+=fEYg6H_1d@0$`Ry>DS(MCP0QjT{ zDB#K0%6L(V|6ES;aWu?vrebGTbWhZgrlLie2D8l61n~LwyuPi&yL3OOVzg>=hJUmH zzx3gRdkMM2&P7*WHHTP?I+ z$6l&X{Ve6|4Y4;r9v86t)Rz{&2~g(nKlY0HB{T6wD>r$Bn3!jy6J;rbzwAd6dfAm> zNeiK*h=WPfmBzA%=n-|VPD7(2q+(I)V6xv3I+;>qvay795j}f$q$c&}A5~MrJ;%u+ zFBAUR@Tv4ld~-7|wg9`*p7_5cBqTkl>Fg4j9a6~uteF{uztexBzW&ek#P$^6GhlCE z0{iy*FRAi|2PnySY9u|o<51GkP_6FUJSgRoCNjHJm%{mTO zG^Ipv@r&ttFX>s(JsdFKI10F)A16$&Z5gAkar-sEKkJMe%#uu8li*q-*2p3BnxIKt zJMXKkhBtu+p6Ne{R>9>Ldn$CquN_41>*)O;S|ff;QLjCRR|F%DPGR1S(o<1CjSImY zaLK3cP|%V`s?68eEGSXMu3<2W6(itf6d06kNQl~+E1JGCfSeG5ky%86FyimN^T3kRQo_>l9HLS&)o)V zDWKgk2Ac&7qdwx@@}SzEd#?FT=KZ3T8txw$#{wh0AYo`z8#yd9nS|~k$tbo(<=CbQSH88r+(~8fvVj+4mKc!C7?y%Y{-m&nC|SJ+-?@4L-)V z8t}3oLvnBtnN-&&{8KtH3%pS%$m+&N4@@PS7e2Bm$v<{p-N zXk*%_LO)964dh_w)oP0xVyc9$nPr#`;}*zIf8q(}9!&?i6;yIvapQ2@9b8W8ImChZ z4~zJlU8Ss!zi%waSB#M2ZH!7dzI$+Vcvt*>IaUPxF0&Rnz-EBc zSPk3kkTUpQ)=jaqu_e*-$7IC&8RbD?LCG~poJ`#Au0Uz8q=R^;V!zZg(m(ErQDG`P z-YcK>d|&L2%d`ID`IJ|$E^uDt^O<7Qcokz68$%o1=~$4Whl@O6v|+UQ*?bUQ2g+8P zuB@c2O?OykGFM0J3n@D8#m<*=QRq&ednL}UVV-p@-QpF>K#6)R>c7v+vV7@v@okJ4+t(>Q zEKQ)252WN`JGZ0`ug9+(JI&lFk#`cCFr4r^-ZtMs&YP8ZvN~rKTNi~(qBmLG{0=Fc zBdr}iJZ#E%&l1$99gw`JJr?1b=<~*Bu!ZbhrjM>gWuaXQ8P-97@-v&} z%FGjcs~QtgZNH37vYA{3V>z?>qF7znaF1?ZP-U8whoN=w$BkX8&2K~-Akb%jTsWbV0$Nu=@gK+xn2c0Tk;}i#}7uAdvqORBl zhniOu&MY9~LtmY?0YY2BS0D@1XpgmONy7U!y08jkN_(byw|;f_sEYsOev#@eG)J$HcUd34kC6+w=ti;IQ zPvwGbM8Q9+r4J?CqC-_G`})a>JBj8T``oZv*fXG(sTb|7F%PWFwnlR2Zh{gQJJQOI_C)9sW57nP%jRuo&50se71vSThB@^ zQwy8YVX%u^ns-B-K5+fsl@EGCt5J&tsFTRpd2W^> zvl+^?rn5}99^i&;ZoFllQw2lM3iiC36zwYv6w)^*mb}@q#-rT8hDn(X736YNnr(&N z-*)!0m{LUlA5-tZ9#^2XfyOqPbb`iqGD)Mxw#~-2jmB)O#p{G{r^cLC%V9!c<6+dn`&@tOx+k;UUAt!{^)y)Q30g~gQxrEza5 zVNQ+so*I9%Cx$#bIQr>>YwGEJ?N^{kA<_)i^aU1P!@JhiwH2b{xp zqUfiU01DL|kF=2zoEz;HUHv;?$o~%TdP)U!8n{Qsyr~$jzP@K19rr))Z}Uv`TsnuX z+pzDtIx*WM|7JD1W#(r=J*&Gt8Q;yx0^ldkQY_m^4XqneKUh{D5OP_kx;2hb(4m9f zpo&8kU)0w`t2U>}e3y@Y{2SFGyq%#kMktXfzNe2>Tp)NH)Qy1N_UG0G@YH-|zh3-h z20xx7;G34pPd~Ee+Xq7}#v02j+%NaGoJNj>z$c0+LJQ@6>+(9bnp@sWwSJYuQQk1i zuv_K;S~jHI>d~4T?H!*ZR|UsILhDx3^tBi$@O6&S94mXHCtr zy>SZlFszV24*^vw));i=u@0`vSLRfL(jlvKvYOjq-*c*y^TOEB(!y4`vOeDbwJiPn zbp9(5{(E76v-N-32xfV3^1^iLde-bcQ<+VR;R#?CXGT$-Cv%F<(Oi&=L_rK*>~dXN z2eQqy6RmO)M!^od-#jIH9NJ14>u0E!*Cv0DQkN=&taH9SOHNsW+S-%>6kyWwX57yC z?Bc|1{Rw-|_-G`Bdd24%v~&^#M8*>^nRhI4Yzh;B!;mX+BxY(#g^QG)dv~`-*x3XzOcG|R$I6g~wNS!E-*Qr$T$%`ZP$R$4sy z5TAw?1;6|WdNhI9V&YAp4c?jcGlkmnoJlExADD6am262I*fhPoGxR~=k3z!E-^z2I zCcNaU7&Nx@5u1x*@kr&W-x0mQ)en3OLsO%^pC)q}mcuyDQhx!ZFhYl9ezmr|?*z;Y zQC8RuSUhUJtJdJT+mx^I6louAOd|9{7HIO^T}mq*iY2BVLE8fu0(d-|Cloz$j)iM_ zFsUCGzTUo1SuU;ThB3|Gqt~(`TZHIjf_fW9D3mr+|Gt6Mx#>_rcOU_?6{aQe0VbS? z&{w1dDQ`=AYMSWd=2ATS2~H1m5z> z0V3w%6H$l5H|w{2Y2k&;UtJDe^*GVp@4c3SDFOcX5BOFBwKP}#+Z}ik*6Jay)lY+A zR!PIfa6r59W)mLQO|HH^^Q^I0g19N+5$cZqv5H}L{gFdL(}1&IvFqvBRQKP>OW9Fa)yf5pPzA|(oie+!LOiERu4dxm9k)33bHZY_xrW{m z+%qzY+3E%fe5~Ww*xKfA?S+4cN?;jhttZNB9C9)}1cNhZK;`@767M5?WLvnI}brinZ!~`_PyrC}< z&YBhkX&29^V2yqihuY@<>iBJ>p*@q!NNJ8^q69RXS#F?YI5ADAW0g?d@DRGkL(G7J zzXM4H18Gfu?@4E8B=e#CpWw3lpGgg7@!?wRzW^sFKiO{|zz;}&Rw6vUDAa50>F~T$ zt-~UQFUpSQ#r2yzMy!S`O(1a(W&LI_tInHLZZctLX5nkFH!!x=dqg6XwoO(Xa{Yk%3SSXoiGf# zQ-QRNV#Ol@zpRViu%T7T)1TD~N$8=}5;$wp^{(&PmmICslr#zKT_W*ZL?h9G@nTMm zHV4cQ@1d@is0n1>QDH3Vz@nTCmCAP+Wv~lsHoKfc@*#opiGsC2R2NytqIg9y#vFgZ>=^bRBw7g#NE@_*hxQBH7AcGjj9NJu+Q&uZeE*FLWN{(~6 zA?u)=?G6sC{xeQ!G3Bk?n-UR6@~F?tDd3J}Nr(X2F9&~hd%Q#vCute*N$z;=w=i4B zzp|;dzn%Rz_3@k$o!=Q*5rq>qYGR*ZBl!0W)0|$)5;&!3OHpAtdxlYSLg(KRZ_|-_ z2+}dE;u(`^_&DoYIsfW9@d=zYRW%9sa`k8J{0oknF`W;KoVb`);W6Xmcf+y0Uu6;q zESp^39f~M`@(AF8A~EL7H0n41LO7<+mm$y}9_N_|mpMpE84>4=cZ=ZtjPMtyZI+Tn zzUsPax7ODCf+{fZ%cu?S#3cyaaQV%mi?gQWFPFOvr-7AAWKkwSlDJTI5_2d|I>b&O zjOerPZDtjakxa7CNt21w0uz9|PpOZO_>pyFqwbhZz(MoAefjng%!oQqSkpax%C_Ph zh3azm(8hxqFYL0x;6UR}@EK?o918{|u^U>-Ohz}!D+GagPK`d!zkzWeX*fBh0B1b4 zlJI(t^)>Sia~wLr)^eZ(no*#xi*1QQ`1RSi^uo(ctZ;Y0%UXU?$J%I2$Tv-29i>Jj z`1hF{Cb=xp8v{*`{~^-+xxnfHbjuS;8^uWI3Yvm_dJ5gF%VjBz<$SjSN@SlfZ$jUZ zc@(@Hoa&uNE`F$C)G==EdZs4)U0lnWVW4TCuJ72o!$uwnS(!WjE%TFL;=CSlU!X=M zj>OkoceVF*xD+n2YjLPY@?^o!inFMRkcUN zEpAgaI~0UaHW6z$Q({mijZ!k$!EPBOa-R7yKta&2VIms`N0klOs&S0v75m)6d$#@m z!a}J)i_~e6|No)%{GwnYK`)=nhwN1FB;YZ4(-QlW1Sr5sVx?STZ*AisSvo3tTEBbO z(f5vxP)9@Q0#M6hc>ilE>yoA*%r;mkc15&ncrlsT!YLJWB#ge$&Dp)!D=ye$vIOmd zGcG-U?raVd6sP|B0Xz($VHi9=tbl9p!w88^=yxy!34WhIE-m*Mb?O$uP3WZI1jW8s zr95P$-hd)~od)OQT;cH3GbZeiH3VhS9SQ>iM}-XMWkK0d&GwDVS1VsqyWDJq91dUW z2JjkIVR=wEth%1sigV$%G|Tvlzz>12MD=V6&u#abBwScQ#Vs~i1&EL9M<>WX-yd23 zoLj>GI08e6WMSw&Rn^e4mjR>Zf|KtsIPkZrL3p-r#epbkYdmRx6ZEssUyj6(57;DJTx7j+N50&1`~P0V~AxfWap#zQUI zvE^IMX%6dVS2`3`7!N2a$N@GNtk}3+Y_1A*>Nm3ruqrsKB!O(%$J;|6*x(2xSV%9S zBn!nQ_J#L;wYUJ=&DXK?yU42oCFH>i#k_fN}q8E*XT&^egK=hHw;k|ngQa#%pYle{h&7byV3Q1 zzWmmozH4=H#l&>wY;A+@4)0VIj?k6rL8!N_Za}F_@(j3!F`E$rYkH*fvb~tf3Q{na z(4SD>j(()k3Of07E1dS}@1bQWum<6aMtkowDy@6xC8-CZzE-jvKv6N}@=WpeZ$^l^ z+o?Rtpc%SvP#Bt6X3#z{1vy0{`Xgkp=ytjMhC=$Aa=I^Ea>3^^?~qKY;*ACO`ngMwUej{!u35Q6nfM)iV55|2P9LpXoN+Y3J;W&xTA}AS>b$(_$jh zh4J(VO_%sVGctko)+2V52ox1dQrL5bPP!}e_PieBE0S%el*l(%QVRf8FS+ej{Q>~8d(v%FB_d%QNHJv+mCX#{Kp()OFXBiz$=)>X8#)P0!7`QZ$*s&hbayPj8@I^K1b`U1cCZ^VF>sY{>nH@*LxS@nug$KyP^ zrXvj2Ud^7n&ngT*{kgJKgni$Zu`i46ezj>5Q50EY9&}c zKYSue)k3PY1vs`tR~Uk=4X_S=P8?tSe|R1UPMzm76XmZ7FoiXGPp(2U5DUiw3G6?F z3c=SM2}f#x#v366Hg7SQ~EwnVk z!$^)|TkCxlvsvMlgn(Z}g9_^7T1wOl1L{wcGFsB95xmLNkrrJoRsN?~8a3vgkL%8t zyGyXEEw))Ihg>7Myqfv0Sn~4I!wN_!T?{MYmuMPF&bFX(Roouk1<(?b6b{ycIN^qM z+-wR`RmeP6S<0Xz?xN>gu9FSt$SW66iALYY;nOsK)=)~vK|Gn0(9?TVc1N{*pG^A{ zEzLp4K?LBL*;t{?fEg3XF_@Lmp6LCz!EyUlM89qQOSc4(O?G5V85AzsggZ|cu}rmI z+i6|Sp@|YT1YT4xh)9m8u9Yo>LtTM?D+j`q`pHS_o^+z^P>Bc=0ODzbTy?s<@(GT% zdiNpYzWC`txAp2O z?8X8MyYX$EG(90Ns9DLZ)Dy&dY8BhtX>>dd3GN6#m~)|-p}jP9Q2Pnu7S*6Hu|MYH z30nnEkAj&p#PNDI^`oITc9Q({5dnN`9(BcZfK9Q?D~V+hoPD_TN|J6z&98fb7|z3O z|5X}`#%^yhstBiw-Qs*Kk?@QCu6FUE?CT%D)_Xe<^f zOf0*>`a`C^lMWFDPGJzV?vuo7s=%cm|>?myNlY@hSb>U&uH}^bn=|4sf-T+h5^+ ztc7~@gmUQ&xOk*e{fPO8Nj=g*$UvZOJuEdYVVXB^+RXk!;Oz-VGA4<3QmX|xK}|bZ2{aig3=<=frJ$m5_IGgNhwi)lw1OD* zoUcss^V@$3zwQj`d^u9>QZg#VY?swSuG3D_v*}kJMqTzeELF;aaQ>9oxbXT*u&}Wp zsp2}pJ@Dw=Ej*w2S1!ET#)|ZI^at{GgJw2O_fi!{Oyf&Ht!OsVAv2jV*Jusk7aipE zR~o^G;=4T~Ph}H+#Z13&8wtrb5!Hc9E}z))$XDmuT#@XIi2q#E{@tNq2LR2Vclgi#tUpMQy1; z7k_CF`Y7;*0+42VqTCA1@n58@oAj{0xcu?C4?$9bA$<~1co5=bW)f_J(U|LP{Ys7! zv8J>z{(OI8X%+MS$k@~z$Pmpjwrmqd5H&AJ++HKzj=HfgBXIZazbNVBEgXOQNfrhP z`GCjR&+ZwsTak*W!}L9$tvS1D*g^V+Ux&LD4x8wQ4(C^j((caX+QIP)PII}9!)^U3 zzo-F~#BeiM(EiuuMSs%>UVBaNqTH~{MJ<&LdL9?y@p6e{t_F_1P&!!zgt;`pIOICq zl1cCWT%Mu(E!XetVUUJ1cX=Q(hDZwwO{Mc~S*85^{Mowp-i=S-qZ)Z2zJ0Pi%l14o zju5S*hwNU;EVsL9E)y_=g1${;E6^>n3_knisV{-=$>HjgUB{>s!Z8ox>{q`e11ts0 z?K&>$oxnZhS)l;4f;!jHq_+zQ${pd%oqhOGpYAF3L_L}~w3%jzf>}&FH_gV6%O=Y> z(3`Z?M!wNcxf~(584RXH^OgytVTToZ8>tg^0Fv8P-S2IYRv*7WSXLKiVFC!xO+J{F zzPqOMxg*Wm>H*VktYDu^FJ=GAgs%^-N>$XAy-M$r#j?~TtDOIyq!bQc#d+Eg3ZY}Q zPhu{$%@z%ZVCk2GYiphnh|Z#s4tx>cfU2b`t)EX36qdfoEBtYpSzTqp6I-hlUp`tR zWM`Nui$>j$ZlNS%F-tX3`WsI-lUI+3O3)@>H&7qpN&Y8tMAsu^O&XGc$~r2K<4-cl zIr^HLm0A_aRyM8N{q;qtt&?OMJ3JLrE3`$?JE~W#;p5*y%tF-#%zn;+f;f)u6Kx`o zclLae)vsTyk~n9mA#zfE51xEr{_RxtvQUwcfB$Tj3WRG6lQ!8_b?AGOjyR#R`*1&S zai5(=7O!^x6q8eZm%Dk~`mFjV?D_^*bOB4y`5VzW@HHWq6?aOS3$Fiq2I(W1p)Y9{oDYP7_6 z$JKg^hJ7Kzkirdb2YW&kF&mwK0{1;`51wC3f;^)h7UP8Y^N-no-ClI!J}jAo33bvs zL{W2n(4(wkIamk}@MwE1t`!som*%;NF;^^{aEjGzGLr>!0)NX(>G$HNr$>X)pDTJY z8F6SDJcJAfkV2tVC9e`2?UOTp!Ho@y2P47~uHdE}#JhGH#EeR^15^1Q$bJq0=Rf{{ z@Sz^Hdaqs2B!f21diPrvl8bOL<(Ux+S~PSWSqqfb2o4zYh;wUw>POI7^rzv6K4lWj zQNA{W9aWSB)fnUyQ%P{j4R9{dJ2qKWD}O`-JB$P`=|5^1(KfcG)Tkjmg5mIZZeprnOuDW_c-s zuKy>76#lz~vh7NR)O8OOYEWKG8_y=M{kkN2PQGAi2VW5J?KknQ*rDN^o_OL`0jz?S ztf{DSn#fupEEM;p%J~3saAUFoz{qBv9lZuF0zq+4Cy&O|btNLOAPCXi~wJxYaQXZOPXA z#&#}DSa7aDlD=IN3jIyP{+e6uUDBJq6-fK$0*QbMciyzUj_U8wifB#_|VnL|A52b zU%=5-tgp2%rv;waUekPAc-Ruc#C_> z8}0IRF%_&mdH{kj1Q@DSfJ9dGi%fW&tN35Ah}%WBRq%$#Q~`uxZFOSud6dEw_+k`4 z5!aKtqjI1#QESahTCcf3zm1Pi?}quJccczT69A1@YP3MMCh2T>R8_@-0d1s|prIfa zjQhGdp*0Rjg^F8((En*1vX4MTSSXBV+Z|xRw>Cc)*&Pd z!#MNL?<;X@?ZR3(4ob?SaB=Wc6o|g9i!h z$5pV;<-#8u77RjFX}>=pQO0^2fa>jf9RA+_VdY3}KP_|lnl%skyzqLgB^%*x#ap8= zKOlHV6J3Q;$~eq9(HSjZHeX9|Jc(|4YVMmJs~G?5w{UV05|kYv&V2z7Raqk5n+55Y z`L2;aY#Y4lTN9IAjF(zENabDSCe?rddvMtp5V$^PS`KW8cg(t68i!r}%P5uu_fWHm z+1jFFi=)AuCW@Q&jm;Mwb9fsIQ{HQbaE>g2t%nwQ0A0VJ;=y5)bowl`60dJQeE>KQ6_MxF~WQAZd?nq}`<2qms zkuG$L^#59YAQ&Oo%w4hKSZ%En$Mm$!gBqQv2d7@8qT3u_-JWJLQ%PR-(?sYk;t;Jm2To1}nbzC-9=C3`XMA zmicQfr-UbRgI0?-DNA)^Jyix&B$7qS>5Yv_UV+gfy~Vgx3ZhYTvf8&??~5VmSWlqz zO?Qm-G`y80JrS^Z2cf5~CvC9Hyi*@2vrkrWaxF`(w4iDdwBt}jnYKXL(AxK%nXbzn z-FBl6jk&yjE|Bz?+t(2GB>V}=R-bQVYe@x|vdT&V2`>Z)!;7trM?E*Bsh+1II@`%V z80sSN0~@+iT58SnS?E(4+kt97?Nx&X5dZbBk+QalPAVSSSt4(F9ip=j3_cNZ$|x2M zYKb|(?Wu|Br+(h-{I0vib@Q^*xNOe$_sR z{~4}(Sq+KvopTG!wJDtUO-<)1TCv>;ZIL(~$=s)r@J7w$+!Y*0&MJwWdSB)ysm?1D z-9AB4W4twxU$P?ku**H|}HP)Bc)Rl(44THPu%og(0l*=X$ zGPj(@kcMo5KvC5C+qybwK()ozXL!A4gMHxHd|M3d%QGns^Nl!nV(Ys0l57p!X<=HM zPnE@l#n9D7f}o|hL|8=IHi=q;O+}nGx7nrB@#;e2MCQ+LmW~eE&(DDucYfg!d?|im zeroE-DN;MA{r@W<(O-g_c9(c!g9i{atwvMc_my=7!HZx?t85B3t1@SfQ?tj^m%Yw9MG_+}t}UKS!1;HvX7PexP#*GGKfKn-8ePuQWZw1M zBRuOt1db6Kk!=3QS%k-^Bz%`Jc$YIi8s=V6XN?XJTmHBq?WCgQbxa#PFGzk!H9L6P zY!dD#9dbA*XZ*0pI39|fnHPw3TvfJe-bji@DVP8zR`@G4bavD5yLx7NrgN6x8FCaNhXh zznP}pmFW69kmo{~o^LUG7aAcIfHQ+IW$z@3)ZKl)2M3_X=G+KMcW9b;nlf1p(i&a@ z-*-L)vvTY`W6A{~%ah10s6`4h?&n z20~Hm9NeWt_2X_aioXNkMZ^?D8Kk~9wJzounIdWc2F;LARhyh$y*lEYxWH>kPlL_| zp2NVkdv2z5c~$hjNX#cuZ<4!c0|37-lIK@K+5UX`s!nA%$G+Eyq_k9YEJ?@UQW_UngpbQdxO)XRaWxB{D))r z_l*JTS7PE%Gm|IQAz`7~Zv)A4o4i*u-*Jj>Tw@Ik(5RNrI-L8yIGW|&c(00_MXBGs z=s7N+t#4X|n=6`Cf*V{w9#A%)P7^`hU}>YI+dn3k)8lk-4Z~53eR2&jjUxX^C^hJi z^qkHzvGpl_OqWej8Dc{J4GOtho`B<@uB0mGAeR^4faBg~sR6mB`e58R4}DNI%I7kE zk$bKZZ*1q_!pCa22+BNAy~YK`>eVg%?c^M`$r@bhLXq{a)k|I`;zlL)h&X0@taVco z?693TBz2gHg_5`@Ga%IO-FKrpa*TevJco6Z{)!#!jj!qPjUtf`z4Vku#Ax9M+D@Pl z*e@45rhcF8gJ4nk?VCL!WF&AgC~10|JNdQobKYP=FtPe$FlqqUwxRoIcrD2xnS=%S zMS@*(n+`5Yq^f~7TKZlTffN*Ymc(T4c2K8G>!=$+LqzM$hq-QLEB2u3wp-n4o~?{K zq+E(uaElbUl=1s{+B3-ilvr!m2fw&m#AhVd10QmIAC zg7EKy%emr|i<|tz47G^|%~%{)l4Z>K>uUZUlJy zDl*GUkASutcOBiVG`jq221OG)>BzNC{m!zL_LboL`}HU_^FzIZowBGjbW>N;zQL<- z^;KCYmEqF%U({u_)bp0Pg%b8Gu^_sgw%M>UxieD7>PH*oXW-qkmo$AXN>6{E8VF3OOhAWCo%nXyxaJE|hB_^GK zkApPkf87|7J@3Ha&=m!qpAKto53o39bnw&F4t<5GRExAyvvDTF?BECYP%yi)e(}7 zYRo-D#3@e(D&&xtV=0^R#_q{_H#e=Zfb>~7=48t^e6mdOq{0~&5RgRPw_GIe3=W%b*Jlu;N1yz*Vf6R1t$imPe79hZniNBO>F}PIebj)<)`gLhMnc^*bs4et} zR>EP6|87v1h_5tN^CwUlaJK20gQ#F*T#bl|xTPsAbMh5jrx~kAB(bd+fJ)@Wa$Acp zuU8ld6>0qt)7}z-s)c~m1wWVngrfsbYZT+_!(BC!! ztec$R603kPwR+ueXFpEoq6H(@bPSXLCBsXm6CQ_YE6$$%&6sm>CRztj(cF3A40+*c zZ*k7w0O!{x>td#UtMX+5FMFy*AvU zn^p7+4!tH^e$*AMQ8`(btZvigJ$iLXY~D0Cjk#&Ki-WEp+17_bx} zsdG`Xp`3yBrce6S!SF&T6F|E~#je&w6KCu$XE?`J&B2JXIQ}G$x6dg&evk3^BNp-f z`4J9xMtRD@;mn|Dh>8!@8PRz{ekXs@fA#)_5rxTFLVU1=mUcbN^=TG3&e5Py$@=PH zA#_3h*2cI^GTs7M5E_;<+4xhis?yN13!D$7%RgLeZzzQ~^U2XpBQ-!2&tiTT+%NR z7P-nURNMjj_0HFg_`QZQj*^<3h%uE(q)F*OGvOF{wfvXShg^kF0M09cu;KSkY+J0< zVX(XSjI=`drn<~H2ZcW-Hq%V7`1ypnB<`voJE2rRx_;Bnyk~$&+^X4(}vTz zjjgYQCy^wS15;sCpNivQBsiVa7F1phq&~!kLLn?Bk|r3$mx5;MDIBC@{X`r-j^Hp^Uj+aG?ZIy_4IsQ{)>}(Izx%uom38L8vZrLlSa=`KDCzug%~sR zY5R-#2`!u4%P(zW4pr3KSc1j4+N_f7?xJuAF7{OL0_u+-yhJy^nclL$4X(MzUVFRf zH4-R!#xXexV=Uiml$?oaR*r+ zVblpcwMxU0XD$n*IGRDe!_(Ppw z@0@#KovJ)$Qba*0doOYaUrW9SA`L_kK-jnp8~9KD6jzP4nR?dxhW^tc3M=3Oaj8?w zFm%FNyzPHe#)}ogFJ(-Rww`1>;nnl&4U8dRn+b}5Yu9}-vV&|hq1nB%x=_(?$9C;@ z<$1#KrLu}z9eguHq69x(X8!k&X5hxdtcT>1PYNBPLYRMZcb=WX#F`Zvc5H;< zwv011w{h1FmF~AlV7cfk4uIiVt;{*Ya&cAi4>)G*1`nFy;?*&nrCX2cl{fkd6`SG0 zC}F_6g1T}nwi4K+xsAcM9(*nG^p1-)qZ6*$It`P`_iXhEc`CSil(>n*(oMt%rXQ#n z0)d7LS=z5fQ`$fCqrhvMg&SZLH%Fcx76~mouzQI7?7C7kBj9SWC@M4gdLId6spV6w zWoj>NbWJ|ben6<+2i^x7PV~^M8=6L(J|a{^?St>jQn3n5^EdpWXkMU+mGd_6^L$#; zy67Y-VhN_B$MBrv+F|VakB+PR0}cGqX`d0#B&oT5LFKSI5O^tSU^;d{Rda3}M-h}W z@%A(6(J}5kvyPCj3F{uji*r@Sy>}x)yPhHD zfOK|NFnEL9djetx&o^HdRM+ZiP;xdq%vDR$9rPGE?&qmE!S-802>bC>ZIqi>AEz*u zc-6Kb=yyGrfU-Ck1(S&6<$h*-^*m$^lEF_Wa+#y+x}6|dS#ky9r)Iz=@+9C170|7| zmmSvg6P2+KY@c~5B0IC$4~|740%aYVT1aw!IU%zMz`>pKz*4-?tyJIURxI?QxZo<_ z2omk{GeJTT=)RwbdQxPYz?UrblXY(gvj%SEwQDk}F*4n)pc-r8xA1+H$yYW^pe_e* zV*7EVfgx^h8LpS@6@(O7Hv-@s7FZ79kNhrl1&>bBq_V1u&q6zO?shTajv-X6%jn9L zmA-$%lZPiU-u9G%l7Q=V_dR8es=QWqzoI1muTdm3s}e^P2Ve4oY+RCNNT(pOP50@`6KV?CX!E=| zAclK6OKIPDMT*Ay!un*-vSKO3NZNZydG?`w75JxrC-#a|8)D^s;G0dgDZE9iBjKpM z)`Fj0;C(rtXjgd0KD!koM}SF1`K8btR%FKFxU(6 zU%xd^_Wf$xecEz-nbWIXI-W0Uib!)P9rL~Xs&std{mk{YEu>xK^M3KZ3JraBb*BwW zAmA^D6BYIHB(n4A?o*kfxSg`Nh+>^0Mo~lgJ_m%ByswR`kj52-wQ5&Xe-rX zTMLAEKn6ZH8{4FUr;tT};rBqmuR8D#nv?jJD;K@Kb=f)&z5iG!PyEs)ub+9FXMA)2 zQSmit*%sU1^*TXZNs4BowC+0v3L@sSy7dUR&h>aOWPa`Ijm}q_^MV@){XRg27xeQv z{LJ3#AZ$T^rx+dk?e#fqtxQX~tc7U?w?0ZYG8przzkMKATMNV$(Od?Fhz{5uGtN*; z^r@(I_}mjO;pfx8SL3TJ6jh}D&IX80r(H}kT5K(tLp(nlX?nu?%D5cPR_=}Vp(fsv zE{H7|#-r590Cqu6ETEEZN;yy*^(P@U0MbZ1!650lom#L$QK1#2?ZPfq|29;-1IgY0 z+>IQR$Xv-A1-heRKlyOr{b+?eZfNmM7% zWQXgRYRL~X+X6%SQEqO4OPZ!y&o2wwTr5il<|+A_kp7WPRv)_*ynJs>t#wAWDt!$J zba%N&rgg?xHmXN~TmHoJRuR$-(3$jm)hZXyL9)K2Zknz^-Sd#t_S8TaRXH5fX^MY0 zF9iev@n?$>73xtsQu*;zYY4+Q6ts{)51^hJB~6zVJPP&UC8d?a^QhtcNG=jAo%?9} zEv2fEVaSya-F1X=Uv?2Q1p?mmeIvo9j*d4ic;Y=FUIB3KW%Yj|7Vo}U*(GU*p>(m& zbogADlq8TZe^i739^`e&Obx$vT(9t`k$b^Jn3vDe-oJp91&iVzlU0q)A7ZXe(}K@+ zCQVh1n{9)hjl<+@`9eV|@XN!L=bSaLV$^owbl&D^{KgNZQ@>hct|pyIezv7`Jg;@F z8@_VRzc2Z!pL(3Wf;ff+&H6q-qO13}&z6|(OJOiWbx=(nHH^@qP3=B~FPNI}3mPmm zTuj`f*xG}PK1Rag!*OWjuY@ZbS%^}4G;HHZj=QGbF_CD6 z87CCl$wo#F8Cpb^#-ZH{GW#mK!P!u|xcZ$`>xxZgw6pqUx)Ho?tjhNG0|G7f0YNl& z9|9xHdt(=(k$HoT^D@+xSN(99uHEFQ57W65z{m0eX6ryW&jFI>9j1P-&2(5~Y<<-y z6g?|LT8_#e@^?xT4VoOoL!=^b!ptp!;sF`lXIoL0s7_Vd4Ks)8c9bO>C!GWohD6`h zv?jTuk%9K1WwDLvi?Y?t#r3i_akun~`jdg4t}WU}XlXt6(FRac9nXd&vXC>Z%KPq< zVIC;U$VW(xO-gI1Oa${mM?4v42*KP1_(9(##9WUT!bH9Jd_D47?c#h;i_kujmhx?u z9pw_>ZuWpZA(=v`-OU)0)n(_(qOQ_dA0?nkUw94=AW8P4CP?-r!qQg zFMa`JD0mplec7NK&x%`5$LF}qQO4Dd%Yf{ew?ogD2<0mH29g;n3n+*NU&GDRczq;` zdK}$ttFP2YWaHvvUs%kFsLM#z1&aD7%qZj!G~mcM#|_E27(1G_#m=+Eu}cBqf71`- zH@bfKeENr)_e(1qa86c5Cte9bToB#Te-g=h!FNWk^R+ z)q8okxaLT9!QR=Gx~p{nyYuB&1osgSj{7WDvi<8-zA)Y;*TbcC9QFG-CQf{;+0eAE zWJLyKY0ZDa;X*+#mA~%)RZVY`qE(~&k?{)(FWsj^?9##aLcnD|FKa0g2zUPw6K?*O zc;J1rWNjkAe1pTAuMV)hKhOq9)w?Ch&Kg6|Ta3C4S2ik0 zU^}lbRjnE66shmzBJdj`xd$-F!I5c+bc+ZuDGAd714{zy@>*jok%g_4#c5g6^}=T$ zqod5EB{g625!sbne8fcH*3U`Wu+U5AnNi}Bj9{1`fc#(_7=I)5@ThhjlCWtJI8-Iv zn-rmRwt`njlgGO*g22YSe_uDI)>Cr0ou5nngE3yV_D2qn0t4LhrFjp?030xQ22X$b1vL<+O_-Iku zBNZ-am-i;ugZrj|Lv6Kls<2*}5Om(@8kx_CSSI!)<6d^_ze8VCOPeaqzgp^qzd z*{!tBb&OXV<#3Og7tdc4jnPw5i+!w3Gm<`vrkdMoj*JFA(f{J^@3asE`|?4rNXuWE zzj%U*C1$292H2_|xJ%nS&yLbJh=5UZ&Ebl{ayp(#Ft8O%M2dw+1x5G814gU zPvP{*-BG(aLP;xEGj1r%P#wEay2l)|fy2H8w@ zx4h>i3cw$?gGNeEfo3QQ55st#%~>S%T|OHoq+Nnu))rRAjG+z|SADHtXUc_Nhb~BR z1SU_DaOui*lG;X#ENID~a#94z0&xvFe|JTF?qLwFb-o2OyrH5J8UWI@MYa-RwE;YpI#JMuUS?q$nL)Pu`A<@t-yZwjH?dm21Kvmb(wHvykSjYPo@;X;v#-^r-Ul8CJV z`6S8?Q?2!W{%+QtVY{9oNEMZ@{4MA*_=dot;#`fxsB24R1a~JCbc4ZXIQC{1CO|3^ z!>kiYhk_E8#w*BuZtJGIh(Ia`?lNa;oMd`6jnVgz`%5K5*Sduj7n5c_!?pN&%!3z` z@l!u^;d-}#XsZ}$4MXfo&(W0>j2aDkfSe-&_Ur1*;x==0Gs{-qf9m@3Ps zQFzk8FDeR#{L(~zf~pl97`7=IORfZtu|n3^yC%=XA*(H}f1EPTa52xqP1_ksj!j5S zb6Hk@2v31wNi}@#Hpu_j&>4^qtt0>DUA(k$%oRQkzryxeU|y&XSS@P;g{V6k*O|6# zL&ZrJh@T3Z9gs5HZZY?7+J+?9S~@yvA3?(4-8kJb`W)V7eY9Dk!GD3Cms!%K2d>a0 zfA-!*FVVd`3oVIk>ABAuCBMyCt}kwF(Kwt~Gu$qZFj!sdt7Si3p%Grze)E|&em^0E zC3X&p{*9aD^EV9d`u@)5MFCSg2G7P}?c;;P+cz(Q>%@qZ`{>7G=$gYBedTsy@_+zIY5eD|C?GryqMs`Ym5dUTJr`)Buzz{*56=&1EsLzwGBh}o)#Ka`gpyAw+( z6YHQpG~s2*Dfj@Nqe)mZ7M}Atn8xp)|BcjqpN}#K1-amBsKvhEjX}Zkw=oWmnWHJw0QDax1V8gV68^8Vqvsp+QUq{#JvL;}`BNX> zK!!A@QuwJU2$X1L;ql>RT((feJ3~Cs+;1VX@iqgBS|m2`y&xUlUOhp`EG4Sf7?s(yG?9bqyf@L5TVLConn zPDRR~uV-fpfM-!+#Av6d- z!Hqd=mPsO+K?NA_1i5v^VPD1|rj1x9EWpa#1r%$WTz<&l-R!Z`{Pika9HOsE82tz*efd-UA- zCMU_2(1dK__61e7>;WGHlC3{LCiZV3+las5=X2Lvn_5?c@w}*1rhhm!!Db^D zbJc%KAhYOqym&4?#k%kO5-!$v|573(weyWHsJ5@0ke2Zk@jfxNU1`cAU?x4w4WQNN zCLqAFTJ)O0=<<Dv~w>-NWd&F*MI7+2eFnnTz3 zf8k@BFA6?Q?4q&`Sov0@7@nNOsNhqG&1F_=>y-7py2w$I9k64lC^A>4SXm`Z!NC``|R0-cA-^6uly?*pneT6^pe zkM7Bb!3*8f4D$>pCei%`$a{Y^@1CeS=c|}H?cUOF7LePIve!Or|9?HvSzZN+8AWjd z{d?Vyl>r^m(OSxB;}&^cI*HW)M*$oL9kf@OA-i6Hn-&9vphjRDTn6XdHe!rEyD4A>*Rj4u z!Q8LJuU-L!tMMHRQ|MGL!Ff^)gU9`W!EeMvA zMV76599GPlk-LwnB4px9xq&~TC=35r!4?lVFmH(h0>1&Fv2^2cJ!0w5pvXZBLR#<& z7iP%AOf0Hyhd>FS3~%uLh%h!tEI>Jh-J@kX@#p8zeHGdiEQD8L@)U>k!squPKNVQ%v_| z=4xQ;m4C+(p0PGuALRL;omz2mf#q&{Jxa7BR_$+zQ%3m?j;R{tVQiI))@l02*SSk~ z_M|*&NbVDxVn>PmXEEJ<>S8l~r5QmnNClIGV)%*u^hzBWo1e5{+6^D%eZ2 zEt5nxQJc?$LQ;06DK`#5LFK^>bjTR2n$*Y_HfenZK_9@4RUL+;PH6wxtY@qz>~Zbk z+BX;|{U>v}(agK(JCrbdf?PW@X<87%j#DT-vJnO^zJhR=k96EeU+u`bX*L(hT@r3X zIyg08*~J#kukIc*%xI(Z>7Q-y^3C(xPOn6O_$NGaOEPgGtZjiE`1sp;UZ0%1t(=8& zO{y4}A5lyLHgRvRsI==*r_`z^^TcPy!Z?jLz_5P^ik|j(f2#?=)@ZmM76a9YaVT7a8xTbIGaLH8m5f zh|cb1ANPS)k`pho&LePa zklv4_gqf~-onA#1`0AD@KQ*Y)!k}fuXq!c!iLpwpZ+)s0z33iHlZK4S>F2%@Eq2bv zhL1dtHOW!Y4e6BhxE_mi+Y0QCSK_R(KcY?)lw&XMo8TiP2MhXQZc`5Z$&7JnOtnuS zqrnd$SsgKUC-yruEG3ExGT&^JmqB(8i00a1AQuomwxOYSF8QFp`dO?dXlq0c zm^z5pI>RQUD}33v*KD2UARhB~1v#Q%og=G;Mlo;<+ZEM8RHo%{(r}HjPWCXM&_dQs zd`CaJd|g40YH!tq$9zF)5ROm~dOa2NK45cN#bN8zoRPug1NI<)xoQPUo~f7|kzg+q zlEE&^%$qZwW2dXI!kDq_u*&R>{-FTIt67`-lZmtV_^V!vwF+hj!N zI#tr=@X1`NPCKl?xT?Z`lVathTLToL*>}d_+18>w{`M!3k$qBIcD?z!Tp_Qo{&3|& zc%LpFbmp}cc=r^Iif3w7Lo?AbZw)6g+IAL=lWAl#LVV#=Z=P-GpX{(2uX~Q^?>JkQ z^MP`F$4obT%O>;gvT0|9jl}!e_kqqj$As?fSIqnzx0_e6*RlvLX4h292h8$quDEip z=$P>?rp^a#Z8A*GRdT%3p-}-y2x&WCa0*&<9TL#PdJ&V~KX^1=!$tW||A)c&C~pXe zgW6(dm!PqNLt3CLARiyb<5Y%y6a(#L(S4(cchQ^@#Q3ABNP5eLu3D@Ubtc{Y#_w3p zU7}ThlxnB6dH<@-VvUn~+|OsVhtg1SUD_RfF(hR_Et41RAz?8kp|L|TWeC8099ke$6qMR;q}*v1 zd`9J`naoe){(Z#}BSsYqbo@%j5@8GBVG(G(Tb6<3UNsbxZdEnXOFK$jE86fILt-=?Y-3k&VR*OEeLN0-H z@Su*>BMmC!p$-f@uHGrw_O}Ow9xT9^tg2;%kK|3k=xf@2;8r}g-HZ`&IoT&IaTEFcU{r`^eMK5zvG`j-Gc6CzrKO`--vnv)2M-8 z#l-Kn%lH>Y`CJZ_y!EzoMXuS%h-b+LD9f3kxKJp^{64?_p}YJw~bfbh+&;9VRVj)^#pyTB4Z=r6#wURZ5>hR2tztn;0^aLtF!^K z_OvZF<+59jS?IAz%>j7&8?P5+*P&diA=D%-x0kKyDd{L?EI;YkL^yK?<8A&A%d0Zq zJ{O=TX8Q-?T@D%dZ*TIin9H#zsuX3TXP(VeEy}u7SM`AE)4@!|~jjU`e6_Y#E0m1VB&?KR0`WeH4G9QN#~ zs?)@{ZO+YJ+Am?_k*MwpUTy~EL zdY?0FT-P})?F(sv3`>f+a|t5TkXZxW$!U>rO$Cy%mgEjP>Dn`xC%EYB=wsU+6{X~w z#|$imye8wVZbhkT<}nV+4Lf*ZD`I-}TBl$=ui;@`hk}!zM#Ym$K3gvh7o8F?E5Fj; zUmBTS5(ahl5ckB$ey2@k>?zrGtWxSev$S4jR_QG9xp$(`&Z^buFbOg7krVlX_ug(D z({IbXb##RSPy9|D#Vr_pc3jC7miKof7PR-S^fS$djv@x*9SB4megU^{Yq=$hCZZrN zuNN%-kVo0X-U5aHw@~my>{&q0q6H-TR$-9u*(n*6u(4Lq<{sN6QOJT7hDNwMu1phM!4<#BFYDy7UT@ac<~llKrC; zfTFWmX_>;2ZzqyJEk&3BkQ$0^lIqF5`4NTc3>GsfuEO~Ac^vXPdZ+jb`*brolV~HZ zi^yQwf_7ZC)1sT<&r??Fx13Imgley{G3+YmY!s($5nQ|c0PcXV2@;aq(99&42EK!r ziHF9PuVX`d=Sdu>3E1lx^sKnHNy7PvlNy^SxfpwMC`V={41H)A77SY?Pl6ML&RCQ} zQ5ec)$lsIZRwkPYa3fanilkhP??hHh_ruswOwj2I5Ai;?7^>$qw+(PRR7JsVM%Z|- zG)F4!Ou6)~aZaT0Y3*pddjH1_o%*7$&^c*?p>x3W>b4C7U+742e-Ur#^;i`JhNDdz zm5>DS{REBCDy0`85pAPPfPt#jvwgEliJ>ME9R4M5h9|sxpzaOUGgJi#6irFnuP|+T zHmDR9%l&)@K4Gg<8iv?z)}H!E5ztQBSEw7T`Dj%Wp{ZooYS94Z3IFgHidigSsE&5= zFVo>{Wa_dwF)$ zc4P-qT{z4X5e2VQKzD%8f*VP1!2s;H4obMu;a92pPld3p_VUI4dOu14u-}_t@{(Z)DA166puXc)l8@iq`~}NTU|K zwqGx43H?*g5|@%e@tDjWD}Lb#K1(~q zQvRH8v;|Y_OL!@Mga4f`RuCrOnXp4*l@485J9BwWmcI4+b{6PPcN%fv_4u|OP94R^ z+?tc^V|H>6Q1(~*OltkpNfTEV|MU|@X2gp37asm8KfjhC6dbVxD%$GJlpO?BBAFW8 zegGMos6ns<)HaNLwKX4I+;`VuCx=fsm9A&ab>prnN6VDN5_Z`+u)Ab=oQl|%CEo2fQol93dd+b8D& z=p1WLV?v*OHS88d!p<-8srYkrC+%6HBY3rW4Pzslvs2gZJUQ#L)*j&W$nnyj7Cxm2 zME#7$f2rvSsRo~nXUkN3dQWL_8Js*WvXf7?<(Ft9RvZSo_ln+nh-enf1AIt>PVX}1 zBRb*1S;hkVnq&pmO{S3)UHovYJJk0%JII_qr5d#f-oGyJO(`)zNhjOc0i-jh$f23s zc-#IY4A}=mRq5V-QO?5UGN0L&Nozj{7uoxcIQfhfh(I1N9V11aOkAhYKfH7CDPn#9 zA08S%y7be`kcjp$JHJZMFPp<_yS8aDpyQy#N<&pm9W*BODswP=TRvu`+2TQ-W^Gws zV_`T^-3_LEOXw(}Z4PrcSS<-}DE03EU@5aXA2me#aiKgF5t_b3!Bh z@Mh~j(v`Y?X9AQ>;PudSO?92UUTsoCvr*^i#`5g*Hw`0=tDEFB%1f%xPA3ym#M&yg zn{rgK=kv=S8jFl{nnK%>5j?7^7TqV!P2OMswA zwgD2!Q8<^EJY7u$5ED6?Px;!RI zqeis3IMBPf*K}JHczHz^7CD*XePy8c+?SG>bLKf^S=v8sZ7s=jNQyQjtrhkYQ{dSh ztx%&&JU%AwaYt{qv%sn03Oq(SW3yX7({aJa!#79ZiFf*B?VacoT)!tqf(EqnbSBDn z{O?aK1jD`xP$={FdT(dn@33k0?xK2?khc&lDn#?&_I}N#Yh4%MUROy}uRkVPb)0+f ztG*LF-rtxp9!Q}D@wu^S^%D?{JZCn+6%Qvj znlI8ns)lh7=5{dlDH;oNcpFM(f8R+xwy;U^^?|=|6U~n-hgKp&;I!dBoEt9u?4{N$ znq+J@w&YohEk!@hF^2yHeotODXIlO0Po5;EE7pjNE_K(OjI(Mef7i6SL!a%yu5cjD z!G`~gRQe^6aGkgHT!+4&zEGZhVutRCIKhUP_T2GX^#IY3mWDX!oBq)_!Kp0D;)znz z8+{UKLHxpyE-(Lr*VW3?1*~%uUNKvyY9p^$L615 zMHu6>rpuvsMdq6pW{MHfuTq$Ty}n5{YxH~4*(03_vAeYQ z$YWDJ`eZ8PitQChPG}oO*W>q$3$D}FBPXVE)nP-jtpfM_NpIT3Imgx^k?%U^_hLrU zj#`&rLFoW(y@ zrHcZWG*sONczkVp#+ZP^PZxPMoqCz3$@bIAn6mfC7&x2M<|aYwN)2}XawtEgl9reO z`1z#9kz=mIT4?Ck_V6xWBqt)2Ms*;=Bl=wnNcGw>3C|^x&%j_0A~o-99+zSMLRkIF42Yq+_;8tAP{a2YZuGMhR zB4uN%8#<k1o1Slb8&&2$EaPxa;jo!azk>>z;h zuBW|9dtr0UyYgV#4!9;4lwkC{`{Wa?eh%1XZ|A^UN3)o*5tpmTBk=9%Xq`E-T*00H zD$5kv%zI;pS0R%cZ*1$9ptsW=e85GSr-S(nbr_pIwXsIDX`03(I?Fqh@0iu!!SGcG z=D%-XMTtx>SVOyJw|>K1JGqBiLVtZ2ztWO5HUio4iQ>emhq=J`nlN?+(?bfhfdSTf z?M8A^WjWe`G|n`0jQnkfvy>*SB$M3x{SEL93AQ>vk-(6eEgMf!!ZCjkHjED-h{LVH zvn#6E>zmv?o9#W#*?#MIPZHl+j|%?hP*cDZ3YDaT+hi=ru-k$r#PnFWc9Fc>rQ{|0 z2*SVi6e20H8wO85m(S_G{}!1}e&#>8tdBS|u9<3S1!- z9ftPXnD#s4*6E4R5G~Ga*~IT6#zwYV=K7jvry3E7u9#kKFY& z8$zPmadXW#F8s%Y$yA;f{QXBQ^qMDz8<5*&fLm|g)$^XX4~{}#82w%pqu1@cCwXsO zsuBzu?WS!+ST)Oji|+4gh)P$AX38#I*Hi0ibnJo~v)Q$K4SHO=_uQx_+qImd^3x?ABI3p`F>9G9@_B0&Z);FVGhR1c?L?;W zx(P%lO0r7_EtSq;AgJ+Zy%vUg*)UtzR5~?St<{h6q&At}TFGFkratOwtC!tZ)J4Sn z(q3M%I1^Rb<3(Q;j<7|yWK-#-Po!xsX;Iq-8)=i1S}SW-xc1&dmvw}>OV;0Ew2h!_ ztofa94ub>^;yM}cw~<`d6C2ZE3jgS@DUKd$sA)Y~*B%pv{A(XqLLo3;g!r2yVEo1b zyT=pT%fx0=-RMQ+lY-c#JP;MxMMIYR1>_sKyf0{#E-cgBjjKpFpF8lY59=j>*P*!D z;h#~QX6=p*!#fi=9YM1rmy66gTL(CcMdl~2u^tA>ZI`cvxG!c;xq$|*EIBJ%P5*O& z)^Uji#FDmPCgg4MF)!PycV(RrBc$N&u&bRa3L#s`HR=ug zZYqLIy+nH%GqzPjI-i}=JUN_WqN;x|kP3^D%{_ix4%;%gn!$ejv5%x=%pt=1sFcvB z9A^{*o3~}u26F0_lEWyxtjly{<2ypp9fZG{sVYl@*4ljhMXHlCZ8YkL+! z;mCjWB9~SgH~x}mCF&8o81_SWyIAe=PZ;<6`>yLMgGi1=7AiMym(cFlG3U5JJ@v+AzVF8gjxuTI|g-c*8NlV12?_X5Zzp z`-$f&R8I~(xyiJNBU^J7h7t7{3*90p&`I{{;T{E}QzKYdf;m(7NU1qS%N@=l7`6=$8A9ly{Sj z-vXx1-OhG3$arP@xClz<1a(v)#jquQ1s3-JR@&Tu-+}@lRDN%wE^1Nc5PqfIC2wHW z(!rLNkON|(|9Ub@lN{qUh%L0;aI{RjD2fOmD|M#~B?L9)yjJ5`qh3A${ATehlN_mk zF!#d%A)rNp)NUbAi;I%QjN#abOR7OEWV@=!nhdU0lNw7W-?q=e#hQB-_nu`&6Rib( zL(x0Ah=Gd5^U>Snx31@aC3uMdvWgKL@LQfOt#Zz`38c`&KSwBwg|u7$V-4n?HjglR zvhVeOpS}ic^862Y5`uZV0L*mB8graf4zJyB4Gm^~a}NgD>HaO8dwZr_e{;%i^FDN` zh9*Dzz5KMIDkboQHx3axp~#Fy7i23R|I)ecpcy$&6Z_nMc+%m4$#qgw*~NA@NpIQ{ z2RUE(<)25?N#PZYFbbRVh?LPWM6y*QEkCnO-F{qUh-}PxUuAfV^ zRlv?bo?kt*AQ2&DsNEUyMddLNl;a^E_biSDYVTRaw_N7}p#Yz8;YF#Asv~D(%Gjh% zA^pZ*HIk_DnI+r`@RJH}(Bbglf2BPd$FfbVsw7IXLwiE^;oX!vKIdDHetG%O!Bhu{ zxGqi_qopq04(~b7h9%M8=+oIdzJ60;=zW)K$2OqkT$@pdKq9&%b8o4iHrGBaNH9Z* zQhO`z=D>4)-3B*3MALCmF0P}-PhN_1@h+k7(v9=jI_qTSUC%P#*2mY_m6Xp>1Z$*t zp)tiId_?DL9@k&Y*1g{n1sn@Itg9?@FX(cZaY^@Zq1XOVLw!DWW;#dq?k1QX%Xfe5U5a+YWBS9i0EGL-q)$*6Xh zson&fi29x18UZ8K>hE25uop~ zo!Y}#@Y3}xwawjTk?vunE$@KDP^toNC&V`oi8}diO#C^*!vCb}9%8O_+C?{AI6*L*xLrFJu9 z?8pBKdF_iVDQRe{&G?~v09g!8i(snieH|IEuLvhLY-Tan+L_a_PSa=tT{COu3>8Nf zW-m=;n#K-`*}3Mq?anfN5&OdZ5KgQ1G=~IN(d6rGq`HTSzah6^C`%PG<9Ir}_~)$30!si;Lv-OX~_ z@qsvk3HcmLcJ^AiXE>Jj>tcGE*F)k+yAzN%-Xr8lBfs=#xDI(Js=(n5cv0Z>@Ou5@ zz^WyeMO#At0L0B>S2vE$rt5O$`HiDN{DWep*xc|T{RKaMu-nZ3eE!i{bnZ?T?tWA_RrPz>b`GWg^V9>7)zOLvkab|%FSJL5o*ySs z;o>GF?B7q_o^)ZlrY6l{)@YpL5AmYQ;*R67Ng!CWE3CK-M?19_oVpfJ%&`4}Coi1D zSoI@m%6>A+i0$sqipHQ9bv6!OkH zoHA!fW94p5WE?M1t$u|j)pZot9Vco6?@0J-5@*E6fS&0`B>lrtcpN0!m)R^^<=}3d z;T?h-5uZ_eR6A}Ym}MH5gZ$K_KB;>XJr>R-x)A*kj{I}mq$3Hv^W0TLU9+{?Ezue` zhj{!w5Wa*v13QzJa6;qXjf#)V{v!P}LX=o{bmZEQ06rNJ#kQYU>5#b9ApcuoiQbp@ zn=~JM2SIph60$Fvw9k4&QWW)GG150DhHLaCxm`iKVX!j)A69~L)Ji`0^oe%_ef1OW zC`XpDjTE&Qq;%QoQ7ZD@U6N>Jccw6HzBi$PWVzg2cQ-D}K#0s|gYY z^SduekkvDrums>xG4e0Q=tw1br>X)XHs*S3R0(pfPk2JVw?q7ODN;ADFfDGWG;m_e z2d&7-U({y&a~;Lr4_mC#7J*lU{`WUqm;nlIkr*wKD1_^-<=a&z7{-T^rK}t}=f%_- zNOCzuWC+PduOLvtzyKwGk6b67S{VV|~s&y9L&QxHTtQFQ1&_wcsK zJIJP9?RwO3p(eAUby^#{l6fF?w$Fk4WA9 z2LZ0dP5B>Nv`eP-NRAnY6?a7!kr2^&ZSCNGaqpo1K-dp3izZ4E(N~KOP&Q__CcE;v z{6;ox-7S**>4x7=f}E!v_bL$hC`>L~Ex4_QH@dt~qncYICF{qh@#H-nOF(okv4>%k zATbp8_&h2mG`E)2%vs#ly=!u_$QPPhcHHUSP}{1pPIzyo-`c$Y`h4;>Sl@hjf6B}` zV(=f5{vh;ZVxVd```9gVb6t#cFGR+xQkd`MM-WyOB(baMs*ufz?=U$l1+#|`B1;uTfnevmp86_0dCXV6 zK|bqaB-2eF-$F37J8xN$a!RLW^4!BmTGSIOTeo~t=rBfo z3QnEoSQ#Rqc3L=wwKuLtBOoGjIl^lty}TmK){UB&km+L+vGi$!l3Vvqw>b|}Wv)ca znnbv{`3&ruXogFW4>i5@^0n+1VT!&>?kxomgp9&N`jPhh1k(Kb`@tN}===aR^+84u zKcq5eQL^{pTD1qI5WP$li(r2lr`^yVsNRUmMODM%log>#TE2~fU74*B8!~(vtBDCM zyOn9eBvJnN>8vqrAYc>@H-3q(8`y+qB$=K9?^)>JcAcD^ztkY^`Ox&)*4-7 z#|I$iK%0y;RKEI#{ybgqprUn1JZ0Dq-AGj%8#Of2E|nPH$c zWqxSWqk60x##mCX#8w1NBdLA+SV=T+-PRp%0A!Ja3o}bGtHzV-TT?>l7Sb$96S>vW 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≪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 SZZ1lnG)PI-$0BO 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\>YcnZ5|>m^!|K4 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⪻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 g1fH;Qi7zY{=gQ0UY^B|#kn(1 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 Cx{$p9 literal 0 HcmV?d00001 diff --git a/public/images/startpage.png b/public/images/startpage.png new file mode 100644 index 0000000000000000000000000000000000000000..3f541bae63d209b5bc1b21d46b529da6827c141a GIT binary patch literal 1379600 zcmeFZcT`hrw?2v}8;C+s0Tm>GZVMnFDj;1!L`6EGg(^Li&|4@{vlS5)1*G>92t^1z zAfTZ17Fr;HG$Di*lF<1r_jk@W&N;tx&;7jr-jgvx7Hhm^*~t7E`h@fhzvuOA+}&T#zi`-}_>C`X19|5ip5`26*X z0N%gq{Ns}`gYn->fQmDY|NAw|uaXRb4(p@92dmp7V^0PKPK{shWA8g+#DNwX9QBR7 zj5MCgS|eP$dnMfxnA* zIVoH+($E%AL3r2-NQvDPyLm|wBp@Il?_pyntNY;Lzf}kRQ@G^d<>e+TF7E5=E9QG! z4B=rfE+Hc$BYyLi_^n%_KnYP#e^)OnKT%iD%l~NP-`ja$>uK%b=;q~!a25E~uGKSy zx0k}DOTRk$=j$KOX=DA*e%!o0od52{##-Fg+1AC@)yq>{LQF#ZpN#``V2_yo0jmA$RNEqU>O zl=;tf|8e&}Hz_avUwi*YssHeO|1p?qu$2z$xG@~E7_Kwlep^^?B7%zD-y_MAyo|K72a*DvAD<C!D zIW|C#q0qM99Z`Yj_p(47MjHC&2Csj+?mf#762Co%0&fa{kvaPz;lt(Mt_w`zssEkA z|7!&PcMAW9rTf3T@c&vbzeekScj5nFeg4;w{pi<*xg1`_XIgLp3!*f3_O=4NBiO zPBADTIySa??t2`eF=+3GS)CU*FYlhOyw_{i-|96qB;^+llAj0JUcCW&CT3dmxyp6& znLlOzq+oaCN$$}Sv-%c2yY3`gA>Ev^+4k6L4ReS+vu0EO9L?16&2!f+<$PAk;;w0p z4+-hra2c;`emK>1u)rHP^FuYd#q+RA;Ntn;13V#~p*F&^sOE+fy) zm|#2XdQu!?c%`cj_UO#va6H=hlg)SM{+7rpWUni%B0z&>9r$i|k9w=u7iGdMdQxOs zDes6n~uvg0?#8r23Mxd}%Pxn93umJT0jbbt?14mb~wk?~N;?<<^2_^@Nx?$>4pz zBJIWomx;>n!Ml#HaEH6RGmD@j*NK{bP+c~UF;y1Zht7ls2fSkXt+_vT;$7ptj-00G zgdT|SbM%|Syo%lgrI68$`Of$;0s?1iD_@x;3l(-6s4R5Zv|OlPYqW-<^(7^vmPJ%{ zx2n8J2Av<|s&gq)!-2qTGFyPIfIQys?pQk(;bhhz^@)f%c5BadsNEejdIr6c2ph| zQvrO-s^Ej&lV#QCe7SDv-o!q7dr2^*=;m@KE+A3>zR>lNoR{qSNlWo?G*2tt>Y8Q> zi%UiBlMf)*C0t}YQ)mV2mj`Mnl9u%XU=pj4^i>Xs7I_46@^`lU=db4;`EU5n3``xz z%Cvp?Vl-TAOkSU9U3ekmv=&ns@KkWHw`sct*hhBKQ-KxG0;B%jhLI7Exo=k4YO(Ay zb;B6KXsptq1Aox=TLntj?L5o8mXeK)4JoUZ2##UXIxk1R6VKi>#Sxh(68STr`+b|r3Hq+MT9P@NfSg&5&CCJCA0k_h5N8o9sK zW80k`w5A|JBA4IN&RG9wpN^e7G}9;st>iuV(D9m2&JM7Uf^LahnlA4~F9T0le7(5N zb+V3wQ^{lQQO#9+B@ZvJ)Ax5*DkPnT|9o*^d+j$Cb7)8w;B1aIiV=i5yaC39E3c$f zuiBO6t7F~XEZ{|3RJ=-?Xi4+E=~I8O@z~&tM#}Ud4&8|o;gi#BS$nkAiuB;!@4Hlz z{Uju4=#zb~D?j+Wr8Ln`kA(;=HJ?MP@cH`P^fXB92wr^6CpFw!m^7@Yk@OeG zXy8n4La_^>iq?$cH;G_gF-IPF!)hGfQdh>8yJ~%7V71<(A9U8K3U%X4Lkm>?%pl1v)S$oOms%^n_r&fhGB`R;9Xyr z>?pue{Xu9732|V8-h}r0SE*Zweu$5v0i>my(o_cq%3F^}V}3O>)zAOb!XV_ab;7~y-GeWyXHuuYxml(*^T z@=#%%B;8t@f(|xl4D?5Czg1fSOux$Ih0j__*f6G(;|tx%q6lI`rYNOBsw?`?hY=)O zqye3M$c6^C#>q_ANIm=R6i4X^KWmmU&7`{$rnj%CfB4k#L4;87_A+LkI)chTyZSPN zA*V{CUp;kl9DHd0NmG{l!VTIR4Koaq$_T;A}2wCHP>#8+ntU-ZppUIGvvT%B9Is%RNsQHoRbBJWaX7U6oLx|Idk z`aReB!zfxq>~VrF$mRmFDS-pt6;_e+Du07Tjv zOxiZwaldYKj^wj6kS~oLP&^pYn@L3L7e4b`=wi*BObDQYLccWmXpNcZp3|Ond&w!( z;=0UZjDi?7ML@?x|L|2qCTJY*C)Iz%PjRXczB^l2Xb zHPWcWQ~y!{Q^0|03=%~I^4(I$4Vx%F?XimceU}DR$Iq!mjmBxopEkL)*0k2h@d)>$ zLxgOWK45xmx#L(5dtVO`s^XRjmo?suDDZ=^HNbDcnV4{B5e?fHo47ic>q#Kgp~(FG^Njef_J z=LpUu)lvoJPc=H{VP~#qes(OffQn zM!)G~JG^YTn}6dm0vZa%Qu63NGpdkN2>%0Wp5=l$I9lm&dloYHYC}Tu3nZvA8H*Sp zmVTf2*_ls3Iq6vSrpS0kEf4`zb8Tr>-g7ZaAp>&Zf+JvQura|gHbBhq$Eov{7aB7C zLYWD1SF{#JwB9Rh%*DmuvVEd=R~i6`R$O&zONu!LCX=w=8rW!|dzMsrDhkYN7k5>Q z-AX3%`>_Arib`pD^cCuiYpkEsay>WyIs1M{)}AkYRSG$L1J>YIPA1~y~GgT?oofcK5+c%cI5| z+nCRZ64u2gSUBK3tNNtsf)4@+vm<)K;0(q2&~B?%6k%noLLuj48{u`4F#srC_P5;) zZ~<(ceyo*eNJ%=L&Mm%7Zuonq4SwzjSM%wa)k%ZwhcO)YpxTD?6Ov-$#&tu&2E`75 zC#z;Xd(|kKTU7aGU??iUX{3a&fs+>VG&K3aE6|BfAbbo&LH5Klr!cfAn-K#)bKu?0qdpshTEg+U zzeO2Jdi&3Je82=of~0~c?j}om=1uy|#te5P8=q8F9lMWslyV#ST46L-oyB+A9iumx zMG`3#BUHI!UqDjyv?XCx#lz&cu2L@JL(>^;qX5VnQ{xY^Iqi7anOy4R(x0X3Gj%{m zm6h<^@m%al)d$BM)cwUM=et@d1UZwwVnLF2E_+YBDC@UwS!9~~gvIyhN9LOF;bNzl zh|3y%jX$hcHJY0ZgB~YG2>eu)k5HPZY(dvme-Zk*dS9Q(mCMGkuhOXe$Bccz(_Y@C zk+-X0A)E{~989cUJz8}oC~V;ZsBk11JL23KFKWeiMLqr$paDI+PnSHTq||yudhgHl ztgHNnUNg;j5`ezf?j?vBKT8jy89Us#VN{U8C2G<|Bn`G-)kt#a#^K%Cww4raeWk!w zhw$o&fTE!Njdq_d*cq<(MLHExfSHh~yd<15wm9kQf~o#Qqga~70vJ{^RW>s33!?FG zeCXDAnND`!)mnVGJplGjVP4|VhTu^AS>iXeHypH{Q&&LVm^a5MpU3LvJ~6;2OHlkc zpqTQcf&I%z0c5<#w-8LWvnL zYlXv<$aBTH7U5)tM~$wNvYm4=Xu;y;V;cjx>Zr1XvEh&U5P+ls(_^iPDM=!RnlKz3 ztC4cIU)F2IK?h=PsO<|x`NP!~N~Ap^(r0AS7lrKASEAi<97qf+OvQcl2Ye!JIvi{Q zkQ2p6duxO@f+{UR4@MHg=HNcVL2C5ei;z4+21UKRr;j5;5B_!GEVQW{0OCsS9BJ-muatu&fc7hw2J`)`;ZDfIoyFFn zdATY?H7Dc_G#Sozw6kJd;aq`Q52lVtISqFWY;P?Xn)>Im@k@1?n1=+7)=v_9lB90k zs=Sm(OBb<;A4=d4-WIG>2>y{dS-Nkec(hOH1MvoJIk509d{1t-3#btbIb@_AGV_n3 z4nJIR;wJUa*5(8|tW2qLZhuxu1i1@;!DQI|3KRk7U-|klF)Xp}b>+|9LCH9dwx=^L z#gAQd9zioH*})nY<^68n5hqDtGtnQ6NBR;}P$s~_Udcr9)41^=$U(S7{U*A|c_xfW zYH&>u0LQ1SCQy)oZzfn*@`x4~xmvrZ%uAy5DlLju3bpoLp3HhzEh7ztQYwoc%IP< z9v0ZD;+48D5vhKXOW3BIn6hn|AZAehOqEdMp3SEiI9i4Dqek(%mgy^Es!jBi*83KY zr7y@0hnLIX4zvZav+dR{gL&P8pMjXRuu@E23*Qls7G(F9eZb6?7AyY?IUe+0oet`JJ zM$5S>z25o$W4{*g4InyiB=U9u#kqEK-eu>LZG1b9$3M=~)YR0dI_%T$2+;SQvF5Bl zY=pePZmI|2Ksvz`>PWndryZ=$s}Q%@Au`iDkJF%5+z(g24izjFCBBh$oiOT5Q>X{r zEn#!M(|!$k*2Wwhp{k|^8_d%nPbvnjeCiZC8CuS$m|L54X0a>H1?x1z9`n)@_W=ty zRs#U?5~^I1Z8u$(cTS&n)UYy^R2BY-b}6uxEEEI%=uj6!G#m!7thDjPRsim9bU`E8 zIY)X3Zn6m=ZCI_x{7T`q^h#Opq5KkJq`#tP4g6U2gC#`2LR9zBG3V58Zh+}S} zpyK-{YCVjx%XpQ$fge#4c$1_~{z1~vpGiaUzxdk2gS}R2rjy;$yDL(Qi!wep781?o z+0dXmFvad!q!A1Yx9#;;sdz0kd>n`ypH{0ug1;P6w`UEAt@#@p?g0BY%;D4f_OhBo z`oU;&41wrgukrB~-h3I~X;SIz__4yKJiYA|Yv>e7;d(l;`ZOujz$Kcr+7inVSuA<@ z8<1$al7X$L>Gqk|U%#Zd%50_6x5^U3;_H3aHv5b!g`5qlUCol^9d-S%EtWv+-gEM_ zmN5uyYDaThx*Y36xwm`~p*Cq_-5zt&s^SLZyk7XS6$0Az!vzI@3b+=2mGe-*8|vcy z3f{z}iks_3mg;bWYP8!5K<5fhf6&)jQ6-9-dDgKLH;2t5ainc(wcAX~P4iXUB4qGA z9pphu(q-@*nEP&3hh)OVEq?+yxIS0(upX19cSzr1@U#`(3819_zIqH8;1!jo_;`Oy zb9%)2Ch>!5D+H4lP1))FC_`{-wbx&h2 zt=@Q1LaqFV#eX&a+;3%iXHK;|BO{pfZVyM_^-G>Pg%C>lA&5Uqqe@SWPx?-|z#pal z2)(P2A6BiXnRKV$W3KB$m>RUmpj?HRSmV6(sV}%-I%WJM*OS4lwWJ5K| zI{V(VzQCP`>Ov{NPFMNg)#^qY?s_eBCWwQZ3$j$B&%~b<=rm^H+;;Mr^fmwpLSBhy z5p3H(vpFg!KKXk(m}3k}&Cja=fnlc3R*f|3>UaTZCxI;wYkd7fHXob_32jEZP1q1K`iKEIB`CI&0-O(rFhX zz0rG|vszwjt`~0Eu(;&&Z>=HZe955D>`gA=hAUQgDMsHm~!Kh!+M;!3S>OfrFRxEvzYHXfy>=mcJUynu)iDhz(nVxJmWIYwudJ zo^JtAN`=9cZ3a}TnJgvR(2Fs~$=-Qo4_MQPl%}IYr20&I6`)J4XGY|d9jzSy7uocC z16+?jdij!ntd13xHat@g;#mc_(N=&;ozo~9Y#pKkW`A?I))F5<+U)$HtSmCt(Q)@=DdM<&DP>Y}O; z1Un>crAit}r;6H0oD8^iFQF%oO^9ob>L#fdGgy z*>~!{5RFCl2tE*BZ2h&YLwWrDQG;&jrvt)H786Un!{Ht2u^x74GsaZ?Wid2L7bJ+J1al;2wM^y^MmjRKe#yUR% ztl1td(_NGNmymo!4)+kAC{HK*PDKf59WpX0Z&yBeamL=ITQ8%)Z{tTM^bT5EaPa*E zX}F{Uc(|yg?pWk=wV0Qnm7gNFZfzEmc2don9Ka%OId+|=Ai;w}v%QLY#X^>TtufLj zKHwh)lsu?{noD4NZ2Op&bz6ir;-?jU91`|Km@WJq+Z(oY=sk^`rrksxNOXmcL!Oq}|3gfqIx*UKdu2iH1KD0O{ z`6g}MGk+sjiW~#^Ho^?zJcGw+yat^XH~aMG2^1H^;QDsXk!iH@N6@B-b}=11Ig5qh z%#Y~>9c2R{V%S%B^>7ybrS0MU=)fHcYOk;@t}3CA#*?;{d;~Cm2HuVQvI-Q2+?(vn0~q!G%u2xQXT5Gq|O zvI-l*J6u{F2&oySahc;2N=`Ec{maqHq2e!D+f$6|hHh(W-g$(NnI5b<*v!EM>Sh;T z&A&juIy7P)BzY%NSU+26mFt1-=aoI3DS|2Dq5igR=*Sd|({qr-vMlg%|9skgKQIHIf0tc?|RoT#*_uY>qM-RA#!)gUVeYP zc^FBdut`sF@Vw&s37suZpi*1)62q>drN-R8X^i zq@-k?-i~jiK}A5KMJ$=NQT(}(7_z09Lw{Z|d5&w^puii5h~rz*vytR)Z!eR9bu1C- zcy3op>1f|GdMoJS!ECG`2YT2n@?i*X1U_KsRAT^DSczWi41_K-3XWw{?YH+7osP^y z4!n8iNfz}qL%_KOZkIKKvmcJZ5Y(!If)=av_84A!YH4lT!@YyXswqO#&Ms*^^At9J zc~olK?|ocL{rG|`;!i_u*hpzr=CuDqrPtfrHGO%-RYs8k)CoZ6Kj6y$;PNkHOQv5- zFud5ZTZH&%8;JJ(uDgb?K!lugmy+>O+u_U}@~7=97Q4#z4#$5bQbaI^bKcQaCz^uU z3YXSn<0GWxnfy7Yg#cO8AxH1twP@yODdf*bgAazAJlai!1-VC&H zr0Cv#JZRlS8HTMU62sL|@;^Ck0rpK2J7f;v#O@(So{yHS|4t z^|9lBj2;KeTbANzCM@{WO@=h(V2jxErx}qTrqwZAd+?Uelt1L6VXM2YiC2hr0j!xY z_x)Yu&6%r+@~2B7Bi?bXDr?6Ej&LtFPoU-J=Kw@25G>EJ9J`}d;F4a=Wh`NfM>jkcD69u+kk-XAy@v?BDanEod@ zy=Qio*jKa$Py#}MKc_8X72$F|t7V0HdE=hFN(fLPgeqkd=^J}d;fLVZd#if52i}LO zm|0$8`>NX6$qa4?eFK|;2aQ^XF9@dQ`OVi$NYu4xX_*yIw| zaK0Tw$#62(`zrFZX7ady9r2{UCCo~5(sO7brH7waA;61;Nw}=QNy#(5%OJjg94DKhzs1ozU6ek4~&y#q{k0Rz#6o+Y1zNa^d%Kco-Pwkp~nfw=BeS)#AS&50kq z2kY6f4SWIbaU<1;QLV{ju?Vx4JL`2-*88S>6!(JXhq-ZIW7#zl{kz03tu0JmZj~a5^SW z`V%~fj+AdGSa()M9O|zd&gSMZ5ZI+)3+p>a_oH=kgr#@wF0T2Qt?K5YIY@}YWy zkahab-mBFQpBfjE{*W3>Hnx_3Rs7I2^`whh$cRioWy@DGrNpAChZs1^MjFqJ7TqY< z9!z%khIrcao^A^|C@QVWRZkcnu?TUQ#Ia)0)kSdmf-BIOpP*nOco%8ha?5sejw1&H ztv6udq|@k?=gj?@JNyYH#Lg|NS6RfwNm`E_*_*$$j$3JGF0RbN0(sIu>CS0`dLI{& zwO+#l?|kXLjwd5i9^kBaaSO5HwblC7PfiLy_ZnicJ*jdiiQ?(Xma^~z75?!x!bGKQ zG`FA)>~rZNAk841NbmdZrQFOrLz63S6!Gf%cdFt@KC~ur@JIujpwCtnyc;x&eW zVLzex{r`*znF^$6AR^`MEP|*|hZy~P>h~27X48_G;_@H4I^nPe$AsdQ#5ry#tQQ$r zetdmi;?fBS{(Rs-dtu%}JlPAJq>8M8S}m#D_8SSA*0|LWIfIA2r9S6Z8a_w#q@-hB zR2K_Z?q*BJvi?rkkfNICe3uVv7hV^vqeB8bN+@ ztE%QG;?rX*sIc#?0+Kj(dx!n>Jg3&d1kgRdH5^?QGgfZ6kjlEk z4_|l63%k8$T9|<4w`OwSRKm&{S#I4PMUUM*JjRrYV4{`Mx%FaV9V8b5kOhHT%`dtj zRR$UQ$Dm`5rau?q6G4Dxhl}yDWkDVHdX}p{%fMD=)sWTG?4)5&y*!zNvB{r7?%Z!B za$P?9ez`TTadx=E$@Uc{IiPRAW($m6c*<8b-=t{V6?)d^b9nJvV?E=|_urkVHQ`nE z*rSqU#mL+z$rGF=_&ThGknR=w6f97BUp++YZprPVi#}0D|8evEUrPMZ&Cn2MOQ@i} zM!#8=^BBh|UAJG7t)P6N<6Ew*rNb|0t%T=AVN%G%YfzRL@1UQ8oeNgnk!?ekg>O1z zq>1N~NIjB|vY(?{9)Ye1app-Wio%=q64eGTiER7Z=@o^^?hcSRLAu(AI8?|GG4VY& zQz_@R&iWE7UC+qlHFG8B7QXS^4Wpa;wG~>nILl^blVm@eLrJ#w!%kD#o$!v3x~nEn}uycI+Wr?2{b7fQ zI7|kSutHg_r+tajit@}DevJJrTs#8gDEGZ86i7Q%Fk>t74B7eG;kUOS-qeLX1$omj zv8I;9*ci`GxB*sY2bgNN$)a4WLx0wymr(#QEAphuXj!pEH0U^l@@7s0BAmWTE&-Ax z?>v<*wS!`xh`cW>L$|$VEC^Ys8!{SF(57F-X)bCWgT_ckUXk{@X_#pi8SR~Rrllx^ zQ(50(eS2e+qeMTvtgWo2EQFesk(*a<@iTrmBaAWUQ{X_a3xMf0nd6%F2aXr?&)}3t z@Zz2!<$ot<(#X6$-4R$d+ zHXnW%?Ag^`OpN2q89o#~RV0CS&lqvw*ZouLv~qS(gMz_gM#xlfX1{mK7gmGMYeE%v z-IYM<9jdG%><9epYdXE~g<>$5(eTc2faVS|F$pWTeHaXAK~gQP^V9?L+~>q+@{i2E}dTqC$iNsW5*hI8LVvtcNJSKkQs$ z1skPpeOKh{(0`=gtbO*)=zEs9}&aJD6RZI2^oVlRtms zf@9~y)ryN(228dN{gUMz48K)gT?tn%i?f(|)~;|pxx&T-oSRqq6SpBX-;FV-(R{c! zKWi2*Yvz$m>DPp9&%45IZ#?HJc&8X)d5(=>txB>3wP!Jq(B;g|OVUVkAFXEk96$0_ zF@ii74yn>`mE{)A*YwMvdbvvNr~bc~i4&nVhhX&%^#g0}$e^J-v~33SUqj0NzV$vd z<=!-(fg>n669uVqC!QZE8c`R#cscEUdXQ^(X+59|U@`_I*-ADT`r~hMeaaghwqC5i zKJ8<7{i#ODxKgA6J-`8qdC4j$%2dz!2cBNssKN9K9nfk1jLENOF_H5o4?yGN4#%B{ z!$uv+R88sipgGYH&_rSL>a}z!n0f-LF2Dhf^KMvcwDeab)N@*7dzN_mmAEvpwim3Y zwRG_C0y**gF_JV+F9SD?nKn}*tw5>=P)$b9r1O~GFFVH1R<;BY(7Udashpa95yGgE z{HVD!;sB>T#pS2>+4R`0$PP{~4$v&0{`9f~op?YOm9>;DxdPVpm=nt}poJd*H;dl{?0sH-Y$@B#dZ zFE$w-;F~&C6a@E5ZQomKniBSB&|bVdQ2NmZVy^$ZJaG!l$)YfVd>ytX8C0(l#m>eC zq`%EqDh3fNo+&#iRcmF%5N+~gef4~ILhley(u6411^e{qqpCHGekGPnHxjF;*}hx9zbPx|fEjUkRkhUy z<0BL)UTxf=5!Q*>PTGXNERt@fov4iG!m0biCRisFS>#cnlZ9w)xFX-r<_;V$a`5U>1TTK9eIDZWQ%MOd z-#%gc@4p3*{%SKHexT;VNB?a5vQN3r3Hr)bd>KPJbn0mlKL~#(qi5VNa(l;96ZL3B zQ_*rPIv;RH*A-SX`-d7`CEp1@t@GQ4)Nj5GlscGniI-A;La3)DO8V7hXslIqdwh6Z zxov$75Ot2}9$_z?fN^c5Y%Oyi@ii9@2i3adqcp%SN)Vc~*4U%YpWS(J=7eWoOM9H# z+1p^vJQr?Y`6-QT67d!KHY_g|gwlInj`VWUtQR*2T?#>U3&N>V7ZI;e+TJ&EdF;!% zvgu6ivfw#3P1&AWfC8Mf#;LzOCY|V(bbfr*t$#E%r>#3+()uC z6s;w#ZVe-ufyx?0S2Yt zb*~FGXsZ98Q@Ru0eOCHpMGdDx1p?3{jy0imF66$?Rg#k7u%S$_lVP#noFv z`n7h{B#vUef+rg3p!C8Iv?*c(+A%->=|>(DXRf(Dk?_dH*_^!lObI>msKp8h?qTzj zph7{z#Whoy2Um*ROr}(fVB|5bRb&_MEiUI2AVZ&vVwv7DB8hujK~F}EA6L9W*C19F zJRjpCrWKawMX6)dN=Fp0TNbo)#jCR{q^`MN87AHFu2X)lm;baJCT~+%UZVXmNf}@q zF6L<*!AEcMZhya)$*L=w2&xu7A21OsE*SXHXfL0t2pk2PsY@k|l(aSS+$gPEMsr*> zaLNq}t6RMOw4jjC9&;cR!NBXMZhsn}42#>4-`smHri&4IZSVuT1?e!R%l6wFBF~GT zm+*Mt@A#KQubP?F`LNMn?obv9+Tar5^`gA4Wrz>|{?};^&=9rOXR^*Mz28q?AfPE^ z$voSA6B&KjZyL>WQ!?0#kHp_iHJjDfNY&BNiSLM28Ena?wV!273P@|@e1^X}lsHlA znQu$mo8VL$8LtY9n^aigUCM*+UsQDVV=<1uu5+tFs{AO_oMfm{to+qXKCtkO|7EaI z<8Ft@uMC*IF+#R&Zq(2WWcb&~L5Cwz^M(gC;vzX0X4(TMy+_87t|c5xy-oYhMTVHF znBW7FVu9zMN|PsT3Y>K4A59^Qc%uPin28Z^e&jr31}KT>-p)rePgnFgV3QsVIy~%a zSu4MGVES~^ZK;~baTv<1Kn>1h@bYeI3Z5sIZayWiDFhtpAWK%+WY=y%33Sh1`YD%2 zfS9i`lk+v^Q&Nn~=cK4c+ z@t`B`^g)TAIBk0Ik$1n$V8GVib7H%Wm2F!C@y^WaP!m`+I5Fa-Y%TsUjg0YZ__HTFg)!RiB&(y0L1+;{sdY zFYnqp@D%}<3EOdW=9gk48etJDH`jBJG;WXl2t zquIRo-epVC2hF%=UC?sz5bRxqmf2zJA;*dCH*z0h0=!g4Q85)@l=gC!sv2ffRA%41 zzp+%ps$s?J}){5%qeiJ3V(QGf(> zgqIfysP=D*lvUqr7byZH z*5sqFC1s_cGP{n1@%Y`k3a-aaOP)C(a;4zJ%Ayo>oKvtbiNgzb_i_^E(tmT->YtHm zh~_l^IV0$(>P#btL;Ye}pNC(!+8=Py=G-%#v)kT-;{yR&DQ5V87U{a?~w&Z^PGHFw5*i}=cC0N zIKt+{8@8XZ$Uruo)J1cEpt15wbi$|x#^ivWC^px4?S!Ovu=mton?XZV%w9VbqCfe` z){});xC3>Gmt6zpk^&6xtsPH4G(Fbz4zd7S9Vt_e#1Ja0o)Nx8f(0{f@2|=g%fYuDXMANWHrP_l^z^F$w$ z5FHlNHmz+G>n@FKKNWc3&7wn+gnxOx`KFS`Mly=pn5)WP_SdVY_NlVoAi}P)pp#Mw zkROWzBYzT4FItOA(GuBc=@<%~F_oevZ$tzV=gZQ59oHr3H-TpD)`$vHV{3-tK@+4P zjowlNoCynk`K}lpncDU-MeIw~UN+-GUHUhN(X!HFGM|eIgZWxMPk!B6=RG<<_phS` zp&{|lgU{V1tX;@gme?H&p&^y8DL5o`@k*SH$DDi}V7=&`-a}M*30W8#qI{J1tNR?D zGxjot{aL(YyksSU8~w3gH|Oc9Ue_9!oZ6%*Ya{bgEkbB5mhbLq#$4C}UzP5N9kyIS zDl&fPR(Hkt7ju}hn`h5+KEY`o6+pw`O);B+{QHFW&1S3>gNk|dq2d!DCCeN`!dqwtLm2Tu7H zD?8=pv6qO4Xm4>yc{}^smH~81OR@>QQF)JgYGw_T*7h}J{h;@J0UjODb^J5PbCqsw zF86(edM}M5Pb2M8t;+`G%?Q2LCtp63$)LR<$i1@rz&W9tQtALs6}GAO^nV52C@Xq> zp8)lAZeCu(bhya4B$sAC=Z|fv235de@TZtzDSH;iq9Cbc6sl+{RjzpLd37=R1GL#D z5_)@1lU({3(t~UJUcx0|kmK5B`KG6}upY-MeM#jB{pC$27wI0EXBTi(scdFjd}6&V zvEQw{3j zuVe}NSIxi*8nZFMT@(;yGyXr7A@}X zF2yYrcUs(OaVs7iZvOY&^LoZTV~_FWB_l8S#@>6aIp=SwRUVqZ+^5Do{?m7!P;fL3 zzVu8J)O~5Nue7 zp+smw$k;TB>#~TO0$3dcV6y&n;);8T8lP3QZ%y$Z<7C`0o>=QjxYM73`cZn4L`9DejJgj zHx_3EHtlB_4!>JSB3C71RXT8zihk~0KYY?c>yh~9nCIN{<61u+$wY;$CZGw_}pB));L2;3UL}dXr^0;Fe3<_!8Ml0Iy)qyV6OruCW z_ZbrQUTBe3XHV(>stYi>jSoVm5J4?)WXp!{P|Dq6wupU6GN&OUvfmsIYvsnulsk{; zin~WOYgs|`hB# zxToO(DUs7$7lb-~arezg_(Np0r^@%@nv?Jw0>fZ8AB1i7@w&qy1N8~@PQvp6ej;db zM)D_%18%jh{ggp^u%)O~sa=b66JUtjKDGb!uDX9K@VIan_P9@^&9Da>ES0OWXVz}m%m*?4k7%?uk z=r+62e0`-E-y}5koCR)7{)BLpQi!S-i9F@ha+?;Z%+&0$ahJo@z|2G%Yg-)oLtVc7 ziVOdymbwmgbX44MlWO3Qa&m6#&K8bv^_Fq5zm6p%vhR76?vwJ#_?;uJx{dh2THe)H zR_eG!6-pX!`bKJ<(R(MOebpl28c&K3r8IvBMIx1AipIKEtRuLlY>rB(8}KD1p5VoZ ziz~k;S~n+UyBM;RcAS*S%=(g(!0E{AlH6Jsbuaxt9MumJG?mS&U|Ga74 zT<}V3x4r5QsX0#n3JdP{iW5!8GA40uik|~cuSnc^9}Rn_XV=}x{jWS!;jrDs>21-% z(^$NOnDLBJxWB!fpOnf{;2PUg0ISYQtM!}8X;%NbyScC*BND9!e>2AOcRVL_5RF;y(;Of3WJn-$k%MkyHW73tn^RI%ePJw|)1 zroUbW?Xdo52m^^aO**Qwa_K4OuF>PW6)hL`DAW={{MoBMj8>LK_gafHEm%Js4~)s;7?&7j>}FR&FAK~jIpV6c>r)MumW2ypxWee^R*iZmn~ zSCh@vBP4>UbrgqkXE5p>&0Z4Pso8vzrU$3bw%?Sa2K+n!{F{)9QVoJ|Le~12a4na9 z)5803Qj76UV!wBqDUjUiBvan(}wkof!1_69k~-;d_wL}2xk zzz56k#odHjYPTA_KRJS&sC+g<@cwFW>*Nc7ztBBBG7lHSvSj>u=Ti09i8wVdYnQRu zv?>Terecrcl>+?XGEd?T7kkNPC=(l)W(@po6)|cd90Iefk1GY1W79t>UGhU6?Z6t- zpMb|Vfd)ry%eWDFm_882y%MWxJ<|;52u^_@+*^Ts+l5k}MpHylBpX#A<7uZkyZDQL zRgZACd)jA((a2Y%EX zi!h_o&iZ`4;F;dY6mdR_uh(NDveAaAI96cDAMM%g%%%O-xD?%Jk1Vs)HI)YoOj-UC z&N}KfkJx6qU-Vh-`@1EcR_gy5ezWoN@83lJlPpXZdjzBE@VWFMAy%KGvZsYPx=gi4 zPbT<`apzN^obD&*)@<&e0JNv_Hua$7N)344Ugms>r#;2~P4mOQqy4Sw55lDwx-D1c z>hZ>=BUV)W^AZXn>-LY`#Sa=%-g^P5=mQ*GeJ1~$_jVF(+?Tz zVUx}K*K~ndtH(Ef5e5Q5SLACwKlb-9O1du&EAuTqTZ}jERl|P1kelDEdFKZEY#%mO z-)B*)yBI9w2kcGdT3e1KVN)CZLPh(1=SjIWRI6niq2;;pD^N2(@V_bv1#Od!`)fCBI;sw{+m6p- zx89JZH`S4I#YL1aWBOl~$b`&1IABW4D}igFrO#acavP58CFDmlI?P{WD-8UCQ&a`I{ei=QaKI2lGuUE<1Df|S~K%(SGvPU znHy5wy)C{!?N&3zenk8`!#nDAbX`Zz5d6_>$LiPAG5Pw(Okdte^??36hreU`G88sJ z&f05Dw4x5D6;5|2WAMsqr-gtw9u%5lg(pU@2|&f7yLzuL7oR7FI=lEd!ySk~l7C|= z-*w$-NKabQ-T30ciwy5vx=k`FJ&HI;4;{;%mswl(&Hy_=u^)8vZpq(%U{p8ikMdK+ zUUToSN_SMXMmqD6h)d`Xe0T}i@?M)?A~L-E3@DdrT*j?F&5Mj`;Sw>s&Sl;|`e08X z4ycsV16$uz$2EPeb--~fw^LGDWD+Rie6)*uS$BF|Bv#C=pR=U?M-1*B z>sg$wj;4$1AFc@FSr_5sO4B!0%YFKDvw#ZK?c_t^>I zCLxSMoXFNh>ujG2T3Z|h8xXjpNRzk>vZjgB9KTUL-@<~DJFT<#LwP1uMvc=*CM4|= z>iMh@je7jfyE8`KjR*~Hg$H-(P?(T7rL@Et{=U?o3wx%O&Bd#-h4nYLo|@^LBGsXWPwUrQ%!qJ-xfYNe*`w?0NExU5 z8kd5f!+r)p8}Q)ow?1N%qni1ipG+YU9|&R%-)No0Q4$bGWC&>C+=*zYD)(|k1kVkY zGj3J}u(RSlJU^U9LYoHfhQDt_!1Bq75WY%fpfGrJ)~_rNPJ+1iwyGSwS!sSYl&&L{ zq7tZJ#VdnWl#IVFX^RE{W3D$b9&3`7W;+Cb)P3s z+~giJ1W5{0y;ZwfO(6W}hclv4c0oM9{^vPiUDg%D)qZ0xv=Y!ZX^&vuc)|hsH7j4K zwh?}-TAHp5YNACA8tuIc66gEQdzElFp~Kvh%nbyrwt#T*SKK$*2V?IA{JceP?j5QL zh1yAJP3xL|0$+PPVpJn~gtxlp8gD*jlRWvZ2Fp~S;!xF*82hn=cX(3Y4ZO*{E_8jo8Na!|LSI-83ksq-^AGxfOIZ0;otk_9@D$gslk@L_ zVt$!S^Wf<@BD;aLcaj*At3%zhi(tIH0uAQ+Zfb@Yq_bj`yC+W72CqdS@;=8L?QA~< ziJZ7T6})YAX4_saGez{LA-tjv}j4v)1VjW4mP{Q_z3wP{^x4 z42J$^%_&Zj95mOyanMJ7e-@UJ!)GyW;^@@2WHpgRB<@i|kRtZ4lMmU0s7U+0_RUgn zP#3F9E}Qlw9)Hd0X`)@+d|+)|FiaY|JuEQGK6>N`5j_?XIGTsw;71e?wM$(-r`1)v z-#ynExAZ+dX}{Twq&l=i2=3gD#tWaToZz^j`_H15quVY$Gfm~2hY?Pv5~+bZA_xm4 zY(oiR3dz;zec9N%`p)uLLQ_l}A*b$>rZ)BUQmPWjZ?*9iFHaq&+&i5;_9W{~RiQq8 zKF%;7R*GSk(^lro-&QLIKl_mT_o-~>%4N$9SA(^`Y)B>9?CPa%(;%vfP%=VBz0kkru4}D(+r}qmQhN8% z_NUj6pr*o6UB_mOY0k@(1w>yHeM|8OAMd?@5 zuP})n&_aobSj_TC4rsdQY|()yaFWyHJW%-SPcNcxx@k+;FlZhjL? z2k>Vk*fqKI%+(*L8(txY5RR+UJfr(?d!NIYE7ZIYY?#=$_%-nI)!F}I-AcR?euGsB z3xlRZ5|gL~Jg9FhvK z;@-_>7>-I9h8mKB9!6-;Tx8QvGX(6>7{&XHkN^ltgcu2AKmsNJ(8p(JtnQ3(s3H;39~@Zsl-j1NF48#^QZ$!IS+6P_;5u$E~pVt8jlNo zbw=nyt4dO$2~*f)-K-I_4BSRy8P!G7fBNN^|M49XIfu~?)p)hZIIAAd(0XopkS|D+ zmt@f*r0O4`>Wy}C3o72db`zlgZvdckoJExgN*-q_gWSM3t?pZ=2(V7b0y5hc& z6+nm0_5=cNWAS)oH8sF2`aVUQMtGN87z^|4T4>c|D$sjX?B9v^VA~%RDM$Fa9r_%W zOUH*i>gherhVKa^i-fs87aztpxGY-0df;Y?fDMxt&7<&cKpUtHh{?#nuyprTVOr>D zv*(Np(AHu>`&z>9$AjV~7hHL?N=o9js`EJ;ssK@N!%^UtQ_h39;oCG@R%%(je`XPm?+V91t3=i_ zTeRq0WO=aL==>P}7a{hr*?6Yux4ML|7wmY*!sx3L!J*p5EvLXJ{e#4oM*8%m)+4m70Td`tm9i#GCvo~ebX&>tS2$;xgPZrAy zjT+}6Tgs(gZnzR>c~4ngRIT>`A-_-p4*f1RWpOc-*Ua!dl*sfD{J#Cx5!2V( zw_Nq?olToDB$Cb*$dJbnBuXM9VVv1}6UN5VniJsEiTR1echK&f2!d{*Al_&p%P}tM zu!ogu>b{nw$TtjX(fW=~2;s4TR55_K>DVI4hChy{#H?7yb8NDiaKf0IwZ<#?s|vm+ z%dQ=N7Xxd{web&-0!Zm>3fP;(sr79=uO%FPb9ALDF~4;>Y!!NsfZ+NADv{&WgD^WZdQN^C&%5xa*gZf>b4NwR&hU5q z(yZ@qwC)-{!nFXiVQrDv^eDWX6o=!mQ5|1HHtFv1qxq#JVq7z%X}jIU!JUb`kK<7d zxNKgZtb!S=wtodlH&t_0nmzrDR&e4~DScw-Jt3?ccMVD1vP*4jLxEVX-#D|ntnBWl z{SuNlr<*KYH(0v>yE{9?pxxX_j95jSxHt+tq+Sy3QS(4j%w1NILUWFCh_?#BA7@hc z!?~j{pJ0chTWOZQj)1%s`rDrWdKdqHpFwXxOvrWQ(bQ=NlF8-N@L6>$vVphWg^->Z zv0TpSU1+aG8lEjF6Hw>A!a#r<2Z{~Aq^A0(IRBnUZ+Og3S0iEt9BY-va+0 zcz=*;>~+h^*}LYwe0_!o!80K(X=UT=S%o!gTq9ghUXac1-Wy!vx0%jbl7QlJP)r^3 zh4{xfq!bW|sq<5=O*VMNRGgkM%!$IHIF*OKn~|A>yF4E&6ebVRgF({l>am~M$lCzh za(%ziZjqUZAs-+fNyb9~{`0!l9bKU~Ebrp(@XE++ux?%Q2J2PoUT@i~)MWP>=Z8)M z)OwPD0tg#^-fi@8CiU1)OnPjG534{jU@V!GFC@2a8sq_1Wsaxtg)I4gv^Jju$NTHU z8pzPW(+Q}Mi6r9FH^S+^FRVv3zS>?H?TDQ*ilCmML57a%naoxlm#fl&6V9DHT7W++ z|917Acrp)NlDDbgv)myG3@BP|0VW?lwwQZAS(BSvIlL%h8Y%RI2#c{k!`e&BxDvr& zbylid-1s!lcP#Ky@QK&I-vbQj&Dgv5dy`7Xk(dFNH9QtU@FnZ!lzpzx`gt0=`4uLg zAngbRX+tp@vH@E-#=f?QM3}t_Lq^kNrcws35PU5+C32x(IrXwAipk!ZIi`vO{a9r~ zM~nJ^w<8?THjf=m=a8Ri0`>c`{@z)=U!rSkb~A&j^gHJB7IG=3&ZUNA{L7EO3!x4A z!`t>&SwhdCHX-yZf0Pj!@7hob;1x5$hH>!;Fh9;QE#PR(MNc-5?g(kcR;agS8#Rym z;Yh9bd`ePmRI^57sfjpRxBl_dbx=3_0skKOaD$#Fu?F~rRr0d7N-ZYY z%}BC{2@MB+xtx`sM8#6-(N#GHv!-G8vdV{mS?& z4Be+5`8P6wyiHVMwVOa`!oklv$i(@=X1Zk=F*oSPmUQ6BTW%j7V zi`PdBOP-h}FT954M)8QvUb2=#a2R`+{4C8^hoO}kk}KJWGhD4aS}uf~hP2c`1)cD} zI<#HjhObT~lkAN)_@~vgq44lFN#5M-twAQZT+tJklH8?=7p2boxAacaopPLTVC$Ga zCS%C^4^rWTy9u{uvFlum)R0WlL}LXHB#=m}?{=8C` z6Y{YCyYl!!&@`wQ|5HY(MB9~dAsYBQ=nAL->IO=h)ggQIC7?T?F@JS!$Z+_+WA=&-Uay%J)W2MU@a@607! z^Ljhi>+;*9=^$qe)TFo5F8~&jMTspp_8tREkDgoJ9&w@SA?R4T>~z(NVtAG(@LwpN z7o;xc#rHeNmY>lv##0Oh=8vnXS6i22*LGqvI4eG;>0cdENjHKXGTyc~qAa-SlDi)! zh-)hYjycnfd3wD%DpQg>n7sI_QjU;Gh%upx#Qd0$MJ<@cZ`)ruY>b1tutB%_;&ad@ z@@I(xQb3}a$y$E>ua=ZRHZs8IR`e@oqOtwZRCp`n-cUzG?Xj!1l3+!1 zMVb0+Ufe$!LRAGvB^IqXyaR*t7%g{?W-i})ThS*x8e^)OU?rq7=@f&ZpOSrtwQV1A zWRHaNHeMg1?i}#Mm>oqYpeHRP$YTy23nsE`pvIX0Gx)xTPvoCxrkIyZwrg4?#hP&@Vn41N{UjIfrZDq1$uC5mN5$Feus-H|4B3t=pP4`2#kAEVmq zv-7lkmQN4>V%y-H8x$gP_a=qPItt2jTCz&>ITG(7&%52on|S`co8 zQxV5!C2KiMbDFT*V_mXBFREVITEQk(yx+U4R!K2f#qMO0u@nPX1GgUxzrEh-^@;+L z;Q4lpw*z*QDUw>!fG7(`_*-`N5+plGq|woiX`UnE1orbi&XS=2%^H%Y*?!fu6?~fu zm#D*|VYTc>EzjbE{UL~xaw;ybhXWTnZ`P5KiU0}FWFO9*NS3gG8XCx`y88UMVbd#RamrxYUkfP4{6RCbqloK24w#$wbF99^KG4K@n|wKUW^w4sG&Y` z=YkXky$7UlH(v-Kz6Nqz-9s*S#ZnB01VH7I!cmPtX^#y1d$}W#JfMP-O6M!GR`)W8 zoCDBbfH2Tngo~$u@-i8e1YNGEcOY}m7o#$N$YZM+xuXP8PfmnfG)M7=Ap8R)` zwb>^Tuv1>2n1&Vps=BKdtrNW(tqDC&xpPY@0Jin0nQx(q^~cIwPNYq@^alVHkdo)4 z8y2KK5gB573g&j2X|5g!{XGM*2X+p&ajSqnePVq;>~r{}J_)@Q5O4+X$`0x!A zI(fg1u;U?rl%<1W6);XA84;B_3y}^^12HL*IzwspkaqpGeGwG8zO_nnu4$8chy)~z zC0E6jWQ-JRag@A*YZ}LYUt}-ms2M}J?`mW!7#$7S1xXT#l5Pmv9mKNWLq+^?ezQJi zA$}%0Od!gZxPwC~SVNyw^$aPL{G~=5buwUULdZhB^Xrr@HYG!i^cLkYDr76E3zc>d zKFl-=iGUSCU5qh=*yKhK z4v@A_bn@i=Xk}yF*Y*@s18{}OE}BK$GQSQp095f<2T3Pw#2zN|H#lx`YTcE+EOH`A z0{?*dWx2bg?o4ouJ08?9`BH6$J>G6N z$9ls=WVZuugjvqN5LU1tC0vS&l_^oZ&@-j3lB5u(WklJS=JAE zSI>(CY1C>90%Y-#kcyAU!hG&A@KmaF6SsY3LZNtpxWkz258dOffX2?C`~JAd#88Pn*i@4LaJ5 zjUQ|2q651pCp-)NVh&LPx@#m2nBA`=ZdUDuEUpqAA8~XW(&Zvo`g_5OlDy z^H+VjuKC}bKj#_TrzB)K_{u5jGF1sJ2dpXf=G+(8%#r4jRMg5^9y7%0XiNBCH$3g7 z!trDK3_uD$s+*wK9v=7ce6DRfIR+kCIr z{nr5iiyJWCC9_R4qbiXF*H)?$(Y*E&wI@fmbxH4KQ( zPV1z@)eW{-iXzo?Ns3;@^W3Lv7?o9Q69RvjA7MisYJpm#7)0fnwlo!bvf>kTG&d>D(aAT zCm4f?=2ts!?l6Hi#`N^f{?cOOe^)mu@1tdLf7XOd?0{@8E-zQJmfVrkonDa^|Go-c zzaKkXFx;fK`Z#V+x=}GkgLaJk9+~i6-!zJ1_`whD+RN27)|S-kfR2vQM}9z8L%d{HTcNE@?rt8@GsMY?YhmnYtcR`n7wv7z~y(f0W>#!sY4 zI_2?SbD(`AqW9zCARlu*z3feu z=sf@uqK^bf3UVf>0{_7HG8h?48R-f*HRZFQgxFlY_>$rAEG8hqJR6bO_*zII^%`zD z(hUMeH2!~c!R2#F3~9NB6`dl6F#5d?BZy@NKq8M9rnDQ%d#XbXd`qo`bFJ=xf=<5O z$q$2>=MS2!?-SH9-5KfEZ(c)cp?>00w6s6(Q8ZBMvgx_8;$uWW^e9ve#8=_%>N(x$=Lb)#ivWi=R| zwS=~vgBx#6z?RXFNK)k$jQz^WbGKMgPyDqguC8MzO4|S}aX&en)-9SGS~~Jd%^*wiYH#;8 zhT^10i5?31lcUVCPY~Tnv-lXH9#4q#sX#;f=><9GH&1G zdjvF?yoYUVEDIAKee1$=dBsdFMnR!x;9kx~*aXQar2#*7IEc#Aoy-%z!(!kTb_*q|SefgFK_? zf{facqw$Zh&4&|H2>kI8q^&a4A-liy+FM$bHuQO<+5TI!B(hf=n58+gBJNnlu3ulFNSd`GtASyC4!&wP!eN@~7VgNB?9|kM z8=A*Nb?L^B;}@w|Bqr-C1UQ^6r$nqhfyo=<*}Idi9Vsh~&5$V~VI7I_2uzz*UN(iz z9iX;)vnK4_=3)tn2ER_6xno+&p9|z?;QXA;r{2xw*adBZBn)of>CL_*aNECa_rK%h z`dTz^uon|}PfFMH3~3y491y-taxgP8slnYd(7R;30uljfBUJ^`);oiE%+O+pHq)BL zwHZentn#XV@&1PCnW(Z?0D_GrQ& zdVOMgXbfL+X&?69NcTf?t}-r*hgUI<(fD<1`M90ZvY9wP&HMB=Vh$eHiyYk8$r`rA zWrPq-6VxSAn&6NbEA{r@&&l@02}hYSkh#(&lcY%q1*Kb}sG7CzJ%B=*b~v=5tnT1Q zkT=z$nx8DiCQppHxxVGGG~1J*JP|Ix+(pRc(~4k_qxwsnK%CiU4q_L|+Uq)bcWmUf zKkdjZyNMoTL2Sck6t-6CfN3Z1`5(80%s0N0m)i2vEO|#DGCTX0sNbF26#JC;p9Y({ zt11*`+;xo8K8dI-h}nyrxMo zo-xFT#cxollr&)|P~DNPQe};x;uOn;P?`uK01u5Q<_;prM?GzqGU@ zf}*s8{_QDhvyn=|e>hrbZwX=nBWLzWu`4{3?lH#VY{TGEtNz5I`@hO(goh_V?wMieZ43MM6I04HHgeK!rhD zLa*dRW{ZpY)#7Bf?Z4&~XLrn9E^c*3IZ0TtR0XgT7_3Z$cD?R@nlAC`R!BM+8V_&- zY67)@nYUCv*ut?oeAYdsU_8=1x_AP>>rJa78aanBnBg2hmktik6OaI@4VY`%i45y= z`+`l>N8SAEM#{(d>}*GCl7f_gz;zl%&OR#cppv`D<5$ zXXboOjN7ZRH}fALQk$G+KtlAaQIR?hvplx za6DV>N@*}~Rn+Uy!abVh{52Vbhvv67tX+jEm=@}oAnoy>sr=f7OrIO-Bm@kB*e#+X zu-iKsh;&>0B4~*t5xEB#0!l`yTdThum>LdgxF@lw?|oQaY8U9ya&A&<&;j=!n)*rrSH5rmpvsy@YyV9Ei5<;l zlrmnupJ*)oSBX z+8hyXv7H&W#!lS<&UIFtyRTCmvXHRz#I>!KTV~^?>r}&Tgh^DXKP$RzGV0O*ca2m> zJYm+GZ#VZ5U@oQlN^?02sAO~z!oM%zgK(9;cpD?#y^aTy&e-~g%n~HYSNU$bnn*5p z-K<&rN*fsYoWE;~ZfL=4B-t&A`Th0-{))^BAeVlrQJjMew33;htc^Mp?|MvRF ztx0|I_aVElo}~Uva?0aXX~rs|2NpsGjGq+q#+TlP^uhYJ`8T}_<(N85RU}S!4=K07 z@QKevAoY;{W&tn>cxa=6hHN?m?s!jFIZn`9%ND1i89H%eBF&-rE7uaUp6@b9rsw30j0?nh1m1_gIe<# zzOrJ?DnmgN?ob(BeL!PB<$JFmP!BlAaX}RsoY>?yiDly;%H-t;(=O6t`X177qw+$n z{%Hww56>63M49l(Uh)5Qs^Q-(Le8Tx%cxWz>vppw&{T;MoxFQn?31OgUUOfo@NVO4 z)9B?4>5LHEH-21DhB@8;dS5%hFM*iQ(-@VwVIVXj1aOFMkNmO0M|C{IBN`Og`@1mb z_0Hf?MnrLPTWiQ;0ud#Y2%7m6(lp)_>Q1$h=6&%^GQ2#u&!Z10cmAAu=vVU${B_9% zx4oYd`6{yD1ee2Fvc@Qr@G^>(ihNoBzq{7v+phpTRykEeD(vZ^elZxOiK&QmnU2Pc z1su5wiQnKnhrJv`$U=<+`FeuC!cw#zJ0Rk8dM}g8f|k_mESrDi;)tjiCj7OvL~eZ8 zgn~@m^V8pmFhLG#=0eXrBmp8HQ<2=vYzA~N;=i5LLrR7OQ?&(J@zZb%8C;l~hZ8Lx z`lFXx<==(Dg}r5y)lp>}SNYbX%K&MRB2DEA6Bh&}x$gJx>jq2E&SYRvYNn(`hrX1+ zOyJF+kr+;(@b&H?imlmv|M=G!dWS#kj>-6oCUyJY+qSlW<=NlR6Fo z4A#o=|9N_HR#l?#U|1l^KDntZ!vSJU*ss4o`$V;h28f{EJN-x~-x&F0_#vt8xdFwpH5u@rqmOtLG;e7PH|4Ri0pnj!z>OEVyK$#uBZniK z>7|PqyrY=PmO%x`0;n;2W&;DGqdc|-Q6jh^{XH-9Cy~#n=H~1uWNav;zQB@nKEP~| zy24BD7ax+nSGW>Foa6O^zf*QQG^*PULn}iXd1{GSwaGDfm29+nY3vn;s=Dxieb9k) z-bOEiaV0!lTgUBVQJbUGChYxhVDFa_+Q!@F9>(72D%c+#jrvuyffEmN&+48qrz3XV z$2|n+Tb*~c4VS5%eJL@djt5hv-K#N{!VJD?2XgZL7cH;Gfy%Qw@9>)C_O>p_m{R~B zNqgq`WN%*X&&$RC#`n_nO4t;ul5~&z2asJb5&K*r*=dOTX8i0A%DX0;rJqXLEZ2V5 zN9ab1JU*ymRDyDV*B_;jMgRn+UH$Pwi1|`{t<}UHVaeE=djcWFH%EH{R|Z(IFn)** zo#rS7)V?*kG|3!g8j1aw9)OEU2bhim^+OdzPGu2D-09_^&^^EtbH36DoNr2W<|Cc? zhoWQQP0CF?L1FTETKK!Fps&1N%$UU02j%mm#$&ezyXf9qmp>@FFi-<{i8mzxdM0dt zk%v)TZu}`W$zanXpfLmh!_0-;g_1e|F~xO6F{cmN$n3=)!S)8~Bw20HoJ9ozDxMm# z(a_Hl+iY2cF^2I>l51_HS^ine$7mdPy9eH1xgH5sd0!%Xc&Torlxc|6gWU?M1T2fD zh+)V@k=S@N_+ix0J>NZJlS|Zic*78lB`*oCYn{8( zoh8{f$z!l9vnd~44zpNfvc|msDX7S4Hqbx#Ue|9@?31}a#5b}$8UHvsEY}o5uRWQX zp4|FrUh0nkjBsU2ofTY( zt9V`ADFT{r$;oo7V=TB|$&NBUGw{np{4kR_tsS#y)y=<1idf+=he*m@DjR&!%z&JQ z+o7XWx?#a7H{B<(qb2{Xxqdr2h;70ae_!R?cE{N03GZsH1)f980jIeEk6#}wE-a!p zWJmjOk-v4{(z<8tJ~OUx04{4C#|h+?PLozh(?ed;PTQ{!?YfA_@rJv>t*Kd^6T1Q5 z=TY3{DY-v3D*H@KgxWu#iw8g$M|%*X!t(Y;nm0^q7)VBp9U4^*DdW&9h6YEnu1+^L zj;pJ{`==4{; z)RBE)G(Y-P7@EUGI<2~;f zfw5zmG0_lsd^IDMIhWxJ@V%P;1o5x* zi}qZw96C6X6Z^9ySai?C>wy^zf>|BeHAGE6Qk6;Gj(2}!5#UwZ32$t$Bs(>AdBz)v z3l!!ncP;RWC1h{>@%^qT8}SIW{JU zW{O{LX=iN1fq1Eo(8=_zvb7;(S1 zYT(ZVjBQk!Z-IRDRngKO2#*eVxHYk+A#PmKehCJdqBr|wQ^FCX8B%S_`c7r*0l|m> zKfg|Cn-!_5Rhq1{d0MAeXC9I|;R?M@P*A8eXI^_$N|Da)(AuF`)a$8qC=C@7@qWFe zN_M*4n{*~`LcrObVA?WD~a4-N!I{! zpcPg=M33p5bR3o^Aupu3j(t~(sIZLsuJ=#9Hsx+tAS!#Cfcyq0UM-_IM*^CZE$ea% z@%iz-!{Bq=&oiOXvQ9U4OG_R7q{Du1Y1l7oUG&VISjWo9H3c-9CuonPh9*+yk`4YW zj@Lg?(K9C)0A`U_!Q)_)9plN7w4fSOLkZ%u$F{v}G^ruCF+DVL5ore71&mR&%3UH+l!Nk((&GkRe9-;prlBQ1lBWp}oQ%7UGdE=Vf|JNdL-O?D<3}~yquOzc z7RdA~2wNcXKIkk{;7A|%DQ3LE7U}7AFi;xjm4=X#RS!T0>Gnwjs_Gr$570CpiY03G z&tym7{Xb{quF;Bd&=Bpc)(1YPpp=aU1Xc4mEw)PU6m#*YMy28Leat>3Mn+-QRXK;f zr(hL!C=D8~YVctseC13tBLZN6C3ilvDY0#g8~(UJ{@F$M@bH?1$w zMDAZgW>WQDXHr#MY%Gs3b`3!C(3u)l&ZDXLHqG6T>urwQDgb&%0!{85 znnd$JjgERExa5>Vg$+FVl-~D0)=?FDvco>)iMs_AD317Bh!?-J>sI(doc;g|bqo2{ zfySG~g~=Yz26Y19Ts)S5Hip@PCiTps0V8YR+V71p4_tIwYPMTS(m2U=j=YC}^w&Vi z#2=plM&{<`s|cv{me+`nxKf?i6p~4R&NRiPMy-*=5#Ob9$6*DVK#M=JcsJv)XNN<+ z`@~1Y{J_w^YJa)0oVD&Qx*E9EL#bT88vx-3rH?eFduXbRBqP|P%}7sF8>DP^RQ=D3 zLm{CrC4mv*ZHhxDtoE#Oza@E3)X1|@IwN}tx9nd_p9133loo7ap#jb$SE&4cJe&E0 zQ5=^KrwcYg;5eIDr=G1^P&Sj^zwZkYe%Ji6Hi(g}Yc{~yZH7Uk3rar3oIGP^*V2tN zefK1it8Cv=Q*Xebu+6ZQ+6%LHlg99HA_dKGISg$xKlSDL=T`kdcuw=$?3~ZdsQ(NC$?LZSfImjb zZw1cST^wqj0TBcw&v<lOiL|bmt;uIg~yD; z?0?B2)bWWzmL9+iENhBt4lR^UL%X4#$$~KFAl0?=c&|pVo zNYHHD09a!7b>K=*-aa|=z0<;FJ)g?7J@qR^|7^Edi9`G~Zf>`2=9Q^dCjcDZe|P%7 zk1Y-m3JQi=GT{t+_HiYkGKn1(f}GO7`{nMHJDugm-CaGlJ6#_ub)(H9>`0=$J6Xv2S4#pgagntU`BRYJkl=#7PC`tnUgCvQuY$jYU-d5Z z1fip7*JSF!dbyBh|j8F%8vSIzjf!?%Ym54NlGGyq*)k#Ywx+6z`FXa`{q6(Kb&8bVcsn<7$!ZZk=KF~Vl zK*6HUuY54|?+H+l#tYXPs@yan7?v6o_-tMk)xW*LM9N+EfL(eEzZwd)&l-v=&W`7T z*ZD=e3N`De$c4d&kTvis313Zt=jNUHH2KT0-j#EuDu!FPEzi%7(#`295rgiw@Ly7~ zOKN^sj$}Ya&xfIFgd!|QhSAq1e#0UaS8CoJ5*fJ&owP4)<{&0ZeP7FBO2 zgn~>=N#XsU$IEUg&xF*TBqbWh9Oj)Mz@q}&slFP)_={CAKENKMV`k>)iKSlQ zD~Hu+{6sn;8{fQ%t=8GAGzZQ=cHmV9iif@CYElxKmD^8JMHJ|cp|2)i_}?(;hcQa! zh%r`{SjK$=G2F_lb1u_*olM}|VdrCHATr1rm_=}{Ds3ggh9KyUiP1(gsS|(C9VN*KFmu%nBF>TgUg(?004m`H`&IR zdwYL}Te>W^HdX7@*9QQsW{WVi1tHZy5Po4uQBsCQR8@lUlbTf?&P?Lt?)kW0xXE$+ ztzYip-{Z5Kzt8o2FIBPyZqsJ8_{Emj!~s{hJzy-x75Mq}90S7WkV-vq>b^Zf4(`m- zkg5hU-XwujN0XDw)D~p>so3trz$zTWM!BCHG^-y8(nrJvQgYkDi_Ct>OQ0g(M@)jF zO_VmSz>yGImew5RgZpHCo%)Mxa$ahCwI|3G{3@WdZt(UQ z?~&hOh&lfnZxHcPws8O9>Jzy<_&|bXK?OQ#VRVx>ed|4r5V*R>E&w?NqD6g8Wja-# zy!fRiZHZ%kI!2Ii6kpfDt#jd(vx@E-Y&I=VWjIYU`Gx#YRpb^hRQyXsHX+B_NbD`| zBAQKI8G@T((>gMmKpw3|*b~}b_*Q;se6(@23e39SD@U( z7p)NF|G~CS_nfwO4=|l7V6+(R&=zhFU)@f7pw{j!ACrQLBz&ZdeaV`FsN!p*;x-MENhd0vS8rFhE&o9aOJ@sP zXDD=(=l{{3mD(WIZ&hHtZ$9&9ViBk66QvdbX7JzFrPOi0aH5qZiYVh3_+VbI*mKlj$xL>6WCS+cYLA*_eJgEB;M+7$PULn$Qg1-GlQjF{4$*av*)W%A0uK z1mR^+C^&)^P%BwEXbJiQEPa3WoQSfEvY*Wj+XW+1$PJtW0LTROsWMl?j)s)LCFT>1 zoISd_C-S}V<#*u#Y=@fFlPj(q|G71o|!ooxlZVlF-XdtixT8qe@w0 z@roH`bWPZ|+aQX_TQ&(HdQf?$M{^cRA*w&{_3e{KmEl!j!ozUy_wUg`0>{}*&(07 zZyyEnL56k}6&8*GZvt+wH^#N;{i_Z?wEjSZy>b1>C|BBn3_)fhKS!irFlK{(ro8QW z#w#eZ7Id)xMVJwhZyd})dG*-pO%yrpeY@!7ao1|-H}IULl@;DO%udCfukW{FM?4I7 zz35u1lC5_xw~o-O_k#ZwcuA34klr zf@5G%rTWlgW6bzQ+Du|-d-}D6waJVwh*1C)XR?BmG|TjrLJ+21O@%FE?QvT^!FH5- z!E@cALO;cC{dV(^Bc+~*fWKFnldeFlx!@j8q4(DBB1#2g1;bRx>CfdeR(jd`*g;^t z9@P>E`T+ao zW+*V)u4Y_Qo<;QypFQ#<@rIyH>t~;_Ba$xaRQ*=wtAFG+p}_JdB3fV4 zrq@!)ntqaU0pUrqsweB-8Sd_e27GBkJxa?s!Pw|JLB8=`5=&bDLv~K_%jguThWbsm>wl!ZNbLuxTKZxAIbcrqtwT_HfW9 zs+Weq-_qC?d9b4AZ}hw=fKCw#j?$wXz){s^tZ1pCDQ z+PT@>pgV3X?1T_DBwY@**jU#jq1eWKx+h~y{FaHIR^LaG&KFmp9&o^j5%}}3J|FmG znm@|xj@}Z-F)5yxCS~tYL+EgM^U;}qWt^T)BeQaYJuK5~Xf@8}dnLLwR79=Dp+_=y zxoTb{SUAwbqf6oSt_C5l{N+6~XoNz&L21kY>rkNmJ##&J=`WYVnqxPI4UFAstNvW} z{4H#6v20B72w_`=RL{}qAY=Bk$ zPQGiMCE4(Ath@7-ay~Lwp!!Wd8`Zr%cX%UdU~DdhD<+l2WIU# zSrdhrSYw97%|Prg%BwCFHBim{mN^loi;09!oKHVyi$(VlrUE}I4MYIc{;>dX~L zQ@~6_tOR@b0R}zzrM~B+N7P>r9tw}8T&U^Aa3M}ByV;c(T}z`;Wh9~^Tm#cf~8HJ--_H)fG4!? zHPR`aWL45#aU>*(Yda2B6erYwWO+tqvrrsJG4qk6G2TLzXNbG%s#1Q@{cJ&dks9xF^#%b{9<=qlRPQ-U8C`P;F7dl{yvo+) za!I4R+vH|RP2zMCD%5W;dbmo1(}JN6$PXzaC91AIlf;uwR9$2wIgXhUf(?RHLA}O4 zGkHOxEprw}e#W?duva*YPz-*`bG=hE;ibJ`@Dvyy=zKUejDe3GhwY_w+jC7dX^xn*h^b&Oq36`!*W%;=rqn z0WPC72e}p@XT&9a<$Y#v$z{}JmZ!H5qyg8+gO~VOkap>M7(Yc-*A6aTw-+jiX4@Lf zks6F`9ir9jJ`ZKd!+;w2UxV{OD&x`gw33VqsnylsM`m;nIdVQzBm7{3(E2uc4_W$k zU2b#z9v-e2h6qP+JwvMxQO}SPWmV9){j~)o%}~=4TPKDs7;~=g?ERLy1Q_ z7Y$5JfQP@nD^CM|LscO;QO~IGy6iX#sg`*KU@v@+|AaiUY*gs`eJ>*XBl!>Z3r(y$ zZozdubMK{|HitJ!=-F0DMH*RB+;&D_sBv^=lJ`Raw+~S_VW=e;ay1P|AndG`-3Xzf%dpkBx&bM(Vd!-?n1GPZL|}2Ks4KFrix!V|=@&AYLu=H$RL?Ek59%}b zSUvLepi2B}5vBOxiVJP0Q&x~|pAkQ08Uy=~ zDPo_5nqI%%G?Yu>*i#eKo_tW+suJVa_Kg`*7s3@SAorilo>MK_aHyD}55GSnwgvbu zWPxJsi3sVTU49670e_Gm;T6+rXL}3gu54!lrKidACp4>P0BGnqn%ZfmwR=)D=h~(7 z@5AJicfmu+@W#?)xrW8!f6gx0^3!-8tG_f6mevf+d9x|G1ca#v%*=B^|uV@~#j0}yGAs_qedH6gKJ zMf##sru(|e)7-o5wS7s@B*%^U5WN4+0dfn)hlLe5l0w6WX$IL@5r8vV%Pl+uW@R1t zL+16OIZ2Not?-(Af|(Kn>Scd!V77G_QIn5+8Tj^(9CY~(H`!EQ6MGd00=!zz^ItP!5S z@<%J}`Ed|v&A*35lO*-7Ygy^{_oz}v{3d_Pe9ml28#&m>jn;FjDhE0K7a$@2h6%vy zX(t9g?FuO~(!p5)I{4aU5e-fwsKiuzp`Bf4f8#M^3gE2@1^a=O%+BWMaRS557N8{IS|mVP%*&CVdW~|WAt-cKjc#kjj&VxoZX5hp1wdG z11#pn3V8Ee=4g6K1;pE-sA;uLs!w{C3oF-Qr+!GaouX+uY-pffoLM-s_HgS@kOxYr zq@fV8Iy|^_4tzldBnlf}B5;(t$$#}MjHDYbTYlN}9sYn9G3F8yqvn3*@nwTea` z8Yu2x44j>{Xx|i1%b=Ty<6+dVXvArsAMX7-GV)JNNsgLZS7p%r;V-5wMiBQrBqKEv z^aEuhz>PICD^&8P{^M;JY%adZ@Asw{?xN)#^BC^kU0K7h4@Q%otka;SwFxgy>p)d-+_pnq*VzK>X6Ft$BaR4nhv z=_=e{*Au5|l&OXW;PRQ9@IZ*fskZ6rDq{DQ-t zXzW;a9GQlUt?V_UgU)wG-~lkrMm16@%4q{wcIIRLShqu<9Ed@~k4rqv9Q7D_lfjBX ze}gEecLMNB3A27&AiIDRU=*0~TDT7iM>-=z0aJK{uCzcoG1l(@bYFx+XFyTlNe~Re zDZ}N? zA}p^?A4FCazH3i3>7vI(_t?|k+c2uQ=w(+Vj&VLF@#W52J0sA@>+bGNtvk<+mi15s zr=fzgX>Mylo$#?i%LG5S4Ry&+ZSX*l7x37;=ccIVx~d%+FnI4T7EzOS*a0X*>s?;CP#vyDBeC6yR5*fkoh+6TWC{7;Bgedd$b zd{$=Vj#GF6H~QOn{3qsR20aY9@73KJUtF10orL)NeL8#>c32zbqf0Rzv*1i)*(u{t2C#9_huhYI!QuzlICfxOO z(U^p2oC+3}a7(M(&vBI;l*~s@u@M$i>w!ch^cLIibMY}Gd@Pv1u5X&r4xq1e8x+&S z>30h-_C?r#vG)mJfvh9xIQV4FE;7q&(2ZbFa*Os_OHbS1vI>g7&yBoqzF7E&Db1R* z!3I{|XA~GGQ`6a>P*%gsr-rGUN1qhyr_AUHXn<9~Ay#>m_wa~>!fk8mmztg|X*ubR zIK(rDb-II9+)w*Nc`=DNq-pisqo6C;7^^_>ltj;8T3t;Puxux<%OH?*i{~)=Cg8Hd z#E1Aup*64=Lz(CG7JV!BI8J ze!Ssl^!7(7P*SGIlVOp6Ml+Mdtj54D)<{`bhwDIuCbl4c^)LN@sIH;!oS;FYNdb<0 zULC1tDP+b850cw){jRMkVa2T!riYP%*M_LDfLCGz-F<#vLxQk{Jkytmm30}qi#q?K z(W@y1%m=7;F#lUO+QRU9Rm$gRSw^1HM8FZ9KWK4CC+?CXXO%$SGlqZuqR0;D{-s%; z@^cF=pYYa+C7iWh75!xvY#!wZBzHi4>96LOu0$}V_Nc(*5^kZ@d4Yc*@yNKU2YtAV z|Li~?fH(1$%-zD_nPf40Tzc{Xn_W;La&7PD1-q8o(9$E>MI-J|^2(^6lO@oYlZ}}l5vVtB#(9lKL2yXK_xb?| z;CQd?%y>#uR<_00Q%qBPB;5iI`|zXhGl zO=?q7kI>H18}bJd;BSChv>6c6-Hp3YQqi`@S~$9*xYX`X1YG?M=Mb!>cL|5qn{lXg zrW9TOIYAntQWM){bE+33(yx7$T_`cT@53ZraY!ZG55DjVbR~sZQlwDLnLC3F;la-> z7Bi$S$ioNYpNG)!-{d$1A+2^LYp15aIywpD{$v*+Iq$xB>bbeY+jcC-HARg6Y)L)0 zqATaR&R#A&Fm^QCpRMYVF6JbNpx7YVh{&L38oRF^L2bk$?u14TCfpUtf@`QPs$$JB z7RHxFQc{uUV4e2s!$B+gR=p$K4>Vko%%q%*%%qR=wyKP9&<5Q~6bs90QjZN*j6_ZR zNEp5SO1?<+I1n(7cvs$osF}bdtf%w%&uK$ zH&HLn5Lj+QBd_e5lMAP=VrB1QS&!EDAmGG&6_DlNvR#@snw57Dx+ zd`kuDwandcFt z8;UbtNZUyXE62m=y3n?Sn}ScunN;`s{5HF(hE)eeg0(w9^(%Ogy3~rmdNSNKf)f6V zVClf z$SDGWh$ujJ>bmg#x*ac>@~#){vsA7_j<2{#pCn6xDXrA7jjklSjh*vu5U_jCoZpHPZi|M~O@gBn zQY-_jeQUPs$woq!a#3@fHg#^&oz<5{g-4Dex29?JBan?0#|<#G+W!S*F$(Y3c@frzJo$`Y2xMb1Rpn(B2u4fKMP zY`NHWlUW*DX>=rwvoYGr^Ul7#whfvM(vO*F7~3O$WXl4LxXfVF(1?CsOkXgn$;|VohS`Fx zPsnSOisqFvQ5E@9-0T{cjDKv_Daa3J!3`rC?=A1W*~+3{J}n7j(E4Ln_xU<@SS~2$ zoqp}fV`{Q&`_+>Bk2FZ3%(OwDHN}&i@942=7fLH1@BDrt-gA1FN&9LB4NAJ)wHGL! zbrY9%x}!tt;H=6vP=Hw^WD<1QDcC!Oe42s*=ux|1cmtoXhc4&isXr{ge`und`nTs^C6sY1|8N95z7g7HB_(rt3{a?Z3gkXAc}4@^ z;c);-$OC}qGYP;bsuSU%`v#T0hW7#jg;+ox{1w)F%?N{LN^-e_hG4DG>q#YbnstD=XT z=pC=SKF$NokSEZ!%NBSIY74^8Q2B=~D4T|a3jFuvZDj9;kieP*`WNzt?t7344IQws zWSI?9f_#AegcasS_*0yKxVEIaGppwx20whv+wxn7@kcn{9@h_By7X*(ih*>;cY`FX zy@bPLO(2`lZpte*?dNOwxy;MyLcaCBx@cZ)ok=)f;@_T>0rA(rJ^vp5e9cE=<7?I6 zv}f2EM(xN^LtObP*QBdD+aVYDTw11IXNUh#W>7j;YE@hq^8(SB16zCf_dzYXR>=Y7 zLI6dBq-B|G?yHO1=o)|?nP@MGi^VXibH_XxqZhc7-haHV$Hh+nmUqlSEV9jdG;2?* zY_JSmfC}97Oqrx|HID$0xt7Pf72@-ZUNzyTY>0j}=m)a`mI49liU;i3Px!C2c8%m1 z1TbK6uzh?WJgb%jc9&;cuD~88>@d_tgpRNJh3k+)cRWjAVQa+;$n*;#0-_*zQF*C? zC&~DsxayYJu}fx`-*5pE9X2=ZUsLP46JK`-B$-RmPBQY)RYrzgczRV5WdSev2kQ-%H-8eIW6=97}{ zFBgxfM=yAY&J(3$tH9zytngW^GS-;)I%(Fs^8GIz$&N$voXn$Ywf9nW@tv#D1U(~t zeU(^?gPGRa(~udTkkcEgIx!&E*mWXNzs0?@0(mW*V~sFHx;T{fLQ14?(J7R=S{G?` zJ=6Vce_!yDr;B1;*EHi`MYgs()b$k^Pb9V`kfQClf&x%gTF7c0*hZOsbqLY{?{Y7RyS&_G^{pOZdQWndY6y3LPlUMZaxds?Og@+#y zQe}VJPQ>UTbcQPBXIO}rxfplJB2%Xh@(FrZJD&USBKVv~&eyP-%6>E%qHJ|5vOi;? z8>azMJrZc!V1HZ?#=H63Mo;^!sa{7jk;XfD0W>=6gbn?qUvv>qJ@e4QOp&6tfs&oa z?pbr2x5v7VbPC_ou#QRV^i0mTb(dR}uYZ0c& zTyIqbMBsa=G92v~=^*|={^`bTZ@nW8t~Q=%JEnQ?J?`dy>AnPcVw259@nM6dcKyBA z;>PN`dzC|Fsghwvt2nF5wQ)I0L04i_sZi8tfSLWrIcxYc9_3O5?or@P#f$&2k?s5;Dr2Sq?BVrW;BbJeQsX4+$d}px?p2P9Yz{C9B%m$YBNAS56OUKgrqv>?zkhh z6R1=*Z9R8fJ1A5yv+-eQ3Q?J!Mwjtt{tM%X?1Y2|H8UWOq;Ye2B$p2N6!jI2P3V{7 zm3X?;8R3`px@d--O5_W4(!=Bw*fOCq@;|YaIB3dpEAly9p;jD}cXN3n1dm%+pQTN~ zcc*83oI_SgzBa1iYpqw46u^Yw=wMumD6EKnWS_&p`WC^(D7v=H$7vJ*M{vaG+t`Gn zCz?+EltYm^)8-OO0La5nMb?{ej&=X%vF$HM!w7P$Dit5M_#T#L#7D3sw&Yj#&=zC- z;Dh|#eUZ`OG!f4qFquVWar+-VL>`1_6~wb1LTY&$Z^jY5%izz+(~$m!uZNo%XD$CI z4I(OO?i;|{vh9y)T;dvWk_?dJ3eZqNRzMp*duCDIUHMcV5L}ZV2{GLlN*u?@hxqJr zs3!w2pvktJZw^G^&(6Wf9s8-+n*tIy1`Ulf_!5(S?J1SFxYT+ z;&C<>Owwd+FhgjDPA3mF>79=Y$WL z_+&?w$8;k(dIL}qnbQd<1V{Xc?)tsS4D4uW6|@~e4P0cgol|eKk6MlvvYz`y!rx3X z_(Sbj_?GVWA>BUJh&uuY+0KM;RPxCHJ%Q${J@UJlnCiWrbf;>OpDmuwlA;^ED*CUbbjji1{wf4Xql&-hzcflEPbe#e3 zcciK(u}$XI>*wiF6FR=v!&?Lr{%a&h?aJQ$?H{D+rc+wK9`GU9%Tfu^=w__WQ)}*8 zhA88gadHwr%{UFZTjQH#OR`qZNznj}&8VTAlJRJ*)L@hJjExM4+Hkj2Z@}2nXmaws z&3Mqq`i}AS7Fh9VY-Fl=6^W~%L;k$W8||xmlRv%P*P953O_LaBa!l{_YP2Y7TSlpv zFO2s|)83dZKmvbywbnTaqh(aXBO}KdX1o%YcBFCIw(9<=q#(uwwjh_52lAC z`k5~Kbb*gewuo@J{^Z?J&6O$O#wWzI#2!5imm=naR9e{-NquhS4cqr*1># zf&Nszg1o-^&rbZGh24$OhIo~<#XpZ@!EY`YJRL&)h9?67U6IH0jH*LLFd7z*0xm{2 z=VvPg4As4rY#PL^#f$L1iFDFd>CW`dn`6w3T)lRuZgS}-taPBvCn`Y+&scYRE;%_Ll8`hOA?QLzO-P#V;DTM~nX)G%3DRifs$g=M~kAi{XZd7CqD97434o z<(w;?)N(eK%Pv}>yS})w(3+aOs+gl%on4o?r@~}3@seW4J>I`M8yufBRaJd5Lp=H0 z&Zo4LTH^(d?VwhZ*6DWyo-)$(M zb2ldTewFyZi6_VyE^B4|pcYph287&;KU~?Jt#>DpIY)wY6crWsh!gEp6%{>*phBQT z@O|)}n-qelhY*T$+<)--9w{k6rme-O7!k2P@RbT}hRi~jr3hEOcYAnCsxyGD(K9_+ zIl;Wy+@t}IJh8-{@qcYud49=JiU^B`iJR(N&&51;n*CjbBL=cFP3Y2AG(jyKPKXWk zL%hvIVf;82%dVG%&`=|RD%Gzv&+PG9zn2qq`6j~QmpFuBmN9O-D+HB~a_AiEbJof^ zLyWcHeEWPZzstaHK!yBCU{m8K;`lBPTq0aOHh;?J^>(=Zi=tygy0nDrq}n-@I1lnG z@@8@7#9A?g&gsbBPzk`c%x?KN%=)_K`&sqm_v!P>x2G!D%>S%|mCgptS|%<-R48mJ zqt+T@xj!xqQX4A7P#@jPAi54+y)PcCu{>=u*YFQfukg2X9#Dy*d@-dCJgQ`>q#fft zsL(3OM|UL??)4N(sxY#=)Gn=|x4OFbe^>xrF!f`)&L(t?R8$qEI7#9CcxDVk49C%H zh!gB``5ahY(J_*1n`Tjadci!XvKHV86yz2s0)83~6Jf^mD$ zl9LXhq|FYxg#ac8R)=)QP6cY_Mgu8uOo~^(^Wn$o7=;uKfqYh5CqPl}`HGOswFBx? z%9AU+tyUk*1nsivoNu4$8UcTrE4DRd(P1D(_cMq3YCtz}W5UVR?YFbne>5}ieybLw z!D{ky%qBT6@HGkj!WM)ST}Oro>vSvPA5jYNu7mllvze*>im+vbyjQ&gG0JL=e6z`j zmN`v1c~r8eG`x#@DS>|C%Xw-#(%IU6cY9TzpB*z!iN572V>!h`K67FOMqn>G9LF4; ziZMDPS14nM)J>6@*sIE?F6`TB=H^!`jWZH6)ogs8yTTRlSmgF``X}3@o0usVZiI~+ zxp=ZjUnHK%W*Yje)QGzUXxtHcUAM-)ln}nd6D@UFn3`!Y$UJlalJn$>MlCy!4U+)# z@S2W1$FYmeBerb6(sl=7JbFxgU1wG(5v^CE08j++0Y~4bTZ2gQUon@}oMv$7I}1#UR$?@w+!!K!xcZJI3iG)6^OPjc2N@f=H~ zLpb8?V(2tK&#wt5I!AR*&wpD}S~@L8wF~d(s+}!`ux3%%%SbhDYiBqRk+i|9i+GFp z{Zz0yiHK)gTXp{5>A>kgIvEy2>NyWmF4~W9l=pF8i3u;FXC-imO-%daWU^Nb%UK?# zLF-`*Frs@adE7*K_UGoLoR8lA!0R9VUuNy|b*7wM3`1HXQi*SzmQVyEx%rzKG9#us z`tGEqr|??>r~byU9NcSC+@4B^YrFmPV$6^dmuOC__`gttE4@!j&%2u^7#R599#(Ci z^_eD?gN;wrFJ!xx0+;^>x0U^D3Xsg`x;qVR;?cPj4w>TNyh8)ld3+B%&>J#s{RI8R z^0*3@ajV+%w5dm$t65www<$;@y-11vJFr-Db6BM*NuOOJyhrBz49xjQUWY*J0=HtO zXw(3yTci;Z%KS{-;js1L6?gu4)4^V)O!yzQTFhJeJC7G>{qm%r91_VAl{|r(5s6&E-K)q?jqIV6}HclCqatAc-eB9#a17@lgH zp`YZ;{NjAv;W=u|C8xS+ul&)$LzfYS6lcYd$X=-~nSY1yf)BwdKE?>r-mY1%0?bsb zpb!{`*Q9+OF4c^e^C8tE0xfUc5V#bOdX7(+@t3+w)F?@fcAwU=UEt_rU(RfUnu!=T z70+38n^wX*mJk4XDD=|7|2SE25t(^Rfg#RGkO6E#vmj?M8*fGjI)|^PT3P#bL=?4W z2i8taPrs&LC)0hh_pA3k`52BDjxIjXeb9fev_%CPxcGj`sM<=#vR<}__?)5(>f)Bq zs5~%6^2;3<+?p)2_l7)>d}cKo7RDBXsely$*3QY@$0CW%Jr4LET8v(*mc~ak+_Bui zbQ@wmyM=~pEN1cevaQa8m{ZNsd`kB5kO%?j$Hnc+a&)>WwG9an*ADRl z-+%_Id?DfpdzJ=$8%Mxj2zO~9O7fLDD@&ii{3m-E?FwVd9A@Mh4LF=*d-xLa3EKQ4 zfv$GCQMbYBgjVc%)sI&E4>(?Ur5>j<3q*~uZ!p3hbm0eKn>ZO)6wZq-%J9!|uZ1ZU z0U7u#opa-&bm=t7IKwG$_`&e&3uzqn!++5Z$GB*hwo_~c(VBj1KS__W12STLB-Pyh zvsA%o$|o9zoTDMWj&~=p*^|A6-qQSNdt$z%suVv{)&8a_7y{x6K5#WezZ>{1)F8!Y zOsSb8tMsGeWHKG689Z(VTC8Y-)#l5;ly458IumNFf0G+eM8Bf@Fkal~tJLL7dynG3 zq4LQRU1s46_rrM*5@UblgCeImsjxSV?Vk42W`hE6CNY3jg7U^pdiO!?`T4S1V*^ag z%uZSX;2!ukZan<_cQjTxEDwa++8JOZZ7Gi8dR}l3pN|OFA~cyM<7`J`JwT zv~}8U0%$8GZe$dyJo@J2c-Ap_pup6QrLI{8B`|Q1%^*FC^vZb$ zoHRCiwcwCRx~;_BCR0n1%&QDlMQD%TredxCP3~QXpZsHvj`*rfE6hj#oUE7^28>*G ze-9Tp!O_drn_F4J-<>I)VDgd1a3Jl~XgpIJem^QI$Cjetq(L&M7`Q!lB|R$bAy)(J zyH};T4X}+RPTfT5sPxCg6bu?WSIw4BJ<=x~cRoQ&s|t0l3;NqG>(O=FaFMUT_sE^(PxI2oYS+$%0bo!L1U>Ssyyme(3eIF z&#@*dcl7Mb@^OF9CG=yVvGp_D)@AYf)mS>teBvM-)8nUmaSdlQwF6D3+q^~yEu`Mw z)@qa?_sS@8?ak>Y7H6MBtCE06D}lItC9&kq&1p=ayjE2B#xB4lBYXzN_Bb0UI6U!)DOSe40+Dy!=In`S7ZU55RS93TG zDPEnD?IpD~jTRdmqz-lZX*J$w#P3qf<5DiYi*7qZR#Z>VHsC(Pw-ze zLH0=uP@-y^ar6M*Aa>y zrvX{1zLP^%qlWGk8f5ZIg9GXxO7$!{()k)R2o+Yy9)HrWUk_IL`=NeKN4WbgEH70;2fi z>+5De)YsTmr6vh;kLJulOa1(c5AkLTrOBStb*F0tVOkz-UY0+(`WDwkM~C0dku-Mk z-uXpK6l-hVXw*f+`taY;-Piu^IN|<8%LLFNRCbBTyCq;_ZhB$V@wFN^E{{*R`orMs zUR{>a(|TRxTGo!l?o?V`i1yu8tk$zm;@;Ik5Df4DEV20VhVs@e&fxswzAvPWA>ap) z55bbmBbf@XK>^Jd`RPL+Nxg_XmEl7&ZNBMqkNN-77>&A64CwGrllIExumgff?uR0- z&tS)0H?dPV>T5{QP2%2-WpYdm!Yw9_{uP10ODy#8k&M}gboTWwa~NIh6WVj`*GSHf zmo9vJ5OruHOjF*+6BzjRZNcg0Q{>vnJ&dBhwIMr)4#(+z7}kVlVbO?wg_Yc*MCqhPpIw; zh-Lk-KaYyHGw<{_4Dkgif^`22$0iNP=Ent~2S#tv@vXFhETxVfB> z4%iH|>2Bjd8a6iGuYq@=zZo9cH4(O-|0QtRjLQT6RO-*HN$$*o+W?502|lD(BN2VE zaw0h=a^4-h_KJ=8#j9DTS;a7~hk~eC@T=%sR*|#*FuI4tn++D7pMc0nS`p2KfhGc| zZX7-RIcZ_E49+JAr@#NPjdZ*G{-3Jy?1xU{)oJq*sCzW-==Ow#u#d;J@4Dy0l}xjI z3XA8=yNDSj^yN3KA6jn8_MG6!g~P`UC7)N#=wWtZxs_|+BN4$2&`|OgBH=6-F4$Jr z1@+Xlm)!fVC%`Ug)6L=2OPa_Yjywt8_%5=87fWr7DxrFSdCwVhlj7k^Z+^ym%t|}C z9Ai6)ZWcHCr29~#qmNWsQ?lktjkjR@R0bCc^ib|hR z8ErZHy^ZO~ccO1ymhk~B#3{0IB)|yWgR>)8utIOwbnCBIm7Z8Oog;nDi1j)4QQKGQg)h`EzYcURLf$J)gjl1Z0bJ+@=Y;f5Jrj5#cL??7J zSakjfJ?KEk{B{k`(cYsGuipFRn!?v{Ig2&|Odjfg4&1wn{Y%mNODse&kscCtHLdOLbYeh-OY{lR>3wS@^?y)Ee#RK zsEF>Ps5;3W?0SF-Zm+%}`wkY`-6U4{cK__}(#71Sb)UCq=dk_T9LfR>>ZK#gsrOy`a z-RUux3vNEA-CP)oeS9z2tvd|pdbOnSvZ(0{pK?Kv?*}El=uLv@UVerJ&s!thENIAI zV|~R+_HZI@`rmuV=k@NdWfVn2-`&o&kf1B%8TF2gDdq)vC@ZPaxOe&M2{jkj@sGD1 z9tU^m6w>|4m#OMrwdOb(Kz)q&fRs>Yh+ds!;$&81I@>(BhwHap)F^3m*@3X5|NI{D zrwf1aroYz(SE>Y)Goi2sj|*JAjUxGJWym!Xsk`EWRk6`k+odb3|= zGCa04y2maW$6A#5qUH|#PO(!lu`PZz{&eI0&hUq3X*xF^ccZTv8q0KvqD(O?3|u93 zf=hp%HgB{sd+xv}YDb^^l5N8|7xeedqQQsm{?N>^D0HW@wrs@i)XfzP(<>g_{cdcA z1@HA}l3mJ9#Wd>*D&phqe{LE265_sv&z2DgF1RLl{TQcZ9%v`quD|AaNpt9;khj>F zZYBd(etp`Op-D5x;cFbJJ?=E#qF8>QXC`CegmlHyMkC+q9!ihpH7^c-HQ{p-@WYO<}|whw;j#Uc?C!4(^J4 zDH9ATTC6pl`>IUC{-AkwcW~pP=~Uc>|KsH^$_QE)lWxt<sgL8x zAEIWB|BNM1Y?nDx#K~uMFgd=(Tp{=pIR+5h|1RAur|cteP?)s^1P$q??h!-2{&+;v zxQE*W1;@7YVxc^ufH0%DA-$U2(nzGw?)zU{^~$A47L_b;s|z)ZHMjlSp>dPjM>O}F z%PlIn@FF2nvLcp_1wDyG1slHY{5ECcS!Vd0!EFMjD08tAzlJ1m@Y_$vMI#C^!wl9p zHt_$8vA>RMI)3|x;caXn4bmZ?DBax*m6DW>5rRl}gTMfh4y9p~bR#)>NJ>jePr5@I z1n&LL^E#h+-S_o8*Pp!j_q*fx9PeD33n>J60ySNCdc;Y#G_~>+73DMcHk99x#!0fH zi~x~Zt^hdzFPsNn!_^C!2a>I_Ey$BRKkut_|75<@1yatTV4E{K_;GNAB@S5KzAk~z z-5#}$O=PWkMEY+8X~6-(R2shm#@FfPKBt~{4BsS*YAn9PM1WcH9TkRjk7s*qpgxC& z6U-cikdSY6f=#g)a&j+%n2}%3*4v88Q7@rp^Ks1l(5IJ{Z3v%sKD> z(zlADABGM38zQJCz9!Z(_)uLP?%G#*;o?R*)zEVi?ncLc;n7{fq{>vv#JOBP62hV- z$Q7FSa@vv+)t%8`$3eu|GN~>(f|9=hvnAX=&kg}eDcbo#WwgcwKL?)x$ae5oKg~`A zk;9$`XUD&mBU{}z=<2*~*}}0iCY(Na+U0%J`Oq;fdDTz6_AV5r@GDxZWo=Z_kseL^ zhHj@*s8=YL8Qwr^5!a8T5*!7@Rg;WANlJyNter_ZFT-LpKVZL}(95+FQkuHUC^fZ& zXkgJ}9UIH4OcuF~LTdT~Ji?)R2oK=Ujt1#&S&$juOhrLJYKC`*%aC@{EvSj3j$4fF3cyiS zWYb_oR1FveO!tVd{WHs0p-y!Expb=7m7Wi=GkvN_H4xYg)ns7B_Ol^Eu0{n`z3o;2 zagEjR%YPhBI|+s9D>jdYSh~6t^74p1NHy$Ps7OBa)V$kVjy&DLR5Bk%s0bCvM7n)~ z{CJMN<9xHG9b6(tdrA+J1&XovFdYl=EIW5xe>QG#OSb(y!~wyv+7!yh0uw){E4*af zC0ZZ$f86P;XU5NyCJFpo{0OnpJa_Z$Zg|Y*G$Pk*Gatj+80EMUqu0Xxg3Q%z*-;1? zyyYV|w{@2ntdqIulBi4$9FSL84ow}BQrj$=ruR`8wXD2TFKR;4`_ScJzQH?nI{>oX zT#j(@<$ZZHJ0(LzL1NZB#0m;^p1j53$EK$vM`Q!xKodqEG|->7sA_SGeWZ1ENSbO3 zw!9W0h%#6ni{RefivC|C_g@PLL5V4U@7J9uowCVNe{qK!P5zN7=ifL>p^llOvzj)wDe)xDd+sD!6$Iq zmeBp-w0Kq2BH*P;s*Bj`x`>^w^G+?|+ZG?l|JN@0zx^4<011)CxsZwLF=CF(d7n8n z@_WzA?uhxjNk#WR=GXQG@4h^p$NK4(1Z2fNZLH9mqj2CMZX4F9SoiKji+yD~0I+#SRz?X$%G#D9>|EVPwZmJK}@trG3sLE)2FMyjBM!O>Fx-yIV1whqt0#P4VH;ZI`|QY zM1mH7d|MEd3?Q&w*&N9P-}WFy9Osb>V3=nzohjz=Oo;A@Odv-iYgWf`>gDI%;5z1P z^cT+{Y@nL|eB3~3H4>#h&t(d*|CqFQYlHnvOAdI%^XtMY0nqm81Q{P8{Lwa*XupZu zM^$xox9)78i6z$sM{NH;eUISS6=2N>n+Nb*s!A891rTE4Uh0d^E{_Mek&y_uL0^aWNBQo!YxqC>xj z+u=CXVAxgLa=l8O!83`J)y$Qg$BUnbcDX^|UykieLTCdN3}L~()*tWwDqP0g^IxHV zp6nfDDk71?3E}_MDu??~wfd68Oy?aK2vV59L4D%ha2c|P8#0oAntKVSJ6<+wsQxlB zq=*Z?f1{2xo+7r!3w$9j&c5zS8K57R1fy$`?=xgWIfr6z*8dbP!67mK^`1DVRP>!R z4ikkpI$rkQ0D{t&+jbpDZI-gP!Pd(&nl2Uyn$hZ%vc-Cihfp#jjXz^PesKwkxXZ`? z-WM=Vk^8v+=Xc9~rO*KEh4bxS-HQ&kj3*kmHuwjJrB^ug*lv&xhzG==cf;!+()CcL zmz3#5nKkP@ihT@6X2S>;{&LWhY3D-}*8B((+X9@#qum%IJ`4JML3I{xiu|E9s}H8Q ze{S#?ooxTh3{a92bl+@}*gr}ImpIJwCMfA8rDRLI>X*BaZ~pt$F5CBWPOIn9W;Tt? zkKC(1TK!?Qf&y#PAL-{JBUnAekZlS!5k1Ej9l;8n+5ckYT9!PsW-1rN=!HVl(30o* z>OEdQK54nf{e%YKmIp&~mhmep5KE3OBVZ?xOHt?W^z8T#0C8B-r2)w`%f@I`e&23?$ zS3eHX!!r+}k~xRpU2Q&nwRkN-50%WGMvMd?8A*iKs7VrUlVUl`uQ?|-3r)AOwlIzH zdDmW5t;*HTtjJVf!f{zPR5v|608r=zZ4|S@+6g-TgM-nM2aC*nCVFBwTdXG1S?;tw z=8xv3m{@Q?flQrGbl*0roea`DNi65P7Axw25Ojv% zuz$aox4eW1`}OJm1J|kO;gA$&9oJ+a&R%DmIzkzHm8rca|0NES6Lfq=*VmvIBBd!}{ z(drd9WM$!piVr3F=%a4{{08^|B8GKC+sQAFQYdjhNftjHa4Kw|In{~P8Q_3%m8yBn z%gEbi)p|~3bxNv9a=p1({jU@2|M$)aj0RPxVc*iWIpqk913%l@-^=pszoW7lgD53Q z6G2B;A&=Z{$L5?y>UCyam4qc@a$b}?ZW{YH++L;gI%44}|3Y)!sO7l*`K&7X#Vso| zNv8nz5-Fadp!GcV<8JT-XoEA(l2tlX zU6tuyHwQT_O>M0@=8HstffGi#2Jo?^ayPDg(=~<-9bPMhG^SK7J3C^?Hos~Eb`|Vk zOr3*94lZlg=4#iT{qbtKS$$Iqyr*m3w3fb$EzIP(diNGUd?+lFD9nnGHnzr1iK;x)LFA~Z zTHzlKPcmAtdCK2I%3VL!8{hjzU9=6(?+JQuNP3)a%u*bqcB}2rntZTHh}APtTK$hK zuspD+!NZmXAmgt^PZAihOgNw1pZj+x_fFBb!vq>12Dn1e0Z%@q?- zvX7APjDi=^n{fU}o~m-ogNxE1c^%HPD;&rUB@?|@ z&Y}}>U}JJmj;4T>UB9+%?bNcnbvIdKi8YBaU$9;`xJjeOlJwkt?+Eb2T9<$UJFsf= zpVZ^ecBzM4xNNt{X&N#Xe#5!SeA+aZn&k8ZQ0A32&(mSi)~Zjk&;_|Vc(D_5Yt;x< z%oT;%xZ?EwBo6?x05>*Avn)Na7R&UjJAj`t_)AD`!$k^+zDceuaMr{-GZfu*i5J)( z?3JA>*nz3^E5Z7#o!*I$gi&UOs>UC_e@(L&tWcFb6^aH?#u9R_^ zG$x{sr?fwO(W93Z@RIgi9FxC*0=S-85;mWLcB)otmjBbf3edSZ!IkS3vz$;w zd6;oLk*eOfbZK_Sw5-3nWaLB9`vvPqh7vuIY>5K}xgHc~eADq>6a=dBCI}wtn+0Hg z)lTKOxVT>Jm*BEL)c@K5suO){ZsN)b&)9!9vu<2(DH_EHI|s&y8~mlN5pZPD1FYO{ z|M0v90S-&NfMBof-(4>b)CJ%)<5%=uMT`TEp1Br(ufH%qRQ{?2i7Wn8YjSbUYhD7W ztkOnZ9LzU~Y9_Q`$*m%BnGD;|kD0PS&m(1e9?d>4(w-(p zI+?C?cKVyvhz7*$ZF2>8N--ceC$^x4XO6b#TPh&fEWS>WGcXnyorw!DYjUa-Z(IE; z4olc(Y9K2iiFmB$Vkez+fdLSyU&WM$fnEbGBT1oWVNn4vgW$ixFSWI`Hdg%*(!|H! z@eD^?imQZCLztR*<6!`ysO@|YU@Ro$WoX;&#h!Il0U#A#xwqkV+i-}3iVPK)CkgMN zlFi@pKkD2vVwlxBUC{|03tmVkV<6L!RfuaCTF0iVb`^ikx0B_)_|9Agx`D_Eto3pi zGyeuN@LejMa9%CW$uJekwEYN<>k?xaOR?lQ-6VSQIQKx`%sqC|aK(dnh!i1?8wKGo6YGr=!zi8?E(%s zbu@K>Z)5~_VdD2zSYI4y)=85hwL*t0Ia6ULpi_x|!n@7|74oRq&`<}JOrbyh)i3(z z8x9Ye8_n#TQsR5zZjUHoT}*mci&f4MDIjwTlMq=qS?u1oU)%eI#X5Bo6hn0J$ju7) zjO|~dnsaE!e{O^aK8T*0dP7*RghcO{@`LoA+u70KGm>OTXRRp5Tz|)yS`islu7&>*wcu+kqs%U`R4jT%2)-kEb zl>jo|*Wt%<dXnAc3xW4BY@k^%q*E}Rl>Jrt>c6+jDxl`<4pPJt| z@IJR=_miOgwL~GI`i3VoN9@aI#Z6R%Y!xJVH3~H zMg8(8R0l?;w9Y)`;_P8ns?&Ue3b^s?R=3J@R-d#~Xs$w}nRiL^I^Xq${t(a=y8L+4m=810I$z$upk z-81g$+V@YcWN_lCjcrX9go=8qWS9Tq=-Z{MP+q&DrR1*Tp0-}AAkbGl=FN2|ebkFn z@^$6%nJO#-G4**~<31?J9+D>J^3W4Yu1R*OXGCO@jUIIlANa=Bsu-6sJ+_5^rEFw0VW}ZL!dxKEQS1=sz21gdWD!wC@{Tm_IK9V6) zM~)Fu1)O*C5>8zuLIvr$Tv@@{`#j#NfQ19lHr!kkpRM;7xefj?zD*SQCfw<0R~Sj6 zPA%I7M-hea2fymP+cXX(1U?YyyEH&ZHvKXoOTc%lno0|lxO!Mh?S{64z+o3#`lqZz zJjDo$1lr@LXoi3wvC60ws;xz5NF1>LUd6@biMW~*`9A)~H^#2}4xC%Rg~Z_(+F6^p z9QlkKefm0OH$t1Guk z;=&tuVDD$^cfx@|=) z%1--$3W|}QkKXJN$Q8AG$|9nWVAa@=8CY-x*Pax{0mx}g?zvh>pY$XydWR4wH<{{M zx`tYWd`+rffEl}fvWod87%*@Yy^% zux;W8R`9p}@(`iop}ge!OQiR=Nh-ID_RHm4aOUjWTOl4wE}<=rz5#{cHg>Uo(2O07 zi*kMN3RZ8EhZ=GwSSFlp51uo|dxTBo$knv-4)if6@P<7a(;)v5P_9+{Qw*C^eaki* zjE55=Z+56i2jq8swc$!{?E2H>#Wtm8nrqDHaIej%L5q<);VhViXS^Mr8HvBSm}>?! z%M`Jw1~O+Szb zo{9iuETfytq-#q0)`+GFT~dAF&9te8H~%=# z4exFcMrJ=8{x@Y}i+B7Ep`8yeLOkBYdKf!mZJpLWTjpjGZm~#HpBpqZW1Jd#guTEE zjhRh&7Dl`^lq^%o zf9@o{IYbmTmrk)wP`)xq03x_e&xFh{H$-qyE~o$=Mb(yFo%q+)s3&$->TRBrEtPIn z(q`ISBT~OozCH_W{j{!rlMG>yiO@BDP?-HuPATO2{`~)l8TksTUqG0oTkUndx9$dF&T-s)!j)YZ-9 z{QQ*E?QmTfS)uS~^Zn8Lr85s4lE@RK5c83+HE+5CTcYeT-Ve{-S6~sS&E!203MS8Y zc-E`RU$m$R;2O%<#vhz=-LuUts_l8D*q3D|X13^mc$U|AKfk&f^+7cx-@ahRta%G} z7Gq+ama-bl=SKEeh}D`eI?Zkmi`}N58(zSXUVmF)Sc;b5zOU`XmXGI?l67+Z_uVr$ z+UzdHdHT@C0w=l-B<%f@QmJJkLVJc?(~o;v?R`m;RQhBtq6c;Gsn*$x4Vp)t(sQiP z+=mt0O_!u)VOz!kyOYJeBnthy#1Oc@OH{wz zWlDReB}W7L^;zPN-q7B_2Wr+y$i?)wGs4Djt*9ov@1EYN1E=+ffurMoG~U8()=lucC0&~ z-s|A?<+XKAv+G*_!d`H>i!t~$$UH!fy))QE^ihSBUOZOd=K(bejK}T*WeU}<1ZP>{ zsqZgTS9hsE6>UPb*--N`%cMG^DGTdiZei<$fMa%-pQ@A|l)MofZ`ezSFE>d%oR7WH z-`Ca&3^aH$3x+!`m;INL*jMoOrB>Qs_$1s;C;(b$-JYtFk4FevKS7BWsuNH2XltNb z1i|vFakv$q$yjnZs{+M1c?^(Hrp=eFGg%>x@Cz4_k8-1xcQ>YoquO}Rxq~lo%=Hj& zF^HkaqFnIEcKPbYtHJ>pJw8tO?r;8lLY4}{y3cZjfZ8#oAeCb7*v{)sx;;e%9q_EN ztRoBTkw@hTRKINiEzZBLS#D~ftZM4v5%>D=I|l&_;RkL-G%1pq%@u2mSmsq6R!*zjpC{~CCwDu)nr|0|Y2Pm~Ji zMNM%+E>6V8pK0>=k;NmuWU8i)dKkxoV3*(oEVgxgQT2(0d@}g6lQaOjRE%}gCA`oK zC>H9*mO6%ZemL+xB#yvIiwtEa>f2VySpyL)E-H<4bZUz-ZR>$NU1Qo`x*Vtd$~V!7 zB}AK`j|IMe7pWrpOddU(=>JQ`{FS;R3D$L#J=$`<#ZUK(F%Mr+tXu$28G>8Pe-Y`5 zjbLG!N$EaRs|rVJ_esK^5%uvaVV>2otm@zvgwxLl=#zIODg(L$@GMUYqn7 zug@RpuCa8(^qIi=F^Z|ER=e^w<7QLZROm7E3odTM)M%YUpufpzW6T&33n!zTm4yAf z`x=_gF&n`-tFcMr(WcDPe751#%WCmf>qIHAwYu*nLmZF~s=MVWE?QEqDzotr(2VV3&(B%#i;7Y>U)_UewDHB^aG? z&Aea-YCeJu-1}+@G_d@fe}2nQ(2S$mW0=@ZN-qqgxZFGv#Ox05{V`3KmsUC0#Ustm zhZFPG5yr=(PDAQVu(=&QJa|t7+2vSl$Q#332QMezP~Kn-PT@H6N3=Ud(hbw-!L&DS zTFG*_V>m7AXxUr2ibS5Aq*V^l$ohcX4_kUJv5+AV31;(>hz3F^^U@f!n%k1 zbjJ@CFYkbQCL1>lC0!r&e*APkOW)P-4_0VcFJ7KPzzz}t zI=f0OmHU66{p9)vMridrISzXV?|rP^5>U=npt6$77@6_SWsdew5k(E>!P7lP&rQ$z zoOU(>Lm!6DH4?h=c5bLyRqu_fqj<|#8j{rM-yF#L&$s|0S6tS?EZqQmlFD3kOcvxr zeXYHG71oSA*|33E^`M9W^|n{v>4GD1jQ_gy}$*;x1c#lNRG zKY6Syv(p>L&BW$ckMUrt54_a8pI@I7tm4(ARD}1allZgzkVOZ*0DrZizW!^?4(I`s z^ms$R4-A-T4Bacv5E>BnqxzGJXfIKlZ^qQ@wt!eSLrW(-SkYB){dWHSlbS7?KEbxj z!YFSRo%C-cJzKrf$0yEC4L@yWFuXEo1z8%4jV?|%t1Gn>SHEvALxEuI_Gzn%nVcqU@8jIS#)2HFIC zHfA5^KmN_S>t98~`I{ginS2FREQNz4sdRlDVDXzTxIS@7g}3t=^h(YBRLam3y9hG> zig;1MH3Ly0v=#|^b6dg-m{(#XrpAv@9M&wxF9b4ipk7>}N*|-Cj*mRLP}?~Feyj4K z1>L5zm1l_;2GS06rf#X|G8FG?&DB+EzoLIQOVn5lxLk4`t?!w`?%gx*%0_MVh#hli-{kdmvjBr*f&)S0zi_VN zzhl!!Wb&`T9;LDo^2p~|s{;PX8c zxlE{MuEc3d4``Xe&c7veE|LKQ0g;Y36gJdX)aL0q#QHuwj_c7U8jD%q`~WImGnW%B zo2enE>C#iMAw1)$*;*%SD^fkAQZ(6@?K1QVeq8Le2@#%az!I7bocuXU@eJ=z4Lm)ava* z^RV<^D9}G<3KWGfMq!k-SurirHxc8am8hM?B{m%7pDKB9pW(Hd*!x&(Fd@6paP05l z(5*-Yr(O6{T}RhYa(*tnkC$h9vl~^kPOX$sy`W4B#$3bSN=sZ#Ud@#}_k44@B~C5tY>_ElGM=-W{tuVkmr4V4yOl zQyC`HX&V+Tzc%o<@cx8#Dky&WUig16!ul`xDmW+vBomzZ<{J6Bk(LB=>d}E(_ zLdZOlP67Yg3G5U((p?Vxz+M08!sB;lUf{ogpZ)%euBm$UdtV&ObaUPqF)y*R=~RT% ztI*+kEwR-k$M~tWq`E(~!#b>~NN1_U@Rdo!I^^`QCZ6FWe7k~fc?y7_tz(sVlEpJ< zmanuUw<%lzs7A~a%!4C)ulO$zX^%y&4G+6KV&+UmzngwC!Y1||lr^Du@g49QXu!Uo ztowGswNL(1SX+AoZZv;j@a;|@xDZeTt)gb1I)JT94c!5JB5_m=$1?(Rt0y66ql~G~ zmBgnSQj`heYUbD>GrYe}@;;zJ@HQ{M45oEFr+eepVOPpaL#Xb>0o#Yy`B(V2;qQs@ zY050PFCQdV@z4@@=C1~=KND4XLXClo?ggAA1^J9@Z1_;;jNF%q*TID0veJt$9uf7N zlc9IW^h%2Hw2pvZ`ED8z@}6n3@ZMRl@SkrjT0|KI z{y6`zV3NvCMM#ILWP28(P?VLb)AcoE#sSWQ&=0Pm9EhwA160(F$_z2_dJK_QyqVt# z!{4Ms;-%sAkaJ(*LQiM$h@#={V#J^v(0AYjC~}n^-zSRfIZvwlI$mV=hL2pShV*p- zJ-1@Zn>Ir}&*2{YO(ZeCu(%Ul|!Fk9+~GH^_yy`9q55VY>91zoz7%7^z)-4o0B zti&?PcGVxUD;})~vYBGPq?w@&#pa!KkfOI# zi@3p(im?oi=YHs5993t8Qt+yaCm1RJFyEjYUzJE4qR$TZcu>yEvcZ@Ny_5Q~$v3R= zOr;GyZ!IRCV{L5XERy~5h+l*$vlEfL`RML^7}@=diSG$9N{LbR!KtOI9WaW5uPyub zTYRNPo*uS>m52puTGCN=H#ADg_du=yGoEynjW(Yf+v0^az~?V-zkt}IC)%;JmtAiU zitb>AJpEx5X{6HQhq&k5eDt{-p4lvyrZ)+{AuKo<&+o*T1T zGdzL{W`k2KVB{Z=4sbA-=NF%%%ViYB5M(dKbN2G+h~XEKd0OHe!xcZrwouiS`Ws&s zdYj@pkFT+ep>pdb9LeVD(lc$LE168#Rn zt~J3DF}d2J&Ds$Gq5slNu8(Y!;niOvhG;pHoDsDBez@6NvJY`=W>{kwKS8b;%@>Zh zsUOT=d_3egB@w(KBvZ}$)&XF<+bN!-)jy#XY~Xex6BZS)CdKb@r4z3)^*?CPQ$&>0 zT-KAa<@mSf+k^ZbTdQS=G+ezT!&5H=_mrf;CQ%rQ{|>I$^qt+uF?5cHIE9SXu3@0o?bmQ z`{F!4Xc-HDNEdY(-7uHK$T^s<1ugPLOsoFUvU&#{`{VenkTxiSP z7T4@w0e;96i)ecB27N6f^>q3w)&-LSCQYKX>db5>`*dW~>R-bK--3gt=Z&0h|DGE^ zF@Lein7Q?y_WAW%xnu>y>3Yv#_RuhucUm2*zf?s4&x2HNq0^Vqiu%;lJ-8uNduoMr>$4^!QyjL|prhd5Qd-~c<*W9d=sgs~F$oJCCc<3+ zb^s;+i|6>r82<2a*?ign-p)l6<^jB>Rt!^UbaTYv23@MPs+-1w<26Y#=`CUh2f_>I zy|>ZJq)HKzY=_?pn)*Cl;uh6|&9BpESKo*!@J*J3df^B^k0U3iG?bNC`UREEta|By zE88L)$&p7PY5&Pz3!pyo)n~jb5V)Hr(O!xvg|>Z^;&=L&^r!lh-h`u^7_E)}-T7PW zWFm^($f`~~K&MMSX7wQdx&NlL8(7}9VTcymc1o`;Bp7Y|5?8I zM$g;y=(szbLK9C>uRIkX4d^^73fkh(E3xqd9Ww5dCmT^e{QV0xDh_&Z0k<0wbs@WWDA;gRaj5;i&?~L{I*;5T zoxs_8ldG?_gayqm?s)!0>Q3n{c%y{*PHsPADF5ssAK!&5?)wuV9zbh3o(`<|0&8W7 z{kYc0)_)bZ>O*XXUZ){QEwv;7+8V=-vRWk|VGz5~4C?@GXNg-D0ZV)MYW8etoqIU> zF7e$+`;sXGe3`9biaWyM;?3COk6%UN;vQ1&JVLa+M6)0J$jNm;yI#Zz?MsFC(=;KG zRc~bj3&q;>?m(J;W9^rNKYiN!?!n%JrNsjWzG>o=W;|Q^Q1!mPYKrXsv_5fRv&#=$ z=nNIJU#Y|I01Ibk6t);F<-LRpGze>%hEv#nX57crAy*>TN_0fOXApxN4(7SH_;2Th z)7Qu_u{qVQ#*q^Kzq0^PY%Ae*P8P7o&M~6q{=26sn?Hxh?E#r#IB1pm$JNcJeO;n> zwZk>ykc5n@Ue_z0=K58R;r3tHKECaJLg*c9T5r};Vx&lzO!Mw;xg$}w(2jd-ter@a ztN%u}*vP8Oog$UFan;zO^vktNsU_#Ll37S;@q)o1#W;b%yt<1-Tx;kC-q5KnnPvD% zyd+oHcZ&M(6B^XJ>Eq5Dc8wm z#H)*Mkh`19w`Pa<#uvP*)gAwzp&w5HSX~X}3ky0ea2ReP?m73EuhRiDPDI~}+@)7~ zxh0X+e=OMy<-->+BU~yV9xy!ojn9FU0JZc59=^b_ zlYya=Kj6n(m4)M1#MglnA2w^RHhus9h+#4N;~TVU@wMw3c;dYo#5^&C%y#qe z<3a2?ZGusU(+Pd2gNX6+``^3T>{@UnszBMo&> zo?>{kzYZ~aNWt zxGq3Zm)@(Kfw@}%Fst=q82Xf}wg5HpJTyEwqP!uZ(ctQ)ORZ6lum{m7yuzJ@>|gW& zCb~NG+F;wzxQGNOb}TgV4Ke8=e5lla9~fPhJGc&Hh<^WWshm@p(T7}d{LAPg;l3k3%NxPud181}#MLSI3Dsvqo5dR^&%A*8!M`CJCx`(d&@^P$YE2~FGom^% zSEtES7s7TmlI_WmiET+!{9(zz&07_Yb!SEZRp^YdbL)ut5N8!eXc?5a$sj5ZmoZ0q zCxhr`H6|wW8OPsiFFBVXoQxTR+6rw&XH9~g3Pc#)Ce?V9%}qVeM=-S;oYwsiw~bg4 zB()~x>?9zn`#d4AH|w#tHq_kw6->qTTQ6y{-#><8O}K#t70JmZCf1B*?d9;oDnLP7RT*XO;YRH8H1V4TxC>VRpg*SNV6YinaI57=E3 zS?Y&2HH>^m0&?;245Wfq{3=AOF`fQN@T;A2=C_!ODt||w%52?ky22{qkiu?Oz4==T zr-F!nSJxdH*$VXb2J}59izyk zy%}a{TwfFTqUg#u)5FT?*}=bWIaIg>ABP&W2zvYVr_#nmsl_p_m{p7FbF%Zo*F)ld zh?@lRBeQ_JhTiUEOtIiBmQ3GL@{JzZ@!(RWByd@Q&inu`W70)~gqxiudVj%XkP?|v+RQ)Yzt zv(Ak#{&D-m_k0h-JAVzv#(@8Rh6jBH-B@RjXcxHrfWRT$6ILqCkxdn;#&Yc3JqjFz z+AWf6!A4Fy*8cU641Q1stl24SGo}P75Z+1u@1EiRuSa@tXA6khuf}vh?lLKM@Hpcw zoA)H!f;W)I%K82EmOre!%C%Ad@rz=eMLj`pinKpCMGW$Wc^9oTW6pI+C#bOZpS}&# z)D0oTf9i$Tv1snDhl{pqAC|tWDl&#}*KR!)%XKnIu=?poC$q}G9 z*Ur&@KbmcFzV>Zt29h44dO4IQyaLx_(vNu$&oW$D)~{J{OiOoC@YtWF;1#?2At59t zJX(3fGA+DkxLieyAeb7?&Q2HHmIz8ccOtH!jE6HH3y$WY1d*g536NAW=`qef@D&c% zg*8BgSy5)oG;qgC+|$&az0=hgG5}f!d#p;5kRLOSv&3ahr3?k}w5`6`@ zGVE3GtO8r%)iYp14!Vp(lW-f?{Op}vt<5B+rMDcD9V#)oCEDzdE7* zC~IVSHZL-#>H{cjG9UI_s=rWo%WV6R3+|(6 z$rtFe-~5&%j`a;ND^aJ#TpvQ+mEM-foPfho*&`{eRhN!}>^25u^3*Xr51vT|CX1)$ zhY@vKOH|3>!i0nOx2;Wap5G`^S&A%sBP;Pe&k+vY$3 zc$FvmcK4R?Ba^|ob*O--eMfHRwzI`8^N#mPFI6iY7(cMw2XKEU7dMQ2Og7sVn2Yl1 z!*hK!6_`bzU7b4lm*|}T#`2;SpsU1xc5}B9pe% z<17&zGr2o}wlASm1yaU6_o*OrcXq$K*kVH2D^O%ejPDWn--~5^_QUbL(bmJM#mn6G z_{Y|k1$0Cm{rFcwuMcO2_hOh~uKzOw6(IoKYd-p<0%38ZsjJSQ%o_8rE#hOYErMJe zJy|Y}R-%`&CYvQj5bFz;vkLa|)7@z4Dq;$x-)>dk zT=aGKGr3^o!I^KK`O1SkhiFOo|Hyk(A%Jt06po!;j~GwMRI64J;MqcbiSb67Qj_D` z6v@ptJf}$wnyTIJZ+VQNfvRmVJ6i=YwE z()~yPMIYONq5FH+AMcWrjsX?Fj4WZ|;=L2?RB}#D~@lM+?|qNAf)(S*=&ID%$=B?)MLm9{U6Q5Q1LCFl z)fWdZd%Ve~t$V51o$_aj=(0(-@Z2wd{?zZokCMId|8w;mE7`khfO3(Rd0cqxew34J zp`SyBw>4yaYsoD_wymEi@ z^GCRJFiLZRtFPoUP%V@Ore25~`RGjBh>1aSs~VWvbsl)+oht=^e2ap2IuYMl^HM`hC zlnU>lfdGU0#3PidSQaQVZ%8y`X_*v&-$q_A!xAP^v-%&`Sj%P_-2qWoF0>x*he}APK9wDJq+P9)Je?Sq^;6f&!*tG1YtzNENwr3X{6ox%~&sK7<9`}S0 z+yik-tOpBWBjhJp*HO5?6`qbNJ&j*@IvU$qyuSV(|7w9nbkMabzy644;N+CIqsHgQ zh(|8d>&0g~YXQ5&EDj!lZ`D(gzd*vXWIZYz9`ugEY`#1z!4zfz=M=$TqATq%0>9Ed z?zFES`#l`$DLrJCVIX=#V>H8IlNeC;Zc2OegYQbfW%?niaBZCrzYU+w_rPTc0X6H}KEt5ko-I29#*a_uyVXs(Jpd{vRDUD~&*PrI-;Q!N;7Wf8;QFRah0Zag4O z?Q$a&OPZ^n`w=0Rjvshq+X!FJ*>B0qd#4xvPJ_U`Y00a#D_897;$U`G?LYWUbtgnm zK7KXqM#~wX1J_!uC|^u-m4TFizaA7BSjGWtAp3pOr_X>J^-rv|H>oxOixE5CfZ10R zLTCxp1@cbj;Rn7`n+1=mpI(Z+Aiu2lD80L!g1r#1_Jh-VDX#;sB2J2D2?mx7spz~Y zlkC|dN4m@-y$XYOmfN(zY$OrZZ4mR;E*&|(fsUf+zf znsZt@6H+;N8TEA&R4?`i*E}lIT)9#|K?|HZ%`x%~R*TkCcO9Ml2}8|tj4+$LR%Mrb z5+(S~$0H)RqU-0X`AKO1|BQ8cNXkcqLv(Y&^!$Z;3iplG{;)SDU&4!E+W@`_2g{M+J&@lPhpLxv{L z`K(GRRU;=A9Xy{nmwn*rEH(a1(75Rew_hDu)C-MfC|r5g9+fsi8S<0mF0c#nQnNS;O}s6Gbtv7hzM->!&rB#GFe#PbnXFq}!TpHXd#pGo@J)h4LANq#(+s$Q5fx((koKZNo<~iXU}+xwZtg~lOhk@l zh!2gBFh#uj;}l#1&qThA8mO&56Kfx(big5r*hESNvR>*yd7LS=vA9+XH~mdM9ITg#@^bw z!T&sc^%P#kNvF!rm+Gd47>sX>?;&LOQVgga zs5B5*|CvUt0y%7!eAiSj%Y(vRcMzDE91#}5@!*(4A^U_iKrnIj)hYz`Fj8(eijz~+ zqFk5T;FrszDA8s!zvji>{d9-(ex`o_bQq|YcY|Yn)$f_~OuTpJ3<71^=oI@xKEVSD z?k`z|%8A%s*8`CPUB6{eNbMuxwE@f?TnxzF4Miulp^KGKb_z~=W*-9sD>d61P)wC3 zR~!SE9#YbNd8U2tPxEd3OVX{62=`X9aWfcb-Z4SK?s|m7=T}kX6*Kf!(Q?K?kPMVx zZ!3EQc_w+HQaq}TQjH69{ymjlGixwK&sXMK5dGcQzf@;4Q?Pe7%Cla32@MWKix`rLeosoU08q<;?d`;-uq<`9>8 zS!&B(Sq;dI6P&(oXg)6Sm*rvf9}1w@ZuTgh+7G$5Xzna*Nn7R5v6jN)R&;0;%gFe5 z=O7ij$p^nSA%1#eecfB$gj8@69e79KEb}93zOgCdZ+HR4Hih|3OQb`Me_LPALSmP} z8B8O1XLoqKuvg*wn$fnaFSC$M@c+`rzL&!^mcSH;!PdPVv^@?P;;T-Ps6k6FzEdod zz{lWTU}8s)!pJVVFXsAUfi%+8%ou}*9=VLpQsM7zub*W(utICwk}yxRPqfQM@)+Qk zV3Q`NTV(AQd(4-IP0~52TYrQz;+MD%IX1ZZB?{dAMPZfuNu3;Ntd6C|FjBo_HM~+q zo_FfFoWzjd{G_1zzD)3x-!jc3_JRou$~A{J%Vg1fcGrQ4il5(WM&jFqsj*KF0s8$cs+3F4E7QHLRf_JPsG6;rnv^~JPo`^3|V6vSmEU=QX^xe`R7utIJV{!TpR ztsniY3gQNu`t0s%tq95WuNEqkJ0B7YxRr&+kR8H!L)U<4o5+n91^H6&P)t*4W3c~3 zsBd&CgDRkrde3`Nv+ysL;2?woI+&XT7Gle@lDte2Nfky4^B6ZW9wirVMK35xm}2Od zD-w!Q2*k35=t$4FJAP*`H20I8kBX8%DCB#q(u5O)%~eh+GKiZnvzw>cpYFIB2#=7s z6^FDkE8fYjLaf3D(o|5WZDL1YC$-PoM*rAhkk57$ZUJ1;aS z5}qjTXPQ?oX|TezxzwZEl*JO-hs1T>`ZJT*--LgHxxF5e>o}y1Y9F zBcQWXp+rd31GxK@lZ`Pcfv6)9zgaHlm7K>h0xKplRj@s9kuX7oAX05CQSY=BXTs7E zX^6!Yfs~WYfbCu%W&0iCPeoIbmZ12$v8IIB3CuDwc1W`dLERI+9;P;4FihK)y|M)y&A==nghl+~25`E;)Mb#^425Lg4ca2_>ZbhI;76@GT zKNNrxx*XLP@qKb>c`I*N`Lv<#{G;y@*k3o(N=s*c2-}E8F)k>s&q!=$7A*`iG8?S#(Pyt2&J%U=Zk zMp;&VGI&`Go@Gx}xWg<6`la)Z8DaiA?zX01`c}!1MJoKay}k|3zw62$*FXJFEVBQ& zI6=PAr{Og_Il4PO&3aizi$^91P&w!!o81Y%tULyLRxoc))8I{|iOi-y1*hE8m@Djy z0-@8~bBfA5?j!$L-(>>Ix%H%%+lQw@Im!UvT9!_SlJ#snY<~fIl6Y!jtXba1jiZ@W zK%q@eYVhJ8Flkq`7tc-7IXy=1*Cs2WHh>jdzeawxXzez}{K0aPVsTmY2FKn<@FHI5 zQ}C>Yp~-pw4Cmd8Hu%c5*f zNm78{u%PxLoaOH_&A=&7BW8Cgith8B4H^C$JeH_B@I)hlQo=SJ=o>IZ>J04$S(Ioc z+8e4`)e?|4Z3I$+fVzP0>#hy?@cn3*AyOdDslNDcsZUT!K*gm-sfksu+udUr9f#(} zZ`0&R$sN=EP~VkNIw2~pC1(*R4NX_BIHEiynqHLjoOpbnBQ_vjnJn!qWbi=qft+$nf2% z2s8scZ>2JJuY~qHKpsHa`1#D>NIpS+)*vS0q%1nk5@-mmA1VUXNNnHOwS~Yl`WDCx z#Fu1y3RsZDpK8NKoWbQ;=MJ;zqkD3C{S8k70}E3ELk&YPt<~Fq=MZzMm5K5d?H8gT zvVvC%sP*ZVSX)1f$?AyHaa}`W~oeo>jnE3a5dU*_0@}$5TyK;igd|cz?FXW-({=o6{FpQx)bz^j&8fEKuPP8#4rttB?qDOz>50W+D6FBE7kyi+BmQUG>;fH+8cSVx}NFs zX~CYrRC3R4AUh;b}rs@7h*#vxb8Ol7dDRAoOUL~Jm+ZKkit;-WxU-Vu27D%MD;$lkZ@;{~{Z~l#Kev-FgeXX8 ze_k=B3Z#c7T|z(_fbtrt0WS(~s%5{iFCjx&!WVFzfrraiyP%ZAqjUfmjhH=Q#3huj zm)~#C*vI#kg-rqyElE^h3rPj^m*J7tytDYn7$Q3RfDl{Z!WZxd#<(U9Wz>$dz$vy^ z-%%No-<}TzY^pTQtR@;F0aOvv?W?2gaWYw`1PL(Nx9H)UH{;=J;3ybu%qhs%d2syF zUBrY=4>gLg|5bSKz^-?m@qWh|Q2A`IZ4cc0D_0;{p;y9HfF>P1MyCBr>f5^m9|7M8 z{}l(yO&^6G8xs)|tq7AHr9p;-!jps@4HGeBpdc`LZ@B!5S^Gq7a22#*!bZyQO=qr$6N~sB4fcfV%clOP8kt6 zE=VWR&jFz@_exyZ7q7NdaAVbY%Df=J0i|(>a zF&Wxt9Ph3?PKC4S8sH5uB=R0H{rWI3lSU0a(%?`|`QL{*=Fz2N+6x zFdC?ysY#xN=4e(pmW~D}@QWaP3U`BPfjOLXhpaq91Jd<_lC#F4ULL&kt>y}gD?!1N zLmS$4nI4T&8_P^`!%Er05#tsxCyisjoyZX|^V{!{Xr%_AObRD77SK2q(j~FlQVs_e<3)y5W5Vl|`oUoeFUM!Wy0q0r&OON|a z_bTo~Jg{3Z@~k$b8B0sd|AohOOL%?Q4p%#oZRJ}oj&~z0#{9yYoU;Zb;Mh*d({O|R z9F-RiHlI`Zf+uU!ezo~<9p@Qs=)E+cxI=?n)M8I%3*^z0PKeZ+uKz7y78?tjWejNk z?Ik}yABCu5hqZA7CcH{{SIN6AOJffUZN`PV8D26l&LU4aq<`eNMG9xO3R%9cap^Q*m{a?*!|3Xr9j^Y37S!bw z`mq9#D|0$&-r^gqiv?Hn?}|pWeZKFhe>ltuG|J$kKT1_2#6y_E zQrn&rH}b7^&7h86o=+ZO?U28C$rGj?4y&;=%0N%J@BE&YQ5xQ{dox0 zv1YGLdVIKc*!%uB|4AdkKTpI0w4hWd>VUSuKs|C5{Ngd7P^(xcJ%|8my4Y#fX0EKM zDSb;=tJ2RGmT(_g6MhAn_9b^{XV3_B?|B9=*g>;DrU}#IDEO+1UfTG$N~tx{veW#_ z<`csL^qBQ<=~Rkd|DoqPb>^cBYMAfJ8YvWOco~82Rj&djpuFu z3lW!R9sA#CyJ=dg6Z?`*fL;FYL1ttVbWs`3dn2Di6pR~9oM_8vp~?(e+|K-<8wGjv zPP-(*UQn?J#^jDfN+Hnf$R}{rgU;_Xq8A=b4KU3xl`tk>X2(I^r90@_Un+|HOVx`R zzq5_|UTjJuv_TKopHFm6sZZ}K3w|E)y?mtR5ufi)zg_b_1KKHnKgPngA#T(W_kw;c zH)!b#27jokzYw^$D`QK8X+au$6+O#5A3Vh-Klee*Qrs||iuR`?sAvHhcCt>H zz{0G#-mmVVghstT&3Al2=+UXJ*8i|vZ)dXsgz|nxG;kUyoOoyJxQP=>%ZsOzd`$^F za{T!U(Q)bP%r3-q69g`XVokP z&Vdj`;!5c*8%0xRid0u4eeClhV^7j-d5lFTUB45fXGT<>%2{=|4r>xy=B4%zVj1JA z{0VwGD4>*pD`RyzheV0Ch#ejRr&p`Y3VV@6Iqs>``NkE;>76))-X7*OA>?kk_c;&Y zJdY617y=o<%XAV{-hB~y=rKI%o*pS;aeL2at38GY34K#wUQh46iP&g&{`)J2pz*la zc}n1H^n5ZRC~q7j5B-+`bU9t1=!zlq^2@5$U>n3MplM&`yg$NSR2@g54P_2xOwq~e z1b4Pvx!$qq+K2Iq=7^Gv-17nFL#v%{IX@?Ddz=K*y`>+t!cH^q?o>n1eI~rgRR0Kc z@4j{Iz^soLiP}MkNOR^P)841{ZI{s%r$FPgwKne-StrHb!vw!BA$*y1ekf-Sa#tLr zk(V3k`9Y#*kq2@jOdFekMBHeo2j~4U*IC?S5-EyyVC%Ova$(a(&}FcFjK04Bqdn9G zP=2l8e)h;|=f4cJB&R6sbZ4V%PoHj4$)y4SK-dx4#bf>t71kHHsCfUZ=XQbX8aB$>;|Lo(@Gy|S1MUEiTAWo?|` zofF=8NW5#05020OJ>RH+JmWm0d(HGUQLpa=^h~bC+ThaHIsCNaL}~g+2iTT5?K%Pe14^A!P;}Nvl_IK5&1Avm_Y7s3%l7D;nX-^Lc?1QW z?9W&en{}ua7NKzHsg>OS8Ni$lc0e`8vv=L@i>#SB$jj-2|EPlc$NA=9l2zG}Y{D!XinUW6Fw>938XjGFAa|4= zG&76~SCXLS?WoLb2;~4B_MMFa5B(>|%BK(tlkB8S_vJR^ImHGhe(SGvn4=%9op)dw z<~d$xgVnSYUpijCBL-AAG2;3`#esV;pV?Nji~zaULG~w6WnXcFBDyRhV^&`YgG07X z_P0KFvi(%f86LB|@m_qRlZto*sGc;?MmsUwR_vC~5G0)L7$(W>bZJ)dfD8f^Rd z5PViZPwA|0G>B5wwKZ;3-ccD80wyTn=LP4|bdtqTZ=AQtWuwpVSkKVArvpl1^{)h= z@LfAM-L7^9=R!2#;ICfJSx%pc?(2DQDqb7kz1q{Th`Fr~ z&f2e8r%4L+Kr&D5?;z+oCDFO1lKtOD!-r02GoAew$gmdh4YQl3pAW)Ntg z%l+sp=_Ik%63iNtEgkEDKS_|l_XwElEs%GO3*t9~P9HV& z+#5vJw8nR`P^`{1-W*nq^yk~tW8HdNE75&RY`SLW9ecTs&EyCw2Ng$fPjCXj5Q@pJ z-?cHt*Z>6BOCg(zLe;>a7Qhm#TAN5;*El-hw1Wr?8U!ptAU!W?0AzKE7?yy zKL5~5{EFXrjgTd*)N6z)x0@m0eyaYO)TF~{*_<6{ScM$wlek z{SM_iJw2T#kw!|?iOiSG1XPpsHw8?`>a|(dy+%vVy>xTsWXm(>MNT%!j#a)Wh%hKf>q) zB!eAneHcs({MSpzeIVwsg8>%@B!nPSv~y zp}l-&N8Q)N`|06tGCA;Ho>X@=(70bcIw#Mxh6wA@p5RhZ$S7`hnXx8bqD@0McTocN z0WR^&`qt{YBE~w||FVGVJlE(1#DtLfu~AAFpUIPhWCAupTsoPs0G8r5w4t%xA!?=# zF0FAET(T|e`lv54I6-KDoEpOhXPtUjJa~3R-T3XJOrrgIwy|mjS$HRL8Z-TEGRYLj zCcmfp9A^2(EYr0r;}?7R%&}MYQ;PhjM9-8L>%}8SIc^@c({QM0DJSpI z;T0S9Pw3_CFU~mH+ZHzcArpl)e2lg!apWT7&vYgSu2gRVbE4wZaUXf)z|- z>sKa03^;W3v1OST1Sx}rp?HnkptPUR8bo%~Qt|=}$9Z2}?k}jK2^`($)7^V{^!irb2;#8CJfSh|~uC^#scys8sqoy31mG5IXw7~lHIEt@JKNgw54SjKyQdC)cmpU0H& z4SW==_O4}?N`Dm}ibqx3MhC4TQA;o? zJ|Q!oC}>xj-1nd_!ngaWS~46D;kUtLWu~`*DBT6EF}2ExCj=KAcYG<}%CFurjZT6P z;2?_@O>F;NyU1pxsH#Q6cTqm75-Lg5Pz?_D4#KvCpbq!=(|xL+_3a}?e{|-GMpzzu zt^}<&k!Nj^Pb%Lq`AT?0UnDXco+K8H56PU%tnSZh8M)F8iD6NAXFb90tDku{k!S)3 zSBqRWf{9>pnKT`3=F41*r{46TQ$SX1?H7T!gALYt8KTn0E6esBt6Z>sd6o1pk?kyo z6G?t3$P5gkoa09@AUX1Q)->QRD*D4i`2-Z#d(^<*TkM6aHScrR{kx-GT~rE0bU(Fw z_=yi6k(LV-iNm9*Qmh4~E2=~%Bh>onw;vRGg)on%or>F9mC3_Bv(~P0V0j@=8+v8F z8gCxw+g-~g&@{u?-&%YjDb&=yk4f5}_JD1q%=2=6Fup&7=qfTBJ;zl2g`ZcP&)j-( zI^yfw?O(kr%tE3N;*7FBLob9$aMD28K?gwMMjdWh%d39IvtxcHLg*BD6@7ji46YhT z8;6D#b=ZS-;cuMaf!cfj@s|W$*Fd^kfHC*v`{S*GSre<+)|Z z$kO;dYuFY^T5BgVWg3BTHxdCfm1E<_jgiGEg`~1{btKOrEmW@My+ji?7QfgCSDC9r z6D-6-YuFw2F)aHu7ND0qvMMM}h@&nYp+MRiNmN&>bf#YTgV zNPDl1Scd$#V5B<#`C7(s5ulIk|NVtD2{eim2@cKb6odcIJu&IC_sE;xgP{+_bvRcH zlKc)v%2tc3Mv?+3Nx-(3NsFjz+QblV;$E4rXls*OK8wG)TvUczw)D_c3JZEP8SBR>1C4)fz?s|fE60X7!wd&>`f!9MzcgOyZ3?1 zFfkda0rM_GO!~)R_5>?Ra-}3VI=Sp(874I7WyJHr>uNI=Lp0~BF`xMy{|aGS)RhbH zO930zEK^qGvQ^Z0K1%&PofXBhop(4z^sRYy^}yh!_@O7mZK!HoZy z6cs4Ohlt4HiI?wg#J$JudN?&idzE{A_ z8<2gRAEDjZYm(327YO+YQq_BR8Dr2?TWC<028M;$$h-}^vm1! zSaCC&A;Y2LI!ew@0XpwOCNu>=9*tJLX{q8=Kr*oJr|d_K7}lgOO?&P1%#vaVW#?o3Rc`ZQk%8g+jGJCk? zS&M0kA!R7@^70%it!$?a$7h@Sx@Ay~pSk^cj9MKf&R!=)aNrI=a!-b-+hDu)NuN#F z4`r;^o8o)>&6GT2c-;LgW^)Rre7zvzo%^Q)|8+0#Db17s!U(Z_3V^d^4?s1n0?97B>)5#Hyp$;9}tIoD5y~qjsu-y}n<5rMMN^s;3 z44I`L_n7raaR#JU^7Z9CrtQ|1=Ctb5Tt>#!lVWBn3*D-BoBi|O=e0%RYNROoHfxIT zNB-qAQyfc)&L8c-E!1!l&)+4~#5KQ^Jxe0<%KpT>S0po^sl%UH@pM~LyM#s6HE5V@ggJ>OE!tQSieH89H=Bo?rA z=lXANlIr5a)v5D;=tkzLisXd>I?b!Cb==Ae0`PLeKX!j{BLj=7?SZYluXm>Zs?X$6 zOGDQgJJ$_m3$aGT#JMEpv9YelHWN{3^tv*x<&Q8V1ZeeB7}Tj-v=pJYZy{Yxq>@YO z{tRHB1mA1WXEY;PsBmnUq30!5s~Hr=OT-B3WTz)yQDzrF?9ADf70qIQDTn4Hl*$=% zpk!pV)GwG80J#9Gs@v$qmpKIY$#@%gw*?B?QGW865{iU};HG5g5aN zK3R)4<;{7^Q5k(zUi3P~$e;S=h-to0^tc(UAoQlx$VMjaRwXxW7mb$q>rMu*uS(!q zM2FGoz5|PuYDbHd*Mh$ENGb1ZTa+6*_0QIz7f(yE0HOfV!Ks)OB z!K^s&mllRtRGcOpbp>P%l8x*8r}b^gh7soqh>~ZUOPU$;CnWRbdUypn9!F#G?{BN3 zL&C$WQ=WCXkGd?JxZI>L+oA&{U@JAXhHOb+wiHgwD3@MKR-<|aA|ewts?fO5KREgf z$*L528*+p|dVm0fms4Xri@#xz?=va9BFax3iABcLWz5LioK`{{9O`J{tAVJS!CNPY zrFif=QY1Fzb4J*XP*@?3)LM!bJoCTp4pxf; zI^H5yUq^0tHmdq=#Lmt!D9D9_@Xl6fX_ElxLikp{_ct)6fsYT4dB<L@Ac^>ws^rGC!TKwunsR%m_MQj{Tt>e1DzwUb;vm`kVVq`jQH#xf*+Dm(`xHF zQ6qtb)(=IAbFfaEq+l*#$d=ks#MStEtE=A_F}^o9Kuo@p9vMN9Q$cKnL0oL@vedW+ zO7=>nlC3{l#y)U3lP@qZ=&}Y8(qygD+OGphh!vhJat?zq7osI}kIH3e_k_)?KO>U+ zL%b@%R`uOV{K&|a2^<)MZ3^!vA=KXsVAUw-p0}d~l!$<%$B}Sb254lJ`aJiat1X7{ zgw_MAqP|3Qo*^|xTV+%VMtPhznEYFRW|04U@A?$lGSGQyk{!Teto?QC!^(>ycU)DO z_>(?SF^eN3>QNoMLLhCSSBY`25xb4t@AY|*KP~Gk1^%g}VE!^+N7|%!(RKAL&p&<4 z%SRYna=cKuAn>9^s&!||_OXiky|_t~6*@CPO}_T?c96fS%o|mv#rfy|-uC>r%7e%R zP3t;^zmb(JOX%!w_Wa_s`HD0*2lv-pU?7zQhn29k>ZDuH06mCv$k{*!fYzDk=z-ce z-^J>rV4J7TbFh@isGVrunDu2yEChYS;6|DTU;b-2JJNx}$iFy`Ew9j7~B9RkY zJ0wgJ+Kr(8%JA}KEU)g-yR=FYyZQfWB{|7UYHQYciTr*HzM;YOP>d-sg%FDMifl*6 z#=LRV`5MmhOth(&q1}CCC#+ z7yJF#MhL!0{yMZHULX@ic-^k>n_p3~T9?@yZmFPmwDkXB0hH7P^Y-#6mIV#SLB||s zDR}NaA7AjJSdle0a?sR{X&@Fm!pz-%tbIN!wo1prTGY%qUnK8tGr(C}aUz?~jONV0 zc{;9`hLc8d^@(uWTeM6MH6KvK)K*T2rlepEVdo=Qc3ywIx8mYk9tojXjh&(oR+e+Y zd06mUou5Caqr945Zt!{J(5W)br?rLjDEIi-%qeO72+xV8dxMx3BF{H!)c)-yrgmg= zu{q2Z3Spp~{=8L@_|)Ost$NNb*V&_4#<$NpiC6Z^Zg%F02=KHV ziRH>U`0HY-Fw}GSu=5i?rC~$-oJ@&@o@W?X;dn)@YdO7ksQwnGVwIr*yfG#Y!`9&k zg3}tRLB$(Mnz1Xsn&`$j-d2$IgWjKfBM~(8c)55mB|6P*bYoxS;-%IO3lDSE5Tsna zA}G+8%Mgf0jeQz+wGY2e-}it_x;|(DuU`iaaHa|se;4d)(o`Uyf%ijz%(voUjN^QU z(PwSv!mE}FGHAi-$_&5viD-1r==|!@{xho>-@`48<)hR@@u_{Tty2q&y=pkw_K_vR z%BwMdblPA7hL zC%FIo?*qD%peh?u8&wP|;jQsDrjo!m;xN;id}5$^{V~RM!Q8J;hGh9H-RMT2>i>UQ zln_p6_h*m$FMuuEfV3}cwJ`TLcN5+i8Ny_YzX3&gFOAp6HkTUPsOnI5@T%MuS~V|( z^EFKxuTxc?NDIHFyz$H0F6#^&*@8&7mp-6O?W*N$JE2k-^ts)~gXqZzf54@-rD6~N zhUKNGl3_XX{c}u$t;(ao0ANTkA<;SDodS9Xc-_60{@ai4P4hjgH1 zo-p=TUDfQlYDc&lo0?mFD_;{axo@WA>9uaoE3FpmU6%UcSN2{n!=H&&P+TZhCCoSi z5VmvV9=fsQ*lG0M;{N^vtJndFAlq%AYrkpjm=?dJY^XV`GLvbBeFB-p=ccOlsFP*U5IuWWeya}~*bSd$I5!xM4-Zef8vk~pm2(oH z_j3|R1`U3>RE(karMSHnW8D8B6R!~3`cgf-lb>Xy31OIBfLz4lPI?!}P!i6*%7vw` ze4+I}vu59oTYiPe*9T-}GI!n-r1YGtDb3Ez!u~kNh&RCmQo@_k2F#s!L?Jgko2u-X zd$H~g1;+?5xB^Uf_t8nXWGoKG1_ztp?|b)84>{5(NPlTx?ueTu{b0CYiOm|JR6&1Ke-tKR~XA<(d1J`ZH*sn;T^pap~kZjgj&`+t6 z2N{omR{#TTLO`MKv(0rb$8(A)E%EmLx>>&e4n_YiL{1V#EhxXWZQ%>zu_WepPJ#Z4 zuMg+cYM@ziy9;wGSPt#kmHn;OJ+L*e_ugcS@Daw(vHmJhSRZUcSwLT>snp10=DZOg6kqF$|63dK z-(G|eLMu%b*!Fd~-Kd1;LElsJhAwN&g7EHc4`%kVO&Q|(8I)t5sO`y?M z)t?-(E$@AC7tLAG9i^UGgLb-EH*+P`$$Y+=D;Ey{AG_^!VBZ46vQXCt6YTeY+DsL} zUL9e)56#@Dh1HaHFoTu4B`k=)P8w=A)WwI@?)A^e_#wb++Mf@NqvY@ZLXu6_VkHd; zrjHJOADuicueAI7WphmqgovefOu67C4;iYe&Tiw{N&xF32h9X+(h`I*by6JVl~!>Z z9^?kf_}ZTrXfTv%Vx!0vXS?U)m5_M}+OEI_K$2f1 zml9*Qm;RknNylYJ65k4innti5zp&>4!Z@EI4?J+HJvc)KMlghd2_OB2qFds&8g1ol z6~3DDAH(E@bFgqwQi}CS$h3S2+?$jpXJIYFh!?4B+9Mhq8jF)A^U{`_HkOG}Fv#DL z*^JF}om;dV#!WI}z4aK^&Wkg2zMYj(xk+p}YuBp~wQ+-hk@m+D0$>rt@TW-b_p=E4 z?Y>mA$A@Hd1P zlJn=B_?A(eX0Buv9cLsa*5yzj2~gkVV934lE|7O3U-4VEb7G9sN2G#iu`W_%4$R|N zJ8N;;=JoLBB2 zwi);e&5=Jo=tq3jy>CBWX{sT+7p$L}svl0}w&8BOuNSbFUVg5qCSf@m4_NU+=B<#Z zrkfV-k07K%#b=H=jwu_ap4-Hfd;hM>va6es3+5aKzWJcaCQPx#JDzs|{ZA&ct5K$a zkds|7ay=iW4dmf;vyvH_v(xJwWz-)@TsUBn(~0b$_PIBX|4bTpQBdKWw&P-p;7_>W!fmW!GdhvP9c+DULCKd9 z$Ss!dbjTdmk$G?0tQpC#BmE@FLd(uyscBy*JaOUa+<~U&bDf5E|ISS>$m~|2n*Q+m z*)UGHj^hTm?_$X;(b_J1x8U^}(XquE zcbH|Xp$r|jrE?U>5h`uX2(MY6dXI50^<!~@8Nu>LQwBse83rGY zyr4|dj02`12YUuR%LHo`L<_aK)2J4K3Z1y+>;*?(2Isx9a`kiC#~b$YM_>xh7am0> z)k!Y=;sS-(oqZMSeCDB4qqjZlMUI-UYHAF{)rwv}X*)EJe%wLjwe{WJB`L!aJUf z>X0Z=7{QL;M8ALZ;|PRbJ|H_B&ww`<*}e^S+L-lVgtiIRYx)|}PY$*pi0>6c=6s=7 z?nz$MYB$I*dYdLV!BLA`+QRpXA-sxPkmgH4Z1pUkn&x7A%ZE=)%fHmZ%=FH*3_W$W zOt*J*kjyy0DTJ64Jg8yqCTJPZNQ+TCw{=Aq)p}K3aSaAX*fD5?ff1W#!YC&wK#yx zU<#kjV0^}R#6PDRm;#j@n+SaN2P&Sob@S?E`CsL9s{Z_e65nY`l^Go0{NiNvW(c4& z>b_Ui+_j-6j z=GM_++UT~)yIFsz4o7U*1D(Puq2E|ivZ*y_XDpUV%9MOAXVnK>!I|m(bXd5HM~yHZ zlFW|@xS#ANVX17pYewm{l_e)8F3l+xaCOmoKDnQpWC=KfaLlj!$^F&+_S4-n!cxE{ z4B=Nk!ZAV59%OTo0LIFX3c0JldS=dKglIx~!|}Mo7kGbeZ*SA!0*dw2ceU6^@MB|R zz0ld9w8D-A_ftmX@UYt-#Me6c#`pImKq4OxyZWh261JFv-7?(uqw-70268)vm;dhp z23-S&8Smn~h1u9~#N&&E<@3`|udOP)zn=i?-_Y5}lPWtX`tFcoTG2FgznX0BEC`rd z5cg<|?OC8uSi;mS^yI|<*J$)W6Of4ouaa!W2-lxTE=SWGUrCGh=g+9l_D6b-<8vPR zKi=oxPiJ4Opa1KV|G%dnNWVei1xGIlxHAXP#Y?vNq^hYej%6^EfM>QS$~d&Cit?k& z()Fp+m5~!F&*c+d6lbSy%N!5=40&}|lO!lu;!Q9b;;u+MP;zT_X9|}Os`uOD^06#G zVd*S?Kmm(WhhMEB#;bN?rN;=&dhAE`%rB^o{7S@ISdriYmZh~AW-NxjUMgtTN-%yqKdYSt>=kuSL@zb zy!`ns{`vE>HQWjuz4x^tbtUYF>Fi%;VeR8$WE3fMmUIx`qV)GewVUgw(ny%1*`4hT z$EQ@hC9s2E&o-0JqujI6J(6d8llICT<+0!jt5De9>FUnBrocd;n7wkMF5zIgab}JV zq|j@)-dBqu7}}Auhn3_*Nk#0=0?B5_UNJUUKr~8>n~|gfkOXM3C$8>@8mrGvthD)A z8ecW(>4Y-T7X{5q!*VBvOybZPje@?b*Odwuy?Rj!`zWHq4-ekeM-Fx(^C2AU7V0P< zg=6z67HlWJl~22GyjJdsYVJx#ujRLE>(RhxPyJYIwVx?PL(V^n3qHosGc5b@UCIk7 zd#tFP_+i=|X8Ig42vtY`(NzW%0)8wK2kth-$PT8A-0yB&LbS`zd%qKTF;XgsevQj0 zD6AxrUxy@08rq8`%?IobCsN8j0vK2raOr+bS?g2z*)*zYbv#_j>$H7~6oe&wfRL=G z%x)(8$>Oo}C6a$GBU?4BQ=r|iy00gAzg=P^xUxZH&95Wtao+yNH7B3{v%lD|gh^`~ zFoGKX926UjN?u#?cv;6hGJzJOjiU+hXO4&e&exqXSW1Uu9Ui%(HdzcE{L|G47qXZZ zz$aMYG{5ifVDeu>c^>=stbFj%I5rZw^dUhBb(%S?=HcXPb~_47Wb)U}uP_Bnjyn~l zf0?g3>;n(8r6=YV{-=|#)P~9@C{l@dRfdErAz#?9(&Pj2wuI~2<02Q_6g5BVfYwfo z=R7U}wS!!mN@w;$^fG{NNhRPxejN=HQY>v^^|1&D;%k@N>WD6-Q2?i^pl@&sIu^$W zRfED}>AQB0gur0=d$Ww>R8+UPdb9qkBxUnh6W8J_BFhk>0Xfw*}m#9Kh+jaY3vA| zWq7RQUUt^+A9&gK?%c6j1|!dheqzBkV!Aq3@3D|$hLuc?8@h+=MIFFG(GD=oyl)PoJ4!_lC zVJkyp`PeLre~oT)7KC@eNqNgNjAiDWa_h21A004>0fmp)zOhzL+-$v!9vJ@I{=NTc z+?%ac>)arRX~&39ki7SSNn}IC=nIYXkU36=W=^Ch%+iS3)zMUbIEnuY^3_bd@+X~J zT)W-Z9c+lw_>vc?WF=NhOf%nO&|)M*D108T=`PjA95R*^7d0cqE$Y@%ifl)4s@&$V9-c0OX8Wqh5OXZMcrA(%)&dq~5Y|*zr%3-I z+Pj8EJSUHX#ed#>jh-Ux+nk23>AnICSqU)Lt7m^V{R^jqvOv}cN_>AGUvUp+h+3Aw#R1WB^HIdH03ts>X#bi*w;bi8W* z{6LuVya)0A2Y&UeFTfd3<5L?a4U6|dyXRE%Px;i!LL-^fZ8p#1&@8e&?zdaj3*LeH zwR+3j*C^t7=J-zb!EFCJdYLTnmLJ!YkMC0V+B?_i-OuYyS-jba<*xhJM=J9hVu$Zr zM>rRd{DlT})8!`rr<>F8!=bz9jE!mJ8ee8QnX_;c72}#FZrN+we$u zbL*kXzm-tRS{O??T;A!*3Np%kT6&gaS?c{!2mG#=Nx z6tlUfng)vTKd5IMM2#^SbO5;NKt`f8J3TqitSU|}^2;MTo z{2@S282MG#90X+Dxo~2wvXTSvb+f<*S@ljnJ%5p@6BTHVGHm-7TATeE>vkqhzARbn( zWl}+qV+pxuOuhABCfEzbq7VnwN)M$h?Tji!_cY=;yO_ z->8cq6=s*Gc^MUShh{UT0lr6m4>^+;5SQXd$M{%Kbmh8?pGfslgA4ZydkNn_ba5HZ z<3QB^;p;2IqVCqO1(B34=^A24NeSs3xaq0qGFwhWE!) z=YO5|ob!<{a}BfizGK~Mt-Ge{$?M^fcP~SlTx3?&dm>dc*;F;Jnj1ARF!9ZoD#3xq zjN;9PT^B0V&TKti;RnpA$2Fd8hFLoWx8Zd6HCf&vwo8YuZPP8Jf28t{;q{Cp$x*bV zO2z)1MtrvKYMcZF^hQ$bWM^K`?$jioFSwY$#PPo44$m{actTo4Ub)(2oNC63UkkPn z@NeeYNpyG}Wk#L_UFTcu$+<6&x~~kFTJkk<2bI1~ek-#RhZ1}!3d(|B0~nt<>ec}k zgYfllar{Asq=slv5;T#a2ZOBeU|g8!l_H%uqgB`PV!3_Xb7EeR*tn+NRKBXQ@2w@W z7PjH!ESQTvZI@R!R59EJr1GZ{?z;e04dg5%wqX|*1|9s!Zt`s{9{}yps&8|{zmFXG zLwh8ogbv|U;tximgf?G5M40U9+Em8{UeI!*cF1q7H>#{;UDjLRYNHcp9~XGsfHwiB zj{^?ii{^MWxl|H?3*|>VSFg5!PQ?(0g8MzJvxiDBW}4_JIEH1!=JpI>F_wKo%xo}` z>OLBTB(7tsW2fj+OP+ADH8gR40xbp`sWIltHvo2777MipN;n&aHMPIg7uzhaZj2lB zdX$9k)XBwASw?=i=dz3MJNq#qjbOqmI>mD8^R?B2!=khMt?(wa!6orfXm6ng(?$TU z;^fJ;H?tKS=<*j1 zbijb|uIdHh!jfTG$9>|}5CTdr%}d%$oM-mAl%OwDgkkevOUOQt{@2V5ROC7cF4-Oq zIYh}F)t%Ln_^STp;q#U5M0U>AA28L_Iiq7`AgB3zx|Xq9ll0^3>pi+fAf3qCGm<>K z0iXfR#)xa4n3hy-;Y7~8qkjwIa0QeIj%#Cqn*}a@X?0}_AUv7|6s=nl>Oa` zcsI9zc6=3toNq2V9Dfnw@Bh0-@6bz`l_fx1wj!dYAx#>6x}mXNR8rd&?KmyNOwJLt z#PkiT5i)WRs#~-y5u#XMH8Hg%a;(CV|DnB-x~p()QCac}lm^=^QL3muf2jDy)JjYG zrm3o|&9B)y`T|I<%zhgXHBU;J)AF`3#596w8a`R3B4bUDN1 zlV#ISF_VEoRpd=k9dW};#nMzepVwW#==$^xBewi&at*X5e4+1^CYOAKek_J`3JAGp zc(NNgzj~pe-EGCNrULJUYrJEFMF%*-XE^lHCiLed=uuBlZ3~{R_=~ac-(4)no$bw_ z(N34hMC}7hyHOLZVm#+tq%nyC@g|d#EoIyX)L*~T*}eGTm1hww|Hbn@kZ}DG4*wzE z0Np7DOmAAdXy(phf+%9s1wAZuvNJNust-q12t*|o(&KZfDJO`)%|}Y?ARbv?>$2hO zZs0+#iN-NpdGvxy5Rs7f&LyR#nGTBw>m$oaLW|_pj3#B z@;RH*Vyt(#T3ubeX7}`AUNi8C44WVt>~GE2+p ztEqZF693p_^xOa9jJe3~@aK+5yvg*sIY-JVZ#_Bx`=-A|z|e&6zNC!`q`FtFyAFdV za?+QZyA-60{({^|RJqqCI)-$>GmG=N?e|7;0o0`@NXAaj5rVz@-kLHd7 z5r+8E7}GX&XMccYq%!cornLZyq(zMNP&W0B556TL1A`;oB>*&!_94it2TNp%jkAlI zlYOq$n`Ye;`NeZ%{oiw&u&A#CqnZXd^vFP>r3jKKa7A@BiW}F+6tlaNvlPq`uPL(` zin`+nfxaZNpQtvrf%Be3XE8lqT5yVeg)0KKR)yc_vdbs?hVWe?*lM3Op{Z0B7ZTMZ zV1O$xkoKt^z4>#=cRom}m>EQ>gf95_1OS6f<)?r2J7580Ayro-zUlqM%-v^ju(e!| z-|Rxab-4xViu-07y9F+8FfPg%>p!8XIq(seXXw7IQ@dSCptd;~KRE0Rd@{0XNI~(d z=cBxW7l(c(|5g8dh@?CD_=e@&kdnI|)>k6|6|!5Cg=P-eu-pES7q_l^WH1&T>Wl{W z_EDZiw~rBJz$3UsJQtf1l7XiQ4j2}fH3`BX|LFGz-3=%9LnD=G0N$+%KD-E6!Nee7raOdzo9+2H-%OF0fIJvBQv zwz6o%R5YlD+b=US(}HY+&wKs?Ud~TqQ-E#3AWpL()i-GlFHKirOj@$m*2SS6-~ZKF z&3eEyqq_0wY(F<0-q$}@X${TeGuP-m=U8rKIGud8M%eNMJX8!T#)o~ICR&AHq_GTs z!U!x}`ACm5d2xSoK=x<$pwuxj6BD;<#?*<@kgaq4CizT5p7`xoK`%()dT~kYy*cOR zhV_T9k{_6VbNF?9{&x=VKS>Q>_^Bhm6og*TF}O}cX_D|niTCNM_d7imBovbL8R><3 z1133)Uez5h@`Hy8HHc~sDmoa2r)RjnMk2ld8%CDo>OB?gpK-V zzvZ*pdd^U>=nCAwN~MQNY(yhaIE9_6us7ehVKWw2>4FYzt}iE`A7WAUXl}nX(^|+x z=hA!pB&SbkDhmQGF_lhG{Nj#0hrF!njw67yAD=JS4qQ9$nQZJ%9e>{|3nT1$`Rn$f z^(;O#4jUW$o5@K1<;N?GodU1u_+HH=Ov*r*O#?XbNbt6QMpG<5d({2)`asVpn>Lz zMZI!^|M)KG+n4R$Y)C2FRg`~wljRg+!_zfZTFuZ%`Kae;XmJa+O$r70`SxNW|>Uq4Acf2}V z;c(b;fjVN3T13Ovi0p8)r5cq19-g65xH_UwkG7(+5FizD0Boa*2K%>4#Z((X> zIo2VV`??YcP}dL>kG!rkjL|*zJ#yxB6=P?@@#@h{?>H~+e}*9cKkkUc4%b3aA--oM zSPW{>EF5hpseFR-CckdFqcC(gprmbq6d#n58!wZ<*~z63>kEFqwC!n`NJrcF`(*9H zVPm~Vr|3mes6=;SskbT`O8nBQET0FE&1&Zb4PmM4+`)ze?)zgvne| z*yr9;LCCr8=snJM!&X`l!vW$IV8N_GoYN(H6l*hnc-14!1?O~s>n5WRP>mWAWl_*W z=F?m(dCX`yQ)Q+!S8tyc-gqqAa2Bs?C*J(#bRqJ5MIM=q*Br~B39+DnDtWYjM)>^l zXC*Pm*7e!m2EY-Hmm>9oB7hMqSp)(VP_2T#y`=_iymswp^m%_xr~BPepw@bsIU|aK z?Xdx;lUCJEyZ9MZX|ur7u#=mzJ`iGdG1`?=;1cWdA*hEjq?mb zQt;rryX2y>_y)(Vl^3NmKNB51MBaXBz4AjMkAAp2B%5otsJfRIZNji_68oGtm= zh5uDHDn zr8r5Op)W58LbI+>`{G^WQ~GCl zil2$dlbT#If;gCWG|kR6#Cs{(Z{=##*QexUm?-2YKS0}G*uLSQQv#SXbU$qusSlKp zV=Ao^Qm@J+lJ4a{r=BW*Dt>6xp1_mi)W->}U2bl}j^7rM=2bdEyO{2hRJ^RU|BZFY zl-=%cwr8zyj^x+4D}}zaYNqnmG@&y1ytVQ=OiV!@J@RDibhD&NmbNmhY3oFsBi_gzzNMiSD%qUMAP~`u^rnPEoOz z`AxG#YHRED?9b>)H~l0oi&%r8#CrGPhOPc+DsiqiXNt&6@-JGq(mkRne~6J{se^mf z_J1ukUBsZw)Xx9ac(qf2+Tr1F@3r@nPE_MT7$}oTJz>j3G4Bq86Mlp8tPPb}u@6!? z0P6HO+JU2S(+z~`J@qxB$DO+RwLgWeE$3r&BaJ~wEY$Iv3`VS`e5O;EV%lbzsQmcLsn zEUb4~BfgXOqDH4q&iicok`HD)AA$)I5jl%S|3R=P_}nFk#ND-d(1%kR2MGxx)BLnj z$1xF~R@=qD3ZUDz$B6n~@HkSXYZ6XbA<0ZnJ4QG6mjQE?I1z+1CsG3HvziEZVaKCH zy?~R;6(RFz=9`y>v5^?#9%&_5%biw8hi*KTDIhUwV(i(@GN1Q}<&8n7iN5{o;&iy) z;peA6ylzUuU+}5sDy9{V&G|=r^1BQoRT85Vw?rFX9ugYjQ6OiH2tPFI*>yZSzWf|q{d^;}3;W5q3ca!S4o}U#N+x~?z8+?ym)}SnOy-j1Y=e1uUp3~TM2RW-_2rviaTMN{qOoytrfUg?{n1%b@xOoDfti@p?mg;t0Ug51 z7itkv0pdzGRvgtfQP~r(i)E$`sv&TPkPrsnY5?x~J3ac3ippZ9m4!YczTq#}#rmmQ z)q)?8KvPFDR2Y)ic1EIpm(*VqcSax($hA;w!g1mM;V{l1%&MAARO8&jZ?dGAL3`Qj zx_1XRrVQ~!qESUE=#_IAlrjh^J@r~odD+DD7_itwYMxmN;pwwX+0KL?ym@SO+7Gew zd&?$jC9NS)C#Ujto8nkt9)%P5=Es53^RZ9FW}j_uOSN&X5%a5wXP89Ffc?--1CVl_ z|3CfyQ!TcCmH+Y;;}tQMa*c&$1&9on`Df`ONc=Ed>nfaz1Y9Mj!5Su!R!pABG=beh z6|VuC{7EMnSIx&LBhdY(WM5eb)p{wSy_H4;J6-g3_kxv%OJ2K9tP0an%hPNORe`6} zvw{wDJy#qnyXGZToKtf>Kg8qS)QzxB1ia7XzM(0&8hMVZdErYgIm#}>r&r++2&~=c zeJXS6d2>*gQ(v!5r;wWeY1`xD{R^2mDk>^QMb&ywU}U?#2@p4sDBP7dM^e}fJ=x)Q zK6|b2T9wA6d}tPBZMF-b1C{zePnqO_sMh9g&;M?L@(5DFRG8oG?&e02XspTq8kaQW zbU!uUnQm!gw4GTVW=BrUUU1GtlCu__rc4R4d9_ z7^D&}M9*gy&ZF&qsNEh7I(3)mw|2;H>A0@fgoOx7o@>^gUy`V6g~OWtaXz0$%5MB z(fa9Qy;Us?(n3=RO+2#xOfZ6|M@Ca+FbEZ$`M!M?Z<}#H;qWyo++1ntYJ8eiy- z9Pd(QyF<*2HgD1aG8Pxecqhm$*3+H$R|5a($ro<1P{M)|b1bvyE%LI?VKy!!XEWla zOCe60r!2L5HP7y>%3A2GRebKyU*%`__so>&(#KH+t0=boJQq+$PT_OR4K=n|sKqBl zsCp1{AQQ4q3@z4*B+kj0CPMj&r@+M69}}(pwQ_E+tc?}${!}?S`%GdxIkGka_`j!g zb@#{-$`k>lPsZ{CV;JT@o+V{fC5tS`Bg)93alh1l1$PNbc_ z(s>;P)7|>W7-ghRXI9lMZ1S0E^N;0Dt?lenRK8LME7M=1|rq?gaIPqHE85^qy z3oior`rnZKEFl6=>tzDCTmOmP^}}RIV%p$bz+4fN=|MI%-;FTjT5!SScS7xowx=ZO z7fxhcDTf$OU`yotr~b@uoDKJ%>pnJ#(jYj3q2|%XVo-@x&Sd{5_tlz2+^0I2$WSn* zjkL-T?##SMZ!tQ~45!E~P0K-}hXgrG?btu@;or2Pytl~8bnn7G)Gp_~QcnLl-Z#%0 zY_xw|`@sR5zx`Q(1i{#FK?ezt_;Sd1g7?+CLYDTQoBbh&{cQywA){m?p{>NNnh4ZY zrbAuS*+thhUwR7IhO~94$d_3_FZ*@ly`W_?#E4hfY*OY*uT3=cbQs2Z07Zl^d3^T@ z$_N3m(9zz={L%=p{9W>f_qIBmvjRt{(c{fwE@mybPD* z=M+MEA6m{d6=e0Q+-sB#S}tSdxWF;0I$((!!0ZZTW>tnvzWMC*lxqi|h&+k(J=m;y z-}xDxu}Er7r(+LUaymO3G#A`+g{gKw*x~pU4pJy@nmZ_Hb#8sN#W^CQ;SAIB7^;cI zm}^x!TxP7|r)>GKTn*uO+GkKSJ9)5+e3Dul^7kQ}CqCIw8%ADy-6Ej}L&te>KvO~~ zX_KbG$lm9T6QVhJ+Z|SB1jmrsqV~`>7*Ax~@J{lJpp*^U9~`jTPa><+!~j7F>XucN z1N8bhQyoh0+fu>O`ae{GUW?XN9Hx#xEms5w2MBOf`O`=lm$4paN0Odw)%=e&#J^pE ze--c;&hW*q70+IEt4()N3tU6a3uW=u=4w+$I4xk#)wzgcF3bBbW`5ox@Azm`TPN#K zlPRM5DLtthY@QOovnvPGJ3c6I)01vWaW$?kP`z7&^xQmEJr>!LG2*+ZGBc|!$THy> z+F3k)#%2*-o294UbFrn?w{qOSBKWE5GZiu2U}O{Lk0l9V^>mqG891=JyL-G;U%<%Y zAc)*kxiyVLa=|qrAwllp{%+%_haw?K_?8lnX|Df1bbu`(M=qfsuuNkb5xhukW_PbP zF*6%zkx^=fhZN!UB7QlzaQ)#$FOOwfxXYZ)WZ<>|Qw@`llzso0OnCt+USAS$q!LTb zZdC?mAIZQH?v{0>`c%DK(iSsR6>er0XO&E)(U{9VhOCX3#zYrKJ*bx5g&LK>JktGQ zho;%ZIUsu%4N~*90^4GEBe~lB61V0b(q1`$DE<0P$RX{U2WZs2j0BYEzy~*&oMr8~bFUa3TRJ zH=N9f*QLBD7Q=j1{ql`K1s2QaZ`p6HYM|Lo*?^eZMyt!pp73?+ZJZ~-jSEMh+L`~K z08=XR%ZBLK7rIVWHm|JA&}Ae~JG`Ffl2$U2J}m`w46!A`P*iblK+Hu8RMdW+n=H+S zV|UHS=s(_4XZ}$VJytT{60NZ%qJ3KQvxrL5_XVV0j>Xx7;JCF@VwBLM7~bAvSpEjm z+6^=EX^WJUjE!3s^!>CfK>KkKIdRxu@>0ds^s$Y)-93_$F_3?`p7_c(J(rk{jxH29 zarxV0xg&9p>+x|_d<8>s#@+Kt^(6Qh=kaXFH7PE-9A#s=&;8Z6)2{Y*ksV;D?&*K3 z(QlDJDalPF?C1%g?XkYo%Yrdovf!b|-yulYFEy1^K}kU(bQdr>h?yp3jH6eIPZxBT zQ3q&&m(m;O0>7YPQsL1Pio*J3WD51HH7m|24=*;jLmwD6ocjr9XzFggf&L^E?UPlW zVj75KnDVUl!xiqE6#Py3psrS0K+tXnNYGX7Sn;71qLp% zey16tJ~cEUTi#A*A^1`zGscB1eSOl(S*%TjCE#E#Z?5RSzw_|+uX0~1zbIB}YKq}l zjVel#w6esvYDr|dXflHx2eJoyas%2)SCTtxRWOyB{BIg>+iSJ#DP62CjC_O$Qv z;N^*?z(G$|@p%mN7|pw<*{^$YVi|GY)ZJ;*0ZkV1{m-9U;QLhr)sbIj7%ssCPGVMF z7apu7$>og+P4%s<2DBQjC7GFG@bK{2Pj-StMMaOh330Ov3w0v-HeV14oImB;$u=6V zvo*X6NU?2%1XgMpdME@|-ZsBhP#qKia#}pKn^b-LFVG-VGHF@he)x^%W26BlzPY3 z73ef(kWc}2^+wODN-D`K%f`Z{h-V8*J?Fm(e_$z9uN1_(^dKEhu^HZ2KeZP9qnPUq zXb1E{<2P$E7R7`GV#Zy$1>MQTI_YY8s*GyIC$F@=Vr>?&497uUY`;a)z2)6(!?_Q(eZiX*7N#I(n1b?n!c5%j5ZNjcuY^jBsDKin$lR=?BR zQWGC-VbHs!ZeF3Si8iI!7_h(Sg6L~xU4C}ITjShE`s3yS2n@jX(V=N@>#UO;zlmjd zoZlhToK8oF@c8?ikf>@2q~cLGk0du_!jD{SXDm8vF!plhI4e2wDQMqu-wFSAbat-E zCCJUm=>rB=v?wSc^7;orZT^^uGqQsFdy>BG9v+sd5-m7zCc!cbpW3vu9R0>@ud4&3 zT;Wg3XzcCnzm>7eXzDju!hnLlx0_HO^b`pL>Lz@juRF*!)gk`5H_CBKw(b7T^e9uZ zjS@S|^f~!!?c3YC_0=GXm|$dy`~UM6p-;@Nxs7w*qAA6!9n>U8>%{BR17lnMz52p@ zgT!0HP#yv~;la3fA0qGxJ}*8ayI>aYwD>budMHuasPMfvL$Xu}WASGwl&W^#{q)-F zHJ9_$>S4jbaN$^F@Qj6)fxSX}G0i z;j`?KeL;HZf5%?)d~vg_?*x@j)}^Oy96AJT33+Mh0_d3dgk2W^^Q?j>`FU$W&g4vH z73U{!9g#>Szux|2A2ftwcfO-pay?6V?Yowi@`NZ(8yHJVR%RxbD2!w7)3cMD=3+f} zpsz7C&B4JYry65tue6@y*qO+S@`g9n$g8^gK4{>b-Lm+oze^R-)Qk_!ZB{g)iD;m} zN%8XXveySsuqZ(kVA(u2r#GYJ%5K+5KKq!U76CzCUyM5 zc5E$hO$p;Y5{G_GW3~Z2bxTRPV>Y=+?Go_dZr$J+%o_>;%I#eK%)|j&e@(Q|)&?`* z?)3}gLRLLTrpGF(^3?yeQNN{jrkdoGWp7EU-k+u~|MBbqm}nS*q4?N4fU{TbMI|=Y z4sA+af~6o!ZC=~ts*n^=H+hu~srXfHFX@FSo+o@_nHs-1W>7Fl6Xur&Mt)R$R!pXM zb=~7PnKBl0WNBf4vU*%Z-yW<}my9H2%9)<;GKTDJu*HyhZZt`cn_RvtFOWBlUux-1{~_r2`Pw}sJY4+>+E)OCR-6|v z@+;qvAe*vdX`Gy#1ddby-c*|47;YXOAh$}|9;TPKd_yLEg8*o{9%-NMO8}D+3apif z*xOgg-|sTH-JQ*x%~!Y_=m0nfwjqdH3#tY1QXI2ubERI}E9{JAlqp)(Cl>DH z%En)N#$ZU%6vBRhkRQKFJKLbH=a_8p!H}nTbM;F1Uj4sNn}6p_0k%GuIObGB+hW-T z`H4@4-4lHR>JTKZdW#7;yV(Zi)@~4bC+R1+&!SO+i@p=e0C-%hh$CUv5T|VQeJz0N z?l?%*50a#@0Dz53A8g?4^n)Ll9B)@AVYN*XP;InPV@-`|?Oi^9un^$VegPU= zu^it+DihWpMvm+EbSmn)oA|ILVcyd(8+_KBK>Xt1q$ua^JSx8YdO`30G%G23Xm+}( zwpNpoiHR1dGZOmNHSS5Vuzu$WcM?2;NUIP^78V6mR8$Zuj;H)UJaL7-h6b&(v-5a^ z8a*HRvBlQ9iQ7YqYfg5(L`K_sz=r?nh`XScI2FyJ_ z;wXXA2HwYj;Eqj;@mLQhb|rfL7;(o__62{oTjsJM6T7}A)x3u}LwBiWCyu78QpKNvR@AEUL408T~^5~pUo4n2$Cba*X`dccY3gkVu`5h6!G&Y-FR1`KU97NT?gk@oFDT$I>h?f$%I7@w?XQFk=?!T=Vb9{&y$*PZ{GU z9{1#qI`>N>(uOL9u#)`!ITXO`ABS}YG}H?_T{C}s0py$%e4S4gsIC$BzSPP^=>9lR zoyQqKww3$3Ss%dEsN{ru<4&aO;_!bS=g=>!#Tqb0B=Rb*hFg@-60t%IRZG(%n^U8Q ziaTRSnt*{O;FM+H@#47CBhznec})U|iy}a={3)^N^!9Ko^3_pX7nNviO{Hr8$u6kY z1F*lDS2LW*{)*T9s{90?8DX&)oy|z>oBdHT!BHw}Ycu3TLr#v5L3DIdp`oE%WX{0C zHL;@>IIplMps+P^KdHEMA7H8Lt+%I;>z~Hc*Uc*{dwtwX!{K&p0@DHv!&v~KP|o7< zMO#=~TU&17G3Vo`k1S@K7zc;?Hfg8mAMBSDf{?hfwej0mg!WtfWN9H{THqj&FF-n# z1IC>J^wbdiwt$Kf$sYjW(uFci_@5w(T>Ox$of&rrvXTrmFpO$oQKUxz3cHRO4)C%8 z6Q5NP2vD1YPSM&C;3x*?T{2su%~uB&X86VT$?QF9{`;F;mG%8fvj2XaaI@rsH!-~5 zgQR)uXoou`XM{Fpe52S7rc)%hm&045dFYsWry6@H%H^o>YTFT@cMe3AnP%~5`8#Q1 z!iGN!1}K)CMO-`XHgh1jU+y9}7LAaVO2^qGV9yHrW!iA#U>*3khw#r`dWCd-Wtwj+ z3spBaTM}-KYBPueG6={@gH|>D>1m^i)>3}oXsN88Xkwh-Cep>HtnzV1o)o0Vt8n3tRUfPVIc_}%;$i8%vADXxrHUlJXBKlSEHqk`1EEz zrA0*c9xCW9KudMntO=qoZHiwn_n19L{qHZ2=F^i6mE|HV5FyW3HdhvSer<8I5Z5mn zuVT^l6=cLt7h_^~QH*M&t_|^7(3S^9*DM?HK9t5hiifgFt-t_&u`#>wlbfBr8YW(Q ztIRkshFOKs`~vsJ>nwUAapG1pInB zUXvq_2Am%PPtqpDXeq~a37TOvMj?tu@J{#NEgzAtZ$Oq`EJi6(Xl}bcpboIG;d3%m@ z%cSjTA1MBiZN7xRNfW`Hm$yyR&m32OQ!8h7QE|Yvur%mKt9z}FofDW=80&r{H9%5Z zvAHh{(6AwDH(s`LNW?&?k&m5UVjlf@o(^vyCBUZhSY}3fYz5KrOLw%z5kHj|JarBK>oEfT=?|20Iv~wZ_UqCuR%!rk zDQkt`(`v<@^Tj}2tL*3Bh$Jh4>GN3Sf^_W=OI#ee{2$$4(t{!tKLf9~f8@C0IfYSL zY0tA&8O7%!m(qa21bC#RbNvJvU(3xlFhf#h`VRma(XWy@p_tf^5)i*a!*gJ#v)oAy zg3T4>DloDsC|GKAjjMPk3_Z75kd?J8d@j5L z+VNA@6jIu$sjO5@_dJGJh)@@mm6ahNAmo=fQoI@w>i>Hp3b$vZ{hsqTUzB+{}|?0-qMTkO$nlu z0tE|4f|jvnO~P*vI(66fGnjwe(~oJUp*1v5;+~8?3+}^|H;&j}VX~qpv`7{QtRRtY z=oYU3V)*~3i0SA5`H9ts^ks5>i04(k=h5-eD9@6HsAl_x^(&R+u4J_S<37;IjdkcD)nl9ijQiB_&E}xaH6Hy+e zz9RZq7B$8|S`6 zy*FVV1yHr8R81Eo_<_o(*ldQ`96$Ldm1nX$MBAi00;Yb@yo(}vWDj9H@xy0|2PXHW zAbNT^C%`1*N2@;1heZZ@QIVm6fjAp5I2ITS9X8+90-|wA1D|)*w|AQ<8&`w|(WOg` zefa>C3W(eL15kc$OpFL6+~3_;eZ#h;E|dOb1%ZTA2Tsl-+ruFLC)t4!F2k_n?q)wH z0~+|~-_nrK?l?fYh_f`OlQJw`Ff#=I(nS41OrlZ zHc;!RHn(VMv4T3J>#bc>Ed6en@GR$e7XLU&azC8jo#KTPrioO|qN(Pojee{K?kHqoX%OLL$KAy@?Ed ztcF)iee!4_>~_!aAvQ{glnIw!5ywzixM3qc#S{?!sj8_lRa8{q5PbHri-$pQvM1%( zn&flklc>FA)LXXK!n&V6^lSql&qw$9h?S@H9tT-}rN1XQiPt8LPP||VVm*axxv63w zQ`sL(nOsx0^J*5cyu8}{Z{yj+_zO-3e$Ol41@1j5t@Nt?;}L!VMYlERAV|`OJ_ukE z6gGPap7J+t4v5(!dKB~$$8SeRBOryYZr}Tw>h`w2)K;|Vu9WrPQdaS4(HRSmU%O;3P=WwcP&Ts+=UfxBEg3phEpc(N zE~GLK02?>GKHYJ+5WJxL%B|skx(&w1$7d|O7ImokSMN^Q&NF2#D0)>u(DwT3%QI(j z8^;@zVN_P2>HdWFtdN4TG~Ldyc^G+paJ8IAk!9_pyROl?46mj&32*^s9pOv+5pCFO z?JX;K{hOn+Lrv5N6Is7=!`8rYc-r-r+?2|J52iAXZ;QS>+L6Geh%tq2-mfxft`b|# z%n6#=mi>44gO~6gvc6=I+WuKsvIXJJEm)I>+5BiN!--aGeL@mT0b zm$dsEdp&wz2GH|4kMr;OXBe~)UFZ`#b9k6r1ubV7F)|Chs=zgvsrr^92rt<`8)2dR zMYhf&tiNW7S5ikY{J}yb{-+18{qp0<-lU667s`S~%q0bfIh9f;^oO5MV6O5FC|Wfm zH61nKgdFU!k>uhH99?uh&Uh3IH_-fldb%{J0`pOVn3g}_3%eEM$*C!btZXP<9uF6n zjEPBhsXP!in=cQ2>hZU4sZpU{==n3t(WS_D1+>9hZpRI6yvyN8vL%37v|H z%6N_LD+sW-GhpgzoxnldpYQaoFwP2_9LsDJyuS@2K}$jyyljg^t!w|6J>CA(JWk4r zwFKtD^$q#972crY%jzcwR-R+&-=)=_?CD2*TMPXwaR!`h8W{Ak! zOku{&QPpY?&Op9b%EC-+)58?Y6Wi~n`>f8=(Q)4lRPILSGxDRPTa*=ZFTZYT$}N9i zRyywdUey|yZaMMO;(gL%|FwF#N*-A^O++)#X9~buo~4+(ap?I9{Oo}H4sDX*i zcV|jHc9vVi$WvZnvAw(I`0D-5JR>oA^W~-Ao_OzE*($gGioWewzXO7kQ&N}!PBmkR z`$tL)3ZHcMU2t%*?nVV5e*Tt84O7zs)ZD^b8ykJSF*F;eoWs#XobP2E94b?TxTed? zUwR$-&Eedr{~bGTqC{-m{0RsciYt9%8=6(e2@?hilI-(AM{AniC@qUsOSfjR7la1^ioo0)#P7VL6~k0y(c!XhA|T;_ATnB=sY_#uGG~Xi zVgIM%{8%KobjqB_8xExH(iOIc&+xP?Vhp5JXd}oLKB_)-m?1L*oyw2&ejKO3lxb94 zZ*Ln})EbIp|nk!Q`ye&sRK$LHTS z@}m4z$(ivKcZXzeHm3|C%lZ4o`fJ7Zyi3bYWYPizg4Q&q1#jj~H{CGDW+^coPm}v? z(j8Y*yv96~Up0V-rLPb#8z2Qxi%VR1j;y-#+EFrR8Eur3YEf;a=Dq79S|#0^{)Y|c zV`rt2lsXR#;E#@v$GNg9-t}0@S^^7;x_9h)YbVwF`UmkIe4jJ`?#bK=r2vk2dv|ws zCjWlJ$B1+naZ5nhy*KLwqLE6%(4#r+~2s0e9-1>s-Aee^^4BXAK!K zGu4rhj(o-WWYCR@@q!ruzL8^#s1y(!d|L!Rze*`QBkqHDG8Ij;PFE=mToIAEmoH!y z#b&ZGY5-wi;21bwT}G$8+Xy1$P@c6^)Hhud)hm0#f>3p7^9Nt$|0Ml?-I7OY)t%Cp zjzA1&WP*)5==D6^n-kNoA8*`yzk_L2Qw^T7Pl`9EvILZ!h%j0{S5+8r+{*@KX~sr= zXwCSRt+5<*b(%ax4F4^8RpnJ}z>E2Oz+Zjz3$LvW?)_4hg?rTJ4D3jh19_W8o;o~~ zGB_Q7y|9p9Q{Cte2T<0^gNIoU%-_7bd*~N&noJfoMFu6i)C~)>FW$X-KKmU}K4_E* z%aSqxiMswc-jGlmO7YAjpT)=bnuf`4G#fm^=WS8 zU#EWULtV`XMv^Wr$RG|SI9ISU@lsAcVZ=@)NO$f9@mT#*6nEK-|I>BMmP*X;=@|vT zm#d^GFJpDh+eGjfc2BED*c471AFOGxlk`R!65Z z8{O_8s@^)|kHBe2gLN91gSDXMYpTkKHWa9abM^{tfO*%QRsr@DAu%~x4~xdek6%)g zWhQfaea|7g_h6J7R>%59wMbwHu#KIi_#g499eJM|zNM0OLNX~de=Vms0ga*n56lf$ zlntz!h}BFglvzDl54w4`G2l!cK5eu+bj9(dg-BAGZpSM6;^>YHUDR5CG_yu**~bX= z-9#j7>h_?<{A+;=OmNhJ|h0VQ<`EKu)AiRlJElwlLn2h&49Ufo0j>Q`0@fv$Pb}@o*g!TIsCn6vs z)oRvevM5%B_PIpdLFiPkyZgNZR}~}1ug%2b)yCfma3hCv7|8z6o+ElYUc-0YVJBQP z9!a5WNid_ZWD5EA0^uXZv8S<)eYF4%(bJ!& zw;Oyu-{U0RhmY>TZ8W?T0NrEVpwOjgA2;G4qo%N3u|k0T#z%?XWsz#ar>%h}@6V&& zSA@rqR?_ovbmRm~1VUTA&|aGVehZ=lW!koR8!m9kY1|QG-24>_&Y!|FKd)B5%xO`8 z*4nSi%YILHUN}~W zE*UQiWCAhq{SX2IK_2&&PSNrWmHdL~-#PU^+?Mhn>}{5*3XI+!BM8>UJ1te{miSARpBqFiI9=tN zL(>$oWx21^K~r!+^!ZR7h7(Kyc6|RldaF-XKY1v0n3_(xm-FT>KhWeZ8GIShC^H+k z1a01b)x&)YPTG`3%ESDy5b{YJN16I;KojD6yAC(UgAKV7r*iJ_$7e9y>E6Ul0l}t% z$TDhHPumDrIp>Bm!I0TY#iz?RXD*Z0`_MC&FVZd%(2bhyW~9{k+>6-F#TK-mtbJk$ zud;7opqgQ=VYZIoI5mxxpS4%n-i`YW#HO9lH!dlb2`1X8mEdO;!A_^yRhC7kY>{xe zHQr~3g8QT8LvuaIFIV#1v=SCcoZt5SDBKV#oIKmm%l)WhxZBxFkyG%|pyjLd@7(<1 z0F&Vn$D+dk1d}Kyt8Jx-K~6hMjzR_-OsBp(-*m;1=M9&J^nl#TFl6rb@htq7&gmHLKEF;Ccn@Pa0BGAvQ=XkEqX@Kx9nK1apfv!(EE( z1`gH*X{Py;C{rkR0HsnUEA3L2cN|+^A$y~uOWd0K%zYNzv!8+thGVS82Bgakt-2v3vB8=IoYb=&^RMgPpX;^m~am##H=BH~vg#Z+$>mPy%gc>MGua@)}(6 zNI5_HC9vf9m&kH*JBds@{jbmFLb(r;F;*0vEel0j@L-s{f*P$#PhYr;h33B4k9uzN zXJ-2kk>>Gcwo3VOkP0lYg90ve8gsaL538~iSx^-Z1;7Xofze83S4{=>O6=lcXK5=!2 zE@$X4?o=VArsrBWq=sr3Jm;tD!_oE-ro6eMKyeBYS(+miF?IZ&Z@}tEFC^#*AS-cW6`vc%>dv`s| z;W1v*>!ao!#7Zd#ihC!6X^P2`siWB$Fy!$@&vlO?Z5uSsdHzT00t5nx@QhWm5$yB0 z1*%MHa^M{PRBQ&rxl(vDFGwDp5XTbq=`!E%yDIuZm8J%90X~IhMkHOycoJ6#ok5Eo znxebi6Cpws7|zy~l18U4MZ4&hSw2^fJM9)Y6`GAw2(wzSKN9G4x*ACZ4q*0U8r!>Q zG>tv}>`sHC-r_Xgy#l}4`!^(u7AmpH#8D2AAccd&PZKPD^vCYYvmfzKd1W#dqySU) zeWSKP&7`QBQ4C1(fq;s{dkvdTwio@rZ^P0#r}_~dtLM7&4-g0KzDky*vx?<4C=B49b{ zYeH}gp@L%U3A2>pR;@(0chk9Lq=3mhn-KTHqio|J=<_ieo%6vrzra*(v_zp&99MHQ z>I!o-7(My+Fq8qyd{_;c?>Fs6t6|{hfJj#!Q@4%$=3SRzB1rk;BW`g0^amEyC2|t` zCoSld54FcX;}L=N!6=2yJnUb6X|l5Pu#pEYXv0)#6cwh_HEM5Uw{f#1O>&v)aWboO z2o|1K1n&mNZ|WIVQ_W}8&$j{tvVZ$_|9n-yyO1Y>kkGhQ-)ghi|Hs!?22|BBTPuPR z3eq7V-67H`l85f@knZl5uEU|bySuvuq`N^nrSsc7Z#;4D{rty2VedV&X3bh_`oy)v zVqTs=He~O5Oy>1E>Y?BAkg4oPCaqXb-!Y1l=V))6!_KuP7b3+z_YJxV9pdtZz$095f7Q>BZBCCmP6K zY`vUMCrK1CnlBXIO94vHoBbp-&`RsKq-Ok|cObQIbvq7798@ZG=7&k|h(f+AlwVB4 zbTAEN76h?fjJ=#CJlhuqNiSVnpo;!t-iREkj8xqDTDoYt?w+?bIi)^)B=^&A? zb&F!F`<@aH>Wx^iS&&_`?jFrm^gyw^4oxP|G(h5_gOkCqeG|VO=PNUjJ-!?5dH@)sA1BvFs zN>Il1sb|0ftDyw4WY+1dD>&sV%P76bfv$!u?nEN-0*?8OpT7?l-q-m}S@I7r|Czu2 z@9i}{|3}<|X=E=N9%*HbE5%o;gAX>RM`LL1c2N}+-%dNJjz31!W&!8}w55PSW%h^K z=wKgOS-nJk!8^2r&JKigQE6zJlcPX%Mk?dAl0mIis!)*zS48v8nuHl42cjGjF5bO| zZJ(&9QJapAyE_Vj9_i9IZB2vG{nxwt&+_@7)y}LZoF6|?xyMkiSaTWwS~L;YsHHo^_LFQNv65+s z!eIVrS_8HUSakqxaO3!p9InViqN-SZqsJRu%(0zn6ZP#b(?Kk+R?<^@lFEFT=hxy} zGp9Vh9zNBAE-6X5waA*8g1XHh$WGrgZob~~aKBDU85d-DXZkeuaSclIZDMTkK>2~& z#e5Gb$8rAWiSo_ksl;mby&raVf!9NKTFJ^qOEib8b23A@OJZIcKS<_ZmP~n|^HJjT zk)0=h6vqjNfI0T}sN9E|AEzVjI77yN2A-iGst$Q>H=4UFl5Pt4W^loP&xYo?a(;nk z48-!7j9$P*dn7<`@GygVJWIfI#@GOe%PpIDkyp$iBCwl0W&ypGe7orlA0_L%%KmjM zIfXK!nO%xx#t3IrnfU4zMcQZRz^fPa_X2aT;m5eb8|d&&(Nx+F^*i_KNDYtwSYG|- z`2njr?TC-<)$(Mwr|S`z&bS&oqOsKq*!KOGp9vOgUjcl_6ap^>8k=q`tzvL4S%Q9z zu$xaUGVngQr9sz@SdI}HOSe+9w#)>|80PFB+ks>ZtPAAkfpuu$p^x?HJW+^0dH9Id zg=h+f;6_zujmUmvHMGZ!%Lk}=l%lJqIyF@pmCU`X8@Tz(e{rqEf-I5G5DeBN*dPguz)>87G8@e-f*e$GMF!ggm4rkrV^ev)uv!=};9rq{}Hna4V z%s|S^L>!Nt?}o<;<}+-6IS!SAmj{m+-j}>`EDNf=?)s+UQS6YG`H|x&Q~XDB<6Asg zsT4bnaFSvc-D^-m;Ap5&bhTn0P5&+BQ+SZ0h?f^8K`^i*Q9v(Rus%ZYm8ZLx_v`GW z42pmHl0%jy*+ffF(}OpAYWx9_jrd&{I9`Q~9T`qG&OrB|TJ5*~2Wok%C8B}i2XeA} znkHZ%2yG)lpw}uF-0JWkstJ#D)lp|vYp_h5l0%?NhLHRY5D*IG^A{;U9jBzui0BW{ z5?^}T|M1ZeVJW<*=kMyu%tHn>yZIAz~17Byhlb7@`=*lgMGkF zWBGkD%4++~QxYhS_VXEQ#AvTMj|Lg4n=PVURteQdP@DO!i%)iXsZ*=sgcM}}qn{zr zu8BT7>im=eHM&FM3|Fe;W_S<$_?v$Wr2c<+0b<|QuxkdiVphPDQDn<`P|rju>=8Hw2; zp5(P(UDhmoIukZlKHsJ)@Pz`M-OjUqcqT8DPx3^aNa1QnMOc^P+R>IR_jo@cKV9D_ zN|gM-+UyJ;o&QNjJNZURitj>*Uh-bgv-zf~gd%08*v701wiJRzNhj-OK=f_TOZi8A zHX6htB$s5MnU;vvr5ZsoF|cY=nz2sBKs~n;ADB+RY0Bj;cno&ElHW5391=oSpwzL@ z8YdeS)Y%fVPy8|P5fg~M#7)rsfCv>rPz0Vn(NNt#1fvb3AnS7Gq>7(L)o8~SzVSnsek3qH#7Ci1|lJQiN?wPcDajiaX`@4^^y@TBRC}qbC zQ729$X<*zsluKF4P*@nB-T*=Eyo#)-SjS>(03wU;IwZ(spC?$bIuNd}KFY~zHnFJ= zpDHeGK&Cq)mvdekzPhk0nEteN>vUp2Gj`1fbHaCz zl#wH*iyq6EMwD?6=*tg?V)6w|5=XS%{jF9vsi8(}o6VUg2at`AvOFQjCO|IYad0+m z-#@bQyqAQ$jJ=w**L$@16QqR8g_?*jbZf=w7GnoQRKk-DnlQq_T-TjHmTF6Cb)QjU zyQ73x4>871wu%=+L=Y)>D;kkc*j}h@Po0b$TynuRQ~R7uDlz^&n;xH3wYMC}g=JVF z_CB-)XW80))l-v?G(3Zhq%mGSZOghJ5e)wSGzx%{S)kA~TZl+q7?ZhCwtuoM!Az?Z zP20Dp;QL=#GK;DjkS({_2aLpxvkIA%5()^4!Fu(3i(46-k#Q=xUkcQ~XO$>;l;la) zXGY|f*<^@|r;yUlP~K0)IrwA}sa270_YE?l$oK1qIOL|vVo5}~l<-emUzb&$F775p zK~R00eYvSjOWhhIOYM$=Jtp<;x{2;c-6`D!0Wj z=tIuSHCb}JFtzW;Lyd^=XnN(FBf-^#{_R}^zc9b_w(~wFAYDlXr6ptV$QER7=_nZ# z2_$k45+4V(S8kg~-}8MQaW_skQ-f9+&37;kMf6bG!3}9-Uh%gV9%ay^q=3n#-3`YBfhGpGXkXcvXmp zLKJ1<#!r%62d(?1svKFwdAJ@hhgXdANVS0ixlQAgPxIw(dz=c*$GD&~stdBG>doiP#0^0E1aa6Vz zFhK%y8qxmS!urO`VHfwO271IvM8l@oT0#kEnLKI~1pGqj0ydfKF@CzC@r{t;1iRZY zJkC#N)lBcA@|PBau6ZPrug0|xaR^2*z*HKOeF!K3Z|gQ!Pcb@fM5 z(k;`W`k6%v@ZVRNzUJ4voH#6_H!D3AZdh>H_Fz_ygZ#>QwBuL-*oo- zh8qbWk_r7P_cGBm#87gU16{nOi^1W!FTMx8A1u`h&`QZ#_<47Fq&i)C*ROa*u-N*l zZ&4*ZRCy*hw9#B9glquc&f~iUIjT5sYZ>mV2vKnNghO$vOhm{dJMXJ2<%;>xb>YR&4;3iHKJ;$oP&I;2 zUqnTIaJ**ju$v8{jJN-dD50HWg!7&-aiBW7bZG1*mCYe*u}HjE8l*vbRbx46I&OUU z3(-IVSaS622!c;k*(gD^GrsI?3psEd3H*zRCm#so2AX2)_T7KJ61?Byk)!(6sMw}R zzi##YKr3XCeyhbx1f*LcrwOTQAZXFSYOJ)p&%4s>W=(y3ddPz-dTK+Shx+g2|8GuU zb_trIZHG_D}^-Jn@a|y%0QthP&UfSyWf|2PC0wp%^NFM>chFEq_A22!0PVn zODb>V_x%lPR7+h(a7K2`u89ixAN8RBScQ>Zn5FHb-*CVImp7 zod$%BFXNwpN?3&&^<|Rv&9D6KZVR{?uIUvLuU-5C(|k!DAU^sfi~F|+K{zpV6Yv_1 zX1S5FJ|!#jL7&s8#y|QPj1Jx+*_j6a`VeQSkik@wW;cqG0YTXT_%@TCAXk6IA?fUY$qm@mVf+C`g z^iTCzefPC5j#p~=VZuD@18#)a=Vx6e#hr@w!4( zLct)f+#`TgWZeXT;-uBOM^VD&;k3y2^pTdc`nzUT0Y8f3mWwpjohtu$OtG+h&L+?i zUa!RvrYY2sY~G$HR%-H0G*@s3Wm`n)H}IlytMD7zQ2N?qaH|$j7A7s5PIjwnHc2*6 zB85DvlU|V}*|$7imcv#wpcKo|8#h)2js^>Dnb3bvOQs^KK%kA$$VYhz^!J4FLA}*L z)5;DDEp6{3mt*X7(?uhQ;9lWGTG>=)wk;~!~ z{A%ziENdXaYY>BHfT*ySL}1V8ykjD|M&l>I94P#-jLalmpuLcU+-{3jQiT|8WFI1t z(|LArz5|8~LE-t|4Rn^u!fL-OB>pn}%xXZp_)h_6==6s7rt;B27du%ILgwbQfaNR@ zxLKk1NS?MjnD&HA-*%3&?6mQ&nMLolMbm|1bxqA$Sp;vmX=y7C63_YjRF7L@33*x? zn(ph<4H-qn?|@|Z7|7_m_$O;vj)bzKTOS-4D&C^6L>-(at|R?Z zvt_IaeqsRuE?_kdlD){_^C+Bl$k$h4B8BthG{O6x1}Pj0hm0JfktB!@8W21dnK7AP z>HVrPm={VtHk4rBImTFHk@K6SJ5Zl5UDsQRm85Yk6RNP&e%B#qHPyxIxzKBn9kcx+l~+XOmHzopZw>0z@n;@OIQnn zBNB%MzCfewdJp<+5Z`ss zHrm3J#bLFJ(^2j6}-;#JSty(fLJIZ>E}9=~BjD<))aDM9xFw(T$c& zJu0Vz8!gB8vHZ2PRm>tZ|GgFwe=#qp*V&qa;n6cC z!H8G>xo=)Gp(ajsler}m8dzv1(~Ue`@JhGB)HrFdNCwQ%^7}Unp7V&z9Io*Q5k^QH z4XjX~pziNCU=|0_#8$<79aKjB?#p!Jfq5bd1tE>!O_Qytj(1VoAO4)MVZ9|mU)&FC zW|%80+AhoE zTiOw}hquZ0mvix4#weAxHdaH!tXVlV=#ESFnA0U1Av#?F#LP9@y#;)K=(qktk^#m& zX=vqFMHu@j!#KU%6Kw6!P7!ddD}|r`(<(uZ;6r*)Iz;7jKsO<19MnX5{ku%Kbc#;L zkV_`}>ZX1TB9Op#dykz|Q^Va9^eO$j?yn%vy|OFl=(EfV_eFXhO)^lecxg^Q$hk^p zZzsBJbn1N|sb^8|EW&4!Niz7U4;*$&;#3C1$-DIj{UW=Ng)Wl0y$d{5UdzbvZ~(>V z6lV9=D!@P%ig@RU4&X_cf2Xkda=U2%BIGNlUMY$?@scr9wf1H@5+Ts!T;8ULFs}7ddrK zlJtP3SuB$=+LS4Ztg}a>4ni;%^%a-%Q?w1uX6ma5X0nbWY8@tE3TDDpOkff;`8|e$CPU`UzQ1hprLBwPy>KHN_>=!CZB^2z-A3G& zQDr-Qut#jr+$V~MdYB-hC^9kHv}0;4f(X^!#NO?j21E`jINPK7oHdTa8Vw@SJkv88 znAspD1HA%h88i@>PUUk#91+#lgbgTs>)~Y_^cAjyLU``sB`+7U^Bd<#nlsDe2g&Ih zd$3kZpYkZG>xd_v)~kZZnhD^uBT+Q^aQHC{?)7Fk=5$sz3@6R)L&mu^eANvzMOR0rw zqdIX_=nAW6atKw0wRs8HG-U6JoGf>uBgCOy0~*Qye#z}eWUJ_7b|cB`Rt@U$7t5~k z9OgLTJhw)n_{{JVc~X6RMA?WqOt5W0NblJAxX(Z|IWZ3pzG1R6*>Wm7YL-yMwC4=8 zFQJAI16KRbjII;ls?d6H+QVDG${O43$sjav2K@U8q`?CbTTQ(7|BEh#qolrlL%JBY>#5mWPH|T81p zeTrJ>^Q?Tl(#S6dvL)%xkoA+Ji)KDijuNy5uH3Ayi9V}>3{YuP`YCdL1wnAYOfv9o z2LiQgDZTUt3#~Szk?Th`1u;nMEP|#-i%8Q8glkzBvYt|dAu`_8SGMu?Lx|${&IIUw z0jcp&dC)vG9>wtdQX(BciiWJ_wGd8w(R0{DWUZ^d_XRnr6};p$Ja4 zjLmU`Z*0)x0`5}LHhqyzq>XX$7=s8vMoc?S<{u4M}SG_Mtk!^EtK za3Ld6l?=;js~gLDdX~kjfvzlX|>Bfewkx(PZv|e%Mqg{g1@AR z+;xoW&utkuYA5&SqGWR3f2F#q$N3TCLix)Eg&9T#+uj24`a^nFv@~Ox$^ummdPD0b z!+z``hinS*FlC92ox@{2G%X|tF;Gy}BDB^$c+}402H*8humfx@KwhB2s3@DN!;qCx zt_LP{Yq~|}zLdbQFyIK4y7$-{{6O1L_BV35;$z*D7B>NthGKC<;31(wXo_8(l^p&3g3G*$=gtUrUE-q;9w8u91;wBpZAi^I>DNq{-C!UaF zxGTj^INMp-1oV;mXw^wN?gdB+`^_kck%8(BWxZdpri+2KrIM^xk>KmF>2s;ph&9F# zl5Cy$z?39jvrg-_Xq@jEAjpxs`Hv(w$Yxhg$@n|S4SzH+sMGUh-)`v*!i_7TlC{WhsLwD=9z zN;NS!b8!uTYv1AG#LkM$IOR0zMAs>|)L)CAlV#Jn=L(sg3!>0eJWMFQ>%^vmt3gv^ z4Tc_S$IZ=u&A~s<9%fv2aB{upPl^+1dvFZTq#m%ZmuOl-(rdHe+*T>a@rCS{fZp9Y zOTmJxbj4s%8eEq{C!d3M$j?=H2R>U;_WD3~2LOhrJs6qy{k`(GKk|E(a3@<6xeWAB zPr%jQmE&#rx$JLTx0PYsM1XEOZ{NL}o&~;ezeA#2kOSWKR!6Ay zQMvT(>eCjXx7>6v3vtzhA{UC?LxGplaiJ7(EAB`!EIf?3jT+Fdj)`)fY@SD$S-m%S zy)rAfpwXy}u!VaL7xxiv&Kz#p%<%Hk<)0ZVuC%h{8;oo?sRc!PBSVqXB7|?*=~U`` zcZ(qxf2+Q!Up~Hv{fGrojQjNI`u_K5RAORq({Uq$xY96s)Hw{YcwacDGI+B~`SwPZ zgp5@8`UIKdI28M{)lPR1ma=>xU}(*#ug4h8W)Z5+v#n!Mg2M(YhN|3w30eRrYzBu7mG=!OzB9H#LOUO-$+tl+1$;K2&i7edA*X$C@}~ow#VpCi z$&U;RWHwh>9d4BBlK}$iNYC;&K`5>5OfqC4Hm-Rq8XuXDKWcI{Vd;5-y@9E7=q#h4 zVnRUIfbjtG!Is%Qb~hW~OgfQg^ovA>qyytd>3bm`Y>?5M?Ye%vK9qJCTi~y;Xf;(y zS`;%wWBE*4YyiMYM9r`G1KN-lB@kuIT~~WBn+{6sq_Xh&qbsdRr^)f0aoax^^0U-%b}Rw< zn>wTZ8frBnYBm`&V_4mtyh?j8Ov1pTy|7huXgtoql>R@b_ELHx2GA$yiKq)E3>O+1{kzRB3o5Mn4-kDQltuF`Vq_z5qwV z)5MeV7igWSN4Yf4zbWvc?y|-Zm!cN^zZk&_<>baKzoOC-x}*x=mYbO}Tpyw-wVv_R^OAc$ytcsRylbYghC zZhw_eLElFNQj(Am>)DaXQZQ-RD@+snx<6WOwDvV+JK}1kY@jG8D5(F(4}mz6YMVWD zjSHl^h`)1{&ngTpl8^QWCzyC`_vT>4y`ahcq7<6TW0(w_#SQ$(}aLd(h#_vK<( zYCnawyB6N{(OKyXpP4cLb*^Xvq;yNWP4N})SyV& ztg*FHl#}vyhE`!En|Z$=UnE7irrykWI;VlZmPv3!i!0X8Lh3K7qsMG@3VdD8HZRM}r|IINKg}!Ok|DjK2O~h39?-dh_nP z|7X!NT$tflewy`?r@ZR8m{=jedQgqk7c0)E#j4COgnc-TJZ(liIfdT~Y$A;LMyZK^ zZe*8Z#uClUv+mjX-2sC~`Pr7Lu?8e)TuQZC;(c40OCBQSYnyX+;o#%@=6Al~l0pU5 z^c*M2OeNvgn;apgW>4qCKB~uz2Y=69C0Ln9Bl&(V{BK8w#+RT(+d_8OD)?+O)|>Lfo5}vxh1{5 zy}>W`A2VcTZ~xv{o*kjCxZY)=F%WiQJY<~r{2kG#2J(4DORqpW!Vho4y{ zl3yGaS7tWBa&-VN6a~TS75&9ROh}IN)(rNxsb&J}_>}qhJV+ad6fRq)QFFR>P9aL} z*t|J?@y%unFMJl-7uOus5mb1)A@0tntIHGSq)QqozsF_g)LaN z;bjR&^cE@IY!w+5RY)Zjz$Z`hjRndN10cdI^h-8MJ^}vGjfc)4G~nPS!Mp^TL(XF;sX{ zhH)=ef1+IUw-~US9osM~gM4C;R3p5Q)gK~hBS~jDK7c}%xsw!WAB;00#hdqj3?R)c ztwvQi(@+GMW7C!58Q{1H=^z#^dDai&8uPI>F{!OeA|i7%XL`fGtX~g2plE4n6BGA- z-!L&>ToDx@Vlli>P*4DH$abK8!)n}&B{kc!f0 zz}xZ`Xb>_P7h$Z+?J$_?UV7m?I8Vv!sI1FYzO7GTGg@(1j~H$BdsKd33B?l_VSrS0 z__fXuy2=jjrYEa%+J9k^zln3bACiFwaCh@ky9vlh`>R*`5(di5_0SZ~m=kr>ED971};>2z>NYzdU_-k6%`|M zbHT4)eRwRN{wL-42f^z=@Df$gk-$~0>YrcA3L!u?%Nu++nso}u#tr^SN~Q$K&L06^ z&WV#2t1b|>rD&TTFOK1FhK0>Q1ZsD_C9Y-g4#|$y045mV_EqOJ&`P+k9P5K>DFA5h z@Yy>RT0V-a0q-m=ot`FWD8(vIFeB?zVE3XCn&;2AN}_1Gi%~nCPML#+;&LVG6XBDO zbk#F&epVJCxFdzlOitW_5%u3WW?6`l1J0Z=!hr&G>K5hSE_f(50!A?kcrFG6#el@6 z&9he{IVdp)%i3k_t*( zspSda&nK&mtwQn})k(&q-r#!ia-Y07YB}ancNrj6u5fEmZ@sv03ZTq?z7FQ&?G^r` zps1wBTd&t^w^&Kbof+^A`h@7G2H<;O1q62w?k?Jn^6Bvte-mj0Vxp7mQm?PCTY{s_ zi~sqj{-Y>8_&!xffJ+D5ePXC4$9ezxy7ZfVzNq~Q+8O#z)qK0U40Jr1i(>~ zrM1v6<`p6Z1u|4=bT?`>$=g9dZyVDZIW#8_$SHwE+olD|7J<~-YBOvHX4%!>c zF0n%{>*j7uz7Eckra%7Rq8=>!X!6xWO(M>1MZgo(#z})j?9v@ZpH}_mKfmtt2OI)h zU03I8T=+6ds_gb=^mNr1X}usXt&`KT&3CFuscS3Pe`dkkam5u0Q^SeyH4=U(dzB%v z9Ewa@RX&`De>1LX{lH){L#az6x#_a0U(mZpO+0JjoTrb6O> zJxW&YiOQg3|MYloe*E__pq)q1%Qy%TM4?Z#_6sR7lI0`DR#7vSy%0`(`|Yk)p~8zK z8-9GnR@o3*0%pAff9&~8PTTlusJPmdsBl<2Xa0QEZFC)4I8GkZ=;;*?63lKB&LemD z_`^`-Sz)+yvH}Z$7w(c072IG+%g*OeU|XVrD+DB(%6H$mZ$qt2p?+VImcZKieOe3V z0VD&aotWEVc<+5VqBMjbDc-%j@z8lRcGY+R>;|Nnm{sJISL$`CpY4B=AjM()tucsv zX`68qlG-mOy&23iYSO8_cj7MLuMOla-7#fvd-ohp^;T_{)+_{s+_??x2_6E?>i%1v zy&wGAOX?PVHo|%FiG@PF77m3#AULYQq0?Wy%K~%Lj7%Y+gWFIV8uhZ-(^~guaacTN zSdI4{Ev2?>xb&G+#ErnBswkeHIbVzFcmmmsv5x{-Dt?5s5trw^Plo{8 z{#Q488wzMSc9LV&Mcmoju4cNB!OS#Xg|LZ7S&E<`qVz$^AMz8hZ^{9U1XVr~Cn3zK zilqKK+oI$~(M<JHMJOSA(qCGBZy$qooSl6QdG>4j1Y&avEUhn@^x(-7c|hY;4}6qP`L>{=f8z zuH-=NzZw}G{_hQ}|FmN7C*KznvRNeNF;G-n6$YczM5a#3**LEwxyRobs*^mMm~0Tw z^OL8y-kHL0bf*~>1;+j)S4CBd{;kJ!YPH0R^FC?kSztlcC?kmwST2MeOWXH6w5$e@ zu394O-rVnQOo{vm5?X;f1^eJeT+VxC#|jY=F+vq-70DUL6y%6Y=4LnEPH{X)G*mxz zL;I0VO_DO20(xa^Uk%usCS=lW$D3dWl3?JB1Xj_u6JVnRC+^L3PX_TG`vSyejLyT^ z5^~y_fT0-d)P76iFLgF{nN~f4?@xnDuO{TW_~LgSyYR_s|8$^fv!d)A9CVkFe6s)j zYuM?aqR;AVfILeQT2V5Kgf`}DVIOKlW+u@!sm#ShPsk_ZGyQsQiyx0hwSxsbX-Kx) zBRzn`$(|#n$=cFv>MynIFYu?`k*^&Pu=-@u{xeYmkaxf6VU7sYhsZyGE3tM1rM+qB zdV<1py&i|{dU7>9&?mmB%Tj?&V1*yZ2y)V@wHE~w04#$IgNkwj?Dnnh32uWUr@ejn z*DG#($t0vhgM+#OAD9STAfK$}5Bz}+Km~rF0Nv;W;9O*zqo%E90tOXm1(41!$F62q z>YtXnT!3^TxWcW<5*w!x21h>c>=fg$EWfCe3%-0WF}>{93ZBLx#dH_WcB+ zZZd%mLQp8$%&&(G+%8FRnVZm|z^Iw{AA^^xr4R~SXE}TykKB48kA`0oRRX#xsWji0 z;-uzY0iX0EFRYt_2<<~QwtqDEJ>p9sv7tSGVnTololgP!w3-Oh4Xn*!Wr8BQT@&~d z=X)8mA0WdO9W+*+h-k5YX$Pu2Yplar4GoKAscQEdx&y`xO!T4_EMWan$ZD5voF_G^ z7F;-#R@M_JC)>t0`YK;}A{^*KS;rZtKqx~iRn}EB+VpaP5cFIO{S2WJIN`TI{5znB za4rB)3tb~&^S_}Ne}MHDKgY&0uyl2GPfog!Hj1l8Ite_UT)D0es&3u<1jY<6qCATf z6xS=$9?^i4DY*Ea_tspuJ6TvPZdi!C2UgH-2*55m@dgH(I_JIa2{5 z`#jDy(a`a1*$A$Y$lsycKm)yO{OCYyE_@mwK@=ba+<_&@4rv!vY1TF1bfC55SFc1p zs;1yh17>c}SE};e7P7b8Jm@kun$P_Bh3Una3naBHRh&GQN5i*XJ}_&_r6I_Z7PZUJAx<{hzIE48kHYXg@@K%iwtLGj&MpGlM1pJSA_ zrx>uc^|Ykb2p*zqfd+1F;sP-zLA|{~#hNXuZ|HWQ`+q!=Kj3n?BMJbHj_()E{zu66H9f3dz!Pbd4B5Ne zMn3B)WZDQ)JZ5%Y46{3lHS>OJN~+{=9_m-d{&XPow}cr|Ob#B);lM^5O{ElDV!@s5 z0CVp8WJH64jSXK1S=Uy`xg4lw<_|6RHyj#A-rM>jiKbt`I7uY_pET>LWtPP{!Yegd zvj_~|*EIJ%m3@Awg~ZTLbz4hsdJ{$6(LwX5^*LCrZ``$)n%3r3k_A5|&Mh5=P4NU!s4}!G1dMJ>N z_!b5R=2_(<6o&6V7%bZS^hndfv$qGI4rG#Cr(~C>dh}wSIB_Ko-nv_)(JuUhT>RrZ z_Cmg1gNrY}?fP8D{AY#z*Qa*!3OO+FKJLA!Fr<=#oQGiFIzJEtO~!n6QXixp%2!uS zl*fb#sa+=)_%;;D)MJ&eCQI;ORJ8YOr+E)}r;G!n{F}!NbBRSamB=bAJla5Nf!p{b zQ2Teo%J<6X_e3og2}?8_>VDZ3EPCz8K}L&5aZLRbF$%9LQx#R{qDcWv0A&26sGI(I{e6;r9iZ~%%VlqiVA7VC=oz4cQL?X{(^#nbNX@KYo%*IB=$(pE& z5XqoYbr8dH?lvvyS-KR-Zz$2CAS@~$_Gr0@*XLZLTQczU2@5ox&NR9L48tGxJK}98 zNOjm1N5{T1rVZ{8OM<5C6e0o(c3*9jAI#xMhZ=}dPk@I=Yide_{DR=%jN(?rWw)Fy zD)*LM{N^40lu!aEd&_1*Ftwas0#q0lqa8)6>!pgFy*(j4D<;zYX$0(RsFS-UtL{w@ z#Yzpru*7g;w#y~^w)X9(zVzy9H1bqC6h=lyj~$7+i~l2oW92gd&e{yyYn_1B@m~=B z2Q+*OMKu{zhC}HcYWABJu^_le{97^oE_6=At!$b|4jk2rj4Hw#Z!To%B!?S?+{#9~PuY)t{HCS@-3kQgQyEy|kBUn#JsKB@ELj6H$r!D1 z7qwPFS1*tdB|De%l?pZ3xtL#bqao(=yziXj@z+<;@^^iO_e*5Drr`c{{s<{#6(-3X zYd}t-R_8J9Gx@TD{Y>rW%pAwEm0V+Wm;jPhbdc;YF9kj--DvF1yn_0c z4P~|*j|9DqaVK?;3K=~T2L~Jg9hG+Ne>f9;?YEUw%06P)nuP|*<`hddTo$e0%>>PA z{jI+|g@3WPXGY|_w_3CrqOHGLb|ri=;{W0|1t1UYopPQ0k`e`P`;hF?+}s?(&(x?{ z!UTcNzklg$kKn~~*yBiY9x}D0-Z~D|ZU61*{Pzd%{}0Pp_wh^6c@e5$Q$2(NUA8Lw z9ROf~S40#pq9B-HMX9u;|A8n5F)@~Ax6s2(Z7~>VeYf}9Qd8RF_Uzh4r$9~+#b|?E z7BGQKv0ZnHCye^SM(K-f*R+!kJZE1BXJm`Z`YZqzOj*Hj)1sqshb`t0oH>BiC79Q2 z9BqID**F1yA3_2GiY5}@YLRiliaLSdF|fT(*XD|_&dW`bl{82+5$TrJ5`zV(w~o@S zLl+*Ix5Jogu620C5Oh31f}4Yuc>68W4X#Mng5@ z5(Ow^bU_@YsvClr6m@}HQB(m)$%)yH^orK+YX@O7!chpMbcl4lF8c%}ShR{&C<3OJu*J1b)Kw0q+);d6yd zYMRrmj?)3X=O>j5-i;ci|31He7tcRX$-xw`yjd#ZZJZ)kPz>P|Hfl0+gNPXq98?5sP`*oT)-S%|7Wom*r)G{h_^Ymy z)Q4K`0}==CD^lCUiyB}{uX9hTa=lZ>8O1&BD^Z0b=oI!7O<1&49Rn42re(@Y;+Pr0 z&c=z1AZ%vae6?})rkWV%OOZO*lAvdPz$ZmVCHBMfpqd{q0;GFEiPo@Sdt35*^(hPM zi5LJ2VMK#UD|s4J0m6ZN2_moFK-l@5zI8x#JEr_=#!rsyi3M^~?(vNnhlKJ1@T<40 z5lk{o0{k3$b3**!Z-Jfzfq>wdIpRg25UWn*fGH*d0W#ap9dP}RRNYRwfUppCCz>R{ z-*I}s*M0bO5$kpi=&k_6)X>e&mnjbVUrP(bgW)L8uaIJt6sOf<%LBuGwmds4k#tQh ze{F@FzY=`0d8K6I?%W$E0S3zsh6MT=Et;>LUfbXa(mUERInAv{ImN$Y`_(4GlPHn= z2%cMt-Uv=CAjLgDs$0R(j!9Nl)~Xv>So>!>pOfb_4TBEzAhv%9eJeD5>pf$#BsmZ} z>_f;O;KBMqSL`oc_&*cyABC0;3Yo~j?$}z*;Di33HQ0Me;3L*s56XgC5qJ@s%6=0b z0$n{l#|ex%69DI469Sn4U$V0^Y%+gf($fy>aUsfE?s&D)=7TkJVY48=6`Q3)jGWD{ zL6pijvUt7sZ2SwEO2KT~m@gyDd!7SBXnUmG&0Z{0N-~L===ZOL*#nZd6cPdb^W!*tOCHP(uzoJop3%f?zZR<^39IBcXzlWd2`eF}%eRY%5cvM+ux<27-icA^N1{hxkK z2xt$^g)O*08`(06qe*1yL8y}Ck6a(pxMjk4h}VBA$x0PXyPg7+m(^LphCV-pr1Iu=_xu89pK=hRz;E0pz{6<7)0j*=Is19qc7*96iPrs za3c9Y5g$7y#rMxW*Rw0=+TJ3S5Re*a$#r!b`W}0osS0N@QOVggfwd?V(Czmtp@?kd zVm0WuWq-YAe}jSx`=$}-Y5LG^OX-nA)r$DP#Z})8k#P!qtoxgkXZ4Ph!SYDGJhjqj zjOYhsa?;PwX>x`&J*NR%SUk}W2HYxYZ9gv~ymo>8IWjW-<5Okm7sWK5cy7b+>=KvO zm3P%Sf42X>HIk;7FOwD;O@DJkyTW=e>rVj((*3%0PAo+WH8eDCo31Xn^=-{R0~O{v z7503vP~8nkFj|vlPCXm!b~dBk$=F z+0m#qiv_n#%6R&=dO;l2(KGOZS|{*UiUzD` z3td$2F+69pjT6wc6T;`V-s$X|QZ~|>ZH=G}{~)A8Hk8=g*sdm*fP79E845~cj^?{@ z9oSGvWJrv}3rm=R7$+JvWxpV>QHdR#1kA=H1FRY-;`}0m5j~RZ%TDUQe?RM!vY)1R z_gn5%8+t=7=U)J!V5+FX&OCl37m$4iQcfU*sxW)61W9}Rq9HMV59FvDlKr+WFjRsM z65$*whjs|D(}geK!jHBgZK-KQ;N-EClc@zPjIrqB8z=YJzFTf^8mT7`Z9N}1>luwCUr;W4TiE(GTs4+4Dx3ZFqo0#ePr8Y%@;}5JZv3A0D=rPTa z{?-gy$${hq#(tws5eA(LKs4M(?D_cFqVe>#l@&uCpx)74^MNrkGn?#IP*TTD#7ScC zT!T`7oEWn1ddIpdg~a8h9JlW}|5fdOrT+n$SrZ)FQKYe>rC-U)UvPX=^oyLyZ=l=N zcW7-Z5%KX@OSn9k*w{gc4QuO_Nu*7`i7V|tJR6|Ta^+A!3DR?lct7RG>F9GD+N1GH zP)u*m93*1&3yqgB2*%$u0#Ufsx;tdXRhq=I`+yNx-sM7HV58l3oK%n*9#BNS0+K(x ziq|ZV?~@ZfR2b`E_(}Z11yMk-)pzVTNd6a*2D?cW?EXk51yK+2QXo+6du~&&Q)Z;C z*M}j}Q+t5vv9tHH-a&UiS!eGV$Kd{$sm*kT6fS&(6;T=urGQV_tw0oyZ3de>9TXd~LwcD(&nT@-^ zmAc%b!#OSDLzM@oq@R&R__3e>`x!XNgH%s|1QtQ7cY%S26C_i_r2|nLO9kUJ5vXa| zaO4ALPN~x0N5It+B?zhvPA>4%&6*JayJ$DyVXn4V*vDO01+1e`Ds|7*L6K-1CLr4_ z2Xm(;zW+zpSI0%wH*ZS_0uq8EAtfau-JR0iEg`WBOLsRSjWkly-Q6G|A-TlTpmYjI z!+W@&8}<1;zW%izkaNzS@60tb*Hna6&O;W-*o|%(L=#){m}ki{8pT@VH}Y{F+ZLz= z7K1&!scyM?j#PRl*yRgw#V4~kAmRewyaG1miN*wo00m(#Q5;} z+*4Mj$rBS7H*aiEc;P=jt`ZyY;$i)qWvuFSA3aSzbv;CW%5nw?h(A1?;bRsIv${Ax zsM2gGrW!4S0YW|M*zom(u9MILmfKu z(tg>%T3)3Eo9m(Ec|=4F+5XM~q*XFY>Tn9b*Wr0Ma`V@>>SUXF<`n-(1zM=Zv@)b4 z!i)GZ*kATvhERWqZ2wCSiP6;l(v+6gdz+PR17Q1CZ(kog z&ots&Z$@Oa%4_WCo=41_3Ck}R#&(aF4_dFEu$X@R{5}3n%i4A%B>3;V(0()4yGX(W z+pXSz236ikpAQVC<;+Wr_$>#;>y(q7T`haUnzM+8q?tn_H176Fi-m|_c89#TJ!`JY z3}?>86zaI4@@+~{sM8HihN?WPbL!z8UxGPLsWqJsO|xIdr=G9hlQl5zpwh1MdUZJd z?z8hxyVo!4CPHG)%Oyf?JF0z=X>B?XJVxpU8I(Seqz;(HUh=!7!*`Lef`rXCnoL3) zS*7n!KR}VqHsd~?;MHtZUp>yN|^6pfTz z63y^hL{8>=XmpiAU!q&|y&0n2xa74PDURI>2bpGLEQ|0PA*d@|qfks4<3@oaFQI-SBGWsk*& zV~y{-*Qb*dy9vFaclLseBdN z3Oq1mBJ7C>WP$G`+28{Zs_cgadfGY>~bGE=uRBD3dY6NO@D5}gH=I*n3X zLH1(_u5*O4k!e~c9g_rQvRs<)EF)OkzG8lmojMM^0F z7pphM2AR0~^cPnLlgYWcQ8g1aSF3xda{>Rl8 z;4L(Y7bfFP#s72p^tK!FbR#ElPW^PXF?}x1sNMTUCaEsS~ zVX%l89U_Z&5Ja6RYh+y713$pJUG9cvt(PM;i7So13p!=1ieS~3Y8$6(Q|pL=nru4p zVW20(Nlr1T!!(W?*{gBa)C`Bm#mq+Mo`mnRQ}yNno0I}~oO4TMDBt)vC>zS!nM535 z=kY1Mdkpe~(#$%z6{dy>88oniT@9~74zQ!?gieq3sC4p+OCi~8YB;q92y@nk#&IZ( zn-{fBDc}*WRXP>_2PMVNweAVuZ zp>7=#-rjZRyqHR2SAyiuUAp?R26Fe=AAQHJc-6HVk-ed!1tw}P>MH6(WbnFX(k2k! zDc9O2sB(;MGiS4JZCuMrh%7;3(AHUj77CoBz!y{{xEVP0BQw3-{6Y&Z6EM7gj6iw5qyc@7d`PiQapSi_7^NAJ?4i)1DU z-|*ydLf{*S;$YlX&eHHZgLx{629T?7ed^k`%MV%g>ZSRx>c}{ixzb(p;TW;~2Q{5Z zYep35TH*AVr^(h9v6pfMk^^6Pk34e7c$24A7UMyyP80_UK8Ud%gL^u@h}jM^1l<#> zshM_eKGw}Sq!l#a{!050QL>iI3=pZ)lb z$7oH;4w*IEtu;#qOG%-=4|%^o-Q-dh6$d>#TwCc~>KtxwSDR3)yZXt4g^TNWz%R4I zD^2|5mjeBk{&-<;^ul=IsF}MTrGG_R7r{o)Nab}I<)z@FT$r1k8$@`DjEwB;?3}Q% zbtGy&0nOj8yM4S2hFkhWJ`(yQ?^E*} zo;^OMHbm(Y&m?dTWRhlFmtwo1eOz@&R3w@CWKjBbgco9hzDb4uQ^*Qm(xoLFlaIyj@d0^=RCl=&~9?j(-J*Z%opT9BYD;XBq!m}^N zc;lv!4?R*JvieMaE)Gx;c>8>cQLg`{JAUFFMWzG`Ck4@5s| zQva=x+XXn8^jwSLl= z+0QH^y*WHdkldEd9sx!GB|MXU#~K7qE>87BVs?0WE?e4_39{lCdssjwg`NObE(z3g z@{0CNT|vNlG0AeR4@c0?b$w|RJ{`fH3ASbv%c&NqeyQzSjM2>|uT%XRS{a;TbGng& z=rSkY(SF~gm0%qTIZh>Aqy8ED9ZEIcxHk59%)P+i4SGNg-m-yjnOp@X1E@_lmbBzL z97J2XD=o`X=|>9Eg08ge4t8@^(jyb??RPcgm)Bhv zQw`(l&Xr~sZQ+`k`;IkuIb2$0D5D!~4S5l%T%CB8o;v*l@BfIR4~#Z4CdMD2gdTiI z^&*DAs)V$_1zZ});^L9-;~h3Gx51JscR4PvsBuK|orZiKQJW(yWBJ z`SLRVzS_UQe(yeg;ypq&27F2m(SLs=sEa#XgNdGVetw=LhUt<12~$T{SQuF1`9R#I z_mj^=64J!wrTf&(n}n7+`ZSJ+6!^z=NAPUQiRK!rxh|8WSxD?``*~pr=SkO@W8ECv zi@x+H7s(THDSdP8gJK>2C1wIzNiUiqGCaBL>EJT^OjZLhnn@hu8@8$3cF`1UJwjS? z%Om01Ai`eueu~hS2E*d;169Y8;vrbieZmD zo?L2a};=9_z+xx|WtG!VFJx_vp%k$#T!rWf@M6 z^b{6Py)^QSF+-4Y?5Zvb4ESPDL`kU1j4PW(Q7bip6qIU8F9JC!^6+bf(tsPU$aZL& zcv*ARkro-)JQXE)_mXj%bsex->3M;%wAtU;)ZlwzN#Mpbb3JPFN5L7c zHdk*tSWSLGPv1R4E>7_=$^2{AXdfyiC8Y^t8PGFyb`7j{T6DK(b$55)96$S^PxG%^ zbO+(L$h-phG*>H*?$mdfe=Lz+QGpEtf!>9Lu$X?|+yukt6KFx>B1T7*>gwv+bhXqS zMuM2!(+yvo1^^dmh99NKheQ)#zoIQ*6&h}eVRn`(Q_a<$RLEg3B-Z;Feu&*ME?5{y zUmdI3nGM2bA4gJ#DADy52>vJ+UcUhL|@ptpj}vylXzE*!IzcvS|w++3gK zW52BOZT44WYs#a`;|_Dv%s#nXhf!$JB;~Vr;M%1RlnfaOnsU6NF!*vOzi73lpM(zlw zy)E|I+{aDCwSgv>uOwLLDt&fRtO1vF;6hE{sZqEHLJ>FA-NrEhrK4MdQH@ZjKZG{w z1F6p(2ehqApQU>DQ|)5_GTyGjna32eFzRGom=4>Qmo~;xEn^1M_XLP z*4jv*_FecFYQ7NkS>jl**iCl7nR6O;dxiUhtW}F&W6Mdm1fLhLCxRph18=^{h2{Ks z!_Q7pvG+?9k{4i{v1p(E1%fwQ?;#W(-w+%=yc68hF!*!Q@8kK(60t$l#^1mH7^WcP zSm1pY`(%`xnyzqU^n64xN!{b>a=ZLw%L=3l zbu}~&bdi`Q_q$OBLfu-d?W?u0Y)fM^ULXtUw#?0KNAK++GENjI_X#CKpw9u|`8n zskCM0DHG4(z|RZ*CvU^WlV7)bF{8pTW)4U0jU^Q9WWsCwTTK zsn72Kv{hD+Bu}MRxRAyA= zY`VS)2YaYX@aI(n09u4kphV1hCVQO$qoXTOT{w zz|NEf-uAoiL+cz}jVxSf+x=h4mwxqCS4IYLRL3EWJx3{tOG1)w#SO>KsS>RXx|G#$ z3SmuaK%SQLD@68me%XykUHZYOms8upc0@N0CEc?) zWt2zxrj~41{Hl~4ZgO{pAVF<%FD;aPCzC)}wcj3P7}r=WVL}-_0<2IiL@53W&!xMn z2P2K>z3kYEVx(T+^$N2F(LK-egJAg6V{kiXD{MEsc|g5= zN{aHRvq>hoAQ@3Dg;HXhWY>OaDtkxWuM1XCFxdLja$=QZ%0m6do-Em1Z{@$h?@~*D zuEAk_JRb*E4GAg5rR%6LmM(W5F?4qAyZI_17nsuATt5_@M(x-AO{B24mc!Q8?h!V& zuaF-wqfGtH)$!`7>EFP#{uWFx;SZ1Qmi5S^^Hshfbg~YkON} zOzopJ@$hFpKut1A+3FXBc%Yv_D&$=l2rWNxbN6H?)?E44cUXXDBb#_X3PvegHbmHJ zMP9AWX5*)iZM(%Pmjn1`xtZ`3C{)v!CCV>+4`;2%d`LoarFnbce4PLX5OB7#JzuHCtSYWE-~f_bB_$-!hnGI&Se8ZuZ}GYBUnKx(6W-6 ze8&%mP(dq8!+aD6EiKJ9shnbluLW(BC$E!mCw#Ew=)ROP&QwIQ=A`x{NtRPRbOnMz z6j!jw_J}e5Fko$}p)0C>moc_R*7`z8RWs*{b^e~!#VR5t3$pLxtn zqvs%-3?$MmI}1a!Zy6dw43{tN6PtOY$Jt1uUSow!%|K{J7afk9@Kf`ci)w8$E2yx@ ziUyJ&n}@xUQOd!-^xYW+wpq@30n@qc8ri~wP0snpGqjxclN_CNYdr+xHtWG^v~k`| zO!lMF4%QS?km}m$f+yDg2&4cE;_!jY)GT#9)oW|>K{)8%Dout`@gE@mFmBuH2tZTR zQL#Vp`~t3zh@Qc(0T zT-fjk^ms2FxIfi=Pu$pums(WT=AnHnb;@U_yfo7RH+bGCB9eKom(no*r3Y4(1LM|A zOfzrH4{4>t&R$aW%eYEKVOE|of2T&s=fLfX>_qrXFB(HUv17h(0{;7J)%7b;QmuvU zfX33uE!th1kv5Tr14Tgl22@`Q=0JO^T8COesi$nQ# zGvec^(ir2+#ev{ku_xpV^)elKPXNxaj4MbOqyhDY9EJ0asc@TVk)xomE%%N-92?&x z*)`M2q?DM=%BAHFJqYmoSV&Lsn6HkJXo8k{P@$04pd+2lr>A>Pcf|G`wVZoANH~}K{-q>H z6GDZaKY{&zTp{}nn)qX2-dx6OP@RpM^4MuUB*&CvHT}x$4GwB`%oSj!gzEhTtI<_v zUZainQJ86gJ&A2H;}NCNWZm+RUg1PMPHHP;clqhT{9puocbloj2ZT(-#Piq_dw-l} zt9nkwFH>kI#b){9)weJ9Cj@fUHf0^KFH9O7lwWm>-f(s2jBabuz|Bd3=p3xfkR!w# zM=_H9zZnIXIiyg>&3j>#V1IOo`#BaT(rmro&#Ku&Y=C_h5B&4>p zq^yt4;hHGT&P2)IWGi>5U{#yI-gQ7L^Q%SlaVWQ|VO}@`0>s}Z=@lesX!u-5M<JynG;x8#qbN8te>sP}#7Ff4{mc|UA*CH?a25z*; z<*;={p&s)uwhbH%a5d&%0u~MK+%km=#OUbgGPg;3XE!%;T3R&qYAZ|+*%_6?Zw8?e zr3~BK+l+RrGPBIK6a=+eHU;1-WC&WgToF(3kHzp$3 zzY%DT^#**^Q4_6zVb5I&UY&Q*&rrIg_LWaYe&SkfpHXyG6=U4Icue>vEIw!SCCI`- zH2&g>Qcydbh=gi|0K|L+Fm)(BYKybD5Q^j1LtcoB-!L_QXw{?mUhk{0!ov5vxljVd zApNgDqw9^LZkg1?+O$j|+EwoyxB0T7WHcl|K9lr{8=<5I_PS_DJu2XTE6=GxTAc4P z+N%|4o{OBk3bRYLi?Xh3tIFNvC-r%Q-t5>k_EeVQVUzaP_R&6gx{?F$=HytEk7}xV zX7T{WY^S>WORRvS{lUdMuQFtd&g~%G(AJv2RR&x5ujma3Ei9c3*gc=WvR$P21MwPN3|;Fa&+1IA3h3NBa~b>hR*e>%YY zLw5f2(T7&h8z^a5e17=&S4emW@8aU}E;w8)xdw6oRW3s@EX z&MX==gml+uFl#Uf0ta~orLysp=xHYW$#gr} zT|EY7vUaKhNu`$e^CI}{7I=Co{6rI@y?y_s;CF{4etSr3T8A>f4k-m5c9elBH##?gXc`c-UN?GMzeKBruvwNW4R-;O_Us|3@oJM17*0 zP*q}7lG}3Rl+%9NG4-L+%9^oSr1PL=8?*6M;K3EAl&QmHlaHOmJHx+Hk!n-6%c0lj ze0(8lBbSZhQ(&NJ5X+itk~ExGQvpuS4+K>Qs32q*V`Dh%pRRT8Hhp8pafJ#N(4XZS zTOU-id6j_Zp;(2x(ofN&O~m5c3WJ-cONi4_KE$HzHr&^9PSaFu0UjsOZcGp&yRL$e z@A~XXwko#9{UV}QGL7Itw^M-py?eXf@W+bj+LI+_(-qnEP8A|ZM_STG1vLfS++6MR z^B8h+UnQhuL?dU#NAN-KLqeELzdjplAQ)+I@Ss@YQvBbDb6)@vPveS&^YYQ1L-lw# zfAi@K|@km;3~<9hGxW8#+>Q=icJ??b*FmRpFWfzhc*RCn0fQBUWJ3d1RnQA; z|47NEx5ZMGT_#%%XG=c?NjDP%QzBO9-yta#78We7?gnlbSyb%}!y#inV-!-OrKOGe zvbYdh^oqSu57hdK_s#!+e;Wh*!=fMRx9a>K;JFllC-5D;7elZ4L!oPI3x-tmN6 z&CT}_{FlT2s)VN(M%|(KW!2TMrN9M=yI=eJ(NIuO-toFkRE3Ts>TX3K4f)>!+Z*z> zvduRueZ_w=7K^1=!1PSQ=no&t&DZ2qBr^->&DDz87f7Ogn(a)60-F()q_b?GN+v}k z7cZ}nAGRHBj4A3V`jCkPCOG`JCBIX2X&@)4K5@J{eRrRItnf?o|gyW&UKCCEG%OKtYgjMm>>BaQ0cU4STiQ#n9;&8Hs|Wi z)r)yBiLrjE$8SyaO7s4{P)oZT{7YQMb>SfJ(~V9H7{t8qfGN?LiM%lfM@ORi3ZzuB zsiBs04F+`J)K|}q1-D`wH+=Ir@q!BNl(({*SuPyDdK6qIk{>RSULF#D2KPuKv#%bBw zZ9EvL95Mv5($3$Z>KQv^u#yJHK?0C2x^M+=*_ZzQ&daky19S6`!DMz_O$A=L|&+KjHllcWGPmL;f(fx(NHFFX8!`5I#Q(v z!R>xQ2|~@s7y;CGxx8Or9?%slT>Z{XtDNQccaN-aF9-i~XD0$^6#KS#_#rTW4Tsq4 znLv?N0HFWmTwM5v{1*@XO6rk_xa|ca{nhO%DjyNy_yI#`+n~_c&|la21H04ZP(N}z zpgPUlAj88W+(JSVqr*#`Ii01A4P&Hj@I}EqVSY)0Z*dAyUw^+MCD~*$(7ezzBvATc zZNM+*kLUgOk0~hzG{prxj@yE7-%=D6 z6;sA&83-3}TXV3pPxz}AQj~$OqsqWQR}FD|d&^9X{B#k zYVz{(&Mqzn0JCAXaQ$+Y8yr*5VY@njAE>%D9=qE9zwh9h01gd*TI*`kB1t>@*9jae z3u>ztXA6nO2cSLu)L4~Eui1nb5lUz(Ty%aOH<&z<1JTxy+>)@6c?g)D$hbHYV%XG| z80Y_robO(=pf2`Ql}#o{)#LhXZBTH&sOZ(>r%!Zw??bek_gXH>AT#VAxjYC;EG_XE z_3yD3HMkBEtQWEU?OJse_ovESjo)~s^4+~1FTr#jmJBA_ z=xNtl5&_dOf`Hi>?NBJxUrPXJ1yxj3^wPI-N4xv;KaT2g-6cG2t2PRNCj$vwW3x~5 zQ3^LLSU=>-Fwqs#suc-lu$F+;r2wR~S^kV-5x=S$sLF72yz=Om0Q_Qxz<#%}TBqtF z)7|eBsP7j5JUj_WL{=7s{pL6d$3w!vTVyGuHskT>5a425n?7y1gWr4iuX6=ozrJ5oRFsbS z)_%Iu6cbRpeLz-+X%2uxmoYmA)(%hs6GC#+p7S<65evlw!56`r{*OQL?=8mf`^XY< z7@iJtBwvtnd#gW%Xwxy!`eo0OpgeqdOKcpO5~mW^-CQFN2+n`}_{{yf>#2#ypH*(Z zpEZu+_vgo_SMU=P6RTvhwzkYbhQsE3oQ9K|+i<1^^6mpND}h8aFeST83BCv*dfTNL zngI?&I!3Co7Z}D>W->^CqjPoTw#xI%A^D{M0AwyuD^O*ON9M@d{5S&HF?^mJ8rpUT zI&Y||v}pWXjf@NzSGLfkrKR7R8m|ljbEKAm2?`D{Ry&4odpufy7~eYy5cGk)Y72zI z+#Q@P?xb$q6)pu{UR#aUSgUEJCqgm=jA;0cY%rXNN8iZEFHlGbSV~Hur>D0HHwZ>4 zble+3U@;wND;&#Bj+@Z(islvki}@%q^BGzj6mb{k1^yi*4m|&mk`nN7`=b}r#!M+m zj!eq?AY$ixE@x-V{R0mk#(TkPt!@~$4*tx*-#wmAJs=c%^^>WlcV@7S68m=Up`rm9 z0Xz6@&FRkjC+oA>Xz=jx`#-g<5;yi;kG6wrAT!HVRZ;5=OOGDCpraA;mPzdSO9%yr zI0PrL5m~1H=Efz3Rd~%%j<~3?8@VV``y%8=j z7iZ57%PK2bSVqSu>{e|47CW4vYFsxruFU^BR>3Qr;UHF61py(UIedPwWN?nq@kVZH zhpy8?SY}W7r=qIIL%fHqH5T&^(M!d|#0;;_kB0-*u7dsw6M13q8z9hBodH6Uzkj;u zu9eD{S1jBQZo!zO>87Rr>5px@A%n3T*#uS>W{g9qR#EWjGKC9;@e;bED<)CEo#MSyCB zgl;JPXj=gt1!Y$kbC{mvRr_M%FRA;5NiP&i5&4rjFs)jz*e#nj#6U9Dud@-=baiwG zuh4-&f@z3rUP_jn5`a$)OwpK z`9~{#1jwu}r$@&|m0cs)|tB-My7MNE2n^Vq_49c5dk;;&um@x2>`ckNVERTEQS zUl!-~_pO0JREw8qcGgZOjFn#o-jv-#Hx^|0ucXu6J5eA9^pF6>GxwLednu(mB(s;5 zl?ejYoyldCV%F}2Zxt>q9CLG`m~eSznbGv8g^C1@>aCt!-d_@-Dk8wbd*FoWR0WyA&6P_Lma%7r zNASaX^vGvWyN0pI6~usCEB5=`{?kp@vCF`iv@W6_jB7wP z1DI3kQ~3es$Kj!(rfP5skCSj`F+M*2{^8+=)kjV^7SR9CNy13?R~j7ZR+G&4cZ)Rf zT>9zuW8Lt!CQ4q*$h@jjWdlT;Ynp4S)`>w!SNCAQ&gOyTv(SLiA_8hZ$3IIm@7}PW zkJnRu{o{q#f7Gz;QzJ@ANnyFLV*|dj5kQkUZw+$T?D3uG1EhLye?JSRE%x$Cx#*HcH3Izq#;(io4-c2w0>3Sz-RP@J(04TGZ zs+oS+U>Gc9lhy*i%xOJ;sa0bZthThY|Kmr&*`wd`3gm+@e563tliBI%i_49uXlM-A z^>uZp%iEskpW-sco7R@4E)o87!s)nZjAdFO3>cVUchcTKt}T(hJ~Sj`t*s>rSCD0f^NCteO!8-cYA6jpH+8eR`PferKF_`-KYo2|Kjzg z>!FwlR+~noCY(&0ni0Sr8yFa@Ua~$^R8k84QNe66*YE@*JpAcUW5p+Uw`_<*^21>| z28PyC?wdQ03y|ym8N_H~@5tELSj}n8R9fgOz#@u(Kr}6<%V^5}pGryi-SKE>Xr7uL z6l%sV{Ob@@>$Yv)*92b({W$%Now_*tCnr5$Q-EF)qOj;u>{*vJ-FKm(pM!CF9*tJf zG-ZRnO_dw1t^t7OS6a%j>UmBB`d9v<)alm`*1cyrj3*MD6Df0E_s7-k zo^O@Aj8RSX%P`$PyPpG6MJON_5C1I7G4~d}02dc`IP$d{eheW2ftDAeGu7|YXTW~( zK}c|ID2*e4idrsJ)DH=LKX{JPG_b;_BigQ>LRJf7DC>2vHBY24FCPd~7wS z=8ewWEKu-p@sx;+L;63e2GlX)GDD<~vlm{~O8nM71u{&_qZ}X4A;9bfRD}Q_5FG9d zjVfz)J?{AQI%JspIehUAoM|P{S3|i$i(hgOT}7=7mr~c zKiZK=NEsQifa$UCLc+SLC(*lFnlB=wQp162{Wi=6FNQGvi7Dy~)PHEKe-GrQ)w^cW zoTd3|?^BAjN?yQ>H8N_`;W*6+F;0(Ra!uh z8jM4g09OZaQ9wZ{{Os&pndJ_5R&KVCo8o*56HaE&tR+FK3DEaN#P3GT{R>j-Sm6Nx zGZE1;`&4iC6?f=k<>xO7?x zqaX5>bCb#nkhC2}9Mnp+jQO3ej>hDNht2a@tHCpT|JnvYT`c`hux_0cuh^Y8wOQpo z@BS`2`4K>=vl>9Z>Nb$RA^!Og*fVi;aolNM+8Pd+MrT*oB&@C3dOMpQBBzAphn}9E z4(GEj`@h8V&LjeU4xdjUk0UD_Dp9DpsVVK)04(vta4QcFSBCQ1SLf}6o)K-62pb^A zq$~9JPTXS)LLS=yy9i|N>e>-A-MtDgy>wuzaCmq)(ALB}GBDDA+?jFAixWE@|h&z!A&(n~YZ>t70GTwd##7Rv0?HPPg)uc5fSkd zXe_6!wziaqdVu^ly2J~T($Jt-T3X(M=BdpbH_MjZ)eS|Gx7uQrRqpJLgp znfb<|g5-X6rAW1thsk%znCi95b=oWA!TkW3S&xIqZT}*!-?W0y?L@zSb#V2;Os!Q! zcNn3F>CV_*0}xs#CSDJ`xh)C3HNpzWh(%j%Oh2%G1yq75PlgrCxOb$1%{$yuJYR;G z!=yD1R}Y&No*lOcqm&h{(v3(}!z5 zzuc)m-c>E4J@+&a8p%W=sWz7?()n4M$C;Nl<0ijNf@OUcb-y~ET%W0B!2SBhTi5O9 zV&GOON4qLI*!njgrvBbLP#ls?34N2gHQ>BPghNWi`}P4bk-$8nhC`V=;EFJc>JbjN z3czREIF!0O67U=PgWjaDLkNgH*U2pAEAGd|#jRGVM;28Ytzqae480>@HPe6Lpb&+m zMf>vQz$;I=QP(#V2=9+7lQD2dPwp7;@%wOS^&|U3Jm?Nf?_7RUN9h=-W`tj6>(drf z-F5-&a~lySUO$TLRwa@x9NU<)JJC&O)z7HUuvtE}0hGOeb{y|HrZ14y)HgO(MIK5D zlKK65ej$%8_AseveN~=`v>(`3>OG=*<-sx5sQN*8phtEB3icaSJnlCRS2ikJea#^!B*Vo?x z8KF+OjP5CsTjh}bk)TS>`$>gx~@&NDdaq`CC zUCE!bu|Y$VpeE5q;t`(!qIosY*Uyj7-Q#LFQ=4Pmk4V>EtJ(Zpw;w;LR;39#L2sT; z3Vh&SqnK0L`>3d>k@3kPJbO(z$UpZu&Q1AZ{Sc(yha9XMMI=TB z)C6xlWckg=2zoqy5jQ00MgeT#e2qpyL6N|&3K7(;vnJ!VU%!W5w&{fap{8;3<$&vn z?qgis<(iR9V{goF)A9(n+dU_DKit~_l4)frWMjpDsl8(x81oIVzBYqx(O+MH6>_=f~nUL6^;|2^WgT|t2 z`KOZn0pDKLZI@?nB=DZMA<|b#LgjMe>0-qgQos{pux6kMt`x-ioQ7$n%60JK(#}pp zNJz*!^4=dcz6xpgf!#tfv;~2p#o6DhoJ#emc)3N9cAL&7w4D#bI2PB|Xt(N?gGf9h zb5xLvw5n0b$YckGw5u(Gfq|}AbQJ3aY5A6Q2V&3S1;P4)-XI-x%V!q+ZgV$n2sw(! zm-TjLKv`#l)Io6AwmhLmbz(J8MG%;n*1CCUML2Zpq6%I;229&kQwcBaooNGSc*}iX z29hoJ>Nl+S+u&HR)p8+;N0)ZYbNv?yS0mykk4xkZm$$Y;f^n#yi;MMc4kDp9adUCm z_*>8c7oxbk&~FFP;}NIJ4~iD;dTcb@SAtqvNuZPS&3=Z#qnh(dcN8--gekyJl8LNd zff7Zf#G;GWo0dDw)SP#;9o_{pK;g3LA}tNkmoHzs&q*dlM1a}hBkzKP+Z{pt)#c^g zi|rz178^=B(3a-2hu^oifrd7~DR_X1*#oOKFLyl#hsNbVpM!LuLP7+3(Dcngj=9hY z2u#p)S30I$D2#wj80dX$YHl7pFiS2dE*iRn@A&(88bJ4U#4na#Fa>+qBpLx*B`hlW zDYx-F5K;}wB180{g!nt(SG(xQ#SMYfR8Fy|mBK(08(OhewWyFMoIQ;1PZ#Z%1TB_g z595{v0WKfOU}{)-?Sf@a{H+`Il9qO)M3={%f#vi1s6q!0!AH(les*js3v{CvgD{Fk!@Y%KeIz*NQ-0FF?zj?Hg6Dle# z5=TB-4Cz8DDcthn!|ajWP`AB$-dnf354)AOo zg!Tl@_VT62G$$9f^)-dR;eM39|sbjN6FCrZr&hh>( z8cL{U52{5j3V~u7!>fAs$y)T0LTEu{XT#yz&KR_3=;m(C~|ROzt_R!MMFcla4#O9x?vq7+I{*HT_;sB!Y(;xi|OM81(!bJ?d4`yhTa}q{s zYr_fd%QG+ps+Ly0!AoVhbNGMbh!xf;Ft2pD*j#)O1i)6&%~=5ypsbkxVOu0a0sK&FT81Ghnl!4PfGK3-keNi}LY1%P=tBJz#}e zPQNFdh$@fUX;-I6yB0&9|G+A_iciUJvE=<_m*~PHgvPlYRZ8 z-8n+VwahZ}6U!>|Neo~c4iN4YY^m^i{`*!)Zu5;KIV*&B-b;EL$3Cc5WdkL64COIc3-jLMkxRTa)bxCW7zHeUu<~floh0T0Y z7)>HaF6BK?huQnewZ_`kR?NgC=S+vya+Z_k*}>bBvHjg5h#hi2zzz$kYy9gAlG zMRf3Pb{6kBxfS_af|mF z(x%xK{v|~K3w`Yf=Yg9!WTxkSaQ_*f?RZrWQ23C%90?>TmPfoUI|tr7ZPAfO0qLrF zk8}O0GK1cDA%0j)gSu}atd84pTVvoO*O*2B;2=6W0V|`QE0FrlFo2F^if5`8s(D?U z*#!OPFnwSz+uFd8W@cXcJ0GJ2&nJ_aZs26WD`Lc`J3+Aqre*tWUD0Bp1|1F#z0CQ` zDQn)j+vNVJXJWnq}7zX&>x9;ZE8Q(q93+s*hRd}KTlfV|$ zHXwfv1Wg^)K<$VS7ssq~=2_F>sZj)(G=a*oT~tXf8C0Gko!h1Z@z%(!PghbeudEDK zejLKd&+CPrF-Yhd&uu->U81<>-J2r zxB?CyD&A|(jwFtr;FX?(k?m>ci{e^F_sQM0+TPH@BC4 zb4J}e{+fZg#D_yK0C$4RWfZl6Vq;o!^C@WsRns7Rz&hf396uQy8&%NN^|0aKm~&^@ zZMm?tZ#oAjVoz=?Z{4w?0L_s%2!GBiCa~sChF~?Hd`w^Ts#wMx3?wnjAX{pOn!Tf= z*pP3BQ8j(?NvtTqP|66_JeWZp>qt*mmq96_QgKnyz+p15U&*N5_kIGYkQ&jwEcD}Z z&tDpPX$ps=c2kM==6AgBl`I&=`;hx3+_*gdHQu8~kLq@6W+JIDeX3NCfjHhI#?n>_ z)wZJ2X0Z)!z;%z0Wm%mBi73iZjR z+t2MT{Q@K=dn!Ej#CdiO>K+R%LUn1%^@E*0pelG^WaQvvH+t(g^!Gov-d_}&nuZy| zszAL%Lm~iuPVBl)2GqciGLb#HA8=oz#y%0hH`AE>cHPG9XvY;L*64%;v(%-J0$y@R zTb$%TqJ*LO2>Z6yjq8W|?-W$4>@7L#Ia8qXN9h4j?ga2(KG^~H8yxn+c@qOyJ2Cm& zh>UuY9<|tIf!KhGbSq%B(9i98I&^9^>nIadqKykbUWL&%a0D^m_503c_B#an?TkOJ zgGY4Sff?`et;;ZQj+%s$Q#1_6o6KR={dI>&1`Ei*rLiM8vt|`! zlL_>>a_b}icx4(B6VA!QWAwf%f78umDA5mS$Hfg9|M}(~G08t>ahw1s6PiepZb!JI zH5R3w<|V3G0S@u0V;3qXCue%G3|A(m@2baj{aK@&VkTW7P-H+))z8XW+IkRJ4>Ba< zko^A~Ke>W}f_E)N-uZQrrnQZOPecSJP++}8N>>1c8_{3N7?oi)X49jWx|0kqU$Hjc z=1ET9?&?&2-J7PK{6jW#y)nvy0i&d6Nq@yfFKSdHbL>Da0)^Pw&` z;8IwabY5&0mM#L(7QnA(iux8@UtcFs>00|CVSFym6f;;K&Hy?@u6X4AF8*cU#tGrR z5@}n}Q_A1gz}-67J`JzZIb`gUnpb+l6KRZ@N5>9E#7UOE%LO zq<9fL&X1U~Nv*zEI0DEZENN3-RqVQ~i(kcJ*Uf`B?Bxv#o2-FWn@=v&09_tFJWhRf z@ft2jV}O&5$N~0`V}6$_yETymxi0S^3HtD1Y{8X(7XLrKQab;GGJ|S zKq_6sGG-vIY%^iTii1OBl|jSX7Nxl5=lRw@WE%j=+Y7BEdtcK0{vTam8C7Mwbu9=A zA|RlkfFQ8xEeHzICA9(R+H@mGcXvu}VACMo-64&1cXxL;d^hKu=ka;p@4WwH497i; z>$=ulbIm!I?vHw)an@XH_I@x<0`$^WB(j9hf2|!F{fV3`b_b6Dx1%3$sxV%yuIlj^ zYe>FuINb{pP~S(hN`l6@`Cj=nJEXA_QP#p}Vhd?VHx)CST%3+RGamihdn&fPD8& z7uEp+dr?eZ1p@+4jhQO*s;jNs#f6Ov%HY7irl=~D52O3Z@g#kT|1=9c?{NUx7++0U z?p9C;AjU`$3LyeyM*@IKDj7XDcRa5t&vw2Ic!dws#URUjdvwDiX)!Ohi!@uz0>so? z{(Jerb*~>{wplsQ#1R=ion7JboQo@}s9;9VWkWW39K-gRcj~v*;H0MDtPR0j7;h=C zO3%#PoT2de4<(iL9ue619Ubk~*!T{I&l%uFijJmD7k8IEA>owE2gzUbeAtb{Y^|&w zdQLLnJ=5=tZ(2WIOV-VmUz-#i9>~}juEhk>LEcuF&Oaz>n#ad0E8;0aJpcVaD5?L@ z}AgOo5`(G0nkpc34O|KK+>{?P8uWU1rqFzI z9DIPK0Y=CRR5Ek$NO-J!d8y8o3c4xq&Z(n*V1_4!&IEsN0R}zy1<;ac=49LuV=$-5-HJX3H4LtI{19X`LoUbT#(BU6}PBI?gJ^v!QaF}{bUe3v~#E; zHat9t>*yG(MMxw5`5d&)j)B?q5|vwY+7L*v1jH^h#`*qHyDC-xk~{;9nDfgb2VVG< zofZcr0FaMRWZ`n%S!HOSnP^3FGz^U0Jx(kpSd?NO)6nL5MV6=EnIgQ@S7-!G-MRut zu|cce@7BF5yT0Si^Y z2D<-N@rF%z0KE|~q5=@zzAbd0L9sCx?oZz%r*m!p2KZ z$5TeY2UW-h*+%`ZQi+3kBrf<924mp_3f{o)KF@#4qv}T}$VR&vMv8^Sg@w5b1mGqE z@NGuFYVkM0*N;%(fjm58-@mEsJ+l6TnW0EP&ux^rXt;4=q?2YJTmo=*;M+BV4UIS; z$_WW*uF<#0yVv8S>#p~}b*E#>6!B~t1Mi$_wUEaOpxRuIgWyY{cSm9wrt|e{mp!_y zBzyk>_mUFGE|GmXnfe{WK!v2M<~eo!hBEpg+lPs%$KL#soFgY$_I7zN{Y{Z&1z&SA z;tD9Dxv2%;H!4l^-OCGm=inKXUqy>qyY@xaW&CTG*e};*-_d73Z-?tIWLDyQ{gREE zDDpz?O9Dg)4Xc)&I8H5~eUoWYZ@d~6&m-$QWjpDu5yOsZzJ{^uBDZbLY_#g-fLm5- zCb~_pxO>ozm}fS=*QhR#HRs1Isd1-9hoFESxs}4*FY#VT0K!y~B3c9l5m}1it9*q& z${{NBv0@U=B~c-m9QTimVJV|R*B{d(b8$rort9W85ohIoO1m5xr)b#M**X1Wy<#O= zd(?T<%be-tDhc;=OyF@rgPNGUWgw*Ui>LuN1U6VddcVm%W-a3O^iMPR zH(qX3Cw~xt11#%;k7kP`_2S5nqi3bLBB*)H=*Cy{ZI7n%a&~nd*mqk|naPj+T-OS3 zaV!6P=q{9p&xr$26b_V&>bC-Y08ob3pq=3oT>i@GU+(~E;o9+6JG-h$7c~c zKKY9r{w zqS=oGOdWbPSJSayx42*uFG-XTGu#zezqCXdaO1^EW)zsNYxzek3z(giHeDtiy)gI8 zL^a#0Nyjczxpe|R`$)TTTManjzPXHTu}QS<(|*vD@7G|*p|CzHcUPwsBD`mQ47bR0 zAd;_uXEe#S#TN}J?D#~YcyA^I*qc0*f99ih7=HVBYK1l9xwG(g%WdPW z{Q;_F=yF$E$gtMpWb53G>a;v3{v_{wA@7)RDXi$cRCYLGYjT3f0lek-&HM>$b>@=} z;Mk_nI$Mb|GnRDJf7!`u@M8RZqj!f#(NqSa!@sLO{Ew<(Z^-% z$BSfz`t6aLwL7NW%BaGjjYg^BbiyHE_wcCl>cm*iYkO6U8G@-8X8B(zHT1@zy+5c0 z)GQ{wzmv6R2KX4C5|$lS)LcdVR!~MeCPE*+b9}txZF@)yj7{T^oSdDd)YO9g{7?wl z>|Ov1n%}9}9SY32w7>1>>EH)ilb-&!goF#r%bsy2HJx6Hso_FyC zI#1Z&BSFb_a{)BM3smRiBwIiO`2k=~pA$16+Su4c9U4`A|MvsPbBkLPN`R3!n>#-q zt*;<~B!af0_p>bA&@)r~`~HT3adRsAluGmw^l=8;t<&#nYy*V%o()JG<((r2qkm-qBzy%DeZ-E3yTm3wmKDYU_E=g28zbsEzMbAX91Ps(7vKDLa(hus zEoZpvU;DD4+MK!8lPEnub7Rilvfpqix3*fE{6*Y}nl12@>3t4< zU7cZB2x{xujgT7>9c?m#6#5L&CEME|w%X<|d<9b-Irj#`jTwn?sYqN*z;iq|_Srth zMh?9Qh>jz%k#P6Y>n49`=!sEz-EqB3{z!>>y8FX!{w%S{qwfquFSdbPm?cI3IUGa{ zV|{P7j@so8L=^6#Xc(9Q+}NPnDTSPcX_W_;>_p)lj*QI zl+8^a^upG-gr?3Uwm?33qW$(e_FW93Yi*-fJ8^peAoy`iYva$HVK-kwViUg33C6Cs+)>04AN`O! zCkdthnujl&@P7DeQ%jr76X(A-rRu1_rlwKghCFHydFz>v#P}&xsq{j`?qOh{SZkAy znvuw6KLpsOg#EMu*?%+zFUDJz?myQ9m>-dg;w~?<5~oVyOA`})#+U~-Cp~_O(Fpje zl%A(}3okBWy|(IQ@(cdaywVwtg^zFO;xevk+tfDtimmqT)8!GL+)nL(x0Hd zU~SkKn|tipQ0(JjgIT6W*~T$bPS8*_I(L3lOcBWs7Baz~Y~}ef1Lsero>^dve7#^a zRHkE06&d8260mk~G@cv*Y+vZ*gO<~^5DG7Q`ME;$G+kslKOpC#@BAuGa%-_|6J___ zbtmDeldSGpLqiO_Q)kH0SCS9)m#yTB7YG8##RDU9<8xy*@K>}O1?Z0RHxa6iBAAw`l~hB1NczH=>z8@A`VD42R(jNp(c zAT4>ehdK}@+x=06bg_cyB^4s=d7QvdPcPGmYq(z-xcQ7i3NG`__OAT3K{qYd*l(K7 zOais{jd!M91NsgiNIr&F_4q?d6x zvi3>HzmN2liW93NI6{AW!~3~ zQV#~mG9p@qJU~L%0RHF!ocy4Y5=OCKM4uLut+6$1HBqzE@`NyNW?=wn0#6dNsd3hHfhzZ}h1`HKt2gi+$`WePTshGDD`W!dreSajMR%kqac>6Wc`}R(e|j`HJw!j*51Rv8 zRkxDPEUYX=qPtRE$0?ffWJ*T`lbyLfHlzu}TJq?+_w6Q%>34zs@1*3;pV&r|bOy{O zi85mfu0@F`WSXf(^JbX)fFR0YDNJ&aEqy2Y+O#Zr9ri&7$qT|Gzz>e%if8TevRXYjkcne^RR2^tzck&a^Y~x1(uH&; z=}lPZHq)%ri9`sPTBP>E7z$(Jd>7AK!`!wdmh_WR(!m)->Z<;~jz!G}OY;SWR?m$< z*=3`RJYh85ALAK=T}o31bfu&HYN5(G*{&|%Y}HZN!X?I1 zpm(T<3@qjt_C74T%W=ZDgEM@}N;GzlffUo=R4X}gjdG!c8CNV& zxss=tqLnMf)N{<%;E*4>u44AJZ;#GLvATHrAqDlUjh8%o9_tIsE5kQuWZ@I0D&j)u(}St*J^*vsbyYVfJZxD_=hi683j ztV2HyY7PoFE2l;vKj_ApD0TdNbacF$@+>pntcFJ2=*wwC*9?cdtVvOB5jx|K}ths8IBB#-ydBc*pNI z9GLy_pQK`uSbbgeAu#19^v{*xyaYXr?4ckJz~8iK^tR?q`S07u@)X5vz&EVERz+xD zlzGq@*7%dh%hy+Xy-(FII9Sj{jfmw97YPXw;8|)(CKEbX2hw@;lboN0vA+W4o% zMnr(Rk986O6K&#S9V?W-ZeSkjpAx5zpmZ)= z(#l`TDB>8_V|L{EC#|tGI^n_-`!!TyB&-R?b=S+qdg63!;mPJjBK$M7N7u)NL=Yl#ivGbruM3dQW0esL zzXW2chdpjFu(_N;#t{NjQ`nV$F`NZ{pyUz1NQre61-K+s#Cq@!)l~nLL1efX>taN> zH1z5Ojall5Mzu9PO-h`86$y$f3Qd{)x@<9SFF+x_gU569Ju+?NN!z7XyKft5#@cR< zz&l8amZ$VnR%`g=5i@Hxyt=@N0#E9#arB8H!Om^n%V}<^j8Do04r;F;C5-85FmR2z zT76(lk~SoUT;cMPmvD7gSIWVNYxg5J{<3ud+vj}>!kY@Qt7%O!KTuZ5Ot*h=Ok57u zYhzwJNA5Q=cZqC}tyS$bpCQx7-{#GyuS~EEpUsjoP@bXlu)cNeENc)kP=68@(F-eJ z29EfhEuuJ0w|=?OYQ`Yopmd9k#W!QEN1@Rzjp#aNvg1%JcVN1?y z&QotdkjWGug*M$^n+!1h|Fz_y0&Jreg|azMeHs}ZJY7HTZviGSAnm1X6mSMGM0vHI zU`s^gxWmBmEhd-RIuJ+Ec5lYNzu^Lrv&Pn!Sk7`V<4<*R9~RI6`rv4GeGFjHaVWq) zzLJgXgR0Y?^8y>WUMp2%Ja}sbL*97qQ^}2vkK^$+@!G9~2{9z*3?JS`K=9N9g@|1V z@doFo{;qiL^KiFkxef14XQ!YdZZcB$a#!39zZt2~Qov{yT~ysJ^9B|L9dxiV~fefoZyC;_irqtP}Pq-}wWPdXxfBQ~${G(wnZM^}9mR!QCU2 zFcwyXvg+c%En*kxcPs164QhVhLs6yQ?OD#A+*M3!Ca{>*fkRag1~bZlkU{EE6e7OXuc!|EWuwNl{? zlb8pqMe8gFdsmQQg^Nxfvq235NyFf8%%RtBiD3uAh$}ziv?Z+uNR}rqE4AY9 zd749-3#S*!8N&G?*ksUynLDniO3db?Nmh+PSh}J(!Rnp)GwRGtj9PXzm;eB^+;!#Q z?6<-ir&ajm>5=EuqS^7d-K5l%e)4*?Amq{VvT-SWPrw&Vsw*5fQy|LZ5)^u5Q2&Tr=P~M z53r{&J!{z=2U-0;L8=y>hSWm9eH&fjJnYSkUtJFj^N}y&HUC9t#DWFj_c1FiL zbp??NIfDFy`Y2vQ7E#%K_J2!EJD-t2nqF_ z1oaw`%~Y-_|9FVXqNOe%AnF>(60PU z^NhlLM6~QC)OwcsnrFUvkpVhNGAk5Pj7mc~tY58Ke;tA(u23a5(ID}6ntD4|Rs2I= zWau$)DoPru?+@&vSwCuCn{)d|9{v)Z0vo-9+c*JG@FXl;2a0l96-(tmLb90)cC7hE z*!cyqc;ikC5|wblSCaRAGRfivZ)Y-C>?|7Jo!-@z4<>bK4X2I4q#UyO1y=Er3h4EV zPhcW_+irbMc{xV4L`%7Bfo<4X>;SQzJ<=ml(SM``GCgPkd zbJ}8vE_2VqfhKct@47@5rdL`y>UVQB>-=WJRW&e;)WX5&oEnSNZSOvV5CdCLJDYgW zs;-!SC&wh>t~jrDDVq?>$Nv7%Wm^D}3w|kNbMnPN>DNwsj!INVOWm$8J|$Y|_oV(v z?btSDF0QybkoveCf5mFq%nvZ080hkM=*>*h+3r{+HMy-33ZJsFcfj~C)sgwtlp$7O zP=rc%v-M$E`16Z8O)fpQLbf3W;?X9FJ_fkLr6My-@;e$sx66`q!BB zgJ=dWEiM>LNNurodp`R#v)lUwhq5SAWZZ0-(FHdaQui>ZdHsQhuKA#s;-7uWpY|t$ zrtBDUriVZ|}HthKL8%lKPSz|J7c;e98rEdCS zFPgdoBqec%;cc|{=NE%vf89Hlw@5j;xtfeIX5GD?!@cnRE9V>n_KqDGf`_CU?(ZA} z-?Gb7jJCG^UII+gJRIr2`=eQL$b2yI7?^;tySPfDCSc@<1;l#*OM4Q6H8+?e|LWD; ziBYnOa(wv$$QyNM$T!1Kiu|^6&irnmd>+J^#w9=TB{nl*vJlivafbxmMz1-9iNkSH z*zR*!2HOSvwOO^5I1V})gZ2HmuJp58Qjt%qrxrjL%D-n7;W*%I!GbRwoZn}uJ+F`+ zp}6^SFnpMu6)RkT*W_tEb$En4-D)39`&x>Gr7Y|D7t@gN@yjG>5r*CgMS+s!SHAV{ zg$x`xrKwR%p;fCVQbcIoc`CSfEa`#44lM3n<>NBc7ZxxQ=NAy{#m2al)x$B{A0P%M zsy>gD77Pd^pCZQcV%A*o<7Z6!+VAF<1iSoMJ!vlHosM&Ge|`b|bcI$qap_f^z7uP? z*O!urHZHQ@B|~d>0$>XeKgR9Ol=inTC7TD1%lu0^Yd0SkFLkhue|m-w<<)FU9%c<~z+6{Lx5zQdV#W4_!CZIBI?UnGoy((v6U?`FdE>*bi6PT>w zWtj5uV{z<@JL;VUCwM6lI7i#OpsXzbGlp|R z`#6g;Vu!wY3j8!7`b>FXVey?W=@G1iV72^f;j4GiX`^4zx*?LMQL?h)!>eAR4MFVw=W7JQ*%5w>IvbKbDQJwC92f8MLQGk4RPNRIuEs=^)Q|HW57KDpfMf(bqEUx=nYX6k0PvQGR?lQ6*=MYJ4F7%k zBoQ-%8Xur65N+_17Ea&({E7&N2+RF^vwD6|2OsZi5j8EXXAB}o&&jN}w`^Q5rg$cr zf|@<~*sxbTSVXn_`g*y$u)Y~s6=crk?QTYs`+$@GjU5+GUPx-5o|uj2Cq6-3xey+r z5Y1tV7<FAE|BVCMjrp)9 z0f7~Dkx$sisr*P39kq-(*A3AZMWhn-jGw@l&?2F4r_LICm)a5E1iCL4>o7>Wi>T`g zTIE*5{49=#?pG`##-Oq?^rQ$WAvYa<(5?pJjP6r_BM)pZzq`c{K-3+ImFGcK6 z-&tCgcK|V$HiLpm-ez|hX(-Fe(SgcUg6N3)g)DX# zbxb(2yr(}*4WechR@I%IAxhlM=Zp;b84=xuni2mJe{_&yMqJW@HVW3T^vh;~7na)r zJ7LSTwut?1$4-ly_XJA0|3zH-b_UMAnTdQ&Xc2$FwR*=`ItN;}xS|P3YBS&xR7}%5jKOib?hC|jf`{u} zz82fij?#6eMrYRk!o*qO*V99w$r~48bhC(?6HCiB`#0EuP9LPyv@7ad zN=GkR%vZlySfqjqN_OIllLfK;2ngJci36k3)aK^g2&gop><(EE2S>=hF};&))p?wr zY2iT+kSW;4ugS|STovJ56(u6UnGPZEqgKowQwSg&DVHr_GZ?weO zbv--e@0RJGceMjd@E6+71;WtQ?Ro)-;_=cx(*G3zV6hAOD_#5nK^G~5)=S3A+egTv7 zu%YC~%`GiqaJWxD_w{p<%y?n90#eH_bXq?tA>s~5^*#iXVeAM8dLjL=X@_5T} zKIyYZ1gpufR`d6CQ&NYLbKyR!HlNbA&j=UkeJbhj?JWkFswKKToF7{U!Gb$I{OHh3hE$B z?iU;~6wBdeu9N10=_9jAZBayNOMp@BxII8E8U4>D>#f#^^10HdBNz0u(%TY9cqAU^&1NC0}RdQ~uy~dVA zhplyy(q*nOQr>^idZqEgAj;do!rX}saAjJ4S#mxeR}MPQ$h<-S#1ZbMoo{;=R;asLC*7cr3c>!t(*J!M-Qkc%2(`|j ztjK4QhZu@U3*#n@pN3ji`R=(j2c{+})w;Je)+o;~Qm|{3ivj$L&E;T#5AEhKvKsm8 z_PJOh0uru?N>k!F=k>Q7cbVKxUyi6HGEmb&7r+dlWz{A*tqO^OfnmX)NwwCdEx&Ts zXLC4XkyFIi6>ysu+w3aMICa0T0+cCO{QgI{BATOrXq$MK2M+Si`6uTEIf|JB4H`!T zyvu?xAPfB2LfgH#9_H0Ze7Ba?ajPDgGR_nRa&RbKFO|l+{LMX$Pn*;!FfQ5xN-UcOyL#ectCR@$s+XAfQC^REGB7lPcyaK+wg=d?$Qh0Y z&R0plCBEZ@>GoxbGlz+C$GE&~lKq{~ol%)?u?vo~VCUN`Q2Cu8I%N6&tswzT26ZbZ5)jMD3lCgKhF#^q=AHtIZn}*H&~{pz!n#nekDu*WoqG;OWTk zA@cM61}v&Lz=gT3I|yeV{}P#R!zf-%u)g7Zu`3j7IAl?tBW}JyJ4UA!dh@^=5~pC$e6D`JgS^^VHZ?4Lr|(T3E~j>dij_<{|LNHr&=T2 z83%BUO}iFNBAa=CxW9iEGAehtfE!L1UBeFJL!Nn@j@(_`YLLtARdPW=u*f>wLjZ@n zR%%H#hC?5Jx-}4`dblV=>|Zoh;qa@++SVT6qy%U!9`vUx9bp#{d;SM$ z1Q@#u{+|FbM7U#9@RbA0rv6pn8!9kO>rk8M2RB5n#Ar@sK2AD(ZXzIfBvYHJ=Ih^e zY(XDr^{zfjo@AH$KFYK&(V<2pK~1zyM@R8v4rsJ>vL;Xeeg(YvYy>JZ@vhL=u~IUzdw%;xHj|}Hd0kXE z8@t4FGE{mrPwHL9 zRK@864*)*}HWP@_0x`mhSNHS7t&bVO?t2+4gNX_PunuJkgH#R|al%~-$m?HGAfYW! zUu20=-rw(zD61puR4lcnqK5@tNo`BWu7E`hc%$cHIUL=UR3ZacvTPxe9WLCmYrYM?=$;Kl+Wr{M>m05r;swNbQepHO~FD+ zV*B-RCI}+1>b0Q9I>xh^t%t2!SuaDi{pQrnBdw`qXIhx_!?}OI`zwhxVa6h2|E_qC z?vnTCWV&J>;M`$k+Z&A3@vv{*A2#5x`NJm?gxbGZUVV2?$BUedXcpOQ`4>;fj!@4N z9v=_J)43q+1v2YFtmObes~iL`0nY59?*?`jXW@z!PSrDhG}P2#uZm`J0H))AoY?>T z@C}Ltn9ByTwS_JQ`Nt??QMwUPD*LjtS*#9zdhrD&ec%<@Vk5)=qL4^}_(QMn4xR?S zVaLVUVEQNjaZ!$XU<&`PsY`Q%YY(c~62MezbDZjzpuG zR9~+oQeJ9A(-{ep-n+^2LK=Dv%>ag!kg%JpF`Nw+I$0eyI>`KX4$4J%MCIBgN7#y@ z#wzv!cuG!23lvqpE-Qj7>Zpq24s^CZ-gS{rKb?C`wyk6S$=$2(Crf~zYrO267rJoR z#`pX95F!~eVd3(yH(OtH2WbZloT$2}%|EdW;!V%Jhm{=6aMPg^Cy3}SeN@qCf+IH- zns6bIrR%6&=+I8$($82!4<8p? zqTv@5NX{yfj6OI;P8}2;zZLTf3K9T9(6Fhi!3h*yKv({h*Z~DFfJEP}guhQrM*Ksi zxi}-nKWea86>++$Y*?)IMiUT2e})0u|Ild+(`1Z2n2BeVhL~KH8IY#dA2g$3uVB4? z?FZNoM`Wh9-rCN%pGD+!&6}3}AqVtv5njpn=iMg%y5vSFO6ywf7NAMD5`uqenNk$+ zn!a&xj{vVrpQ&Uxbx(UwoSOUl{WRyiVb}`s@0e8coY=E5qsd7~8)^Y1GCRbkMpp@wQWqH$rH`}1y( zGS~D>3g7?%v#L88mwwRr8f_;`PejMM5z>8d8DYWu0e(xZENxFFZDclV-vu);^APA0 z!c|npe8%6`htF?YG5DRR4FC0`xhF}(tkZ_%-qEXyxRsZ6VJj=dFelcq=y@6SP2M<7 zUJDa*hwqlK9aFb2pOcaL6cN>8Np65%&t0FeP`wf(O3I+&!H0NX?;LG+*cR>3_Ht!) zmF$O!V7}5Xe6&qOiGCu^wD`U^>{Pqa{|#;eL-YV_J75aYIR0X<`q~6qIH~16zU%YnR@0(< zcBZ$tI5V2D-2e5E`~Z@(zAVwbZ#6iIc*xe?Hfz~;@l9^=8PbWf+DW}89kilf868){ zF^}92_y*`<{-a{)<9Gm?_SgK5C-f+0(o_U#@q3CkGyYYHcUkX`gkc6+>g?o^HAOpz zMiB7sM=}wwVIyo=*7q=Sxq#lMzPNI3;cu_i@q&!^6U1nBH-oyvOIh^M8A(%q5$B-I zOdRqufI+SM$aBPa z(uFq*uNAmOVXI%(En0%hB3~8H-fZT7HIug|znoYyZTyjG@!_ZmDXh_0Qx9UUn;nmQ zB!i>c|JrN{i~NA#Mb#=?`Jjuo@F%^04qi|LicE%zJCGzlGB!ra$cXKlCOfKY#p~OB z8}#Jxp6N)(8XBn(YH4Yit#n{Hm1-aW8qtAb?RHDN&|tB@iyg}@(u2UcGfEvJbJ%}= z-sz*7%b`GE?FOk)#(K3mz7t@T@)EM%nt3CHK`cl%dyImCn&HpGtg49Sd;~@GKKAIw1I9`}h!prWZbdIk3NWY@mp(KwGR{9RKe4X@8dLaA}UA>4|t-V8qb}L z(-K-+iW?u%vyRc=D-&^PYq@M(YG;yGrtJWU!~VvAq(X=1M2+fA5LLIhBI{cFwh-WO zPfo0WHa2#@GY=cz z9|T-ky<)1Lby+Ly0h4W7f1VnQvIo}?1U{rzm*y$7C+JLPDr6+4=1zMBWN zQ2m)z^a5~9g|1)Ve{L{I-+nAk)7HJITU=axbP=PUlrBQIEO+${@-!e=?mu_F(Nt^! z7C6^>UAhaLQx8^XhS#7q383D$Wqu6 z!QW^2w;z-gpp)X%jiSeZZdJ5KyY|=v0Q2Bk>h0XZgOvIl1aSG-OJSB*z$s9P?)ul!j^+M80) z+{UVxJTY4c!2+HZ%u7dHf+_k@c$?d5sU@h%8i|r>SRXlH1)Nb5T7R0)$5#0m(Ab8e z>^T)2)}UJ@TCf2W@BlWd*(5=Ibt^Zz$!9g!WprS(!&6|z#tY5S<-IVTQlPn14VW@DKV8^7@`)pHE45p?kwMk?Su1udKz~VFLKEvGY4%eb zTZT2en5JLAASh^PKF8@ZO^NEzef%!dQSBwMxTVfvurhLbIh%0eckuvYH6Pd9JO>(d z=NTA^*^;@L2YtdY7io;1NsfCsEcCXemo%dUu*$9R%XhH)V^b##eIF>u+|EwkiVh>1Z@=gZjzPC|gqhNS^t-x~IC6Pcn)ATkRQRqe@cD=5^xv}IsG$$)YNcC0w86u1vn^AKFawie~nyWLAV2QL{QQo zp8%bHE08xy*FQQo(sllN@45?E=w7TXG-GqUdqfzJ{|BJBmwLJ#G8pO$DU?U);~>C) zD~c^634A7}1%yimXErzw1hJbqOcY% z#{y5%8>t0jA{9j+ZQ9&WHinnR2A9sD7D3x1JWb}hpd{gpWB zMgRfIEBITrqvpgvv$ukhH%}{)Q;!irI;|t{J8zc{kB`7vM|fLnzmIa$L>{{y?&crp{O^bOp=R{G zM+6K@FqYrCHh7Zuvp|@udaGPLkp?NXS7GAm<~ZK|@G&^Yf^8CrJke@V<8@2_|*ZakpRwKthNs112Q@py} zAPZUeri5QJuoC-u-T^I2JQfMfIm$q7oPPAP>YrEXU>oNk`AvD|iu&CZ!N~jgYb1Qa z2w{=U>|hI;`?tne#m9{vjAf*YJ34&Xn9WMct0@z)>&H}!pPqMq@jSSF93xFv*FJ(W z0{`^$qUdqEyqwm~j{L-(OPFwu3Vz+a^&l)|EANaHG>A8teb+Ig5;OqHjX+;-{jE06 zuQ7kasAHUu+fpGHPj~td`J&jytcQGmst20bH56kLm z&iU6kFy;~3EFJdDS5V&A@cPpvcBjPl(}Q*r5ls_U-lDqS`ztTC1A2K%>{3C6N7eXW zl8~KTpf?gfif-&RD-xY<`jv z+nw23yvi8|+B-fRWhnNd2)Oq>ur3GH-yf#OtksI5^2vpxpn5Gf32^?<=QjM!!~%Wl zJhmNdPr2@F>U&mUq0o4NYB8`15a4E0-*G1)7U5%wYZ81tsh!)5@VabQw zufK4kSOntDXD2FM?_H;nos<49S!S_-z|A4nwz0bClA@sgYe}@PGz2RDzTb>AP+Exf zvh0MPlRWf_q#};{tdCyctODPv_LB-o9?tJ5<{zq?b3990S`sa9<1xQ4gqr>YDfFQ0 zNXc^g3na(H7th}rQ9L6?x;e!)8akwGX*;Gh?I=((>oP7F_KtvxIv5;v#8$UQQS?GT zd1xiLbFA zc?e1Hu#UvD>>CbBA&X86xXrD{S5Whv^K%Z|R|;|GS$Fb?_hLVRy4FV`4xPJ~dvkS9 zhflEnDwLnd{YVTiz3{60Qr;ntC{B&O^@25@UvmAJ{dDQWWuRHuM%OxZCdYSxhw^@; z-eErMO(1?&f1c=Q286b1kL5xA$WY6H%r&QF17K}H(a_Ece+@z#o^?T;1x-Pf7R_zF zw27=e2a)}+^bf=4{}oZPM4>(eWc+eG7hD%l7)TYuEc-r>QP@ky+qxL4*)F3M(;_7l zuJk?o`F?sdw`;x1u^vR{a3~!JGrO-26l(u7i@Fg+vV-*iVImJjqU`(hS^GX|Zye?` z3|wj^GS0V8JQ4098kJ;JgFe(0N(r8SW*f47Ly4L<359ON#{xwVm@LfR*Z^vmzh1L= zT_jmW&TgBDm?2eMCdl9ogL%Yt8>;V0hhLeJXfyP;k71YsD{uKqboh{buiv&o``YJc zp*+o-KPW8+c1z4IU_AJvlRjmuucZ6fS3O>Y@r4xT^Ig@@JpV<8AxhNQoaKwd&jl2b z7mMWpdU+oa8e5x-`}Vib!V)*7XpI)o5`>NSMAWkYBhC?ACciBF$tDUIL4)aOJV%;1 zO6rMRKu5vYBODBA5A7(3rrD^Z#di;S)+%rnbCc8-uVkIKG~qT@7#|`bCM>q}M;Z~0 z)Z9qN5{;zt%)4d%PB;OjKuJ{>c_(!1w1(gwq7sRGN({W;cjO4-jJQ}_rHT9_f@R5{ z)_`^>Wu*#7n@A$%7_DPMF^IXvqcI7+40wc12l2h1`{Sn~1`T$x)i)@SLyK{8{nBi?ojQh) zj{k$T?1Mh+fQ;rc#(#oN1kTRU3qS_eX_ckHCU0&R({w)4)lP$pm_1RRKjV|PsX!s? z?cX&08!hsn-c&xY3`n?Q)z~xM%fA;fYD^i7F3ehg|JDMcY!|Lys@B*v0Zqk2WD{7a z3?=5xn~m8_Odu8x49QIu3W4XCH`Fcy8;}XExc>g^!t)0b{7ng2-*1zu?K&z^TT;e0 zOu+yIK-Y%#b%~mL?!pk^s_zHi)fEls1mgu(WV@Y?IWh|q1E7VwqM-*)+Uwau6rt(G zrV}pWFm@=5?q;}*0kTg2g#6AxpdDY%s9+F@w zLdAiRxtM-L;KPj~ z>&+1Jmf;Hzvnl4o>5mklN)OZB#(Tk^KV+gmCcxHI zc$3h)pKfUs$Gn)Irem}Nq}eH~_L1V8;z}5SeA$v0p|bDjBr z%s*JJ0mU_YmXpaVJ+UOgY`xl05r3U{vkKFFH3;4E_a}f2rv>tQviv(GO&2XcQ4GI9 zt|!F8SQPc!A9M&*iw5lI`!>9)yPEBl>vq6MCw2}pN!>C#ERun3of%ILr0Po`J$dqD zmO7Mlw;&)564D_pDIJHF2I&+8sRK$# z3m&=!1pfEj@9MqZ|9}6?8D~4roH_2j-zV0yp0z}*d)^PYI{&3H9!aa|U!nER$20K>#Sj&F5L zGQol^jpuzZ?Mmw$K5U$JdFPj!Tto?H&wDldTt00%uiMDxoX2yF0j>#lHXIxx0+DZ@ zy{MyMNpSHS6m!>TcJa@a)D0lgd908;@Da0uB*0tc=g*w9G~wJEFreC}B{VTz5c?D| zWI#%AiJG^GrvP{3Wf`yI`y+ZU`K851kD>F6GuD%M z0>MU1gp&UL$w?pZ`h5^2JvB6>h!|aEXlOJze2pF~xrfl12SCs*pn9mFO&vQx<3|Jx z5g#{pZEpUK%KtSd%Unfy;ril%Yrk^2QT?5*ndjmU3X6)~3DSSGIKaegI)s*0n-Aa! z^IT#A+Z6@&hG?e87LN-vW5D2SO*>=cWvu4J@;@Vp4w671y5$S3y0muc@DUD)N3I)+ zEpT9s4zw1m@geqh(D=7WOok>d^&j$(A1$~M!n0HnA~}?sPn1pk$KRG2rugSXT_@HMhd0@l@Ibm9wj=Y&x?)EAbqk>M9C5bSKEw z;=?}TE^x=;xwvmVdA*OzudV?l1hWnqI_&WGCaWKi+13}pzzb~LcI932K3EDRBcgt3 za+LA9$<&tp6wun)N)5R&3H4r%%nNH-G~-S8E9OCou}2a6L|B>czxV*tw7Jk#d#GA< z6^`M3Y$@~Gc$pTt$1=1DrXquL&%&yw+wbKNtU#E$9uKu`y1S$J?#L>Yjh4(XpY zdo*PGgmdKZEqsXLUd1>=X?Y-zmDi`dGLebHL?&23a`}*L9Onl_Ilm;vs`l)K2CwyF zzq@_{ZrNm!OPOTObs~X`LY_S~ zHdgDgKkND@NdE;_-V$B!_^k!-H^Y-F^A>CAXx2mY&%#%A2DCQqvYitcjn}s?%(qf1 z4h0|F!-GL!7;)j^1PY9coVvH7`WO;TERn9{{kfU zY&t6X1eRctuK0qyIQ8^{kOqMw*au~RYJYDUKmBD=?$4ddRL7uvMTe@YsHZ|hBENT( zGk#kUf}OI%szJfdTHioP%)m<#Wq-YFrD)8TzcGbTS4cFy?O2}_4ZrIX@_IsZC!yUg z->n}oNfXBGWD-eB3KCZE*#x9L-YY1$#42DrI=)VvP!~!1LLq@!p83tLKpIA;Xt*x4 znweyW&HGVTkUoV_ThICAu0RCVz+%P6y9o(vXoNSX@fJGyX~sE*(j7pF_^NE@zF`dk zs0E#0)bMxSdnZ!AT!p}8iq7~awi4z-v+73%r9e9l@DM#~SkbIa7+>JoV?o`A zIbI9Kg-in<3%AWN2`iDa&2cHc|5==>AzQNray@HUikUGc#qU*mFK?rJk7Cn6&N!F922%stbdHv&;1@>C3V`ebmsj4V&MDV zTK5>ZxUd1WWiX%pxwcq~&Qm|IEKPOz0s zP<+p>lQ8*DwVU|_MZOIDU6o#Z5${~d%#f`xRQ9dHm*Xz@<7S2+p)z5HVA%rQF0(HH z4BJ#LEs4oy@ib6bLV=J74o_t19!YZV&X3;)Lry*v{yc`s*Ny!&z16KN)h9cW$L%Zx z^a||^`7P8&3QB8Q6P>zuBjW_s;&%unk~Fm{kXRBF{Fde3+du*-Pn`*IxbG#dNs}mn zWoPl$_$~(6G*L^JnS+qRds#)TX!^96%YnGtd0Y%o{wW`P*jE+}&fz97U#SBN{U3|x z15_Q31;%{j`PQ}itv*iK2n?G06r2;8u+kp#78ex@e8ze>=O3=QK7;9S)N*Z$dJzJe zwi^Y*+7V_I>>u1)X~YrRa($RZe~ zIbUV0p1aM2R1rJ0`(HRmfZ{8{g{sz5eS{$20GnxY9}L)eDe4&hT!sF;?kS3)RDYUi zLF2hEfkiGv6dxbo^dpqg`3j6oQIn2E!RixF0<@>J-_N>C!+R#$$qmh;^Q(ttGsQ`rk7YU?1cv)^f`WV%v@r9dBs*HKg$#Jy z*?;zHsyRPMNvxi2H+(V=kd1p>TzxBh9bqGj#@r~)3r-3KkBf6QP5x(HQg;j4e!9Ht z6Zu1DASbd4R*vM>an0CqMY4zXtgI~+l8IFf+Ah-VoqSG#c{FhSr}DxxNpZ z$vaJ6>qKHSR=@Y`aNqz2v4Oo)bhxP?gETuGe_%%jdvQr6`oV`-tOoT)dPM`o_)Otw z30P>p{#QH-LYd7uga-UH@!}a28BF}{d!)<>owFWRL^x^`cEwSWGIX^Xiguu;#p+7Ib?tDVI^9EHmBa;E{ZS+01aax^oT= zXJgUxlDu_F{6xE++`STZ!G7TJP9G+j^Oer(pRpMhxcd60dqmH2g8}X z!+^b(kcJEMlk-OL$LY?bTmfF=unh5_>JW`E`G-K360|XQ9lD9fJ82$daiW z7(_4kgqf3F&3kWESkJtwZ~RyGV6OJNeCdqQ4{S`aqP_-!rgW$cQ&p$_tAn7dZ5bdF z^8@2MK*1>z$5!>;*kk!+o_9%{ssXhFL@%&JzUGyB)*fS zXxx4k*merHunVLiP5_lupkMD;V5;}FHKbJ)m3&bepP(=Dwmv6+F#r70W}!~`_6cHi zvMC}$0LTk9W-oDc#Vy%V3cr5Yy$;{AmHS>~SD=cO&!ml>eh)QeQX8a;iH(>llAN9| zc!;Vs_<2lW(zM-A4ShRq<`$d_KP>o={2=o|@}wp<%k4}E%}>;=ZH}*|Uzm|__fx`iJRNIvOcg0nY6?dd!8U*|dRFPdM{ZF*h@puo4N z_q{0(5ZVjC_+lJ1glWt3VNM3bKHx-LQnCxuc6&Hv0arAipz@Y2R#|C%3Kb7#(HY0#5^y)s_McRCKO+rn6%pI>R zMNr|ETZ+m5+KDZGht{9>@f+p|x&$doHoZ56oFt+;A{mUx_li?xUsjtwV$L|ttCL94 z7JKWfD-EkmO?W$$SKNv(6Gn|;Ynhxd$6;li5B9aoS;zS}zeWxlKaX+*OYpI48i}x5 z53fM@mnlBTHBl%Zn3Dh6(1npiD%;m)o_8qqbMu&EQi5` zkG54WwMd(4T#S$iHhEHyL>r(91R7EbFCBZw0it&Jq@`Bnl&ZK3t?ylub%qD?-6ph2 z1@gx8#|Q+kvsoc$(^&-0LAmKV7+whHrUWNJa^AP3%$sW?%d=2Bpj4KKp{l z=4=H=i`$P#U?-CM>}*%J!@sSd<)}C9NohCbVz7;kO{dRZTNqnX&QLBn7>R@c%8&3< zQ_8#T=V*_vMY%PYgYCbi3ZJN2tX!0Y;|C2w^16d=|y3WWh)DRWj zzsu9Ln#9V)mRzW&s%GhOQmbccQ)1sc_GDGlrfzl&Sg_M(GAvyAz_WziL+e5i_I~4`l%G@*J%oQ?QJnW+TbDR%`52}E#wVOq`Q7Eog>|_n5Al8 zb?goEo^Mx=Z!koax4&d`ptm~5GW)tnW1I5%aj?H?X6---&h`c-3L0vc^!g2&S~onF z+8}-4^`}qDzB~b58=Q8(b?q2AK@6gf3kk_UBLAGaD8ct`2Uv| z(o}NZD*kx6`33*z$IW?E)DH>~g;E2FKAQsjeWs#@rwS6F9=KD&RP}BI7x(HQPF_)2 z`W}}D04D5{lOOt=+3o#~H<{`v*?y;b=h>z?OdOcqIX-uufwkhMC~ip>=62Ue_;;0z zYTv#)Y08sAkID17$zGFB7Ofr((5AYg}{ta zw{F@sNHo~Sut15xpzFd5%?MG^sV5a(vq2lUR18|m{;X(P_cLcFoUX~95T5#!n-#drx+y!RA7N0UpEFVN<$E9*T5|jn}8sd$r|NX;GX7 z2ox&^C0yL_hXPOiafs$bdTrx$_!8~hh_R>?1(i{PPFq5G%f=Bwfe{s2Vqea7l6Vwj z=cD4LHC0y)I}b&@A7Go#xhcqsPwWVIgz%W5>;m6LgBKr}J)^lvh{shbo$9CniFXR_ zCS+Q#|BUJhb@l&>1%b7%5w6(>I_w{ZZ=QDe%?UWaPYbkw70KQS$=O17oNef;sWU(H z6*svBWiNXG&}xLpIGJ4Oe*>EV_)AbHtu5mG`(!b9xtnh7X}(|&_zbp;Fpz_hYdpu# z$b=loR5JwwKg=5lpBzvAWK>C5w)FIBe{=xyiP?2(62@Zv*2n$m8~gl=mOnq#c@**Z zA3E!J8^n}wIlRekwiDL9+z`eWwT}`hVHtl|o=jYpJuIVZFNP0E{X7~^1S3nSg;FR? z9nvpP(Sm&9EXg)p8GDE(?Y=MN`HV7%(6>~%;hlVyTx!BA#l4JQFP{)-WK>^WF?fGt zXDiBV7_u!ibu4F!qhLyYL#R)>@J?Z`CaP)3vT<@od))gxoWBi>TrjTDBKXg#`7niELF-cKe1 z3}8Qv6_MK>X)hIktiYuFD^2YzrUrEBXKLBINuTQo?aS6{<68TI0%X2_bb~qW5$Eqz zo8VtPHBWV)R9vdV13@uBVBFz5Q0=7>eL?obV^>;10dvG{w6_QM2H#52be$;W$3rU< zK$~g$bvWz-OV-J&1Z$ZP$fkT1LfY-WxO0F1WmFj%I4#Ix7DC&BSo)y+(^S>aurN(K zD3Xq$A3rbeLp&;~Ai$^eWIKq?#6KVTQDzX^SX3nYI{u;Sj9t~AFu?N{Yll(A&9>m< zgJ!1u!?s`muC_Ej7bk(dG$#iZ)K3Yt%Qnw-jD1v)AKLx!LAzTUjOoQPf-2hVKwzM z9I_7jxv~XTIg>N%Bm+TutcC}P$M4o_%DMQ#BA3R5`eUy8Kn=4id5!gn1x4L*~46ePPGtmjYRDUgHT6@SbNC^MG>*ABuHfn{xIerksi5Z9PcFit-34 z7UzYNnbqCa-EP)*zCl20*X;YJG(f8+1(Yk3uv_a{YPZ@N?Ct z>r2sK!yOe!`uB}9%7Ix2un`U!xH)F^TKqv3=JYR3G7&`aPuzU8ZJ~;KlE7)1Q=m4@ z(?*ldFRhW>nzF4K`Eg@SLzQ5iXkt?<10&nNOV-(TYo5A(^QBkQU?GgjV>+2nUTbJmA3RZ&3Rl~L?M0CdGfZYsToq}>EHW16nk^2IgdlHU2=Qz-X$X*k zKoo;&Nd%w;lzLe;GrGS_r35EREgSy|H&NnkhvY6+#AXuE}Ym+{J{chA+u+sJ`Gfwj#xe zoW3=%iF_*GIZ>#@<9%#{aE1a6w+wLi`{cU|JkgPn{Vx`;YH?n@)cqG6{O3t`K9+uk zs)eqirBXc6`dQ?R3L)Vh^vhR4ZQb+`W%{Eg%j(f*(E&X6nXQctRzgU}X)HC6y>7Hh=xQ~mQZZRk;=nV5yACHpTja1$*dPH3wi z0Xe_?aCOLm)FFv?cC)a9ZD(rbx%6_NkOQMj9dJNy z9BsH@lymopg@D7Um1w6w+i0;I$~Bx z*3=fXJV{XEmY_*K^+NcxM;E~E+J3M5_oMk23b^!%zH?@EG5@AGU?qaJQ}QD)Cc+0! zeis+s^WJlg2@T$xWAuDY3xfqO+H8SyDL9<>I5>KY<=L0}75-~saX$`4@RJz~3i-KZ ze8a9`7p6+h<2UQp5>Tz$Zm*mzOkSo_6*^)iWoSsvnY1~&C?TLRdkIR<2X<5U(gh#N zuuLeweXvZcQ}r)lD6VKQS-6gTGOrZjk9}gKK+mP*(GA&=Ijk1Pf2=eCXGX2hZO2c` zDB}Sn16>DMqU|av_x5Kf6Wzf$_~rW81t<>{?H6uT$TjZcB%je5X~l*UWyt3M-M^{C z@;=f6UIFcR3wYGFBY(oDq0)-xC-%(lFbWIlt*$`b69euKOx2)*&j(#RSa1nvjN*7x zUr&)wt3<%SpS0=yHd`rgYRXQL$zr@=q?(RMvqLXDM)@F7KEU570}=O@+z6M}?5>4Z zK1-%(%yhiPy>DnGke5Ia40E6l^&DVk4frGgY)C z_l*Fe61x0NZ2oRp74cJGaF-EquCQXlvS zANltqR;KS%D0RK3cLLU{`iYrhoE3~z4Pzo=UeB#dQWpXX0jgyZe0=(KpBNUx?`;CO zR*B@P8Yll%{{MW8{HrbRHmb4K4PX%6u7 z_u_A1zWM9J_Yj$=oMz>|!G#?Icg4(2w5MWUu_>lNQUnLIp>3F5<|jG*-q+k9ZDQS0 zc^JJqjGfn!4S77=q7@&ChI*U1)y{H32tQUfN4RygJh2UWr<9>3Qq?0;$-WK0J+yD` zO=|;%%Z|bRG|K+f!^fL^LTI*E-Jkp+<%QhE-UcV{M?Iddk&XX|eZ9W2PZ5no%4~YJ za;Ibq8VOnDHE<5O@!_xEjY5V5CkB9@Oy!8OHrwFzk_Q^qM&_(QAPn=@iu`gtKzcNG z(=F|~Gbhl9mDMjBHD_1fEIMoOBHofQ&`Oo=(IXx998#0{($#$+DYa6Ns4D5Aj*q6q zxAgJw*V=e~jJb=RE&2P}T7wj&^wlW+hl?SOFWjR$?AlqZA01~?5oT%LQFQLW08r5S@Nr3bN$-&ciY5dS!_kK! z6=l8~pR-t3#|K#1%h%|%;$UVpE+Jjz@aH?3#Jk}1*VsRqyjvP3?&qnC3G<&Y2xIfA z7IS%rN>X1a)+q8DK?Tv4TTsVv66yPya#9;8~~T~w;S*hyF{{g z8`*v&=KZlU*;ra4KgXox&dCq=Wys<9}!16ldm?#QE;g`Qy`AUvm4NA`z zvDDq-+lee$5ug)f6cVBUuGE6pKMAXCCs}-t4+iAryR%T(v#>AuIehUTu%%CP8x3(ri7Ba46lZl z$(=&&R+DD)bjT$0D#U2T@!;zZJ8;93)*8}f5W;+;Ne||kAaC9AD)e&xg&fK{Sc3tP&Rr*a%}!!12&j*m=<$+n~96@Xz7=9o*iC*V6Czks6!C zhO0hrIgtHz^qO?Pa{lwB^t}~)7X?E{>h5mJgfGWNMueK22`L1Ggu$sy6K6qp?@MP2 z*1rD}B;SZL22v>)WB@K~tk^ON;IKXuT%Xdc@rJQ8N*Z=JQBUYM^a9hU>X!@piK9iK zq`=Gifuf>fwcWbn>USCpl(DA<3j;Bf){!<8jU#ddbVz@Ha(dwOKe26&>mt=5<>|FW z6fTZg`_rh=KE{^W0~o3gQ?>JCsWg04BYVeJMhRJUeMNWv+%VL$`RL%~aPSf+koS>=fOgK-J zsUX2z*mtz5p4>7v6fsz7hYmne*74D29+XJgE4NGv;t6ou3-os&4#(0{*&Jx6ePtB; zx5b}&n0fkwcr)K3T83WX@0R7)8*OwK*oarf!EIDhVPaoXKlO;Lp`2P-ndLW?+VmX( zN2F@gD{tQi_9UTLG|_N4duBk_YnJzN=s9kO_5-myKdp9!Eg~-AJ#oU(rcz<16KU4z z5tUN@&hvEtPsl|?-2mpCpf>>DLtxbt2!hE03ld`5)eFN$O-)yLHb2W`TDn_4$x z5X6x_H+OTc@xJK!vF1@aB76M(e!L<8ex1Q=zP9n{k%$q07dnkNa8d=Xpuu2~nx2&v z9SADPr)~&j5a$m>_h~4+m;-jU^Skv7(BOnRJ@eI=G{qrDy@*@eAU#IsY z3F`!wxQLG&MMk|_#E=p$1j+^ z4E%Y@&6on~Y5Wo#U;km2(^zvY_-Su-J+c3)Pzl3KLYDi=AslZU3TtYdPPzPK--=-g zaUPaMq@Mt7$q&1F95hrMcoRHdum8!Z!H^1w~rdN+b`X8GZp zL6q0dWv&0J@UE1MxS=-0_u_oxU55Xs#G9Y!RwEa;TszXDczDO$#`{P!hBmABoe}eD z@|{`J-f(<*MO9gKQ~LG`I7g=M;YW<*2<|KlbH?8<|DRI;E(G7B(D<$4N7DvS82Ow) z6y)_xc0W_AvZ}rl#HW;T)8JT%pPx4XDv!7L36{&a%e(``UaZMWM@`yEN_NMKnC!;< zj^s-vOltScuV)PW_}jrbwNcwsRnQy$Jlq2$7cEt}Ue$gUr4+mVneSz!ryfYY0>AFx zs-o_HdJDIDv~{bzjV83J#HDm5c@{ zDZ8{_t4;$s^A?lG-PbLR)0bN@Z>NbJUl$AA>L{kCxukoVRhEc2ALCNumGMssZ_&vs zLr>DJacjfHVX=cGV4&g?vw9LXvn`%MAOFG;i)Ww$r%ZqiYs~U1_}@`r2w(qP{rU2n zFv0*CIOcVq%ov6Ni@s%c@|>a1pXFMb%0Vn%5d8ku9N5j+p=I(JIS+pyLCBcf=~JjD z{5f3zx}cIkPJjDiQsq%P#<%wqynu&?e>;vmfg54;Mop_kDR#j6!HUD4vX=3h{&@PujUWuKyCWL?owqLiOxG zJ1|_U?7?+}z$=Whsn?J!tt)pVMl;9;3SZAz~EO3CeN0 zf#!BF<2-}vr1-ZM3hCk}Ca!vK>fhh-N!6im&zdB{u;4D0o->XAe&I;yVcRBK3&Pv4 zs8_0Pz_KSja#P>Mpcy{I@#gK@kcXdz39H&pDMT|xC>MQ?_!HJd-0cwm=u)igtX_U` zKh*cHpzx<``Ok%1WM?0#AxdgN@h4zewx%duB>;3+qnLTt_1NTLd_?@6V{*h*+B%S2 zU^IX4P50DY?iM_t8vbx=|Nif&82DX@PVNE^se_h7yS$S*)gWkT$pocWy*^*C2>Q$} z{Fuwk+?+@L6DPtFwtxMdFPzN+4A($;)w6e$Yw0cYJ!yr>bOwu zD`r=%VBeQCJg+;4!(~t)5$ObAkuoOU1Fl~EF=oZEzU0$M&fa;%`w!^tv);W8?va#s z*mlFeWYy|_9BH^^;BkzWI9Wu8U&uTtG}DZ_TI|z=hr^Q{b*Uu|_4e=Q>A9O>M>Xa- z+gDH}VwhQWeq`;Qc}3d~sfLb4wcP0-kJdQTb`P*b#InF5MU#P`7j;y4vHH!su<$bI z;xk;2Qe03aQ=r?oHTa)5Dq}S<;p2aNxhh=oS7C>ZGQ|dSYNSMmP>1VxIAwW>fTfo& z4g#41rpQiB*WQ4Ou9m5%@g^(lbp+w(&Kr?~kkayN;G*vG&1)m=8YAt0A2@$x;+0n^ zSy?gWGQzx``zAKgd;QpyCW)6mRr4E<1l(n}Ch9o=!&Y5a?G;ek^gV&;Y)&=THg7yP zh>iR60*oXg1{5w=^)oB&=ro<@yrTi%^{oGLo38PF%#hEZu5J{l&YBg1{6lVgzWMgq zybrAtLF!B5QdPk#w~`~fj0VT$7eXTjl1BxDwJg7*{TChN6x)eY_vP;&3_3Y>p$xi^ zE?XJZEc~+2aC^G~!P41Gl5Kr0;1n4-zT0$f3f#v?H4g>hdd>N3zLXZ>;ow0FbV)PE zK~i=5wx;ZsJO>*QLF7UoI39r`zh^Ml4YxMz5sV&Us0;IRANciRH3d31W#x`SiQd&R zbgLmU-|nIlV|5BTfCs&t)x9lOf~v4GJ@nVRuaYLN%u#IMF`OHh?Db-t#Ms_F_gh;N z!Q4h_*A`CBhD8N#Kk$v^2%r)F^tB=e1z14#N9n2GIDlt!PV>cS^0gJ z5IHgMiV3lhkjaf&1m2M+9^2yT>hUhpWvP-=NhDlqY(d(N@MayCUpTd0f9Mb3S`dbUxwHv~xNa6Xj!IKozN^ z_`qtLj4krO>}+=d;06y=%QTCWyB;U9<^$)!O|Xl7g!1uU&+$Go!<^|HDKh-iMwz2C zN6fG@Iesb5;hJNKgjPEB?h9JgCJt;>{F=~S{rK9VJJhPt1i7WC_F|lpT1u@L`cc(C zq6q4QSg5YJmHC`XTK2vOjNW)+bWPLYm!ehg%)O{1r!dV#N^MVho@rRCt<^8%<`xa{y4dMM&7tt-8x|2z|Q^-0t9>ghQ>B0}&HBbT=I#5cD08yF|HzRvNq<{}Y$ zXOHrW{g)0poS&8`zhVA4O1aAV2QL~X=Ms#PpL`lDW!XO0UI^z!wHcVXbP4pfDh09U zSIbn>i2?_V{j?V1{0~c9Vf>CjHrd`llilv9hv?zG5&}m@)E0-Rg_r*UHpJWZ?gN z(pdxbe~@N+>^2uIt-HA>>@WsR){Y9@P4ArM6)~(sLlQn-3I_9k%F5*9`k|paAD$c; zPBy-M;=x^{nictRrQiE-b9~IP=AUA>vz-9+7@}`9mWy%Vx(;2{UxH-f z)8PD4X;ryGq3Y{=GsahnHnc%)!)4J&rR}s7*1^RrbY_$Cwba&4Fu@|(!pEnkd*ZfM zSuQRycJ%nu$^I7Hj zjS^2}&I#UqbCWljRg$`8bWkbesuGJQ5g=1Z3X?JF9ke!mp%Od%#&T`85)}#Y65ptH zTGggqN6KPy8@@-e&hisr88S(h#cCKC?3{cmV!494*Lvem^~elG=p{V-^&(gAZC+>h zE>u#4nFL0Pf1ZU1}Vn zBPbYWH6J*oCKK>&V!}nuFDgQN1O!R|n<}!$!(^WK_m_66KSj*^-adLxW90pVdEU7P z`|U$(RjE7AW-7mYuqD)(ocPpq)4I|GcLHMMxE&r;`Z#HxYpPfEd4`UYbS~S1RQwo^bZ;D5gW~luSt8!oj3av&6YWr%>G zl9Pg*Xyrw&bY7s4;_>IIMp%=d=>JZ4!hxVvFb6B3O?%ls`|G5}@@9%mL(J1UeM~rE zxBcJYx*Qy67|EKDTk4~qR8U_1=l$TjkL>R5{`RB`{R>l` z)()l3_%I0R;h@hXUG%@?VtJY!-6!_z)vrc7 zDtAhlj3|EF>=MTFp9YQU@z26O6+$*&*l`N@83om~o330_SeRA8UPDqL))3cE@42EF znV2C&g;a*DWpa}SqTUUYNV-ji&Zm1;ZSyA z=Fu`2AmF%rzH#tcIq3wf$pDp6wE=B`->><9WjiUQr9QyE3tx?u3W(UdGU_cE2)8My zL5)hZ)AbYtniR}P%m#Li!8vw^O?EZb+@$vERfTTXU{Tdb3N>oLKLu=c6w|QgbW5BQcG`v;Y zKkpY64sutRdA^Ec2D|@6QJw~|K(e*hQgpS+`rPY&7l_Q$<}GOTegx_-Gnb6&NnA{1+Sb+hP&hAfGYw-nq*2@b7FJBX+04ovEn@GQt;;)W z6;&zbf%rWwN^Sj?5Sdz%XFW5eW)Q~~F5>4u8f@uo-XKcoKo(^>U8-tGwb}CHBflol<7Vf% zpyMykf}*08+%TH{l0;Q7&-RZ5UG!Ab!X_I|IRZn&9H5P(ZNH%bcw28Q^^;St0E0Kb zZ|d))gh)*$i2fD0>q8Ib1iC$Zom|xVvBmA#;lY zs}(~TCQ&a_^b_!cH`vGZa^QnT`Q2Nnz$vE>xBKyCXdP{Q^SMVMH*{9Z z7usD)r>FYN@%18xSy@zD$)_W_Ql%2F4%vpXZrJpItT;7tlt(xj7=-j1`z#>oGT(W^ zr)}`*I)G58R`iAeQLGgycIxQdpOLI`Nqw1mu|{Fr*YZ`y<_Rakvck)U&K(=Ycch2; z^{U1JpqkT%47YQ{&*cDdv2%|Q@XGmx<92ojPY~_2$bjduhs}u(IN3(&iZib zs$ImD`Z64$moTkoy$rbBeec&fKHZ%82MqhB{;vnMB#vowp`fQnt}VZ8Q__?bLoITV zs`8Z@hf#F=QIN%oM2z6^(;26QY9%wjllH72n6We1m-|nano;MSDs9IC{^nLfecy|Ln)eM*|w7ADJZY{3rs2`lfT4LjP zo<%+12x{z)3yG!w?%p{=r+l?jsg(mS#Uw*2Z$X~z;gq%4f3}=>a@#reGWv4S3BR;K zsEB?-sG**ao=5x0D_U6R(KLn&{x8Py@+2Id;&+p znvQ3^rK-LMGa@z*1ql=uB;T|_DNGLp*aR?SzJ3$ZB*P=L^(o<0u&Kz zov_?1{U-k3@Bg2W2L@8&G7OCi-W(UFJN9>!xk&CJ2fo73@MMBE9@Mv!Qk7#mNPKB_ zEfy?)*|Xy@Z@S_qB}wu9e)?m@KVv99FJ%2DUh{sea?X z-@j6@9A&e*CC(F8Q>7?fW|`(bXs8n`nz+hy*^)(eq{i_@DpDEu?h!J~3wi2N=|B#B?Qa;}6y=w1Kj z?AgpN6=L+yQ7AZUNF7+xUc&Cq&64}zk)*T3F^jXT7=n0tdB;>%P^wzs><`HW;Jt({ zyIvcnll?JGCk=D^aE_`ak~Hz*j~^uz6^H0WxSgW^#{o)z7+BCN-E4d|D44oO$_j}R z%xX5^J!L*ST_dhb)1I(L)^5Tcf8RnI0hD=ue%%kA zJi8q?{+jbIu1;q1`*-@W58tMzN4{`zs49mBJ(VtJcMy^J#HL+o5K(E^ng?b+@=u=* zfL@E|GC$7w6VCu2rIWDw@0TaA2Z20Zb~aWHJ*QHJJ%(}PPq3ra3)Qic-}?%QdS5QY z$P(kYD&2peJ~*cqJn>0iZ<>L-tn#KQ>_WU}U^E=fwCs+S;kb6vcBPauM;Ly-K%@r5 zO`kpJ>nUUY@)=)KLn!l?0Q_QjidOl>Ufdxx+YEC1H3Br}Q$TJFD93Z@pxs%!D2tte zhi5g{5imL_$ds8gF1^{ZkIFXHa8PqJsDOQKIY^&l3fwP{U&13)(;+FIeErV<0+Th% zjR3)f0gL-YwM;@KKsMsxq8EBAvxeF#iaUd{c@TH&uNT56Q<_b{R?&IX_&O+pkkxFP zt+>-FzwChi+8Z$@{BwT(a}j7Io1+}U{IZqWbR|@q)d>n#q`ueaYN%;_&}TmTKC4}> zYijg_3dd%?iaTI*?W642?58&eZhuFm96bWH;*&Y24r~DC(_S;I9)rZy1T;llet_=p z*UtlalEet$-bM-P7MtDsTF1-tI8j= zQXX^6^rT~{ob7--Rn$=VHFW(ejbJy|mt!wBf+x*yCPc8{AuaYUs1B7Tpb17kxkh81 zx_SR2;8Kuo%X5L?DgKKLvnz)Wb)_12)2hdx{D zM`)%{C&uvpz?=Tm`yfT9vjoB=@3;GL-YpiMrSPucoc}KCz`@F?p;f(EN`=)dfLc#1 zDqZ+ktqJBxbD}>2fDdOA6s-~{H&?544ped)tX!j{`P4pm)>|gS%TpA~ML}8MA|Z6^ zbg&1PQ3kCgmJ~e|h#1p+QEevq-2wgXsSx?2^FGRPyD#X6JOOp);85wl1f!Q9gI0ai z0~jOnG(i3s?~N1leQVS}VKH4^mRD5lJtXFcS(28i{0Fm8$>Lk{j=XK`Uh_FzjbB5^T7|zM;92bR-C=2&Sad_x7<~Ms#c)Vj z??{zp#{(vJOrFu=>MX+Xv16y6{U^JXwQ|l7vB0F}Gb@-^Ny4mNJZbu91;m6v-8+eXzQU_Gfu4L`d?K z{&ZTFG&ho{v75YZ+u#2Chb_qyR@3~TzP3GOwJOw>d*kvX<~eCl9yMT41!Kd3>h*N%5jj_-_5K&!!hs%2>z&*aD4r)VuXbfqe5iDxSE5o5Z`bwxm7v+&n`u_% zJGX+yt!z+csJJgTWAt>Xp@17ckMt z^@*d|oN2@@QfWn>QL-2tBvci5bK^7eJdo+_>q|r8arad(CcWzUU&uOB^$iNVmu*K9 zzYw}9{j5D)=S0+JDMv!L!GXM};{c83@^bND!DDe*P(fn+=VIDJ>vR+%ck92P=D%W} z%`6HKO#na?XD0v?4l;>aP>_){KTOnUvRYVJEIm}vsQp?lucXw|A4AFGu=$`VlRGiz zwB?x5ZDAroV`?S}Em!@`SY7Pl;F>4LwmW)Iwqp9(G!9wcvn*4zoZvNp9_ zZGo3VB{|)(up(-@&2TSdmS&r+@~ZPqS8$Cxz+HK439S6~k?aa`jvG}BA&^Y(-1$bIUUkQM3~eLNWmLDVZ&!^` zhkrHFh{z{S$dFTnkKmy=HhzoTSxLVD>so2OeD2*X7tpe$>Ny_oZL;IdZ@0^4%6Vi7 zjs4G=`xW2o2No180G^<{ii(V~GFGOlH6cTfCjIX`Czy_*R(*lK7&_!xZ!*ZbTa;~A zDn!6o4VApF{Q+`sg_Tk$Hc}vO9Khu~`|p`hKEU5lV3loI)Bm7#@CaDc7ODAc_&n1f z;JM*D)>~yFd{Rj)Nw!RC^!oN5RGRl-giF4fwog&5VW>4ZXES-24Ud)EJv}WH+){_x4%*+n?Vc3%yWr!Z z6aMEbrNr-QO$p{{XMSPL_HX%hxtAa+f!*?QCsHLtfV^=kbK8MYIwrxQ4hY{me5pn{ z+W0(x2(eBJE#w}jWmWAI0j-z2enk{`M=w=`ez{-vajRr+Qe`tLlc?S0N9(_)Abf`y zu_7LLEeoJp(fVFtQ(9<%O%`GB2Qd-Y8jqMc}k4RcVh!Gyby{t@c*XmHbv~um`^$oAm| z%-%R#&El1;w1+D7r}=TBL4eXiZn_0V<49n27?_?=&r2YvR=;D#p9>onl*p(k9-mW( zWB90% zXL0Y{zdtZ)*s8`72Q+@g_4O%6-|}J7M%`{T>|dU1aE!7&n-3=9Ng7+Lo1Yg}PUG#v zFkob4EUadhq|$DcoSdk$?VhC-NHd@G65#);5lqhiL@S5>3W>xh|K z?MHknZOT3r3!$rylGFW)`rVC*`#y0e3f{S4%*iVIRG1v@VEQPpWRM6SLPZ<#0h_;Q zwUDE3n>G{-d?i;Ygd96`B#v(!Jp;atJ(s<3gwvH!i|q84zJk#ZI0yxjfCl)?I@llu z@#WX^D2I<=Ibf2w>4t8m|2VqGT`^8AX&c&?SL|A#I2qZ{!?47Cl-n{Gbxq3BO>WE2 zTJh-f2dC@ijsTjgaXE2n!%S6HmO+#+$B!06AnXkr_jO-!R5eirTx~5z)478rjuC!4 zTHEev^ADCxpKo5ebUac*;zh7;|5UjDhpxYls;Xq`Mm=r4ecA?(UE-rMpW) zK)M??-QB6Qu<1s+L8Rfg_7gtu`Of*qV6gQMHmtqon)ABvEAIcECxGI}>=w9|>#NLc zi+Zu$i_9XNxtvhkWNi*x2E>?DM>h8}=HYw>M^;xWscC5R>|U7wC%XIfiW}SZPWtn` zLNn~YFuXfE#=o`9_i>EJ{UU;HGWR{g))yTut#J7t2vRub)>c-p`CN|>nSJ+XO0gj1 zBmnhic&8Rp|`#{HEQ|y*K?9VX!&usie6Q>7BUKzQ`~cyNv`_|;r<0{B zbbHo{Sp1mXuN(#>rz5(T6>8G|5S;yh=0aq9bQ1^Vb0g>f^oAHinS0Xt5jM zgq~DG+G|i6xcBTRt2i?q(JTy?s-dDDWMC;{!9FeFn(Hg9+RmS7LBh0vwgeX$(DfzI zN7{h8khA8Vll(Ot4h!aif-^Wi9`k7Idv8?Js%WhkrZ0UZtEPby9I5Y5jHA^KB0^nv zK)P=NjM6GHc}GhNuhRjki~iN<{`ZeFz!CM2pC(9C zc@iQx_TT+FUXm0mH+Pi%m^QK7X9rB~LLO-GF-*5Nye9{h&bPIHPw^UPbTT=ul_|JF zmITCvqq`x4JOz}Xao`r#+_!qL065_93!Owkl&T6oZi1ben!&JU%Ph6W+WZ0#so{B@ zKJHac$A|pf@TESzlb(*j&39nq?Wn*$S`DzNs)hQaX|m~^9fHujOwEBqmry5ga9O6o z{^D!CTM=c-Ht;`QOCrz&XMn+jSA1^zuUwhR-$1M5)PUSwrtu0lrB>eX<^}ozq(H!X zMPU+^22owp5K2laNN@&$Bwj`TYO4z)aAt*eefRn%Eq(J)Hvwtlq|E0!bUqP6^j)qe z%N~1Zk-F6X*G34m&n1N6Xf&J@e9i(8qRu!0RUbeCoJo~C6o#wU=cuK>l+r0G&eup{ z1uPkm-uM{iZ93gR(Z5fsV>Rpyx!ClP?}}JcxQTSn^zD@nTW~Gk&sU9o3c}M9q<#-h z&WE$|a@4C5;^s7h32g2zx^qH8Pu2K9{s+d;4EplN!wPm^GAq4#2i&2n$;mgr4#3C> zbc%ztuk9DeYCu^jz7x?!I%%k7K<}SH13b6D?pAD~Zm1sw7T^O*MX^c&ef%Nx91`JPG^i*lHiw+{g9=&pOR^c1-it@$*_TdPDt}B4z9L= zX$kZ1zBMRK9`(P-7t0vf-w$dLxE+1fcJ>6DOJO;OH(F*a6=G_j6-2Fs)?kyRrtOac zjXD{5>RF|J0_J~hYq;`h^>q*D80h3-cI@xF%ocvp3 zhy(}t3J9WEzaHjq8IDO zrKciWWAxmfs@))c@lyH2uogE#EuguY+S$AOg2WdP7*g1`iM! z**<}=H;`P*vsI%KP8Ek1(ITT#z^XXHQb$iKW@IxWAI&i>cVK76ws8qyr$NU+`xuu| zvr*=7r>S;xrKlM;#Sz@)n}nnTA>!tr5PAFyMJ^H3C;n$kHe#*oadcDc-p|$^R=H= zr}tX`>s+4_{bc+H%*;zd1L2!x3C=2P$Wt2C;=ALA(QnjuZEH2v2`MG4ZpU5IK~q9!?RzZ~z& z5eaf^D9G%fIV?GBjnuZ|CK9~6F|`yK?cu~>tjbgm1_aZC^6Gw6Ff0mUQ@?e9RzxU{ z18&~4c*M>A06$7Q)4q}GfXko7n}#0{bQr?PhVRMOlLU_-SaEmYX!5lb^}x#)TCl|& z@5fzO{(V2MZMtUYY4$gfDej03C#^|qCD;Lw{8>}CD!?7_dLkB}y_B4&GxLAXGG)+2 zHtvXQ&G@is%ZxgAp(k|eBtcx8q?y}Sf`2JE0Fs=z9-^|kgLO6;Wq~nrTXjixa#xnz z0^~;|tQ|Lb9zdVjkb;T|Cf__zK0g#5jQ~1R?QpSyG3#MSNDk~KA|f)4Fu?Ku+A1HZ zb685Nz6rRR9x_aI5ni=vWq{iaVh3Lm8S+(ju4SoIcnvtPg^FI zpw~;eR7%>~5wD22Qz#RGUOGucyiTLnwY{GAH<}N0d^;!3d^M6UHIGokq~A_=3ftN; z(aNRxllk6|W=m}@1fdCpzs>eG!JI_>z4z;##&NK`FBz`xo5f7@5H1r2(`C)=L(Lk{ zlRi8Fqzs6%EmFCU-k+Xg$!7*Q zbEjFuClfu5(=0x)T-MdmRA0EpE)b<3%|2YjCe{~N+X!8H!+ zjqf4+h;A8<<6kXmuX_7w2cHL=Y~YDuUT7{Azxj3JhmiZ}ikmn&(1ZX-0?J{6>lu5M z<-Es097YY{dkmxqB&`~6IQxz(4Y|0loOTEat~)pwpz)r>;|g&(pidoRbaY$Vo8s;B zEXU$07d5cCdnqQl(c>>0KUwRirTSzI=6k1v{Sob^Mle;pCCJ(}|izGFmgIMD$<0{H2Z z76iUfhq`b5OCp?~Eh(WXKg_O$feE5OqE*uQuc8}zc3uwV6@O&g$?w-3+PGv?OPcBt!aQY4)jvud0n3j!qM{a-3hynxcmoh{@mgm zX-uW-I#K~oN*+1{ZAxBcW$S#ShUVsZu_xD)9|XC%#+K=E0YD(S424^F{|lS%NJE2Z zKPLj|{?e?6W%?J>8vQr|bU+FG)~d=T0SM!cj54lZNKaO*qiw_+AjYT8e_A%@Rp5KR zM|OV4j0?2T(J8B#*(X$~q&?FzG|3Rz^9K8T&*Uu;$ozg`K!$XE8^GI|k|g6WnYlC@ zeM|=|q>q6!Gq@#}?vCd)cw4Ny88BtPh%N@mMUk}uaDHAH)lqhN2hgtevtYK{ASaDS zE*-F1Now-!K)Gk}BsJA+M0E@ML>Tvbs+x;qQBzdzqd{B=O=aB;Nn0X}ivRIc`J*Go z_q;0gF}9(GkW#Q^zKQ~kV~pY|$x2i)KR`A83KWCd>hBDNI#Vnd2I{BnYT&4b8F0jY z>_eJd0OsR`h5cz*#PAw>zM%vfU~zf?6R9O5PcxKX$7|BzxR)zmvvNOlQ)^Xr-LYy% zHyaoKLgYFDiL?`w1+oUDlLx?1<v$>e+^FYkJ+?PGkNKLdTp*e^M_wE?#!Fk+=P*hejB8t&Z*AnUJjz8rP+vichc$FG=3m_Sjg^drjbEH6C03s?Z8Y(4Ko$*HOPc|nH03+51`N0h)ewrcyuf<<;J zCC-XU)oO?QMJkII7_7PVbbrFJb^PtyH;95uSxd_@iu&o^;MxHRht&aajspH&L!aKtn+F?G5L8IgcclNqa(d%cxppP!Q9=0{^k5-MLXD9Haapw z#-&?-*730-0V=kZDb~qA|IEEnYzj6iMZIc>@2ux*T@ciSi}d~^T&DVKSL@Es67CrNc5`sBfs?HMxW#f!;icY?nlDX;ALD^$o(s?m zYl0S^Q)N%N1#uOB>D%>3R?;II@Hz<``1rFNVhqVEMjP&|9y>}z-iOPrJEB^w`BG+@ zWq6MyG4HK5FbZN8gA*Awfc&!Fs2WWm3o=fUtS1D|0QPfKnc=77hNA486VRuwC!LI0 zDyQoiD_($dFU(%&ctm7&e>*d_i70y56Q^}Af`Q2w9FC!d*qN3V5s*x4GN2o>$MF^_ zd$pDbP`kaIY1{ezXLo!02}`f_IEJ@}SSM=wDq}-Pl2}R%;xWFlIn33#Qfanj=v5m% zh^pr1y{$n%;=#U+hm!=fTVk=!ugIa#;49z%Rc8HV-f^bG7k^p*X9OsWylyAM$W zQeGB=C~6vNDNqeGvPniy54RsS?Z5}%z15C34__(NNTNR+%YV;pfDl0d&c|o|?V@xg zitDj5jf%jDLoSP)K=9ytyN(;PPC-%H1lX>@p{rBtY{d)o z5=7@B)i574$}hh$OPCNo2W-W*4}h4YC;Q13o_IrJzK<#8S*wvcIjKi~^Zn;l<8a#z zVZeHupmOkKqCtI_KSsS#v#|-a(h{Sp_K_t3z*xeW%3jw8AuRf>IdXCo+~tO`vIE90 zLHHt;D%ya{qQ-ShM=o1%C90{5P6C}uBB~oQQOkCza|QpCzSkHR?Y>--3vWLN5D2Fh z*Aa%TI4Rcm6ivwVKa4~Ix{s)YlOLMMKR+QyHnwf^{N!LM-jkxS}-q zhpq&uh*6`EC@w>AJ2Kn{{B7yPhOq0T^n#9x?M6i z2_wvfO3h3GEpn&ou%4?wW!j&G3iw#1bBZJ)f&5k~Ik1ZqKVg}HIR6V)5DGxQ^zU2uGSywJACWzOI4_XPCFUN!Kyp~C4d13k8vfInme z3YL;jWTRh zi0;Zxurq3>#LgVpUyN$AVSkx_37{(g@0Q=z{jdF?!>Tsa-Ap&q%Jzqk^FP;~!-o;u zFD^!Cr)*;%+NyfhN!%tTMuLhfQA&~56oM$FAK1e+GSx}9EY|tZ3^x|2oti! z5feiDItbL$3vU_Y3Z@2C!@d(WwcTtyNH7U}X=|v2+QFS{;W66aUMLp%D+6270{lKG zTbCl>y^Juz56|lpy9^bsm^bf1otlwUa_T@=Es5d$_wiEtE+3K`P~K8;GNC-)Uk~wP zG@UHe>8`f*piFW}kdXce+8X@tKL3GR>-4la%3VtX6n2{g77&TCa0qq){DZGY`J0nc zAr^zECm49h%m*!o2pYB;HcX6mRP)+pUx%KA+vJZGqEQ{5%kI`aO;TwG8Ow z^*14lcze-Z@U$5xI;(Q|f0WRQqB>kPSO0MGXu0iJ5Gxz4^FfMG8`NAR1VnjOYga(V zE_Eh~)j~v5EXl|U#nUOG^8@sGa`9t=H|sEv{#W0Cw#)W+_2%j#)mxSythxz7-c7kZv}|%va;y|cL{Hw^iw=~G_b?FJ&wb~_uNGC zcu!OsJhi&8?KA#rEdfl47;InxO#fYBcGnw2{f=<;4#bF>w3s>xLQ5{CLkbKD@pOOJqm)hHlkCZ2`kqwWC zdA+Rj8Sq55e|wzvZsVT>C^))#z>?;)OX9Yk&EBIyRrUGvXQ%sPKukgbg~osO0-|*Q z#66TOEU4!fS*W0nr$w9jW+y702K#8Bch%Tpymk9Wzx}67=KKVGxidZhj59YrN#%O! zzTE7TLeq=wqGJaH=R;3ehykh&O56@NQeH=LNRJr^)BjUOA;<`a6mGwDIrBO&#>y=% z`r^v}da>E!p#2tYVtX?!WTj^Pbb@?hicey!WsPd!}&fh`Ms9N?eOX zu%m`k_9HSk;l|1`<0x&ct6a3#b0a%!#T+uoj0#AmA$VWi=V!JI^KV_%ogDyyWLL~q zG+zWb@d0zByA3q$Ai0Gdmn{qOCcEC?)x=>X4~dOp;#zankE=t?7q?&kIXJi~^c_QKxv!y%2W4f>K323|#Qjto?CTmluG>PGR9XO(Xq_1=0!C-V5x% zj=&>gxM1l5Wk4d0y2SRe?|(L_f5{6+P7HSgu@Y9PsohqWL$MTSIZBwoK^P+y&-!C7dm1vqmq9XbwPsi>%&eIH@n$nrYnLM=1&K8FL` zlyQlPAuAWB&$0`4c& z0=mLXi;6q#=Njj7=&K^r1`FvzF+wrG92Z+V%BQ8@GmK9f0Y1e^<30FkpBt^a{tt46 z!YsLl;W8H__*o*Bi47|T9Ou)6R`3Fxd}e!BuXhL`ZuK844N`|hsG9ZSlvczD&61Ts zTf&hV$x_{2ODn}mzTX7fZ7+`14+2n#O`vTMerE3L{ic{!Czj)Ao z*A`+4p6&_VJgA!jrGDh+4oh~NAW^t% zj#MF|jTf?o2v%_+o%0PasrE4qFwF>=@&;@9Mv^>EV zC<#*;0r4RO*J>T8RmtB+vMdI2m4ZPwg7m%Lu8X&}(p_b6>=9#H*cXl><~CrU#$BY= zhcPF=)k1^^eKf6ma!yJR?!a*q7~B#aE$-sd5Wz9y-Une8fR?B`5a=%k0D8v_alBL* zA6Y#uI>jt+Gqg0XKbP=7K>Zmi;AEvWx4ax>`$95(dYe7Ar>Cb2QRC{Bi>YcZh#RNG zz;^(rSvOKxUx?K~aNY2qO{1C&R!z^+1@?VNnS>O>^Qa}ELAPP-kviD@vV4p-S50UF zpA_zM!Nyf8ajdxFHl?5GtD^FQkRdN%aGSqloo_K48~uvvXXR;~wBU}TM6ij%X244V zmvmo6pE~UF1NYl!fhS%D2F7!MqRf#YjV0m72MjCX-9+8y$$BC70<9*4Z4M@YS*;pQ zR7pcEKv*B$z<1Xp!{p*nV<1oGHi`naC*h_uMqQ&d2xnc1?xHpYGU`Mz1SGogO zOc}xKOmY*6+fO;N8HEnsAk8vZ)hABPCZ?449w>6sgt#xWWL@WzU8) z;l^K%B&q=r!g!Vq1QQ5Q=>hGe}uU&-lv)ASk}dK$oWRA8RRv9{L>w0NE$< z*bl2XiI@n6Q9u!HJhAzbO2xZ*>m^5%YU=I)9GPn`uG0tbRk9*0I^8(`p7$5p^pm^X z-lJk=?4^wPwiWx)bRN7pJuhY*>5CNk!M-pQlE_zw+{PCL$dhGmWTRd_uYP+QNuJ&) zmy9*$^Og~xtg{EVnY`JKLSWloMp(DhjrPiJh1nVxBE|T|O@*&sV=Z4JS0Fw8wy|&F zE;HL-aJSzS2#(Qu`Tzwo@51#$_jMNpY##~*5gZO18a$$T;$9S8L2$7ax$F~{vNdBH z{M`2G{{T6u^*uTO&>Q+l0+}<|c5Z!#N#o7D_s4o#EWfW_|ERgl<6jC2R$w`LsO;@m z)5P+;K4wwB4jBU`5~#vQp*8u-3S;YtS}og8MnDy4ZZR!Pd)8*HW*w_d6opI zXsqJK{y{}qB}NP?f$?w-aLR_XWRZ%q-^Aw;Krr{f7LZ;n2Z`un1HzrwFK^HKuGh9^ zbsYwPd2CUcD$JEmVUYNGUh$zmE z0puO!1`Xd4`3UvZD!9`zN{Wh``Y*N_cMWABjvNzQhnch`FH8h z8wd;JA1ca=@`Is*`?Zu$lQR*(0L_7u5r=Eac_CGtIJph4pA|f2m_#Y1a*4^;{AHGh z`15nB&9e5roI*F+#7}bWzL3wm&b>qywh~c@`1wDMq)sqimW2~$#%W-v%~F91^;g|e zT5_n|LCkVQ_UB%dcx+-Fw#$KH1d=6K874ajv6jACKB(L&li|kMVUVkXjIifwHQ%AtD06KfH(FX| z@2_{I^m0j5v!u<@*fh`6<&zVOiqzyfW@?PClV;zLjuTd;$zcoOn`#6S)%XE50q<_c zr#E(sYR*TK80Y8bH$M{;9RYVf1t$}BU+61IEiL?U!9yl2t7aY!EK|j|a3LWfmMg6d zPNsIC40nV78!Q6B7JwvrOyG3gG*(2~DFUNXr{9Hn{hEkQo%ya_i|K5{#_q0@yJL-o znU&{ydFR#BzhN;5Qr){q;W_mp@+F(Us4@v1a ztDC2xka=pKU=Cfy_sv2`y9z`R`d6~(t!*5j+JoFpHJr$CFUu7o{>|Xsq2u&YX2iz0Nr3!$lNIVQHKgZr*L-P&jWxI+rK;!}478IX zxNG`wP1q7!5vpw}MWLzBgeWKRbxSs90DCGWFYkP~#-nexT3iz_A-p3L5L*Fmo#{8e z%cYnhX7AU0AI~21#I>3ob3H06*>ZDUm;%;N=vz=f2fD5G;;k1ht zE?vAjQcGP`O0AyH`^M2p0Xe6+WO!Ne@SZ{Kc)1W6(>xPM6O>kwzA)zJvj<#-z~_?l z7G23g4$zoDGDe2fKNrMVvY?KtELpk(IzF;>Cl;ay_z~Y>T~i5 zQ}Xuk?x0XjU}zo*m=`zJP-8%@O~81^!5Stue0DBLwgKeH3?Z|&`vVEMXe=x&B`g&| zpQ2esZQ6QyMoI8ixqxxRMC(nTUU<45#D4Wq=QY16rJsjJIcs^5c|XK}aunN$@2boB zV5&!BA;jdzMr2AF5!Y2WX`w>@I}$t8)TZ28>g{Najuu;7Jgbf>R_N_U2Hs{|Z3!$w zQnD4zfc~dQ$JSa+bY%tAG*^*A-TzLk@)e*G|G^)@)W#?z~m#t2CZ zI;qHDrMOUc)v5#s^(!29ISGm2Zi|LNift{S4#MdWh|5{y|xgGM>N2(;9WT zzx#U_S;myjXW$KpvyomDfo!H@zKz1-zB8RV`+Y4Roqp2n`dsAh(iK|e!UsFWQEpXv_1eOKccWk1*P^(nsCQ+B1TtmlE|c>G z6?{yHgQ{*Yx2wdOEENX!X-qE+*Vz?f|Jzs>arZ#hm+ei)KvMMCiJ^bf0jsFXd$>Wt zAE<|`;{&Enhv&arzRh>ltMS6q@e|gew(a0-ByKF#m}*c6ws~~L^x+&;34S;~$xw~* z#u%F{lC8|s0MUp>POr8WA+Ti3iY$4j`HvxJCK<2At5oE7fK@JivYAn%!Wa|f}n|3l*yV=8#A&~Z69?m^0bXeLjN3Wzor+X<63WNh_;IQ%iL+%zaf_yev3QrQaNTV zwt`3t7qVmZWE;q*N_e)J+Wy_VJPlPBKHiQ!pPbW$uFaOH^-TKR(#8nj1&_2h(b@L7 zQa7=#8~FDF;Y~yGen(4%4JED^tRam}tfvf8zg*31CQ5{Rwdd(d{$uv*MpW_AM(Rnr z<1EMV*_G+OW3sge6Wp`ObH$#I)0;b))VsNXQBOZ>GV0H8&U5W1&TlzhkVxG1eY=`K zD!;hB2Gj;nWUNBvI_;=lvxQsjHjw6KjjQ|8 zlU2j|5=nITloA*stbNu+=!$AjydZ9GiLOPyf-acV;6$Q63RN(LQDPw9+m9XE%xC;f zx&J^;tYrZIjL+k9JTGZluWRN|rB+EnK6`BGiuHAO))f4e$@Z!FMc*@S#DW{K*uxvc z#HoyD2`|nWPUAZouPF-^L{EMEybQRpRty3D*aO%3@Bbc6z{h(d+l^B8;{#`rCp_QC zKqCz3<>A$4qy#v4!&mE8rBM&PQDms*=?uwDPmxj9=fTBm39@_L zjA5Sxk`rIx;s$d#2X!b?y82rvJBe0CP?U zELam~hEZ=pdwnJ`p|0k^aAD8Qyu`Z;>ij)D>)S?AXhEAD*e|ELAX!3Q+YoN{nTg{f zrU8-u*OK|)4OmEnBNPAbxmIEwb?$=qQIzjBWPL<9$YfwU*=M2WQ~GS|Ch;17(Nq*&!HWquTQ3=U z4N()o8OHfh#p09Jd|Z+gCMTbEc3xtWl*0|Jwg>7vKO9@8Y3LX7**Ob2lzTDatqj4H zGP})XP&SY7t{3g!h7%oq_6*Rt_EQaQaM&g{P9gjL(HeuP=&yVF7v=$OZNCC!VLc^& ztU1D%RQZrr*Z=+FLCwuK=MJNoy^Rp_35#ziJ0HZZuab}%$x?d?o_QP(`UPEWPnm%q zwxCtgoI43f-AczWmK12@y?8Oho%3agfgK-mbv zO4%GxIwrjHu9ssxKyNa-d3V(d0~;F_x=d3ptw3mmmA*R?hp_K=usOY%3zjslFet-YJml0%sYyRkp*X}aQLPBNDW&0bSEOs8@93%qahUyIX({G!VvHPi*GSeTglkDFGCx`y0NmLuK_ zi8&u9`yan++!}mW)vGyi9I9%~1U-aJ?lEHEEad#klV3HQ#4U`R7ioB5`GrNc1b@35 zubz0;m0Ya+%ct3|Tsftr)-5EDQk)+QniNqQP<6x`b6W`nF_;5cG$PC!<^hOt7VRu@ zulj)Q5}zE?RpXOUxOg@w;o(qXkn^M@mH0D;yo=bC8Gr8<(G`zq+_l@=3!7 zr}cSqSI8YQE=Akzr>E|`bz}cNjQ#?L*#I6=UmP3gQ~s{XV^z9OQWuF%#Sy?4b3T+d z_i+PnI}$(D1sgn#3{_K^H^mx~{~0D`=O}-x?r>g17XmOH&5$^`ILli2d`t_oY+x2! zC~ahMptqKtdxhgh^|nW4$0x6lKE*AR+ZD)3)d}KD>8qo5S@Lvj2-YgrX=(#Y>OASi zD-hsA6LWS(5zKsxWiwYPk~D8t+4kf~eYzL|$&%t3o&%UVaaRr8P*f67)vo{QI>mdy zIzSWTdgbWMdH8rf`@6B@FSz>;>izQ~93b~Yj~PcQFfhpRu%gNMTRe@mIng^;CRf|F z7`~R>in6kx>}(;H_A^m6WRy?a>YBNbM8mkRuokcc4m)Cl5272C>H3YL=BIHi&4K}n^C4`!hXFV0b2roQ`Q zYaFNPqC{#A!&l!OOz6{pSU>$)ob4$SwV!Pi!#}awRJw9R_+Yh-`E&VmP%aa?TQ z+EC4cZ^QrIq?yypC}#`2_emX{Tb^06#+2bAP1W)Ev#FD%N3@!c%b>2sX)kk`C%Ki$ z8$#=JM@yf#GVInhPsjWrA@}+Op+S^kEuVB1p|pLR7Po5Hapy|3uUp@U4QDCvsGt^yu(bZUK{jkMUPF6zgX!47EN%pVZz?Twg{Ko7pX3}#w+0N%? z5y6j7!GbgEatc|RvIYDoWO}@<^-#y4_KlNwuhlG?K5CpyWgOpPrP~NK0w{frH(+p3 z!gj6kmAy$+%S9yPm$WpH?icDHdy5Pwc-NQpo=?F@XV=$~>MmR-?OUkrz$h;u9hIZ9 zV~6nO=4SoG>qMkE#oQJ^{Qn0&|L1=(O|T!v(n0_QHVP>(x_+yxx>VvlItIb(gm+6O zD~m37SHp2s8_d_;35K3XER~hK^w$$iJV(2`Ztcglc2$2pwhS1Xyih~h=?7MO!7(tL zT-=Pp?(LFdB?(}G7DwXX7e8xWu=^cm?5w&dp_GN-Q@KtwIQ*of?;#NwN9$kOrKM_5 zr?cc_Rw$cNDYP@o4qL%^O>P<2E(p(2Dbur^?b=KGTEELsSmL{U=qhQct43sgySU{? zPCRIk&FZj-Sv=ih>=~A2;|mhWdn?`QwZaM(EM@i7-vfflVdQR_T&)>6Ii{MnZ66{{ zVwJ?cTPz#;J#uAvUPwc!Uav0$9*bYsYhk7dWzc!P@^%~AL@f7<;Zvq&qB0k_%kD!B z?g!Cc8_kTU5$YCsi@Aut(RPKKDOi{a=Muk@2;sbJ;POa5dcnGmy$&pk%?~Wj5>d!e zzUuz2LgMFDYyHB2uvtDpchQbDD~ld%#xdiZ-qiMzPM=7XCTj z@cX=)&Raz%xu-1cMT_52;v_NKovii3w1=b&V_JhDX{;fy`uh zbTjliIi$N@6UZ^S;7RB6}2GIXn45g?&?dOJxL7~fp-tfE0D~4A?R1Ix z-O;zVx98hEIJB&Jfr%OAlfqDf zRW5au*F)^J!n2_Pvsj3N=6I=PqoU5$it}lza?jO1Cn?zBt51iqlN*!w5&Frh z4<@ca77P5i%#p5MAmgrcPwj3UteU-q!ACBc>B7MdCeCWoXm59Zt{KkKat4W`3Y)c2 z^|Kj6Gd1j@8?k2VEA>c~cF_#wFDm(_S^|Rz`@V_hpTT+t>9r+dIXb1-^nr|c6J%8< z18XA_4_(h;zK?f3`u!-td>uX{ns)+dibBuSzl)C~rPJS^RfNCa3V6Yp*t)S^&V4p^ z49!aCr^i`GqR`2Woqu{1+;KS)*VTr5)YQTHvd28zSw$;x;Z0w=fXN$XD`5H-;bhLD zRe6`%8{7WKWNOs_+praaLJf^bvmZQa-QXpp?YCDY$<}okCIYVxH=$0buJ1B4EpZWEY~c7EUy5&HX6sDNPykBR~?0IZp{&9 zod1xC|6%g|-fBhqS5dvFqa$MXmr-|s1J?$L<|z}HeXeWY0=H$>*cy~ih0Cl55jqp! zA}lfjF!&!R{l6~(Yi|RZ)_jSqtgLiI=ik$sUUW9s7r=6XxqvBBlOW2@&Q2iZl~GAa z$=@4FXDy5S6)XQU|7^JdB=GAnW#F`(==V8ftutcg9Obqah-4>Y<=KYt`3*2US3B4V zqRba?)$(@0-*>$Z@{3Yyz)q`|9>gZLqD;Iv3)a?tj1SDE3c+`g3-pv`d5~SzRiza! z4`*XQK5!9;QE{pRm7JIKS=T!;z|y1Z#rX#lACi~1Zs&`_!E}gb!sUI9%!VEzsX}J_ z`f=gD;USB`PE^^N87QALzIP_?&lRRNNEvDd3}tYB^sHdrmI5`aY8bT8< z-4O+M3&Q!j^&Z9nMe;$33^t-W*wI|LdXV1}H^Y@K2e#;`D5+ z_CjU@!fJK-Dr0>CWzB_fXo8^wM^JWPnZX6$ON~5FFDtNmjOrtHby}7$VkL`-kdQk% z$A?j22~R%M;klDl7Of6Psx%^E41GWLJVt~bI?}U|6V%-gZth$NefiwjUKWUMlRZc_ z+02q{0iDfzk7AGBT~eA%J}g*Uv~=_+%aROOSq!NTcjSr`YNEX(2E(E?^#i5XO(AV( zuaL8)=C;E8IfoX`P_?zK906{32bU8aBSyAL?8Ia{^OxF4%t-RBm)vtFyhL`n^+%Ygk!EG*oqAncN5 z!w4(*8^u{8orCd|6xs2yV&*(A$}i02cXuaE;YW(G_!mq< z6nI}gVvwwYk=yq`2}JY;C3h07^FcX6w>`#f7QkcH#Si6ELW}nG=1utQfoOnII-x&i z>eROj#>3+6yn7Fkm(Q0JViymT9#ZRpzl(1UP^?!U+N7-#@}2q~My`8Ttsw7V4h{6} z9Y22T1v<1L9+x|%ZwHlyXDqUOP-)n;+@2q=sQ^(KnxG>j_ZA5G*0R;=GBBF8y}7^7 zw{zxvX@17SPboTgscYZnll1q)|IZ%q=jH4Z7DQ|Zk;uKRvj9dbA<(G2EocSF$nGDs zKE1D)Y6Y6qI@mvVgAxQh*4|nFvP2=~ogAe1wcq>gDZ7rA~%B=QpxF+4_-S&h-&YCJn>TqmU+vRVeeiXCg1C0pC%- zIi`lgOEey6CvtrX48(zcIfwYAf zAH6S)cmY%V3lfdYOL31oZ6hta8TlX71-n+OjbSpj37Qh>>f{7VCG6yx8LVX|9V}U+ zh`BHumI9~T92I|cP@^pUnC&hlN0e7^am1vj_$19S$WQ!PFgfJ4o`p%L87P<4su zXz!6iU03o~yB>=pAUGHnGPwXqz=fpVeo0I$MLz_>p2Gm4z0r|XvCZp#Nm38k!)>T_ z$Q)IJ4$o5aom7jgo)k9I_2Xk7lTZtnZk3=*e_-!JOX8K(}971w3 zh3Ft{Gcz`p2jY#JTF&sZvrzBggKe+VE&FN@`z0*f?s8(Jdrd?rwde5eTk__PHhZ+| zilTCn?FtCf($O>kSc?ola|{@Q(>Qgir5(hG|FOD;oKb)(un;R@)1V3fBC{W3lz zL$D=@Nk%)Y+VqM}7`$=n56w>iDX}=$+vY*;Q7QNGwY^$5M^RUkmQlx>{poS?FN??R z!d&f@K8%`6areT*aZ08DS+k-^Xp~MwF=X=@wydTGW4cJbFHuvj7qIc2|JHQ?W{@*% zUvv9a@q8;t_;6e2b!u?K7ra@fs4;x{P^h(XgG>1mVZFv9nS!ZHNK{mG>iIi8?^`~b z=Xpwa6+-n?^(Dd8)<-Wm^xwFX>%c)AvK=ie8{w??~I$94_?DhvgJ3|>v zI>M96s$YVrmF%N5zL!%Q2w&313FF8@*`{mzqo>CGq-eb%YZKwy@JfP%07W`mX#VVr zqVvhLk6*vRK(B^hw72?MmGUEg?42bDxp0L4czH~*t2}HwrF8Rs%(QgW_2-x%9sHR@ z=N0Wm@T(uL%b2_(SS6*UJ^oNIHC_{>?RSedCg}??WmPTkK+kBV=dIw)<=I)cJkM%4 z1KS8OucPn?lhc`f9?FpmZb{;yW0LmK|KQd?XBOm-^P7SFflAU_J|Xzt(y~MYtrQn) zX=g0mj^bU)@aE#Vp&0$w8V{)ic_na>W~=hcwiYXUV7q)6c>_%p3Z zzKCxGzdGH1%}>CxGo%w>u8sLH$3lFcLy>Gc^3V={n?Cvf@%5HbQTXllHw;6gw4`)* zNjK6d-QC^YAu32Sbcuj;58d6}-Ad=s@QlCv+~?e9t^avm^1`)H;hOKY_h;{mx@*b2 zy3|!9WA^}PX_IvfwP1wXY&vxL@xJ}xY;B2jjBKgQ7kBq*DTTjuw}CxC`oQzbk$VjV zB9P~FMiUHcI)GnvKtg2miqWae(=_d%OU#%s(m&#PGs`@#Rd+*Z$w^f?SSoAWwJNX^ zZ~)5b#vxB*9Zy15Z0QHHS&1p$n|82jyRh0L>|@aMeHY+FGw*CK59J;#G^BTFr&2u> z@2GrqwD|5r0f1`c#W{L|wj2J>5kuVuCd}R<_LViLU0m&O9ln5nA1c*ja@R!SLB2SA zFx(vfP)};wfgE;kpcka0&kt5O;PmpfAeVq)@Gec-||98ZQ5iyf7chx}@2dtnS z{3b+9M@a~3Oe#4`wlUDmMC0c}ac&-(;w%=Z}2&G!txKt-&7?KFWi(2vUGMjuQ) zt+}6^N5i`StG!*Otf7HRxYpDk71?;DncuyfC7af%F1BN8VQzj%St2d}m&r|rZejbg zSDwX+4xFmWXXbT83;!h{tv*~^hvakRR++kR-FaN3WOl1;Qicq)2D7O4>)z)?o>hc0 z-PjtS(kL+Vr#Tj$@Nd84oLBYpYpB_cI93X+{0u4TEb-b1;0X;2t+JjHSIFjo*GWs` zbz0?x*U%wxxhc_*QBVLP-u++d*^4!D>&<>fqyIEjn-?=9quSsel=kX}E?ragdOSEd zIL6bsT6DSm?!Q&2sHsgJAt%s7zP&`IE_NI3a8N_)#k$2}#SHp;FC7O1%RwmRHO8pP zoBUZ;m~!JnC$H0j!W9FC)5@wokk!KEYp~tvtJ&ty_=IW1ZrzT7ZWj$*0c7fF^}7I6 zX(h&9uuN*S3T23Za&Z;-VUGB^jRNNpl;nybDk@1p8Fz-wwOX6|(MUe-I|dbV9T)G* zV)yL@r@m0u`CQK*6kHO09fq6()?mv#UB;G7f?u14&7zT9to$u}C|parSWg4^i z_CpTa?F%ER9JgOF%*JDE*F0k!CWq7N%jNP0#dxI16#7#ZIuawX2+Rr<=LBXoV0#Vm z5E#|dz|F*d?M#~9ae#tVgSo+VhJrs9g6YO2w?{JX06xj^H_eLvLXTSWU=&{Yl`6%A;V}5HS#rt zcYQF}YJ9h$Zg7=4P_lw-N?FBdP8{4WtB>%ykP#=;Z zapNYP2Z}tW(64otHLrW8B>-5xVGZkz)<72?+|o%Exj2wRT6L4Sn=)^oR_6%6yD+C{ zgOCx-HkS`+L*feN+zL_gv|)QZ%QE*9RMvU+wO?sfD+w--C>q3ZY`?dJ-Z7Hu2!h^J z51uHtlTV*wG{+g94&F1>@G3T-j50lTM)mwLF;P4Z?k=kx_mzNS0d`?Hdg zXRW&Q@T^Tqg1?H;`j44~nOQ;Id!Vkz!pld^Jm;YLQ{|>(C+U!`BMaiwYuc3|m(9{m zOXyi;;KMLGNq+R%rAOmA++WzCyuG1+8 zs?xZM{RmDTrQ23~!)oXqrlL0e3s0!E@vF?`#}-&&4!0pVdRMrF8^yJ%VgkV zVV!c_-#M~*s~pVpW6t%(+=moU60X8$mQovj9~Z$h_rhKQmDgzxRQNWA$IMe#jW747 zBrP8p1|V!8kcvs*F>Rz+UUhHnB2raJ&BI(f{9XkpEO@px;^$)^GCLvW9h6 z)NJo3m*Zp<$~{0imMSAXy_lmTixL4l02-0_ryKIGMi0&63ZA~Zvlu^Kx?3^uBIo9w zr}2ALE`hv}-;7Ox2~qlRH&lrEOSMYrjur6v1i{;`zB<_R6kq|y+?@U-w{*Z*B?U)O zz*qMXB?BSyHMltZ&iWfwoEB5uJH>Ko6vCGTcck}NmihE`)u3Q|)I~{S(8Re=!4KV1 z?@+UH|MtqL=(hdScTq+5A~}y&Z8`c4=tA(b$F5Sj%NRB|2G6=N_%d0Ngz80)W9+)= zlub~spht1|$LnIZivhr9_1(U{(ae`YD%NKn$&aIS;$y-7rV@(*dYTfsg8#dQ~4@4pmh~NJeNxntB%_K&%(Uq<0yJasXb}Bm(UaP z6L&FLI2l{%Vl|q;$j{pjZUxT46yXEPdD%dx!IOCHa~b~T9K3L9AntLQr)HqJ)rxa6(gP$L{ zPhfR-E!QE<1gq){(@KPu_ zsW#%UC;e=b0t2OA<91R_BEgKO!UFcTv@p+J3Y+t0C>ocj9yg9 zx^R0O_k7|b#&!vO5T>#;2<_0fE{{n%*%5Ck>)v#2|HYI`PT-6^QsOBW5b-?lZ*>a_ z+l&C02hjwZc6meaPTTa)FQvkHSi?WH?G~Es-#oH8%C#E)x}+$htCzC+bYaTg7$!hS zlDTN zEUI1ojWA*_KVB34ht@*jU+;v?Dqwp0&rHx$F?30Yjuq)AA?SoU$nQx4?@SsS8;ws_ zoBoPZg1wFWkh+=8)6*DeTlSB_Wr2nPwUO?Bi`)NuNr(oH3mp(2 zFIL0V6$L`?X*3Y^T|~xY@zbAg|Ni|YxKlJdJlwdbb-r&7*KWR|@AI1@c9(6V_JG&` z6X;t*gcVlY11POS@}SKWPRCcFZKTL9AXWWIoO-|Z3#PRB&Jja@8c$xg3xN7>K_L(wKcO`QN-(3SwsE8 zS#93Du|6otC2sgmBOln&3`Nj?hQHC1&ea=9=b@VpNI-mmI)eybc3B?HIa*5O#ILqh4o8pK*jVk zdeOzi2Noa?z-zNN=Hk;?F6%;CTe)gO0d##_9xzytv@>@nbs7`7kD~bKe$~BQWJ6Rw z6Q}`FE3%kgfn11pvsH_Jqoa3oD+uVec=Zy!G*v6)(`z-H7#s^hwCMf97QN zquei6(czUyFS`)$n?7h=_?7g%ErrE?TLGHjqk2&_EI>z-!cCs~!GPc!I_p}gryS(H zCeHhZ1(|v`4lA&Qik}x%%ymz8rFlDtokFRfUCvD(mv=5Mg`Y*1Rv9KOj9SIok9M zvbH%fTP4-yqlEVz$6WNPJVtlOA%29GYJhaWq;G10+)G8T&Be4(D^g>uGF*2`}ge@SC)0(W29oo+p0V-G@l;pBfQU-4_tQi@;5=CV4d6Jh>Y4u2;b>~P3!XHwG1eYz94iB> z@Lo6#8uG3PUVIhSt9}XyH_=EwqMAI{W;@Vosv({r3Jy$7j$CbgOR3%C)J5xucWt+4 zgz@fR?Acu`#&Gr^tw>#i&nP@7Mx#{@zH{Xp$LgaQxw0%+)LL3!5n)!Zt!(LRbflQx z>OR?-Xp`szGTmcB3d)nCT15C_N&gr>Fg*T;Do7j!9IawlAZxAK`5vnkr;p_HD{kqN zqpyUAwL!t^l|9a_o%LE&XkiPU@ z-%9CNwyiU{L1?W|Bi$1a9b9Kdu(+7=C~hC7x zS{&v(#W9lw*8Fdh>3`c%AtK^{`uciX<#K5AD@rlb_U~P)s-);ogF?}jrd(#IT_0t3=S&F8}RKLBr-h~!KiWC-gC3=2z zy4R0j+`|-RP7}KT^1P21tkh=y_2d(hL^XlcSX=Q!7PhYw$P>|R9kuJ*_#Fqp?8Bhu zknsn=K26blP>R+2=BDqV;R-{fS8D*{PCssPO%n?P)JH~7jFKF@8KtbuZ zL)>x32^$rd_|I~X2^oS6%X@dr3WujGa-2|KXj*~1)ebdjq#D0FZ@eM~1;3Wm!lAS~ zPLFcVP?yq}@q4Sjk-0K!z}UPpib}$#DBx0H=%jRw_pmp=*kZwi`Sx|u^49UeHVzfq zpWpO4^`Bbo>Vvn4U-PIKnsdfFShbKi!53;}(|VLAFO=s+5;F=iazRDy0K7DfyGxN%xdVBY(QgxjQi=m^&#O5(-XMaK$;(O+LEj8K z%2RdZr|tTv4#NewZxhVQ#mINBjO@_C%z1mgpI!iNzQ&OEh%Se1Qvj659wRbe@s{#n zu&%AeYK)neAR-1rL49(rl}cz!%!W(!S<3(tw1`cY1<3^)?RkGm0d~;9W#~G_H@g&L zYHYQGboM2M?6KEv-ji?P;%UH*vdc^SC)6432dBaNwqk(yo4p-3F9z(T)=9rlIOQ!h zsFTktnLU3HAXz!4MVUvr8)KJUPFlJ};$&Q8Sizt=M(omeWNrA`Z$yIn-9yAa_IWDM zO5~q8^Dkb}C=0rkVUat1{FPHgA*{f1sCV-~AN6gE3XkW5E2ZQkDQmZP-UwTV zO6*j~ZreNnU@Y}LQWgsfi^fMNDM~`}BE9%#1wnrE7wx%$b^@uWd_E{2WHlyjmbX`@ zOQy=oelk@vI3cK8IEN4-kNk1}r1(?g6m9go*>^`p4gQLp6!JybsrnHALPBJDp!UjL z_9FLQ5L4-zNqEOH8|(eAe3;x1CrQj+6v`WoT29_aqUh z`ex0IB4uG_K9l}BmhLVswZ*Zs3u{j?{kqM?ZZXV%pT>mT4jChc-=O=kcxTw&8M&T% zvj8`k?7C6MJ-x3(Y0<@JDOZ&!LYpcVM!v<-Z5EX?s$v{tiW);X89L~3n}x#=8pTi@ z_h5tU6hn(avF8ojuvOIm25AbbET1nvm#OPhx*X9_Ixa$CUcBX4YGT0TCxvMC=YUyn zIXF5a39?ibq5-;DZ9VGq!=SPv`xcJs&(ME}>FO=q*WvE)1uVAPiZHS&-?>(nhvha@ zxu03fxuR%!Nxo$PoOn!5N-7}gQRF?x^z2H}L#cb=H#tLBI_d4IEbN zK6M2T-`GKH)LSB<9>>p2SL2oFMz$mAAMsTS1H4a&_-rk+f|S!^+-_4bq8qz}Q3`8_ z9~tNil*|~J>wtR5uz@Z?gr7GE=rJ0IRJA~iKbOc(x`l80{|LB<+NarLgYCku8N0t9 z6`W1+6EW)e0_!^~bJpsNmY1|(wU_Ns`;KMV;=o%_CnBQJW|#@HDyd%^?C0p3yd1jF znqB%RnKw(I+)rU)f=mG{qz*>53Cjr`T9W2=pa8CG&!Vw zZq1OL>cR-|*Niy+UO%neHs>$5m;o`!j@2z`26xR}wLq_JK)&A3lk&M{Vs<(hWa{f} z9?q%Nvfu4H!?)U;TeMW?81NOL3b#{8D%9iBB?PQJdQ{t6(L-42=K@cu9AveVE?GD* zM!z4Rf|Iku3Qp|yv|UpcFo1hLmMa~oDr&2yWR8xG`TFpWR1S0BZxok{Y*(9`5$}(}H6hI&_izg4&QA%sDn!E{OOzW*A}(2Va4nBnzwG zn6s+%(lST&r1mVoVg33)uw#f>f+$fMA597}_`ER1f=6GFxRW5JLKTwtct_SIM*edc z^}~Af#gE86ZeD@YBF7{qjeq1FrEnmxJf~-H!?^$MsFCpG(27C%9uIF+JbFNa#XDZ7 zRzABF^su|CVV=w1qYuKE9N>UDpwcc7sR&DTkHd2m-+s9c`SjEgpUav}DjGlJn;bjO zVDt?Qr5*2Dr;_gJIR4Oav^%5@-#8zwt4K}2|07Yg85<`mCx=qQ z!Rd0!cR(h`5bFMC86JB6RJ=U6G=DGKYpXi~;K<8RHhh8jb|ceeKP{EVi{&9}RoReJ zvowbHYx3MX`OS$qn8&-@@Aa7CRG9;q3gVx_McxA$p6D^uzK2kx=aI+Jh+Bn_BAct~ zN}!T0EWM_)!M^P?ey;VG*?u?lAY%=cz~oj46Ia#HAL~maFbhR`l;#5 z(U_%I4>M(EtBDI$N0A0)#V@8<)XqFA$9eGd0C?0+xvM;J7l4~^Mx73oRjo-fJV zou64$Oh|LW9Qk^Mo2vNv`hGpb<*}bC*>SQ_h7MFkdG(__*xC6}1pJddEwRmkgzf{Og zWC8;#qVqAp7DiOs(le(};x#GZ+HaHjF=(Ij1ZR^I5_O!h4Jmg^eCzXOf)Gk-jUuuP z)&mvHVD%+&2n_3UBjtQ6DBn^EVuOfT-R`o?a%`ko@*K*>7-F&CBP?d}HL5j*`j1|o zF?ef?u^Ck+J%8^0!2q}LoXMdwW&HOSR#F*>hARLr)4q!lXbsR1*r5J=djlUBd#3Y& zT0VEsm21d_*Tfc(ecXtNZh5VdXa!9u2`-t0r90d3?t50B^?x;|)_QndYw_Fp3Lz4u zOW0pk4>6jV2jvxl3Hu5noE@&kbTWu%`9M3vR#Il$aL+D#^@+|ZB>@)44C0!SD66Zh z(8e?AGTnNVJX3{<@$vpXJfrB3vE;nZPnf@$L$yC~&Rr@Xqcs8Lj88=t5wFe^HO>)O!=}qZ0G0jiZM-Mq_mHNldux;y1DhbT13e zqd<^9GNDemg@3HfoY5iofVf$TnQ`C&`s;A9xzRDt{f|b)`M7;Z+>+Zr(X-W;`hO0K zxxLWdXaCrkKEEJwG-6RUiO2`tej7z$yCro{nf>Q3`egV|zI4cK-o(c-Yc$mDV{wx3W|=6+W|4Z2 z>F$G7dU5tkzJC)e+7zm@Vej+o*u~jg6{P8(Ws>*^c$Zs6SFdSx_8>XZgX5+(XWNvXb$|b}nsm%; zWFUd5@_TN7UQ<)Ei>0C*)1HSL-Xu>XAD^Z#4hwJ3TA#V0RT?)(t*iRbBTRf08PHJ@NrJfE&Ev$yy7~-vj3fSoC4<@nYc+-*)PigqfTFl=q1Lv{>&}v^bK9 zL4p~A%s~LnfN@s2EwJc&J-6WiA*{@Hu$)A> zoym!Vc-H#V#Dpx=;Cug!Tpanut1IMoOkqJR>xxfg9FD9bnYGvTIZ3NZxQUbwX+i}+ zp%9Vf=eq!Ly$!)c@<}U!`tMkAJE=S89rd^ZR_(fUO)6vTPZc zBU3}LCkS^8qWxAUOmm9Z6k;C&%QeSIV~$>X2XC<7?xoVb`LZh99SJo?lM~47DpAGj zW&_d}1v@aR;_9?k*0TW`&2-TMyYon6>6#x2m2`#@*w(Fh&Qe^|5z(;iC|1n=xart- zP?^gL(1l3vD{4D5h_(Y2=KLAr*z@?%gRC5|!GB(vE`?cEwe~YvaM$&JQVGgWwmkBi zPBLRIl9R1ja0<{jE>h79zP;p=RQ;9>Q38Jm(FGHfCqMDz2`xJ!m%KyS)FS&Vm(GUV zBl)#F8PacqodCakHQ7F5Z;e!-ksN0qdlh!^U?TwEjg9|lIW%_-8b`$~A@UC31-&w= z$+bq(t2gUL7ukD-rriT7Ko)ay_csskQZ>nJ!HmphP$*K197#;M`+I7HdyGu^G zfq9Q(BDiiCq24Po;Cf(I%?p}Qsj?hOfP@Px`!Q+866k8x zg4KUt=#!hBo=yh>87I6;vWWc(rVAZW_*s4UC35>2&>C6vgMXv^FAXo{% z#Lk9`F-Oae<9*W=uA&#RMBX6905jqy8yZ}~)$KYuEFB{W808w9HXJs~1Z$vZT5lA5 z;&yX`?|-61a3hry%UM8ifsDabnFX?F)&;>x!mg-%QV)ACk8a{UaFN<>%~A4}pK`nd zvEPsl_-5}dzOW@7h{-Uz5?W}t6D$0c{?ij}4HzaT(>-P5=8rdH3_2ZRmSwAA;ptpy+W` zouB~JdjP_M<*)BHA9z6nw>2vm`)9sNx&D=(YWJIB&KPAYG0$ftFX;w`wQ6v+Sw|`s z+|X+CHB$TMzyYn-f^BY|;+qszaBjsnIvmZA!~c{pdg{LK{G#FT6l;R>}c& z_KeQj6sHVY{d6SV6gjaxBkN;mPH<;?e1$J@eRm@v(yLqeLBErclhOZ-olbUHC~MSX zy4Oc&g?dSo`&|6;<@dNM=G#G#D-M&I7;Z(rIiu%Mv~ht7B^6%CCDUHXW@%gD#u6KqsPE|#WUtZ1y@WX`$#A3rAZrO~S^9p@LaC=1iy ze*LQ5V)=%p@m&1F-0a}v^V3tz?#}Ut|K|_|LH|-@^z_J&kh6i7nZmAx2|NL>V~oZ8 zPiJ~|cD7Sg*M>Sed{VI_-=P8hA7!m*U%$SumN3-PRuAVK=iN!QPbr_p;uVAiSch*R zA!B9o(@ewOBZ*58>+N_GiRFJ#1!r)}3mX*{OeyAy$1GGQeQ-#8dntI|vPoeiz4(<| zrTZIj73H>GG%wslConT;<^|8KrXl*C4;g34^dLViQA(pbstZ8onim~HBhmdCh<|@i z4cNnEdoFen-S4$p_a`w-H>7no1%;Lf9N;i2@E%vjH^(SKr8-ZUTBEzcy8+o_y}xBD)fLw%WVA&ia~;6qIrr2qEnLqj$IlVO)}V%J9W zr%UqdOL0URrn*MYuR2tb6og4Ari#+Il-tRabD&I8^G1jUK{o9KDRZf6Fg?Len_TbMilKs1r6mU z{?Pmc77CK$y=rk-Zx#WbH3k4FkOgPfWsGAm{=`f~xif{T5WCS_%aYYx5rm)&S5pab z7RH09cb4$<3tp2f=1Ol8S4gOh*AE(qC&5SVzGUkJIb}!uw|(ABLG*gdjqmUjj&eaV z;vwN?3-ZO6CPCj-JCpMJnNrqKfFwAZ6^6lvVA?G;@iY?yL34pj40`(W!33!5e?q*Yb^c52f7>-%y%Q&O+i59+hO5wRCAfT%UpZ(*u-y7 z2v9--{S83j>Q3b94{wAKbPu1OWg^>+&-6=`PDGMK)+W`}3#sjud$gaXsbAn2!DY3w ztB`*&qQSB_?idIsV|qFu|ByJXB8Pe^oAQ~?T=+5O9h=r|50T8_0<^}_^+W5`G9|wo z*YF5Dg~KUu<1<|&wR-1=53p9zL{Vj#3QQY~NMVR?dNR%w`H=2n96_x(s+6MBUs~7_=1xWWk5tV0bs_ns|q1 z`oGC@Ad%Oz!m)0_%G_rc6-|eE;7NE7tD3!X*L=C^>yD|%+CVOk|E<1@@PWf!|qrz6`0WQk@>B0wL$yb%fU#*1R9Vd$W(rhwN-eU^rW+eZH^*eDOM9 zhL7-W_fAF`!i0vP6V~ioC1>eh{;|$JTAD#gZfvx?;iwy8jnHOwD}$#0Wx}RFX)hrr z&+*(HN!J#!_6Gw)=d11vyy@1?{V`4_LY;?@Jp$gHxY~MePV>L5HBd5B6_EL7_)?7B%5>TY8&>@}t&O19m5R~UsVVsRbx%0mEGMKS%;4^_b#j7YSUa9n zM;PYSwe08%joNV`O8*Dfu|PXn;AT}$F)c+`2K82Z`}=?7=8AR|A0840IBKe?g-MZn zy1Kb;(cgBf83o{mA-tKEO;<8Cs_(;smQi5v+t;V4PKpmkQqS{2_Q*OntF^5k%>LMQ z+n*rZ|9TToovCx!R)&3G8zLzwWY4hV>hBFs!)+H-bvqWo5VO-A~#~Y zOh}K(%-v1Mjxjwcdlx@1)d6)W@(|(MmzIgoCEF71R;fc~=%nvd&+lxh z`|kQ4@u&X>hrCy_BLOBdaZd}r8`EKX6;x{2s>D8Gnc9OIyc%+yj=-iEYgAQ4Cq=+WWcI*&V?xc=q=J?4_Ab|zEah7* zy?s%7vGHfhB>bfrHHH#C<1m;npW50A-V@^D=abjy2a7Mi(^>c1eV)>W29O~=NxFWpd%?a2MR*MKk^0=O%J^% zHBA43LAs?ENaGMS3Vq|IE%P9)Uu@XxS<2T^o|HwX4rlHV9P4oj)wDhXU^#7C-g{c% zK>1gsINdU{{?X6Q^qi!xwxQQ!2=?AQTKx$^Kwn3U-!*;P!xO@4O!>rCH1-1l`HBev zV?3)GDkJ&=(j<1mU8xN|%EDEEc>FNdd*$E^xUq_*7}tg)TgtU^c&xt2I{7G%^PbON2M%vR>h z|1y-VcTeU(sR!eg0m*dQ$B*qW>n5s~*-|@1AorPeEoKCDFzf^oSKG9d{3K|{DZG3s zHgoT(m)psJw>mhE_sT-4)=}iwiBb;(^T>f9Y0&_?$!2YYL9OG&t5d9yd^l5s zYJ=RzEZ5d*r>jL*eHqb%`Gw_;|9PUFKT;ca z9-1tac0%B!2rbv?xOG+e~zjrUz$4uB!B9(P6FMRUa_j@MlnS%DC$xHKsIle;@;^QcL z5-pTIlg|2|&58a7Lk74){gSX9h71P=w`I&wwmZ%@3w3RI5^YCQ$z~V%A!h%3oH1>co%9MUf6NR_j?3;`aL_ z{%>0lN-w|6WDNJ9kP+xhR`rvfcYH2>!3U;{Y$)=&)#?iSNzKB530=AK>hayaRBrN$ zJXylIX0EoOP5JdF?>d6#3Y3KfG~As-P%J9W@9hPrtmHC`BTse@LpEm2+B3l~m|l|P zbx}p#?(EP0&ZiyQxOMrM31%sEPBq`LJ~CkTSzQ6*G0CnHrq_XeNP1YmeoCsRKfE%P zpX4;ONR{VvCH8*}n9+eTh>651YjrS4=q_P03Y_P3`OPI&qK3jG6-FPVwD{eaO|i0# z1+AY)^+(`Sl6R)RMk*+4<1UbdKl-`{Z~7fDADP(cMMiGnl@pq|UoYAuFi{Du*$tRN>E!$7ldQ6`wM_=~W<-cHsJ&$+ekR%@iphrNhx;ObgtTy|Kf*jphjgZe z)7wly?_Yj)GyF0WDDB6RXHgL)Liv$+T_gH?!uv;RPLp>8dqR zyk+E%%I$ou1svbyCb7|;RObPxUiMBPC|j7`G?N*E9Y}b}%IfF*j#ZVQ94nE7+jbus zHN{jeWvpK6-k}}m+mt?(h6+DM#0BQV&jeZpbhAUNxMiRK0`GuEUH&B=WMmd!K?8^G z4T)C71#o~&6Y&F^&Qr;LmkpGpep_O-VJqwnUtxd9!yl@_55k){;F&Q0 z)s&h`HP$VNfP6FEELRnOKmp#1X9{0N7PuttzQSM0h~pR;WWAH-|GY{V;%4-1L0FeU zN)?c}Q$$0zC}+m>NIgN2RQHsBPUSD;gn3xAHdSFsXPYIjVyMfq2fwlzd==+mI{xo2 z0M%>y4wQDKJm->2u_ir){fV3?%pN64*Leh{w1#(Q{?`nj(Me-I*e#fz$C00-CJ-ON z#EObfdHAm9z4!V3KK`L;hINS&Jf(Ybdwf7^^!~FsY+o8<={vCH++G<>$mGiJi?J(? zmG~fi!7Q8?s!YY5%U&LV-#!_ZI^vZn{z<v^Y#*9Y(4c;QtO22p+TQA@@QSan zr9h1VUGoyf01x?GXp-&EuO}%E@>jMs+ObUz&lPBDYD^mwSICdc;S0+nU>v$K(zy}r z=L#e>-jo$=GP8v6J7oUai5Xt|f4wRHnXJS?$oN&h+8Gz0Gk98uuA=IrKRAJ{HTNR0 zt;jA8TATKmL=Bm)wqx-&nFvh4ojsv-tbgl>l+$43YtQ>*d1k}4?mI*F61^pw6fHF` z$;n1Q=TaBBf^=IGd_5exBtI`q&`E!s=ixj3{I8`yd)(C>fm#h^H|^J3 z37lH*3oBywuxvCPtbYyQ8Tp5N#is3+6`ku?cR~D|Y>|G7guJAUpu(Os7E=yFVWs&2u<;SH)b_qW5(hh^X-ORMCcT$cRTbv5512hqb@cR}Sg4r%l{3kXw&`|qIHzwF$2c^t2v1U%f z@$2M?xv&_3$91(zz4PNThh854sk9p0tmnL2*-mOPCrjeos1$2Ds zMSQ34@Do&iA1>5b_)+3onhQrD+PV8*wNx?GZa?z%6D*G7G8XL`Uq#-doJPweJQx9c;8kn zhX(4a5dtn*$C?L^hUUXx^!VSPe+P5*O194NAjb5H7PoI^*FBje<8I!rfr%wc`%Fyrv z;(qN=jYbA!Y?3&%a5cK>r4opZjavb&3-|*O#Drohoj3Sc6tUT3H9!_cu=8{Bo6;eT z$cSzxEzSXTxOk)`U0+&O4uxrAF14I_#E0{}Fgig;`CW-|g$>6O9ZsvP1BsD=Ic5Uk zUJEE+WTKeFL__BjBOOw>nLqh4alYyggKO7pxC&=&Mxw>vGhX75B_3daYPHPDu2()2 z0?t(8n$Ja

    0`o3PS<>YMWM}34Eq*%-Ff9$r*vD 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Ʉ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Η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≦pn*cFHV_=G?`p_k?^Icv2!Di2| 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

    b-RJ<2MzPXLR&1n|{YVCBXq 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∾A}70QMA^kGsVG>uhMLAURq{8rf_< zYfe)Kpr#~@a-h3Pe4=ffD-Xxt~Y1Yl)Ou9+&!sdEJltAn2xrMB015gr8s|Fz#0CRqDl;Ohj4}y~wg09+M+MF;nLCNZ^rrRO~3-f`jG{K?g z{w#8xa23<2uIt2Y@Tacym^oOA=-&aeR17eiF)Y zWIS|%mM$uZwLG$KgapV0cAy^T!LDqi@8S$Mb=JD_x=U`NF2epvOvxtxoNxjdvy zvT}cl|CSVa3W!-m0TIoB6tT{ik~img7t8F=T2E-+&C~?nEBUxD4#R?n$Dgv)4&ck( zbwtkucD-K#>%cCfAktw4gD zmgrFHzs@oN5t5^_8yaK>4aZ8VE+YBL&c9{kHRDaU-C9dgUbsW%$B&X6xq&u7k5K6? zby=@FkW}WpKCMYIcwaK9;hdP%Gi;{~{pB6(_x+XqDB|a*$l+?X)?AU_SbWseRMion z7t5)X!%4RkephfY-xw9@;~uV0M(tEvo$EJWw?93sS5grApMr`_#^HUaHB}G;d>#D# z5V1rp(HPHQs%DL0(U)*6FkG?W+W*;Ff$Y~~E|5F0?_i@RYJWP7XETJThgRN)@@0M^ z`e7qr?kAX*k<^u`#TDWN=&Dc?S;i%nt0ux z*Z075O#{UzrfQk=0_u={sA~To1TX?&P{=QM_L8-#ysD{cq|_HA>BV;x8(ENH)5wQ} zjvFibic(zbUPse>V&XGjJ8j&F2TfL4*K}>%Y*=4MI%*0V8ao?kI4k31X5=Bba_YrU ze*h0DsjU#p%do@+bSSQAqpBPgGUEar<*cILehGY9D?tzq0UG;*Nme@ljVLSLLz760 zM3J1MfOmh~sA)yJbW2M#bk7GJ^Gev7(LZH1l~Flt(Ue+)iAYB%Q)Mimk4^ulu1KUK zWmah}u>5Ot{Ei(MUPKqu4tD5Hc1|AE4u(KRbyHH5DB(NcXs7gQ)s!_cSTgBD^4Hs% zt_Ur$zp3}dLJXrcIbB((7(fqO{w>HRMYq6frJe`N{98Q4uA>At4{`lRyA}jwYn)AM z)~$sqp-2A1hpOYa3a#dMLFmA217oe?vBnBYUAnSO?9-6PNjwSxc)jrSj@%^=RdzsK zYd(nldUGGuF$v7d6jzHcrO#6={-}?|jCuawd;GR)vc=G}BzfH5*2WV;Vt%)%$Obg8 z0PIo9%=IyNg9iC4Do```q|irTOd* zB+mV0Qe8@i&zyk2i$zkgH%vDZ$d=hP4Yc4D!8B@f0zFOes%~X)ifdSn;(w@IpGI`> zU9CeA*KN%AeYA?VcfpY3+1*l=o0@9$_ZRd$tOY}p<0W4jap9s8Wz;Vfy59UF`Q&3p z3Sm6GWq6!2$+eLOD4zDnc(I6jlc0Q??M^tBk>Jyc)Z(9{+NAi7{tLWtmQ8}#2n(l< zy3F3VCUj+PY-n-l;-DBF{$+bdM~j>yEg|l=)HIWWO*o1XSviaj!Fxs>P(rtmB#MHN zSMel)@2JTN(#b4xef_TmItohaA6#^0>Q(c^xsy8&-yfUtD8_P>@>>q3ZpAe(muG2S zMT2De^ekzh2=}?N-cEzdH2`yQB`9WG|%4T7-5 zvFT1yF$SZA)_zK;`N3V}_Ua$Yb%ahCJcss;inD6dghcjd3gpp`ama?WS3A7p&n3

    - - 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. -
    -
    + + 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. +
    +